@lelouchhe/webagent 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +0,0 @@
1
- import{a as Vt,b as U,c as Wt,d as jt,e as Ee,f as Kt,g as _,h as Gt,i as N,j as Q,k as zt,l as T,m as Ie,n as Xe,o as et,p as Jt,q as tt}from"./chunk.3CCHZCG7.js";import{a as y,b as F}from"./chunk.UMQMOGWO.js";import"./chunk.AJZBJBMO.js";var xe=null;function Es(e){location.replace(e)}function Is(e){let t;try{if(e.startsWith("/"))t=e.split("?")[0];else{let s=new URL(e);if(s.origin!==location.origin)return!1;t=s.pathname}}catch{return!1}return t.startsWith("/api/")}function xs(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Yt(e={}){let t=e.baseFetch??globalThis.fetch.bind(globalThis),s=e.onUnauthorized??Es;xe??=globalThis.fetch;let r=async(o,a)=>{let c=xs(o),u=Is(c),d=a;if(u){let p=localStorage.getItem(F);if(p){let f=a?.headers??(o instanceof Request?o.headers:void 0),g=new Headers(f);g.has("Authorization")||g.set("Authorization",`Bearer ${p}`),d={...a??{},headers:g}}}let m=await t(o,d);if(u&&m.status===y.UNAUTHORIZED){try{localStorage.removeItem(F)}catch{}s("/login")}return m};return globalThis.fetch=r,Ls}function Ls(){xe&&(globalThis.fetch=xe,xe=null)}var Cs=new Set(["plan","read-only"]),As=new Set(["autopilot","bypassPermissions","full-access","yolo"]),Ps=new Set(["agent","default","build"]);function Le(e){if(!e)return"";let t=e.match(/[#/]([^#/]+)$/);return t?t[1]:e}function Qt(e){return Cs.has(Le(e))}function Zt(e){return As.has(Le(e))}function Xt(e){let t=Le(e);return t?!Ps.has(t):!1}function en(e){return Le(e).replace(/([A-Z])/g," $1").trim()}var pe=class extends Error{name="ApiError";status;constructor(t,s){super(s),this.status=t}};async function P(e,t){let s=await fetch(e,t);if(!s.ok){let o=`HTTP ${s.status}`;try{let a=await s.json();a.error&&(o=typeof a.error=="string"?a.error:JSON.stringify(a.error))}catch{}throw new pe(s.status,o)}let r=await s.text();if(r)return JSON.parse(r)}function M(e,t,s){let r={"Content-Type":"application/json"};return s&&(r["X-Client-Op-Id"]=s),P(e,{method:"POST",headers:r,body:JSON.stringify(t)})}function Ce(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"op-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,10)}function Ae(e){let t={};return e?.cwd&&(t.cwd=e.cwd),e?.inheritFromSessionId&&(t.inheritFromSessionId=e.inheritFromSessionId),M("/api/v1/sessions",t)}function oe(e){return P("/api/v1/sessions/"+e,{method:"DELETE"})}function Pe(){return P("/api/v1/sessions")}function $(e){return P("/api/v1/sessions/"+e)}function tn(e){return P("/api/v1/sessions/"+e+"/snapshot")}function nt(e,t,s){let r={text:t};return s?.length&&(r.attachments=s),M("/api/v1/sessions/"+e+"/prompt",r,Ce())}function nn(e){return M("/api/v1/sessions/"+e+"/cancel",{},Ce())}function sn(e,t,s){return M("/api/v1/sessions/"+e+"/permissions/"+t,{optionId:s},Ce())}function rn(e,t){return M("/api/v1/sessions/"+e+"/permissions/"+t,{denied:!0},Ce())}function ie(e,t,s){let r=t.replace(/_/g,"-"),o=typeof s=="boolean"?"config/"+r:r;return P("/api/v1/sessions/"+e+"/"+o,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:s})})}function Me(e,t){return P("/api/v1/sessions/"+e+"/title",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:t})})}function on(e,t){return M("/api/v1/sessions/"+e+"/bash",{command:t})}function ae(e,t,s){let r={visible:t};return s&&(r.sessionId=s),M("/api/beta/clients/"+e+"/visibility",r)}function $e(){return M("/api/v1/bridge/reload",{})}function an(){return M("/api/v1/sse-ticket",{})}function ge(){return P("/api/v1/messages")}function ln(e){return M(`/api/v1/messages/${encodeURIComponent(e)}/consume`,{})}function Re(e){return P(`/api/v1/messages/${encodeURIComponent(e)}`,{method:"DELETE"})}function _e(){return P("/api/v1/tokens")}function Ne(e){return M("/api/v1/tokens",{name:e})}function Oe(e){return P("/api/v1/tokens/"+encodeURIComponent(e),{method:"DELETE"})}var I=e=>document.querySelector(e),l={messages:I("#messages"),input:I("#input"),sendBtn:I("#send-btn"),prompt:I("#input-prompt"),status:I("#status"),sessionInfo:I("#session-info"),attachBtn:I("#attach-btn"),fileInput:I("#file-input"),attachPreview:I("#attach-preview"),themeBtn:I("#theme-btn"),slashMenu:I("#slash-menu"),inputArea:I("#input-area"),modePill:I("#mode-pill"),statusBar:I("#status-bar")};function C(e){l.input.value=e,l.input.dispatchEvent(new window.Event("input",{bubbles:!0}))}var n={eventSource:null,clientId:null,sessionId:null,sessionSwitchGen:0,sessionCwd:null,sessionTitle:null,awaitingNewSession:!1,configOptions:[],agentCommands:[],agentCommandsEpoch:null,agentCommandsRevision:0,sessionMode:null,sessionModel:null,currentAssistantEl:null,currentAssistantText:"",assistantRafToken:null,currentThinkingEl:null,currentThinkingText:"",busy:!1,pendingAttachments:[],currentBashEl:null,followMessages:!0,pendingToolCallIds:new Set,pendingPermissionRequestIds:new Set,pendingPromptDone:!1,turnEnded:!1,newTurnStarted:!1,sentMessageForSession:null,sentBashForSession:null,cancelTimeout:1e4,serverVersion:null,agentName:null,agentVersion:null,_cancelTimerId:null,_onCancelTimeout:null,lastEventSeq:0,lastStateSeq:0,oldestLoadedSeq:0,hasMoreHistory:!1,loadingOlderEvents:!1,replayInProgress:!1,replayTarget:null,replayQueue:[],agentReloading:!1,recentPathsLimit:10,previewToken:null},Ms={disconnected:"is-disconnected",connecting:"is-connecting",connected:"is-connected"};function ee(e,t=e){l.status.textContent="",l.status.className=`status-dot ${Ms[e]}`,l.status.dataset.state=e,l.status.setAttribute("aria-label",t),l.status.setAttribute("title",t)}function st(e){return n.configOptions.find(t=>t.id===e)}function V(e){let t=st(e);return t&&"options"in t?t:null}function rt(e){return st(e)?.currentValue??null}function cn(e){let t=rt(e);return typeof t=="string"?t:null}function un(e,t){let s=st(e);s&&("options"in s&&typeof t=="string"||s.type==="boolean"&&typeof t=="boolean")&&(s.currentValue=t)}function ot(e){n.configOptions=e,e.length>0&&dn(),E(),O()}function $s(e){n.configOptions.length>0||(n.sessionMode=e.session.mode??null,n.sessionModel=e.session.model??null)}function dn(){n.sessionMode=null,n.sessionModel=null}function fn(e){return e==="mode"?n.sessionMode:n.sessionModel}function E(){if(l.inputArea.classList.remove("plan-mode","autopilot-mode","preview-mode"),n.previewToken){l.inputArea.classList.add("preview-mode"),l.input.placeholder="publish or cancel",l.modePill.textContent="preview",le();return}l.input.placeholder="Message or ?";let e=cn("mode")||fn("mode")||"";Qt(e)?l.inputArea.classList.add("plan-mode"):Zt(e)&&l.inputArea.classList.add("autopilot-mode"),l.modePill.textContent=Xt(e)?en(e):"",le()}function O(){let e=cn("model")||fn("model"),t=n.sessionCwd??"";if(l.statusBar.textContent="",t){e&&l.statusBar.appendChild(document.createTextNode(e+" \xB7 "));let s=document.createElement("span");s.className="status-cwd",s.textContent=t,l.statusBar.appendChild(s)}else e&&(l.statusBar.textContent=e)}function Rs(e){n.lastStateSeq=e.seq;let t=e.runtime.busy;w(t!=null),t==null&&ce(),He(e.agentCommands??{epoch:"",revision:0,commands:[]}),$s(e),E(),O()}function He(e){return e.epoch===n.agentCommandsEpoch&&e.revision<n.agentCommandsRevision?!1:(n.agentCommandsEpoch=e.epoch,n.agentCommandsRevision=e.revision,n.agentCommands=e.commands.slice(),!0)}function mn(e){if(e.seq!==n.lastStateSeq+1)return!1;n.lastStateSeq=e.seq;let t=e.patch.runtime;if(t&&"busy"in t){let s=t.busy??null;w(s!=null),s==null&&ce()}return!0}async function H(e){let t=n.sessionSwitchGen;try{let s=await tn(e);return n.sessionSwitchGen!==t?null:(Rs(s),s)}catch{return null}}function w(e){n.busy=e,e?l.prompt.classList.add("busy"):l.prompt.classList.remove("busy"),le()}function W({cwd:e,inheritFromSessionId:t=n.sessionId}={}){n.awaitingNewSession=!0,Ae({cwd:e,inheritFromSessionId:t}).catch(()=>{})}var pn=[];function gn(e){pn.push(e)}var hn=()=>{};function yn(e){hn=e}function le(){hn()}function b(){for(let e of pn)e();l.messages.innerHTML="",n.assistantRafToken!=null&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null),n.currentAssistantEl=null,n.currentAssistantText="",n.currentThinkingEl=null,n.currentThinkingText="",n.pendingAttachments.length=0,n.followMessages=!0,n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,n.turnEnded=!1,n.newTurnStarted=!1,n._cancelTimerId!=null&&clearTimeout(n._cancelTimerId),n._cancelTimerId=null,n.lastEventSeq=0,n.lastStateSeq=0,n.oldestLoadedSeq=0,n.hasMoreHistory=!1,n.loadingOlderEvents=!1,n.replayInProgress=!1,n.replayQueue=[],n.previewToken=null,l.attachPreview.innerHTML="",l.attachPreview.classList.remove("active"),l.input.disabled=!1,l.sendBtn.disabled=!1,E(),w(!1),n.sessionTitle=null,n.sessionCwd=null,n.configOptions=[],n.agentCommands=[],n.agentCommandsEpoch=null,n.agentCommandsRevision=0,dn(),Be(null,null),l.statusBar.textContent=""}function B(){return!n.busy||!n.sessionId?!1:(nn(n.sessionId).catch(()=>{}),!0)}function ce(){n._cancelTimerId!=null&&(clearTimeout(n._cancelTimerId),n._cancelTimerId=null)}function vn(){return location.hash.slice(1)||null}function it(e){history.replaceState(null,"",`#${e}`)}function Be(e,t){l.sessionInfo.textContent=t??(e?e.slice(0,8)+"\u2026":""),document.title=t??">_"}ee("disconnected");function qe(e,t){let s=document.createElement("div");return s.className=`msg ${e}`,e==="user"?s.innerHTML=_(t).replace(/\n/g,"<br>"):N(s,t),k(s),s}function i(e){let t=document.createElement("div");return t.className="system-msg",t.textContent=e,k(t),t}function j(){let e=n.currentAssistantEl,t=n.currentAssistantText;n.currentAssistantEl=null,n.currentAssistantText="",n.assistantRafToken!=null&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null,e&&N(e,t)),e&&typeof e.querySelector=="function"&&(e.removeAttribute("data-primed"),U(e),Q(e))}function R(){if(n.currentThinkingEl){let e=n.currentThinkingEl.querySelector("summary");e.textContent="\u283F thought",e.classList.remove("active"),e.style.animation="none",n.currentThinkingEl.removeAttribute("data-primed"),n.currentThinkingEl=null,n.currentThinkingText=""}}var te=null,_s=80;function he(e){return e.scrollHeight-e.scrollTop-e.clientHeight<_s}function Ns(){n.followMessages=he(l.messages)}l.messages.addEventListener("scroll",Ns);function wn(){return n.followMessages||he(l.messages)}function k(e,t=!1){if(n.replayTarget)return n.replayTarget.appendChild(e),e;let s=t||wn();return l.messages.appendChild(e),S(s),e}function bn(){K(),te=document.createElement("div"),te.id="waiting",te.innerHTML='<span class="cursor">\u258C</span>',k(te,!0)}function K(){te&&(te.remove(),te=null)}var at=!1,De=!1;function lt(e){let t=l.messages;if(e||n.followMessages){t.clientHeight,t.scrollTop=t.scrollHeight,n.followMessages=!0;return}n.followMessages=he(t)}function Os(e){if(!(e||n.followMessages)){n.followMessages=he(l.messages);return}lt(!0),!(typeof requestAnimationFrame!="function"||De)&&(De=!0,requestAnimationFrame(()=>{if(!n.followMessages){De=!1;return}lt(!0),requestAnimationFrame(()=>{De=!1,n.followMessages&&lt(!0)})}))}function Sn(e){let t=wn();e(),t&&Os(!0)}function S(e){let t=l.messages;if(e||n.followMessages){typeof requestAnimationFrame=="function"?at||(at=!0,requestAnimationFrame(()=>{at=!1,t.scrollTop=t.scrollHeight})):t.scrollTop=t.scrollHeight,n.followMessages=!0;return}n.followMessages=he(t)}function L(e){if(e==null||e==="")return"";let t;if(typeof e=="number")t=new Date(e);else{let r=String(e);t=new Date(r.endsWith("Z")||/[+-]\d{2}:?\d{2}$/.test(r)?r:r+"Z")}if(isNaN(t.getTime()))return"";let s=r=>String(r).padStart(2,"0");return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}`}function kn(e,t=!1){let s=document.createElement("div");return s.className="bash-block",s.innerHTML=`<span class="bash-cmd${t?" running":""}">${_(e)}</span><div class="bash-output"></div>`,s.querySelector(".bash-cmd").addEventListener("click",()=>{let r=s.querySelector(".bash-output");r.style.display==="none"?r.style.display="block":r.classList.contains("has-content")&&(r.style.display="none")}),k(s),t&&(n.currentBashEl=s),s}function Fe(e,t,s){if(!e)return;let r=e.querySelector(".bash-cmd");r.classList.remove("running");let o="";if(s?o=`[signal: ${s}]`:t!==0&&t!=null&&(o=`[exit: ${t}]`),o){let a=document.createElement("span");a.className=`bash-exit ${t===0?"ok":"fail"}`,a.textContent=o,r.after(a)}e===n.currentBashEl&&(n.currentBashEl=null)}function ct(e,t){let s=e.replace(/^\s+/,"");if(s==="")return{node:t,pathPrefix:"",tailQuery:""};let r=/\s$/.test(s),o=s.split(/\s+/).filter(g=>g.length>0),a=r?o:o.slice(0,-1),c=r?"":o[o.length-1]??"",u=t,d="",m=0;for(let g of a){let h=u.children?.find(v=>v.name===g);if(!h)break;d=d?`${d} ${h.name}`:h.name,u=h,m++}let p=a.slice(m);c&&p.push(c);let f=p.join(" ");return{node:u,pathPrefix:d,tailQuery:f}}function Tn(e,t,s){let r=[],o=t.trim().toLowerCase(),a=[];if(e.children){let g=e.name==="<root>"?[...e.children].sort((h,v)=>h.name.localeCompare(v.name)):e.children;for(let h of g){if(o&&!h.name.toLowerCase().includes(o))continue;let Ts=(h.children?.length??0)>0||h.fetch||h.freeform;a.push({spec:{primary:h.name,secondary:h.desc},prefix:Ts?"\u203A":"",kind:"subcommand",node:h})}}r.push(...a);let c=[],u="none",d="";if(e.fetch&&e.toSpec){if(s==="loading")u="loading";else if(s&&typeof s=="object"&&!Array.isArray(s)&&"error"in s)u="error",d=typeof s.error=="string"?s.error:"";else if(Array.isArray(s))if(s.length===0)u="empty";else{let h=(o?s.filter(v=>e.matches?e.matches(v,o):e.toSpec(v).primary.toLowerCase().includes(o)):s).map(v=>e.toSpec(v));h.length===0?u="no-match":(u="ok",c=h)}}let m=null;if(e.freeform){let g=t.trim();if(!(g.length>0&&c.some(v=>v.primary.toLowerCase()===g.toLowerCase()))){let v=e.freeform(t);v&&(m={spec:v,prefix:"\u21B5",kind:"freeform"},r.push(m))}}if((a.length>0||m!==null)&&u!=="none"&&r.push({spec:{primary:""},prefix:"",kind:"separator"}),u==="loading")r.push({spec:{primary:"(loading...)"},prefix:"",kind:"placeholder"});else if(u==="error")r.push({spec:{primary:`(${d||"error"})`},prefix:"",kind:"placeholder"});else if(u==="empty")r.push({spec:{primary:"(none)"},prefix:"",kind:"placeholder"});else if(u==="no-match")r.push({spec:{primary:"(no match)"},prefix:"",kind:"placeholder"});else if(u==="ok")for(let g of c)r.push({spec:g,prefix:g.current?"*":"",kind:"data"});return r}function En(e,t,s){let r=document.createElement("div");r.className="slash-item"+(t?" selected":"");let o=e.path!==void 0,a=document.createElement("div");a.className="slash-row-l1";let c=document.createElement("span");c.className="slash-prefix",c.textContent=s,a.appendChild(c);let u=document.createElement("span");if(u.className="slash-primary"+(e.current?" slash-current":""),u.textContent=e.primary,a.appendChild(u),e.secondary!==void 0){let d=document.createElement("span");d.className="slash-secondary",d.textContent=e.secondary,a.appendChild(d)}if(r.appendChild(a),o){let d=document.createElement("div");d.className="slash-row-l2";let m=document.createElement("span");if(m.className="slash-path",m.textContent=e.path,d.appendChild(m),e.pathSecondary!==void 0){let p=document.createElement("span");p.className="slash-path-secondary",p.textContent=e.pathSecondary,d.appendChild(p)}r.appendChild(d)}return r}var dt={debug:0,info:1,warn:2,error:3,off:99},ye=new Set(["off","debug","info","warn","error"]),In=4096;function xn(e){try{let t=new WeakSet,s=JSON.stringify(e,(r,o)=>{if(o instanceof Error)return{name:o.name,message:o.message,stack:o.stack};if(typeof o=="function")return`[Function ${o.name??"anonymous"}]`;if(typeof o=="bigint")return o.toString()+"n";if(typeof o=="symbol")return o.toString();if(typeof o=="object"&&o!==null){if(t.has(o))return"[Circular]";t.add(o)}return o});return typeof s!="string"?String(e):s.length>In?s.slice(0,In)+`\u2026(truncated, ${s.length} bytes)`:s}catch{try{return String(e)}catch{return"[unserializable]"}}}function ut(e){return e<10?"0"+e:String(e)}function Hs(e){return e<10?"00"+e:e<100?"0"+e:String(e)}function Ln(e){let t=new Date(e);return`${ut(t.getHours())}:${ut(t.getMinutes())}:${ut(t.getSeconds())}.${Hs(t.getMilliseconds())}`}var mt="off",Cn="default",An,ft=null;function Ue(e,t="runtime"){ye.has(e)&&(mt=e,Cn=t)}function pt(){return mt}function Pn(){return Cn}function Ve(e){An=e;let t=Rn(e);Ue(t.level,t.source)}function Mn(e){ft=e}function $n(e){try{let s=new URL(e).searchParams.get("debug");return s===null||!ye.has(s)?null:s}catch{return null}}function Bs(){return typeof location>"u"?null:$n(location.href)}function Ds(){if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(Ie);return!e||!ye.has(e)?null:e}catch{return null}}function Rn(e,t=typeof location>"u"?null:location.href){let s=t?$n(t):null;if(s)return{level:s,source:"url"};let r=Ds();return r?{level:r,source:"local"}:e&&ye.has(e)?{level:e,source:"config"}:{level:"off",source:"default"}}function _n(e){typeof localStorage<"u"&&localStorage.setItem(Ie,e);let t={level:e,source:"local"};return Ue(e,"local"),t}function Nn(){typeof localStorage<"u"&&localStorage.removeItem(Ie);let e=Rn(An);return Ue(e.level,e.source),e}function On(e){let t=(s,r,o)=>{if(dt[s]<dt[mt])return;let a=e?`[${e}] `:"";try{let c=console[s];o!==void 0?c(a+r,o):c(a+r)}catch{}if(ft)try{let c=Ln(Date.now()),u=e?` [${e}]`:"",d=o!==void 0?" "+xn(o):"";ft(`${c}${u} ${s.toUpperCase()} ${r}${d}`)}catch{}};return{debug:(s,r)=>{t("debug",s,r)},info:(s,r)=>{t("info",s,r)},warn:(s,r)=>{t("warn",s,r)},error:(s,r)=>{t("error",s,r)},scope:s=>On(e?`${e}.${s}`:s)}}var x=On();{let e=Bs();e&&Ue(e)}if(typeof window<"u"){let e=x.scope("window");window.addEventListener("error",t=>{e.error(t.message||"uncaught error",{filename:t.filename,lineno:t.lineno,colno:t.colno,stack:t.error instanceof Error?t.error.stack:void 0})}),window.addEventListener("unhandledrejection",t=>{let s=t.reason;e.error("unhandled rejection",{reason:s instanceof Error?{name:s.name,message:s.message,stack:s.stack}:s})})}async function G(e,t){n.sessionSwitchGen++;let s=n.sessionSwitchGen;try{let r=await Pe();if(s!==n.sessionSwitchGen)return;let o=r.find(a=>a.id!==e);if(o){b(),n.sessionId=null,it(o.id);let[a,c]=await Promise.all([$(o.id),z(o.id)]);if(s!==n.sessionSwitchGen)return;A({type:"session_created",sessionId:a.id,cwd:a.cwd,title:a.title,configOptions:a.configOptions}),c&&S(!0);return}}catch{}s===n.sessionSwitchGen&&(b(),n.sessionId=null,W({cwd:t??void 0}))}function ht(e){return n.replayTarget?.querySelector(`[id="${e}"]`)??document.getElementById(e)}function qs(e){return n.replayTarget?.querySelector(e)??document.querySelector(e)}function Dn(e){e.querySelectorAll(".plan[open]").forEach(t=>{t.open=!1})}function Hn(e){(typeof navigator<"u"?navigator.serviceWorker:void 0)?.controller?.postMessage({type:"close-notification",tag:e})}function Fs(){if(typeof Notification>"u"||n.replayInProgress)return;let e=Notification.permission;if(e!=="granted"){if(e==="denied"){if(localStorage.getItem(et))return;localStorage.setItem(et,"1"),i("tip: notifications are blocked \u2014 allow in browser site settings to enable");return}localStorage.getItem(Xe)||(localStorage.setItem(Xe,"1"),i("tip: use /notify to enable background notifications"))}}function We(){Kt(n.pendingPromptDone,n.pendingToolCallIds.size,n.pendingPermissionRequestIds.size)&&(K(),R(),j(),w(!1),n.pendingPromptDone=!1,Fs())}function Us(){for(let e of n.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call failed";let s=t.querySelector(".icon");s&&(s.textContent="\u2717")}for(let e of n.pendingPermissionRequestIds){let t=document.querySelector(`.permission[data-request-id="${e}"]`);if(!t?.querySelector("button"))continue;let r=t.querySelector(".title")?.textContent??"\u26BF";t.innerHTML=`<span class="dim">${_(r)} \u2014 cancelled</span>`}n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear()}function Vs(){for(let e of n.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call completed";let s=t.querySelector(".icon");s&&(s.textContent="\u2713")}n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear()}var qn=200;async function z(e){Un(),n.replayInProgress=!0,n.replayQueue=[];try{let t=await fetch(`/api/v1/sessions/${e}/events?limit=${qn}`);if(!t.ok)return!1;let s=await t.json(),{events:r,streaming:o,hasMore:a}=Ee(s),c=document.createDocumentFragment(),u=kt(r);n.replayTarget=c;for(let d=0;d<r.length;d++){let m=JSON.parse(r[d].data);Tt(r[d].type,m,r,d,u)}return n.replayTarget=null,l.messages.style.display="none",l.messages.appendChild(c),l.messages.style.display="",r.length&&(n.lastEventSeq=r[r.length-1].seq,n.oldestLoadedSeq=r[0].seq),n.hasMoreHistory=a===!0,n.hasMoreHistory&&Qs(),Fn(),yt(r,o),!0}catch{return!1}finally{n.replayTarget=null,n.replayInProgress=!1,Jn()}}function yt(e,t){if(n.assistantRafToken!=null&&x.warn("primeStreamingState: assistantRafToken non-null at entry (missing flush upstream)"),t.thinking){let s;if(e.length){for(let r=e.length-1;r>=0;r--)if(e[r].type==="thinking"){let o=l.messages.querySelectorAll(".thinking");s=o[o.length-1];break}}else{let r=l.messages.querySelectorAll(".thinking");s=r[r.length-1]}if(s){n.currentThinkingEl=s,n.currentThinkingText=s.getAttribute("data-raw")??"",s.setAttribute("data-primed","");let r=s.querySelector("summary");r&&(r.textContent="\u283F thinking...",r.classList.add("active"))}}if(t.assistant){let s;if(e.length){for(let r=e.length-1;r>=0;r--)if(e[r].type==="assistant_message"){let o=l.messages.querySelectorAll(".msg.assistant");s=o[o.length-1];break}}else{let r=l.messages.querySelectorAll(".msg.assistant");s=r[r.length-1]}s&&(n.currentAssistantEl=s,n.currentAssistantText=s.getAttribute("data-raw")??"",s.setAttribute("data-primed",""))}}function Fn(){let e=l.messages.querySelector("[data-sync-boundary]");e&&e.removeAttribute("data-sync-boundary");let t=l.messages.lastElementChild;t&&t.setAttribute("data-sync-boundary","")}var gt=new Map;function wt(e){let t=gt.get(e);if(t)return t;let s=Ws(e);return gt.set(e,s),s.finally(()=>{gt.delete(e)}).catch(()=>{}),s}async function Ws(e){n.replayInProgress=!0,n.replayQueue=[],n.assistantRafToken!=null&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null);try{let t=`/api/v1/sessions/${e}/events?after=${n.lastEventSeq}`,s=await fetch(t);if(!s.ok||n.sessionId&&e!==n.sessionId)return!1;let r=await s.json(),{events:o,streaming:a}=Ee(r);for(let f of l.messages.querySelectorAll("[data-primed]")){let g=f.getAttribute("data-raw")??"";if(f.removeAttribute("data-primed"),f.classList.contains("msg")&&f.classList.contains("assistant"))Q(f),f.replaceChildren(),N(f,g),U(f);else if(f.classList.contains("thinking")){let h=f.querySelector(".thinking-content");h&&(h.textContent=g);let v=f.querySelector("summary");v&&(v.textContent="\u283F thought",v.classList.remove("active"),v.style.animation="none")}}let c=l.messages.querySelector("[data-sync-boundary]");if(c)for(;c.nextElementSibling;)c.nextElementSibling.remove();if(n.currentAssistantEl&&Q(n.currentAssistantEl),n.currentAssistantEl=null,n.currentAssistantText="",n.currentThinkingEl=null,n.currentThinkingText="",n.currentBashEl=null,o.length===0)return yt(o,a),!0;let u=document.createDocumentFragment(),d=kt(o);n.replayTarget=u;for(let f=0;f<o.length;f++){let g=JSON.parse(o[f].data);Tt(o[f].type,g,o,f,d)}n.replayTarget=null;let m=l.messages.lastElementChild,p=u.firstElementChild;if(m&&p){if(m.classList.contains("msg")&&m.classList.contains("assistant")&&p.classList.contains("msg")&&p.classList.contains("assistant")){let f=m.getAttribute("data-raw")??"",g=p.getAttribute("data-raw")??"",h=f+g;m.setAttribute("data-raw",h),Q(m),m.replaceChildren(),N(m,h),U(m),p.remove()}else if(m.classList.contains("thinking")&&p.classList.contains("thinking")){let f=m.getAttribute("data-raw")??"",g=p.getAttribute("data-raw")??"",h=f+`
2
- `+g;m.setAttribute("data-raw",h);let v=m.querySelector(".thinking-content");v&&(v.textContent=h),p.remove()}}return l.messages.appendChild(u),n.lastEventSeq=o[o.length-1].seq,Fn(),yt(o,a),!0}catch{return!1}finally{n.replayTarget=null,n.replayInProgress=!1,Jn()}}var se=null,bt=0;function Un(){bt++}function Ke(e,t){return t===bt&&n.sessionId===e}function je(){return typeof requestAnimationFrame!="function"?Promise.resolve():new Promise(e=>requestAnimationFrame(()=>{e()}))}function Vn(e){let t=e.getBoundingClientRect();for(let r of Array.from(e.children)){if(!(r instanceof HTMLElement)||r.id==="history-sentinel"||r.id==="history-loading")continue;let o=r.getBoundingClientRect();if(o.bottom>=t.top&&o.top<=t.bottom)return{el:r,top:o.top}}let s=Array.from(e.children).find(r=>r instanceof HTMLElement&&r.id!=="history-sentinel"&&r.id!=="history-loading");return s?{el:s,top:s.getBoundingClientRect().top}:null}function Wn(e,t){if(!t?.el.isConnected)return 0;let s=jn(t);return s!==0&&(e.scrollTop+=s),s}function jn(e){return e?.el.isConnected?e.el.getBoundingClientRect().top-e.top:0}function js(e,t){let s=Math.abs(t);return s<=4||s>e.clientHeight}function Kn(e,t){let s=Vn(e);return t(),Wn(e,s)}async function Ks(e){if(!(e.scrollTop>=0)){for(let t=1;t<=20;t++)if(await je(),e.scrollTop>=0){await je();return}e.scrollTop=0,await je()}}async function Gs(e,t){for(let s=1;s<=8;s++){await je();let r=jn(t);if(r!==0){if(!js(e,r))return;e.scrollTop+=r}}}function ze(){se&&(se.disconnect(),se=null)}function St(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(ze(),se=new IntersectionObserver(t=>{t[0].isIntersecting&&!n.loadingOlderEvents&&n.hasMoreHistory&&n.sessionId&&Xs(n.sessionId)},{root:l.messages,rootMargin:"200px 0px 0px 0px"}),se.observe(e))}function zs(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(ze(),se=new IntersectionObserver(t=>{t[0].isIntersecting||St()},{root:l.messages,rootMargin:"200px 0px 0px 0px"}),se.observe(e))}function Js(e=l.messages){document.getElementById("history-loading")||Kn(e,()=>{let t=document.createElement("div");t.id="history-loading",t.className="history-loading",t.setAttribute("role","status"),t.textContent="\u2191 loading\u2026";let s=document.getElementById("history-sentinel");s?s.after(t):e.prepend(t)})}function vt(e=l.messages){let t=document.getElementById("history-loading");t&&Kn(e,()=>{t.remove()})}function Ys(e,t){!n.hasMoreHistory||n.sessionId!==e||(t?St():zs())}function Qs(){Ge();let e=document.createElement("div");e.id="history-sentinel",e.className="history-sentinel",e.setAttribute("aria-hidden","true"),l.messages.prepend(e),St()}function Ge({invalidateLoads:e=!0}={}){e&&Un(),ze(),vt(),document.getElementById("history-sentinel")?.remove()}async function Zs(e,t){let s=await fetch(`/api/v1/sessions/${e}/events?limit=${qn}&before=${n.oldestLoadedSeq}`);if(!Ke(e,t)||!s.ok)return null;let r=await s.json();if(!Ke(e,t))return null;let{events:o,hasMore:a}=Ee(r);return{events:o,hasMore:a}}gn(Ge);async function Xs(e){if(n.loadingOlderEvents||!n.hasMoreHistory||n.oldestLoadedSeq<=0)return!1;n.loadingOlderEvents=!0;let t=++bt;ze();let s=l.messages,r=!1;Js(s);try{let o=await Zs(e,t);if(!o)return!1;let{events:a,hasMore:c}=o;if(await Ks(s),!Ke(e,t))return!1;if(a.length===0)return n.hasMoreHistory=!1,Ge({invalidateLoads:!1}),!0;let u=document.createDocumentFragment(),d=kt(a);n.replayTarget=u;for(let f=0;f<a.length;f++){let g=JSON.parse(a[f].data);Tt(a[f].type,g,a,f,d)}n.replayTarget=null;let m=Vn(s);vt(s);let p=document.getElementById("history-sentinel");return p?p.after(u):s.prepend(u),Wn(s,m),n.oldestLoadedSeq=a[0].seq,n.hasMoreHistory=c===!0,n.hasMoreHistory||Ge({invalidateLoads:!1}),await Gs(s,m),r=!0,!0}catch{return!1}finally{Ke(e,t)&&(vt(s),n.loadingOlderEvents=!1,Ys(e,r))}}function kt(e){let t=new Set;for(let s of e)if(s.type==="permission_response"){let r=JSON.parse(s.data);t.add(r.requestId)}return{toolCalls:new Map,permissions:new Map,resolvedPermissions:t,currentBashEl:null}}function Gn(e){let t=document.createElement("details");t.className="message",t.open=!0,t.setAttribute("data-message-id",e.message_id),t.setAttribute("data-raw",e.body);let s=e.from_label??e.from_ref,r=e.title?` \xB7 ${_(e.title)}`:"";t.innerHTML=`<summary>\u2709\uFE0E ${_(s)}${r}</summary><div class="message-content"></div>`;let o=t.querySelector(".message-content");o&&N(o,e.body),k(t),o&&U(o)}function Tt(e,t,s,r,o){let a=t;if(zt(e)){tr(e,a,s,r,o);return}switch(e){case"prompt_done":n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,w(!1);break;case"message":Gn(a);break}}function ne(){return{findToolCallEl:e=>document.getElementById(`tc-${e}`),findPermissionEl:e=>document.querySelector(`.permission[data-request-id="${e}"]`),findBashEl:()=>n.currentBashEl,enhanceMarkdown:U}}function er(e,t,s){return{findToolCallEl:r=>e?e.toolCalls.get(r)??null:ht(`tc-${r}`),findPermissionEl:r=>e?e.permissions.get(r)??null:qs(`.permission[data-request-id="${r}"]`),findBashEl:()=>e?e.currentBashEl:ht("bash-replay-pending"),isPermissionResolved:r=>e?e.resolvedPermissions.has(r):t.slice(s+1).some(o=>{let a=JSON.parse(o.data);return o.type==="permission_response"&&a.requestId===r}),enhanceMarkdown:U}}function zn(e,t,s,r){e.querySelectorAll("button").forEach(a=>{let c=a.dataset.optionId??"",u=a.dataset.optionKind??"",d=a.textContent||"";a.onclick=()=>{jt(u).apiAction==="deny"?rn(n.sessionId,t).catch(()=>{}):sn(n.sessionId,t,c).catch(()=>{}),e.innerHTML=`<span class="dim">\u26BF ${_(s)} \u2014 ${_(d)}</span>`,r?.()}})}function tr(e,t,s,r,o){let a=er(o,s,r);switch(e){case"assistant_message":{let u=(n.replayTarget??l.messages).lastElementChild,d=t.text??"";if(u?.classList.contains("msg")&&u.classList.contains("assistant")){let f=(u.getAttribute("data-raw")??"")+d;u.setAttribute("data-raw",f),Q(u),u.replaceChildren(),N(u,f),U(u);break}let m=T(e,t,a);m&&k(m);break}case"thinking":{let u=(n.replayTarget??l.messages).lastElementChild,d=t.text??"";if(u?.classList.contains("thinking")){let p=u.querySelector(".thinking-content");if(p){let g=(u.getAttribute("data-raw")??"")+`
3
- `+d;u.setAttribute("data-raw",g),p.textContent=g;break}}let m=T(e,t,a);m&&k(m);break}case"tool_call":{let c=T(e,t,a);c&&(k(c),o&&o.toolCalls.set(t.id,c));break}case"tool_call_update":{T(e,t,a),(t.status==="completed"||t.status==="failed")&&n.pendingToolCallIds.delete(t.id);break}case"permission_request":{let c=t.requestId,u=t.title??"",d=T(e,t,a);d&&((a.isPermissionResolved?.(c)??!1)||zn(d,c,u),k(d),o&&o.permissions.set(c,d));break}case"bash_command":{let c=T(e,t,a);c&&(o?o.currentBashEl=c:c.id="bash-replay-pending",k(c));break}case"bash_result":{let c=o?o.currentBashEl:ht("bash-replay-pending");c&&!o&&c.removeAttribute("id"),T(e,t,a),o&&(o.currentBashEl=null);break}case"user_message":case"plan":case"permission_response":{let c=T(e,t,a);c&&(e==="plan"&&Dn(n.replayTarget??l.messages),k(c));break}}}function Jn(){let e=n.replayQueue;n.replayQueue=[];for(let t of e)nr(t)||A(t)}function nr(e){switch(e.type){case"tool_call":return!!document.getElementById(`tc-${e.id}`);case"permission_request":return!!document.querySelector(`.permission[data-request-id="${e.requestId}"]`);case"thought_chunk":return!!n.currentThinkingEl;case"message_chunk":return!!n.currentAssistantEl;default:return!1}}function Bn(){let e=n.currentAssistantEl;if(!e)return;let t=performance.now();N(e,n.currentAssistantText);let s=performance.now(),r=s-t;if(r>8){let a=Gt(),c=d=>Math.round(d*10)/10,u={ms:c(r),len:n.currentAssistantText.length,seq:a.seq,blocks:a.blocks,hits:a.hits,misses:a.misses,fastPath:a.fastPath,lex:{total:c(a.lex),prefix:c(a.lexPrefix),tail:c(a.lexTail),prefixBlocks:a.prefixBlocks,prefixLen:a.prefixLen,tailLen:a.tailLen,mathRelex:a.mathRelex,mathRelexLen:a.mathRelexLen,tailBlocks:a.tailBlocks,tailRawBlocks:a.tailRawBlocks},parse:c(a.parse),sanitize:c(a.sanitize),dom:c(a.dom),subList:a.subList,subTable:a.subTable,defsAbsorbed:a.defsAbsorbed,linkMemoSize:a.linkMemoSize,missDetails:a.missDetails.slice(0,5).map(d=>({type:d.type,len:d.len,snip:d.snip,parseMs:c(d.parseMs),sanMs:c(d.sanMs),domMs:c(d.domMs),path:d.path,...d.items!==void 0?{items:d.items}:{}}))};r>16?x.warn("md-render budget",u):x.debug("md-render slow",u)}S();let o=performance.now();try{performance.measure("doAssistantRender",{start:t,end:o}),performance.measure("scrollToBottom",{start:s,end:o})}catch{}}function sr(){if(n.assistantRafToken==null){if(typeof requestAnimationFrame!="function"){Bn();return}n.assistantRafToken=requestAnimationFrame(()=>{n.assistantRafToken=null,Bn()})}}function A(e){if(n.replayInProgress){n.replayQueue.push(e);return}let t="sessionId"in e?e.sessionId:void 0;if(!(t&&e.type!=="session_created"&&e.type!=="session_deleted"&&(!n.sessionId||t!==n.sessionId)))switch(e.type){case"connected":if(e.cancelTimeout!=null&&(n.cancelTimeout=e.cancelTimeout),e.recentPathsLimit!=null&&(n.recentPathsLimit=e.recentPathsLimit),Ve(e.debugLevel),n.agentReloading){n.agentReloading=!1;let s=e.agent.name,r=e.agent.version,o=s&&r?`${s} ${r}`:"Agent";i(`${o} reloaded.`),w(!1)}break;case"state_patch":{!mn({seq:e.seq,patch:e.patch})&&n.sessionId===e.sessionId&&H(n.sessionId);break}case"available_commands_update":He({epoch:e.epoch??"",revision:e.revision??0,commands:e.commands})&&l.input.dispatchEvent(new window.Event("input",{bubbles:!0}));break;case"session_created":if(!n.awaitingNewSession&&n.sessionId&&e.sessionId!==n.sessionId)break;n.awaitingNewSession=!1,n.sessionId=e.sessionId,n.sessionCwd=e.cwd??n.sessionCwd,n.sessionTitle=e.title??null,e.agentCommands&&He(e.agentCommands),e.configOptions&&e.configOptions.length&&ot(e.configOptions),E(),O(),it(n.sessionId),n.clientId&&ae(n.clientId,!document.hidden,n.sessionId).catch(()=>{}),Be(n.sessionId,n.sessionTitle),ee("connected","connected"),l.input.disabled=!1,l.sendBtn.disabled=!1,n.newTurnStarted=!1;{let s=document.getElementById("bash-replay-pending");s?(s.removeAttribute("id"),s.querySelector(".bash-cmd")?.classList.add("running"),n.currentBashEl=s):n.currentBashEl=null}l.messages.children.length===0&&i(`Session created: ${n.sessionTitle??e.sessionId.slice(0,8)+"\u2026"}`),O();break;case"user_message":{if(n.sentMessageForSession===e.sessionId){n.sentMessageForSession=null;break}if(R(),j(),n.newTurnStarted=!0,n.turnEnded=!1,e.sessionId===n.sessionId){let s=T("user_message",e,ne());s&&k(s)}break}case"message_chunk":if(n.turnEnded)break;K(),R(),n.currentAssistantEl||(n.currentAssistantEl=qe("assistant",""),n.currentAssistantText=""),n.currentAssistantText+=e.text,sr();break;case"thought_chunk":if(n.turnEnded)break;K(),n.currentThinkingEl||(n.currentThinkingEl=document.createElement("details"),n.currentThinkingEl.className="thinking",n.currentThinkingEl.innerHTML='<summary class="active">\u283F thinking...</summary><div class="thinking-content"></div>',n.currentThinkingText="",k(n.currentThinkingEl)),n.currentThinkingText+=e.text,n.currentThinkingEl.querySelector(".thinking-content").textContent=n.currentThinkingText,S();break;case"tool_call":{if(n.turnEnded)break;n.pendingToolCallIds.add(e.id),w(!0),K(),R(),j();let s=T("tool_call",e,ne());s&&k(s);break}case"tool_call_update":{(e.status==="completed"||e.status==="failed")&&n.pendingToolCallIds.delete(e.id),T("tool_call_update",e,ne()),We(),S();break}case"plan":{R(),j();let s=T("plan",e,ne());s&&(Dn(l.messages),k(s));break}case"permission_request":{if(n.turnEnded||document.querySelector(`.permission[data-request-id="${e.requestId}"]`))break;n.pendingPermissionRequestIds.add(e.requestId),w(!0),R();let s=T("permission_request",e,ne());if(s){let r=e.requestId;zn(s,r,e.title,()=>{n.pendingPermissionRequestIds.delete(r),We()}),k(s)}break}case"permission_response":{n.pendingPermissionRequestIds.delete(e.requestId),e.sessionId===n.sessionId&&T("permission_response",e,ne()),We();break}case"bash_command":{if(n.sentBashForSession===e.sessionId){n.sentBashForSession=null;break}if(e.sessionId===n.sessionId){let s=T("bash_command",e,ne());s&&(s.querySelector(".bash-cmd").classList.add("running"),k(s),n.currentBashEl=s),w(!0)}break}case"bash_output":{if(e.sessionId!==n.sessionId)break;if(n.currentBashEl){let s=n.currentBashEl.querySelector(".bash-output");if(!s)break;if(e.stream==="stderr"){let r=document.createElement("span");r.className="stderr",r.textContent=e.text,s.appendChild(r)}else s.appendChild(document.createTextNode(e.text));s.classList.add("has-content"),s.scrollTop=s.scrollHeight,S()}break}case"bash_done":{if(e.sessionId!==n.sessionId)break;Fe(n.currentBashEl,e.code,e.signal),e.error&&i(`err: ${e.error}`),w(!1);break}case"prompt_done":{if(ce(),e.stopReason==="cancelled"&&n.newTurnStarted){n.newTurnStarted=!1,R(),j();break}n.newTurnStarted=!1,e.stopReason==="cancelled"?Us():Vs(),n.turnEnded=!0,n.pendingPromptDone=!0,We();break}case"session_deleted":e.sessionId===n.sessionId&&G(e.sessionId,n.sessionCwd??void 0);break;case"session_expired":{G(n.sessionId,n.sessionCwd??void 0);break}case"config_set":{un(e.configId,e.value);let s=V(e.configId),r=s?.name??e.configId,o=typeof e.value=="string"?s?.options.find(a=>a.value===e.value)?.name??e.value:String(e.value);i(`ok: ${r}: ${o}`),e.configId==="mode"&&E(),O();break}case"config_option_update":e.configOptions.length&&ot(e.configOptions);break;case"session_title_updated":e.sessionId===n.sessionId&&(n.sessionTitle=e.title,Be(n.sessionId,n.sessionTitle));break;case"agent_reloading":n.agentReloading=!0,i("Agent reloading\u2026"),w(!0);break;case"agent_reloading_failed":i(`err: Agent reload failed: ${e.error}`),w(!1);break;case"error":n.awaitingNewSession=!1,n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,K(),R(),j(),i(`err: ${e.message}`),w(!1);break;case"message_created":i(`inbox: new message ${e.messageId} \u2014 /inbox to view`);break;case"message_consumed":i(`inbox: ${e.messageId} consumed \u2192 session ${e.sessionId}`),Hn(`msg-${e.messageId}`);break;case"message_acked":i(`inbox: ${e.messageId} dismissed`),Hn(`msg-${e.messageId}`);break;case"message":e.sessionId===n.sessionId&&(Gn(e),S());break;default:break}}async function ve({cwd:e,showCwd:t=!1}={}){if(!n.sessionId){i("warn: No active session");return}let s=n.sessionId,r=e??n.sessionCwd??void 0;n.busy&&B(),b(),i(t&&r?`Clearing session and starting at ${r}\u2026`:"Clearing session\u2026"),n.awaitingNewSession=!0;try{await Ae({cwd:r,inheritFromSessionId:s})}catch{n.awaitingNewSession=!1,i("err: Failed to clear session");return}oe(s).catch(()=>{})}var we=x.scope("share");function rr(e,t){return e.startsWith("http")?e:e?`${location.origin}${e}`:`${location.origin}/s/${t}`}async function Je(){if(!n.sessionId){i("share: no active session");return}let e=n.sessionId;try{let t=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/share`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({}),credentials:"same-origin"});if(!t.ok){let o=await t.text();t.status===y.CONFLICT?i("share: session busy (agent streaming) \u2014 retry after the response completes"):t.status===y.FORBIDDEN?i("share: forbidden (not owner)"):t.status===y.BAD_REQUEST&&o.includes("sanitize")?i(`share: \u2717 sanitize blocked this session \u2014 ${o}`):i(`share: create failed ${t.status} \u2014 ${o.slice(0,200)}`);return}let s=await t.json();n.previewToken=s.token,E();let r=s.reused?"reused":"ready";i(`share: preview ${r} \u2014 ^P publish \xB7 ^C cancel`)}catch(t){we.error("preview create error",{err:t}),i(`share: network error \u2014 ${String(t)}`)}}async function Et(){if(!n.sessionId){i("share: no active session");return}if(!n.previewToken){i("share: no preview to publish \u2014 run /share first");return}let e=n.sessionId,t=n.previewToken;try{let s=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/share/publish`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t}),credentials:"same-origin"});if(!s.ok){let u=await s.text();s.status===y.FORBIDDEN?i("share: forbidden (not owner)"):s.status===y.NOT_FOUND?i("share: token not found (already revoked?)"):i(`share: publish failed ${s.status} \u2014 ${u.slice(0,200)}`);return}let r=await s.json(),o=rr(r.public_url,r.token);n.previewToken=null,E();let a=i(`share: published
4
- `),c=document.createElement("a");c.href=o,c.textContent=o,c.target="_blank",c.rel="noopener noreferrer",a.appendChild(c)}catch(s){we.error("publish error",{err:s}),i(`share: network error \u2014 ${String(s)}`)}}function It(){if(!n.previewToken){i("share: no preview active");return}n.previewToken=null,E(),i("share: preview canceled")}async function xt(){let e=await fetch("/api/v1/shares",{credentials:"same-origin"});if(!e.ok)throw new Error(`list failed ${e.status}`);return(await e.json()).shares.filter(s=>s.shared_at!=null)}async function Ye(e){if(!e){i("share: usage \u2014 /share revoke <token>");return}try{let s=(await or()).find(a=>a.token===e);if(!s){i("share: token not found (already revoked?)");return}let r=await fetch(`/api/v1/sessions/${encodeURIComponent(s.session_id)}/share`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:e}),credentials:"same-origin"});if(!r.ok){r.status===y.FORBIDDEN?i("share: forbidden (not owner)"):r.status===y.NOT_FOUND?i(`share: ${e} already revoked`):i(`share: revoke failed ${r.status}`);return}let o=await r.json();i(o.revoked?`share: revoked ${e}`:`share: ${e} already revoked`)}catch(t){we.error("revoke error",{err:t}),i(`share: network error \u2014 ${String(t)}`)}}async function or(){let e=await fetch("/api/v1/shares",{credentials:"same-origin"});if(!e.ok)throw new Error(`list failed ${e.status}`);return(await e.json()).shares.filter(s=>s.shared_at!=null)}function be(e){let t=`${location.origin}/s/${e}`;window.open(t,"_blank","noopener"),i(`share: opened ${t}`)}async function Yn(){try{let e=await fetch("/api/v1/share/by",{credentials:"same-origin"});return e.ok?(await e.json()).value:null}catch{return null}}async function Se(e){try{let t=await fetch("/api/v1/share/by",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:e}),credentials:"same-origin"});if(!t.ok){let r=await t.text();i(`share: set author failed ${t.status} \u2014 ${r.slice(0,200)}`);return}let s=await t.json();if(n.previewToken&&n.sessionId)try{await fetch(`/api/v1/sessions/${encodeURIComponent(n.sessionId)}/share`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:n.previewToken,display_name:s.value??""}),credentials:"same-origin"})}catch(r){we.warn("by: preview patch failed",{err:r})}i(s.value?`share: author set to '${s.value}'`:"share: author cleared (publish anonymously)")}catch(t){we.error("by error",{err:t}),i(`share: network error \u2014 ${String(t)}`)}}var ue=!1;async function ts(){try{ue=await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{ue=!1}}function ir(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),r=atob(s),o=new Uint8Array(r.length);for(let a=0;a<r.length;a++)o[a]=r.charCodeAt(a);return o}async function ar(){try{let e=await navigator.serviceWorker.ready,t=await fetch("/api/beta/push/vapid-key");if(!t.ok)return;let{publicKey:s}=await t.json(),o=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:ir(s)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:o.endpoint,keys:o.keys,clientId:n.clientId})})}catch(e){x.scope("push").error("subscribe failed",{err:e})}}async function lr(){try{let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!t)return;let s=t.endpoint;await t.unsubscribe(),await fetch("/api/beta/push/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:s})})}catch(e){x.scope("push").error("unsubscribe failed",{err:e})}}async function cr(){return(await fetch("/api/v1/sessions")).json()}async function Qn(){let e=n.recentPathsLimit,t=e>0?`/api/v1/recent-paths?limit=${e}`:"/api/v1/recent-paths";return(await(await fetch(t)).json()).map(o=>({cwd:o.cwd,time:o.last_used_at}))}var Zn=async()=>{let{messages:e}=await ge();return e},Xn=async()=>_e();function Ct(){return`log: ${pt()} (${Pn()})`}function ns(){i(`${Ct()} \u2014 use /log <off|debug|info|warn|error|reset>`)}function At(e){_n(e),i(`${Ct()} saved`),e!=="off"&&x.info("log enabled",{level:e})}function Pt(){Nn(),i(`${Ct()} reset`)}async function Mt(){i("Resetting local state\u2026");let e=await Jt();e.errors.length&&i(`warn: reset had issues: ${e.errors.join("; ")}`),location.reload()}async function ss(e){n.sessionSwitchGen++;let t=n.sessionSwitchGen;b(),n.sessionId=null;try{let[s,r]=await Promise.all([$(e),z(e)]);if(await H(e),t!==n.sessionSwitchGen)return;A({type:"session_created",sessionId:s.id,cwd:s.cwd,title:s.title,configOptions:s.configOptions}),r&&S(!0)}catch{b(),n.sessionId=null,i("err: Failed to switch session")}}async function ur(e,t,s){let r=V(e);r&&(r.currentValue=t),E(),O(),i(`${r?.name??e} \u2192 ${s}`),n.sessionId&&await ie(n.sessionId,e,t).catch(()=>{})}async function $t(e){try{let t=await ln(e.id);t.alreadyConsumed?i(`inbox: already consumed \u2192 switching to ${t.sessionId}`):i(`inbox: opened as ${t.sessionId}`),await ss(t.sessionId)}catch(t){i(`err: consume failed (${t.message})`)}}async function dr(e){try{await Re(e.id),i(`inbox: ack ${e.id}`)}catch(t){i(`err: ack failed (${t.message})`)}}async function fr(e){if(!/^[A-Za-z0-9_-]{1,64}$/.test(e)){i("err: token name must match [A-Za-z0-9_-]{1,64}");return}try{let t=await Ne(e);i(`token: created ${t.name} (${t.scope})`),i(`${t.token}`),i("\u2014 save this now; it will never be shown again")}catch(t){let s=t;s.status===y.CONFLICT?i(`err: token "${e}" already exists`):s.status===y.FORBIDDEN?i("err: admin scope required to manage tokens"):i(`err: create failed (${s.message})`)}}async function mr(e){try{await Oe(e),i(`token: revoked ${e}`)}catch(t){let s=t;s.status===y.NOT_FOUND?i(`err: no token named "${e}"`):s.status===y.FORBIDDEN?i("err: admin scope required to manage tokens"):s.status===y.BAD_REQUEST&&/using|yourself|cannot/i.test(s.message)?i("err: can't revoke the token you're signed in with \u2014 use another admin token"):i(`err: revoke failed (${s.message})`)}}async function pr(){if(typeof Notification>"u"){i("err: notifications not supported in this browser");return}if(Notification.permission==="denied"){i("notify: blocked \u2014 allow in browser site settings to enable");return}if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted"){i("notify: blocked \u2014 allow in browser site settings to enable");return}await ts();let e=ue;await ar(),ue=!0,i(e?"notify: already enabled":"notify: enabled")}async function gr(){await lr(),ue=!1,i("notify: disabled")}function es(e,t){let s=e.shared_at?L(e.shared_at):"\u2014";return{primary:e.token,secondary:e.session_title??void 0,path:`/s/${e.token}`,pathSecondary:s,onSelect:()=>{t==="open"?be(e.token):Ye(e.token)}}}var re={name:"<root>",children:[{name:"/cancel",desc:"Cancel current response",onSelect:()=>{n.busy?(B(),i("^C")):i("Nothing to cancel.")}},{name:"/clear",desc:"Clear current session",fetch:Qn,toSpec:e=>{let t=e,s=t.cwd.toLowerCase()===(n.sessionCwd??"").toLowerCase();return{primary:t.cwd,current:s,onSelect:()=>{ve({cwd:t.cwd,showCwd:!0})}}},freeform:e=>{let t=e.trim();return t?{primary:`clear and start at '${t}'`,onSelect:()=>{ve({cwd:t,showCwd:!0})}}:null}},{name:"/log",desc:"Set log level",fetch:()=>[{value:"reset",name:"reset",desc:"Follow config/default"},{value:"off",name:"off",desc:"Disable logging"},{value:"error",name:"error",desc:"Show errors only"},{value:"warn",name:"warn",desc:"Show warnings and errors"},{value:"info",name:"info",desc:"Show info, warnings, errors"},{value:"debug",name:"debug",desc:"Show all messages"}],toSpec:e=>{let t=e;return{primary:t.name,secondary:t.desc,current:t.value!=="reset"&&t.value===pt(),onSelect:()=>{if(t.value==="reset"){Pt();return}At(t.value)}}}},{name:"/reset",desc:"Reset local state",onSelect:()=>{Mt()}},{name:"/exit",desc:"End current session",onSelect:async()=>{if(!n.sessionId){i("warn: No active session");return}let e=n.sessionId;try{n.busy&&B(),oe(e).catch(()=>{}),await G(e,n.sessionCwd??void 0)}catch{i("err: Failed to exit session")}}},{name:"/help",desc:"Show help",onSelect:()=>{hr()}},{name:"/inbox",desc:"Manage inbox",fetch:Zn,toSpec:e=>{let t=e,s=t.from_label??t.from_ref,r=L(t.created_at);return{primary:t.title,secondary:r,path:t.cwd??"",pathSecondary:s,onSelect:()=>$t(t)}},children:[{name:"dismiss",desc:"Dismiss only",fetch:Zn,toSpec:e=>{let t=e,s=t.from_label??t.from_ref,r=L(t.created_at);return{primary:t.title,secondary:r,path:t.cwd??"",pathSecondary:s,onSelect:()=>dr(t)}}}]},{name:"/logout",desc:"Log out",onSelect:()=>{try{localStorage.removeItem(F)}catch{}try{n.eventSource?.close()}catch{}i("Logged out."),location.replace("/login")}},Lt("/mode","Switch mode","mode"),Lt("/model","Switch model","model",!0),{name:"/new",desc:"Create new session",fetch:Qn,toSpec:e=>{let t=e,s=t.cwd.toLowerCase()===(n.sessionCwd??"").toLowerCase();return{primary:t.cwd,current:s,onSelect:()=>{b(),i("Creating new session\u2026"),W({cwd:t.cwd})}}},freeform:e=>{let t=e.trim();return t?{primary:`create session at '${t}'`,onSelect:()=>{b(),i("Creating new session\u2026"),W({cwd:t})}}:null}},{name:"/notify",desc:"Toggle notifications",fetch:async()=>(await ts(),[{value:"on",name:"on",desc:"Enable notifications"},{value:"off",name:"off",desc:"Disable notifications"}]),toSpec:e=>{let t=e,s=t.value==="on"===ue;return{primary:t.name,secondary:t.desc,current:s,onSelect:t.value==="on"?pr:gr}}},{name:"/reload",desc:"Reload agent",onSelect:()=>{i("Reloading agent\u2026"),$e().catch(e=>{i(`err: ${e instanceof Error?e.message:"Failed to reload agent"}`)})}},{name:"/rename",desc:"Rename session",freeform:e=>{let t=e.trim();return t?{primary:`rename to '${t}'`,onSelect:async()=>{if(!n.sessionId){i("err: No active session");return}try{await Me(n.sessionId,t),i(`Renamed \u2192 ${t}`)}catch{i("err: Failed to rename session")}}}:null}},{name:"/share",desc:"Share a read-only snapshot",fetch:xt,toSpec:e=>es(e,"open"),freeform:e=>{let t=e.trim();return t?{primary:`open share '${t}'`,onSelect:()=>{be(t)}}:{primary:"create new share preview",onSelect:()=>Je()}},children:[{name:"by",desc:"Set author",fetch:async()=>[{value:await Yn()}],toSpec:e=>{let t=e.value;return{primary:t??"(none)",secondary:t?"current \u2014 Enter to clear":"currently anonymous",onSelect:()=>Se(null)}},freeform:e=>{let t=e.trim();return t?{primary:`set author to '${t}'`,onSelect:()=>Se(t)}:null}},{name:"revoke",desc:"Revoke a share",fetch:xt,toSpec:e=>es(e,"revoke")}]},{name:"/switch",desc:"Switch session",fetch:cr,matches:(e,t)=>{let s=e;return(s.title??"").toLowerCase().includes(t)||s.id.startsWith(t)},toSpec:e=>{let t=e,s=t.title??t.id,r=L(t.last_active_at);return{primary:s,secondary:r,path:t.cwd,current:t.id===n.sessionId,onSelect:()=>ss(t.id)}}},Lt("/think","Set thinking effort","reasoning_effort"),{name:"/token",desc:"Manage API tokens",fetch:Xn,toSpec:e=>{let t=e,s=t.lastUsedAt?L(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${s}`,path:`${t.scope} \xB7 created ${L(t.createdAt)}`,current:t.isSelf,onSelect:t.isSelf?void 0:()=>{i(`\u2014 use /token revoke ${t.name} to revoke`)}}},freeform:e=>{let t=e.trim();return/^[A-Za-z0-9_-]{1,64}$/.test(t)?{primary:`create token '${t}'`,onSelect:()=>fr(t)}:null},children:[{name:"revoke",desc:"Revoke token",fetch:async()=>(await Xn()).filter(e=>!e.isSelf),toSpec:e=>{let t=e,s=t.lastUsedAt?L(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${s}`,path:`${t.scope} \xB7 created ${L(t.createdAt)}`,onSelect:()=>mr(t.name)}}}]}]};function Lt(e,t,s,r=!1){return{name:e,desc:t,fetch:()=>{let o=V(s);return o?o.options:[]},toSpec:o=>{let a=o,c=rt(s);return{primary:a.name,secondary:r?`(${a.value})`:void 0,current:a.value===c,onSelect:()=>ur(s,a.value,a.name)}},matches:r?(o,a)=>{let c=o;return c.name.toLowerCase().includes(a)||c.value.toLowerCase().includes(a)}:void 0}}function hr(){let e=[];n.serverVersion&&e.push(`WebAgent ${n.serverVersion}`),n.agentName&&n.agentVersion&&e.push(`${n.agentName} ${n.agentVersion}`),e.length&&i(e.join(" \xB7 ")),i("\u203A has next step * current value"),i("Tab completes \xB7 Enter sends raw text"),i("? \u2014 Show help"),i("!<command> \u2014 Run bash command"),i("// \u2014 Agent commands (agent-specific)");for(let t of re.children)i(`${t.name} \u2014 ${t.desc??""}`);i("--- Shortcuts ---");for(let t of yr)i(`${t.key} \u2014 ${t.desc}`);i("--- Tips ---");for(let t of vr)i(t.text)}var yr=[{key:"Enter",desc:"Send message"},{key:"Shift+Enter",desc:"New line"},{key:"^C",desc:"Cancel current response"},{key:"^M",desc:"Cycle mode (Agent \u2192 Plan \u2192 Autopilot)"},{key:"^U",desc:"Attach file (any type)"}],vr=[{text:"Tap \u276F prompt to cycle mode"}];async function wr(){try{let e=await navigator.serviceWorker.ready,t=await fetch("/api/beta/push/vapid-key");if(!t.ok)return;let{publicKey:s}=await t.json(),o=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Sr(s)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:o.endpoint,keys:o.keys,clientId:n.clientId})})}catch(e){x.scope("push").error("subscribe failed",{err:e})}}async function br(){try{let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!t)return;let s=t.endpoint;await t.unsubscribe(),await fetch("/api/beta/push/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:s})})}catch(e){x.scope("push").error("unsubscribe failed",{err:e})}}function Sr(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),r=atob(s),o=new Uint8Array(r.length);for(let a=0;a<r.length;a++)o[a]=r.charCodeAt(a);return o}async function rs(){try{return await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{return!1}}async function Rt(e){let t=e.split(/\s+/),s=t[0].toLowerCase(),r=t.slice(1).join(" ").trim();switch(s){case"/share":{let o=r.split(/\s+/),a=(o[0]??"").toLowerCase();if(a==="")return await Je(),!0;if(a==="revoke"){let u=o[1]??"";return await Ye(u),!0}if(a==="by"){let u=r.replace(/^by(\s+|$)/i,"").trim();return await Se(u===""?null:u),!0}let c=o[0]??"";return/^[A-Za-z0-9_-]{24}$/.test(c)?(be(c),!0):(i(`share: unknown subcommand '${a}' \u2014 try /share, /share by <name>, /share <token>, or /share revoke <token>`),!0)}case"/new":{let o=r||n.sessionCwd||void 0,a=n.sessionId;return b(),n.sessionId=null,i("Creating new session\u2026"),W({cwd:o,inheritFromSessionId:a}),!0}case"/rename":{if(!n.sessionId)return i("err: No active session"),!0;if(!r)return i(`Current: ${n.sessionTitle??"(untitled)"}`),i("Usage: /rename <new title>"),!0;try{await Me(n.sessionId,r),i(`Renamed \u2192 ${r}`)}catch{i("err: Failed to rename session")}return!0}case"/sessions":return i("Removed. Use /switch to see all sessions."),!0;case"/clear":return await ve({cwd:r||void 0,showCwd:!!r}),!0;case"/exit":{if(!n.sessionId)return i("warn: No active session"),!0;let o=n.sessionId;try{n.busy&&B(),oe(o).catch(()=>{}),await G(o,n.sessionCwd??void 0)}catch{i("err: Failed to exit session")}return!0}case"/logout":{try{localStorage.removeItem(F)}catch{}try{n.eventSource?.close()}catch{}return i("Logged out."),location.replace("/login"),!0}case"/token":{let o=r.trim().split(/\s+/).filter(Boolean),a=o[0];if(!a){try{let u=await _e();if(u.length===0)return i("token: (none)"),!0;for(let d of u){let m=d.lastUsedAt?L(d.lastUsedAt):"never";i(`${d.name} (${d.scope}) \u2014 created ${L(d.createdAt)}, last used ${m}`)}i("\u2014 /token <name> to create \xB7 /token revoke <name> to revoke")}catch(u){let d=u;d.status===y.FORBIDDEN?i("err: admin scope required to manage tokens"):i(`err: token list failed (${d.message})`)}return!0}if(a==="revoke"){let u=o[1];if(!u)return i("err: usage /token revoke <name>"),!0;try{await Oe(u),i(`token: revoked ${u}`)}catch(d){let m=d;m.status===y.NOT_FOUND?i(`err: no token named "${u}"`):m.status===y.FORBIDDEN?i("err: admin scope required to manage tokens"):m.status===y.BAD_REQUEST&&/using|yourself|cannot/i.test(m.message)?i("err: can't revoke the token you're signed in with \u2014 use another admin token"):i(`err: revoke failed (${m.message})`)}return!0}let c=a;if(!/^[A-Za-z0-9_-]{1,64}$/.test(c))return i("err: token name must match [A-Za-z0-9_-]{1,64}"),!0;try{let u=await Ne(c);i(`token: created ${u.name} (${u.scope})`),i(`${u.token}`),i("\u2014 save this now; it will never be shown again")}catch(u){let d=u;d.status===y.CONFLICT?i(`err: token "${c}" already exists`):d.status===y.FORBIDDEN?i("err: admin scope required to manage tokens"):i(`err: create failed (${d.message})`)}return!0}case"/switch":{if(!r)return i("Usage: /switch <title or id prefix>"),!0;try{let a=await(await fetch("/api/v1/sessions")).json(),c=r.toLowerCase(),u=a.find(p=>p.id.startsWith(r)||p.title?.toLowerCase().includes(c));if(!u)return i(`err: No session matching "${r}"`),!0;n.sessionSwitchGen++;let d=n.sessionSwitchGen;b(),n.sessionId=null;let[m]=await Promise.all([$(u.id),z(u.id)]);if(await H(u.id),d!==n.sessionSwitchGen)return!0;A({type:"session_created",sessionId:m.id,cwd:m.cwd,title:m.title,configOptions:m.configOptions}),S(!0)}catch{b(),n.sessionId=null,i("err: Failed to switch session")}return!0}case"/cancel":return n.busy?(B(),i("^C")):i("Nothing to cancel."),!0;case"/reload":return i("Reloading agent\u2026"),$e().then(()=>{}).catch(o=>{i(`err: ${o instanceof Error?o.message:"Failed to reload agent"}`)}),!0;case"/help":case"?":{let o=[];n.serverVersion&&o.push(`WebAgent ${n.serverVersion}`),n.agentName&&n.agentVersion&&o.push(`${n.agentName} ${n.agentVersion}`),o.length&&i(o.join(" \xB7 ")),i("\u203A has next step * current value"),i("Tab completes \xB7 Enter sends raw text"),i("? \u2014 Show help"),i("!<command> \u2014 Run bash command"),i("// \u2014 Agent commands (agent-specific)");for(let a of re.children)i(`${a.name} \u2014 ${a.desc??""}`);return i("--- Shortcuts ---"),i("Enter \u2014 Send message"),i("Shift+Enter \u2014 New line"),i("^C \u2014 Cancel current response"),i("^M \u2014 Cycle mode (Agent \u2192 Plan \u2192 Autopilot)"),i("^U \u2014 Attach file (any type)"),i("--- Tips ---"),i("Tap \u276F prompt to cycle mode"),!0}case"/model":case"/mode":case"/think":{let a={"/model":"model","/mode":"mode","/think":"reasoning_effort"}[s],c=V(a);if(!r){let f=c?.options.find(g=>g.value===c.currentValue)?.name??c?.currentValue??"unknown";return i(`${c?.name??a}: ${f}`),i(`Type ${s} + space to pick from list`),!0}if(!c)return i(`err: ${s.slice(1)} is not available.`),!0;let u=r.trim(),d=f=>f.toLowerCase().replace(/[\s_]+/g,"-"),m=d(u),p=c.options.find(f=>d(f.value)===m||d(f.name)===m);if(!p){let f=c.options.filter(g=>d(g.value).includes(m)||d(g.name).includes(m));if(f.length===1)p=f[0];else if(f.length>1)return i(`err: Ambiguous "${r}". Type ${s} + space to see options.`),!0}return p?(c.currentValue=p.value,E(),O(),i(`${c.name} \u2192 ${p.name}`),await ie(n.sessionId,a,p.value).catch(()=>{}),!0):(i(`err: Unknown "${r}". Type ${s} + space to see options.`),!0)}case"/inbox":{let o=r.trim().split(/\s+/).filter(Boolean),a=o[0];if(!a){try{let{messages:f}=await ge();if(f.length===0)return i("inbox: empty"),!0;for(let g of f){let h=g.from_label??g.from_ref,v=L(g.created_at);i(`${g.id} \xB7 ${g.title} \xB7 ${h} \xB7 ${v}`)}i("\u2014 /inbox <id> to open \xB7 /inbox dismiss <id> to dismiss only")}catch(f){i(`err: inbox list failed (${f.message})`)}return!0}let c=a==="dismiss",u=c?o[1]:a;if(!u)return i("err: usage /inbox <id> | /inbox dismiss <id>"),!0;let d;try{({messages:d}=await ge())}catch(f){return i(`err: inbox list failed (${f.message})`),!0}let m=u.toLowerCase(),p=d.find(f=>f.id===u)??d.find(f=>f.id.toLowerCase().startsWith(m))??d.find(f=>f.title.toLowerCase().includes(m));if(!p)return i(`err: no inbox message matching "${u}"`),!0;if(c){try{await Re(p.id),i(`inbox: dismissed ${p.id}`)}catch(f){i(`err: dismiss failed (${f.message})`)}return!0}try{await $t(p)}catch(f){i(`err: consume failed (${f.message})`)}return!0}case"/notify":{if(typeof Notification>"u")return i("err: notifications not supported in this browser"),!0;let o=r.toLowerCase();if(o==="on"){if(Notification.permission==="denied")return i("notify: blocked \u2014 allow in browser site settings to enable"),!0;if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted")return i("notify: blocked \u2014 allow in browser site settings to enable"),!0;let c=await rs();return await wr(),i(c?"notify: already enabled":"notify: enabled"),!0}if(o==="off")return await br(),i("notify: disabled"),!0;let a=Notification.permission;return a==="denied"?i("notify: blocked \u2014 allow in browser site settings to enable"):a==="granted"&&await rs()?i("notify: enabled"):i("notify: off \u2014 use /notify on to enable"),!0}case"/log":{let o=r.toLowerCase().trim();return o===""?(ns(),!0):o==="reset"?(Pt(),!0):["off","debug","info","warn","error"].includes(o)?(At(o),!0):(i(`err: invalid level '${o}' (use off|debug|info|warn|error|reset)`),!0)}case"/reset":return await Mt(),!0;default:return i(`err: Unknown command "${s}". Type / to see available commands.`),!0}}var de=null,ke=re,X,D=[],J=-1,fe=null;function kr(){return{name:"<agent-root>",children:n.agentCommands.map(e=>({name:`//${e.name}`,desc:e.input?`${e.description} \xB7 ${e.input.hint}`:e.description,onSelect:()=>{C(`//${e.name}`),l.sendBtn.click()}}))}}function Nt(e){return e.startsWith("//")?kr():re}function os(e){de="",ke=Nt(l.input.value),X=void 0,D=[{spec:{primary:e},prefix:"",kind:"placeholder"}],J=-1,Qe(""),l.slashMenu.classList.add("active")}function Ot(){let e=l.input.value;if(fe!==null){if(e===fe)return;fe=null}if(!e.startsWith("/")){q();return}let t=e.startsWith("//");if(t&&n.busy){os("(agent busy \u2014 wait or ^C to cancel)");return}if(t&&n.agentCommands.length===0){os("(agent commands unavailable)");return}let s=Nt(e),{node:r,pathPrefix:o,tailQuery:a}=ct(e,s);if(o!==de)if(de=o,ke=r,r.fetch&&r.toSpec){let c=r.fetch();if(c instanceof Promise){X="loading";let u=o;c.then(d=>{de===u&&(X=d,_t(is(),o))},d=>{if(de!==u)return;X={error:d instanceof Error&&d.message?d.message:"fetch failed"},_t(is(),o)})}else X=c}else X=void 0;else ke=r;_t(a,o)}function is(){let{tailQuery:e}=ct(l.input.value,Nt(l.input.value));return e}function _t(e,t){let s=Tn(ke,e,X);if(l.input.value==="/"&&s.push({spec:{primary:"Agent commands: type //"},prefix:"",kind:"placeholder"}),D=s,s.length===0){q();return}let r=s.findIndex(o=>o.kind!=="separator"&&o.kind!=="placeholder");J=r>=0?r:0,Qe(t),l.slashMenu.classList.add("active")}function Qe(e){l.slashMenu.innerHTML="",l.slashMenu.classList.toggle("slash-menu-root",e===""),D.forEach((s,r)=>{if(s.kind==="separator"){let c=document.createElement("div");c.className="slash-separator",c.dataset.idx=String(r),l.slashMenu.appendChild(c);return}let o=r===J,a=En(s.spec,o,s.prefix);s.prefix==="\u203A"&&a.classList.add("slash-arrow"),s.kind==="placeholder"&&a.classList.add("slash-placeholder"),a.dataset.idx=String(r),l.slashMenu.appendChild(a)}),l.slashMenu.dataset.pathPrefix=e;let t=l.slashMenu.querySelector(".slash-item.selected");t&&t.scrollIntoView({block:"nearest"})}function q(){l.slashMenu.classList.remove("active"),l.slashMenu.innerHTML="",J=-1,D=[],de=null,ke=re,X=void 0,fe=l.input.value}function Tr(){let e=D[J];if(!e)return;let t=l.slashMenu.dataset.pathPrefix??"";if(!(e.kind==="separator"||e.kind==="placeholder")){if(e.kind==="subcommand"&&e.node){let r=(e.node.children??[]).length>0||!!e.node.fetch||!!e.node.freeform;C(`${t}${t?" ":""}${e.node.name}${r?" ":""}`),r?(fe=null,Ot()):q()}else e.kind==="data"?(C(`${t}${t?" ":""}${e.spec.primary}`),q()):e.kind==="freeform"&&q();l.input.focus()}}async function Er(e){let t=D[e];if(!t)return;let s=l.slashMenu.dataset.pathPrefix??"";if(!(t.kind==="separator"||t.kind==="placeholder")){if(t.kind==="subcommand"&&t.node){if((t.node.children??[]).length>0||!!t.node.fetch||!!t.node.freeform){C(`${s}${s?" ":""}${t.node.name} `),fe=null,Ot(),l.input.focus();return}q(),C(""),t.node.onSelect&&await t.node.onSelect();return}q(),C(""),t.spec.onSelect?await t.spec.onSelect():i("Read-only entry \u2014 no action.")}}function ls(e){return!l.slashMenu.classList.contains("active")||D.length===0?!1:e.key==="ArrowDown"?(J=as(J,1),Qe(l.slashMenu.dataset.pathPrefix??""),!0):e.key==="ArrowUp"?(J=as(J,-1),Qe(l.slashMenu.dataset.pathPrefix??""),!0):e.key==="Tab"?(Tr(),!0):!1}function as(e,t){let s=D.length;for(let r=1;r<=s;r++){let o=(e+t*r+s)%s;if(D[o].kind!=="separator"&&D[o].kind!=="placeholder")return o}return e}l.slashMenu.addEventListener("mousedown",e=>{e.preventDefault();let s=e.target?.closest(".slash-item");s?.dataset.idx!==void 0&&Er(Number(s.dataset.idx))});l.input.addEventListener("input",()=>{Ot(),l.inputArea.classList.toggle("bash-mode",l.input.value.startsWith("!"))});function Ir(e){return new Promise(t=>{let s=new FileReader;s.onload=()=>{t(s.result)},s.readAsDataURL(e)})}async function cs(e){let t=e.type.startsWith("image/"),s={kind:t?"image":"file",file:e,mimeType:e.type||"application/octet-stream",name:e.name||(t?"image":"file")};return t&&(s.previewUrl=await Ir(e)),s}function us(e){n.pendingAttachments.push(e),Te()}function Te(){if(l.attachPreview.innerHTML="",n.pendingAttachments.length===0){l.attachPreview.classList.remove("active");return}l.attachPreview.classList.add("active"),n.pendingAttachments.forEach((e,t)=>{let s=document.createElement("span");if(s.className="attach-thumb",e.kind==="image"&&e.previewUrl){let o=document.createElement("img");o.src=e.previewUrl,s.appendChild(o)}else{s.classList.add("attach-file");let o=document.createElement("span");o.className="attach-file-name",o.textContent=e.name,s.appendChild(o)}let r=document.createElement("button");r.className="remove",r.textContent="\xD7",r.addEventListener("click",()=>{n.pendingAttachments.splice(t,1),Te()}),s.appendChild(r),l.attachPreview.appendChild(s)})}l.fileInput.onchange=async()=>{for(let e of l.fileInput.files)us(await cs(e));l.fileInput.value=""};l.input.addEventListener("paste",e=>{let t=e.clipboardData?.items;if(t)for(let s of t)s.type.startsWith("image/")&&(e.preventDefault(),(async()=>{let r=s.getAsFile();r&&us(await cs(r))})())});function Ht(e){let t=e.trim();return!t.startsWith("//")&&t.startsWith("/")||t==="?"||t.startsWith("? ")}function Bt(e){let t=e.trim();return Ht(t)||t.startsWith("!")}var me={send:()=>{},cancel:()=>{},attach:()=>{},publish:()=>{},cancelPreview:()=>{}};function fs(e){me=e}function xr(){if(n.previewToken)return[{label:"^P",title:"Publish preview (Ctrl+P)",className:"publish",onClick:()=>{me.publish()}},{label:"^C",title:"Cancel preview (Ctrl+C)",className:"cancel",onClick:()=>{me.cancelPreview()}}];let e={label:"^U",title:"Attach file (Ctrl+U)",onClick:()=>{me.attach()}},t=()=>{n.busy&&!Bt(l.input.value)?me.cancel():me.send()};return n.busy&&!Bt(l.input.value)?[e,{label:"^C",title:"Cancel (Ctrl+C)",className:"cancel",onClick:t}]:[e,{label:"\u21B5",title:"Send (Enter)",onClick:t}]}var Lr=["cancel","publish"];function ds(e,t){e.textContent=t.label,e.title=t.title,e.disabled=t.disabled??!1,e.onclick=t.onClick;for(let s of Lr)e.classList.remove(s);t.className&&e.classList.add(t.className)}function Cr(){let[e,t]=xr();ds(l.attachBtn,e),ds(l.sendBtn,t),l.input.disabled=!!n.previewToken}yn(Cr);function ms(e){let t=e.search(/\s/);return t<0?{token:e,remainder:""}:{token:e.slice(0,t),remainder:e.slice(t)}}function ps(e,t){if(!e.startsWith("//"))return null;let{token:s,remainder:r}=ms(e),o=s.slice(2);if(!o)return null;let a=t.find(c=>c.name.toLowerCase()===o.toLowerCase());return a?{command:s,agentText:`/${a.name}${r}`}:null}function Dt(e){return ms(e).token||e}function qt(){return n.clientId!==null}n._onCancelTimeout=()=>i("warn: Agent not responding to cancel");function hs(){let e=l.input.value.trim();if(!e&&n.pendingAttachments.length===0)return;let t=e.startsWith("//");if(Ht(e)&&n.pendingAttachments.length===0){C(""),l.input.style.height="auto",Rt(e);return}if(e.startsWith("!")&&n.pendingAttachments.length===0){let c=e.slice(1).trim();if(!c)return;if(!n.sessionId){i("warn: Session not ready yet, please wait\u2026");return}if(!qt()){i("warn: Not connected, please retry");return}C(""),l.input.style.height="auto",l.inputArea.classList.remove("bash-mode"),kn(c,!0),n.sentBashForSession=n.sessionId,on(n.sessionId,c).catch(()=>{}),w(!0);return}if(n.busy)return;if(t&&!ps(e,n.agentCommands)){let c=Dt(e);i(`err: Unknown command "${c}". Type // to see available commands.`);return}if(C(""),l.input.style.height="auto",l.inputArea.classList.remove("bash-mode"),!n.sessionId){i("warn: Session not ready yet, please wait\u2026");return}if(!qt()){i("warn: Not connected, please retry");return}let s=qe("user",e||"(attachment)"),r=[];for(let c of n.pendingAttachments)if(c.kind==="image"&&c.previewUrl){let u=document.createElement("img");u.className="user-image",u.src=c.previewUrl,u.alt=c.name,s.appendChild(u),r.push(null)}else{let u=document.createElement("div");u.className="user-attachment",u.textContent=`[${c.kind}: ${c.name}]`,s.appendChild(u),r.push(u)}let o=n.pendingAttachments.slice();n.pendingAttachments.length=0,Te();let a=c=>{Ar(c,{text:e,isAgentCommand:t,messageEl:s,attachments:o})};o.length>0?Promise.all(o.map(c=>{let u=new FormData;return u.append("file",c.file,c.name),fetch(`/api/v1/sessions/${n.sessionId}/attachments`,{method:"POST",body:u}).then(d=>d.json()).then(d=>({kind:d.kind,attachmentId:d.attachmentId,displayName:d.displayName,mimeType:d.mimeType,url:d.url}))})).then(c=>{if(!qt()){s.remove(),i("warn: Not connected, please retry"),w(!1);return}for(let d=0;d<c.length;d++){let m=r[d];if(!m)continue;let p=c[d];if(p.kind==="image"||!p.url)continue;let f=document.createElement("a");f.className="user-file",f.href=p.url,f.target="_blank",f.rel="noopener",f.download=p.displayName,f.textContent=p.displayName,m.replaceWith(f)}let u=c.map(({kind:d,attachmentId:m,displayName:p,mimeType:f})=>({kind:d,attachmentId:m,displayName:p,mimeType:f}));nt(n.sessionId,e||"What is in this attachment?",u).catch(a)}):nt(n.sessionId,e).catch(a),n.turnEnded=!1,n.sentMessageForSession=n.sessionId,w(!0),bn()}function Ar(e,t){if(w(!1),K(),t?.isAgentCommand&&e instanceof pe&&e.status===y.UNPROCESSABLE_CONTENT){t.messageEl.remove(),n.sentMessageForSession=null,C(t.text),n.pendingAttachments.push(...t.attachments),Te();let r=Dt(t.text);i(`err: Unknown command "${r}". Type // to see available commands.`);return}let s=e instanceof Error?e.message:String(e);i(`err: ${s}`)}function ys(){B()&&i("^C")}fs({send:hs,cancel:ys,attach:()=>{l.fileInput.click()},publish:()=>{Et()},cancelPreview:It});le();l.input.addEventListener("keydown",e=>{if(ls(e)){e.preventDefault();return}if(e.key==="Enter"&&!e.shiftKey){e.preventDefault(),q(),hs();return}if(e.key==="u"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey){e.preventDefault(),l.fileInput.click();return}});document.addEventListener("keydown",e=>{if(e.key==="c"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&!(!!window.getSelection()?.toString()||l.input.selectionStart!==l.input.selectionEnd)){if(n.previewToken){e.preventDefault(),It();return}if(n.busy){e.preventDefault(),ys();return}}e.key==="Escape"&&l.slashMenu.classList.contains("active")&&(e.preventDefault(),q(),l.input.focus())});var gs=0;function vs(){let e=V("mode");if(!e?.options.length){Date.now()-gs>3e3&&(i("Mode switcher temporarily unavailable. Try `/new` to start a fresh session."),gs=Date.now());return}let t=e.options.findIndex(r=>r.value===e.currentValue),s=e.options[(t+1)%e.options.length];e.currentValue=s.value,ie(n.sessionId,"mode",s.value).catch(()=>{}),i(`Mode \u2192 ${s.name}`),E()}document.addEventListener("keydown",e=>{e.key==="m"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&(e.preventDefault(),vs())});document.addEventListener("keydown",e=>{n.previewToken&&(!(e.ctrlKey||e.metaKey)||e.shiftKey||e.key==="p"&&(e.preventDefault(),Et()))});l.prompt.addEventListener("click",vs);l.input.addEventListener("input",le);l.input.addEventListener("input",()=>{Sn(Pr)});function Pr(){l.input.style.height="auto",l.input.style.height=Math.min(l.input.scrollHeight,Mr())+"px"}function Mr(){let e=Number.parseFloat(window.getComputedStyle(l.input).maxHeight);return Number.isFinite(e)?e:Number.POSITIVE_INFINITY}async function $r(e){try{let s=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!s)return;await fetch("/api/beta/push/register-client",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:e,endpoint:s.endpoint})})}catch{}}function Ze(){ee("connecting","connecting"),Rr()}async function Rr(){let e;try{e=(await an()).ticket}catch{setTimeout(Ze,3e3);return}let t=new EventSource(`/api/v1/events/stream?ticket=${encodeURIComponent(e)}`);n.eventSource=t,t.onmessage=s=>{let r=JSON.parse(s.data);r.type==="connected"&&r.clientId&&(n.clientId=r.clientId,Ve(r.debugLevel),ae(r.clientId,!document.hidden,n.sessionId??void 0),$r(r.clientId),!r.agent)||A(r)},t.onerror=()=>{t.close(),Nr(),setTimeout(Ze,3e3)},t.addEventListener("heartbeat",()=>{n.clientId&&(document.hidden||ae(n.clientId,!0,n.sessionId??void 0))}),_r()}async function _r(){ee("connecting","session loading");let e=n.sessionSwitchGen,t=vn();if(t&&t===n.sessionId&&n.lastEventSeq>0){if(await Ft(t,!0,e),e!==n.sessionSwitchGen)return;S(!1);return}if(t){if(b(),await Ft(t,!1,e),e!==n.sessionSwitchGen)return;S(!0);return}try{let s=await Pe();if(e!==n.sessionSwitchGen)return;if(s.length>0){if(b(),await Ft(s[0].id,!1,e),e!==n.sessionSwitchGen)return;S(!0);return}}catch{}e===n.sessionSwitchGen&&W()}async function Ft(e,t,s){if(t){try{let r=await $(e);if(s!==n.sessionSwitchGen)return;A({type:"session_created",sessionId:r.id,cwd:r.cwd,title:r.title,configOptions:r.configOptions})}catch{if(s!==n.sessionSwitchGen)return;await G(e,n.sessionCwd??void 0);return}if(s!==n.sessionSwitchGen)return;await Promise.all([H(e),wt(e)])}else{n.sessionId=null;let r=z(e),o;try{let[a,c]=await Promise.all([$(e),r]);if(await H(e),s!==n.sessionSwitchGen)return;o=a,c||i("warn: Failed to load history.")}catch{if(s!==n.sessionSwitchGen)return;await G(e,n.sessionCwd??void 0);return}A({type:"session_created",sessionId:o.id,cwd:o.cwd,title:o.title,configOptions:o.configOptions})}}function Nr(){ee("disconnected","disconnected"),n.eventSource=null,n.clientId=null,R(),j(),n.currentBashEl&&Fe(n.currentBashEl,null,"disconnected"),n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,n.turnEnded=!1,ce(),w(!1)}function ws(e,t){let s=`/api/beta/clients/${encodeURIComponent(e)}/visibility`,r=JSON.stringify({visible:!1,sessionId:t});try{fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:r,keepalive:!0}).catch(()=>{})}catch{}}document.addEventListener("visibilitychange",()=>{if(n.clientId&&(document.hidden?ws(n.clientId,n.sessionId??null):ae(n.clientId,!0,n.sessionId??void 0)),!document.hidden&&n.sessionId&&n.lastEventSeq>0&&!n.replayInProgress){let e=n.sessionId;Promise.all([H(e),wt(e)]).then(()=>{S(!1)})}});window.addEventListener("pagehide",()=>{n.clientId&&ws(n.clientId,n.sessionId??null)});var Or=80,Hr=300,Br=10,bs=!1,Y=null;function Dr(){return typeof window.visualViewport>"u"?null:window.visualViewport}function Ss(){let e=Dr();return e?e.offsetTop>0||window.innerHeight-e.height>Or:!0}function qr(e){return e===l.input}function Ut(e){return typeof e.pointerId=="number"?e.pointerId:1}function Fr(e){e.pointerType==="touch"&&(Y=null,qr(e.target)&&document.activeElement===l.input&&(l.input.disabled||Ss()||(Y={pointerId:Ut(e),startX:e.clientX,startY:e.clientY,startTs:e.timeStamp})))}function Ur(e){if(!Y||Ut(e)!==Y.pointerId)return;let t=Y;Y=null;let s=e.timeStamp-t.startTs,r=Math.hypot(e.clientX-t.startX,e.clientY-t.startY);s>Hr||r>Br||document.activeElement!==l.input||l.input.disabled||Ss()||l.input.blur()}function Vr(e){Y&&Ut(e)===Y.pointerId&&(Y=null)}function ks(){bs||(bs=!0,document.addEventListener("pointerdown",Fr,{capture:!0}),document.addEventListener("pointerup",Ur,{capture:!0}),document.addEventListener("pointercancel",Vr,{capture:!0}))}if(!localStorage.getItem(F))throw location.replace("/login"),new Error("redirecting to /login");Yt();Mn(i);ks();l.messages.addEventListener("click",Vt);tt(Wt);Ze();fetch("/api/v1/version").then(e=>e.json()).then(e=>{typeof e.server=="string"&&(n.serverVersion=e.server);let t=e.agent;t&&(n.agentName=typeof t.name=="string"?t.name:null,n.agentVersion=typeof t.version=="string"?t.version:null)}).catch(()=>{});"serviceWorker"in navigator&&(navigator.serviceWorker.register("/sw.js"),navigator.serviceWorker.addEventListener("message",e=>{let t=e.data;if(t?.type==="navigate"&&t.sessionId){let s=t.sessionId;if(n.sessionId===s)return;n.sessionSwitchGen++;let r=n.sessionSwitchGen;history.replaceState(null,"",`#${s}`),b(),n.sessionId=null,i("Switching\u2026"),Promise.all([$(s),z(s)]).then(([o,a])=>{r===n.sessionSwitchGen&&(A({type:"session_created",sessionId:o.id,cwd:o.cwd,title:o.title,configOptions:o.configOptions}),a&&S(!0))}).catch(()=>{b(),n.sessionId=null,i("err: Failed to switch session")})}}));
@@ -1 +0,0 @@
1
- var s=Object.freeze({OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,CONFLICT:409,GONE:410,PAYLOAD_TOO_LARGE:413,UNPROCESSABLE_CONTENT:422,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,SERVICE_UNAVAILABLE:503});var c="wa_token";async function p(n,a={}){let i=a.fetch??fetch,o=n.trim();if(!o)return{ok:!1,error:"Token is required"};let r;try{r=await i("/api/v1/auth/verify",{method:"GET",headers:{Authorization:`Bearer ${o}`}})}catch(e){return{ok:!1,error:`Network error: ${e instanceof Error?e.message:String(e)}`}}if(r.status===s.OK){let e;try{e=await r.json()}catch{return{ok:!1,error:"Server returned invalid response"}}if(!e.ok||typeof e.name!="string"||typeof e.scope!="string")return{ok:!1,error:"Server returned malformed response"};try{localStorage.setItem(c,o)}catch(t){return{ok:!1,error:`Could not store token: ${t instanceof Error?t.message:String(t)}`}}return{ok:!0,name:e.name,scope:e.scope}}return r.status===s.UNAUTHORIZED?{ok:!1,error:"Invalid or rejected token"}:{ok:!1,error:`Unexpected response (status ${r.status})`}}export{s as a,c as b,p as c};
@@ -1 +0,0 @@
1
- import{b as f,k as g,l as h}from"./chunk.3CCHZCG7.js";import{a as u}from"./chunk.UMQMOGWO.js";import"./chunk.AJZBJBMO.js";var E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function m(t){return String(t).padStart(2,"0")}function p(t,r){if(!t)return"";let s=new Date(t),a=s.getTime();if(isNaN(a))return"";let l=Math.floor((r.getTime()-a)/1e3);if(l<60)return"just now";let i=Math.floor(l/60);if(i<60)return`${i}m ago`;let o=Math.floor(i/60);if(o<24)return`${o}h ago`;let e=Math.floor(o/24);if(e<7)return`${e}d ago`;let n=s.getUTCFullYear()===r.getUTCFullYear(),c=E[s.getUTCMonth()],d=s.getUTCDate();return n?`${c} ${d}`:`${c} ${d}, ${s.getUTCFullYear()}`}function y(t){if(!t)return"";let r=new Date(t);return isNaN(r.getTime())?"":`${r.getUTCFullYear()}-${m(r.getUTCMonth()+1)}-${m(r.getUTCDate())} ${m(r.getUTCHours())}:${m(r.getUTCMinutes())} UTC`}function T(t){let r=/^\/api\/v1\/sessions\/[^/]+\/attachments\/([A-Za-z0-9._-]+)(?:\?.*)?$/;return s=>{let a=r.exec(s);return a?`/s/${encodeURIComponent(t)}/attachments/${a[1]}`:s}}function C(t){if(typeof t.data=="string")try{return JSON.parse(t.data)}catch{return{}}return t.data}function v(t,r,s){let a=new Set;for(let n of t)if(n.type==="permission_response")try{let c=JSON.parse(n.data);typeof c.requestId=="string"&&a.add(c.requestId)}catch{}let l=new Map,i=new Map,o=null,e={rewriteAttachmentSrc:T(s),enhanceMarkdown:f,findToolCallEl:n=>l.get(n)??null,findPermissionEl:n=>i.get(n)??null,findBashEl:()=>o,isPermissionResolved:n=>a.has(n)};for(let n of t){if(!g(n.type))continue;let c=C(n),d=h(n.type,c,e);d?(r.appendChild(d),n.type==="tool_call"&&typeof c.id=="string"?l.set(c.id,d):n.type==="permission_request"&&typeof c.requestId=="string"?i.set(c.requestId,d):n.type==="bash_command"&&(o=d)):n.type==="bash_result"&&(o=null)}}async function S(){try{let e=localStorage.getItem("theme")??"auto";document.documentElement.setAttribute("data-theme",e)}catch{}let t=/^\/s\/([A-Za-z0-9_-]{24})(?:[/?#]|$)/.exec(location.pathname);if(!t){document.body.textContent="invalid share URL";return}let r=t[1],s=document.getElementById("session-info"),a=document.getElementById("messages"),l=document.querySelector(".share-footer-author"),i=document.querySelector(".share-footer-meta");if(!a)return;let o;try{let e=await fetch(`/api/v1/shared/${encodeURIComponent(r)}/events`,{headers:{Accept:"application/json"},credentials:"omit"});if(e.status===u.GONE){document.body.innerHTML="<div class='share-gone'>\u6B64\u94FE\u63A5\u5DF2\u64A4\u9500\u6216\u8FC7\u671F\u3002</div>";return}if(!e.ok){document.body.textContent=`error ${e.status}`;return}o=await e.json()}catch(e){document.body.textContent=`failed to load: ${String(e)}`;return}if(document.title=o.share.session_title?`${o.share.session_title} \u2014 shared`:"shared session",s&&(s.textContent=o.share.session_title??"(untitled)"),l){let e=o.share.display_name??"";l.textContent=e?`by ${e}`:""}if(v(o.events,a,r),i){let e=o.share.shared_at??o.share.created_at;i.textContent=p(e,new Date),i instanceof HTMLElement&&(i.title=y(e))}}S();