@lelouchhe/webagent 0.8.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.
- package/README.md +4 -1
- package/dist/index.html +20 -4
- package/dist/js/app.QC7IRDTP.js +5 -0
- package/dist/js/chunk.3CLGCUHW.js +1 -0
- package/dist/js/chunk.AOTG3PL7.js +20 -0
- package/dist/js/{chunk.CT5WBNGZ.js → chunk.S5LRNRJI.js} +50 -49
- package/dist/js/{login.2WA6DTGM.js → login.WMURU4NI.js} +1 -1
- package/dist/js/{viewer.CVWXSKJM.js → viewer.GP5VXAUY.js} +1 -1
- package/dist/login.html +2 -2
- package/dist/share-viewer.html +4 -4
- package/dist/{styles.00etlpgs.css → styles.00nlhhf3.css} +167 -2
- package/lib/agent-key.js +6 -0
- package/lib/attachments.js +44 -7
- package/lib/auth-middleware.js +9 -2
- package/lib/bridge.js +115 -22
- package/lib/event-handler.js +31 -3
- package/lib/files/limits.js +15 -0
- package/lib/files/paths.js +155 -0
- package/lib/files/routes.js +232 -0
- package/lib/home-path.js +35 -0
- package/lib/http-status.js +1 -0
- package/lib/routes.js +117 -28
- package/lib/server.js +22 -20
- package/lib/session-manager.js +54 -29
- package/lib/session-state.js +29 -0
- package/lib/share/routes.js +12 -0
- package/lib/store.js +99 -18
- package/lib/title-service.js +3 -3
- package/package.json +2 -1
- package/dist/js/app.XBFXH37R.js +0 -2
- package/dist/js/chunk.UMQMOGWO.js +0 -1
package/README.md
CHANGED
|
@@ -14,9 +14,11 @@ WebAgent is a thin browser client + Node.js server that lets you drive any ACP a
|
|
|
14
14
|
- **Web Push notifications** — Get pinged on `prompt_done`, `permission_request`, or `bash_done` when the tab isn't focused. Smart per-session suppression: if any device is actively viewing session X, no buzz from session X.
|
|
15
15
|
- **PWA + mobile-friendly** — Installable to iOS / Android home screen. Mobile-first input, attach via paste/upload, dark-mode native.
|
|
16
16
|
- **Attachments** — Drag, paste, or `^U` any file (images, code, PDFs, …). Server sniffs real MIME from content, so agents reliably read it.
|
|
17
|
+
- **Local file viewer** — `/view` browses arbitrary local paths and renders Markdown, highlighted code/text, and images; mobile opens full-screen while desktop keeps chat in a split pane.
|
|
17
18
|
- **Inline bash** — `!ls -la` runs directly in your session's cwd, output streams in real time, cancellable.
|
|
18
19
|
- **Sessions that survive everything** — SQLite-persisted history, auto-resume on page open, auto-restore via ACP `loadSession` after server restart, auto-generated titles via a fast model.
|
|
19
|
-
- **
|
|
20
|
+
- **Faithful ACP completion status** — standard `cancelled`, `max_tokens`, `max_turn_requests`, and `refusal` outcomes are shown as system notices; prompt errors are displayed and persisted without becoming assistant messages.
|
|
21
|
+
- **Rich slash menu** — `/new`, `/switch`, `/view`, `/model`, `/mode`, `/think`, `/notify`, `/inbox`, `/share`, `/token`, `/log` — autocomplete with Tab, submenus for pickable values.
|
|
20
22
|
- **Public share links** — `/share` snapshots a session into a sanitized read-only viewer at `/s/<token>` for show-and-tell.
|
|
21
23
|
- **Daemon mode with crash recovery** — `webagent start` runs as a background service with PID file, log rotation, and exponential-backoff restart on crash.
|
|
22
24
|
- **Built-in security** — Bearer token auth, per-device tokens, signed image URLs, strict CSP, single-operator threat model.
|
|
@@ -116,4 +118,5 @@ Frontend source lives in `public/js/*.ts`, bundled by esbuild into a single cont
|
|
|
116
118
|
| **[Share Links](docs/share.md)** | Public read-only session snapshots via `/share` + `/s/<token>` |
|
|
117
119
|
| **[Database Schema](docs/schema.md)** | SQLite tables, indexes, FK policy, cascade/lifecycle rules, migrations |
|
|
118
120
|
| **[Development](docs/development.md)** | Building from source, dev mode, testing, publishing |
|
|
121
|
+
| **[Implementation Invariants](docs/implementation-invariants.md)** | Runtime, security, protocol, frontend, browser, and platform constraints |
|
|
119
122
|
| **[Auto-Start on Boot](docs/autostart.md)** | launchd, systemd, crontab, Windows Task Scheduler |
|
package/dist/index.html
CHANGED
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
25
25
|
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
|
26
26
|
<script src="/theme-init.js"></script>
|
|
27
|
-
<link rel="stylesheet" href="/styles.
|
|
28
|
-
<link rel="modulepreload" href="/js/chunk.
|
|
29
|
-
<link rel="modulepreload" href="/js/chunk.
|
|
27
|
+
<link rel="stylesheet" href="/styles.00nlhhf3.css" />
|
|
28
|
+
<link rel="modulepreload" href="/js/chunk.S5LRNRJI.js">
|
|
29
|
+
<link rel="modulepreload" href="/js/chunk.3CLGCUHW.js">
|
|
30
30
|
<link rel="modulepreload" href="/js/chunk.AJZBJBMO.js">
|
|
31
31
|
</head>
|
|
32
32
|
<body>
|
|
@@ -74,6 +74,22 @@
|
|
|
74
74
|
</div>
|
|
75
75
|
<div id="status-bar"></div>
|
|
76
76
|
|
|
77
|
-
<
|
|
77
|
+
<aside id="file-viewer" aria-label="File viewer" hidden>
|
|
78
|
+
<div class="file-viewer-header">
|
|
79
|
+
<span id="file-viewer-path"></span>
|
|
80
|
+
<button
|
|
81
|
+
id="file-viewer-close"
|
|
82
|
+
type="button"
|
|
83
|
+
title="Close file viewer (Esc)"
|
|
84
|
+
aria-label="Close file viewer"
|
|
85
|
+
>
|
|
86
|
+
×
|
|
87
|
+
</button>
|
|
88
|
+
</div>
|
|
89
|
+
<div id="file-viewer-notice" role="status" hidden></div>
|
|
90
|
+
<div id="file-viewer-content"></div>
|
|
91
|
+
</aside>
|
|
92
|
+
|
|
93
|
+
<script type="module" src="/js/app.QC7IRDTP.js"></script>
|
|
78
94
|
</body>
|
|
79
95
|
</html>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{a as Gn,b as zn,c as R,d as Yn,e as Kt,f as Jn,g as tt,h as Xn,i as Qn,j as U,k as Zn,l as le,m as z,n as es,o as ts,p as T,q as _,r as nt,s as jt,t as Gt,u as ns,v as zt}from"./chunk.S5LRNRJI.js";import{a as w,b as G}from"./chunk.3CLGCUHW.js";import"./chunk.AJZBJBMO.js";var st=null;function Lr(e){location.replace(e)}function Ar(e){try{if(e.startsWith("/"))return e.split("?")[0];let t=new URL(e);return t.origin!==location.origin?null:t.pathname}catch{return null}}function Pr(e){return e==="/api/v1/files/content"||/^\/api\/v1\/sessions\/[A-Za-z0-9_-]+\/attachments\/[^/]+$/.test(e)}function Mr(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ss(e={}){let t=e.baseFetch??globalThis.fetch.bind(globalThis),s=e.onUnauthorized??Lr;st??=globalThis.fetch;let i=async(r,o)=>{let c=Mr(r),u=Ar(c),d=u?.startsWith("/api/")??!1,p=o;if(d){let f=localStorage.getItem(G);if(f){let m=o?.headers??(r instanceof Request?r.headers:void 0),g=new Headers(m);g.has("Authorization")||g.set("Authorization",`Bearer ${f}`),p={...o??{},headers:g}}}let h=await t(r,p);if(d&&h.status===w.UNAUTHORIZED&&u!==null&&!Pr(u)){try{localStorage.removeItem(G)}catch{}s("/login")}return h};return globalThis.fetch=i,Nr}function Nr(){st&&(globalThis.fetch=st,st=null)}var Rr=new Set(["plan","read-only"]),_r=new Set(["autopilot","bypassPermissions","full-access","yolo"]),Or=new Set(["agent","default","build"]);function it(e){if(!e)return"";let t=e.match(/[#/]([^#/]+)$/);return t?t[1]:e}function is(e){return Rr.has(it(e))}function rs(e){return _r.has(it(e))}function os(e){let t=it(e);return t?!Or.has(t):!1}function as(e){return it(e).replace(/([A-Z])/g," $1").trim()}var ce=class extends Error{name="ApiError";status;constructor(t,s){super(s),this.status=t}},Yt=3e4,ls=1e4;async function ue(e,t=Yt){if(typeof AbortController!="function")return e(void 0);let s=new AbortController,i=setTimeout(()=>{s.abort()},t);i.unref?.();try{return await e(s.signal)}finally{clearTimeout(i)}}async function L(e,t,s=Yt){return ue(async i=>{let r=await fetch(e,i?{...t,signal:i}:t);if(!r.ok){let c=`HTTP ${r.status}`;try{let u=await r.json();u.error&&(c=typeof u.error=="string"?u.error:JSON.stringify(u.error))}catch{}throw new ce(r.status,c)}let o=await r.text();if(o)return JSON.parse(o)},s)}function q(e,t,s,i=Yt){let r={"Content-Type":"application/json"};return s&&(r["X-Client-Op-Id"]=s),L(e,{method:"POST",headers:r,body:JSON.stringify(t)},i)}function se(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"op-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,10)}function cs(e,t){let s={};return e?.cwd&&(s.cwd=e.cwd),e?.inheritFromSessionId&&(s.inheritFromSessionId=e.inheritFromSessionId),q("/api/v1/sessions",s,t)}function us(e){let t={};return e&&(t["X-Client-Op-Id"]=e),L("/api/v1/sessions/bootstrap",{method:"POST",headers:t})}function Te(e){return L("/api/v1/sessions/"+e,{method:"DELETE"})}function rt(){return L("/api/v1/sessions")}function de(e){return L("/api/v1/sessions/"+e)}function ds(e){return L(`/api/v1/files/info?path=${encodeURIComponent(e)}`)}function ps(e){return L(`/api/v1/files/list?path=${encodeURIComponent(e)}`)}function fs(e){return L("/api/v1/sessions/"+e+"/snapshot")}function Jt(e,t,s,i=se()){let r={text:t};return s?.length&&(r.attachments=s),q("/api/v1/sessions/"+e+"/prompt",r,i)}function ms(e){return q("/api/v1/sessions/"+e+"/cancel",{},se())}function gs(e,t,s){return q("/api/v1/sessions/"+e+"/permissions/"+t,{optionId:s},se())}function hs(e,t){return q("/api/v1/sessions/"+e+"/permissions/"+t,{denied:!0},se())}function Ee(e,t,s){let i=t.replace(/_/g,"-"),r=typeof s=="boolean"?"config/"+i:i;return L("/api/v1/sessions/"+e+"/"+r,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:s})})}function ot(e,t){return L("/api/v1/sessions/"+e+"/title",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:t})})}function ys(e,t){return q("/api/v1/sessions/"+e+"/bash",{command:t})}function ke(e,t,s){let i={visible:t};return s&&(i.sessionId=s),q("/api/beta/clients/"+e+"/visibility",i,void 0,ls)}function at(){return q("/api/v1/bridge/reload",{})}function ws(){return q("/api/v1/sse-ticket",{},void 0,ls)}function qe(){return L("/api/v1/messages")}function vs(e,t){return q(`/api/v1/messages/${encodeURIComponent(e)}/consume`,{...t?{inheritFromSessionId:t}:{}})}function lt(e){return L(`/api/v1/messages/${encodeURIComponent(e)}`,{method:"DELETE"})}function ct(){return L("/api/v1/tokens")}function ut(e){return q("/api/v1/tokens",{name:e})}function dt(e){return L("/api/v1/tokens/"+encodeURIComponent(e),{method:"DELETE"})}var v=e=>document.querySelector(e),l={messages:v("#messages"),input:v("#input"),sendBtn:v("#send-btn"),prompt:v("#input-prompt"),status:v("#status"),sessionInfo:v("#session-info"),inboxBtn:v("#inbox-btn"),inboxCount:v("#inbox-count"),attachBtn:v("#attach-btn"),fileInput:v("#file-input"),attachPreview:v("#attach-preview"),themeBtn:v("#theme-btn"),slashMenu:v("#slash-menu"),fileViewer:v("#file-viewer"),fileViewerPath:v("#file-viewer-path"),fileViewerClose:v("#file-viewer-close"),fileViewerNotice:v("#file-viewer-notice"),fileViewerContent:v("#file-viewer-content"),planPanel:v("#plan-panel"),inputArea:v("#input-area"),modePill:v("#mode-pill"),statusBar:v("#status-bar")};function k(e){l.input.value=e,l.input.dispatchEvent(new window.Event("input",{bubbles:!0}))}var n={eventSource:null,clientId:null,sessionId:null,sessionSwitchGen:0,messageNavigationGen:0,pendingNavigationSessionId:null,pendingNavigationEvents:[],runtimeHydrationSessionId:null,sessionCwd:null,sessionCwdDisplay:null,sessionTitle:null,contextUsage:null,inboxCount:0,awaitingNewSession:!1,newSessionRequestInFlight:!1,pendingNewSessionOpId:null,_newSessionRecoveryTimer:null,configOptions:[],agentCommands:[],agentCommandsEpoch:null,agentCommandsRevision:0,sessionMode:null,sessionModel:null,currentAssistantEl:null,currentAssistantText:"",pendingFinalAnswerToolText:null,assistantRafToken:null,currentThinkingEl:null,currentThinkingText:"",busy:!1,busyKind:null,cancelStatus:null,plan:null,pendingAttachments:[],currentBashEl:null,followMessages:!0,pendingToolCallIds:new Set,pendingPermissionRequestIds:new Set,pendingPromptDone:!1,turnEnded:!1,currentPromptId:null,newTurnStarted:!1,sentMessageForSession:null,sentMessageOpId:null,awaitingOwnUserEcho:!1,replayedOwnUserEcho:!1,reconcileAfterOwnUserEcho:!1,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},$r={disconnected:"is-disconnected",connecting:"is-connecting",connected:"is-connected"};function ie(e,t=e){l.status.textContent="",l.status.className=`status-dot ${$r[e]}`,l.status.dataset.state=e,l.status.setAttribute("aria-label",t),l.status.setAttribute("title",t)}function ft(e){let t=Math.max(0,Math.trunc(e));n.inboxCount=t,l.inboxCount.hidden=t===0,l.inboxCount.textContent=t===0?"":`(${t>9?"9+":t})`;let s=t===0?"Inbox, no pending messages":`Inbox, ${t} pending ${t===1?"message":"messages"}`;l.inboxBtn.setAttribute("aria-label",s),l.inboxBtn.title=t===0?"Open inbox":`${s}. Open inbox`}function Xt(e){return n.configOptions.find(t=>t.id===e)}function O(e){let t=Xt(e);return t&&"options"in t?t:null}function Be(){let e=O("reasoning_effort")??O("thought_level");return e||(n.configOptions.find(s=>s.category==="thought_level"&&"options"in s)??null)}function Qt(e){return Xt(e)?.currentValue??null}function Is(e){let t=Qt(e);return typeof t=="string"?t:null}function xs(e,t){let s=Xt(e);s&&("options"in s&&typeof t=="string"||s.type==="boolean"&&typeof t=="boolean")&&(s.currentValue=t)}function Zt(e){n.configOptions=e,e.length>0&&Cs(),I(),B()}function qr(e){n.configOptions.length>0||(n.sessionMode=e.session.mode??null,n.sessionModel=e.session.model??null)}function Cs(){n.sessionMode=null,n.sessionModel=null}function Ls(e){return e==="mode"?n.sessionMode:n.sessionModel}function I(){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",J();return}l.input.placeholder="Message or ?";let e=Is("mode")||Ls("mode")||"";is(e)?l.inputArea.classList.add("plan-mode"):rs(e)&&l.inputArea.classList.add("autopilot-mode"),l.modePill.textContent=os(e)?as(e):"",J()}function Ss(e){return e<1e3?String(e):e<1e4?`${bs(e/1e3,1)}k`:e<1e6?`${Math.round(e/1e3)}k`:`${bs(e/1e6,2)}m`}function bs(e,t){return e.toFixed(t).replace(/\.?0+$/,"")}function Br(e){let t=e.indexOf("/");return t===-1?e:e.slice(t+1)}function Hr(e){if(e.startsWith("~/")||e.startsWith("~\\"))return{prefix:e.slice(0,2),tail:e.slice(2)};if(e.startsWith("/"))return{prefix:"/",tail:e.slice(1)};let t=e.match(/^[A-Za-z]:[\\/]/)?.[0];return t?{prefix:t,tail:e.slice(t.length)}:{prefix:"",tail:e}}function B(){let e=Is("model")||Ls("model"),t=n.sessionCwdDisplay??n.sessionCwd??"",s=[];if(e&&s.push({text:Br(e),className:"status-model",title:e}),n.contextUsage){let{used:i,size:r}=n.contextUsage;s.push({text:`${Ss(i)}/${Ss(r)}`,className:"status-usage",title:`${i.toLocaleString("en-US")} / ${r.toLocaleString("en-US")} tokens`})}t&&s.push({text:t,className:"status-cwd",title:t}),l.statusBar.textContent="",s.forEach((i,r)=>{if(r>0){let c=document.createElement("span");c.className="status-separator",c.textContent="\xA0\xB7\xA0",l.statusBar.appendChild(c)}let o=document.createElement("span");if(o.className=i.className,i.className==="status-cwd"){let c=Hr(i.text);if(c.prefix){let d=document.createElement("span");d.className="status-cwd-prefix",d.textContent=c.prefix,o.appendChild(d)}let u=document.createElement("span");u.className="status-cwd-tail",u.textContent=c.tail,o.appendChild(u)}else o.textContent=i.text;i.title&&(o.title=i.title),l.statusBar.appendChild(o)})}var As=()=>{};function Ps(e){As=e}function Ms(e){n.plan=e?.map(t=>({...t}))??null,As(n.plan)}function Dr(e){n.lastStateSeq=e.seq;let t=e.runtime.busy;t?.promptId&&(n.currentPromptId=t.promptId),n.busyKind=t?.kind??null,n.cancelStatus=t?.cancelStatus??null,S(t!=null),t==null&&Ce(),Ms(e.runtime.plan??null),n.contextUsage=e.runtime.contextUsage?{...e.runtime.contextUsage}:null,n.sessionCwdDisplay=e.session.cwdDisplay??e.session.cwd,mt(e.agentCommands??{epoch:"",revision:0,commands:[]}),qr(e),I(),B()}function mt(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 en(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;s?.promptId&&(n.currentPromptId=s.promptId),n.busyKind=s?.kind??null,n.cancelStatus=s?.cancelStatus??null,S(s!=null),s==null&&Ce()}return t&&"plan"in t&&Ms(t.plan??null),t&&"contextUsage"in t&&(n.contextUsage=t.contextUsage?{...t.contextUsage}:null,B()),!0}async function Ns(e,t){let s=await Rs(e,t);return s.status==="applied"?s.snapshot:null}async function Rs(e,t){let s=n.sessionSwitchGen,i=n.lastStateSeq;try{let r=await fs(e);return n.sessionSwitchGen!==s||t&&!t()?{status:"stale"}:n.lastStateSeq!==i||r.seq<n.lastStateSeq?{status:"superseded"}:(Dr(r),{status:"applied",snapshot:r})}catch{return{status:"failed"}}}function Fr(e){let t=n.pendingNavigationEvents.filter(s=>s.type==="state_patch"&&s.sessionId===e).sort((s,i)=>s.seq-i.seq);return n.pendingNavigationEvents=n.pendingNavigationEvents.filter(s=>s.type!=="state_patch"||s.sessionId!==e),t}function Ur(e){n.pendingNavigationEvents=n.pendingNavigationEvents.filter(t=>t.type!=="state_patch"||t.sessionId!==e)}var Ts=0;function Es(e){for(let t of Fr(e))if(!(t.seq<=n.lastStateSeq)&&!en({seq:t.seq,patch:t.patch}))return!1;return!0}var _s=()=>{};function Os(e){_s=e}function ks(){return _s(),!0}async function X(e,t){let s=++Ts;n.runtimeHydrationSessionId=e;try{for(let i=0;i<3;i++){let r=await Rs(e,t);if(r.status==="stale")return!1;if(r.status==="superseded"){if(Es(e))return ks();continue}if(r.status!=="failed"&&Es(e))return ks()}return!1}finally{s===Ts?n.runtimeHydrationSessionId=null:n.runtimeHydrationSessionId!==e&&Ur(e)}}function S(e){n.busy=e,e||(n.busyKind=null,n.cancelStatus=null),e?l.prompt.classList.add("busy"):l.prompt.classList.remove("busy"),J()}function He({cwd:e,inheritFromSessionId:t=n.sessionId}={}){gt({cwd:e,inheritFromSessionId:t})}function xe(){gt({bootstrap:!0,inheritFromSessionId:null})}async function gt({cwd:e,inheritFromSessionId:t=n.sessionId,bootstrap:s=!1}={}){if(n.newSessionRequestInFlight||n.pendingNewSessionOpId)return!1;Vr(),n.sessionSwitchGen++,n.messageNavigationGen++;let i=n.sessionSwitchGen;n.pendingNavigationSessionId=null,n.pendingNavigationEvents=[],n.runtimeHydrationSessionId=null,n.awaitingNewSession=!0,n.newSessionRequestInFlight=!0;let r=se();n.pendingNewSessionOpId=r;try{let o=s?await us(r):await cs({cwd:e,inheritFromSessionId:t},r);if(n.newSessionRequestInFlight=!1,i!==n.sessionSwitchGen)return n.pendingNewSessionOpId===r&&pe(),!1;if(typeof o.id!="string")throw new Error("Session create response is missing an id");return pt.delete(r),pe(),$s(o),!0}catch{return pt.delete(r)?!0:i===n.sessionSwitchGen&&n.pendingNewSessionOpId===r?await new Promise(o=>{Ie.set(r,o),n._newSessionRecoveryTimer=setTimeout(()=>{Ie.delete(r),n.pendingNewSessionOpId===r&&(n.pendingNewSessionOpId=null,i===n.sessionSwitchGen&&(n.awaitingNewSession=!1)),n._newSessionRecoveryTimer=null,o(!1)},3e3)}):!1}finally{n.newSessionRequestInFlight=!1,i!==n.sessionSwitchGen&&n.pendingNewSessionOpId===r&&pe()}}var pt=new Set,Ie=new Map;function pe(e){if(e){let t=Ie.get(e);t?(Ie.delete(e),t(!0)):pt.add(e)}else{pt.clear();for(let t of Ie.values())t(!1);Ie.clear()}n._newSessionRecoveryTimer!=null&&(clearTimeout(n._newSessionRecoveryTimer),n._newSessionRecoveryTimer=null),n.pendingNewSessionOpId=null,n.newSessionRequestInFlight=!1}var $s=()=>{};function qs(e){$s=e}var Bs=()=>{};function Hs(e){Bs=e}function Vr(){Bs()}var Ds=[];function De(e){Ds.push(e)}var Fs=()=>{};function Us(e){Fs=e}function J(){Fs()}function x({preserveNavigationTarget:e=!1}={}){for(let t of Ds)t();l.messages.innerHTML="",n.assistantRafToken!=null&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null),n.currentAssistantEl=null,n.currentAssistantText="",n.pendingFinalAnswerToolText=null,n.currentThinkingEl=null,n.currentThinkingText="",n.busyKind=null,n.cancelStatus=null,n.plan=null,n.pendingAttachments.length=0,n.followMessages=!0,n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,n.turnEnded=!1,n.currentPromptId=null,n.newTurnStarted=!1,n.sentMessageOpId=null,n.awaitingOwnUserEcho=!1,n.replayedOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,n._cancelTimerId!=null&&clearTimeout(n._cancelTimerId),n._cancelTimerId=null,n.lastEventSeq=0,n.lastStateSeq=0,n.pendingNavigationEvents=[],n.oldestLoadedSeq=0,n.hasMoreHistory=!1,n.loadingOlderEvents=!1,n.replayInProgress=!1,n.replayQueue=[],e||(n.pendingNavigationSessionId=null),n.previewToken=null,l.attachPreview.innerHTML="",l.attachPreview.classList.remove("active"),l.input.disabled=!1,l.sendBtn.disabled=!1,I(),S(!1),n.sessionTitle=null,n.sessionCwd=null,n.sessionCwdDisplay=null,n.contextUsage=null,n.configOptions=[],n.agentCommands=[],n.agentCommandsEpoch=null,n.agentCommandsRevision=0,Cs(),yt(null,null),l.statusBar.textContent=""}async function ht(e={}){if(!n.busy&&!e.force||!n.sessionId)return null;let t=n.sessionId,s=n.lastStateSeq;n.cancelStatus="requested",J();try{let i=await ms(t);return n.sessionId===t&&n.lastStateSeq===s&&(i.status==="idle"||i.status==="cancelled"?S(!1):i.status==="superseded"&&(n.cancelStatus=null,J())),i}catch(i){throw n.sessionId===t&&n.lastStateSeq===s&&(n.cancelStatus=null,J()),i}}function Ce(){n._cancelTimerId!=null&&(clearTimeout(n._cancelTimerId),n._cancelTimerId=null)}function Vs(){return location.hash.slice(1)||null}function Le(e){history.replaceState(null,"",`#${e}`)}function yt(e,t){l.sessionInfo.textContent=t??(e?e.slice(0,8)+"\u2026":""),document.title=t??">_"}ie("disconnected");function vt(e,t){let s=document.createElement("div");return s.className=`msg ${e}`,e==="user"?s.innerHTML=U(t).replace(/\n/g,"<br>"):e==="assistant"?_(s,t,n.pendingFinalAnswerToolText??void 0):le(s,t),E(s),s}function a(e){let t=document.createElement("div");return t.className="system-msg",t.textContent=e,E(t),t}function M(){let e=n.currentAssistantEl,t=n.currentAssistantText,s=e instanceof HTMLElement&&e.dataset.assistantDisplay==="final-answer"||n.pendingFinalAnswerToolText!==null,i=n.assistantRafToken,r=i!=null;n.currentAssistantEl=null,n.currentAssistantText="",r&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(i),n.assistantRafToken=null),e&&(r||s)&&_(e,t,n.pendingFinalAnswerToolText??void 0,!0),n.pendingFinalAnswerToolText=null,e&&typeof e.querySelector=="function"&&(e.removeAttribute("data-primed"),R(e),z(e))}function Ws(){if(n.assistantRafToken==null)return;typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n.assistantRafToken),n.assistantRafToken=null;let e=n.currentAssistantEl;e&&_(e,n.currentAssistantText,n.pendingFinalAnswerToolText??void 0)}function A(){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 fe=null,Wr=80;function Fe(e){return e.scrollHeight-e.scrollTop-e.clientHeight<Wr}function Kr(){n.followMessages=Fe(l.messages)}l.messages.addEventListener("scroll",Kr);function Ks(){return n.followMessages||Fe(l.messages)}function E(e,t=!1){if(n.replayTarget)return n.replayTarget.appendChild(e),e;let s=t||Ks();return l.messages.appendChild(e),C(s),e}function js(){Q(),fe=document.createElement("div"),fe.id="waiting",fe.innerHTML='<span class="cursor">\u258C</span>',E(fe,!0)}function Q(){fe&&(fe.remove(),fe=null)}var tn=!1,wt=!1;function nn(e){let t=l.messages;if(e||n.followMessages){t.clientHeight,t.scrollTop=t.scrollHeight,n.followMessages=!0;return}n.followMessages=Fe(t)}function jr(e){if(!(e||n.followMessages)){n.followMessages=Fe(l.messages);return}nn(!0),!(typeof requestAnimationFrame!="function"||wt)&&(wt=!0,requestAnimationFrame(()=>{if(!n.followMessages){wt=!1;return}nn(!0),requestAnimationFrame(()=>{wt=!1,n.followMessages&&nn(!0)})}))}function Gs(e){let t=Ks();e(),t&&jr(!0)}function C(e){let t=l.messages;if(e||n.followMessages){typeof requestAnimationFrame=="function"?tn||(tn=!0,requestAnimationFrame(()=>{tn=!1,t.scrollTop=t.scrollHeight})):t.scrollTop=t.scrollHeight,n.followMessages=!0;return}n.followMessages=Fe(t)}function N(e){if(e==null||e==="")return"";let t;if(typeof e=="number")t=new Date(e);else{let i=String(e);t=new Date(i.endsWith("Z")||/[+-]\d{2}:?\d{2}$/.test(i)?i:i+"Z")}if(isNaN(t.getTime()))return"";let s=i=>String(i).padStart(2,"0");return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}`}function zs(e,t=!1){let s=document.createElement("div");return s.className="bash-block",s.innerHTML=`<span class="bash-cmd${t?" running":""}">${U(e)}</span><div class="bash-output"></div>`,s.querySelector(".bash-cmd").addEventListener("click",()=>{let i=s.querySelector(".bash-output");i.style.display==="none"?i.style.display="block":i.classList.contains("has-content")&&(i.style.display="none")}),E(s),t&&(n.currentBashEl=s),s}function St(e,t,s){if(!e)return;let i=e.querySelector(".bash-cmd");i.classList.remove("running");let r="";if(s?r=`[signal: ${s}]`:t!==0&&t!=null&&(r=`[exit: ${t}]`),r){let o=document.createElement("span");o.className=`bash-exit ${t===0?"ok":"fail"}`,o.textContent=r,i.after(o)}e===n.currentBashEl&&(n.currentBashEl=null)}function sn(e,t){let s=e.replace(/^\s+/,"");if(s==="")return{node:t,pathPrefix:"",tailQuery:""};let i=/\s$/.test(s),r=s.split(/\s+/).filter(m=>m.length>0),o=i?r:r.slice(0,-1),c=i?"":r[r.length-1]??"",u=t,d="",p=0;for(let m of o){let g=u.children?.find(y=>y.name===m);if(!g)break;d=d?`${d} ${g.name}`:g.name,u=g,p++}let h=o.slice(p);c&&h.push(c);let f=h.join(" ");return{node:u,pathPrefix:d,tailQuery:f}}function Ys(e,t,s){let i=[],r=t.trim().toLowerCase(),o=[];if(e.children){let m=e.name==="<root>"?[...e.children].sort((g,y)=>g.name.localeCompare(y.name)):e.children;for(let g of m){if(r&&!g.name.toLowerCase().includes(r))continue;let D=(g.children?.length??0)>0||g.fetch||g.freeform;o.push({spec:{primary:g.name,secondary:g.desc},prefix:D?"\u203A":"",kind:"subcommand",node:g})}}i.push(...o);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 g=(r?s.filter(y=>e.matches?e.matches(y,r):e.toSpec(y).primary.toLowerCase().includes(r)):s).map(y=>e.toSpec(y));g.length===0?u="no-match":(u="ok",c=g)}}let p=null;if(e.freeform){let m=t.trim();if(!(m.length>0&&c.some(y=>y.primary.toLowerCase()===m.toLowerCase()))){let y=e.freeform(t);y&&(p={spec:y,prefix:"\u21B5",kind:"freeform"},i.push(p))}}if(p&&(u==="empty"||u==="no-match")&&(u="none"),(o.length>0||p!==null)&&u!=="none"&&i.push({spec:{primary:""},prefix:"",kind:"separator"}),u==="loading")i.push({spec:{primary:"(loading...)"},prefix:"",kind:"placeholder"});else if(u==="error")i.push({spec:{primary:`(${d||"error"})`},prefix:"",kind:"placeholder"});else if(u==="empty")i.push({spec:{primary:"(none)"},prefix:"",kind:"placeholder"});else if(u==="no-match")i.push({spec:{primary:"(no match)"},prefix:"",kind:"placeholder"});else if(u==="ok")for(let m of c)i.push({spec:m,prefix:m.current?"*":"",kind:"data"});return i}function Js(e,t,s){let i=document.createElement("div");i.className="slash-item"+(t?" selected":"");let r=e.path!==void 0,o=document.createElement("div");o.className="slash-row-l1";let c=document.createElement("span");c.className="slash-prefix",c.textContent=s,o.appendChild(c);let u=document.createElement("span");if(u.className="slash-primary"+(e.current?" slash-current":""),u.textContent=e.primary,o.appendChild(u),e.secondary!==void 0){let d=document.createElement("span");d.className="slash-secondary",d.textContent=e.secondary,o.appendChild(d)}if(i.appendChild(o),r){let d=document.createElement("div");d.className="slash-row-l2";let p=document.createElement("span");if(p.className="slash-path",p.textContent=e.path,d.appendChild(p),e.pathSecondary!==void 0){let h=document.createElement("span");h.className="slash-path-secondary",h.textContent=e.pathSecondary,d.appendChild(h)}i.appendChild(d)}return i}var on={debug:0,info:1,warn:2,error:3,off:99},Ue=new Set(["off","debug","info","warn","error"]),Xs=4096;function Qs(e){try{let t=new WeakSet,s=JSON.stringify(e,(i,r)=>{if(r instanceof Error)return{name:r.name,message:r.message,stack:r.stack};if(typeof r=="function")return`[Function ${r.name??"anonymous"}]`;if(typeof r=="bigint")return r.toString()+"n";if(typeof r=="symbol")return r.toString();if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r});return typeof s!="string"?String(e):s.length>Xs?s.slice(0,Xs)+`\u2026(truncated, ${s.length} bytes)`:s}catch{try{return String(e)}catch{return"[unserializable]"}}}function rn(e){return e<10?"0"+e:String(e)}function Gr(e){return e<10?"00"+e:e<100?"0"+e:String(e)}function Zs(e){let t=new Date(e);return`${rn(t.getHours())}:${rn(t.getMinutes())}:${rn(t.getSeconds())}.${Gr(t.getMilliseconds())}`}var ln="off",ei="default",ti,an=null;function bt(e,t="runtime"){Ue.has(e)&&(ln=e,ei=t)}function cn(){return ln}function ni(){return ei}function Tt(e){ti=e;let t=ri(e);bt(t.level,t.source)}function si(e){an=e}function ii(e){try{let s=new URL(e).searchParams.get("debug");return s===null||!Ue.has(s)?null:s}catch{return null}}function zr(){return typeof location>"u"?null:ii(location.href)}function Yr(){if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(nt);return!e||!Ue.has(e)?null:e}catch{return null}}function ri(e,t=typeof location>"u"?null:location.href){let s=t?ii(t):null;if(s)return{level:s,source:"url"};let i=Yr();return i?{level:i,source:"local"}:e&&Ue.has(e)?{level:e,source:"config"}:{level:"off",source:"default"}}function oi(e){typeof localStorage<"u"&&localStorage.setItem(nt,e);let t={level:e,source:"local"};return bt(e,"local"),t}function ai(){typeof localStorage<"u"&&localStorage.removeItem(nt);let e=ri(ti);return bt(e.level,e.source),e}function li(e){let t=(s,i,r)=>{if(on[s]<on[ln])return;let o=e?`[${e}] `:"";try{let c=console[s];r!==void 0?c(o+i,r):c(o+i)}catch{}if(an)try{let c=Zs(Date.now()),u=e?` [${e}]`:"",d=r!==void 0?" "+Qs(r):"";an(`${c}${u} ${s.toUpperCase()} ${i}${d}`)}catch{}};return{debug:(s,i)=>{t("debug",s,i)},info:(s,i)=>{t("info",s,i)},warn:(s,i)=>{t("warn",s,i)},error:(s,i)=>{t("error",s,i)},scope:s=>li(e?`${e}.${s}`:s)}}var b=li();{let e=zr();e&&bt(e)}if(typeof window<"u"){let e=b.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})})}var re=null,Z=!1,Ve=!1;function un(){if(l.planPanel.replaceChildren(),!re||Z){l.planPanel.hidden=!0,l.planPanel.open=!1;return}let e=Qn(re,{className:"plan-panel-content",open:!0});l.planPanel.append(...e.childNodes),l.planPanel.hidden=!1,l.planPanel.open=Ve}function Jr(e){if(e.length===0||e.every(t=>t.status==="completed")){dn();return}re||(Z=!1),re=e,un()}function dn(){re=null,Z=!1,Ve=!1,un()}function Et(e){return re?(e==="show"?Z=!1:e==="hide"?(Z=!0,Ve=!1):(Z=!Z,Z&&(Ve=!1)),un(),!0):!1}function ci(){return re!==null}function ui(){return re!==null&&!Z}l.planPanel.addEventListener("click",e=>{let t=e.target;!(t instanceof HTMLElement)||!t.closest(".plan-summary")||(Ve=!l.planPanel.open)});De(dn);Ps(e=>{e?Jr(e):dn()});var kt=class{entries=new Map;ttlMs;maxIds;maxEntryBytes;maxTotalBytes;now;totalBytes=0;constructor(t={}){this.ttlMs=t.ttlMs??6e4,this.maxIds=t.maxIds??64,this.maxEntryBytes=t.maxEntryBytes??256*1024,this.maxTotalBytes=t.maxTotalBytes??2*1024*1024,this.now=t.now??(()=>performance.now())}put(t,s){let i=this.now();this.prune(i);let r=this.entries.get(t.id),o=!r||s===void 0||r.sequence===null||s>=r.sequence,c=r?o?{...r.update,...t}:{...t,...r.update}:t,u=o?s??r?.sequence??null:r.sequence;this.drop(t.id);let d=this.serializedBytes(c);if(!(d===null||d>this.maxEntryBytes)){for(;this.entries.size>=this.maxIds||this.totalBytes+d>this.maxTotalBytes;){let p=this.entries.keys().next();if(p.done)break;this.drop(p.value)}this.entries.set(t.id,{update:c,sequence:u,expiresAt:i+this.ttlMs,bytes:d}),this.totalBytes+=d}}take(t){this.prune(this.now());let s=this.entries.get(t);return s?(this.drop(t),s.update):null}clear(){this.entries.clear(),this.totalBytes=0}prune(t){for(let[s,i]of this.entries)i.expiresAt<=t&&this.drop(s)}drop(t){let s=this.entries.get(t);s&&(this.totalBytes-=s.bytes,this.entries.delete(t))}serializedBytes(t){try{return new TextEncoder().encode(JSON.stringify(t)).byteLength}catch{return null}}};var Me=new kt;Hs(()=>{Pt++,oe++,n.replayInProgress=!1,n.replayQueue=[]});qs(e=>{typeof e.id=="string"&&V({type:"session_created",sessionId:e.id,cwd:typeof e.cwd=="string"?e.cwd:void 0,cwdDisplay:typeof e.cwdDisplay=="string"?e.cwdDisplay:void 0,title:typeof e.title=="string"?e.title:null,configOptions:Array.isArray(e.configOptions)?e.configOptions:[],agentCommands:e.agentCommands&&typeof e.agentCommands=="object"?e.agentCommands:void 0,clientOpId:typeof e.clientOpId=="string"?e.clientOpId:void 0})});async function H(e,t){n.sessionSwitchGen++;let s=n.sessionSwitchGen;try{let i=await rt();if(s!==n.sessionSwitchGen)return;let r=i.find(o=>o.id!==e);if(r){x(),n.sessionId=r.id,Le(r.id);let[o,c]=await Promise.all([de(r.id),Ke(r.id)]);if(s!==n.sessionSwitchGen)return;let u=await X(r.id,()=>s===n.sessionSwitchGen);if(s!==n.sessionSwitchGen)return;if(!u)throw new Error("Failed to hydrate fallback session");V({type:"session_created",sessionId:o.id,cwd:o.cwd,cwdDisplay:o.cwdDisplay,title:o.title,configOptions:o.configOptions}),c&&C(!0);return}}catch{}s===n.sessionSwitchGen&&(x(),n.sessionId=null,xe())}function fn(e){return n.replayTarget?.querySelector(`[id="${e}"]`)??document.getElementById(e)}function Xr(e){return n.replayTarget?.querySelector(e)??document.querySelector(e)}function vi(e){e.querySelectorAll(".plan[open]").forEach(t=>{t.open=!1})}function di(e){(typeof navigator<"u"?navigator.serviceWorker:void 0)?.controller?.postMessage({type:"close-notification",tag:e})}function Qr(){if(typeof Notification>"u"||n.replayInProgress)return;let e=Notification.permission;if(e!=="granted"){if(e==="denied"){if(localStorage.getItem(Gt))return;localStorage.setItem(Gt,"1"),a("tip: notifications are blocked \u2014 allow in browser site settings to enable");return}localStorage.getItem(jt)||(localStorage.setItem(jt,"1"),a("tip: use /notify to enable background notifications"))}}function It(){Xn(n.pendingPromptDone,n.pendingToolCallIds.size,n.pendingPermissionRequestIds.size)&&(Q(),A(),M(),n.busyKind!=="bash"&&S(!1),n.pendingPromptDone=!1,Qr())}function Zr(){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 i=t.querySelector(".title")?.textContent??"\u26BF";t.innerHTML=`<span class="dim">${U(i)} \u2014 cancelled</span>`}n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear()}function Si(e){switch(e){case"cancelled":return"Generation cancelled.";case"max_tokens":return"Response stopped after reaching the token limit.";case"max_turn_requests":return"Agent stopped after reaching the turn request limit.";case"refusal":return"Agent refused to continue. This prompt will not be included in the next turn.";case"end_turn":case void 0:case null:return null;default:return`Agent stopped: ${String(e)}.`}}function eo(){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()}function Ne(){if(!(n.busy&&n.busyKind==="agent")){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()}}Os(Ne);var bi=200;async function Ke(e){Ii();let t=++oe;n.replayInProgress=!0,n.replayQueue=[];try{let s=await ue(async d=>{let p=await fetch(`/api/v1/sessions/${e}/events?limit=${bi}`,d?{signal:d}:void 0);return p.ok?await p.json():null});if(!s||t!==oe)return!1;let{events:i,streaming:r,hasMore:o}=tt(s),c=document.createDocumentFragment(),u=yn(i,!0);n.replayTarget=c;for(let d=0;d<i.length;d++){let p=JSON.parse(i[d].data);wn(i[d].type,p,i,d,u)}return vn(u,i),n.replayTarget=null,l.messages.style.display="none",l.messages.appendChild(c),l.messages.style.display="",i.length&&(n.lastEventSeq=i[i.length-1].seq,n.oldestLoadedSeq=i[0].seq),n.hasMoreHistory=o===!0,n.hasMoreHistory&&co(),Ti(),mn(i,r),!0}catch{return!1}finally{t===oe&&(n.replayTarget=null,n.replayInProgress=!1,_i(e))}}function mn(e,t){if(n.assistantRafToken!=null&&b.warn("primeStreamingState: assistantRafToken non-null at entry (missing flush upstream)"),t.thinking){let i;if(e.length){if(s(e,"thinking")>s(e,"user_message")){let r=l.messages.querySelectorAll(".thinking");i=r[r.length-1]}}else{let r=l.messages.querySelectorAll(".thinking");i=r[r.length-1]}if(i){n.currentThinkingEl=i,n.currentThinkingText=i.getAttribute("data-raw")??"",i.setAttribute("data-primed","");let r=i.querySelector("summary");r&&(r.textContent="\u283F thinking...",r.classList.add("active"))}}if(t.assistant){let i;if(e.length){if(s(e,"assistant_message")>s(e,"user_message")){let r=l.messages.querySelectorAll(".msg.assistant");i=r[r.length-1]}}else{let r=l.messages.querySelectorAll(".msg.assistant");i=r[r.length-1]}i&&(n.currentAssistantEl=i,n.currentAssistantText=i.getAttribute("data-raw")??"",i.setAttribute("data-primed",""))}function s(i,r){for(let o=i.length-1;o>=0;o--)if(i[o].type===r)return o;return-1}}function pi(e){if(!e||e.parentNode===l.messages)return;let t=e.dataset.optimisticOpId;t&&Array.from(l.messages.querySelectorAll(".msg.user[data-client-op-id]")).some(i=>i.dataset.clientOpId===t)||l.messages.appendChild(e)}function Ti(){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 Pe=new Map,xt=!1,Ae=!1,We=null,Ct=0,Ei=Promise.resolve();function ki(e){if(n.sessionId!==e)return;if(xt){Ae=!0,We=e;return}xt=!0,We=e;let t=Ct;Ei=(async()=>{do{Ae=!1;let s=Pe.has(e);await he(e,{preserveLiveOnEmpty:!0}),s&&(Ae=!0)}while(t===Ct&&Ae&&We===n.sessionId)})().finally(()=>{t===Ct&&(xt=!1,Ae=!1,We=null)})}function he(e,t={}){let s=Pe.get(e);if(s)return t.preserveLiveOnEmpty&&(s.preserveLiveOnEmpty=!0),s.promise;let i={promise:Promise.resolve(!1),preserveLiveOnEmpty:t.preserveLiveOnEmpty===!0},r=to(e,i);return i.promise=r,Pe.set(e,i),r.finally(()=>{Pe.get(e)===i&&Pe.delete(e)}).catch(()=>{}),r}async function to(e,t){let s=++oe;n.replayInProgress=!0,n.replayQueue=[],Ws();try{let i=`/api/v1/sessions/${e}/events?after=${n.lastEventSeq}`,r=await ue(async g=>{let y=await fetch(i,g?{signal:g}:void 0);return y.ok?await y.json():null});if(!r||s!==oe||n.sessionId&&n.sessionId!==e)return!1;let{events:o,streaming:c}=tt(r);if(t.preserveLiveOnEmpty&&o.length===0)return!0;for(let g of l.messages.querySelectorAll("[data-primed]")){let y=g.getAttribute("data-raw")??"";if(g.removeAttribute("data-primed"),g.classList.contains("msg")&&g.classList.contains("assistant"))z(g),g.replaceChildren(),_(g,y,void 0,!0),R(g);else if(g.classList.contains("thinking")){let D=g.querySelector(".thinking-content");D&&(D.textContent=y);let F=g.querySelector("summary");F&&(F.textContent="\u283F thought",F.classList.remove("active"),F.style.animation="none")}}let u=null;if(n.awaitingOwnUserEcho&&n.sentMessageOpId)for(let g of l.messages.querySelectorAll("[data-optimistic-op-id]"))g.dataset.optimisticOpId===n.sentMessageOpId&&(u=g);let d=l.messages.querySelector("[data-sync-boundary]");if(d)for(;d.nextElementSibling;)d.nextElementSibling.remove();if(n.currentAssistantEl&&z(n.currentAssistantEl),n.currentAssistantEl=null,n.currentAssistantText="",n.pendingFinalAnswerToolText=null,n.currentThinkingEl=null,n.currentThinkingText="",n.currentBashEl=null,o.length===0)return mn(o,c),pi(u),!0;!d&&n.lastEventSeq===0&&l.messages.replaceChildren();let p=document.createDocumentFragment(),h=yn(o,!0);n.replayTarget=p;for(let g=0;g<o.length;g++){let y=JSON.parse(o[g].data);wn(o[g].type,y,o,g,h)}vn(h,o),n.replayTarget=null;let f=l.messages.lastElementChild,m=p.firstElementChild;if(f&&m&&Ri(f,m)){if(f.classList.contains("msg")&&f.classList.contains("assistant")&&m.classList.contains("msg")&&m.classList.contains("assistant")){let g=f.getAttribute("data-raw")??"",y=m.getAttribute("data-raw")??"",D=g+y;f.setAttribute("data-raw",D),z(f),f.replaceChildren(),_(f,D,void 0,!0),R(f);let F=m.dataset.lastEventSeq;F?f.dataset.lastEventSeq=F:delete f.dataset.lastEventSeq,m.remove()}else if(f.classList.contains("thinking")&&m.classList.contains("thinking")){let g=f.getAttribute("data-raw")??"",y=m.getAttribute("data-raw")??"",D=g+y;f.setAttribute("data-raw",D);let F=f.querySelector(".thinking-content");F&&(F.textContent=D);let jn=m.dataset.lastEventSeq;jn?f.dataset.lastEventSeq=jn:delete f.dataset.lastEventSeq,m.remove()}}return l.messages.appendChild(p),n.lastEventSeq=o[o.length-1].seq,Ti(),mn(o,c),pi(u),!0}catch{return!1}finally{s===oe&&(n.replayTarget=null,n.replayInProgress=!1,_i(e))}}var ge=null,Pt=0,oe=0;function Ii(){Pt++}function gn(e,t){return t===Pt&&n.sessionId===e}function Lt(){return typeof requestAnimationFrame!="function"?Promise.resolve():new Promise(e=>requestAnimationFrame(()=>{e()}))}function xi(e){let t=e.getBoundingClientRect();for(let i of Array.from(e.children)){if(!(i instanceof HTMLElement)||i.id==="history-sentinel"||i.id==="history-loading")continue;let r=i.getBoundingClientRect();if(r.bottom>=t.top&&r.top<=t.bottom)return{el:i,top:r.top}}let s=Array.from(e.children).find(i=>i instanceof HTMLElement&&i.id!=="history-sentinel"&&i.id!=="history-loading");return s?{el:s,top:s.getBoundingClientRect().top}:null}function Ci(e,t){if(!t?.el.isConnected)return 0;let s=Li(t);return s!==0&&(e.scrollTop+=s),s}function Li(e){return e?.el.isConnected?e.el.getBoundingClientRect().top-e.top:0}function no(e,t){let s=Math.abs(t);return s<=4||s>e.clientHeight}function Ai(e,t){let s=xi(e);return t(),Ci(e,s)}function so(e,t,s){let i=t.lastElementChild,r=Array.from(e.children).find(o=>o.id!=="history-sentinel"&&o.id!=="history-loading"&&!o.classList.contains("history-loading"));if(!i||!r||r.hasAttribute("data-primed")||r===n.currentAssistantEl||r===n.currentThinkingEl)return{anchor:s,scrollHeightBefore:null};if(s?.el===r){let o=r.nextElementSibling;if(!o){let u=e.scrollHeight;return pn(i,r)?{anchor:null,scrollHeightBefore:u}:{anchor:s,scrollHeightBefore:null}}let c={el:o,top:o.getBoundingClientRect().top};return pn(i,r)?{anchor:c,scrollHeightBefore:null}:{anchor:s,scrollHeightBefore:null}}return pn(i,r),{anchor:s,scrollHeightBefore:null}}async function io(e){if(!(e.scrollTop>=0)){for(let t=1;t<=20;t++)if(await Lt(),e.scrollTop>=0){await Lt();return}e.scrollTop=0,await Lt()}}async function ro(e,t){for(let s=1;s<=8;s++){await Lt();let i=Li(t);if(i!==0){if(!no(e,i))return;e.scrollTop+=i}}}function Mt(){ge&&(ge.disconnect(),ge=null)}function Nt(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(Mt(),ge=new IntersectionObserver(t=>{t[0].isIntersecting&&!n.loadingOlderEvents&&n.hasMoreHistory&&n.sessionId&&fo(n.sessionId)},{root:l.messages,rootMargin:"200px 0px 0px 0px"}),ge.observe(e))}function oo(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(Mt(),ge=new IntersectionObserver(t=>{t[0].isIntersecting||Nt()},{root:l.messages,rootMargin:"200px 0px 0px 0px"}),ge.observe(e))}function ao(e=l.messages){document.getElementById("history-loading")||Ai(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 hn(e=l.messages){let t=document.getElementById("history-loading");t&&Ai(e,()=>{t.remove()})}function lo(e,t){!n.hasMoreHistory||n.sessionId!==e||(t?Nt():oo())}function co(){At();let e=document.createElement("div");e.id="history-sentinel",e.className="history-sentinel",e.setAttribute("aria-hidden","true"),l.messages.prepend(e),Nt()}function uo(){!n.hasMoreHistory||!document.getElementById("history-sentinel")||Nt()}function At({invalidateLoads:e=!0}={}){e&&Ii(),Mt(),hn(),document.getElementById("history-sentinel")?.remove()}async function po(e,t){let s=await ue(async o=>{let c=await fetch(`/api/v1/sessions/${e}/events?limit=${bi}&before=${n.oldestLoadedSeq}`,o?{signal:o}:void 0);return c.ok?await c.json():null});if(!gn(e,t)||!s)return null;let{events:i,hasMore:r}=tt(s);return{events:i,hasMore:r}}De(At);De(()=>{oe++,Pe.clear(),Ct++,xt=!1,Ae=!1,We=null,Ei=Promise.resolve(),Me.clear()});async function fo(e){if(n.loadingOlderEvents||!n.hasMoreHistory||n.oldestLoadedSeq<=0)return!1;n.loadingOlderEvents=!0;let t=++Pt;Mt();let s=l.messages,i=!1;ao(s);try{let r=await po(e,t);if(!r)return!1;let{events:o,hasMore:c}=r;if(await io(s),!gn(e,t))return!1;if(o.length===0)return n.hasMoreHistory=!1,At({invalidateLoads:!1}),!0;let u=document.createDocumentFragment(),d=yn(o,!1);n.replayTarget=u;for(let m=0;m<o.length;m++){let g=JSON.parse(o[m].data);wn(o[m].type,g,o,m,d)}vn(d,o),n.replayTarget=null;let p=xi(s);hn(s);let h=so(s,u,p);p=h.anchor;let f=document.getElementById("history-sentinel");return f?f.after(u):s.prepend(u),h.scrollHeightBefore===null?Ci(s,p):s.scrollTop+=s.scrollHeight-h.scrollHeightBefore,n.oldestLoadedSeq=o[0].seq,n.hasMoreHistory=c===!0,n.hasMoreHistory||At({invalidateLoads:!1}),await ro(s,p),i=!0,!0}catch{return!1}finally{gn(e,t)&&(hn(s),n.loadingOlderEvents=!1,lo(e,i))}}function yn(e,t){let s=new Set;for(let i of e)if(i.type==="permission_response"){let r=JSON.parse(i.data);s.add(r.requestId)}return{toolCalls:new Map,permissions:new Map,resolvedPermissions:s,currentBashEl:null,trackPending:t}}function Pi(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,i=e.title?` \xB7 ${U(e.title)}`:"";t.innerHTML=`<summary>\u2709\uFE0E ${U(s)}${i}</summary><div class="message-content"></div>`;let r=t.querySelector(".message-content");r&&le(r,e.body),E(t),r&&R(r)}function wn(e,t,s,i,r){let o=t;if(es(e)){mo(e,o,s,i,r);return}switch(e){case"prompt_done":{let c=Si(o.stopReason);c&&a(c);break}case"error":a(`err: ${typeof o.message=="string"?o.message:"Unknown agent error"}`);break;case"message":Pi(o);break}}function me(){return{findToolCallEl:e=>document.getElementById(`tc-${e}`),findPermissionEl:e=>document.querySelector(`.permission[data-request-id="${e}"]`),findBashEl:()=>n.currentBashEl,enhanceMarkdown:R,finalAnswerToolText:n.pendingFinalAnswerToolText}}function Mi(e,t,s){let i=null,r=s>0?t[s-1]:null;if(r?.type==="tool_call_update"){let o=JSON.parse(r.data);i=Kt(o.status??"",o.content)}return{findToolCallEl:o=>e?e.toolCalls.get(o)??null:fn(`tc-${o}`),findPermissionEl:o=>e?e.permissions.get(o)??null:Xr(`.permission[data-request-id="${o}"]`),findBashEl:()=>e?e.currentBashEl:fn("bash-replay-pending"),isPermissionResolved:o=>e?e.resolvedPermissions.has(o):t.slice(s+1).some(c=>{let u=JSON.parse(c.data);return c.type==="permission_response"&&u.requestId===o}),enhanceMarkdown:R,finalAnswerToolText:i}}function Ni(e,t,s,i){e.querySelectorAll("button").forEach(o=>{let c=o.dataset.optionId??"",u=o.dataset.optionKind??"",d=o.textContent||"";o.onclick=()=>{Jn(u).apiAction==="deny"?hs(n.sessionId,t).catch(()=>{}):gs(n.sessionId,t,c).catch(()=>{}),e.innerHTML=`<span class="dim">\u26BF ${U(s)} \u2014 ${U(d)}</span>`,i?.()}})}function fi(e,t){t&&(e.dataset.firstEventSeq=String(t.seq),e.dataset.lastEventSeq=String(t.seq))}function mi(e,t){t&&(e.dataset.lastEventSeq=String(t.seq))}function gi(e,t,s){if(t<=0||t>=e.length)return!1;let i=e[t-1],r=e[t];return i.type===s&&r.seq===i.seq+1}function Ri(e,t){let s=hi(e.dataset.lastEventSeq),i=hi(t.dataset.firstEventSeq);return s!==null&&i!==null&&i===s+1}function hi(e){if(!e||!/^[1-9]\d*$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function pn(e,t){if(!Ri(e,t))return!1;if(e.classList.contains("msg")&&e.classList.contains("assistant")&&t.classList.contains("msg")&&t.classList.contains("assistant")){let i=(e.getAttribute("data-raw")??"")+(t.getAttribute("data-raw")??"");ts(t,e),t.setAttribute("data-raw",i),z(t),t.replaceChildren(),_(t,i,void 0,!0),R(t)}else if(e.classList.contains("thinking")&&t.classList.contains("thinking")){let i=(e.getAttribute("data-raw")??"")+(t.getAttribute("data-raw")??"");t.setAttribute("data-raw",i);let r=t.querySelector(".thinking-content");r&&(r.textContent=i)}else return!1;let s=e.dataset.firstEventSeq;return s?t.dataset.firstEventSeq=s:delete t.dataset.firstEventSeq,e.remove(),!0}function mo(e,t,s,i,r){let o=Mi(r,s,i);switch(e){case"assistant_message":{let u=(n.replayTarget??l.messages).lastElementChild,d=t.text??"";if(gi(s,i,"assistant_message")&&u?.classList.contains("msg")&&u.classList.contains("assistant")){let f=(u.getAttribute("data-raw")??"")+d;u.setAttribute("data-raw",f),z(u),u.replaceChildren(),_(u,f,void 0,!0),R(u),mi(u,s[i]);break}let p=T(e,t,o);p&&(fi(p,s[i]),E(p));break}case"thinking":{let u=(n.replayTarget??l.messages).lastElementChild,d=t.text??"";if(gi(s,i,"thinking")&&u?.classList.contains("thinking")){let h=u.querySelector(".thinking-content");if(h){let m=(u.getAttribute("data-raw")??"")+d;u.setAttribute("data-raw",m),h.textContent=m,mi(u,s[i]);break}}let p=T(e,t,o);p&&(fi(p,s[i]),E(p));break}case"tool_call":{let c=t.id,u=T(e,t,o);if(u)if(E(u),r)r.toolCalls.set(c,u),r.trackPending&&n.pendingToolCallIds.add(c);else{let d=Me.take(c);d&&T("tool_call_update",d,o)}break}case"tool_call_update":{let c=t.id;if(o.findToolCallEl(c))T(e,t,o);else{let u=s[i];Me.put({...t,type:"tool_call_update",sessionId:u.session_id},u.seq)}(t.status==="completed"||t.status==="failed")&&n.pendingToolCallIds.delete(c);break}case"permission_request":{let c=t.requestId,u=t.title??"",d=T(e,t,o);d&&((o.isPermissionResolved?.(c)??!1)||Ni(d,c,u),E(d),r&&r.permissions.set(c,d));break}case"bash_command":{let c=T(e,t,o);c&&(r?r.currentBashEl=c:c.id="bash-replay-pending",E(c));break}case"bash_result":{let c=r?r.currentBashEl:fn("bash-replay-pending");c&&!r&&c.removeAttribute("id"),T(e,t,o),r&&(r.currentBashEl=null);break}case"user_message":case"plan":case"permission_response":{e==="user_message"&&n.awaitingOwnUserEcho&&s[i]?.session_id===n.sentMessageForSession&&t.clientOpId===n.sentMessageOpId&&(n.replayedOwnUserEcho=!0);let c=T(e,t,o);c&&(e==="plan"&&vi(n.replayTarget??l.messages),E(c));break}}}function _i(e){let t=n.replayQueue;n.replayQueue=[];for(let s of t){if(go(s,e)){s.type==="user_message"&&!(n.sentMessageForSession===s.sessionId&&n.sentMessageOpId===s.clientOpId)&&(n.newTurnStarted=!0,n.turnEnded=!1,n.busyKind!=="bash"&&S(!0));continue}V(s)}if(n.awaitingOwnUserEcho&&n.replayedOwnUserEcho){let s=n.reconcileAfterOwnUserEcho;n.awaitingOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,s&&ki(e)}n.replayedOwnUserEcho=!1}function go(e,t){if("sessionId"in e&&e.sessionId!==t)return!1;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"user_message":return typeof e.clientOpId=="string"&&Array.from(document.querySelectorAll(".msg.user[data-client-op-id]")).some(s=>s.dataset.clientOpId===e.clientOpId);case"thought_chunk":return!!n.currentThinkingEl;case"message_chunk":return!!n.currentAssistantEl;default:return!1}}function yi(){let e=n.currentAssistantEl;if(!e)return;let t=performance.now();_(e,n.currentAssistantText,n.pendingFinalAnswerToolText??void 0);let s=performance.now(),i=s-t;if(i>8){let o=Zn(),c=d=>Math.round(d*10)/10,u={ms:c(i),len:n.currentAssistantText.length,seq:o.seq,blocks:o.blocks,hits:o.hits,misses:o.misses,fastPath:o.fastPath,lex:{total:c(o.lex),prefix:c(o.lexPrefix),tail:c(o.lexTail),prefixBlocks:o.prefixBlocks,prefixLen:o.prefixLen,tailLen:o.tailLen,mathRelex:o.mathRelex,mathRelexLen:o.mathRelexLen,tailBlocks:o.tailBlocks,tailRawBlocks:o.tailRawBlocks},parse:c(o.parse),sanitize:c(o.sanitize),dom:c(o.dom),subList:o.subList,subTable:o.subTable,defsAbsorbed:o.defsAbsorbed,linkMemoSize:o.linkMemoSize,missDetails:o.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}:{}}))};i>16?b.warn("md-render budget",u):b.debug("md-render slow",u)}C();let r=performance.now();try{performance.measure("doAssistantRender",{start:t,end:r}),performance.measure("scrollToBottom",{start:s,end:r})}catch{}}function ho(){if(n.assistantRafToken==null){if(typeof requestAnimationFrame!="function"){yi();return}n.assistantRafToken=requestAnimationFrame(()=>{n.assistantRafToken=null,yi()})}}function vn(e,t){let s=Mi(e,t,t.length);for(let i of e.toolCalls.keys()){let r=Me.take(i);r&&(T("tool_call_update",r,s),(r.status==="completed"||r.status==="failed")&&n.pendingToolCallIds.delete(i))}}function wi(e,t){(e.status==="completed"||e.status==="failed")&&n.pendingToolCallIds.delete(e.id),e.status==="completed"&&(n.pendingFinalAnswerToolText=Kt(e.status,e.content),n.currentAssistantEl&&n.pendingFinalAnswerToolText&&_(n.currentAssistantEl,n.currentAssistantText,n.pendingFinalAnswerToolText)),T("tool_call_update",e,t),It(),C()}function Rt(e){let t=n.pendingNavigationEvents.filter(s=>"sessionId"in s&&s.sessionId===e);n.pendingNavigationEvents=n.pendingNavigationEvents.filter(s=>!("sessionId"in s)||s.sessionId!==e);for(let s of t)V(s)}function V(e){if(e.type==="inbox_count_changed"){ft(e.pendingCount);return}if(n.replayInProgress){n.replayQueue.push(e);return}let t="sessionId"in e?e.sessionId:void 0;if(e.type==="state_patch"&&n.runtimeHydrationSessionId===e.sessionId){n.pendingNavigationEvents.push(e);return}if(t&&e.type!=="session_created"&&n.sessionId===null&&n.pendingNavigationSessionId===t){n.pendingNavigationEvents.push(e);return}let s="sessionId"in e?e.sessionId:void 0;if(!(s&&e.type!=="session_created"&&e.type!=="session_deleted"&&(!n.sessionId||s!==n.sessionId)))switch(e.type){case"connected":if(e.cancelTimeout!=null&&(n.cancelTimeout=e.cancelTimeout),e.recentPathsLimit!=null&&(n.recentPathsLimit=e.recentPathsLimit),Tt(e.debugLevel),n.agentReloading){n.agentReloading=!1;let i=e.agent.name,r=e.agent.version,o=i&&r?`${i} ${r}`:"Agent";a(`${o} reloaded.`),S(!1)}break;case"state_patch":{let i=n.cancelStatus,r=en({seq:e.seq,patch:e.patch});if(r&&i!=="unconfirmed"&&n.cancelStatus==="unconfirmed"&&a("Cancel was not acknowledged \u2014 retry ^C or use /reload to restart the agent."),!r&&n.sessionId===e.sessionId){let o=n.sessionId;Ns(o,()=>n.sessionId===o)}break}case"available_commands_update":mt({epoch:e.epoch??"",revision:e.revision??0,commands:e.commands})&&l.input.dispatchEvent(new window.Event("input",{bubbles:!0}));break;case"session_created":{let i=n.awaitingNewSession&&n.pendingNewSessionOpId===e.clientOpId;if(n.pendingNewSessionOpId&&!i||(i&&pe(e.clientOpId),n.pendingNavigationSessionId&&e.sessionId!==n.pendingNavigationSessionId)||!n.awaitingNewSession&&n.sessionId&&e.sessionId!==n.sessionId)break;n.awaitingNewSession=!1,n.pendingNavigationSessionId=null;let r=n.sessionId===null;n.sessionId=e.sessionId,r&&uo(),n.sessionCwd=e.cwd??n.sessionCwd,n.sessionCwdDisplay=e.cwdDisplay??e.cwd??n.sessionCwdDisplay,n.sessionTitle=e.title??null,e.agentCommands&&mt(e.agentCommands),e.configOptions&&e.configOptions.length&&Zt(e.configOptions),I(),B(),Le(n.sessionId),n.clientId&&ke(n.clientId,!document.hidden,n.sessionId).catch(()=>{}),yt(n.sessionId,n.sessionTitle),ie("connected","connected"),l.input.disabled=!1,l.sendBtn.disabled=!1;{let o=document.getElementById("bash-replay-pending");o?(o.removeAttribute("id"),o.querySelector(".bash-cmd")?.classList.add("running"),n.currentBashEl=o):n.currentBashEl=null}l.messages.children.length===0&&a(`Session created: ${n.sessionTitle??e.sessionId.slice(0,8)+"\u2026"}`),B();break}case"user_message":{if(n.sentMessageForSession===e.sessionId&&n.sentMessageOpId===e.clientOpId){let i=n.reconcileAfterOwnUserEcho;n.sentMessageForSession=null,n.sentMessageOpId=null,n.awaitingOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,i&&ki(e.sessionId);break}if(A(),M(),n.newTurnStarted=!0,n.turnEnded=!1,e.sessionId===n.sessionId){n.busyKind!=="bash"&&S(!0);let i=T("user_message",e,me());i&&E(i)}break}case"message_chunk":Q(),A(),n.currentAssistantEl||(n.currentAssistantEl=vt("assistant",""),n.currentAssistantText=""),n.currentAssistantText+=e.text,ho();break;case"thought_chunk":Q(),M(),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="",E(n.currentThinkingEl)),n.currentThinkingText+=e.text,n.currentThinkingEl.querySelector(".thinking-content").textContent=n.currentThinkingText,C();break;case"tool_call":{n.busy&&n.busyKind!=="bash"&&n.pendingToolCallIds.add(e.id),Q(),A(),M();let i=me(),r=T("tool_call",e,i);r&&E(r);let o=Me.take(e.id);o&&wi(o,i);break}case"tool_call_update":{let i=me();i.findToolCallEl(e.id)||(Me.put(e),b.debug("buffering tool update without host",{id:e.id,status:e.status})),wi(e,i);break}case"plan":{A(),M();let i=T("plan",e,me());i&&(vi(l.messages),E(i));break}case"permission_request":{if(n.turnEnded||document.querySelector(`.permission[data-request-id="${e.requestId}"]`))break;n.pendingPermissionRequestIds.add(e.requestId),S(!0),A();let i=T("permission_request",e,me());if(i){let r=e.requestId;Ni(i,r,e.title,()=>{n.pendingPermissionRequestIds.delete(r),It()}),E(i)}break}case"permission_response":{n.pendingPermissionRequestIds.delete(e.requestId),e.sessionId===n.sessionId&&T("permission_response",e,me()),It();break}case"bash_command":{if(n.sentBashForSession===e.sessionId){n.sentBashForSession=null;break}if(e.sessionId===n.sessionId){let i=T("bash_command",e,me());i&&(i.querySelector(".bash-cmd").classList.add("running"),E(i),n.currentBashEl=i),S(!0)}break}case"bash_output":{if(e.sessionId!==n.sessionId)break;if(n.currentBashEl){let i=n.currentBashEl.querySelector(".bash-output");if(!i)break;if(e.stream==="stderr"){let r=document.createElement("span");r.className="stderr",r.textContent=e.text,i.appendChild(r)}else i.appendChild(document.createTextNode(e.text));i.classList.add("has-content"),i.scrollTop=i.scrollHeight,C()}break}case"bash_done":{if(e.sessionId!==n.sessionId)break;St(n.currentBashEl,e.code,e.signal),e.error&&a(`err: ${e.error}`),n.busyKind!=="agent"&&S(!1);break}case"prompt_done":{if(Ce(),e.promptId&&n.currentPromptId&&e.promptId!==n.currentPromptId){b.warn("dropping completion from a superseded turn",{sessionId:e.sessionId,stopReason:e.stopReason,promptId:e.promptId,currentPromptId:n.currentPromptId}),A(),M();break}if(n.awaitingOwnUserEcho){b.warn("dropping stale prompt_done during own-echo window",{sessionId:e.sessionId,stopReason:e.stopReason}),n.reconcileAfterOwnUserEcho=!0;break}if(e.stopReason==="cancelled"&&!e.promptId&&n.newTurnStarted&&n.busy&&n.busyKind!=="bash"){n.newTurnStarted=!1,A(),M();break}n.newTurnStarted=!1,e.stopReason==="cancelled"?Zr():eo();let i=Si(e.stopReason);i&&a(i),n.turnEnded=!0,n.pendingPromptDone=!0,It();break}case"session_deleted":e.sessionId===n.sessionId&&H(e.sessionId,n.sessionCwd??void 0);break;case"session_expired":{H(n.sessionId,n.sessionCwd??void 0);break}case"config_set":{xs(e.configId,e.value);let i=O(e.configId),r=i?.name??e.configId,o=typeof e.value=="string"?i?.options.find(c=>c.value===e.value)?.name??e.value:String(e.value);a(`ok: ${r}: ${o}`),e.configId==="mode"&&I(),B();break}case"config_option_update":e.configOptions.length&&Zt(e.configOptions);break;case"session_title_updated":e.sessionId===n.sessionId&&(n.sessionTitle=e.title,yt(n.sessionId,n.sessionTitle));break;case"agent_reloading":n.agentReloading=!0,a("Agent reloading\u2026"),S(!0);break;case"agent_reloading_failed":a(`err: Agent reload failed: ${e.error}`),S(!1);break;case"error":if(e.promptId&&n.currentPromptId&&e.promptId!==n.currentPromptId){b.warn("dropping failure from a superseded turn",{sessionId:e.sessionId,message:e.message,promptId:e.promptId,currentPromptId:n.currentPromptId});break}if(n.awaitingOwnUserEcho){b.warn("dropping stale error during own-echo window",{sessionId:e.sessionId,message:e.message}),n.reconcileAfterOwnUserEcho=!0;break}n.awaitingNewSession=!1,n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,Q(),A(),M(),a(`err: ${e.message}`),n.busyKind!=="bash"&&S(!1);break;case"message_created":break;case"message_consumed":di(`msg-${e.messageId}`);break;case"message_acked":di(`msg-${e.messageId}`);break;case"message":e.sessionId===n.sessionId&&(Pi(e),C());break;default:break}}var qi="message",Oi=null;async function Re(e){if(n.messageNavigationGen++,n.sessionId===e)return"unchanged";n.sessionSwitchGen++;let t=n.sessionSwitchGen,s=n.sessionId;pe(),n.awaitingNewSession=!1,n.pendingNavigationSessionId=null,n.pendingNavigationEvents=[],Le(e),x(),n.sessionId=null,n.pendingNavigationSessionId=e;let i=()=>t===n.sessionSwitchGen&&n.pendingNavigationSessionId===e;try{let[r,o]=await Promise.all([de(e),Ke(e)]);if(!i())return"ignored";if(!await X(e,i)){if(!i())return"ignored";throw new Error("Failed to hydrate session snapshot")}return i()?(V({type:"session_created",sessionId:r.id,cwd:r.cwd,cwdDisplay:r.cwdDisplay,title:r.title,configOptions:r.configOptions}),Rt(e),o&&C(!0),"switched"):"ignored"}catch(r){throw i()&&(x(),n.sessionId=null,s&&Le(s)),r}}async function _t(e){let t=++n.messageNavigationGen,s=await vs(e,n.sessionId);return t!==n.messageNavigationGen?"ignored":(a(s.alreadyConsumed?`inbox: already consumed \u2192 switching to ${s.sessionId}`:`inbox: opened as ${s.sessionId}`),Re(s.sessionId))}async function Bi(e){return e.sessionId?Re(e.sessionId):e.messageId?_t(e.messageId):"ignored"}function Sn(){let e=new URL(location.href).searchParams.get(qi);return e&&e.length<=256?e:null}function $i(){let e=new URL(location.href);e.searchParams.delete(qi),history.replaceState(null,"",`${e.pathname}${e.search}${e.hash}`)}async function Hi(){let e=Sn();if(!e||Oi===e)return"ignored";Oi=e;try{let t=await _t(e);return $i(),t}catch(t){let s=t instanceof ce&&(t.status===w.BAD_REQUEST||t.status===w.NOT_FOUND);s&&($i(),n.sessionId||xe());let i=t instanceof Error?t.message:String(t);return a(`err: notification consume failed (${i})`),s?"terminal-error":"retryable-error"}}function Ot(){if(!n.sessionId){a("Nothing to cancel.");return}ht({force:!0}).then(e=>{a(e?.status==="idle"?"Nothing to cancel.":"^C cancelling\u2026")}).catch(e=>{a(`err: cancel failed \u2014 ${String(e)}`)})}async function je({cwd:e,showCwd:t=!1}={}){if(!n.sessionId){a("warn: No active session");return}let s=n.sessionId,i=e??n.sessionCwd??void 0;if(n.busy){a("err: Cancel active work before clearing the session");return}if(x(),a(t&&i?`Clearing session and starting at ${i}\u2026`:"Clearing session\u2026"),!await gt({cwd:i,inheritFromSessionId:s})){a("err: Failed to clear session");return}try{await Te(s)}catch(o){a(`err: Failed to delete previous session \u2014 ${String(o)}`)}}var Ge=b.scope("share");function yo(e,t){return e.startsWith("http")?e:e?`${location.origin}${e}`:`${location.origin}/s/${t}`}async function $t(){if(!n.sessionId){a("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 r=await t.text();t.status===w.CONFLICT?a("share: session busy (agent streaming) \u2014 retry after the response completes"):t.status===w.FORBIDDEN?a("share: forbidden (not owner)"):t.status===w.BAD_REQUEST&&r.includes("sanitize")?a(`share: \u2717 sanitize blocked this session \u2014 ${r}`):a(`share: create failed ${t.status} \u2014 ${r.slice(0,200)}`);return}let s=await t.json();n.previewToken=s.token,I();let i=s.reused?"reused":"ready";a(`share: preview ${i} \u2014 ^P publish \xB7 ^C cancel`)}catch(t){Ge.error("preview create error",{err:t}),a(`share: network error \u2014 ${String(t)}`)}}async function bn(){if(!n.sessionId){a("share: no active session");return}if(!n.previewToken){a("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===w.FORBIDDEN?a("share: forbidden (not owner)"):s.status===w.NOT_FOUND?a("share: token not found (already revoked?)"):a(`share: publish failed ${s.status} \u2014 ${u.slice(0,200)}`);return}let i=await s.json(),r=yo(i.public_url,i.token);n.previewToken=null,I();let o=a(`share: published
|
|
2
|
+
`),c=document.createElement("a");c.href=r,c.textContent=r,c.target="_blank",c.rel="noopener noreferrer",o.appendChild(c)}catch(s){Ge.error("publish error",{err:s}),a(`share: network error \u2014 ${String(s)}`)}}function Tn(){if(!n.previewToken){a("share: no preview active");return}n.previewToken=null,I(),a("share: preview canceled")}async function En(){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 qt(e){if(!e){a("share: usage \u2014 /share revoke <token>");return}try{let s=(await wo()).find(o=>o.token===e);if(!s){a("share: token not found (already revoked?)");return}let i=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(!i.ok){i.status===w.FORBIDDEN?a("share: forbidden (not owner)"):i.status===w.NOT_FOUND?a(`share: ${e} already revoked`):a(`share: revoke failed ${i.status}`);return}let r=await i.json();a(r.revoked?`share: revoked ${e}`:`share: ${e} already revoked`)}catch(t){Ge.error("revoke error",{err:t}),a(`share: network error \u2014 ${String(t)}`)}}async function wo(){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 ze(e){let t=`${location.origin}/s/${e}`;window.open(t,"_blank","noopener"),a(`share: opened ${t}`)}async function Di(){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 Ye(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 i=await t.text();a(`share: set author failed ${t.status} \u2014 ${i.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(i){Ge.warn("by: preview patch failed",{err:i})}a(s.value?`share: author set to '${s.value}'`:"share: author cleared (publish anonymously)")}catch(t){Ge.error("by error",{err:t}),a(`share: network error \u2014 ${String(t)}`)}}function Bt(e){return/^(?:~\\|[A-Za-z]:[\\/]|\\\\)/.test(e)?e.replace(/\\/g,"/"):e}function vo(e){return e.startsWith("/")||/^[A-Za-z]:\//.test(e)}function So(e,t){let s=Bt(e);return s==="/"?`/${t}`:`${s.replace(/\/+$/,"")}/${t}`}function Ht(e,t){let s=Bt(e.trim());if(s===""){if(!t)throw new Error("No active session cwd");return Bt(t)}if(s.startsWith("~")&&s!=="~"&&!s.startsWith("~/"))throw new Error("Unsupported ~user expansion");if(vo(s)||s.startsWith("~"))return s;if(!t)throw new Error("No active session cwd");return So(t,s)}function kn(e,t){if(e.trim()==="")return{directory:Ht("",t),filter:""};let s=Ht(e,t);if(s==="/"||s==="~"||s.endsWith("/"))return{directory:s,filter:""};let i=s.lastIndexOf("/");return{directory:i===0?"/":s.slice(0,i),filter:s.slice(i+1)}}function Fi(e){let t=Bt(e.trim());if(t===""||t==="/"||t==="~"||t.endsWith("/"))return"";let s=t.lastIndexOf("/");return t.slice(s+1).toLowerCase()}function In(e,t){return e==="/"?`/${t}`:`${e.replace(/\/+$/,"")}/${t}`}var ye=0,To={c:"c",cc:"cpp",cpp:"cpp",cs:"csharp",css:"css",go:"go",h:"c",hpp:"cpp",html:"xml",java:"java",js:"javascript",json:"json",jsx:"javascript",kt:"kotlin",lua:"lua",mjs:"javascript",php:"php",py:"python",rb:"ruby",rs:"rust",sh:"bash",sql:"sql",swift:"swift",toml:"ini",ts:"typescript",tsx:"typescript",xml:"xml",yaml:"yaml",yml:"yaml"};function Dt(){l.fileViewerContent.replaceChildren(),l.fileViewerNotice.textContent="",l.fileViewerNotice.hidden=!0}function Ft(e){l.fileViewerNotice.textContent=e,l.fileViewerNotice.hidden=!1}function xn(e){let t=++ye;return Dt(),l.fileViewerPath.textContent=e,l.fileViewer.hidden=!1,document.body.classList.add("file-viewer-open"),t}function Ui(e){let t=e.lastIndexOf(".");return t<0?"":e.slice(t+1).toLowerCase()}function Eo(e){let t=Ui(e);return t==="md"||t==="markdown"}function ko(e){let t=1;for(let r=0;r<e.length;r++)e.charCodeAt(r)===10&&t++;let s=[],i=[];for(let r=1;r<=t;r++)i.push(String(r)),i.length===1024&&(s.push(i.join(`
|
|
3
|
+
`)),i=[]);return i.length>0&&s.push(i.join(`
|
|
4
|
+
`)),s.join(`
|
|
5
|
+
`)}async function Io(e,t){let s=document.createElement("div");s.className="file-viewer-code-scroll";let i=document.createElement("div");i.className="file-viewer-code-grid";let r=document.createElement("pre");r.className="file-viewer-line-numbers",r.setAttribute("aria-hidden","true"),r.textContent=ko(e);let o=document.createElement("pre");o.className="file-viewer-code";let c=document.createElement("code");c.textContent=e,o.appendChild(c),i.append(r,o),s.appendChild(i),l.fileViewerContent.appendChild(s),await Gn(c,To[Ui(t)])}function xo(e){let t=document.createElement("article");t.className="file-viewer-markdown msg assistant",l.fileViewerContent.appendChild(t),le(t,e),R(t)}function Co(e){let t=document.createElement("img");t.className="file-viewer-image",t.src=e.contentUrl,t.alt=e.name,l.fileViewerContent.appendChild(t)}function Vi(e){let t=document.createElement("a");t.href=e.contentUrl,t.download=e.name,t.target="_blank",t.rel="noopener",t.hidden=!0,document.body.appendChild(t),t.click(),t.remove()}function Lo(e,t){return t.startsWith("text/")?e.size<=1048576:t.startsWith("image/")?e.maxBytes!==void 0&&e.size<=e.maxBytes:!1}async function Ao(e){return ue(t=>fetch(e,t?{signal:t}:void 0))}async function Po(e,t,s){let i=e.headers.get("Content-Disposition")??"",r=e.headers.get("Content-Type")?.toLowerCase()??"";return!/^attachment\b/i.test(i)&&r.startsWith("text/")?!1:(await e.body?.cancel(),s!==ye||(Ut(),Vi(t)),!0)}async function Mo(e,t){Ft("Loading\u2026");try{let s=await Ao(e.contentUrl);if(t!==ye)return;if(!s.ok)throw new Error(`HTTP ${s.status}`);if(await Po(s,e,t))return;let i=await s.text();if(t!==ye)return;if(Dt(),Eo(e.name))xo(i);else if(await Io(i,e.name),t!==ye)return}catch(s){if(t!==ye)return;Dt(),Ft(`Unable to load file: ${s instanceof Error?s.message:String(s)}`)}}async function Wi(e){if(e.kind!=="file"){xn(e.pathDisplay??e.path),Ft("Not a regular file");return}if(!e.contentUrl){xn(e.pathDisplay??e.path),Ft("File content is temporarily unavailable");return}let t=e.mime?.toLowerCase()??"application/octet-stream";if(!Lo(e,t)){Ut(),Vi(e);return}let s=xn(e.pathDisplay??e.path);if(t.startsWith("image/")){Co(e);return}await Mo(e,s)}function Ut(){++ye,Dt(),l.fileViewerPath.textContent="",l.fileViewer.hidden=!0,document.body.classList.remove("file-viewer-open")}function No(){return!l.fileViewer.hidden}l.fileViewerClose.addEventListener("click",Ut);document.addEventListener("keydown",e=>{e.key!=="Escape"||!No()||(e.preventDefault(),Ut())});function Ki(e){return e==="/"?"/view /":`/view ${e.replace(/\/+$/,"")}/`}function ji(e){k(Ki(e)),l.input.focus()}function Gi(e){let t=kn(e,n.sessionCwd).directory;return t==="/"?t:t.replace(/\/+$/,"")}async function zi(e){let t=kn(e,n.sessionCwd),s=await ps(t.directory),i=[];s.parent!==s.path&&i.push({name:"..",path:s.parent,pathDisplay:s.parentDisplay??s.parent,kind:"dir",size:null,mtime:0,parent:!0});for(let r of s.entries)i.push({...r,path:In(s.path,r.name),pathDisplay:In(s.pathDisplay??s.path,r.name)});return i}function Yi(e,t){let s=e,i=Fi(t);return i?s.parent?"..".includes(i):s.name.toLowerCase().includes(i):!0}function Ro(e){if(e!==null)return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function Ji(e){let t=e;return t.kind==="dir"?{primary:t.parent?"..":`${t.name}/`,secondary:t.parent?"parent":"folder",fill:Ki(t.pathDisplay).slice(6),continueOnFill:!0,onSelect:()=>{ji(t.pathDisplay)}}:{primary:t.name,secondary:Ro(t.size),fill:t.pathDisplay,onSelect:()=>Cn(t.pathDisplay)}}async function Cn(e){try{let t=Ht(e,n.sessionCwd),s=await ds(t);if(s.kind==="dir"){ji(s.pathDisplay??s.path);return}await Wi(s)}catch(t){a(`view: ${t instanceof Error?t.message:"Unable to open path"}`)}}var _e=!1;async function tr(){try{_e=await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{_e=!1}}function _o(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s),r=new Uint8Array(i.length);for(let o=0;o<i.length;o++)r[o]=i.charCodeAt(o);return r}async function Oo(){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(),r=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:_o(s)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:r.endpoint,keys:r.keys,clientId:n.clientId})})}catch(e){b.scope("push").error("subscribe failed",{err:e})}}async function $o(){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){b.scope("push").error("unsubscribe failed",{err:e})}}async function qo(){return(await fetch("/api/v1/sessions")).json()}async function Xi(){let e=n.recentPathsLimit,t=e>0?`/api/v1/recent-paths?limit=${e}`:"/api/v1/recent-paths";return(await(await fetch(t)).json()).map(r=>({cwd:r.cwd,cwdDisplay:r.cwdDisplay??r.cwd,time:r.last_used_at}))}var Qi=async()=>{let{messages:e}=await qe();return e},Zi=async()=>ct();function An(){return`log: ${cn()} (${ni()})`}function nr(){a(`${An()} \u2014 use /log <off|debug|info|warn|error|reset>`)}function Pn(e){oi(e),a(`${An()} saved`),e!=="off"&&b.info("log enabled",{level:e})}function Mn(){ai(),a(`${An()} reset`)}async function Nn(){a("Resetting local state\u2026");let e=await ns();e.errors.length&&a(`warn: reset had issues: ${e.errors.join("; ")}`),location.reload()}async function Bo(e,t,s){let i=O(e);i&&(i.currentValue=t),I(),B(),a(`${i?.name??e} \u2192 ${s}`),n.sessionId&&await Ee(n.sessionId,e,t).catch(()=>{})}async function Rn(e){try{await _t(e.id)}catch(t){a(`err: consume failed (${t.message})`)}}async function Ho(e){try{await lt(e.id),a(`inbox: ack ${e.id}`)}catch(t){a(`err: ack failed (${t.message})`)}}async function Do(e){if(!/^[A-Za-z0-9_-]{1,64}$/.test(e)){a("err: token name must match [A-Za-z0-9_-]{1,64}");return}try{let t=await ut(e);a(`token: created ${t.name} (${t.scope})`),a(`${t.token}`),a("\u2014 save this now; it will never be shown again")}catch(t){let s=t;s.status===w.CONFLICT?a(`err: token "${e}" already exists`):s.status===w.FORBIDDEN?a("err: admin scope required to manage tokens"):a(`err: create failed (${s.message})`)}}async function Fo(e){try{await dt(e),a(`token: revoked ${e}`)}catch(t){let s=t;s.status===w.NOT_FOUND?a(`err: no token named "${e}"`):s.status===w.FORBIDDEN?a("err: admin scope required to manage tokens"):s.status===w.BAD_REQUEST&&/using|yourself|cannot/i.test(s.message)?a("err: can't revoke the token you're signed in with \u2014 use another admin token"):a(`err: revoke failed (${s.message})`)}}async function Uo(){if(typeof Notification>"u"){a("err: notifications not supported in this browser");return}if(Notification.permission==="denied"){a("notify: blocked \u2014 allow in browser site settings to enable");return}if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted"){a("notify: blocked \u2014 allow in browser site settings to enable");return}await tr();let e=_e;await Oo(),_e=!0,a(e?"notify: already enabled":"notify: enabled")}async function Vo(){await $o(),_e=!1,a("notify: disabled")}function er(e,t){let s=e.shared_at?N(e.shared_at):"\u2014";return{primary:e.token,secondary:e.session_title??void 0,path:`/s/${e.token}`,pathSecondary:s,onSelect:()=>{t==="open"?ze(e.token):qt(e.token)}}}var we={name:"<root>",children:[{name:"/cancel",desc:"Cancel current response",onSelect:Ot},{name:"/clear",desc:"Clear current session",fetch:Xi,toSpec:e=>{let t=e,s=t.cwd.toLowerCase()===(n.sessionCwd??"").toLowerCase();return{primary:t.cwdDisplay,current:s,onSelect:()=>{je({cwd:t.cwd,showCwd:!0})}}},freeform:e=>{let t=e.trim();return t?{primary:`clear and start at '${t}'`,onSelect:()=>{je({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===cn(),onSelect:()=>{if(t.value==="reset"){Mn();return}Pn(t.value)}}}},{name:"/plan",desc:"Toggle plan panel",fetch:()=>[{value:"show",name:"show",desc:"Show plan panel"},{value:"hide",name:"hide",desc:"Hide plan panel"}],toSpec:e=>{let t=e;return{primary:t.name,secondary:t.desc,current:ci()&&t.value==="show"===ui(),onSelect:()=>{Et(t.value)}}}},{name:"/reset",desc:"Reset local state",onSelect:()=>{Nn()}},{name:"/exit",desc:"End current session",onSelect:async()=>{if(!n.sessionId){a("warn: No active session");return}let e=n.sessionId;try{if(n.busy){a("err: Cancel active work before exiting the session");return}await Te(e),await H(e,n.sessionCwd??void 0)}catch{a("err: Failed to exit session")}}},{name:"/help",desc:"Show help",onSelect:()=>{Wo()}},{name:"/inbox",desc:"Manage inbox",fetch:Qi,toSpec:e=>{let t=e,s=t.from_label??t.from_ref,i=N(t.created_at);return{primary:t.title,secondary:i,path:t.cwd??"",pathSecondary:s,onSelect:()=>Rn(t)}},children:[{name:"dismiss",desc:"Dismiss only",fetch:Qi,toSpec:e=>{let t=e,s=t.from_label??t.from_ref,i=N(t.created_at);return{primary:t.title,secondary:i,path:t.cwd??"",pathSecondary:s,onSelect:()=>Ho(t)}}}]},{name:"/logout",desc:"Log out",onSelect:()=>{try{localStorage.removeItem(G)}catch{}try{n.eventSource?.close()}catch{}a("Logged out."),location.replace("/login")}},Ln("/mode","Switch mode","mode"),Ln("/model","Switch model","model",!0),{name:"/new",desc:"Create new session",fetch:Xi,toSpec:e=>{let t=e,s=t.cwd.toLowerCase()===(n.sessionCwd??"").toLowerCase();return{primary:t.cwdDisplay,current:s,onSelect:()=>{x(),a("Creating new session\u2026"),He({cwd:t.cwd})}}},freeform:e=>{let t=e.trim();return t?{primary:`create session at '${t}'`,onSelect:()=>{x(),a("Creating new session\u2026"),He({cwd:t})}}:null}},{name:"/notify",desc:"Toggle notifications",fetch:async()=>(await tr(),[{value:"on",name:"on",desc:"Enable notifications"},{value:"off",name:"off",desc:"Disable notifications"}]),toSpec:e=>{let t=e,s=t.value==="on"===_e;return{primary:t.name,secondary:t.desc,current:s,onSelect:t.value==="on"?Uo:Vo}}},{name:"/reload",desc:"Reload agent",onSelect:()=>{a("Reloading agent\u2026"),at().catch(e=>{a(`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){a("err: No active session");return}try{await ot(n.sessionId,t),a(`Renamed \u2192 ${t}`)}catch{a("err: Failed to rename session")}}}:null}},{name:"/share",desc:"Share a read-only snapshot",fetch:En,toSpec:e=>er(e,"open"),freeform:e=>{let t=e.trim();return t?{primary:`open share '${t}'`,onSelect:()=>{ze(t)}}:{primary:"create new share preview",onSelect:()=>$t()}},children:[{name:"by",desc:"Set author",fetch:async()=>[{value:await Di()}],toSpec:e=>{let t=e.value;return{primary:t??"(none)",secondary:t?"current \u2014 Enter to clear":"currently anonymous",onSelect:()=>Ye(null)}},freeform:e=>{let t=e.trim();return t?{primary:`set author to '${t}'`,onSelect:()=>Ye(t)}:null}},{name:"revoke",desc:"Revoke a share",fetch:En,toSpec:e=>er(e,"revoke")}]},{name:"/switch",desc:"Switch session",fetch:qo,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,i=N(t.last_active_at);return{primary:s,secondary:i,path:t.cwd,current:t.id===n.sessionId,onSelect:async()=>{try{await Re(t.id)}catch{a("err: Failed to switch session")}}}}},{name:"/view",desc:"View a local file",fetch:zi,fetchKey:Gi,matches:Yi,toSpec:Ji},Ln("/think","Set thinking effort","reasoning_effort",!1,!0),{name:"/token",desc:"Manage API tokens",fetch:Zi,toSpec:e=>{let t=e,s=t.lastUsedAt?N(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${s}`,path:`${t.scope} \xB7 created ${N(t.createdAt)}`,current:t.isSelf,onSelect:t.isSelf?void 0:()=>{a(`\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:()=>Do(t)}:null},children:[{name:"revoke",desc:"Revoke token",fetch:async()=>(await Zi()).filter(e=>!e.isSelf),toSpec:e=>{let t=e,s=t.lastUsedAt?N(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${s}`,path:`${t.scope} \xB7 created ${N(t.createdAt)}`,onSelect:()=>Fo(t.name)}}}]}]};function Ln(e,t,s,i=!1,r=!1){return{name:e,desc:t,fetch:()=>{let o=r?Be():O(s);return o?o.options:[]},toSpec:o=>{let c=o,u=r?Be():O(s),d=u?.currentValue??Qt(s);return{primary:c.name,secondary:i?`(${c.value})`:void 0,current:c.value===d,onSelect:()=>Bo(u?.id??s,c.value,c.name)}},matches:i?(o,c)=>{let u=o;return u.name.toLowerCase().includes(c)||u.value.toLowerCase().includes(c)}:void 0}}function Wo(){let e=[];n.serverVersion&&e.push(`WebAgent ${n.serverVersion}`),n.agentName&&n.agentVersion&&e.push(`${n.agentName} ${n.agentVersion}`),e.length&&a(e.join(" \xB7 ")),a("\u203A has next step * current value"),a("Tab completes \xB7 Enter sends raw text"),a("? \u2014 Show help"),a("!<command> \u2014 Run bash command"),a("// \u2014 Agent commands (agent-specific)");for(let t of we.children)a(`${t.name} \u2014 ${t.desc??""}`);a("--- Shortcuts ---");for(let t of Ko)a(`${t.key} \u2014 ${t.desc}`);a("--- Tips ---");for(let t of jo)a(t.text)}var Ko=[{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)"}],jo=[{text:"Tap \u276F prompt to cycle mode"}];async function Go(){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(),r=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Yo(s)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:r.endpoint,keys:r.keys,clientId:n.clientId})})}catch(e){b.scope("push").error("subscribe failed",{err:e})}}async function zo(){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){b.scope("push").error("unsubscribe failed",{err:e})}}function Yo(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s),r=new Uint8Array(i.length);for(let o=0;o<i.length;o++)r[o]=i.charCodeAt(o);return r}async function sr(){try{return await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{return!1}}async function _n(e){let t=e.split(/\s+/),s=t[0].toLowerCase(),i=t.slice(1).join(" ").trim();switch(s){case"/plan":{let r=i.toLowerCase()||"toggle";return r!=="show"&&r!=="hide"&&r!=="toggle"?(a("plan: use /plan, /plan show, or /plan hide"),!0):(Et(r),!0)}case"/share":{let r=i.split(/\s+/),o=(r[0]??"").toLowerCase();if(o==="")return await $t(),!0;if(o==="revoke"){let u=r[1]??"";return await qt(u),!0}if(o==="by"){let u=i.replace(/^by(\s+|$)/i,"").trim();return await Ye(u===""?null:u),!0}let c=r[0]??"";return/^[A-Za-z0-9_-]{24}$/.test(c)?(ze(c),!0):(a(`share: unknown subcommand '${o}' \u2014 try /share, /share by <name>, /share <token>, or /share revoke <token>`),!0)}case"/view":return await Cn(i),!0;case"/new":{let r=i||n.sessionCwd||void 0,o=n.sessionId;return x(),n.sessionId=null,a("Creating new session\u2026"),He({cwd:r,inheritFromSessionId:o}),!0}case"/rename":{if(!n.sessionId)return a("err: No active session"),!0;if(!i)return a(`Current: ${n.sessionTitle??"(untitled)"}`),a("Usage: /rename <new title>"),!0;try{await ot(n.sessionId,i),a(`Renamed \u2192 ${i}`)}catch{a("err: Failed to rename session")}return!0}case"/sessions":return a("Removed. Use /switch to see all sessions."),!0;case"/clear":return await je({cwd:i||void 0,showCwd:!!i}),!0;case"/exit":{if(!n.sessionId)return a("warn: No active session"),!0;let r=n.sessionId;try{if(n.busy)return a("err: Cancel active work before exiting the session"),!0;await Te(r),await H(r,n.sessionCwd??void 0)}catch{a("err: Failed to exit session")}return!0}case"/logout":{try{localStorage.removeItem(G)}catch{}try{n.eventSource?.close()}catch{}return a("Logged out."),location.replace("/login"),!0}case"/token":{let r=i.trim().split(/\s+/).filter(Boolean),o=r[0];if(!o){try{let u=await ct();if(u.length===0)return a("token: (none)"),!0;for(let d of u){let p=d.lastUsedAt?N(d.lastUsedAt):"never";a(`${d.name} (${d.scope}) \u2014 created ${N(d.createdAt)}, last used ${p}`)}a("\u2014 /token <name> to create \xB7 /token revoke <name> to revoke")}catch(u){let d=u;d.status===w.FORBIDDEN?a("err: admin scope required to manage tokens"):a(`err: token list failed (${d.message})`)}return!0}if(o==="revoke"){let u=r[1];if(!u)return a("err: usage /token revoke <name>"),!0;try{await dt(u),a(`token: revoked ${u}`)}catch(d){let p=d;p.status===w.NOT_FOUND?a(`err: no token named "${u}"`):p.status===w.FORBIDDEN?a("err: admin scope required to manage tokens"):p.status===w.BAD_REQUEST&&/using|yourself|cannot/i.test(p.message)?a("err: can't revoke the token you're signed in with \u2014 use another admin token"):a(`err: revoke failed (${p.message})`)}return!0}let c=o;if(!/^[A-Za-z0-9_-]{1,64}$/.test(c))return a("err: token name must match [A-Za-z0-9_-]{1,64}"),!0;try{let u=await ut(c);a(`token: created ${u.name} (${u.scope})`),a(`${u.token}`),a("\u2014 save this now; it will never be shown again")}catch(u){let d=u;d.status===w.CONFLICT?a(`err: token "${c}" already exists`):d.status===w.FORBIDDEN?a("err: admin scope required to manage tokens"):a(`err: create failed (${d.message})`)}return!0}case"/switch":{if(!i)return a("Usage: /switch <title or id prefix>"),!0;try{let o=await(await fetch("/api/v1/sessions")).json(),c=i.toLowerCase(),u=o.find(d=>d.id.startsWith(i)||d.title?.toLowerCase().includes(c));if(!u)return a(`err: No session matching "${i}"`),!0;await Re(u.id)}catch{a("err: Failed to switch session")}return!0}case"/cancel":return Ot(),!0;case"/reload":return a("Reloading agent\u2026"),at().then(()=>{}).catch(r=>{a(`err: ${r instanceof Error?r.message:"Failed to reload agent"}`)}),!0;case"/help":case"?":{let r=[];n.serverVersion&&r.push(`WebAgent ${n.serverVersion}`),n.agentName&&n.agentVersion&&r.push(`${n.agentName} ${n.agentVersion}`),r.length&&a(r.join(" \xB7 ")),a("\u203A has next step * current value"),a("Tab completes \xB7 Enter sends raw text"),a("? \u2014 Show help"),a("!<command> \u2014 Run bash command"),a("// \u2014 Agent commands (agent-specific)");for(let o of we.children)a(`${o.name} \u2014 ${o.desc??""}`);return a("--- Shortcuts ---"),a("Enter \u2014 Send message"),a("Shift+Enter \u2014 New line"),a("^C \u2014 Cancel current response"),a("^M \u2014 Cycle mode (Agent \u2192 Plan \u2192 Autopilot)"),a("^U \u2014 Attach file (any type)"),a("--- Tips ---"),a("Tap \u276F prompt to cycle mode"),!0}case"/model":case"/mode":case"/think":{let o={"/model":"model","/mode":"mode","/think":"reasoning_effort"}[s],c=s==="/think"?Be():O(o);if(s==="/think"&&c&&(o=c.id),!i){let f=c?.options.find(m=>m.value===c.currentValue)?.name??c?.currentValue??"unknown";return a(`${c?.name??o}: ${f}`),a(`Type ${s} + space to pick from list`),!0}if(!c)return a(`err: ${s.slice(1)} is not available.`),!0;let u=i.trim(),d=f=>f.toLowerCase().replace(/[\s_]+/g,"-"),p=d(u),h=c.options.find(f=>d(f.value)===p||d(f.name)===p);if(!h){let f=c.options.filter(m=>d(m.value).includes(p)||d(m.name).includes(p));if(f.length===1)h=f[0];else if(f.length>1)return a(`err: Ambiguous "${i}". Type ${s} + space to see options.`),!0}return h?(c.currentValue=h.value,I(),B(),a(`${c.name} \u2192 ${h.name}`),await Ee(n.sessionId,o,h.value).catch(()=>{}),!0):(a(`err: Unknown "${i}". Type ${s} + space to see options.`),!0)}case"/inbox":{let r=i.trim().split(/\s+/).filter(Boolean),o=r[0];if(!o){try{let{messages:f}=await qe();if(f.length===0)return a("inbox: empty"),!0;for(let m of f){let g=m.from_label??m.from_ref,y=N(m.created_at);a(`${m.id} \xB7 ${m.title} \xB7 ${g} \xB7 ${y}`)}a("\u2014 /inbox <id> to open \xB7 /inbox dismiss <id> to dismiss only")}catch(f){a(`err: inbox list failed (${f.message})`)}return!0}let c=o==="dismiss",u=c?r[1]:o;if(!u)return a("err: usage /inbox <id> | /inbox dismiss <id>"),!0;let d;try{({messages:d}=await qe())}catch(f){return a(`err: inbox list failed (${f.message})`),!0}let p=u.toLowerCase(),h=d.find(f=>f.id===u)??d.find(f=>f.id.toLowerCase().startsWith(p))??d.find(f=>f.title.toLowerCase().includes(p));if(!h)return a(`err: no inbox message matching "${u}"`),!0;if(c){try{await lt(h.id),a(`inbox: dismissed ${h.id}`)}catch(f){a(`err: dismiss failed (${f.message})`)}return!0}try{await Rn(h)}catch(f){a(`err: consume failed (${f.message})`)}return!0}case"/notify":{if(typeof Notification>"u")return a("err: notifications not supported in this browser"),!0;let r=i.toLowerCase();if(r==="on"){if(Notification.permission==="denied")return a("notify: blocked \u2014 allow in browser site settings to enable"),!0;if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted")return a("notify: blocked \u2014 allow in browser site settings to enable"),!0;let c=await sr();return await Go(),a(c?"notify: already enabled":"notify: enabled"),!0}if(r==="off")return await zo(),a("notify: disabled"),!0;let o=Notification.permission;return o==="denied"?a("notify: blocked \u2014 allow in browser site settings to enable"):o==="granted"&&await sr()?a("notify: enabled"):a("notify: off \u2014 use /notify on to enable"),!0}case"/log":{let r=i.toLowerCase().trim();return r===""?(nr(),!0):r==="reset"?(Mn(),!0):["off","debug","info","warn","error"].includes(r)?(Pn(r),!0):(a(`err: invalid level '${r}' (use off|debug|info|warn|error|reset)`),!0)}case"/reset":return await Nn(),!0;default:return a(`err: Unknown command "${s}". Type / to see available commands.`),!0}}var ve=null,Se=null,Xe=0,Qe=we,W,K=[],ee=-1,te=null,ae=null;function $n(){return ae??l.input.value}function Jo(){return{name:"<agent-root>",children:n.agentCommands.map(e=>({name:`//${e.name}`,desc:e.input?`${e.description} \xB7 ${e.input.hint}`:e.description,onSelect:()=>{k(`//${e.name}`),l.sendBtn.click()}}))}}function qn(e){return e.startsWith("//")?Jo():we}function ir(e){ve="",Se=null,Xe++,Qe=qn(l.input.value),W=void 0,K=[{spec:{primary:e},prefix:"",kind:"placeholder"}],ee=-1,Vt(""),l.slashMenu.classList.add("active")}function Ze(){let e=$n();if(te!==null){if(e===te)return;te=null}if(!e.startsWith("/")){$();return}let t=e.startsWith("//");if(t&&n.busy){ir("(agent busy \u2014 wait or ^C to cancel)");return}if(t&&n.agentCommands.length===0){ir("(agent commands unavailable)");return}let s=qn(e),{node:i,pathPrefix:r,tailQuery:o}=sn(e,s),c;try{c=i.fetch&&i.toSpec?i.fetchKey?`${r}\0${i.fetchKey(o)}`:r:null}catch(d){ve=r,Se=null,Qe=i,W={error:On(d)},Je(o,r);return}let u=r!==ve||c!==Se;if(ve=r,Se=c,Qe=i,u){let d=++Xe;if(i.fetch&&i.toSpec){let p;try{p=i.fetch(o)}catch(h){W={error:On(h)},Je(o,r);return}if(p instanceof Promise){W="loading";let h=r,f=c;p.then(m=>{Xe!==d||ve!==h||Se!==f||(W=m,Je(rr(),r))},m=>{Xe!==d||ve!==h||Se!==f||(W={error:On(m)},Je(rr(),r))})}else W=p}else W=void 0}Je(o,r)}function rr(){let e=$n(),{tailQuery:t}=sn(e,qn(e));return t}function On(e){return e instanceof Error&&e.message?e.message:"fetch failed"}function Je(e,t){let s=Ys(Qe,e,W);if(l.input.value==="/"&&s.push({spec:{primary:"Agent commands: type //"},prefix:"",kind:"placeholder"}),K=s,s.length===0){$();return}let i=s.findIndex(r=>r.kind!=="separator"&&r.kind!=="placeholder");ee=i>=0?i:0,Vt(t),l.slashMenu.classList.add("active")}function Vt(e){l.slashMenu.innerHTML="",l.slashMenu.classList.toggle("slash-menu-root",e===""),K.forEach((s,i)=>{if(s.kind==="separator"){let c=document.createElement("div");c.className="slash-separator",c.dataset.idx=String(i),l.slashMenu.appendChild(c);return}let r=i===ee,o=Js(s.spec,r,s.prefix);s.prefix==="\u203A"&&o.classList.add("slash-arrow"),s.kind==="placeholder"&&o.classList.add("slash-placeholder"),o.dataset.idx=String(i),l.slashMenu.appendChild(o)}),l.slashMenu.dataset.pathPrefix=e;let t=l.slashMenu.querySelector(".slash-item.selected");t&&t.scrollIntoView({block:"nearest"})}function $(){let e=$n();ae=null,l.slashMenu.classList.remove("active"),l.slashMenu.innerHTML="",ee=-1,K=[],ve=null,Se=null,Xe++,Qe=we,W=void 0,te=e}function ar(e){ae=e,te=null,Ze()}function Xo(e,t,s){if(s){$();return}let i=t?" ":"",r=e.spec.continueOnFill===!0;r&&(te=null),k(`${t}${i}${e.spec.fill??e.spec.primary}`),r||$()}function Qo(){let e=K[ee];if(!e)return;let t=l.slashMenu.dataset.pathPrefix??"",s=ae!==null;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?" ":""}`;s?r?(ae=c,te=null,Ze()):$():(k(c),r?(te=null,Ze()):$())}else e.kind==="data"?Xo(e,t,s):e.kind==="freeform"&&$();l.input.focus()}}async function Zo(e){let t=K[e];if(!t)return;let s=l.slashMenu.dataset.pathPrefix??"",i=ae!==null;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){let u=`${s}${s?" ":""}${t.node.name} `;te=null,i?(ae=u,Ze()):k(u),l.input.focus();return}$(),i||k(""),t.node.onSelect&&await t.node.onSelect();return}$(),i||k(""),t.spec.onSelect?await t.spec.onSelect():a("Read-only entry \u2014 no action.")}}function lr(e){return!l.slashMenu.classList.contains("active")||K.length===0?!1:e.key==="ArrowDown"?(ee=or(ee,1),Vt(l.slashMenu.dataset.pathPrefix??""),!0):e.key==="ArrowUp"?(ee=or(ee,-1),Vt(l.slashMenu.dataset.pathPrefix??""),!0):e.key==="Tab"?(Qo(),!0):!1}function or(e,t){let s=K.length;for(let i=1;i<=s;i++){let r=(e+t*i+s)%s;if(K[r].kind!=="separator"&&K[r].kind!=="placeholder")return r}return e}l.slashMenu.addEventListener("mousedown",e=>{e.preventDefault();let s=e.target?.closest(".slash-item");s?.dataset.idx!==void 0&&Zo(Number(s.dataset.idx))});l.input.addEventListener("input",()=>{ae=null,Ze(),l.inputArea.classList.toggle("bash-mode",l.input.value.startsWith("!"))});function ea(e){return new Promise(t=>{let s=new FileReader;s.onload=()=>{t(s.result)},s.readAsDataURL(e)})}async function cr(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 ea(e)),s}function ur(e){n.pendingAttachments.push(e),et()}function et(){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 r=document.createElement("img");r.src=e.previewUrl,s.appendChild(r)}else{s.classList.add("attach-file");let r=document.createElement("span");r.className="attach-file-name",r.textContent=e.name,s.appendChild(r)}let i=document.createElement("button");i.className="remove",i.textContent="\xD7",i.addEventListener("click",()=>{n.pendingAttachments.splice(t,1),et()}),s.appendChild(i),l.attachPreview.appendChild(s)})}l.fileInput.onchange=async()=>{for(let e of l.fileInput.files)ur(await cr(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 i=s.getAsFile();i&&ur(await cr(i))})())});function Bn(e){let t=e.trim();return!t.startsWith("//")&&t.startsWith("/")||t==="?"||t.startsWith("? ")}function Hn(e){let t=e.trim();return Bn(t)||t.startsWith("!")}var Oe={send:()=>{},cancel:()=>{},attach:()=>{},publish:()=>{},cancelPreview:()=>{}};function pr(e){Oe=e}function ta(){if(n.previewToken)return[{label:"^P",title:"Publish preview (Ctrl+P)",className:"publish",onClick:()=>{Oe.publish()}},{label:"^C",title:"Cancel preview (Ctrl+C)",className:"cancel",onClick:()=>{Oe.cancelPreview()}}];let e={label:"^U",title:"Attach file (Ctrl+U)",onClick:()=>{Oe.attach()}},t=()=>{n.busy&&!Hn(l.input.value)?Oe.cancel():Oe.send()};if(n.busy&&!Hn(l.input.value)){let s=n.busyKind==="bash"&&n.cancelStatus==="requested"?"Force stop bash":n.busyKind==="bash"?"Cancel bash (Ctrl+C)":n.cancelStatus==="unconfirmed"?"Retry cancel (agent did not acknowledge)":n.cancelStatus==="requested"?"Retry cancel (waiting for agent acknowledgement)":"Cancel (Ctrl+C)";return[e,{label:"^C",title:s,className:"cancel",onClick:t}]}return[e,{label:"\u21B5",title:"Send (Enter)",onClick:t}]}var na=["cancel","publish"];function dr(e,t){e.textContent=t.label,e.title=t.title,e.disabled=t.disabled??!1,e.onclick=t.onClick;for(let s of na)e.classList.remove(s);t.className&&e.classList.add(t.className)}function sa(){let[e,t]=ta();dr(l.attachBtn,e),dr(l.sendBtn,t),l.input.disabled=!!n.previewToken}Us(sa);function fr(e){let t=e.search(/\s/);return t<0?{token:e,remainder:""}:{token:e.slice(0,t),remainder:e.slice(t)}}function mr(e,t){if(!e.startsWith("//"))return null;let{token:s,remainder:i}=fr(e),r=s.slice(2);if(!r)return null;let o=t.find(c=>c.name.toLowerCase()===r.toLowerCase());return o?{command:s,agentText:`/${o.name}${i}`}:null}function Dn(e){return fr(e).token||e}function Fn(){return n.clientId!==null}n._onCancelTimeout=()=>a("warn: Agent not responding to cancel");function hr(){let e=l.input.value.trim();if(!e&&n.pendingAttachments.length===0)return;let t=e.startsWith("//");if(Bn(e)&&n.pendingAttachments.length===0){k(""),l.input.style.height="auto",_n(e);return}if(e.startsWith("!")&&n.pendingAttachments.length===0){let u=e.slice(1).trim();if(!u)return;if(!n.sessionId){a("warn: Session not ready yet, please wait\u2026");return}if(!Fn()){a("warn: Not connected, please retry");return}k(""),l.input.style.height="auto",l.inputArea.classList.remove("bash-mode"),zs(u,!0),n.sentBashForSession=n.sessionId,ys(n.sessionId,u).catch(()=>{}),S(!0);return}if(n.busy)return;if(t&&!mr(e,n.agentCommands)){let u=Dn(e);a(`err: Unknown command "${u}". Type // to see available commands.`);return}if(k(""),l.input.style.height="auto",l.inputArea.classList.remove("bash-mode"),!n.sessionId){a("warn: Session not ready yet, please wait\u2026");return}if(!Fn()){a("warn: Not connected, please retry");return}A(),M(),n.awaitingOwnUserEcho=!0,n.reconcileAfterOwnUserEcho=!1;let s=se();n.sentMessageOpId=s;let i=vt("user",e||"(attachment)");i.dataset.optimisticOpId=s;let r=[];for(let u of n.pendingAttachments)if(u.kind==="image"&&u.previewUrl){let d=document.createElement("img");d.className="user-image",d.src=u.previewUrl,d.alt=u.name,i.appendChild(d),r.push(null)}else{let d=document.createElement("div");d.className="user-attachment",d.textContent=`[${u.kind}: ${u.name}]`,i.appendChild(d),r.push(d)}let o=n.pendingAttachments.slice();n.pendingAttachments.length=0,et();let c=u=>{ia(u,{text:e,isAgentCommand:t,messageEl:i,attachments:o})};o.length>0?Promise.all(o.map(u=>{let d=new FormData;return d.append("file",u.file,u.name),fetch(`/api/v1/sessions/${n.sessionId}/attachments`,{method:"POST",body:d}).then(p=>p.json()).then(p=>({kind:p.kind,attachmentId:p.attachmentId,displayName:p.displayName,mimeType:p.mimeType,url:p.url}))})).then(u=>{if(!Fn()){i.remove(),a("warn: Not connected, please retry"),n.awaitingOwnUserEcho=!1,n.reconcileAfterOwnUserEcho=!1,S(!1);return}for(let p=0;p<u.length;p++){let h=r[p];if(!h)continue;let f=u[p];if(f.kind==="image"||!f.url)continue;let m=document.createElement("a");m.className="user-file",m.href=f.url,m.target="_blank",m.rel="noopener",m.download=f.displayName,m.textContent=f.displayName,h.replaceWith(m)}let d=u.map(({kind:p,attachmentId:h,displayName:f,mimeType:m})=>({kind:p,attachmentId:h,displayName:f,mimeType:m}));Jt(n.sessionId,e||"What is in this attachment?",d,s).catch(c)}):Jt(n.sessionId,e,void 0,s).catch(c),n.turnEnded=!1,n.sentMessageForSession=n.sessionId,S(!0),js()}function ia(e,t){if(n.awaitingOwnUserEcho=!1,n.sentMessageOpId=null,S(!1),Q(),t?.isAgentCommand&&e instanceof ce&&e.status===w.UNPROCESSABLE_CONTENT){t.messageEl.remove(),n.sentMessageForSession=null,k(t.text),n.pendingAttachments.push(...t.attachments),et();let i=Dn(t.text);a(`err: Unknown command "${i}". Type // to see available commands.`);return}let s=e instanceof Error?e.message:String(e);a(`err: ${s}`)}function yr(){if(!n.busy||!n.sessionId)return;let e=n.cancelStatus!==null;a(e?"^C retrying cancel\u2026":"^C cancelling\u2026"),ht().then(()=>{}).catch(t=>{let s=t instanceof Error?t.message:String(t);a(`err: cancel failed \u2014 ${s}`)})}pr({send:hr,cancel:yr,attach:()=>{l.fileInput.click()},publish:()=>{bn()},cancelPreview:Tn});J();l.input.addEventListener("keydown",e=>{if(lr(e)){e.preventDefault();return}if(e.key==="Enter"&&!e.shiftKey){e.preventDefault(),$(),hr();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(),Tn();return}if(n.busy){e.preventDefault(),yr();return}}e.key==="Escape"&&l.slashMenu.classList.contains("active")&&(e.preventDefault(),$(),l.input.focus())});var gr=0;function wr(){let e=O("mode");if(!e?.options.length){Date.now()-gr>3e3&&(a("Mode switcher temporarily unavailable. Try `/new` to start a fresh session."),gr=Date.now());return}let t=e.options.findIndex(i=>i.value===e.currentValue),s=e.options[(t+1)%e.options.length];e.currentValue=s.value,Ee(n.sessionId,"mode",s.value).catch(()=>{}),a(`Mode \u2192 ${s.name}`),I()}document.addEventListener("keydown",e=>{e.key==="m"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&(e.preventDefault(),wr())});document.addEventListener("keydown",e=>{n.previewToken&&(!(e.ctrlKey||e.metaKey)||e.shiftKey||e.key==="p"&&(e.preventDefault(),bn()))});l.prompt.addEventListener("click",wr);l.input.addEventListener("input",J);l.input.addEventListener("input",()=>{Gs(ra)});function ra(){l.input.style.height="auto",l.input.style.height=Math.min(l.input.scrollHeight,oa())+"px"}function oa(){let e=Number.parseFloat(window.getComputedStyle(l.input).maxHeight);return Number.isFinite(e)?e:Number.POSITIVE_INFINITY}var aa=b.scope("sse");async function la(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{}}var ca=45e3,ua=5e3,da=3e3,$e=0,Un=null,j=0,be=null;function vr(){be||(be=setTimeout(()=>{be=null,Wt()},da),be.unref?.())}function Vn(){$e=Date.now()}function pa(){Un||(Un=setInterval(Sr,ua),Un.unref?.())}function Sr(){if(!$e||Date.now()-$e<ca)return;aa.warn("stream silent, reconnecting",{silentMs:Date.now()-$e}),$e=0;let e=n.eventSource;e&&(e.onerror=null,e.close()),br(),Wt()}function Wt(){be&&(clearTimeout(be),be=null);let e=++j,t=n.sessionId;ie("connecting","connecting"),fa(e,t)}async function fa(e,t){Vn(),pa();let s;try{s=(await ws()).ticket}catch{e===j&&vr();return}if(e!==j)return;let i=new EventSource(`/api/v1/events/stream?ticket=${encodeURIComponent(s)}`);n.eventSource=i,i.onmessage=r=>{if(e!==j){i.close();return}Vn();let o=JSON.parse(r.data);o.type==="connected"&&o.clientId&&(n.clientId=o.clientId,t&&n.sessionId===t&&(ie("connected","connected"),ma(t,e)),typeof o.pendingCount=="number"&&ft(o.pendingCount),Tt(o.debugLevel),ke(o.clientId,!document.hidden,n.sessionId??void 0),la(o.clientId),!o.agent)||V(o)},i.onerror=()=>{i.close(),e===j&&($e=0,br(),vr())},i.addEventListener("heartbeat",()=>{e===j&&(Vn(),n.clientId&&(document.hidden||ke(n.clientId,!0,n.sessionId??void 0)))}),ga()}async function ma(e,t){let s=X(e,()=>t===j&&n.sessionId===e);if(await he(e),t!==j||n.sessionId!==e)return;await Promise.resolve();let i=await he(e);!i&&t===j&&n.sessionId===e&&(await Promise.resolve(),i=await he(e)),!(!await s||t!==j||n.sessionId!==e)&&(Ne(),i&&C(!1))}async function ga(){await ha(),await Hi()}async function ha(){ie("connecting","session loading");let e=n.sessionSwitchGen,t=Vs();if(t&&t===n.sessionId){if(await Wn(t,!0,e),e!==n.sessionSwitchGen)return;C(!1);return}if(t){if(x({preserveNavigationTarget:n.pendingNavigationSessionId===t}),await Wn(t,!1,e),e!==n.sessionSwitchGen)return;C(!0);return}try{let s=await rt();if(e!==n.sessionSwitchGen)return;if(s.length>0){if(x(),await Wn(s[0].id,!1,e),e!==n.sessionSwitchGen)return;C(!0);return}}catch{}e===n.sessionSwitchGen&&(Sn()||xe())}async function Wn(e,t,s){if(t){try{let r=await de(e);if(s!==n.sessionSwitchGen)return;V({type:"session_created",sessionId:r.id,cwd:r.cwd,cwdDisplay:r.cwdDisplay,title:r.title,configOptions:r.configOptions})}catch{if(s!==n.sessionSwitchGen)return;await H(e,n.sessionCwd??void 0);return}if(s!==n.sessionSwitchGen)return;let[i]=await Promise.all([X(e,()=>s===n.sessionSwitchGen),he(e)]);if(s!==n.sessionSwitchGen)return;i?Ne():await H(e,n.sessionCwd??void 0)}else{n.sessionId=null,n.pendingNavigationSessionId=e;let i=Ke(e),r;try{let[o,c]=await Promise.all([de(e),i]),u=await X(e,()=>s===n.sessionSwitchGen);if(s!==n.sessionSwitchGen)return;if(!u){await H(e,n.sessionCwd??void 0);return}Ne(),r=o,c||a("warn: Failed to load history.")}catch{if(s!==n.sessionSwitchGen)return;await H(e,n.sessionCwd??void 0);return}V({type:"session_created",sessionId:r.id,cwd:r.cwd,cwdDisplay:r.cwdDisplay,title:r.title,configOptions:r.configOptions}),Rt(e)}}function br(){ie("disconnected","disconnected"),n.eventSource=null,n.clientId=null,A(),M(),n.currentBashEl&&St(n.currentBashEl,null,"disconnected"),n.pendingToolCallIds.clear(),n.pendingPermissionRequestIds.clear(),n.pendingPromptDone=!1,n.turnEnded=!1,n.currentPromptId=null,n.lastStateSeq=0,Ce(),S(!1)}function Tr(e,t){let s=`/api/beta/clients/${encodeURIComponent(e)}/visibility`,i=JSON.stringify({visible:!1,sessionId:t});try{fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:i,keepalive:!0}).catch(()=>{})}catch{}}document.addEventListener("visibilitychange",()=>{if(n.clientId&&(document.hidden?Tr(n.clientId,n.sessionId??null):ke(n.clientId,!0,n.sessionId??void 0)),document.hidden||Sr(),!document.hidden&&n.sessionId&&!n.replayInProgress){let e=n.sessionId;Promise.all([X(e,()=>n.sessionId===e),he(e)]).then(([t])=>{!t||n.sessionId!==e||(Ne(),C(!1))})}});window.addEventListener("pagehide",()=>{n.clientId&&Tr(n.clientId,n.sessionId??null)});var ya=80,wa=300,va=10,Sa=350,ba=24,Er=!1,ne=null,P=null;function Ta(){return typeof window.visualViewport>"u"?null:window.visualViewport}function kr(){let e=Ta();return e?e.offsetTop>0||window.innerHeight-e.height>ya:!0}function Kn(e){return typeof e.pointerId=="number"?e.pointerId:1}function Ea(e){if(e.pointerType!=="touch")return;if(ne=null,document.activeElement!==l.input||l.input.disabled){P=null;return}let t=e.target===l.input?"input":e.target instanceof window.Node&&l.statusBar.contains(e.target)?"status-bar":null;if(!t){P=null;return}ne={pointerId:Kn(e),startX:e.clientX,startY:e.clientY,startTs:e.timeStamp,keyboardLikelyOpenAtStart:kr(),target:t}}function ka(e){if(!ne||Kn(e)!==ne.pointerId)return;let t=ne;ne=null;let s=e.timeStamp-t.startTs,i=Math.hypot(e.clientX-t.startX,e.clientY-t.startY);if(s>wa||i>va){P=null;return}if(document.activeElement!==l.input||l.input.disabled){P=null;return}if(t.target==="input"&&!t.keyboardLikelyOpenAtStart&&!kr()){P=null,l.input.blur();return}if(t.target==="input"){P=null;return}let r=P?t.startTs-P.endTs:Number.POSITIVE_INFINITY,o=P?Math.hypot(e.clientX-P.endX,e.clientY-P.endY):Number.POSITIVE_INFINITY;if(r>=0&&r<=Sa&&o<=ba){P=null,l.input.blur();return}P={endX:e.clientX,endY:e.clientY,endTs:e.timeStamp}}function Ia(e){ne&&Kn(e)===ne.pointerId&&(ne=null,P=null)}function Ir(){Er||(Er=!0,document.addEventListener("pointerdown",Ea,{capture:!0}),document.addEventListener("pointerup",ka,{capture:!0}),document.addEventListener("pointercancel",Ia,{capture:!0}))}var xr=!1;function Cr(){xr||(xr=!0,l.inboxBtn.addEventListener("click",()=>{l.input.value?ar("/inbox "):k("/inbox "),l.input.focus()}))}if(!localStorage.getItem(G))throw location.replace("/login"),new Error("redirecting to /login");ss();si(a);Ir();Cr();l.messages.addEventListener("click",zn);zt(Yn);Wt();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??{};t.type==="navigate"&&Bi(t).catch(s=>{let i=s instanceof Error?s.message:String(s);a(`err: notification navigation failed (${i})`)})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var s=Object.freeze({OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,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 O(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,O as c};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import"./chunk.AJZBJBMO.js";var C=class{diff(e,t,i={}){let r;typeof i=="function"?(r=i,i={}):"callback"in i&&(r=i.callback);let l=this.castInput(e,i),o=this.castInput(t,i),m=this.removeEmpty(this.tokenize(l,i)),d=this.removeEmpty(this.tokenize(o,i));return this.diffWithOptionsObj(m,d,i,r)}diffWithOptionsObj(e,t,i,r){var l;let o=u=>{if(u=this.postProcess(u,i),r){setTimeout(function(){r(u)},0);return}else return u},m=t.length,d=e.length,w=1,g=m+d;i.maxEditLength!=null&&(g=Math.min(g,i.maxEditLength));let x=(l=i.timeout)!==null&&l!==void 0?l:1/0,F=Date.now()+x,y=[{oldPos:-1,lastComponent:void 0}],f=this.extractCommon(y[0],t,e,0,i);if(y[0].oldPos+1>=d&&f+1>=m)return o(this.buildValues(y[0].lastComponent,t,e));let s=-1/0,c=1/0,h=()=>{for(let u=Math.max(s,-w);u<=Math.min(c,w);u+=2){let a,p=y[u-1],v=y[u+1];p&&(y[u-1]=void 0);let W=!1;if(v){let b=v.oldPos-u;W=v&&0<=b&&b<m}let N=p&&p.oldPos+1<d;if(!W&&!N){y[u]=void 0;continue}if(!N||W&&p.oldPos<v.oldPos?a=this.addToPath(v,!0,!1,0,i):a=this.addToPath(p,!1,!0,1,i),f=this.extractCommon(a,t,e,u,i),a.oldPos+1>=d&&f+1>=m)return o(this.buildValues(a.lastComponent,t,e))||!0;y[u]=a,a.oldPos+1>=d&&(c=Math.min(c,u-1)),f+1>=m&&(s=Math.max(s,u+1))}w++};if(r)(function u(){setTimeout(function(){if(w>g||Date.now()>F)return r(void 0);h()||u()},0)})();else for(;w<=g&&Date.now()<=F;){let u=h();if(u)return u}}addToPath(e,t,i,r,l){let o=e.lastComponent;return o&&!l.oneChangePerToken&&o.added===t&&o.removed===i?{oldPos:e.oldPos+r,lastComponent:{count:o.count+1,added:t,removed:i,previousComponent:o.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:i,previousComponent:o}}}extractCommon(e,t,i,r,l){let o=t.length,m=i.length,d=e.oldPos,w=d-r,g=0;for(;w+1<o&&d+1<m&&this.equals(i[d+1],t[w+1],l);)w++,d++,g++,l.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return g&&!l.oneChangePerToken&&(e.lastComponent={count:g,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=d,w}equals(e,t,i){return i.comparator?i.comparator(e,t):e===t||!!i.ignoreCase&&e.toLowerCase()===t.toLowerCase()}removeEmpty(e){let t=[];for(let i=0;i<e.length;i++)e[i]&&t.push(e[i]);return t}castInput(e,t){return e}tokenize(e,t){return Array.from(e)}join(e){return e.join("")}postProcess(e,t){return e}get useLongestToken(){return!1}buildValues(e,t,i){let r=[],l;for(;e;)r.push(e),l=e.previousComponent,delete e.previousComponent,e=l;r.reverse();let o=r.length,m=0,d=0,w=0;for(;m<o;m++){let g=r[m];if(g.removed)g.value=this.join(i.slice(w,w+g.count)),w+=g.count;else{if(!g.added&&this.useLongestToken){let x=t.slice(d,d+g.count);x=x.map(function(F,y){let f=i[w+y];return f.length>F.length?f:F}),g.value=this.join(x)}else g.value=this.join(t.slice(d,d+g.count));d+=g.count,g.added||(w+=g.count)}}return r}};var R=class extends C{},oe=new R;function be(n,e,t){return oe.diff(n,e,t)}function _(n,e){let t;for(t=0;t<n.length&&t<e.length;t++)if(n[t]!=e[t])return n.slice(0,t);return n.slice(0,t)}function $(n,e){let t;if(!n||!e||n[n.length-1]!=e[e.length-1])return"";for(t=0;t<n.length&&t<e.length;t++)if(n[n.length-(t+1)]!=e[e.length-(t+1)])return n.slice(-t);return n.slice(-t)}function M(n,e,t){if(n.slice(0,e.length)!=e)throw Error(`string ${JSON.stringify(n)} doesn't start with prefix ${JSON.stringify(e)}; this is a bug`);return t+n.slice(e.length)}function H(n,e,t){if(!e)return n+t;if(n.slice(-e.length)!=e)throw Error(`string ${JSON.stringify(n)} doesn't end with suffix ${JSON.stringify(e)}; this is a bug`);return n.slice(0,-e.length)+t}function S(n,e){return M(n,e,"")}function D(n,e){return H(n,e,"")}function U(n,e){return e.slice(0,Ee(n,e))}function Ee(n,e){let t=0;n.length>e.length&&(t=n.length-e.length);let i=e.length;n.length<e.length&&(i=n.length);let r=Array(i),l=0;r[0]=0;for(let o=1;o<i;o++){for(e[o]==e[l]?r[o]=r[l]:r[o]=l;l>0&&e[o]!=e[l];)l=r[l];e[o]==e[l]&&l++}l=0;for(let o=t;o<n.length;o++){for(;l>0&&n[o]!=e[l];)l=r[l];n[o]==e[l]&&l++}return l}function se(n){return n.includes(`\r
|
|
2
|
+
`)&&!n.startsWith(`
|
|
3
|
+
`)&&!n.match(/[^\r]\n/)}function fe(n){return!n.includes(`\r
|
|
4
|
+
`)&&n.includes(`
|
|
5
|
+
`)}function q(n,e){let t=[];for(let i of Array.from(e.segment(n))){let r=i.segment;t.length&&/\s/.test(t[t.length-1])&&/\s/.test(r)?t[t.length-1]+=r:t.push(r)}return t}function P(n,e){if(e)return L(n,e)[1];let t;for(t=n.length-1;t>=0&&n[t].match(/\s/);t--);return n.substring(t+1)}function O(n,e){if(e)return L(n,e)[0];let t=n.match(/^\s*/);return t?t[0]:""}function L(n,e){if(!e)return[O(n),P(n)];if(e.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');let t=q(n,e),i=t[0],r=t[t.length-1],l=/\s/.test(i)?i:"",o=/\s/.test(r)?r:"";return[l,o]}var T="a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}",Oe=new RegExp(`[${T}]+|\\s+|[^${T}]`,"ug"),G=class extends C{equals(e,t,i){return i.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e.trim()===t.trim()}tokenize(e,t={}){let i;if(t.intlSegmenter){let o=t.intlSegmenter;if(o.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');i=q(e,o)}else i=e.match(Oe)||[];let r=[],l=null;return i.forEach(o=>{/\s/.test(o)?l==null?r.push(o):r.push(r.pop()+o):l!=null&&/\s/.test(l)?r[r.length-1]==l?r.push(r.pop()+o):r.push(l+o):r.push(o),l=o}),r}join(e){return e.map((t,i)=>i==0?t:t.replace(/^\s+/,"")).join("")}postProcess(e,t){if(!e||t.oneChangePerToken)return e;let i=null,r=null,l=null;return e.forEach(o=>{o.added?r=o:o.removed?l=o:((r||l)&&ue(i,l,r,o,t.intlSegmenter),i=o,r=null,l=null)}),(r||l)&&ue(i,l,r,null,t.intlSegmenter),e}},ae=new G;function ke(n,e,t){return t?.ignoreWhitespace!=null&&!t.ignoreWhitespace?ce(n,e,t):ae.diff(n,e,t)}function ue(n,e,t,i,r){if(e&&t){let[l,o]=L(e.value,r),[m,d]=L(t.value,r);if(n){let w=_(l,m);n.value=H(n.value,m,w),e.value=S(e.value,w),t.value=S(t.value,w)}if(i){let w=$(o,d);i.value=M(i.value,d,w),e.value=D(e.value,w),t.value=D(t.value,w)}}else if(t){if(n){let l=O(t.value,r);t.value=t.value.substring(l.length)}if(i){let l=O(i.value,r);i.value=i.value.substring(l.length)}}else if(n&&i){let l=O(i.value,r),[o,m]=L(e.value,r),d=_(l,o);e.value=S(e.value,d);let w=$(S(l,d),m);e.value=D(e.value,w),i.value=M(i.value,l,w),n.value=H(n.value,l,l.slice(0,l.length-w.length))}else if(i){let l=O(i.value,r),o=P(e.value,r),m=U(o,l);e.value=D(e.value,m)}else if(n){let l=P(n.value,r),o=O(e.value,r),m=U(l,o);e.value=S(e.value,m)}}var J=class extends C{tokenize(e){let t=new RegExp(`(\\r?\\n)|[${T}]+|[^\\S\\n\\r]+|[^${T}]`,"ug");return e.match(t)||[]}},de=new J;function ce(n,e,t){return de.diff(n,e,t)}function me(n,e){if(typeof n=="function")e.callback=n;else if(n)for(let t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t]);return e}var V=class extends C{constructor(){super(...arguments),this.tokenize=Q}equals(e,t,i){return i.ignoreWhitespace?((!i.newlineIsToken||!e.includes(`
|
|
6
|
+
`))&&(e=e.trim()),(!i.newlineIsToken||!t.includes(`
|
|
7
|
+
`))&&(t=t.trim())):i.ignoreNewlineAtEof&&!i.newlineIsToken&&(e.endsWith(`
|
|
8
|
+
`)&&(e=e.slice(0,-1)),t.endsWith(`
|
|
9
|
+
`)&&(t=t.slice(0,-1))),super.equals(e,t,i)}},B=new V;function A(n,e,t){return B.diff(n,e,t)}function Se(n,e,t){return t=me(t,{ignoreWhitespace:!0}),B.diff(n,e,t)}function Q(n,e){e.stripTrailingCr&&(n=n.replace(/\r\n/g,`
|
|
10
|
+
`));let t=[],i=n.split(/(\n|\r\n)/);i[i.length-1]||i.pop();for(let r=0;r<i.length;r++){let l=i[r];r%2&&!e.newlineIsToken?t[t.length-1]+=l:t.push(l)}return t}function Le(n){return n=="."||n=="!"||n=="?"}var X=class extends C{tokenize(e){var t;let i=[],r=0;for(let l=0;l<e.length;l++){if(l==e.length-1){i.push(e.slice(r));break}if(Le(e[l])&&e[l+1].match(/\s/)){for(i.push(e.slice(r,l+1)),l=r=l+1;!((t=e[l+1])===null||t===void 0)&&t.match(/\s/);)l++;i.push(e.slice(r,l+1)),r=l+1}}return i}},he=new X;function De(n,e,t){return he.diff(n,e,t)}var Y=class extends C{tokenize(e){return e.split(/([{}:;,]|\s+)/)}},ge=new Y;function Me(n,e,t){return ge.diff(n,e,t)}var Z=class extends C{constructor(){super(...arguments),this.tokenize=Q}get useLongestToken(){return!0}castInput(e,t){let{undefinedReplacement:i,stringifyReplacer:r=(l,o)=>typeof o>"u"?i:o}=t;return typeof e=="string"?e:JSON.stringify(I(e,null,null,r),null," ")}equals(e,t,i){return super.equals(e.replace(/,([\r\n])/g,"$1"),t.replace(/,([\r\n])/g,"$1"),i)}},pe=new Z;function He(n,e,t){return pe.diff(n,e,t)}function I(n,e,t,i,r){e=e||[],t=t||[],i&&(n=i(r===void 0?"":r,n));let l;for(l=0;l<e.length;l+=1)if(e[l]===n)return t[l];let o;if(Object.prototype.toString.call(n)==="[object Array]"){for(e.push(n),o=new Array(n.length),t.push(o),l=0;l<n.length;l+=1)o[l]=I(n[l],e,t,i,String(l));return e.pop(),t.pop(),o}if(n&&n.toJSON&&(n=n.toJSON()),typeof n=="object"&&n!==null){e.push(n),o={},t.push(o);let m=[],d;for(d in n)Object.prototype.hasOwnProperty.call(n,d)&&m.push(d);for(m.sort(),l=0;l<m.length;l+=1)d=m[l],o[d]=I(n[d],e,t,i,d);e.pop(),t.pop()}else o=n;return o}var K=class extends C{tokenize(e){return e.slice()}join(e){return e}removeEmpty(e){return e}},we=new K;function Pe(n,e,t){return we.diff(n,e,t)}function ee(n){return Array.isArray(n)?n.map(e=>ee(e)):Object.assign(Object.assign({},n),{hunks:n.hunks.map(e=>Object.assign(Object.assign({},e),{lines:e.lines.map((t,i)=>{var r;return t.startsWith("\\")||t.endsWith("\r")||!((r=e.lines[i+1])===null||r===void 0)&&r.startsWith("\\")?t:t+"\r"})}))})}function ne(n){return Array.isArray(n)?n.map(e=>ne(e)):Object.assign(Object.assign({},n),{hunks:n.hunks.map(e=>Object.assign(Object.assign({},e),{lines:e.lines.map(t=>t.endsWith("\r")?t.substring(0,t.length-1):t)}))})}function xe(n){return Array.isArray(n)||(n=[n]),!n.some(e=>e.hunks.some(t=>t.lines.some(i=>!i.startsWith("\\")&&i.endsWith("\r"))))}function ve(n){return Array.isArray(n)||(n=[n]),n.some(e=>e.hunks.some(t=>t.lines.some(i=>i.endsWith("\r"))))&&n.every(e=>e.hunks.every(t=>t.lines.every((i,r)=>{var l;return i.startsWith("\\")||i.endsWith("\r")||((l=t.lines[r+1])===null||l===void 0?void 0:l.startsWith("\\"))})))}function z(n){let e=n.split(/\n/),t=[],i=0;function r(f){return/^diff --git /.test(f)}function l(f){return r(f)||/^Index:\s/.test(f)||/^diff(?: -r \w+)+\s/.test(f)}function o(f){return/^(---|\+\+\+)\s/.test(f)}function m(f){return/^@@\s/.test(f)}function d(){var f;let s={};s.hunks=[],t.push(s);let c=!1;for(;i<e.length;){let h=e[i];if(o(h)||m(h))break;if(r(h)){if(c)return;c=!0,s.isGit=!0;let u=w(h);for(u&&(s.oldFileName=u.oldFileName,s.newFileName=u.newFileName),i++;i<e.length;){let a=e[i];if(o(a)||m(a)||l(a))break;let p=/^rename from (.*)/.exec(a);p&&(s.oldFileName="a/"+g(p[1]),s.isRename=!0);let v=/^rename to (.*)/.exec(a);v&&(s.newFileName="b/"+g(v[1]),s.isRename=!0);let W=/^copy from (.*)/.exec(a);W&&(s.oldFileName="a/"+g(W[1]),s.isCopy=!0);let N=/^copy to (.*)/.exec(a);N&&(s.newFileName="b/"+g(N[1]),s.isCopy=!0);let b=/^new file mode (\d+)/.exec(a);b&&(s.isCreate=!0,s.newMode=b[1]);let k=/^deleted file mode (\d+)/.exec(a);k&&(s.isDelete=!0,s.oldMode=k[1]);let re=/^old mode (\d+)/.exec(a);re&&(s.oldMode=re[1]);let le=/^new mode (\d+)/.exec(a);le&&(s.newMode=le[1]),/^Binary files /.test(a)&&(s.isBinary=!0),i++}continue}else if(l(h)){if(c)return;c=!0;let u=/^(?:Index:|diff(?: -r \w+)+)\s+/.exec(h);u&&(s.index=h.substring(u[0].length).trim())}i++}if(F(s),F(s),s.oldFileName===void 0!=(s.newFileName===void 0))throw new Error("Missing "+(s.oldFileName!==void 0?'"+++ ..."':'"--- ..."')+" file header for "+((f=s.oldFileName)!==null&&f!==void 0?f:s.newFileName));for(;i<e.length;){let h=e[i];if(l(h)||o(h)||/^===================================================================/.test(h))break;m(h)?s.hunks.push(y()):i++}}function w(f){let s=f.substring(11);if(s.startsWith('"')){let h=x(s);if(h===null)return null;let u=s.substring(h.rawLength+1),a;if(u.startsWith('"')){let p=x(u);if(p===null)return null;a=p.fileName}else a=u;return{oldFileName:h.fileName,newFileName:a}}let c=s.indexOf('"');if(c>0){let h=s.substring(0,c-1),u=x(s.substring(c));return u===null?null:{oldFileName:h,newFileName:u.fileName}}if(s.startsWith("a/")){let h=[],u=0;for(;u=s.indexOf(" b/",u+1),u!==-1;)h.push(u);if(h.length>0){let a=h[Math.floor(h.length/2)];return{oldFileName:s.substring(0,a),newFileName:s.substring(a+1)}}}return null}function g(f){if(f.startsWith('"')){let s=x(f);if(s)return s.fileName}return f}function x(f){if(!f.startsWith('"'))return null;let s="",c=1;for(;c<f.length;){if(f[c]==='"')return{fileName:s,rawLength:c+1};if(f[c]==="\\"&&c+1<f.length)switch(c++,f[c]){case"a":s+="\x07";break;case"b":s+="\b";break;case"f":s+="\f";break;case"n":s+=`
|
|
11
|
+
`;break;case"r":s+="\r";break;case"t":s+=" ";break;case"v":s+="\v";break;case"\\":s+="\\";break;case'"':s+='"';break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":{if(c+2>=f.length||f[c+1]<"0"||f[c+1]>"7"||f[c+2]<"0"||f[c+2]>"7")return null;let h=[parseInt(f.substring(c,c+3),8)];for(c+=3;f[c]==="\\"&&f[c+1]>="0"&&f[c+1]<="7";){if(c+3>=f.length||f[c+2]<"0"||f[c+2]>"7"||f[c+3]<"0"||f[c+3]>"7")return null;h.push(parseInt(f.substring(c+1,c+4),8)),c+=4}s+=new TextDecoder("utf-8").decode(new Uint8Array(h));continue}default:return null}else s+=f[c];c++}return null}function F(f){let s=/^(---|\+\+\+)\s+/.exec(e[i]);if(s){let c=s[1],h=e[i].substring(3).trim().split(" ",2),u=(h[1]||"").trim(),a=h[0];a.startsWith('"')?a=g(a):a=a.replace(/\\\\/g,"\\"),c==="---"?(f.oldFileName=a,f.oldHeader=u):(f.newFileName=a,f.newHeader=u),i++}}function y(){var f;let s=i,c=e[i++],h=c.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/),u={oldStart:+h[1],oldLines:typeof h[2]>"u"?1:+h[2],newStart:+h[3],newLines:typeof h[4]>"u"?1:+h[4],lines:[]};u.oldLines===0&&(u.oldStart+=1),u.newLines===0&&(u.newStart+=1);let a=0,p=0;for(;i<e.length&&(p<u.oldLines||a<u.newLines||!((f=e[i])===null||f===void 0)&&f.startsWith("\\"));i++){let v=e[i].length==0&&i!=e.length-1?" ":e[i][0];if(v==="+"||v==="-"||v===" "||v==="\\")u.lines.push(e[i]),v==="+"?a++:v==="-"?p++:v===" "&&(a++,p++);else throw new Error(`Hunk at line ${s+1} contained invalid line ${e[i]}`)}if(!a&&u.newLines===1&&(u.newLines=0),!p&&u.oldLines===1&&(u.oldLines=0),a!==u.newLines)throw new Error("Added line count did not match for hunk at line "+(s+1));if(p!==u.oldLines)throw new Error("Removed line count did not match for hunk at line "+(s+1));if(i<e.length&&e[i]&&/^[+ -]/.test(e[i])&&!o(e[i]))throw new Error("Hunk at line "+(s+1)+" has more lines than expected (expected "+u.oldLines+" old lines and "+u.newLines+" new lines)");return u}for(;i<e.length;)d();return t}function ye(n,e,t){let i=!0,r=!1,l=!1,o=1;return function m(){if(i&&!l){if(r?o++:i=!1,n+o<=t)return n+o;l=!0}if(!r)return l||(i=!0),e<=n-o?n-o++:(r=!0,m())}}function Fe(n,e,t={}){let i;if(typeof e=="string"?i=z(e):Array.isArray(e)?i=e:i=[e],i.length>1)throw new Error("applyPatch only works with a single input.");return Te(n,i[0],t)}function Te(n,e,t={}){(t.autoConvertLineEndings||t.autoConvertLineEndings==null)&&(se(n)&&xe(e)?e=ee(e):fe(n)&&ve(e)&&(e=ne(e)));let i=n.split(`
|
|
12
|
+
`),r=e.hunks,l=t.compareLine||((f,s,c,h)=>s===h),o=t.fuzzFactor||0,m=0;if(o<0||!Number.isInteger(o))throw new Error("fuzzFactor must be a non-negative integer");if(!r.length)return n;let d="",w=!1,g=!1;for(let f=0;f<r[r.length-1].lines.length;f++){let s=r[r.length-1].lines[f];s[0]=="\\"&&(d[0]=="+"?w=!0:d[0]=="-"&&(g=!0)),d=s}if(w){if(g){if(!o&&i[i.length-1]=="")return!1}else if(i[i.length-1]=="")i.pop();else if(!o)return!1}else if(g){if(i[i.length-1]!="")i.push("");else if(!o)return!1}function x(f,s,c,h=0,u=!0,a=[],p=0){let v=0,W=!1;for(;h<f.length;h++){let N=f[h],b=N.length>0?N[0]:" ",k=N.length>0?N.substr(1):N;if(b==="-")if(l(s+1,i[s],b,k))s++,v=0;else return!c||i[s]==null?null:(a[p]=i[s],x(f,s+1,c-1,h,!1,a,p+1));if(b==="+"){if(!u)return null;a[p]=k,p++,v=0,W=!0}if(b===" ")if(v++,a[p]=i[s],l(s+1,i[s],b,k))p++,u=!0,W=!1,s++;else return W||!c?null:i[s]&&(x(f,s+1,c-1,h+1,!1,a,p+1)||x(f,s+1,c-1,h,!1,a,p+1))||x(f,s,c-1,h+1,!1,a,p)}return p-=v,s-=v,a.length=p,{patchedLines:a,oldLineLastI:s-1}}let F=[],y=0;for(let f=0;f<r.length;f++){let s=r[f],c,h=i.length-s.oldLines+o,u;for(let a=0;a<=o;a++){u=s.oldStart+y-1;let p=ye(u,m,h);for(;u!==void 0&&(c=x(s.lines,u,a),!c);u=p());if(c)break}if(!c)return!1;for(let a=m;a<u;a++)F.push(i[a]);for(let a=0;a<c.patchedLines.length;a++){let p=c.patchedLines[a];F.push(p)}m=c.oldLineLastI+1,y=u+1-s.oldStart}for(let f=m;f<i.length;f++)F.push(i[f]);return F.join(`
|
|
13
|
+
`)}function Ae(n,e){let t=typeof n=="string"?z(n):n,i=0;function r(){let l=t[i++];if(!l)return e.complete();e.loadFile(l,function(o,m){if(o)return e.complete(o);let d=Fe(m,l,e);e.patched(l,d,function(w){if(w)return e.complete(w);r()})})}r()}function Ce(n){return n===void 0||n==="/dev/null"?n:n.startsWith("a/")?"b/"+n.slice(2):n.startsWith("b/")?"a/"+n.slice(2):n}function Ne(n){if(Array.isArray(n))return n.map(t=>Ne(t)).reverse();let e=Object.assign(Object.assign({},n),{oldFileName:n.isGit?Ce(n.newFileName):n.newFileName,oldHeader:n.newHeader,newFileName:n.isGit?Ce(n.oldFileName):n.oldFileName,newHeader:n.oldHeader,oldMode:n.newMode,newMode:n.oldMode,isCreate:n.isDelete,isDelete:n.isCreate,hunks:n.hunks.map(t=>({oldLines:t.newLines,oldStart:t.newStart,newLines:t.oldLines,newStart:t.oldStart,lines:t.lines.map(i=>i.startsWith("-")?`+${i.slice(1)}`:i.startsWith("+")?`-${i.slice(1)}`:i)}))});return n.isCopy&&(e.newFileName="/dev/null",e.newHeader=void 0,e.isDelete=!0,delete e.isCreate,delete e.isCopy,delete e.isRename,e.hunks=[]),e}function Ie(n){for(let e=0;e<n.length;e++)if(n[e]<" "||n[e]>"~"||n[e]==='"'||n[e]==="\\")return!0;return!1}function E(n){if(!Ie(n))return n;let e='"',t=new TextEncoder().encode(n),i=0;for(;i<t.length;){let r=t[i];r===7?e+="\\a":r===8?e+="\\b":r===9?e+="\\t":r===10?e+="\\n":r===11?e+="\\v":r===12?e+="\\f":r===13?e+="\\r":r===34?e+='\\"':r===92?e+="\\\\":r>=32&&r<=126?e+=String.fromCharCode(r):e+="\\"+r.toString(8).padStart(3,"0"),i++}return e+='"',e}var te={includeIndex:!0,includeUnderline:!0,includeFileHeaders:!0},ze={includeIndex:!1,includeUnderline:!1,includeFileHeaders:!0},je={includeIndex:!1,includeUnderline:!1,includeFileHeaders:!1};function ie(n,e,t,i,r,l,o){let m;o?typeof o=="function"?m={callback:o}:m=o:m={},typeof m.context>"u"&&(m.context=4);let d=m.context;if(m.newlineIsToken)throw new Error("newlineIsToken may not be used with patch-generation functions, only with diffing functions");if(m.callback){let{callback:g}=m;A(t,i,Object.assign(Object.assign({},m),{callback:x=>{let F=w(x);g(F)}}))}else return w(A(t,i,m));function w(g){if(!g)return;g.push({value:"",lines:[]});function x(u){return u.map(function(a){return" "+a})}let F=[],y=0,f=0,s=[],c=1,h=1;for(let u=0;u<g.length;u++){let a=g[u],p=a.lines||_e(a.value);if(a.lines=p,a.added||a.removed){if(!y){let v=g[u-1];y=c,f=h,v&&(s=d>0?x(v.lines.slice(-d)):[],y-=s.length,f-=s.length)}for(let v of p)s.push((a.added?"+":"-")+v);a.added?h+=p.length:c+=p.length}else{if(y)if(p.length<=d*2&&u<g.length-2)for(let v of x(p))s.push(v);else{let v=Math.min(p.length,d);for(let N of x(p.slice(0,v)))s.push(N);let W={oldStart:y,oldLines:c-y+v,newStart:f,newLines:h-f+v,lines:s};F.push(W),y=0,f=0,s=[]}c+=p.length,h+=p.length}}for(let u of F)for(let a=0;a<u.lines.length;a++)u.lines[a].endsWith(`
|
|
14
|
+
`)?u.lines[a]=u.lines[a].slice(0,-1):(u.lines.splice(a+1,0,"\"),a++);return{oldFileName:n,newFileName:e,oldHeader:r,newHeader:l,hunks:F}}}function j(n,e){var t,i,r,l,o,m;if(e||(e=te),Array.isArray(n)){if(n.length>1&&!e.includeFileHeaders&&!n.every(g=>g.isGit))throw new Error("Cannot omit file headers on a multi-file patch. (The result would be unparseable; how would a tool trying to apply the patch know which changes are to which file?)");return n.map(g=>j(g,e)).join(`
|
|
15
|
+
`)}let d=[];if(n.isGit){if(e=te,!n.oldFileName)throw new Error("oldFileName must be specified for Git patches");if(!n.newFileName)throw new Error("newFileName must be specified for Git patches");let g=n.oldFileName,x=n.newFileName;n.isCreate&&g==="/dev/null"?g=x.replace(/^b\//,"a/"):n.isDelete&&x==="/dev/null"&&(x=g.replace(/^a\//,"b/")),d.push("diff --git "+E(g)+" "+E(x)),n.isDelete&&d.push("deleted file mode "+((t=n.oldMode)!==null&&t!==void 0?t:"100644")),n.isCreate&&d.push("new file mode "+((i=n.newMode)!==null&&i!==void 0?i:"100644")),n.oldMode&&n.newMode&&!n.isDelete&&!n.isCreate&&(d.push("old mode "+n.oldMode),d.push("new mode "+n.newMode)),n.isRename&&(d.push("rename from "+E(((r=n.oldFileName)!==null&&r!==void 0?r:"").replace(/^a\//,""))),d.push("rename to "+E(((l=n.newFileName)!==null&&l!==void 0?l:"").replace(/^b\//,"")))),n.isCopy&&(d.push("copy from "+E(((o=n.oldFileName)!==null&&o!==void 0?o:"").replace(/^a\//,""))),d.push("copy to "+E(((m=n.newFileName)!==null&&m!==void 0?m:"").replace(/^b\//,""))))}else e.includeIndex&&n.oldFileName==n.newFileName&&n.oldFileName!==void 0&&d.push("Index: "+n.oldFileName),e.includeUnderline&&d.push("===================================================================");let w=n.hunks.length>0;e.includeFileHeaders&&n.oldFileName!==void 0&&n.newFileName!==void 0&&(!n.isGit||w)&&(d.push("--- "+E(n.oldFileName)+(n.oldHeader?" "+n.oldHeader:"")),d.push("+++ "+E(n.newFileName)+(n.newHeader?" "+n.newHeader:"")));for(let g=0;g<n.hunks.length;g++){let x=n.hunks[g],F=x.oldLines===0?x.oldStart-1:x.oldStart,y=x.newLines===0?x.newStart-1:x.newStart;d.push("@@ -"+F+","+x.oldLines+" +"+y+","+x.newLines+" @@");for(let f of x.lines)d.push(f)}return d.join(`
|
|
16
|
+
`)+`
|
|
17
|
+
`}function We(n,e,t,i,r,l,o){if(typeof o=="function"&&(o={callback:o}),o?.callback){let{callback:m}=o;ie(n,e,t,i,r,l,Object.assign(Object.assign({},o),{callback:d=>{m(d?j(d,o.headerOptions):void 0)}}))}else{let m=ie(n,e,t,i,r,l,o);return m?j(m,o?.headerOptions):void 0}}function Re(n,e,t,i,r,l){return We(n,n,e,t,i,r,l)}function _e(n){let e=n.endsWith(`
|
|
18
|
+
`),t=n.split(`
|
|
19
|
+
`).map(i=>i+`
|
|
20
|
+
`);return e?t.pop():t.push(t.pop().slice(0,-1)),t}function $e(n){let e=[],t,i;for(let r=0;r<n.length;r++)t=n[r],t.added?i=1:t.removed?i=-1:i=0,e.push([i,t.value]);return e}function Ue(n){let e=[];for(let t=0;t<n.length;t++){let i=n[t];i.added?e.push("<ins>"):i.removed&&e.push("<del>"),e.push(qe(i.value)),i.added?e.push("</ins>"):i.removed&&e.push("</del>")}return e.join("")}function qe(n){let e=n;return e=e.replace(/&/g,"&"),e=e.replace(/</g,"<"),e=e.replace(/>/g,">"),e=e.replace(/"/g,"""),e}export{C as Diff,ze as FILE_HEADERS_ONLY,te as INCLUDE_HEADERS,je as OMIT_HEADERS,Fe as applyPatch,Ae as applyPatches,we as arrayDiff,I as canonicalize,oe as characterDiff,$e as convertChangesToDMP,Ue as convertChangesToXML,Re as createPatch,We as createTwoFilesPatch,ge as cssDiff,Pe as diffArrays,be as diffChars,Me as diffCss,He as diffJson,A as diffLines,De as diffSentences,Se as diffTrimmedLines,ke as diffWords,ce as diffWordsWithSpace,j as formatPatch,pe as jsonDiff,B as lineDiff,z as parsePatch,Ne as reversePatch,he as sentenceDiff,ie as structuredPatch,ae as wordDiff,de as wordsWithSpaceDiff};
|