@lelouchhe/webagent 0.9.0 → 0.10.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 +39 -14
- package/config.toml +7 -27
- package/dist/index.html +4 -4
- package/dist/js/app.INIQQEGD.js +5 -0
- package/dist/js/{chunk.S5LRNRJI.js → chunk.7WADDFJZ.js} +27 -27
- package/dist/js/viewer.RHZMFYWJ.js +1 -0
- package/dist/login.html +1 -1
- package/dist/share-viewer.html +5 -5
- package/dist/{styles.00nlhhf3.css → styles.01aj0l37.css} +19 -2
- package/dist/sw.js +6 -6
- package/lib/attachment-dispatch.js +60 -31
- package/lib/attachment-interceptor.js +7 -7
- package/lib/attachment-labels.js +1 -1
- package/lib/attachments.js +25 -0
- package/lib/auth-middleware.js +2 -2
- package/lib/auth.js +2 -2
- package/lib/bridge.js +109 -83
- package/lib/client-registry.js +12 -12
- package/lib/config.js +2 -31
- package/lib/event-handler.js +143 -90
- package/lib/files/routes.js +1 -1
- package/lib/mcp/capability.js +74 -0
- package/lib/mcp/server.js +148 -0
- package/lib/mcp/task-history.js +245 -0
- package/lib/mcp/task-host.js +253 -0
- package/lib/mcp/tools.js +168 -0
- package/lib/mode-bucket.js +1 -1
- package/lib/push-service.js +33 -35
- package/lib/routes.js +947 -489
- package/lib/server.js +64 -16
- package/lib/share/routes.js +88 -88
- package/lib/shared/task-reference.js +20 -0
- package/lib/sse-manager.js +8 -8
- package/lib/store.js +941 -314
- package/lib/task-collaboration.js +15 -0
- package/lib/task-manager.js +1409 -0
- package/lib/task-path.js +131 -0
- package/lib/{session-state.js → task-state.js} +64 -41
- package/lib/task-tree-lock.js +74 -0
- package/lib/{sessions-anchor.js → tasks-anchor.js} +8 -7
- package/lib/tokens.js +1 -1
- package/lib/types.js +2 -2
- package/package.json +7 -1
- package/dist/js/app.QC7IRDTP.js +0 -5
- package/dist/js/viewer.GP5VXAUY.js +0 -1
- package/lib/session-manager.js +0 -638
- package/lib/title-service.js +0 -95
package/README.md
CHANGED
|
@@ -3,23 +3,26 @@
|
|
|
3
3
|
[](https://github.com/LelouchHe/webagent/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/@lelouchhe/webagent)
|
|
5
5
|
|
|
6
|
-
A
|
|
6
|
+
A task-first web UI for [ACP](https://agentclientprotocol.com/)-compatible agents — Copilot CLI, Claude Code, Gemini CLI, and [more](docs/configuration.md#acp-compatible-agents).
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
The web UI is a thin wrapper: the browser client stays small because the substance lives in the server behind it, where work is organized as **Tasks** — durable units with their own history, attachments, working directory, lifecycle, and parent/child tree. Each Task is bound to an ACP session that executes it, so a Task survives its session being resumed, rotated (`/clear`), or replaced, and Tasks work with each other by creating children, sending durable messages, and handing work back. The same model is served as a documented REST + SSE API, so anything else you build can drive it too. Nothing leaves your machine.
|
|
9
9
|
|
|
10
10
|
## Highlights
|
|
11
11
|
|
|
12
|
+
- **Task-first, thin client** — the browser is a thin wrapper over a server that treats the Task as the durable unit of work: `+api-fix` creates a named child Task, `@api-fix` opens it or sends it a message, and each Task keeps its history, working directory, and place in the tree while its agent session can be resumed, rotated, or replaced.
|
|
12
13
|
- **Zero-config first run** — `npx @lelouchhe/webagent` and you're online. Auto-detects the ACP agent on your `PATH`, mints an admin token on first start, persists everything in `./data/`.
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
14
|
+
- **Task-oriented API** — everything the UI does is a documented REST + SSE API: `POST /api/v1/tasks` creates a Task with a parent, title, cwd, and inherited model/mode, and every Task exposes its own event stream. Script it from CI or a cron job, or build your own client. See [Server API](docs/api.md).
|
|
15
|
+
- **Direct Task tools for agents (MCP)** — when the agent supports MCP, WebAgent injects a scoped `webagent` MCP server into its session, so the agent itself gets `task_create`, `task_send`, `task_update`, bounded history lookup, and child cancellation. It creates and coordinates child Tasks on its own instead of asking you to relay. See [Task MCP Control Plane](docs/task-mcp.md).
|
|
16
|
+
- **Multi-device, real-time** — REST + SSE keeps Tasks, permissions, collaboration messages, and bash output synced. Approve a permission on your laptop, see it confirmed on your phone.
|
|
17
|
+
- **Web Push notifications** — Get pinged on `prompt_done`, `permission_request`, or `bash_done` when the tab isn't focused. Smart per-task suppression: if any device is actively viewing Task X, no buzz from Task X.
|
|
15
18
|
- **PWA + mobile-friendly** — Installable to iOS / Android home screen. Mobile-first input, attach via paste/upload, dark-mode native.
|
|
16
19
|
- **Attachments** — Drag, paste, or `^U` any file (images, code, PDFs, …). Server sniffs real MIME from content, so agents reliably read it.
|
|
17
20
|
- **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.
|
|
18
|
-
- **Inline bash** — `!ls -la` runs directly in your
|
|
19
|
-
- **
|
|
21
|
+
- **Inline bash** — `!ls -la` runs directly in your Task's cwd, output streams in real time, cancellable.
|
|
22
|
+
- **Tasks that survive everything** — SQLite-persisted history, auto-resume on page open, auto-restore via ACP `loadTask` after server restart, and context clearing that keeps the Task and its history intact.
|
|
20
23
|
- **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
24
|
- **Rich slash menu** — `/new`, `/switch`, `/view`, `/model`, `/mode`, `/think`, `/notify`, `/inbox`, `/share`, `/token`, `/log` — autocomplete with Tab, submenus for pickable values.
|
|
22
|
-
- **Public share links** — `/share` snapshots a
|
|
25
|
+
- **Public share links** — `/share` snapshots a Task into a sanitized read-only viewer at `/s/<token>` for show-and-tell.
|
|
23
26
|
- **Daemon mode with crash recovery** — `webagent start` runs as a background service with PID file, log rotation, and exponential-backoff restart on crash.
|
|
24
27
|
- **Built-in security** — Bearer token auth, per-device tokens, signed image URLs, strict CSP, single-operator threat model.
|
|
25
28
|
|
|
@@ -28,12 +31,22 @@ See [Features](docs/features.md) for the full tour.
|
|
|
28
31
|
<table>
|
|
29
32
|
<tr>
|
|
30
33
|
<td width="60%">
|
|
31
|
-
<img src="docs/images/
|
|
34
|
+
<img src="docs/images/task-collaboration.png" alt="A parent Task delegating to a child Task and receiving the handoff" />
|
|
32
35
|
</td>
|
|
33
36
|
<td width="40%">
|
|
34
37
|
<img src="docs/images/mobile-chat.png" alt="Mobile layout" />
|
|
35
38
|
</td>
|
|
36
39
|
</tr>
|
|
40
|
+
<tr>
|
|
41
|
+
<td width="50%">
|
|
42
|
+
<img src="docs/images/plus-command.png" alt="Creating a named child Task with +" />
|
|
43
|
+
<br /><sub><code>+</code> creates a named child Task: title first, working directory optional.</sub>
|
|
44
|
+
</td>
|
|
45
|
+
<td width="50%">
|
|
46
|
+
<img src="docs/images/at-command.png" alt="Addressing the Task family with @" />
|
|
47
|
+
<br /><sub><code>@</code> addresses the Task family — a child, the parent, or a message to either.</sub>
|
|
48
|
+
</td>
|
|
49
|
+
</tr>
|
|
37
50
|
</table>
|
|
38
51
|
|
|
39
52
|
<details>
|
|
@@ -42,14 +55,21 @@ See [Features](docs/features.md) for the full tour.
|
|
|
42
55
|
<table>
|
|
43
56
|
<tr>
|
|
44
57
|
<td width="50%">
|
|
45
|
-
<img src="docs/images/
|
|
46
|
-
<br /><sub>
|
|
58
|
+
<img src="docs/images/chat-desktop.png" alt="Desktop chat with tool calls and diffs" />
|
|
59
|
+
<br /><sub>Desktop chat: streamed output, tool calls, and diffs.</sub>
|
|
47
60
|
</td>
|
|
48
61
|
<td width="50%">
|
|
49
62
|
<img src="docs/images/slash-menu.png" alt="Slash command menu" />
|
|
50
63
|
<br /><sub>Slash command autocomplete menu.</sub>
|
|
51
64
|
</td>
|
|
52
65
|
</tr>
|
|
66
|
+
<tr>
|
|
67
|
+
<td width="50%">
|
|
68
|
+
<img src="docs/images/permission.png" alt="Permission dialog" />
|
|
69
|
+
<br /><sub>Inline permission prompts, synced across devices.</sub>
|
|
70
|
+
</td>
|
|
71
|
+
<td width="50%"></td>
|
|
72
|
+
</tr>
|
|
53
73
|
</table>
|
|
54
74
|
|
|
55
75
|
</details>
|
|
@@ -92,7 +112,7 @@ The frontend is a standard browser client that talks to the server over REST + S
|
|
|
92
112
|
| -------------------- | ----------------------------------------------------------- |
|
|
93
113
|
| `routes.ts` | REST API + static files ([full API reference](docs/api.md)) |
|
|
94
114
|
| `event-handler.ts` | ACP event routing → SSE broadcast |
|
|
95
|
-
| `
|
|
115
|
+
| `task-manager.ts` | Task state, buffers, bash processes |
|
|
96
116
|
| `bridge.ts` | ACP bridge — agent subprocess lifecycle |
|
|
97
117
|
| `store.ts` | SQLite persistence (WAL mode) |
|
|
98
118
|
| `daemon.ts` | Background service with crash recovery |
|
|
@@ -105,7 +125,12 @@ Frontend source lives in `public/js/*.ts`, bundled by esbuild into a single cont
|
|
|
105
125
|
|
|
106
126
|
| Document | Contents |
|
|
107
127
|
| ------------------------------------------------------- | ------------------------------------------------------------------------------ |
|
|
108
|
-
| **[Features](docs/features.md)** | Chat, attachments, bash,
|
|
128
|
+
| **[Features](docs/features.md)** | Chat, attachments, bash, tasks, slash commands, keyboard shortcuts, themes |
|
|
129
|
+
| **[Task UX](docs/task-ux.md)** | `+` creation, `@` paths, autocomplete, navigation, and collaboration |
|
|
130
|
+
| **[Task Manual](docs/task-manual.md)** | Principles for using Tasks effectively |
|
|
131
|
+
| **[Task Examples](docs/task-examples.md)** | Short examples of direct work, delegation, handoff, and coordination |
|
|
132
|
+
| **[Task MCP Control Plane](docs/task-mcp.md)** | Task tools, compact history, capability scope, and provider-schema compatibility |
|
|
133
|
+
| **[Vocabulary](docs/vocabulary.md)** | Task vs ACP session naming, and the storage, API, and UI vocabulary contract |
|
|
109
134
|
| **[Configuration & Operations](docs/configuration.md)** | TOML config, daemon commands, agent setup, upgrading |
|
|
110
135
|
| **[Security](docs/security.md)** | Bearer auth, token storage, SSE ticket, signed image URLs, CSP, data layout |
|
|
111
136
|
| **[API Reference](docs/api.md)** | REST endpoints, SSE events, implementation details |
|
|
@@ -115,8 +140,8 @@ Frontend source lives in `public/js/*.ts`, bundled by esbuild into a single cont
|
|
|
115
140
|
| **[Streaming Render Performance](docs/performance.md)** | rAF coalescing, incremental lex, per-block memo, single-token fast path |
|
|
116
141
|
| **[Slash Menu](docs/slash-menu.md)** | Walker pipeline, `CmdNode` tree, Tab/Enter/Click contract, how to add commands |
|
|
117
142
|
| **[Messages / Inbox](docs/messages.md)** | `/inbox` slash command, POST ingress, bound vs unbound messages |
|
|
118
|
-
| **[Share Links](docs/share.md)** | Public read-only
|
|
119
|
-
| **[Database Schema](docs/schema.md)** | SQLite tables, indexes, FK policy, cascade/lifecycle rules,
|
|
143
|
+
| **[Share Links](docs/share.md)** | Public read-only task snapshots via `/share` + `/s/<token>` |
|
|
144
|
+
| **[Database Schema](docs/schema.md)** | SQLite tables, indexes, FK policy, cascade/lifecycle rules, reset policy |
|
|
120
145
|
| **[Development](docs/development.md)** | Building from source, dev mode, testing, publishing |
|
|
121
146
|
| **[Implementation Invariants](docs/implementation-invariants.md)** | Runtime, security, protocol, frontend, browser, and platform constraints |
|
|
122
147
|
| **[Auto-Start on Boot](docs/autostart.md)** | launchd, systemd, crontab, Windows Task Scheduler |
|
package/config.toml
CHANGED
|
@@ -15,7 +15,7 @@ host = "127.0.0.1"
|
|
|
15
15
|
# SQLite + uploads directory (default: "data")
|
|
16
16
|
data_dir = "data"
|
|
17
17
|
|
|
18
|
-
# Default working directory for new
|
|
18
|
+
# Default working directory for new tasks (default: process.cwd()).
|
|
19
19
|
# Leave this commented out to use the process working directory.
|
|
20
20
|
# default_cwd = "/path/to/your/workspace"
|
|
21
21
|
|
|
@@ -45,7 +45,7 @@ file_upload = 52_428_800
|
|
|
45
45
|
# does not respond within this time the UI resets to idle. Set to 0 to disable.
|
|
46
46
|
cancel_timeout = 10_000
|
|
47
47
|
|
|
48
|
-
# Max recent paths shown in /new
|
|
48
|
+
# Max recent paths shown in the /new and + path pickers (default 10, 0 = show all)
|
|
49
49
|
recent_paths = 10
|
|
50
50
|
|
|
51
51
|
# Days to keep unused paths before auto-cleanup (default 30, 0 = keep forever)
|
|
@@ -54,31 +54,11 @@ recent_paths_ttl = 30
|
|
|
54
54
|
[push]
|
|
55
55
|
vapid_subject = "mailto:noreply@example.com"
|
|
56
56
|
# Kill switch for cross-device global visibility suppression. When true,
|
|
57
|
-
# if any client is actively viewing
|
|
57
|
+
# if any client is actively viewing task X, push for task X is
|
|
58
58
|
# suppressed for every device. Flip to false to rollback the feature
|
|
59
59
|
# without a code change.
|
|
60
60
|
global_visibility_suppression = true
|
|
61
61
|
|
|
62
|
-
[title]
|
|
63
|
-
# Models matched (by case-insensitive substring) against the agent's
|
|
64
|
-
# reported availableModels for the title-generation sub-session. The first
|
|
65
|
-
# pattern that matches any model id wins; that model is set via
|
|
66
|
-
# setConfigOption. No match → skip the call and inherit the agent's
|
|
67
|
-
# default model (currentModelId).
|
|
68
|
-
#
|
|
69
|
-
# Default list targets the cheap/fast tier across major providers:
|
|
70
|
-
# - "haiku" → Anthropic (claude-haiku-*)
|
|
71
|
-
# - "flash-lite" → Google Gemini (gemini-*-flash-lite) [must precede "flash"]
|
|
72
|
-
# - "nano" → OpenAI (gpt-*-nano), Gemini Nano
|
|
73
|
-
# - "mini" → OpenAI (gpt-*-mini, 4o-mini), Mistral
|
|
74
|
-
# - "flash" → Google Gemini (gemini-*-flash)
|
|
75
|
-
# - "lite" → Cohere, generic
|
|
76
|
-
#
|
|
77
|
-
# Set models = [] to disable matching entirely and always inherit the
|
|
78
|
-
# agent's default model. To pin one specific model, use a single-element
|
|
79
|
-
# array, e.g. models = ["claude-haiku-4.5"].
|
|
80
|
-
models = ["haiku", "flash-lite", "nano", "mini", "flash", "lite"]
|
|
81
|
-
|
|
82
62
|
[debug]
|
|
83
63
|
# Frontend log level. One of: off | debug | info | warn | error.
|
|
84
64
|
# Default "off". Users can override per page-load via ?debug=<level> in
|
|
@@ -88,16 +68,16 @@ level = "off"
|
|
|
88
68
|
|
|
89
69
|
[messages]
|
|
90
70
|
# Days before an unprocessed unbound inbox message is auto-cleaned
|
|
91
|
-
# (default 30). 0 = keep forever. Bound messages (to:"
|
|
92
|
-
# are stored on the owning
|
|
71
|
+
# (default 30). 0 = keep forever. Bound messages (to:"task:<id>")
|
|
72
|
+
# are stored on the owning task and are not subject to this TTL.
|
|
93
73
|
unprocessed_ttl_days = 30
|
|
94
74
|
|
|
95
75
|
[share]
|
|
96
|
-
# Public read-only
|
|
76
|
+
# Public read-only task share links. Default off. Dogfood manually
|
|
97
77
|
# flips `enabled = true` after CF Access bypass + Rate Limiting are
|
|
98
78
|
# configured. See docs/share.md.
|
|
99
79
|
|
|
100
|
-
# Master kill switch. When false, all /api/v1/
|
|
80
|
+
# Master kill switch. When false, all /api/v1/tasks/*/share* and
|
|
101
81
|
# /s/* routes return 410, and /share slash commands are hidden.
|
|
102
82
|
enabled = false
|
|
103
83
|
|
package/dist/index.html
CHANGED
|
@@ -24,8 +24,8 @@
|
|
|
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.
|
|
27
|
+
<link rel="stylesheet" href="/styles.01aj0l37.css" />
|
|
28
|
+
<link rel="modulepreload" href="/js/chunk.7WADDFJZ.js">
|
|
29
29
|
<link rel="modulepreload" href="/js/chunk.3CLGCUHW.js">
|
|
30
30
|
<link rel="modulepreload" href="/js/chunk.AJZBJBMO.js">
|
|
31
31
|
</head>
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
<span id="inbox-count" hidden></span>
|
|
43
43
|
</button>
|
|
44
44
|
</div>
|
|
45
|
-
<span id="
|
|
45
|
+
<span id="task-info" class="status"></span>
|
|
46
46
|
<div class="header-side header-right">
|
|
47
47
|
<span
|
|
48
48
|
id="status"
|
|
@@ -90,6 +90,6 @@
|
|
|
90
90
|
<div id="file-viewer-content"></div>
|
|
91
91
|
</aside>
|
|
92
92
|
|
|
93
|
-
<script type="module" src="/js/app.
|
|
93
|
+
<script type="module" src="/js/app.INIQQEGD.js"></script>
|
|
94
94
|
</body>
|
|
95
95
|
</html>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{a as br,b as Sr,c as O,d as Ir,e as fn,f as Er,g as ht,h as xr,i as Cr,j,k as Lr,l as ke,m as Z,n as Pr,o as Ar,p as I,q,r as yt,s as mn,t as gn,u as Mr,v as hn}from"./chunk.7WADDFJZ.js";import{a as k,b as Q}from"./chunk.3CLGCUHW.js";import"./chunk.AJZBJBMO.js";var kt=null;function fi(e){location.replace(e)}function mi(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 gi(e){return e==="/api/v1/files/content"||/^\/api\/v1\/tasks\/[A-Za-z0-9_-]+\/attachments\/[^/]+$/.test(e)}function hi(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function Nr(e={}){let t=e.baseFetch??globalThis.fetch.bind(globalThis),n=e.onUnauthorized??fi;kt??=globalThis.fetch;let s=async(a,i)=>{let l=hi(a),d=mi(l),u=d?.startsWith("/api/")??!1,p=i;if(u){let f=localStorage.getItem(Q);if(f){let m=i?.headers??(a instanceof Request?a.headers:void 0),g=new Headers(m);g.has("Authorization")||g.set("Authorization",`Bearer ${f}`),p={...i??{},headers:g}}}let h=await t(a,p);if(u&&h.status===k.UNAUTHORIZED&&d!==null&&!gi(d)){try{localStorage.removeItem(Q)}catch{}n("/login")}return h};return globalThis.fetch=s,yi}function yi(){kt&&(globalThis.fetch=kt,kt=null)}var ki=new Set(["plan","read-only"]),wi=new Set(["autopilot","bypassPermissions","full-access","yolo"]),vi=new Set(["agent","default","build"]);function wt(e){if(!e)return"";let t=e.match(/[#/]([^#/]+)$/);return t?t[1]:e}function $r(e){return ki.has(wt(e))}function Rr(e){return wi.has(wt(e))}function _r(e){let t=wt(e);return t?!vi.has(t):!1}function Or(e){return wt(e).replace(/([A-Z])/g," $1").trim()}var ee=class extends Error{name="ApiError";status;constructor(t,n){super(n),this.status=t}},yn=3e4,qr=1e4;async function we(e,t=yn){if(typeof AbortController!="function")return e(void 0);let n=new AbortController,s=setTimeout(()=>{n.abort()},t);s.unref?.();try{return await e(n.signal)}finally{clearTimeout(s)}}async function P(e,t,n=yn){return we(async s=>{let a=await fetch(e,s?{...t,signal:s}:t);if(!a.ok){let l=`HTTP ${a.status}`;try{let d=await a.json();d.error&&(l=typeof d.error=="string"?d.error:JSON.stringify(d.error))}catch{}throw new ee(a.status,l)}let i=await a.text();if(i)return JSON.parse(i)},n)}function A(e,t,n,s=yn){let a={"Content-Type":"application/json"};return n&&(a["X-Client-Op-Id"]=n),P(e,{method:"POST",headers:a,body:JSON.stringify(t)},s)}function te(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"op-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,10)}function vt(e,t){let n={};return e?.cwd&&(n.cwd=e.cwd),e?.inheritFromTaskId&&(n.inheritFromTaskId=e.inheritFromTaskId),e?.parentId&&(n.parentId=e.parentId),e?.title!==void 0&&(n.title=e.title),e?.brief!==void 0&&(n.brief=e.brief),A("/api/v1/tasks",n,t)}function Dr(e){let t={};return e&&(t["X-Client-Op-Id"]=e),P("/api/v1/tasks/bootstrap",{method:"POST",headers:t})}function Br(e,t){let n={};return t?.cwd&&(n.cwd=t.cwd),A("/api/v1/tasks/"+e+"/clear",n)}function Fr(e,t){return A("/api/v1/tasks/"+e+"/compact",{...t!==void 0?{prompt:t}:{}})}async function Hr(e){let t=te(),n=await P("/api/v1/tasks/"+e,{method:"DELETE",headers:{"X-Client-Op-Id":t}});return n&&{...n,clientOpId:n.clientOpId??t}}function Ur(e,t,n,s){return A(`/api/v1/tasks/${encodeURIComponent(e)}/messages`,{targetTaskId:t,body:n},s)}function G(){return P("/api/v1/tasks")}function ve(e){return P("/api/v1/tasks/"+e)}function Tt(e){return P(`/api/v1/files/info?path=${encodeURIComponent(e)}`)}function bt(e){return P(`/api/v1/files/list?path=${encodeURIComponent(e)}`)}function Vr(e){return P("/api/v1/tasks/"+e+"/snapshot")}function kn(e,t,n,s=te()){let a={text:t};return n?.length&&(a.attachments=n),A("/api/v1/tasks/"+e+"/prompt",a,s)}function Wr(e){return A("/api/v1/tasks/"+e+"/cancel",{},te())}function Kr(e,t,n){return A("/api/v1/tasks/"+e+"/permissions/"+t,{optionId:n},te())}function jr(e,t){return A("/api/v1/tasks/"+e+"/permissions/"+t,{denied:!0},te())}function Ae(e,t,n){let s=t.replace(/_/g,"-"),a=typeof n=="boolean"?"config/"+s:s;return P("/api/v1/tasks/"+e+"/"+a,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:n})})}function St(e,t){return P("/api/v1/tasks/"+e+"/title",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:t})})}function Gr(e,t){return A("/api/v1/tasks/"+e+"/bash",{command:t})}function Me(e,t,n){let s={visible:t};return n&&(s.taskId=n),A("/api/beta/clients/"+e+"/visibility",s,void 0,qr)}function It(){return A("/api/v1/bridge/reload",{})}function zr(){return A("/api/v1/sse-ticket",{},void 0,qr)}function Ye(){return P("/api/v1/messages")}function Yr(e,t){return A(`/api/v1/messages/${encodeURIComponent(e)}/consume`,{...t?{inheritFromTaskId:t}:{}})}function Et(e){return P(`/api/v1/messages/${encodeURIComponent(e)}`,{method:"DELETE"})}function xt(){return P("/api/v1/tokens")}function Ct(e){return A("/api/v1/tokens",{name:e})}function Lt(e){return P("/api/v1/tokens/"+encodeURIComponent(e),{method:"DELETE"})}var w=e=>document.querySelector(e),c={messages:w("#messages"),input:w("#input"),sendBtn:w("#send-btn"),prompt:w("#input-prompt"),status:w("#status"),taskInfo:w("#task-info"),inboxBtn:w("#inbox-btn"),inboxCount:w("#inbox-count"),attachBtn:w("#attach-btn"),fileInput:w("#file-input"),attachPreview:w("#attach-preview"),themeBtn:w("#theme-btn"),slashMenu:w("#slash-menu"),fileViewer:w("#file-viewer"),fileViewerPath:w("#file-viewer-path"),fileViewerClose:w("#file-viewer-close"),fileViewerNotice:w("#file-viewer-notice"),fileViewerContent:w("#file-viewer-content"),planPanel:w("#plan-panel"),inputArea:w("#input-area"),modePill:w("#mode-pill"),statusBar:w("#status-bar")};function b(e){c.input.value=e,c.input.dispatchEvent(new window.Event("input",{bubbles:!0}))}var r={eventSource:null,clientId:null,taskId:null,taskSwitchGen:0,messageNavigationGen:0,pendingNavigationTaskId:null,pendingNavigationEvents:[],runtimeHydrationTaskId:null,taskCwd:null,taskCwdDisplay:null,taskTitle:null,contextUsage:null,inboxCount:0,awaitingNewTask:!1,newTaskRequestInFlight:!1,pendingNewTaskOpId:null,_newTaskRecoveryTimer:null,configOptions:[],agentCommands:[],agentCommandsEpoch:null,agentCommandsRevision:0,taskMode:null,taskModel: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,sentMessageForTask:null,sentMessageOpId:null,awaitingOwnUserEcho:!1,replayedOwnUserEcho:!1,reconcileAfterOwnUserEcho:!1,sentBashForTask: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},Ti={disconnected:"is-disconnected",connecting:"is-connecting",connected:"is-connected"};function de(e,t=e){c.status.textContent="",c.status.className=`status-dot ${Ti[e]}`,c.status.dataset.state=e,c.status.setAttribute("aria-label",t),c.status.setAttribute("title",t)}function At(e){let t=Math.max(0,Math.trunc(e));r.inboxCount=t,c.inboxCount.hidden=t===0,c.inboxCount.textContent=t===0?"":`(${t>9?"9+":t})`;let n=t===0?"Inbox, no pending messages":`Inbox, ${t} pending ${t===1?"message":"messages"}`;c.inboxBtn.setAttribute("aria-label",n),c.inboxBtn.title=t===0?"Open inbox":`${n}. Open inbox`}function wn(e){return r.configOptions.find(t=>t.id===e)}function D(e){let t=wn(e);return t&&"options"in t?t:null}function Je(){let e=D("reasoning_effort")??D("thought_level");return e||(r.configOptions.find(n=>n.category==="thought_level"&&"options"in n)??null)}function vn(e){return wn(e)?.currentValue??null}function ts(e){let t=vn(e);return typeof t=="string"?t:null}function ns(e,t){let n=wn(e);n&&("options"in n&&typeof t=="string"||n.type==="boolean"&&typeof t=="boolean")&&(n.currentValue=t)}function Xe(e){r.configOptions=e,e.length>0&&rs(),C(),H()}function bi(e){r.configOptions.length>0||(r.taskMode=e.task.mode??null,r.taskModel=e.task.model??null)}function rs(){r.taskMode=null,r.taskModel=null}function ss(e){return e==="mode"?r.taskMode:r.taskModel}function C(){if(c.inputArea.classList.remove("plan-mode","autopilot-mode","preview-mode"),r.previewToken){c.inputArea.classList.add("preview-mode"),c.input.placeholder="publish or cancel",c.modePill.textContent="preview",ne();return}c.input.placeholder="Message or ?";let e=ts("mode")||ss("mode")||"";$r(e)?c.inputArea.classList.add("plan-mode"):Rr(e)&&c.inputArea.classList.add("autopilot-mode"),c.modePill.textContent=_r(e)?Or(e):"",ne()}function Jr(e){return e<1e3?String(e):e<1e4?`${Xr(e/1e3,1)}k`:e<1e6?`${Math.round(e/1e3)}k`:`${Xr(e/1e6,2)}m`}function Xr(e,t){return e.toFixed(t).replace(/\.?0+$/,"")}function Si(e){let t=e.indexOf("/");return t===-1?e:e.slice(t+1)}function Ii(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 H(){let e=ts("model")||ss("model"),t=r.taskCwdDisplay??r.taskCwd??"",n=[];if(e&&n.push({text:Si(e),className:"status-model",title:e}),r.contextUsage){let{used:s,size:a}=r.contextUsage;n.push({text:`${Jr(s)}/${Jr(a)}`,className:"status-usage",title:`${s.toLocaleString("en-US")} / ${a.toLocaleString("en-US")} tokens`})}t&&n.push({text:t,className:"status-cwd",title:t}),c.statusBar.textContent="",n.forEach((s,a)=>{if(a>0){let l=document.createElement("span");l.className="status-separator",l.textContent="\xA0\xB7\xA0",c.statusBar.appendChild(l)}let i=document.createElement("span");if(i.className=s.className,s.className==="status-cwd"){let l=Ii(s.text);if(l.prefix){let u=document.createElement("span");u.className="status-cwd-prefix",u.textContent=l.prefix,i.appendChild(u)}let d=document.createElement("span");d.className="status-cwd-tail",d.textContent=l.tail,i.appendChild(d)}else i.textContent=s.text;s.title&&(i.title=s.title),c.statusBar.appendChild(i)})}var as=()=>{};function is(e){as=e}function os(e){r.plan=e?.map(t=>({...t}))??null,as(r.plan)}function Ei(e){r.lastStateSeq=e.seq;let t=e.runtime.busy;t?.promptId&&(r.currentPromptId=t.promptId),r.busyKind=t?.kind??null,r.cancelStatus=t?.cancelStatus??null,v(t!=null),t==null&&ue(),os(e.runtime.plan??null),r.contextUsage=e.runtime.contextUsage?{...e.runtime.contextUsage}:null,r.taskCwdDisplay=e.task.cwdDisplay??e.task.cwd,$e(e.agentCommands??{epoch:"",revision:0,commands:[]}),bi(e),C(),H()}function $e(e){return e.epoch===r.agentCommandsEpoch&&e.revision<r.agentCommandsRevision?!1:(r.agentCommandsEpoch=e.epoch,r.agentCommandsRevision=e.revision,r.agentCommands=e.commands.slice(),!0)}function Tn(e){if(e.seq!==r.lastStateSeq+1)return!1;r.lastStateSeq=e.seq;let t=e.patch.runtime;if(t&&"busy"in t){let n=t.busy??null;n?.promptId&&(r.currentPromptId=n.promptId),r.busyKind=n?.kind??null,r.cancelStatus=n?.cancelStatus??null,v(n!=null),n==null&&ue()}return t&&"plan"in t&&os(t.plan??null),t&&"contextUsage"in t&&(r.contextUsage=t.contextUsage?{...t.contextUsage}:null,H()),!0}async function ls(e,t){let n=await cs(e,t);return n.status==="applied"?n.snapshot:null}async function cs(e,t){let n=r.taskSwitchGen,s=r.lastStateSeq;try{let a=await Vr(e);return r.taskSwitchGen!==n||t&&!t()?{status:"stale"}:r.lastStateSeq!==s||a.seq<r.lastStateSeq?{status:"superseded"}:(Ei(a),{status:"applied",snapshot:a})}catch{return{status:"failed"}}}function xi(e){let t=r.pendingNavigationEvents.filter(n=>n.type==="state_patch"&&n.taskId===e).sort((n,s)=>n.seq-s.seq);return r.pendingNavigationEvents=r.pendingNavigationEvents.filter(n=>n.type!=="state_patch"||n.taskId!==e),t}function Ci(e){r.pendingNavigationEvents=r.pendingNavigationEvents.filter(t=>t.type!=="state_patch"||t.taskId!==e)}var Qr=0;function Zr(e){for(let t of xi(e))if(!(t.seq<=r.lastStateSeq)&&!Tn({seq:t.seq,patch:t.patch}))return!1;return!0}var ds=()=>{};function us(e){ds=e}function es(){return ds(),!0}async function U(e,t){let n=++Qr;r.runtimeHydrationTaskId=e;try{for(let s=0;s<3;s++){let a=await cs(e,t);if(a.status==="stale")return!1;if(a.status==="superseded"){if(Zr(e))return es();continue}if(a.status!=="failed"&&Zr(e))return es()}return!1}finally{n===Qr?r.runtimeHydrationTaskId=null:r.runtimeHydrationTaskId!==e&&Ci(e)}}function v(e){r.busy=e,e||(r.busyKind=null,r.cancelStatus=null),e?c.prompt.classList.add("busy"):c.prompt.classList.remove("busy"),ne()}function Mt({cwd:e,inheritFromTaskId:t=r.taskId,parentId:n=r.taskId}={}){ps({cwd:e,inheritFromTaskId:t,parentId:n})}function Re(){ps({bootstrap:!0,inheritFromTaskId:null})}async function ps({cwd:e,inheritFromTaskId:t=r.taskId,parentId:n=r.taskId,bootstrap:s=!1}={}){if(r.newTaskRequestInFlight||r.pendingNewTaskOpId)return!1;Li(),r.taskSwitchGen++,r.messageNavigationGen++;let a=r.taskSwitchGen;r.pendingNavigationTaskId=null,r.pendingNavigationEvents=[],r.runtimeHydrationTaskId=null,r.awaitingNewTask=!0,r.newTaskRequestInFlight=!0;let i=te();r.pendingNewTaskOpId=i;try{let l=s?await Dr(i):await vt({cwd:e,inheritFromTaskId:t,parentId:n},i);if(r.newTaskRequestInFlight=!1,a!==r.taskSwitchGen)return r.pendingNewTaskOpId===i&&Te(),!1;if(typeof l.id!="string")throw new Error("Task create response is missing an id");return Pt.delete(i),Te(),fs(l),!0}catch{return Pt.delete(i)?!0:a===r.taskSwitchGen&&r.pendingNewTaskOpId===i?await new Promise(l=>{Ne.set(i,l),r._newTaskRecoveryTimer=setTimeout(()=>{Ne.delete(i),r.pendingNewTaskOpId===i&&(r.pendingNewTaskOpId=null,a===r.taskSwitchGen&&(r.awaitingNewTask=!1)),r._newTaskRecoveryTimer=null,l(!1)},3e3)}):!1}finally{r.newTaskRequestInFlight=!1,a!==r.taskSwitchGen&&r.pendingNewTaskOpId===i&&Te()}}var Pt=new Set,Ne=new Map;function Te(e){if(e){let t=Ne.get(e);t?(Ne.delete(e),t(!0)):Pt.add(e)}else{Pt.clear();for(let t of Ne.values())t(!1);Ne.clear()}r._newTaskRecoveryTimer!=null&&(clearTimeout(r._newTaskRecoveryTimer),r._newTaskRecoveryTimer=null),r.pendingNewTaskOpId=null,r.newTaskRequestInFlight=!1}var fs=()=>{};function ms(e){fs=e}var gs=()=>{};function hs(e){gs=e}function Li(){gs()}var ys=[];function Qe(e){ys.push(e)}var ks=()=>{};function ws(e){ks=e}function ne(){ks()}function N({preserveNavigationTarget:e=!1}={}){for(let t of ys)t();c.messages.innerHTML="",r.assistantRafToken!=null&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(r.assistantRafToken),r.assistantRafToken=null),r.currentAssistantEl=null,r.currentAssistantText="",r.pendingFinalAnswerToolText=null,r.currentThinkingEl=null,r.currentThinkingText="",r.busyKind=null,r.cancelStatus=null,r.plan=null,r.pendingAttachments.length=0,r.followMessages=!0,r.pendingToolCallIds.clear(),r.pendingPermissionRequestIds.clear(),r.pendingPromptDone=!1,r.turnEnded=!1,r.currentPromptId=null,r.newTurnStarted=!1,r.sentMessageOpId=null,r.awaitingOwnUserEcho=!1,r.replayedOwnUserEcho=!1,r.reconcileAfterOwnUserEcho=!1,r._cancelTimerId!=null&&clearTimeout(r._cancelTimerId),r._cancelTimerId=null,r.lastEventSeq=0,r.lastStateSeq=0,r.pendingNavigationEvents=[],r.oldestLoadedSeq=0,r.hasMoreHistory=!1,r.loadingOlderEvents=!1,r.replayInProgress=!1,r.replayQueue=[],e||(r.pendingNavigationTaskId=null),r.previewToken=null,c.attachPreview.innerHTML="",c.attachPreview.classList.remove("active"),c.input.disabled=!1,c.sendBtn.disabled=!1,C(),v(!1),r.taskTitle=null,r.taskCwd=null,r.taskCwdDisplay=null,r.contextUsage=null,r.configOptions=[],r.agentCommands=[],r.agentCommandsEpoch=null,r.agentCommandsRevision=0,rs(),Oe(null,null),c.statusBar.textContent=""}async function Nt(e={}){if(!r.busy&&!e.force||!r.taskId)return null;let t=r.taskId,n=r.lastStateSeq;r.cancelStatus="requested",ne();try{let s=await Wr(t);return r.taskId===t&&r.lastStateSeq===n&&(s.status==="idle"||s.status==="cancelled"?v(!1):s.status==="superseded"&&(r.cancelStatus=null,ne())),s}catch(s){throw r.taskId===t&&r.lastStateSeq===n&&(r.cancelStatus=null,ne()),s}}function ue(){r._cancelTimerId!=null&&(clearTimeout(r._cancelTimerId),r._cancelTimerId=null)}function vs(){return location.hash.slice(1)||null}function _e(e){if(e==="root"){let t=new URL(location.href);t.hash="",history.replaceState(null,"",`${t.pathname}${t.search}`);return}history.replaceState(null,"",`#${e}`)}function Oe(e,t){c.taskInfo.textContent=t??(e?e.slice(0,8)+"\u2026":""),document.title=t??">_"}de("disconnected");function Rt(e,t){let n=document.createElement("div");return n.className=`msg ${e}`,e==="user"?n.innerHTML=j(t).replace(/\n/g,"<br>"):e==="assistant"?q(n,t,r.pendingFinalAnswerToolText??void 0):ke(n,t),E(n),n}function Ze({title:e,body:t}){let n=t!==void 0&&t.length>0,s=document.createElement(n?"details":"div");if(s.className=`system-msg${n?" expandable":""}`,n){let a=document.createElement("summary");a.textContent=e;let i=document.createElement("div");i.className="system-msg-body",i.textContent=t,s.append(a,i)}else s.textContent=e;return E(s),s}function o(e){return Ze({title:e})}function L(){let e=r.currentAssistantEl,t=r.currentAssistantText,n=e instanceof HTMLElement&&e.dataset.assistantDisplay==="final-answer"||r.pendingFinalAnswerToolText!==null,s=r.assistantRafToken,a=s!=null;r.currentAssistantEl=null,r.currentAssistantText="",a&&(typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(s),r.assistantRafToken=null),e&&(a||n)&&q(e,t,r.pendingFinalAnswerToolText??void 0,!0),r.pendingFinalAnswerToolText=null,e&&typeof e.querySelector=="function"&&(e.removeAttribute("data-primed"),O(e),Z(e))}function Ts(){if(r.assistantRafToken==null)return;typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(r.assistantRafToken),r.assistantRafToken=null;let e=r.currentAssistantEl;e&&q(e,r.currentAssistantText,r.pendingFinalAnswerToolText??void 0)}function x(){if(r.currentThinkingEl){let e=r.currentThinkingEl.querySelector("summary");e.textContent="\u283F thought",e.classList.remove("active"),e.style.animation="none",r.currentThinkingEl.removeAttribute("data-primed"),r.currentThinkingEl=null,r.currentThinkingText=""}}var be=null,Pi=80;function et(e){return e.scrollHeight-e.scrollTop-e.clientHeight<Pi}function Ai(){r.followMessages=et(c.messages)}c.messages.addEventListener("scroll",Ai);function bs(){return r.followMessages||et(c.messages)}function E(e,t=!1){if(r.replayTarget)return r.replayTarget.appendChild(e),e;let n=t||bs();return c.messages.appendChild(e),S(n),e}function Ss(){z(),be=document.createElement("div"),be.id="waiting",be.innerHTML='<span class="cursor">\u258C</span>',E(be,!0)}function z(){be&&(be.remove(),be=null)}var bn=!1,$t=!1;function Sn(e){let t=c.messages;if(e||r.followMessages){t.clientHeight,t.scrollTop=t.scrollHeight,r.followMessages=!0;return}r.followMessages=et(t)}function Mi(e){if(!(e||r.followMessages)){r.followMessages=et(c.messages);return}Sn(!0),!(typeof requestAnimationFrame!="function"||$t)&&($t=!0,requestAnimationFrame(()=>{if(!r.followMessages){$t=!1;return}Sn(!0),requestAnimationFrame(()=>{$t=!1,r.followMessages&&Sn(!0)})}))}function Is(e){let t=bs();e(),t&&Mi(!0)}function S(e){let t=c.messages;if(e||r.followMessages){typeof requestAnimationFrame=="function"?bn||(bn=!0,requestAnimationFrame(()=>{bn=!1,t.scrollTop=t.scrollHeight})):t.scrollTop=t.scrollHeight,r.followMessages=!0;return}r.followMessages=et(t)}function $(e){if(e==null||e==="")return"";let t;if(typeof e=="number")t=new Date(e);else{let s=String(e);t=new Date(s.endsWith("Z")||/[+-]\d{2}:?\d{2}$/.test(s)?s:s+"Z")}if(isNaN(t.getTime()))return"";let n=s=>String(s).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function Es(e,t=!1){let n=document.createElement("div");return n.className="bash-block",n.innerHTML=`<span class="bash-cmd${t?" running":""}">${j(e)}</span><div class="bash-output"></div>`,n.querySelector(".bash-cmd").addEventListener("click",()=>{let s=n.querySelector(".bash-output");s.style.display==="none"?s.style.display="block":s.classList.contains("has-content")&&(s.style.display="none")}),E(n),t&&(r.currentBashEl=n),n}function qe(e,t,n){if(!e)return;let s=e.querySelector(".bash-cmd");s.classList.remove("running");let a="";if(n?a=`[signal: ${n}]`:t!==0&&t!=null&&(a=`[exit: ${t}]`),a){let i=document.createElement("span");i.className=`bash-exit ${t===0?"ok":"fail"}`,i.textContent=a,s.after(i)}e===r.currentBashEl&&(r.currentBashEl=null)}function In(e,t){let n=e.replace(/^\s+/,"");if(n==="")return{node:t,pathPrefix:"",tailQuery:""};let s=/\s$/.test(n),a=n.split(/\s+/).filter(m=>m.length>0),i=s?a:a.slice(0,-1),l=s?"":a[a.length-1]??"",d=t,u="",p=0;for(let m of i){let g=d.children?.find(y=>y.name===m);if(!g)break;u=u?`${u} ${g.name}`:g.name,d=g,p++}let h=i.slice(p);l&&h.push(l);let f=h.join(" ");return{node:d,pathPrefix:u,tailQuery:f}}function xs(e,t,n){let s=[],a=t.trim().toLowerCase(),i=[];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(a&&!g.name.toLowerCase().includes(a))continue;let W=(g.children?.length??0)>0||g.fetch||g.freeform;i.push({spec:{primary:g.name,secondary:g.desc},prefix:W?"\u203A":"",kind:"subcommand",node:g})}}s.push(...i);let l=[],d="none",u="";if(e.fetch&&e.toSpec){if(n==="loading")d="loading";else if(n&&typeof n=="object"&&!Array.isArray(n)&&"error"in n)d="error",u=typeof n.error=="string"?n.error:"";else if(Array.isArray(n))if(n.length===0)d="empty";else{let g=(a?n.filter(y=>e.matches?e.matches(y,a):e.toSpec(y).primary.toLowerCase().includes(a)):n).map(y=>e.toSpec(y));g.length===0?d="no-match":(d="ok",l=g)}}let p=null;if(e.freeform){let m=t.trim();if(!(m.length>0&&l.some(y=>y.primary.toLowerCase()===m.toLowerCase()))){let y=e.freeform(t);y&&(p={spec:y,prefix:"\u21B5",kind:"freeform"},s.push(p))}}if(p&&(d==="empty"||d==="no-match")&&(d="none"),(i.length>0||p!==null)&&d!=="none"&&s.push({spec:{primary:""},prefix:"",kind:"separator"}),d==="loading")s.push({spec:{primary:"(loading...)"},prefix:"",kind:"placeholder"});else if(d==="error")s.push({spec:{primary:`(${u||"error"})`},prefix:"",kind:"placeholder"});else if(d==="empty")s.push({spec:{primary:"(none)"},prefix:"",kind:"placeholder"});else if(d==="no-match")s.push({spec:{primary:"(no match)"},prefix:"",kind:"placeholder"});else if(d==="ok")for(let m of l)s.push({spec:m,prefix:m.current?"*":"",kind:"data"});return s}function Cs(e,t,n){let s=document.createElement("div");s.className="slash-item"+(t?" selected":"");let a=e.path!==void 0,i=document.createElement("div");i.className="slash-row-l1";let l=document.createElement("span");l.className="slash-prefix",l.textContent=n,i.appendChild(l);let d=document.createElement("span");d.className="slash-primary"+(e.current?" slash-current":""),d.textContent=e.primary,i.appendChild(d);let u=t&&e.selectedSecondary!==void 0?e.selectedSecondary:e.secondary;if(u!==void 0){let p=document.createElement("span");p.className="slash-secondary",p.textContent=u,i.appendChild(p)}if(s.appendChild(i),a){let p=document.createElement("div");p.className="slash-row-l2";let h=document.createElement("span");if(h.className="slash-path",h.textContent=e.path,p.appendChild(h),e.pathSecondary!==void 0){let f=document.createElement("span");f.className="slash-path-secondary",f.textContent=e.pathSecondary,p.appendChild(f)}s.appendChild(p)}return s}var xn={debug:0,info:1,warn:2,error:3,off:99},tt=new Set(["off","debug","info","warn","error"]),Ls=4096;function Ps(e){try{let t=new WeakSet,n=JSON.stringify(e,(s,a)=>{if(a instanceof Error)return{name:a.name,message:a.message,stack:a.stack};if(typeof a=="function")return`[Function ${a.name??"anonymous"}]`;if(typeof a=="bigint")return a.toString()+"n";if(typeof a=="symbol")return a.toString();if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a});return typeof n!="string"?String(e):n.length>Ls?n.slice(0,Ls)+`\u2026(truncated, ${n.length} bytes)`:n}catch{try{return String(e)}catch{return"[unserializable]"}}}function En(e){return e<10?"0"+e:String(e)}function Ni(e){return e<10?"00"+e:e<100?"0"+e:String(e)}function As(e){let t=new Date(e);return`${En(t.getHours())}:${En(t.getMinutes())}:${En(t.getSeconds())}.${Ni(t.getMilliseconds())}`}var Ln="off",Ms="default",Ns,Cn=null;function _t(e,t="runtime"){tt.has(e)&&(Ln=e,Ms=t)}function Pn(){return Ln}function $s(){return Ms}function Ot(e){Ns=e;let t=Os(e);_t(t.level,t.source)}function Rs(e){Cn=e}function _s(e){try{let n=new URL(e).searchParams.get("debug");return n===null||!tt.has(n)?null:n}catch{return null}}function $i(){return typeof location>"u"?null:_s(location.href)}function Ri(){if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(yt);return!e||!tt.has(e)?null:e}catch{return null}}function Os(e,t=typeof location>"u"?null:location.href){let n=t?_s(t):null;if(n)return{level:n,source:"url"};let s=Ri();return s?{level:s,source:"local"}:e&&tt.has(e)?{level:e,source:"config"}:{level:"off",source:"default"}}function qs(e){typeof localStorage<"u"&&localStorage.setItem(yt,e);let t={level:e,source:"local"};return _t(e,"local"),t}function Ds(){typeof localStorage<"u"&&localStorage.removeItem(yt);let e=Os(Ns);return _t(e.level,e.source),e}function Bs(e){let t=(n,s,a)=>{if(xn[n]<xn[Ln])return;let i=e?`[${e}] `:"";try{let l=console[n];a!==void 0?l(i+s,a):l(i+s)}catch{}if(Cn)try{let l=As(Date.now()),d=e?` [${e}]`:"",u=a!==void 0?" "+Ps(a):"";Cn(`${l}${d} ${n.toUpperCase()} ${s}${u}`)}catch{}};return{debug:(n,s)=>{t("debug",n,s)},info:(n,s)=>{t("info",n,s)},warn:(n,s)=>{t("warn",n,s)},error:(n,s)=>{t("error",n,s)},scope:n=>Bs(e?`${e}.${n}`:n)}}var T=Bs();{let e=$i();e&&_t(e)}if(typeof window<"u"){let e=T.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 n=t.reason;e.error("unhandled rejection",{reason:n instanceof Error?{name:n.name,message:n.message,stack:n.stack}:n})})}function De(e){return/[\s"'\\]/.test(e)||e===""?`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:e}function An(e){return`@${De(e)}`}var pe=null,re=!1,nt=!1;function Mn(){if(c.planPanel.replaceChildren(),!pe||re){c.planPanel.hidden=!0,c.planPanel.open=!1;return}let e=Cr(pe,{className:"plan-panel-content",open:!0});c.planPanel.append(...e.childNodes),c.planPanel.hidden=!1,c.planPanel.open=nt}function _i(e){if(e.length===0||e.every(t=>t.status==="completed")){Nn();return}pe||(re=!1),pe=e,Mn()}function Nn(){pe=null,re=!1,nt=!1,Mn()}function qt(e){return pe?(e==="show"?re=!1:e==="hide"?(re=!0,nt=!1):(re=!re,re&&(nt=!1)),Mn(),!0):!1}function Fs(){return pe!==null}function Hs(){return pe!==null&&!re}c.planPanel.addEventListener("click",e=>{let t=e.target;!(t instanceof HTMLElement)||!t.closest(".plan-summary")||(nt=!c.planPanel.open)});Qe(Nn);is(e=>{e?_i(e):Nn()});var Dt=class{entries=new Map;ttlMs;maxIds;maxEntryBytes;maxTotalBytes;now;onExpire;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()),this.onExpire=t.onExpire}put(t,n){let s=this.now();this.prune(s);let a=this.entries.get(t.id),i=!a||n===void 0||a.sequence===null||n>=a.sequence,l=a?i?{...a.update,...t}:{...t,...a.update}:t,d=i?n??a?.sequence??null:a.sequence;this.drop(t.id);let u=this.serializedBytes(l);if(!(u===null||u>this.maxEntryBytes)){for(;this.entries.size>=this.maxIds||this.totalBytes+u>this.maxTotalBytes;){let p=this.entries.keys().next();if(p.done)break;this.drop(p.value)}this.entries.set(t.id,{update:l,sequence:d,expiresAt:s+this.ttlMs,bytes:u}),this.totalBytes+=u}}take(t){this.prune(this.now());let n=this.entries.get(t);return n?(this.drop(t),n.update):null}has(t){return this.prune(this.now()),this.entries.has(t)}clear(){this.entries.clear(),this.totalBytes=0}prune(t){for(let[n,s]of this.entries)s.expiresAt<=t&&(this.onExpire?.(n,s.update),this.drop(n))}drop(t){let n=this.entries.get(t);n&&(this.totalBytes-=n.bytes,this.entries.delete(t))}serializedBytes(t){try{return new TextEncoder().encode(JSON.stringify(t)).byteLength}catch{return null}}};var Se=new Dt({onExpire:(e,t)=>{T.warn("tool update buffered but never recovered: host missing for the whole TTL",{id:e,status:t.status,taskId:t.taskId})}});hs(()=>{jt++,me++,r.replayInProgress=!1,r.replayQueue=[]});ms(e=>{typeof e.id=="string"&&J({type:"task_created",taskId: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})});var Bt=new Map,Ft=new Map,Oi=3e4;function Y(e,t,n,s){let a=Date.now();for(let[u,p]of Ft)p<=a&&Ft.delete(u);let i=s??`${e??""}\0${n??""}`;if(s&&Ft.has(i))return Promise.resolve();let l=Bt.get(i);if(l)return l;let d=qi(e,n).finally(()=>{Bt.get(i)===d&&Bt.delete(i),s&&Ft.set(i,Date.now()+Oi)});return Bt.set(i,d),d}async function qi(e,t){r.taskSwitchGen++;let n=r.taskSwitchGen;try{let s=await G();if(n!==r.taskSwitchGen)return;let a=(t?s.find(i=>i.id===t):void 0)??s.find(i=>i.id!==e);if(a){N(),r.taskId=a.id,_e(a.id);let[i,l]=await Promise.all([ve(a.id),st(a.id)]);if(n!==r.taskSwitchGen)return;let d=await U(a.id,()=>n===r.taskSwitchGen);if(n!==r.taskSwitchGen)return;if(!d)throw new Error("Failed to hydrate fallback task");J({type:"task_created",taskId:i.id,cwd:i.cwd,cwdDisplay:i.cwdDisplay,title:i.title,configOptions:i.configOptions}),l&&S(!0);return}}catch{}n===r.taskSwitchGen&&(N(),r.taskId=null,Re())}function Rn(e){return r.replayTarget?.querySelector(`[id="${e}"]`)??document.getElementById(e)}function Di(e){return r.replayTarget?.querySelector(e)??document.querySelector(e)}function Js(e){e.querySelectorAll(".plan[open]").forEach(t=>{t.open=!1})}function Us(e){(typeof navigator<"u"?navigator.serviceWorker:void 0)?.controller?.postMessage({type:"close-notification",tag:e})}function Bi(){if(typeof Notification>"u"||r.replayInProgress)return;let e=Notification.permission;if(e!=="granted"){if(e==="denied"){if(localStorage.getItem(gn))return;localStorage.setItem(gn,"1"),o("tip: notifications are blocked \u2014 allow in browser site settings to enable");return}localStorage.getItem(mn)||(localStorage.setItem(mn,"1"),o("tip: use /notify to enable background notifications"))}}function Ht(){xr(r.pendingPromptDone,r.pendingToolCallIds.size,r.pendingPermissionRequestIds.size)&&(z(),x(),L(),r.busyKind!=="bash"&&v(!1),r.pendingPromptDone=!1,Bi())}function Fi(){for(let e of r.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call failed";let n=t.querySelector(".icon");n&&(n.textContent="\u2717")}for(let e of r.pendingPermissionRequestIds){let t=document.querySelector(`.permission[data-request-id="${e}"]`);if(!t?.querySelector("button"))continue;let s=t.querySelector(".title")?.textContent??"\u26BF";t.innerHTML=`<span class="dim">${j(s)} \u2014 cancelled</span>`}r.pendingToolCallIds.clear(),r.pendingPermissionRequestIds.clear()}function Hi(e){let t=(n,s)=>s??(n?n.slice(0,8):"?");return`${An(t(e.sourceTaskId,e.sourceLabel))} sent ${An(t(e.targetTaskId,e.targetLabel))}`}function Xs(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 Ui(){for(let e of r.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call completed";let n=t.querySelector(".icon");n&&(n.textContent="\u2713")}r.pendingToolCallIds.clear(),r.pendingPermissionRequestIds.clear()}function He(){if(!(r.busy&&r.busyKind==="agent")){for(let e of r.pendingToolCallIds){let t=document.getElementById(`tc-${e}`);if(!t)continue;t.className="tool-call completed";let n=t.querySelector(".icon");n&&(n.textContent="\u2713")}r.pendingToolCallIds.clear()}}us(He);var Qs=200;async function st(e){ta();let t=++me;r.replayInProgress=!0,r.replayQueue=[];try{let n=await we(async u=>{let p=await fetch(`/api/v1/tasks/${e}/events?limit=${Qs}`,u?{signal:u}:void 0);return p.ok?await p.json():null});if(!n||t!==me)return!1;let{events:s,streaming:a,hasMore:i}=ht(n),l=document.createDocumentFragment(),d=Bn(s,!0);r.replayTarget=l;for(let u=0;u<s.length;u++){let p=JSON.parse(s[u].data);Fn(s[u].type,p,s,u,d)}return Hn(d,s),r.replayTarget=null,c.messages.style.display="none",c.messages.appendChild(l),c.messages.style.display="",s.length&&(r.lastEventSeq=s[s.length-1].seq,r.oldestLoadedSeq=s[0].seq),r.hasMoreHistory=i===!0,r.hasMoreHistory&&Xi(),Dn(),_n(s,a),!0}catch{return!1}finally{t===me&&(r.replayTarget=null,r.replayInProgress=!1,da(e))}}function _n(e,t){if(r.assistantRafToken!=null&&T.warn("primeStreamingState: assistantRafToken non-null at entry (missing flush upstream)"),t.thinking){let s;if(e.length){if(n(e,"thinking")>n(e,"user_message")){let a=c.messages.querySelectorAll(".thinking");s=a[a.length-1]}}else{let a=c.messages.querySelectorAll(".thinking");s=a[a.length-1]}if(s){r.currentThinkingEl=s,r.currentThinkingText=s.getAttribute("data-raw")??"",s.setAttribute("data-primed","");let a=s.querySelector("summary");a&&(a.textContent="\u283F thinking...",a.classList.add("active"))}}if(t.assistant){let s;if(e.length){if(n(e,"assistant_message")>n(e,"user_message")){let a=c.messages.querySelectorAll(".msg.assistant");s=a[a.length-1]}}else{let a=c.messages.querySelectorAll(".msg.assistant");s=a[a.length-1]}s&&(r.currentAssistantEl=s,r.currentAssistantText=s.getAttribute("data-raw")??"",s.setAttribute("data-primed",""))}function n(s,a){for(let i=s.length-1;i>=0;i--)if(s[i].type===a)return i;return-1}}function Vs(e){if(!e||e.parentNode===c.messages)return;let t=e.dataset.optimisticOpId;t&&Array.from(c.messages.querySelectorAll(".msg.user[data-client-op-id]")).some(s=>s.dataset.clientOpId===t)||c.messages.appendChild(e)}function Dn(){let e=c.messages.querySelector("[data-sync-boundary]");e&&e.removeAttribute("data-sync-boundary");let t=c.messages.lastElementChild;t&&t.setAttribute("data-sync-boundary","")}var Fe=new Map,Ut=!1,Be=!1,rt=null,Vt=0,Zs=Promise.resolve();function ea(e){if(r.taskId!==e)return;if(Ut){Be=!0,rt=e;return}Ut=!0,rt=e;let t=Vt;Zs=(async()=>{do{Be=!1;let n=Fe.has(e);await Ee(e,{preserveLiveOnEmpty:!0}),n&&(Be=!0)}while(t===Vt&&Be&&rt===r.taskId)})().finally(()=>{t===Vt&&(Ut=!1,Be=!1,rt=null)})}function Ee(e,t={}){let n=Fe.get(e);if(n)return t.preserveLiveOnEmpty&&(n.preserveLiveOnEmpty=!0),n.promise;let s={promise:Promise.resolve(!1),preserveLiveOnEmpty:t.preserveLiveOnEmpty===!0},a=Vi(e,s);return s.promise=a,Fe.set(e,s),a.finally(()=>{Fe.get(e)===s&&Fe.delete(e)}).catch(()=>{}),a}async function Vi(e,t){let n=++me;r.replayInProgress=!0,r.replayQueue=[],Ts();try{let s=`/api/v1/tasks/${e}/events?after=${r.lastEventSeq}`,a=await we(async g=>{let y=await fetch(s,g?{signal:g}:void 0);return y.ok?await y.json():null});if(!a||n!==me||r.taskId&&r.taskId!==e)return!1;let{events:i,streaming:l}=ht(a);if(t.preserveLiveOnEmpty&&i.length===0)return!0;for(let g of c.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(),q(g,y,void 0,!0),O(g);else if(g.classList.contains("thinking")){let W=g.querySelector(".thinking-content");W&&(W.textContent=y);let K=g.querySelector("summary");K&&(K.textContent="\u283F thought",K.classList.remove("active"),K.style.animation="none")}}let d=null;if(r.awaitingOwnUserEcho&&r.sentMessageOpId)for(let g of c.messages.querySelectorAll("[data-optimistic-op-id]"))g.dataset.optimisticOpId===r.sentMessageOpId&&(d=g);let u=c.messages.querySelector("[data-sync-boundary]");if(u)for(;u.nextElementSibling;)u.nextElementSibling.remove();if(r.currentAssistantEl&&Z(r.currentAssistantEl),r.currentAssistantEl=null,r.currentAssistantText="",r.pendingFinalAnswerToolText=null,r.currentThinkingEl=null,r.currentThinkingText="",r.currentBashEl=null,i.length===0)return _n(i,l),Vs(d),!0;!u&&r.lastEventSeq===0&&c.messages.replaceChildren();let p=document.createDocumentFragment(),h=Bn(i,!0);r.replayTarget=p;for(let g=0;g<i.length;g++){let y=JSON.parse(i[g].data);Fn(i[g].type,y,i,g,h)}Hn(h,i),r.replayTarget=null;let f=c.messages.lastElementChild,m=p.firstElementChild;if(f&&m&&ca(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")??"",W=g+y;f.setAttribute("data-raw",W),Z(f),f.replaceChildren(),q(f,W,void 0,!0),O(f);let K=m.dataset.lastEventSeq;K?f.dataset.lastEventSeq=K: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")??"",W=g+y;f.setAttribute("data-raw",W);let K=f.querySelector(".thinking-content");K&&(K.textContent=W);let Tr=m.dataset.lastEventSeq;Tr?f.dataset.lastEventSeq=Tr:delete f.dataset.lastEventSeq,m.remove()}}return c.messages.appendChild(p),r.lastEventSeq=i[i.length-1].seq,Dn(),_n(i,l),Vs(d),!0}catch{return!1}finally{n===me&&(r.replayTarget=null,r.replayInProgress=!1,da(e))}}var Ie=null,jt=0,me=0;function ta(){jt++}function On(e,t){return t===jt&&r.taskId===e}function Wt(){return typeof requestAnimationFrame!="function"?Promise.resolve():new Promise(e=>requestAnimationFrame(()=>{e()}))}function na(e){let t=e.getBoundingClientRect();for(let s of Array.from(e.children)){if(!(s instanceof HTMLElement)||s.id==="history-sentinel"||s.id==="history-loading")continue;let a=s.getBoundingClientRect();if(a.bottom>=t.top&&a.top<=t.bottom)return{el:s,top:a.top}}let n=Array.from(e.children).find(s=>s instanceof HTMLElement&&s.id!=="history-sentinel"&&s.id!=="history-loading");return n?{el:n,top:n.getBoundingClientRect().top}:null}function ra(e,t){if(!t?.el.isConnected)return 0;let n=sa(t);return n!==0&&(e.scrollTop+=n),n}function sa(e){return e?.el.isConnected?e.el.getBoundingClientRect().top-e.top:0}function Wi(e,t){let n=Math.abs(t);return n<=4||n>e.clientHeight}function aa(e,t){let n=na(e);return t(),ra(e,n)}function Ki(e,t,n){let s=t.lastElementChild,a=Array.from(e.children).find(i=>i.id!=="history-sentinel"&&i.id!=="history-loading"&&!i.classList.contains("history-loading"));if(!s||!a||a.hasAttribute("data-primed")||a===r.currentAssistantEl||a===r.currentThinkingEl)return{anchor:n,scrollHeightBefore:null};if(n?.el===a){let i=a.nextElementSibling;if(!i){let d=e.scrollHeight;return $n(s,a)?{anchor:null,scrollHeightBefore:d}:{anchor:n,scrollHeightBefore:null}}let l={el:i,top:i.getBoundingClientRect().top};return $n(s,a)?{anchor:l,scrollHeightBefore:null}:{anchor:n,scrollHeightBefore:null}}return $n(s,a),{anchor:n,scrollHeightBefore:null}}async function ji(e){if(!(e.scrollTop>=0)){for(let t=1;t<=20;t++)if(await Wt(),e.scrollTop>=0){await Wt();return}e.scrollTop=0,await Wt()}}async function Gi(e,t){for(let n=1;n<=8;n++){await Wt();let s=sa(t);if(s!==0){if(!Wi(e,s))return;e.scrollTop+=s}}}function Gt(){Ie&&(Ie.disconnect(),Ie=null)}function zt(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(Gt(),Ie=new IntersectionObserver(t=>{t[0].isIntersecting&&!r.loadingOlderEvents&&r.hasMoreHistory&&r.taskId&&eo(r.taskId)},{root:c.messages,rootMargin:"200px 0px 0px 0px"}),Ie.observe(e))}function zi(){let e=document.getElementById("history-sentinel");!e||typeof IntersectionObserver!="function"||(Gt(),Ie=new IntersectionObserver(t=>{t[0].isIntersecting||zt()},{root:c.messages,rootMargin:"200px 0px 0px 0px"}),Ie.observe(e))}function Yi(e=c.messages){document.getElementById("history-loading")||aa(e,()=>{let t=document.createElement("div");t.id="history-loading",t.className="history-loading",t.setAttribute("role","status"),t.textContent="\u2191 loading\u2026";let n=document.getElementById("history-sentinel");n?n.after(t):e.prepend(t)})}function qn(e=c.messages){let t=document.getElementById("history-loading");t&&aa(e,()=>{t.remove()})}function Ji(e,t){!r.hasMoreHistory||r.taskId!==e||(t?zt():zi())}function Xi(){Kt();let e=document.createElement("div");e.id="history-sentinel",e.className="history-sentinel",e.setAttribute("aria-hidden","true"),c.messages.prepend(e),zt()}function Qi(){!r.hasMoreHistory||!document.getElementById("history-sentinel")||zt()}function Kt({invalidateLoads:e=!0}={}){e&&ta(),Gt(),qn(),document.getElementById("history-sentinel")?.remove()}async function Zi(e,t){let n=await we(async i=>{let l=await fetch(`/api/v1/tasks/${e}/events?limit=${Qs}&before=${r.oldestLoadedSeq}`,i?{signal:i}:void 0);return l.ok?await l.json():null});if(!On(e,t)||!n)return null;let{events:s,hasMore:a}=ht(n);return{events:s,hasMore:a}}Qe(Kt);Qe(()=>{me++,Fe.clear(),Vt++,Ut=!1,Be=!1,rt=null,Zs=Promise.resolve(),Se.clear()});async function eo(e){if(r.loadingOlderEvents||!r.hasMoreHistory||r.oldestLoadedSeq<=0)return!1;r.loadingOlderEvents=!0;let t=++jt;Gt();let n=c.messages,s=!1;Yi(n);try{let a=await Zi(e,t);if(!a)return!1;let{events:i,hasMore:l}=a;if(await ji(n),!On(e,t))return!1;if(i.length===0)return r.hasMoreHistory=!1,Kt({invalidateLoads:!1}),!0;let d=document.createDocumentFragment(),u=Bn(i,!1);r.replayTarget=d;for(let m=0;m<i.length;m++){let g=JSON.parse(i[m].data);Fn(i[m].type,g,i,m,u)}Hn(u,i),r.replayTarget=null;let p=na(n);qn(n);let h=Ki(n,d,p);p=h.anchor;let f=document.getElementById("history-sentinel");return f?f.after(d):n.prepend(d),h.scrollHeightBefore===null?ra(n,p):n.scrollTop+=n.scrollHeight-h.scrollHeightBefore,r.oldestLoadedSeq=i[0].seq,r.hasMoreHistory=l===!0,r.hasMoreHistory||Kt({invalidateLoads:!1}),await Gi(n,p),s=!0,!0}catch{return!1}finally{On(e,t)&&(qn(n),r.loadingOlderEvents=!1,Ji(e,s))}}function Bn(e,t){let n=new Set;for(let s of e)if(s.type==="permission_response"){let a=JSON.parse(s.data);n.add(a.requestId)}return{toolCalls:new Map,permissions:new Map,resolvedPermissions:n,currentBashEl:null,trackPending:t}}function ia(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 n=e.from_label??e.from_ref,s=e.title?` \xB7 ${j(e.title)}`:"";t.innerHTML=`<summary>\u2709\uFE0E ${j(n)}${s}</summary><div class="message-content"></div>`;let a=t.querySelector(".message-content");a&&ke(a,e.body),E(t),a&&O(a)}function Fn(e,t,n,s,a){let i=t;if(Pr(e)){to(e,i,n,s,a);return}switch(e){case"prompt_done":{let l=Xs(i.stopReason);l&&o(l);break}case"error":o(`err: ${typeof i.message=="string"?i.message:"Unknown agent error"}`);break;case"message":ia(i);break;case"system_message":typeof i.title=="string"&&i.title.trim()&&Ze({title:i.title,body:typeof i.body=="string"?i.body:void 0});break}}function fe(){return{findToolCallEl:e=>document.getElementById(`tc-${e}`),findPermissionEl:e=>document.querySelector(`.permission[data-request-id="${e}"]`),findBashEl:()=>r.currentBashEl,enhanceMarkdown:O,finalAnswerToolText:r.pendingFinalAnswerToolText}}function oa(e,t,n){let s=null,a=n>0?t[n-1]:null;if(a?.type==="tool_call_update"){let i=JSON.parse(a.data);s=fn(i.status??"",i.content)}return{findToolCallEl:i=>e?e.toolCalls.get(i)??null:Rn(`tc-${i}`),findPermissionEl:i=>e?e.permissions.get(i)??null:Di(`.permission[data-request-id="${i}"]`),findBashEl:()=>e?e.currentBashEl:Rn("bash-replay-pending"),isPermissionResolved:i=>e?e.resolvedPermissions.has(i):t.slice(n+1).some(l=>{let d=JSON.parse(l.data);return l.type==="permission_response"&&d.requestId===i}),enhanceMarkdown:O,finalAnswerToolText:s}}function la(e,t,n,s){e.querySelectorAll("button").forEach(i=>{let l=i.dataset.optionId??"",d=i.dataset.optionKind??"",u=i.textContent||"";i.onclick=()=>{Er(d).apiAction==="deny"?jr(r.taskId,t).catch(()=>{}):Kr(r.taskId,t,l).catch(()=>{}),e.innerHTML=`<span class="dim">\u26BF ${j(n)} \u2014 ${j(u)}</span>`,s?.()}})}function Ws(e,t){t&&(e.dataset.firstEventSeq=String(t.seq),e.dataset.lastEventSeq=String(t.seq))}function Ks(e,t){t&&(e.dataset.lastEventSeq=String(t.seq))}function js(e,t,n){if(t<=0||t>=e.length)return!1;let s=e[t-1],a=e[t];return s.type===n&&a.seq===s.seq+1}function ca(e,t){let n=Gs(e.dataset.lastEventSeq),s=Gs(t.dataset.firstEventSeq);return n!==null&&s!==null&&s===n+1}function Gs(e){if(!e||!/^[1-9]\d*$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function $n(e,t){if(!ca(e,t))return!1;if(e.classList.contains("msg")&&e.classList.contains("assistant")&&t.classList.contains("msg")&&t.classList.contains("assistant")){let s=(e.getAttribute("data-raw")??"")+(t.getAttribute("data-raw")??"");Ar(t,e),t.setAttribute("data-raw",s),Z(t),t.replaceChildren(),q(t,s,void 0,!0),O(t)}else if(e.classList.contains("thinking")&&t.classList.contains("thinking")){let s=(e.getAttribute("data-raw")??"")+(t.getAttribute("data-raw")??"");t.setAttribute("data-raw",s);let a=t.querySelector(".thinking-content");a&&(a.textContent=s)}else return!1;let n=e.dataset.firstEventSeq;return n?t.dataset.firstEventSeq=n:delete t.dataset.firstEventSeq,e.remove(),!0}function to(e,t,n,s,a){let i=oa(a,n,s);switch(e){case"assistant_message":{let d=(r.replayTarget??c.messages).lastElementChild,u=t.text??"";if(js(n,s,"assistant_message")&&d?.classList.contains("msg")&&d.classList.contains("assistant")){let f=(d.getAttribute("data-raw")??"")+u;d.setAttribute("data-raw",f),Z(d),d.replaceChildren(),q(d,f,void 0,!0),O(d),Ks(d,n[s]);break}let p=I(e,t,i);p&&(Ws(p,n[s]),E(p));break}case"thinking":{let d=(r.replayTarget??c.messages).lastElementChild,u=t.text??"";if(js(n,s,"thinking")&&d?.classList.contains("thinking")){let h=d.querySelector(".thinking-content");if(h){let m=(d.getAttribute("data-raw")??"")+u;d.setAttribute("data-raw",m),h.textContent=m,Ks(d,n[s]);break}}let p=I(e,t,i);p&&(Ws(p,n[s]),E(p));break}case"tool_call":{let l=t.id,d=I(e,t,i);if(d)if(E(d),a)a.toolCalls.set(l,d),a.trackPending&&r.pendingToolCallIds.add(l);else{let u=Se.take(l);u&&I("tool_call_update",u,i)}break}case"tool_call_update":{let l=t.id;if(i.findToolCallEl(l))I(e,t,i);else{let d=n[s];Se.put({...t,type:"tool_call_update",taskId:d.task_id},d.seq)}(t.status==="completed"||t.status==="failed")&&r.pendingToolCallIds.delete(l);break}case"permission_request":{let l=t.requestId,d=t.title??"",u=I(e,t,i);u&&((i.isPermissionResolved?.(l)??!1)||la(u,l,d),E(u),a&&a.permissions.set(l,u));break}case"bash_command":{let l=I(e,t,i);l&&(a?a.currentBashEl=l:l.id="bash-replay-pending",E(l));break}case"bash_result":{let l=a?a.currentBashEl:Rn("bash-replay-pending");l&&!a&&l.removeAttribute("id"),I(e,t,i),a&&(a.currentBashEl=null);break}case"user_message":case"plan":case"permission_response":{e==="user_message"&&r.awaitingOwnUserEcho&&n[s]?.task_id===r.sentMessageForTask&&t.clientOpId===r.sentMessageOpId&&(r.replayedOwnUserEcho=!0);let l=I(e,t,i);l&&(e==="plan"&&Js(r.replayTarget??c.messages),E(l));break}}}function da(e){let t=r.replayQueue;r.replayQueue=[];for(let n of t){if(no(n,e)){n.type==="user_message"&&!(r.sentMessageForTask===n.taskId&&r.sentMessageOpId===n.clientOpId)&&(r.newTurnStarted=!0,r.turnEnded=!1,r.busyKind!=="bash"&&v(!0));continue}J(n)}if(r.awaitingOwnUserEcho&&r.replayedOwnUserEcho){let n=r.reconcileAfterOwnUserEcho;r.awaitingOwnUserEcho=!1,r.reconcileAfterOwnUserEcho=!1,n&&ea(e)}r.replayedOwnUserEcho=!1}function no(e,t){if("taskId"in e&&e.taskId!==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(n=>n.dataset.clientOpId===e.clientOpId);case"thought_chunk":return!!r.currentThinkingEl;case"message_chunk":return!!r.currentAssistantEl;default:return!1}}function zs(){let e=r.currentAssistantEl;if(!e)return;let t=performance.now();q(e,r.currentAssistantText,r.pendingFinalAnswerToolText??void 0);let n=performance.now(),s=n-t;if(s>8){let i=Lr(),l=u=>Math.round(u*10)/10,d={ms:l(s),len:r.currentAssistantText.length,seq:i.seq,blocks:i.blocks,hits:i.hits,misses:i.misses,fastPath:i.fastPath,lex:{total:l(i.lex),prefix:l(i.lexPrefix),tail:l(i.lexTail),prefixBlocks:i.prefixBlocks,prefixLen:i.prefixLen,tailLen:i.tailLen,mathRelex:i.mathRelex,mathRelexLen:i.mathRelexLen,tailBlocks:i.tailBlocks,tailRawBlocks:i.tailRawBlocks},parse:l(i.parse),sanitize:l(i.sanitize),dom:l(i.dom),subList:i.subList,subTable:i.subTable,defsAbsorbed:i.defsAbsorbed,linkMemoSize:i.linkMemoSize,missDetails:i.missDetails.slice(0,5).map(u=>({type:u.type,len:u.len,snip:u.snip,parseMs:l(u.parseMs),sanMs:l(u.sanMs),domMs:l(u.domMs),path:u.path,...u.items!==void 0?{items:u.items}:{}}))};s>16?T.warn("md-render budget",d):T.debug("md-render slow",d)}S();let a=performance.now();try{performance.measure("doAssistantRender",{start:t,end:a}),performance.measure("scrollToBottom",{start:n,end:a})}catch{}}function ro(){if(r.assistantRafToken==null){if(typeof requestAnimationFrame!="function"){zs();return}r.assistantRafToken=requestAnimationFrame(()=>{r.assistantRafToken=null,zs()})}}function Hn(e,t){let n=oa(e,t,t.length);for(let s of e.toolCalls.keys()){let a=Se.take(s);a&&(I("tool_call_update",a,n),(a.status==="completed"||a.status==="failed")&&r.pendingToolCallIds.delete(s))}}function Ys(e,t){(e.status==="completed"||e.status==="failed")&&r.pendingToolCallIds.delete(e.id),e.status==="completed"&&(r.pendingFinalAnswerToolText=fn(e.status,e.content),r.currentAssistantEl&&r.pendingFinalAnswerToolText&&q(r.currentAssistantEl,r.currentAssistantText,r.pendingFinalAnswerToolText)),I("tool_call_update",e,t),Ht(),S()}function Yt(e){let t=r.pendingNavigationEvents.filter(n=>"taskId"in n&&n.taskId===e);r.pendingNavigationEvents=r.pendingNavigationEvents.filter(n=>!("taskId"in n)||n.taskId!==e);for(let n of t)J(n)}function J(e){if(e.type==="inbox_count_changed"){At(e.pendingCount);return}if(r.replayInProgress){r.replayQueue.push(e);return}let t="taskId"in e?e.taskId:void 0;if(e.type==="state_patch"&&r.runtimeHydrationTaskId===e.taskId){r.pendingNavigationEvents.push(e);return}if(t&&e.type!=="task_created"&&r.taskId===null&&r.pendingNavigationTaskId===t){r.pendingNavigationEvents.push(e);return}let n="taskId"in e?e.taskId:void 0;if(!(n&&e.type!=="task_created"&&e.type!=="task_deleted"&&(!r.taskId||n!==r.taskId)))switch(e.type){case"connected":if(e.cancelTimeout!=null&&(r.cancelTimeout=e.cancelTimeout),e.recentPathsLimit!=null&&(r.recentPathsLimit=e.recentPathsLimit),Ot(e.debugLevel),r.agentReloading){r.agentReloading=!1;let s=e.agent.name,a=e.agent.version,i=s&&a?`${s} ${a}`:"Agent";o(`${i} reloaded.`),v(!1)}break;case"state_patch":{let s=r.cancelStatus,a=Tn({seq:e.seq,patch:e.patch});if(a&&s!=="unconfirmed"&&r.cancelStatus==="unconfirmed"&&o("Cancel was not acknowledged \u2014 retry ^C or use /reload to restart the agent."),!a&&r.taskId===e.taskId){let i=r.taskId;ls(i,()=>r.taskId===i)}break}case"available_commands_update":$e({epoch:e.epoch??"",revision:e.revision??0,commands:e.commands})&&c.input.dispatchEvent(new window.Event("input",{bubbles:!0}));break;case"task_created":{let s=r.awaitingNewTask&&r.pendingNewTaskOpId===e.clientOpId;if(r.pendingNewTaskOpId&&!s||(s&&Te(e.clientOpId),r.pendingNavigationTaskId&&e.taskId!==r.pendingNavigationTaskId)||!r.awaitingNewTask&&r.taskId&&e.taskId!==r.taskId)break;r.awaitingNewTask=!1,r.pendingNavigationTaskId=null;let a=r.taskId===null;r.taskId=e.taskId,a&&Qi(),r.taskCwd=e.cwd??r.taskCwd,r.taskCwdDisplay=e.cwdDisplay??e.cwd??r.taskCwdDisplay,r.taskTitle=e.title??null,e.agentCommands&&$e(e.agentCommands),e.configOptions&&e.configOptions.length&&Xe(e.configOptions),C(),H(),_e(r.taskId),r.clientId&&Me(r.clientId,!document.hidden,r.taskId).catch(()=>{}),Oe(r.taskId,r.taskTitle),de("connected","connected"),c.input.disabled=!1,c.sendBtn.disabled=!1;{let i=document.getElementById("bash-replay-pending");i?(i.removeAttribute("id"),i.querySelector(".bash-cmd")?.classList.add("running"),r.currentBashEl=i):r.currentBashEl=null}c.messages.children.length===0&&o(`Task created: ${r.taskTitle??e.taskId.slice(0,8)+"\u2026"}`),H();break}case"user_message":{if(r.sentMessageForTask===e.taskId&&r.sentMessageOpId===e.clientOpId){let s=r.reconcileAfterOwnUserEcho;r.sentMessageForTask=null,r.sentMessageOpId=null,r.awaitingOwnUserEcho=!1,r.reconcileAfterOwnUserEcho=!1,s&&ea(e.taskId);break}if(x(),L(),r.newTurnStarted=!0,r.turnEnded=!1,e.taskId===r.taskId){r.busyKind!=="bash"&&v(!0);let s=I("user_message",e,fe());s&&E(s)}break}case"assistant_message":{if(e.seq!=null&&e.seq<=r.lastEventSeq)break;z(),x(),L();let s=I("assistant_message",e,fe());s&&(E(s),e.seq!=null&&(s.dataset.firstEventSeq=String(e.seq),s.dataset.lastEventSeq=String(e.seq),r.lastEventSeq=Math.max(r.lastEventSeq,e.seq),Dn())),S();break}case"message_chunk":z(),x(),r.currentAssistantEl||(r.currentAssistantEl=Rt("assistant",""),r.currentAssistantText=""),r.currentAssistantText+=e.text,ro();break;case"thought_chunk":z(),L(),r.currentThinkingEl||(r.currentThinkingEl=document.createElement("details"),r.currentThinkingEl.className="thinking",r.currentThinkingEl.innerHTML='<summary class="active">\u283F thinking...</summary><div class="thinking-content"></div>',r.currentThinkingText="",E(r.currentThinkingEl)),r.currentThinkingText+=e.text,r.currentThinkingEl.querySelector(".thinking-content").textContent=r.currentThinkingText,S();break;case"tool_call":{r.busy&&r.busyKind!=="bash"&&r.pendingToolCallIds.add(e.id),z(),x(),L();let s=fe(),a=I("tool_call",e,s);a&&E(a);let i=Se.take(e.id);i&&Ys(i,s);break}case"tool_call_update":{let s=fe();if(!s.findToolCallEl(e.id)){let a=!Se.has(e.id);Se.put(e),a&&T.debug("buffering tool update without host",{id:e.id,status:e.status})}Ys(e,s);break}case"plan":{x(),L();let s=I("plan",e,fe());s&&(Js(c.messages),E(s));break}case"permission_request":{if(r.turnEnded||document.querySelector(`.permission[data-request-id="${e.requestId}"]`))break;r.pendingPermissionRequestIds.add(e.requestId),v(!0),x();let s=I("permission_request",e,fe());if(s){let a=e.requestId;la(s,a,e.title,()=>{r.pendingPermissionRequestIds.delete(a),Ht()}),E(s)}break}case"permission_response":{r.pendingPermissionRequestIds.delete(e.requestId),e.taskId===r.taskId&&I("permission_response",e,fe()),Ht();break}case"bash_command":{if(r.sentBashForTask===e.taskId){r.sentBashForTask=null;break}if(e.taskId===r.taskId){let s=I("bash_command",e,fe());s&&(s.querySelector(".bash-cmd").classList.add("running"),E(s),r.currentBashEl=s),v(!0)}break}case"bash_output":{if(e.taskId!==r.taskId)break;if(r.currentBashEl){let s=r.currentBashEl.querySelector(".bash-output");if(!s)break;if(e.stream==="stderr"){let a=document.createElement("span");a.className="stderr",a.textContent=e.text,s.appendChild(a)}else s.appendChild(document.createTextNode(e.text));s.classList.add("has-content"),s.scrollTop=s.scrollHeight,S()}break}case"bash_done":{if(e.taskId!==r.taskId)break;qe(r.currentBashEl,e.code,e.signal),e.error&&o(`err: ${e.error}`),r.busyKind!=="agent"&&v(!1);break}case"prompt_done":{if(ue(),e.promptId&&r.currentPromptId&&e.promptId!==r.currentPromptId){T.warn("dropping completion from a superseded turn",{taskId:e.taskId,stopReason:e.stopReason,promptId:e.promptId,currentPromptId:r.currentPromptId}),x(),L();break}if(r.awaitingOwnUserEcho){T.warn("dropping stale prompt_done during own-echo window",{taskId:e.taskId,stopReason:e.stopReason}),r.reconcileAfterOwnUserEcho=!0;break}if(e.stopReason==="cancelled"&&!e.promptId&&r.newTurnStarted&&r.busy&&r.busyKind!=="bash"){r.newTurnStarted=!1,x(),L();break}r.newTurnStarted=!1,e.stopReason==="cancelled"?Fi():Ui();let s=Xs(e.stopReason);s&&o(s),r.turnEnded=!0,r.pendingPromptDone=!0,Ht();break}case"task_deleted":e.taskId===r.taskId&&Y(e.taskId,r.taskCwd??void 0,e.parentId,e.clientOpId);break;case"task_reset":e.taskId===r.taskId&&Y(null,r.taskCwd??void 0,e.taskId,e.clientOpId);break;case"task_expired":{Y(r.taskId,r.taskCwd??void 0);break}case"config_set":{ns(e.configId,e.value);let s=D(e.configId),a=s?.name??e.configId,i=typeof e.value=="string"?s?.options.find(l=>l.value===e.value)?.name??e.value:String(e.value);o(`ok: ${a}: ${i}`),e.configId==="mode"&&C(),H();break}case"config_option_update":e.configOptions.length&&Xe(e.configOptions);break;case"task_title_updated":e.taskId===r.taskId&&(r.taskTitle=e.title,Oe(r.taskId,r.taskTitle));break;case"agent_reloading":r.agentReloading=!0,o("Agent reloading\u2026"),v(!0);break;case"agent_reloading_failed":o(`err: Agent reload failed: ${e.error}`),v(!1);break;case"error":if(e.promptId&&r.currentPromptId&&e.promptId!==r.currentPromptId){T.warn("dropping failure from a superseded turn",{taskId:e.taskId,message:e.message,promptId:e.promptId,currentPromptId:r.currentPromptId});break}if(r.awaitingOwnUserEcho){T.warn("dropping stale error during own-echo window",{taskId:e.taskId,message:e.message}),r.reconcileAfterOwnUserEcho=!0;break}r.awaitingNewTask=!1,r.pendingToolCallIds.clear(),r.pendingPermissionRequestIds.clear(),r.pendingPromptDone=!1,z(),x(),L(),o(`err: ${e.message}`),r.busyKind!=="bash"&&v(!1);break;case"system_message":e.taskId===r.taskId&&(Ze({title:e.title,body:e.body}),S());break;case"collaboration_message":e.taskId===r.taskId&&(Ze({title:Hi(e),body:e.body}),S());break;case"message_created":break;case"message_consumed":Us(`msg-${e.messageId}`);break;case"message_acked":Us(`msg-${e.messageId}`);break;case"message":e.taskId===r.taskId&&(ia(e),S());break;default:break}}var fa="message",ua=null;async function se(e){if(r.messageNavigationGen++,r.taskId===e)return"unchanged";r.taskSwitchGen++;let t=r.taskSwitchGen,n=r.taskId;Te(),r.awaitingNewTask=!1,r.pendingNavigationTaskId=null,r.pendingNavigationEvents=[],_e(e),N(),r.taskId=null,r.pendingNavigationTaskId=e;let s=()=>t===r.taskSwitchGen&&r.pendingNavigationTaskId===e;try{let[a,i]=await Promise.all([ve(e),st(e)]);if(!s())return"ignored";if(!await U(e,s)){if(!s())return"ignored";throw new Error("Failed to hydrate task snapshot")}return s()?(J({type:"task_created",taskId:a.id,cwd:a.cwd,cwdDisplay:a.cwdDisplay,title:a.title,configOptions:a.configOptions}),Yt(e),i&&S(!0),"switched"):"ignored"}catch(a){throw s()&&(N(),r.taskId=null,n&&_e(n)),a}}async function Jt(e){let t=++r.messageNavigationGen,n=await Yr(e,r.taskId);return t!==r.messageNavigationGen?"ignored":(o(n.alreadyConsumed?`inbox: already consumed \u2192 switching to ${n.taskId}`:`inbox: opened as ${n.taskId}`),se(n.taskId))}async function ma(e){return e.taskId?se(e.taskId):e.messageId?Jt(e.messageId):"ignored"}function Un(){let e=new URL(location.href).searchParams.get(fa);return e&&e.length<=256?e:null}function pa(){let e=new URL(location.href);e.searchParams.delete(fa),history.replaceState(null,"",`${e.pathname}${e.search}${e.hash}`)}async function ga(){let e=Un();if(!e||ua===e)return"ignored";ua=e;try{let t=await Jt(e);return pa(),t}catch(t){let n=t instanceof ee&&(t.status===k.BAD_REQUEST||t.status===k.NOT_FOUND);n&&(pa(),r.taskId||Re());let s=t instanceof Error?t.message:String(t);return o(`err: notification consume failed (${s})`),n?"terminal-error":"retryable-error"}}function Xt(e){return/^(?:~\\|[A-Za-z]:[\\/]|\\\\)/.test(e)?e.replace(/\\/g,"/"):e}function so(e){return e.startsWith("/")||/^[A-Za-z]:\//.test(e)}function ao(e,t){let n=Xt(e);return n==="/"?`/${t}`:`${n.replace(/\/+$/,"")}/${t}`}function xe(e,t){let n=Xt(e.trim());if(n===""){if(!t)throw new Error("No active task cwd");return Xt(t)}if(n.startsWith("~")&&n!=="~"&&!n.startsWith("~/"))throw new Error("Unsupported ~user expansion");if(so(n)||n.startsWith("~"))return n;if(!t)throw new Error("No active task cwd");return ao(t,n)}function at(e,t){if(e.trim()==="")return{directory:xe("",t),filter:""};let n=xe(e,t);if(n==="/"||n==="~"||n.endsWith("/"))return{directory:n,filter:""};let s=n.lastIndexOf("/");return{directory:s===0?"/":n.slice(0,s),filter:n.slice(s+1)}}function ha(e){let t=Xt(e.trim());if(t===""||t==="/"||t==="~"||t.endsWith("/"))return"";let n=t.lastIndexOf("/");return t.slice(n+1).toLowerCase()}function Vn(e,t){return e==="/"?`/${t}`:`${e.replace(/\/+$/,"")}/${t}`}function ya(e){return e.replace(/\/\.\//g,"/").replace(/\/{2,}/g,"/").replace(/\/\.$/,"")}function Ue(e){return/['"]/.test(e)?JSON.stringify(e):`'${e}'`}function Qt(e){let t=r.taskCwd??"",n=r.taskCwdDisplay??t;if(e==="")return n;try{return ya(xe(e,n||null))}catch{return e}}async function Ve(e){let t=r.taskCwd??"",n;try{n=e===""?t:xe(e,t||null)}catch(s){return{error:s instanceof Error?s.message:String(s)}}if(n==="")return{error:"No active task cwd"};n=ya(n);try{if((await Tt(n)).kind!=="dir")return{error:`not a directory: '${e}'`}}catch(s){if(s instanceof ee)return s.status===k.NOT_FOUND?{error:`directory not found: '${e}'`}:{error:s.message};let a=s instanceof Error?s.message:String(s);return{error:`could not check directory '${e}': ${a}`}}return{cwd:n}}async function Zt(e){if(!e)return!1;try{return!(await G()).some(n=>n.id===e)}catch{return!1}}function en(){if(!r.taskId){o("Nothing to cancel.");return}Nt({force:!0}).then(e=>{o(e?.status==="idle"?"Nothing to cancel.":"^C cancelling\u2026")}).catch(e=>{o(`err: cancel failed \u2014 ${String(e)}`)})}async function tn(){if(!r.taskId){o("warn: No active task");return}if(r.busy){o("err: Cancel active work before exiting the task");return}let e=r.taskId;try{let t=await Hr(e);await Y(t?.reset?null:e,r.taskCwd??void 0,t?.reset?e:t?.parentId,t?.clientOpId)}catch(t){o(`err: Failed to exit task \u2014 ${String(t)}`)}}async function nn(e){if(!r.taskId){o("warn: No active task");return}if(r.busy){o("err: Cancel active work before compacting the task");return}let t=r.taskId;o("Compacting context\u2026");try{await Fr(t,e)}catch(n){o(`err: Failed to compact task \u2014 ${String(n)}`)}}async function it({cwd:e,showCwd:t=!1}={}){if(!r.taskId){o("warn: No active task");return}let n=r.taskId,s=e??r.taskCwd??void 0;if(r.busy){o("err: Cancel active work before clearing the task");return}o(t&&s?`Clearing task and starting at ${s}\u2026`:"Clearing task\u2026");try{let a=await Br(n,{cwd:s});io(),await U(n),oo(n,a)}catch(a){o(`err: Failed to clear task \u2014 ${String(a)}`)}}function io(){x(),L(),r.currentBashEl&&qe(r.currentBashEl,null,"disconnected"),r.busyKind=null,r.cancelStatus=null,r.pendingToolCallIds.clear(),r.pendingPermissionRequestIds.clear(),r.pendingPromptDone=!1,r.turnEnded=!1,r.currentPromptId=null,r.newTurnStarted=!1,r.sentMessageOpId=null,r.awaitingOwnUserEcho=!1,ue()}function oo(e,t){Xe(t.configOptions),t.agentCommands&&$e(t.agentCommands),r.taskCwd=t.cwd,r.taskCwdDisplay=t.cwdDisplay??t.cwd,r.taskTitle=t.title,Oe(e,r.taskTitle)}var ot=T.scope("share");function lo(e,t){return e.startsWith("http")?e:e?`${location.origin}${e}`:`${location.origin}/s/${t}`}async function rn(){if(!r.taskId){o("share: no active task");return}let e=r.taskId;try{let t=await fetch(`/api/v1/tasks/${encodeURIComponent(e)}/share`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({}),credentials:"same-origin"});if(!t.ok){let a=await t.text();t.status===k.CONFLICT?o("share: task busy (agent streaming) \u2014 retry after the response completes"):t.status===k.FORBIDDEN?o("share: forbidden (not owner)"):t.status===k.BAD_REQUEST&&a.includes("sanitize")?o(`share: \u2717 sanitize blocked this task \u2014 ${a}`):o(`share: create failed ${t.status} \u2014 ${a.slice(0,200)}`);return}let n=await t.json();r.previewToken=n.token,C();let s=n.reused?"reused":"ready";o(`share: preview ${s} \u2014 ^P publish \xB7 ^C cancel`)}catch(t){ot.error("preview create error",{err:t}),o(`share: network error \u2014 ${String(t)}`)}}async function Wn(){if(!r.taskId){o("share: no active task");return}if(!r.previewToken){o("share: no preview to publish \u2014 run /share first");return}let e=r.taskId,t=r.previewToken;try{let n=await fetch(`/api/v1/tasks/${encodeURIComponent(e)}/share/publish`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t}),credentials:"same-origin"});if(!n.ok){let d=await n.text();n.status===k.FORBIDDEN?o("share: forbidden (not owner)"):n.status===k.NOT_FOUND?o("share: token not found (already revoked?)"):o(`share: publish failed ${n.status} \u2014 ${d.slice(0,200)}`);return}let s=await n.json(),a=lo(s.public_url,s.token);r.previewToken=null,C();let i=o(`share: published
|
|
2
|
+
`),l=document.createElement("a");l.href=a,l.textContent=a,l.target="_blank",l.rel="noopener noreferrer",i.appendChild(l)}catch(n){ot.error("publish error",{err:n}),o(`share: network error \u2014 ${String(n)}`)}}function Kn(){if(!r.previewToken){o("share: no preview active");return}r.previewToken=null,C(),o("share: preview canceled")}async function jn(){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(n=>n.shared_at!=null)}async function sn(e){if(!e){o("share: usage \u2014 /share revoke <token>");return}try{let n=(await co()).find(i=>i.token===e);if(!n){o("share: token not found (already revoked?)");return}let s=await fetch(`/api/v1/tasks/${encodeURIComponent(n.task_id)}/share`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:e}),credentials:"same-origin"});if(!s.ok){s.status===k.FORBIDDEN?o("share: forbidden (not owner)"):s.status===k.NOT_FOUND?o(`share: ${e} already revoked`):o(`share: revoke failed ${s.status}`);return}let a=await s.json();o(a.revoked?`share: revoked ${e}`:`share: ${e} already revoked`)}catch(t){ot.error("revoke error",{err:t}),o(`share: network error \u2014 ${String(t)}`)}}async function co(){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(n=>n.shared_at!=null)}function lt(e){let t=`${location.origin}/s/${e}`;window.open(t,"_blank","noopener"),o(`share: opened ${t}`)}async function ka(){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 ct(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 s=await t.text();o(`share: set author failed ${t.status} \u2014 ${s.slice(0,200)}`);return}let n=await t.json();if(r.previewToken&&r.taskId)try{await fetch(`/api/v1/tasks/${encodeURIComponent(r.taskId)}/share`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:r.previewToken,display_name:n.value??""}),credentials:"same-origin"})}catch(s){ot.warn("by: preview patch failed",{err:s})}o(n.value?`share: author set to '${n.value}'`:"share: author cleared (publish anonymously)")}catch(t){ot.error("by error",{err:t}),o(`share: network error \u2014 ${String(t)}`)}}var Ce=0,po={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 an(){c.fileViewerContent.replaceChildren(),c.fileViewerNotice.textContent="",c.fileViewerNotice.hidden=!0}function on(e){c.fileViewerNotice.textContent=e,c.fileViewerNotice.hidden=!1}function Gn(e){let t=++Ce;return an(),c.fileViewerPath.textContent=e,c.fileViewer.hidden=!1,document.body.classList.add("file-viewer-open"),t}function wa(e){let t=e.lastIndexOf(".");return t<0?"":e.slice(t+1).toLowerCase()}function fo(e){let t=wa(e);return t==="md"||t==="markdown"}function mo(e){let t=1;for(let a=0;a<e.length;a++)e.charCodeAt(a)===10&&t++;let n=[],s=[];for(let a=1;a<=t;a++)s.push(String(a)),s.length===1024&&(n.push(s.join(`
|
|
3
|
+
`)),s=[]);return s.length>0&&n.push(s.join(`
|
|
4
|
+
`)),n.join(`
|
|
5
|
+
`)}async function go(e,t){let n=document.createElement("div");n.className="file-viewer-code-scroll";let s=document.createElement("div");s.className="file-viewer-code-grid";let a=document.createElement("pre");a.className="file-viewer-line-numbers",a.setAttribute("aria-hidden","true"),a.textContent=mo(e);let i=document.createElement("pre");i.className="file-viewer-code";let l=document.createElement("code");l.textContent=e,i.appendChild(l),s.append(a,i),n.appendChild(s),c.fileViewerContent.appendChild(n),await br(l,po[wa(t)])}function ho(e){let t=document.createElement("article");t.className="file-viewer-markdown msg assistant",c.fileViewerContent.appendChild(t),ke(t,e),O(t)}function yo(e){let t=document.createElement("img");t.className="file-viewer-image",t.src=e.contentUrl,t.alt=e.name,c.fileViewerContent.appendChild(t)}function va(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 ko(e,t){return t.startsWith("text/")?e.size<=1048576:t.startsWith("image/")?e.maxBytes!==void 0&&e.size<=e.maxBytes:!1}async function wo(e){return we(t=>fetch(e,t?{signal:t}:void 0))}async function vo(e,t,n){let s=e.headers.get("Content-Disposition")??"",a=e.headers.get("Content-Type")?.toLowerCase()??"";return!/^attachment\b/i.test(s)&&a.startsWith("text/")?!1:(await e.body?.cancel(),n!==Ce||(ln(),va(t)),!0)}async function To(e,t){on("Loading\u2026");try{let n=await wo(e.contentUrl);if(t!==Ce)return;if(!n.ok)throw new Error(`HTTP ${n.status}`);if(await vo(n,e,t))return;let s=await n.text();if(t!==Ce)return;if(an(),fo(e.name))ho(s);else if(await go(s,e.name),t!==Ce)return}catch(n){if(t!==Ce)return;an(),on(`Unable to load file: ${n instanceof Error?n.message:String(n)}`)}}async function Ta(e){if(e.kind!=="file"){Gn(e.pathDisplay??e.path),on("Not a regular file");return}if(!e.contentUrl){Gn(e.pathDisplay??e.path),on("File content is temporarily unavailable");return}let t=e.mime?.toLowerCase()??"application/octet-stream";if(!ko(e,t)){ln(),va(e);return}let n=Gn(e.pathDisplay??e.path);if(t.startsWith("image/")){yo(e);return}await To(e,n)}function ln(){++Ce,an(),c.fileViewerPath.textContent="",c.fileViewer.hidden=!0,document.body.classList.remove("file-viewer-open")}function bo(){return!c.fileViewer.hidden}c.fileViewerClose.addEventListener("click",ln);document.addEventListener("keydown",e=>{e.key!=="Escape"||!bo()||(e.preventDefault(),ln())});function ba(e){return e==="/"?"/view /":`/view ${e.replace(/\/+$/,"")}/`}function Sa(e){b(ba(e)),c.input.focus()}function Ia(e){let t=at(e,r.taskCwd).directory;return t==="/"?t:t.replace(/\/+$/,"")}async function Ea(e){let t=at(e,r.taskCwd),n=await bt(t.directory),s=[];n.parent!==n.path&&s.push({name:"..",path:n.parent,pathDisplay:n.parentDisplay??n.parent,kind:"dir",size:null,mtime:0,parent:!0});for(let a of n.entries)s.push({...a,path:Vn(n.path,a.name),pathDisplay:Vn(n.pathDisplay??n.path,a.name)});return s}function xa(e,t){let n=e,s=ha(t);return s?n.parent?"..".includes(s):n.name.toLowerCase().includes(s):!0}function So(e){if(e!==null)return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function Ca(e){let t=e;return t.kind==="dir"?{primary:t.parent?"..":`${t.name}/`,secondary:t.parent?"parent":"folder",fill:ba(t.pathDisplay).slice(6),continueOnFill:!0,onSelect:()=>{Sa(t.pathDisplay)}}:{primary:t.name,secondary:So(t.size),fill:t.pathDisplay,onSelect:()=>zn(t.pathDisplay)}}async function zn(e){try{let t=xe(e,r.taskCwd),n=await Tt(t);if(n.kind==="dir"){Sa(n.pathDisplay??n.path);return}await Ta(n)}catch(t){o(`view: ${t instanceof Error?t.message:"Unable to open path"}`)}}var We=!1;async function Ma(){try{We=await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{We=!1}}function Io(e){let t="=".repeat((4-e.length%4)%4),n=(e+t).replace(/-/g,"+").replace(/_/g,"/"),s=atob(n),a=new Uint8Array(s.length);for(let i=0;i<s.length;i++)a[i]=s.charCodeAt(i);return a}async function Eo(){try{let e=await navigator.serviceWorker.ready,t=await fetch("/api/beta/push/vapid-key");if(!t.ok)return;let{publicKey:n}=await t.json(),a=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Io(n)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:a.endpoint,keys:a.keys,clientId:r.clientId})})}catch(e){T.scope("push").error("subscribe failed",{err:e})}}async function xo(){try{let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!t)return;let n=t.endpoint;await t.unsubscribe(),await fetch("/api/beta/push/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:n})})}catch(e){T.scope("push").error("unsubscribe failed",{err:e})}}async function Co(){return(await fetch("/api/v1/tasks")).json()}async function cn(){let e=r.recentPathsLimit,t=e>0?`/api/v1/recent-paths?limit=${e}`:"/api/v1/recent-paths";return(await(await fetch(t)).json()).map(a=>({cwd:a.cwd,cwdDisplay:a.cwdDisplay??a.cwd,time:a.last_used_at}))}var La=async()=>{let{messages:e}=await Ye();return e},Pa=async()=>xt();function Xn(){return`log: ${Pn()} (${$s()})`}function Na(){o(`${Xn()} \u2014 use /log <off|debug|info|warn|error|reset>`)}function Qn(e){qs(e),o(`${Xn()} saved`),e!=="off"&&T.info("log enabled",{level:e})}function Zn(){Ds(),o(`${Xn()} reset`)}async function er(){o("Resetting local state\u2026");let e=await Mr();e.errors.length&&o(`warn: reset had issues: ${e.errors.join("; ")}`),location.reload()}async function Lo(e,t,n){let s=D(e);s&&(s.currentValue=t),C(),H(),o(`${s?.name??e} \u2192 ${n}`),r.taskId&&await Ae(r.taskId,e,t).catch(()=>{})}async function tr(e){try{await Jt(e.id)}catch(t){o(`err: consume failed (${t.message})`)}}async function Po(e){try{await Et(e.id),o(`inbox: ack ${e.id}`)}catch(t){o(`err: ack failed (${t.message})`)}}async function Ao(e){if(!/^[A-Za-z0-9_-]{1,64}$/.test(e)){o("err: token name must match [A-Za-z0-9_-]{1,64}");return}try{let t=await Ct(e);o(`token: created ${t.name} (${t.scope})`),o(`${t.token}`),o("\u2014 save this now; it will never be shown again")}catch(t){let n=t;n.status===k.CONFLICT?o(`err: token "${e}" already exists`):n.status===k.FORBIDDEN?o("err: admin scope required to manage tokens"):o(`err: create failed (${n.message})`)}}async function Mo(e){try{await Lt(e),o(`token: revoked ${e}`)}catch(t){let n=t;n.status===k.NOT_FOUND?o(`err: no token named "${e}"`):n.status===k.FORBIDDEN?o("err: admin scope required to manage tokens"):n.status===k.BAD_REQUEST&&/using|yourself|cannot/i.test(n.message)?o("err: can't revoke the token you're signed in with \u2014 use another admin token"):o(`err: revoke failed (${n.message})`)}}async function No(){if(typeof Notification>"u"){o("err: notifications not supported in this browser");return}if(Notification.permission==="denied"){o("notify: blocked \u2014 allow in browser site settings to enable");return}if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted"){o("notify: blocked \u2014 allow in browser site settings to enable");return}await Ma();let e=We;await Eo(),We=!0,o(e?"notify: already enabled":"notify: enabled")}async function $o(){await xo(),We=!1,o("notify: disabled")}function Aa(e,t){let n=e.shared_at?$(e.shared_at):"\u2014";return{primary:e.token,secondary:e.task_title??void 0,path:`/s/${e.token}`,pathSecondary:n,onSelect:()=>{t==="open"?lt(e.token):sn(e.token)}}}function Yn(e,t){N(),o("Creating new task\u2026"),Mt({cwd:e,inheritFromTaskId:t,parentId:t})}var dt={name:"<root>",children:[{name:"/cancel",desc:"Cancel response",onSelect:en},{name:"/clear",desc:"Clear context",help:"Clear context; history stays.",fetch:cn,toSpec:e=>{let t=e,n=t.cwd.toLowerCase()===(r.taskCwd??"").toLowerCase();return{primary:t.cwdDisplay,current:n,onSelect:()=>{it({cwd:t.cwd,showCwd:!0})}}},freeform:e=>{let t=e.trim();return t?{primary:`clear and start at '${t}'`,onSelect:()=>{it({cwd:t,showCwd:!0})}}:null}},{name:"/compact",desc:"Compact context",help:"Compact context and continue.",freeform:e=>{let t=e.trim();return{primary:t?`compact with focus '${t}'`:"compact context \xB7 type optional focus guidance",fill:t?`${t} `:"",continueOnFill:!0}},onSelect:()=>{nn()}},{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===Pn(),onSelect:()=>{if(t.value==="reset"){Zn();return}Qn(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"},{value:"toggle",name:"toggle",desc:"Toggle plan panel"}],toSpec:e=>{let t=e;return{primary:t.name,secondary:t.desc,current:Fs()&&t.value==="show"===Hs(),onSelect:()=>{qt(t.value)}}}},{name:"/reset",desc:"Reset app state",onSelect:()=>{er()}},{name:"/exit",desc:"Exit task tree",help:"Exit task tree; Root resets the tree.",onSelect:()=>{tn()}},{name:"/help",desc:"Show help",onSelect:()=>{nr()}},{name:"/inbox",desc:"Manage inbox",fetch:La,toSpec:e=>{let t=e,n=t.from_label??t.from_ref,s=$(t.created_at);return{primary:t.title,secondary:s,path:t.cwd??"",pathSecondary:n,onSelect:()=>tr(t)}},children:[{name:"dismiss",desc:"Dismiss only",fetch:La,toSpec:e=>{let t=e,n=t.from_label??t.from_ref,s=$(t.created_at);return{primary:t.title,secondary:s,path:t.cwd??"",pathSecondary:n,onSelect:()=>Po(t)}}}]},{name:"/logout",desc:"Log out",onSelect:()=>{try{localStorage.removeItem(Q)}catch{}try{r.eventSource?.close()}catch{}o("Logged out."),location.replace("/login")}},Jn("/mode","Set mode","mode"),Jn("/model","Set model","model",!0),{name:"/new",desc:"Create a child task",fetch:async()=>{let e=r.taskCwd??"",t=[];e&&t.push({cwd:e,cwdDisplay:r.taskCwdDisplay??e,time:""});try{for(let n of await cn())e!==""&&n.cwd.toLowerCase()===e.toLowerCase()||t.push(n)}catch{}return t},toSpec:e=>{let t=e,n=r.taskCwd,s=n!==null&&t.cwd.toLowerCase()===n.toLowerCase();return{primary:t.cwdDisplay,current:s,onSelect:()=>{Yn(t.cwd,r.taskId)}}},freeform:e=>{let t=e.trim();return{primary:t?`create task at ${Ue(Qt(t))}`:"create task",onSelect:async()=>{let n=r.taskId;if(t===""){Yn(r.taskCwd??void 0,n);return}let s=await Ve(t);if("error"in s){o(`err: create failed \u2014 ${s.error}`);return}if(await Zt(n)){o("err: create failed \u2014 the launching task no longer exists");return}Yn(s.cwd,n)}}}},{name:"/notify",desc:"Toggle notifications",fetch:async()=>(await Ma(),[{value:"on",name:"on",desc:"Enable notifications"},{value:"off",name:"off",desc:"Disable notifications"}]),toSpec:e=>{let t=e,n=t.value==="on"===We;return{primary:t.name,secondary:t.desc,current:n,onSelect:t.value==="on"?No:$o}}},{name:"/reload",desc:"Reload agent",onSelect:()=>{o("Reloading agent\u2026"),It().catch(e=>{o(`err: ${e instanceof Error?e.message:"Failed to reload agent"}`)})}},{name:"/rename",desc:"Rename task",freeform:e=>{let t=e.trim();return t?{primary:`rename to '${t}'`,onSelect:async()=>{if(!r.taskId){o("err: No active task");return}try{await St(r.taskId,t),o(`Renamed \u2192 ${t}`)}catch{o("err: Failed to rename task")}}}:null}},{name:"/share",desc:"Manage shares",fetch:jn,toSpec:e=>Aa(e,"open"),freeform:e=>{let t=e.trim();return t?{primary:`open share '${t}'`,onSelect:()=>{lt(t)}}:{primary:"create new share preview",onSelect:()=>rn()}},children:[{name:"by",desc:"Set author",fetch:async()=>[{value:await ka()}],toSpec:e=>{let t=e.value;return{primary:t??"(none)",secondary:t?"current \u2014 Enter to clear":"currently anonymous",onSelect:()=>ct(null)}},freeform:e=>{let t=e.trim();return t?{primary:`set author to '${t}'`,onSelect:()=>ct(t)}:null}},{name:"revoke",desc:"Revoke a share",fetch:jn,toSpec:e=>Aa(e,"revoke")}]},{name:"/switch",desc:"Switch task",fetch:Co,matches:(e,t)=>{let n=e;return(n.title??"").toLowerCase().includes(t)||n.id.startsWith(t)},toSpec:e=>{let t=e,n=t.title??t.id,s=$(t.last_active_at);return{primary:n,secondary:s,path:t.cwd,current:t.id===r.taskId,onSelect:async()=>{try{await se(t.id)}catch{o("err: Failed to switch task")}}}}},{name:"/view",desc:"View files",fetch:Ea,fetchKey:Ia,matches:xa,toSpec:Ca},Jn("/think","Set thinking effort","reasoning_effort",!1,!0),{name:"/token",desc:"Manage tokens",fetch:Pa,toSpec:e=>{let t=e,n=t.lastUsedAt?$(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${n}`,path:`${t.scope} \xB7 created ${$(t.createdAt)}`,current:t.isSelf,onSelect:t.isSelf?void 0:()=>{o(`\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:()=>Ao(t)}:null},children:[{name:"revoke",desc:"Revoke token",fetch:async()=>(await Pa()).filter(e=>!e.isSelf),toSpec:e=>{let t=e,n=t.lastUsedAt?$(t.lastUsedAt):"never";return{primary:t.name,secondary:`last used ${n}`,path:`${t.scope} \xB7 created ${$(t.createdAt)}`,onSelect:()=>Mo(t.name)}}}]}]};function Jn(e,t,n,s=!1,a=!1){return{name:e,desc:t,fetch:()=>{let i=a?Je():D(n);return i?i.options:[]},toSpec:i=>{let l=i,d=a?Je():D(n),u=d?.currentValue??vn(n);return{primary:l.name,secondary:s?`(${l.value})`:void 0,current:l.value===u,onSelect:()=>Lo(d?.id??n,l.value,l.name)}},matches:s?(i,l)=>{let d=i;return d.name.toLowerCase().includes(l)||d.value.toLowerCase().includes(l)}:void 0}}function nr(){let e=(n,s)=>{o(`${n} - ${s}`)},t=[];r.serverVersion&&t.push(`WebAgent ${r.serverVersion}`),r.agentName&&r.agentVersion&&t.push(`${r.agentName} ${r.agentVersion}`),t.length&&o(t.join(" \xB7 ")),o("\u203A has next step * current value"),o("Tab completes \xB7 Enter sends raw text"),e("?","Show help"),e("!command","Run bash command"),e("//","Agent commands (agent-specific)"),e("+<title> [<cwd>]","Create a named child task"),e("@<task>","Send or jump to the task"),e("@!<task>","Force-send to a task");for(let n of dt.children)e(n.name,n.help??n.desc??"");o("--- Shortcuts ---");for(let n of Ro)e(n.key,n.desc);o("--- Tips ---");for(let n of _o)o(n.text)}var Ro=[{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)"}],_o=[{text:"Tap \u276F prompt to cycle mode"}];async function Oo(){try{let e=await navigator.serviceWorker.ready,t=await fetch("/api/beta/push/vapid-key");if(!t.ok)return;let{publicKey:n}=await t.json(),a=(await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Do(n)})).toJSON();await fetch("/api/beta/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:a.endpoint,keys:a.keys,clientId:r.clientId})})}catch(e){T.scope("push").error("subscribe failed",{err:e})}}async function qo(){try{let t=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!t)return;let n=t.endpoint;await t.unsubscribe(),await fetch("/api/beta/push/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:n})})}catch(e){T.scope("push").error("unsubscribe failed",{err:e})}}function Do(e){let t="=".repeat((4-e.length%4)%4),n=(e+t).replace(/-/g,"+").replace(/_/g,"/"),s=atob(n),a=new Uint8Array(s.length);for(let i=0;i<s.length;i++)a[i]=s.charCodeAt(i);return a}async function $a(){try{return await(await navigator.serviceWorker.ready).pushManager.getSubscription()!==null}catch{return!1}}async function rr(e){let t=e.split(/\s+/),n=t[0].toLowerCase(),s=t.slice(1).join(" ").trim();switch(n){case"/plan":{let a=s.toLowerCase()||"toggle";return a!=="show"&&a!=="hide"&&a!=="toggle"?(o("plan: use /plan, /plan show, or /plan hide"),!0):(qt(a),!0)}case"/share":{let a=s.split(/\s+/),i=(a[0]??"").toLowerCase();if(i==="")return await rn(),!0;if(i==="revoke"){let d=a[1]??"";return await sn(d),!0}if(i==="by"){let d=s.replace(/^by(\s+|$)/i,"").trim();return await ct(d===""?null:d),!0}let l=a[0]??"";return/^[A-Za-z0-9_-]{24}$/.test(l)?(lt(l),!0):(o(`share: unknown subcommand '${i}' \u2014 try /share, /share by <name>, /share <token>, or /share revoke <token>`),!0)}case"/view":return await zn(s),!0;case"/new":{let a=r.taskId,i;if(s){let l=await Ve(s);if("error"in l)return o(`err: create failed \u2014 ${l.error}`),!0;if(await Zt(a))return o("err: create failed \u2014 the launching task no longer exists"),!0;i=l.cwd}else i=r.taskCwd??void 0;return N(),r.taskId=null,o("Creating new task\u2026"),Mt({cwd:i,inheritFromTaskId:a,parentId:a}),!0}case"/rename":{if(!r.taskId)return o("err: No active task"),!0;if(!s)return o(`Current: ${r.taskTitle??"(untitled)"}`),o("Usage: /rename <new title>"),!0;try{await St(r.taskId,s),o(`Renamed \u2192 ${s}`)}catch{o("err: Failed to rename task")}return!0}case"/clear":return await it({cwd:s||void 0,showCwd:!!s}),!0;case"/compact":return await nn(s||void 0),!0;case"/exit":return await tn(),!0;case"/logout":{try{localStorage.removeItem(Q)}catch{}try{r.eventSource?.close()}catch{}return o("Logged out."),location.replace("/login"),!0}case"/token":{let a=s.trim().split(/\s+/).filter(Boolean),i=a[0];if(!i){try{let d=await xt();if(d.length===0)return o("token: (none)"),!0;for(let u of d){let p=u.lastUsedAt?$(u.lastUsedAt):"never";o(`${u.name} (${u.scope}) \u2014 created ${$(u.createdAt)}, last used ${p}`)}o("\u2014 /token <name> to create \xB7 /token revoke <name> to revoke")}catch(d){let u=d;u.status===k.FORBIDDEN?o("err: admin scope required to manage tokens"):o(`err: token list failed (${u.message})`)}return!0}if(i==="revoke"){let d=a[1];if(!d)return o("err: usage /token revoke <name>"),!0;try{await Lt(d),o(`token: revoked ${d}`)}catch(u){let p=u;p.status===k.NOT_FOUND?o(`err: no token named "${d}"`):p.status===k.FORBIDDEN?o("err: admin scope required to manage tokens"):p.status===k.BAD_REQUEST&&/using|yourself|cannot/i.test(p.message)?o("err: can't revoke the token you're signed in with \u2014 use another admin token"):o(`err: revoke failed (${p.message})`)}return!0}let l=i;if(!/^[A-Za-z0-9_-]{1,64}$/.test(l))return o("err: token name must match [A-Za-z0-9_-]{1,64}"),!0;try{let d=await Ct(l);o(`token: created ${d.name} (${d.scope})`),o(`${d.token}`),o("\u2014 save this now; it will never be shown again")}catch(d){let u=d;u.status===k.CONFLICT?o(`err: token "${l}" already exists`):u.status===k.FORBIDDEN?o("err: admin scope required to manage tokens"):o(`err: create failed (${u.message})`)}return!0}case"/switch":{if(!s)return o("Usage: /switch <title or id prefix>"),!0;try{let i=await(await fetch("/api/v1/tasks")).json(),l=s.toLowerCase(),d=i.find(u=>u.id.startsWith(s)||u.title?.toLowerCase().includes(l));if(!d)return o(`err: No task matching "${s}"`),!0;await se(d.id)}catch{o("err: Failed to switch task")}return!0}case"/cancel":return en(),!0;case"/reload":return o("Reloading agent\u2026"),It().then(()=>{}).catch(a=>{o(`err: ${a instanceof Error?a.message:"Failed to reload agent"}`)}),!0;case"/help":case"?":return nr(),!0;case"/model":case"/mode":case"/think":{let i={"/model":"model","/mode":"mode","/think":"reasoning_effort"}[n],l=n==="/think"?Je():D(i);if(n==="/think"&&l&&(i=l.id),!s){let f=l?.options.find(m=>m.value===l.currentValue)?.name??l?.currentValue??"unknown";return o(`${l?.name??i}: ${f}`),o(`Type ${n} + space to pick from list`),!0}if(!l)return o(`err: ${n.slice(1)} is not available.`),!0;let d=s.trim(),u=f=>f.toLowerCase().replace(/[\s_]+/g,"-"),p=u(d),h=l.options.find(f=>u(f.value)===p||u(f.name)===p);if(!h){let f=l.options.filter(m=>u(m.value).includes(p)||u(m.name).includes(p));if(f.length===1)h=f[0];else if(f.length>1)return o(`err: Ambiguous "${s}". Type ${n} + space to see options.`),!0}return h?(l.currentValue=h.value,C(),H(),o(`${l.name} \u2192 ${h.name}`),await Ae(r.taskId,i,h.value).catch(()=>{}),!0):(o(`err: Unknown "${s}". Type ${n} + space to see options.`),!0)}case"/inbox":{let a=s.trim().split(/\s+/).filter(Boolean),i=a[0];if(!i){try{let{messages:f}=await Ye();if(f.length===0)return o("inbox: empty"),!0;for(let m of f){let g=m.from_label??m.from_ref,y=$(m.created_at);o(`${m.id} \xB7 ${m.title} \xB7 ${g} \xB7 ${y}`)}o("\u2014 /inbox <id> to open \xB7 /inbox dismiss <id> to dismiss only")}catch(f){o(`err: inbox list failed (${f.message})`)}return!0}let l=i==="dismiss",d=l?a[1]:i;if(!d)return o("err: usage /inbox <id> | /inbox dismiss <id>"),!0;let u;try{({messages:u}=await Ye())}catch(f){return o(`err: inbox list failed (${f.message})`),!0}let p=d.toLowerCase(),h=u.find(f=>f.id===d)??u.find(f=>f.id.toLowerCase().startsWith(p))??u.find(f=>f.title.toLowerCase().includes(p));if(!h)return o(`err: no inbox message matching "${d}"`),!0;if(l){try{await Et(h.id),o(`inbox: dismissed ${h.id}`)}catch(f){o(`err: dismiss failed (${f.message})`)}return!0}try{await tr(h)}catch(f){o(`err: consume failed (${f.message})`)}return!0}case"/notify":{if(typeof Notification>"u")return o("err: notifications not supported in this browser"),!0;let a=s.toLowerCase();if(a==="on"){if(Notification.permission==="denied")return o("notify: blocked \u2014 allow in browser site settings to enable"),!0;if(Notification.permission!=="granted"&&await Notification.requestPermission()!=="granted")return o("notify: blocked \u2014 allow in browser site settings to enable"),!0;let l=await $a();return await Oo(),o(l?"notify: already enabled":"notify: enabled"),!0}if(a==="off")return await qo(),o("notify: disabled"),!0;let i=Notification.permission;return i==="denied"?o("notify: blocked \u2014 allow in browser site settings to enable"):i==="granted"&&await $a()?o("notify: enabled"):o("notify: off \u2014 use /notify on to enable"),!0}case"/log":{let a=s.toLowerCase().trim();return a===""?(Na(),!0):a==="reset"?(Zn(),!0):["off","debug","info","warn","error"].includes(a)?(Qn(a),!0):(o(`err: invalid level '${a}' (use off|debug|info|warn|error|reset)`),!0)}case"/reset":return await er(),!0;default:return o(`err: Unknown command "${n}". Type / to see available commands.`),!0}}var ae=class extends Error{constructor(t){super(t),this.name="TaskPathParseError"}};function _a(e){return/\s/u.test(e)}function Ra(e,t){let n=t;for(;n<e.length&&_a(e[n]);)n++;return n}function Bo(e,t){let n=t,s="",a=!1;for(;n<e.length&&!_a(e[n]);){let i=e[n];if(i==="\\"){if(n+1>=e.length)throw new ae("Target ends with an incomplete escape");s+=e[n+1],n+=2,a=!0;continue}if(i==="'"||i==='"'){let l=i;n++,a=!0;let d=!1;for(;n<e.length;){let u=e[n];if(u===l){n++,d=!0;break}if(l==='"'&&u==="\\"){if(n+1>=e.length)throw new ae("Target ends with an incomplete escape inside double quotes");s+=e[n+1],n+=2;continue}s+=u,n++}if(!d)throw new ae("Target contains an unterminated quote");continue}s+=i,n++,a=!0}if(!a||s.length===0)throw new ae("Task command requires a non-empty target");return{value:s,end:n}}function sr(e){if(!e)return{absolute:!1,segments:[]};let t=e.startsWith("/"),n=e.split("/").filter(Boolean);return{absolute:t,segments:n,...e.endsWith("/")?{trailingSlash:!0}:{}}}function ar(e){let t=Ra(e,0),n,s;if(e.startsWith("@!",t))n="@!",s=t+2;else if(e[t]==="+"||e[t]==="@")n=e[t],s=t+1;else throw new ae("Task command must start with +, @, or @!");let a=Ra(e,s);if(a>=e.length)return{marker:n,target:"",path:{absolute:!1,segments:[]},remainder:e.slice(s)};let i=Bo(e,a);return{marker:n,target:i.value,path:sr(i.value),remainder:e.slice(i.end)}}function ie(e){let t=e.trim();return t.startsWith("+")||t.startsWith("@")}function ir(e){let t=e.trim();return!t.startsWith("//")&&t.startsWith("/")||t==="?"||t.startsWith("? ")}function or(e){let t=e.trim();return ir(t)||t.startsWith("!")||ie(t)}function Ke(e){let t=new Map;for(let n of e)t.set(n.id,{id:n.id,title:n.title,cwd:n.cwd,cwdDisplay:n.cwdDisplay,workflowStatus:n.workflow_status,parentId:n.parent_id,children:[]});for(let n of t.values())if(n.parentId){let s=t.get(n.parentId);s&&s.children.push(n)}return t}function dr(e,t){return(e.title??e.id).localeCompare(t.title??t.id)}function dn(e){return e.title??e.id}function pt(e,t){let n=[],s=new Set,a=e;for(;a&&!s.has(a.id)&&(s.add(a.id),a.parentId!==null);)n.push(dn(a)),a=t.get(a.parentId);let i=n.reverse().map(De).join("/");return i?`/${i}`:"/"}function Oa(e){return e.workflowStatus??"unknown"}function qa(e,t){if(!e)return[];let n=Ke(t),s=n.get(e);if(!s)return[];let a=[...s.children];if(s.parentId){let i=n.get(s.parentId);i&&a.push(i)}if(s.parentId){let i=n.get(s.parentId);if(i)for(let l of i.children)l.id!==s.id&&a.push(l)}return a.sort(dr)}function Fo(e,t,n){if(!e)return null;let s=ut(e,t,n);if(s.length!==1)return null;let a=s[0];return{directory:a,children:[...a.children].sort(dr)}}function Ho(e,t){let n=t.toLowerCase();return!!(e.id.toLowerCase().startsWith(n)||e.title?.toLowerCase().startsWith(n))}function Uo(e,t){return e.id===t||e.title===t}function ut(e,t,n,s=!1){if(!e)return[];let a=Ke(t),i=a.get(e);if(!i)return[];let l=n.absolute?[...a.values()].filter(d=>!d.parentId):[i];for(let d=0;d<n.segments.length;d++){let u=n.segments[d];if(u===".")continue;if(u===".."){l=l.map(f=>f.parentId?a.get(f.parentId):void 0).filter(f=>!!f);continue}let p=s||d<n.segments.length-1,h=[];for(let f of l)for(let m of f.children)(p?Uo(m,u):Ho(m,u))&&h.push(m);if(l=h,l.length===0)return[]}return l}function Vo(e){let t=e.remainder?`${e.marker}${e.targetPath} ${e.remainder}`:`${e.marker}${e.targetPath}`;return{spec:{primary:e.primary,secondary:e.secondary,selectedSecondary:e.selectedSecondary,fill:t,continueOnFill:!0,onSelect:e.onSelect},prefix:e.prefix??"",kind:"data"}}function Da(e){return{spec:{primary:e.primary,secondary:e.secondary,selectedSecondary:e.selectedSecondary,fill:`${e.marker}${e.targetPath}`,onSelect:async()=>{try{await se(e.taskId)}catch(t){let n=t instanceof Error?t.message:String(t);o(`err: navigation failed \u2014 ${n}`)}}},prefix:e.prefix??"",kind:"data"}}async function Ba(e){if(!ie(e))return[];let t;try{t=ar(e)}catch(n){if(n instanceof ae)return[{spec:{primary:`(${n.message})`},prefix:"",kind:"placeholder"}];throw n}return t.marker==="+"?jo(t):t.remainder!==""?t.target!==""&&t.remainder.trim()===""?[{spec:{primary:t.path.trailingSlash?"browse \xB7 remove / to select this Task":t.marker==="@!"?"type message to force-send":"type message to send"},prefix:t.path.trailingSlash?"\u203A":"\u21B5",kind:"placeholder"}]:[]:Jo(t)}function Wo(){return[{spec:{primary:"create task \xB7 type a title"},prefix:"",kind:"placeholder"}]}async function Ko(e,t){let n=De(e),s=r.taskCwd??"";if(t===""){let p=[],h=r.taskCwdDisplay??s;s&&p.push({spec:{primary:h,current:!0,fill:`+${n} ${h}`,continueOnFill:!0},prefix:"*",kind:"data"});try{let f=await cn();for(let m of f)m.cwd.toLowerCase()!==s.toLowerCase()&&p.push({spec:{primary:m.cwdDisplay,fill:`+${n} ${m.cwdDisplay}`,continueOnFill:!0},prefix:"",kind:"data"})}catch{}return p}let a,i;try{({directory:a,filter:i}=at(t,s||null))}catch{return[]}let l;try{l=(await bt(a)).entries}catch{return[]}let d=t.lastIndexOf("/"),u=d>=0?t.slice(0,d+1):"";return l.filter(p=>p.kind==="dir"&&(i===""||p.name.toLowerCase().startsWith(i.toLowerCase()))).map(p=>({spec:{primary:p.name,fill:`+${n} ${u}${p.name}/`,continueOnFill:!0},prefix:"",kind:"data"}))}async function jo(e){let t=e.target;if(t.trim()==="")return Wo();if(t.includes("/"))return[{spec:{primary:"(task title cannot contain '/')"},prefix:"",kind:"placeholder"}];if(t==="."||t==="..")return[{spec:{primary:"(task title cannot be '.' or '..')"},prefix:"",kind:"placeholder"}];let n=e.remainder.trim(),s=[{spec:{primary:n===""?`create ${Ue(t)}`:`create ${Ue(t)} at ${Ue(Qt(n))}`,fill:`+${De(t)}${e.remainder}`,onSelect:()=>Fa(t,e.remainder)},prefix:"\u21B5",kind:"freeform"}];if(e.remainder==="")return s;let a=await Ko(t,n);return a.length>0&&(s.push({spec:{primary:""},prefix:"",kind:"separator"}),s.push(...a)),s}function Go(e,t,n){return n.segments.length===0?[]:ut(e,t,n,!0)}function ur(e){let t=e.node.children.length>0&&e.primary!==".."&&e.primary!==".",n=t?`${e.primary}/`:e.primary,s=t?"\u203A":"";e.scopeIds.has(e.node.id)||e.forceCompletion?e.candidates.push(Vo({marker:e.marker,targetPath:e.targetPath,remainder:"",primary:n,secondary:Oa(e.node),selectedSecondary:e.scopeIds.has(e.node.id)?"type message to send":void 0,prefix:s})):e.candidates.push(Da({marker:e.marker,targetPath:e.targetPath,primary:n,secondary:Oa(e.node),taskId:e.node.id,prefix:s}))}function lr(e){for(let t of e.directory.children.sort(dr))ur({candidates:e.candidates,node:t,targetPath:pt(t,e.map),primary:dn(t),marker:e.marker,scopeIds:e.scopeIds})}function zo(e){let t=pt(e.target,e.map),n=t==="/"?"/.":t;e.candidates.push(Da({marker:e.marker,targetPath:n,primary:"navigate",selectedSecondary:e.scopeIds.has(e.target.id)?"or send a message":void 0,taskId:e.target.id,prefix:"\u21B5"}))}function cr(e){if(!e.directory.parentId)return;let t=e.map.get(e.directory.parentId);if(!t)return;let n=pt(t,e.map);ur({candidates:e.candidates,node:t,targetPath:n==="/"?"/.":n,primary:"..",marker:e.marker,scopeIds:e.scopeIds,forceCompletion:!0})}function Yo(e){zo({candidates:e.candidates,target:e.directory,map:e.map,marker:e.marker,scopeIds:e.scopeIds}),cr({candidates:e.candidates,directory:e.directory,map:e.map,marker:e.marker,scopeIds:e.scopeIds}),lr({candidates:e.candidates,directory:e.directory,marker:e.marker,map:e.map,scopeIds:e.scopeIds})}async function Jo(e){if(!r.taskId)return[];let t;try{t=await G()}catch{return[]}let n=Ke(t),s=n.get(r.taskId);if(!s)return[];let a=new Set(qa(r.taskId,t).map(u=>u.id)),i=[];if(e.path.trailingSlash){let u=Fo(r.taskId,t,e.path);return u?(cr({candidates:i,directory:u.directory,map:n,marker:e.marker,scopeIds:a}),lr({candidates:i,directory:u.directory,marker:e.marker,map:n,scopeIds:a}),i):[]}if(e.target==="")return cr({candidates:i,directory:s,map:n,marker:e.marker,scopeIds:a}),lr({candidates:i,directory:s,marker:e.marker,map:n,scopeIds:a}),i;let l=ut(r.taskId,t,e.path),d=ut(r.taskId,t,e.path,!0);if(d.length===1)Yo({candidates:i,directory:d[0],map:n,marker:e.marker,scopeIds:a});else for(let u of l)ur({candidates:i,node:u,targetPath:pt(u,n),primary:dn(u),marker:e.marker,scopeIds:a});return i}async function Xo(e,t,n){try{let s=await G(),a=Ke(s).get(r.taskId??""),i=ut(r.taskId,s,n);if(a&&i.length===1){let l=pt(i[0],Ke(s));b(`${e}${l==="/"?"/":`${l}/`}`);return}}catch{}b(t)}async function Fa(e,t){let n=r.taskId;if(!n){o("err: No active task");return}if(e.trim()===""){o("err: Task title is required after +");return}if(e.includes("/")){o("err: Task title cannot contain '/'");return}if(e==="."||e===".."){o("err: Task title cannot be '.' or '..'");return}let s=await Ve(t.trim());if("error"in s){o(`err: create failed \u2014 ${s.error}`);return}let a={parentId:n,cwd:s.cwd,title:e,inheritFromTaskId:n};try{o("Creating new task\u2026");let i=await vt(a),l=i.title??i.id;o(`Created ${l} at ${i.cwdDisplay??i.cwd??s.cwd}`),o(`Send its first instruction with @${De(l)} <message>`)}catch(i){let l=i instanceof Error?i.message:String(i);o(`err: create failed \u2014 ${l}`)}}async function Qo(e,t){let n=r.taskId;if(!n){o("err: No active task");return}if(!e.trim()){o("err: Task target is required after @");return}let s;try{s=await G()}catch(g){let y=g instanceof Error?g.message:String(g);o(`err: task list failed \u2014 ${y}`);return}if(!Ke(s).get(n)){o("err: Current task not found");return}let l=sr(e),d=Go(n,s,l),u=qa(n,s),p=new Set(u.map(g=>g.id)),h=d;if(h.length!==1){o(`err: Task path is incomplete or not found: '${e}'`);return}let f=h[0];if(t.trim()&&!p.has(f.id)){o(`err: ${dn(f)} is navigation \u2014 enter this Task before sending a message`);return}await Zo(f.id,t)}async function Zo(e,t){let n=r.taskId;if(!n){o("err: No active task");return}let s=t.trim();if(!s){await se(e);return}try{let a=await Ur(n,e,s);o(`Sent \u2192 ${a.messageId}`)}catch(a){let i=a instanceof Error?a.message:String(a);o(`err: message failed \u2014 ${i}`)}}async function Ha(e){if(!ie(e))return!1;let t;try{t=ar(e)}catch(n){let s=n instanceof Error?n.message:String(n);return o(`err: ${s}`),!0}return t.marker==="+"?await Fa(t.target,t.remainder):t.path.trailingSlash?t.remainder.trim()!==""?o("err: A path ending in / is navigation"):await Xo(t.marker,e,t.path):await Qo(t.target,t.remainder),!0}var ge=null,he=null,oe=0,je=dt,V,R=[],B=-1,le=null,ye=null;function mr(){return ye??c.input.value}function el(){return{name:"<agent-root>",children:r.agentCommands.map(e=>({name:`//${e.name}`,desc:e.input?`${e.description} \xB7 ${e.input.hint}`:e.description,onSelect:()=>{b(`//${e.name}`),c.sendBtn.click()}}))}}function gr(e){return e.startsWith("//")?el():dt}var tl={name:"<task-command-root>",desc:"Task-target command"};function Ua(e){ge="",he=null,oe++,je=gr(c.input.value),V=void 0,R=[{spec:{primary:e},prefix:"",kind:"placeholder"}],B=-1,Le(""),c.slashMenu.classList.add("active")}function mt(){let e=mr();if(le!==null){if(e===le)return;le=null}if(!e.startsWith("/")&&!ie(e)){_();return}if(ie(e)){nl(e);return}let t=e.startsWith("//");if(t&&r.busy){Ua("(agent busy \u2014 wait or ^C to cancel)");return}if(t&&r.agentCommands.length===0){Ua("(agent commands unavailable)");return}let n=gr(e),{node:s,pathPrefix:a,tailQuery:i}=In(e,n),l;try{l=s.fetch&&s.toSpec?s.fetchKey?`${a}\0${s.fetchKey(i)}`:a:null}catch(u){ge=a,he=null,je=s,V={error:pr(u)},ft(i,a);return}let d=a!==ge||l!==he;if(ge=a,he=l,je=s,d){let u=++oe;if(s.fetch&&s.toSpec){let p;try{p=s.fetch(i)}catch(h){V={error:pr(h)},ft(i,a);return}if(p instanceof Promise){V="loading";let h=a,f=l;p.then(m=>{oe!==u||ge!==h||he!==f||(V=m,ft(Va(),a))},m=>{oe!==u||ge!==h||he!==f||(V={error:pr(m)},ft(Va(),a))})}else V=p}else V=void 0}ft(i,a)}function Va(){let e=mr(),{tailQuery:t}=In(e,gr(e));return t}async function nl(e){ge=e,he=e,oe++;let t=oe;je=tl,V=void 0,R=[{spec:{primary:"(loading...)"},prefix:"",kind:"placeholder"}],B=-1,Le(""),c.slashMenu.classList.add("active");try{let n=await Ba(e);if(oe!==t)return;if(n.length===0){_();return}R=n;let s=n.findIndex(a=>a.kind!=="separator"&&a.kind!=="placeholder");B=s>=0?s:0,Le(""),c.slashMenu.classList.add("active")}catch(n){if(oe!==t)return;R=[{spec:{primary:`(${n instanceof Error?n.message:"error"})`},prefix:"",kind:"placeholder"}],B=0,Le(""),c.slashMenu.classList.add("active")}}function pr(e){return e instanceof Error&&e.message?e.message:"fetch failed"}function ft(e,t){let n=xs(je,e,V);if(c.input.value==="/"&&n.push({spec:{primary:"Agent commands: type //"},prefix:"",kind:"placeholder"}),R=n,n.length===0){_();return}let s=n.findIndex(a=>a.kind!=="separator"&&a.kind!=="placeholder");B=s>=0?s:0,Le(t),c.slashMenu.classList.add("active")}function Le(e){c.slashMenu.innerHTML="",c.slashMenu.classList.toggle("slash-menu-root",e===""),R.forEach((n,s)=>{if(n.kind==="separator"){let l=document.createElement("div");l.className="slash-separator",l.dataset.idx=String(s),c.slashMenu.appendChild(l);return}let a=s===B,i=Cs(n.spec,a,n.prefix);n.prefix==="\u203A"&&i.classList.add("slash-arrow"),n.kind==="placeholder"&&i.classList.add("slash-placeholder"),i.dataset.idx=String(s),c.slashMenu.appendChild(i)}),c.slashMenu.dataset.pathPrefix=e;let t=c.slashMenu.querySelector(".slash-item.selected");t&&t.scrollIntoView({block:"nearest"})}function _(){let e=mr();ye=null,c.slashMenu.classList.remove("active"),c.slashMenu.innerHTML="",B=-1,R=[],ge=null,he=null,oe++,je=dt,V=void 0,le=e}function Ka(e){ye=e,le=null,mt()}function fr(e,t,n){if(n){_();return}let s=t?" ":"",a=e.spec.continueOnFill===!0;a&&(le=null),b(`${t}${s}${e.spec.fill??e.spec.primary}`),a||_()}function rl(){let e=R[B];if(!e)return;let t=c.slashMenu.dataset.pathPrefix??"",n=ye!==null;if(!(e.kind==="separator"||e.kind==="placeholder")){if(e.kind==="subcommand"&&e.node){let a=(e.node.children??[]).length>0||!!e.node.fetch||!!e.node.freeform,l=`${t}${t?" ":""}${e.node.name}${a?" ":""}`;n?a?(ye=l,le=null,mt()):_():(b(l),a?(le=null,mt()):_())}else e.kind==="data"?fr(e,t,n):e.kind==="freeform"&&(e.spec.continueOnFill?fr(e,t,n):_());c.input.focus()}}async function sl(e){let t=R[e];if(!t)return;let n=c.slashMenu.dataset.pathPrefix??"",s=ye!==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 d=`${n}${n?" ":""}${t.node.name} `;le=null,s?(ye=d,mt()):b(d),c.input.focus();return}_(),s||b(""),t.node.onSelect&&await t.node.onSelect();return}if(t.spec.onSelect){_(),s||b(""),await t.spec.onSelect();return}fr(t,n,s),c.input.focus()}}function ja(e){return!c.slashMenu.classList.contains("active")||R.length===0?!1:e.key==="ArrowDown"?(B=Wa(B,1),Le(c.slashMenu.dataset.pathPrefix??""),!0):e.key==="ArrowUp"?(B=Wa(B,-1),Le(c.slashMenu.dataset.pathPrefix??""),!0):e.key==="Tab"?(rl(),!0):!1}function Wa(e,t){let n=R.length;for(let s=1;s<=n;s++){let a=(e+t*s+n)%n;if(R[a].kind!=="separator"&&R[a].kind!=="placeholder")return a}return e}c.slashMenu.addEventListener("mousedown",e=>{e.preventDefault();let n=e.target?.closest(".slash-item");n?.dataset.idx!==void 0&&sl(Number(n.dataset.idx))});c.input.addEventListener("input",()=>{ye=null,mt(),c.inputArea.classList.toggle("bash-mode",c.input.value.startsWith("!"))});function al(e){return new Promise(t=>{let n=new FileReader;n.onload=()=>{t(n.result)},n.readAsDataURL(e)})}async function za(e){let t=e.type.startsWith("image/"),n={kind:t?"image":"file",file:e,mimeType:e.type||"application/octet-stream",name:e.name||(t?"image":"file")};return t&&(n.previewUrl=await al(e)),n}function Ya(e){r.pendingAttachments.push(e),gt()}function Ga(e,t){e.classList.add("attach-file");let n=document.createElement("span");n.className="attach-file-name",n.textContent=t,e.appendChild(n)}function gt(){if(c.attachPreview.innerHTML="",r.pendingAttachments.length===0){c.attachPreview.classList.remove("active");return}c.attachPreview.classList.add("active"),r.pendingAttachments.forEach((e,t)=>{let n=document.createElement("span");if(n.className="attach-thumb",e.kind==="image"&&e.previewUrl){let a=document.createElement("img"),i=!1,l=()=>{i||(i=!0,a.remove(),Ga(n,e.name))};a.addEventListener("error",l),a.addEventListener("load",()=>{a.naturalWidth===0&&l()}),a.src=e.previewUrl,n.appendChild(a)}else Ga(n,e.name);let s=document.createElement("button");s.className="remove",s.textContent="\xD7",s.addEventListener("click",()=>{r.pendingAttachments.splice(t,1),gt()}),n.appendChild(s),c.attachPreview.appendChild(n)})}c.fileInput.onchange=async()=>{for(let e of c.fileInput.files)Ya(await za(e));c.fileInput.value=""};c.input.addEventListener("paste",e=>{let t=e.clipboardData?.items;if(t)for(let n of t)n.type.startsWith("image/")&&(e.preventDefault(),(async()=>{let s=n.getAsFile();s&&Ya(await za(s))})())});var Ge={send:()=>{},cancel:()=>{},attach:()=>{},publish:()=>{},cancelPreview:()=>{}};function Xa(e){Ge=e}function il(){if(r.previewToken)return[{label:"^P",title:"Publish preview (Ctrl+P)",className:"publish",onClick:()=>{Ge.publish()}},{label:"^C",title:"Cancel preview (Ctrl+C)",className:"cancel",onClick:()=>{Ge.cancelPreview()}}];let e={label:"^U",title:"Attach file (Ctrl+U)",onClick:()=>{Ge.attach()}},t=()=>{r.busy&&!or(c.input.value)?Ge.cancel():Ge.send()};if(r.busy&&!or(c.input.value)){let n=r.busyKind==="bash"&&r.cancelStatus==="requested"?"Force stop bash":r.busyKind==="bash"?"Cancel bash (Ctrl+C)":r.cancelStatus==="unconfirmed"?"Retry cancel (agent did not acknowledge)":r.cancelStatus==="requested"?"Retry cancel (waiting for agent acknowledgement)":"Cancel (Ctrl+C)";return[e,{label:"^C",title:n,className:"cancel",onClick:t}]}return[e,{label:"\u21B5",title:"Send (Enter)",onClick:t}]}var ol=["cancel","publish"];function Ja(e,t){e.textContent=t.label,e.title=t.title,e.disabled=t.disabled??!1,e.onclick=t.onClick;for(let n of ol)e.classList.remove(n);t.className&&e.classList.add(t.className)}function ll(){let[e,t]=il();Ja(c.attachBtn,e),Ja(c.sendBtn,t),c.input.disabled=!!r.previewToken}ws(ll);function Qa(e){let t=e.search(/\s/);return t<0?{token:e,remainder:""}:{token:e.slice(0,t),remainder:e.slice(t)}}function Za(e,t){if(!e.startsWith("//"))return null;let{token:n,remainder:s}=Qa(e),a=n.slice(2);if(!a)return null;let i=t.find(l=>l.name.toLowerCase()===a.toLowerCase());return i?{command:n,agentText:`/${i.name}${s}`}:null}function hr(e){return Qa(e).token||e}function yr(){return r.clientId!==null}r._onCancelTimeout=()=>o("warn: Agent not responding to cancel");function ti(){let e=c.input.value.trim();if(!e&&r.pendingAttachments.length===0)return;let t=e.startsWith("//");if(ie(e)&&r.pendingAttachments.length===0){let d=c.input.value;b(""),c.input.style.height="auto",c.inputArea.classList.remove("bash-mode"),Ha(d);return}if(ir(e)&&r.pendingAttachments.length===0){b(""),c.input.style.height="auto",rr(e);return}if(e.startsWith("!")&&r.pendingAttachments.length===0){let d=e.slice(1).trim();if(!d)return;if(!r.taskId){o("warn: Task not ready yet, please wait\u2026");return}if(!yr()){o("warn: Not connected, please retry");return}b(""),c.input.style.height="auto",c.inputArea.classList.remove("bash-mode"),Es(d,!0),r.sentBashForTask=r.taskId,Gr(r.taskId,d).catch(()=>{}),v(!0);return}if(r.busy)return;if(t&&!Za(e,r.agentCommands)){let d=hr(e);o(`err: Unknown command "${d}". Type // to see available commands.`);return}if(b(""),c.input.style.height="auto",c.inputArea.classList.remove("bash-mode"),!r.taskId){o("warn: Task not ready yet, please wait\u2026");return}if(!yr()){o("warn: Not connected, please retry");return}x(),L(),r.awaitingOwnUserEcho=!0,r.reconcileAfterOwnUserEcho=!1;let n=te();r.sentMessageOpId=n;let s=Rt("user",e||"(attachment)");s.dataset.optimisticOpId=n;let a=[];for(let d of r.pendingAttachments)if(d.kind==="image"&&d.previewUrl){let u=document.createElement("img");u.className="user-image",u.src=d.previewUrl,u.alt=d.name,s.appendChild(u),a.push(null)}else{let u=document.createElement("div");u.className="user-attachment",u.textContent=`[${d.kind}: ${d.name}]`,s.appendChild(u),a.push(u)}let i=r.pendingAttachments.slice();r.pendingAttachments.length=0,gt();let l=d=>{cl(d,{text:e,isAgentCommand:t,messageEl:s,attachments:i})};i.length>0?Promise.all(i.map(d=>{let u=new FormData;return u.append("file",d.file,d.name),fetch(`/api/v1/tasks/${r.taskId}/attachments`,{method:"POST",body:u}).then(p=>p.json()).then(p=>({kind:p.kind,attachmentId:p.attachmentId,displayName:p.displayName,mimeType:p.mimeType,url:p.url}))})).then(d=>{if(!yr()){s.remove(),o("warn: Not connected, please retry"),r.awaitingOwnUserEcho=!1,r.reconcileAfterOwnUserEcho=!1,v(!1);return}for(let p=0;p<d.length;p++){let h=a[p];if(!h)continue;let f=d[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 u=d.map(({kind:p,attachmentId:h,displayName:f,mimeType:m})=>({kind:p,attachmentId:h,displayName:f,mimeType:m}));kn(r.taskId,e||"What is in this attachment?",u,n).catch(l)}):kn(r.taskId,e,void 0,n).catch(l),r.turnEnded=!1,r.sentMessageForTask=r.taskId,v(!0),Ss()}function cl(e,t){if(r.awaitingOwnUserEcho=!1,r.sentMessageOpId=null,v(!1),z(),t?.isAgentCommand&&e instanceof ee&&e.status===k.UNPROCESSABLE_CONTENT){t.messageEl.remove(),r.sentMessageForTask=null,b(t.text),r.pendingAttachments.push(...t.attachments),gt();let s=hr(t.text);o(`err: Unknown command "${s}". Type // to see available commands.`);return}let n=e instanceof Error?e.message:String(e);o(`err: ${n}`)}function ni(){if(!r.busy||!r.taskId)return;let e=r.cancelStatus!==null;o(e?"^C retrying cancel\u2026":"^C cancelling\u2026"),Nt().then(()=>{}).catch(t=>{let n=t instanceof Error?t.message:String(t);o(`err: cancel failed \u2014 ${n}`)})}Xa({send:ti,cancel:ni,attach:()=>{c.fileInput.click()},publish:()=>{Wn()},cancelPreview:Kn});ne();c.input.addEventListener("keydown",e=>{if(ja(e)){e.preventDefault();return}if(e.key==="Enter"&&!e.shiftKey){e.preventDefault(),_(),ti();return}if(e.key==="u"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey){e.preventDefault(),c.fileInput.click();return}});document.addEventListener("keydown",e=>{if(e.key==="c"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&!(!!window.getSelection()?.toString()||c.input.selectionStart!==c.input.selectionEnd)){if(r.previewToken){e.preventDefault(),Kn();return}if(r.busy){e.preventDefault(),ni();return}}e.key==="Escape"&&c.slashMenu.classList.contains("active")&&(e.preventDefault(),_(),c.input.focus())});var ei=0;function ri(){let e=D("mode");if(!e?.options.length){Date.now()-ei>3e3&&(o("Mode switcher temporarily unavailable. Try `/new` to start a fresh task."),ei=Date.now());return}let t=e.options.findIndex(s=>s.value===e.currentValue),n=e.options[(t+1)%e.options.length];e.currentValue=n.value,Ae(r.taskId,"mode",n.value).catch(()=>{}),o(`Mode \u2192 ${n.name}`),C()}document.addEventListener("keydown",e=>{e.key==="m"&&(e.ctrlKey||e.metaKey)&&!e.shiftKey&&(e.preventDefault(),ri())});document.addEventListener("keydown",e=>{r.previewToken&&(!(e.ctrlKey||e.metaKey)||e.shiftKey||e.key==="p"&&(e.preventDefault(),Wn()))});c.prompt.addEventListener("click",ri);c.input.addEventListener("input",ne);c.input.addEventListener("input",()=>{Is(dl)});function dl(){c.input.style.height="auto",c.input.style.height=Math.min(c.input.scrollHeight,ul())+"px"}function ul(){let e=Number.parseFloat(window.getComputedStyle(c.input).maxHeight);return Number.isFinite(e)?e:Number.POSITIVE_INFINITY}var pl=T.scope("sse");async function fl(e){try{let n=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!n)return;await fetch("/api/beta/push/register-client",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:e,endpoint:n.endpoint})})}catch{}}var ml=45e3,gl=5e3,hl=3e3,ze=0,kr=null,X=0,Pe=null;function si(){Pe||(Pe=setTimeout(()=>{Pe=null,pn()},hl),Pe.unref?.())}function wr(){ze=Date.now()}function yl(){kr||(kr=setInterval(ai,gl),kr.unref?.())}function ai(){if(!ze||Date.now()-ze<ml)return;pl.warn("stream silent, reconnecting",{silentMs:Date.now()-ze}),ze=0;let e=r.eventSource;e&&(e.onerror=null,e.close()),ii(),pn()}function pn(){Pe&&(clearTimeout(Pe),Pe=null);let e=++X,t=r.taskId;de("connecting","connecting"),kl(e,t)}async function kl(e,t){wr(),yl();let n;try{n=(await zr()).ticket}catch{e===X&&si();return}if(e!==X)return;let s=new EventSource(`/api/v1/events/stream?ticket=${encodeURIComponent(n)}`);r.eventSource=s,s.onmessage=a=>{if(e!==X){s.close();return}wr();let i=JSON.parse(a.data);i.type==="connected"&&i.clientId&&(r.clientId=i.clientId,t&&r.taskId===t&&(de("connected","connected"),wl(t,e)),typeof i.pendingCount=="number"&&At(i.pendingCount),Ot(i.debugLevel),Me(i.clientId,!document.hidden,r.taskId??void 0),fl(i.clientId),!i.agent)||J(i)},s.onerror=()=>{s.close(),e===X&&(ze=0,ii(),si())},s.addEventListener("heartbeat",()=>{e===X&&(wr(),r.clientId&&(document.hidden||Me(r.clientId,!0,r.taskId??void 0)))}),vl(t)}async function wl(e,t){let n=U(e,()=>t===X&&r.taskId===e);if(await Ee(e),t!==X||r.taskId!==e)return;await Promise.resolve();let s=await Ee(e);!s&&t===X&&r.taskId===e&&(await Promise.resolve(),s=await Ee(e)),!(!await n||t!==X||r.taskId!==e)&&(He(),s&&S(!1))}async function vl(e){await Tl(e),await ga()}async function Tl(e=null){de("connecting","task loading");let t=r.taskSwitchGen,n=vs();if(n&&n===r.taskId){if(await un(n,!0,t),t!==r.taskSwitchGen)return;S(!1);return}if(!n&&e&&r.taskId===e){if(await un(e,!0,t),t!==r.taskSwitchGen)return;S(!1);return}if(n){if(N({preserveNavigationTarget:r.pendingNavigationTaskId===n}),await un(n,!1,t),t!==r.taskSwitchGen)return;S(!0);return}try{let s=await G();if(t!==r.taskSwitchGen)return;if(s.length>0){let a=s.find(i=>i.hasUserInput)??s.find(i=>i.id==="root")??s[0];if(N(),await un(a.id,!1,t),t!==r.taskSwitchGen)return;S(!0);return}}catch{}t===r.taskSwitchGen&&(Un()||Re())}async function un(e,t,n){if(t){try{let a=await ve(e);if(n!==r.taskSwitchGen)return;J({type:"task_created",taskId:a.id,cwd:a.cwd,cwdDisplay:a.cwdDisplay,title:a.title,configOptions:a.configOptions})}catch{if(n!==r.taskSwitchGen)return;await Y(e,r.taskCwd??void 0);return}if(n!==r.taskSwitchGen)return;let[s]=await Promise.all([U(e,()=>n===r.taskSwitchGen),Ee(e)]);if(n!==r.taskSwitchGen)return;s?He():await Y(e,r.taskCwd??void 0)}else{r.taskId=null,r.pendingNavigationTaskId=e;let s=st(e),a;try{let[i,l]=await Promise.all([ve(e),s]),d=await U(e,()=>n===r.taskSwitchGen);if(n!==r.taskSwitchGen)return;if(!d){await Y(e,r.taskCwd??void 0);return}He(),a=i,l||o("warn: Failed to load history.")}catch{if(n!==r.taskSwitchGen)return;await Y(e,r.taskCwd??void 0);return}J({type:"task_created",taskId:a.id,cwd:a.cwd,cwdDisplay:a.cwdDisplay,title:a.title,configOptions:a.configOptions}),Yt(e)}}function ii(){de("disconnected","disconnected"),r.eventSource=null,r.clientId=null,x(),L(),r.currentBashEl&&qe(r.currentBashEl,null,"disconnected"),r.pendingToolCallIds.clear(),r.pendingPermissionRequestIds.clear(),r.pendingPromptDone=!1,r.turnEnded=!1,r.currentPromptId=null,r.lastStateSeq=0,ue(),v(!1)}function oi(e,t){let n=`/api/beta/clients/${encodeURIComponent(e)}/visibility`,s=JSON.stringify({visible:!1,taskId:t});try{fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s,keepalive:!0}).catch(()=>{})}catch{}}document.addEventListener("visibilitychange",()=>{if(r.clientId&&(document.hidden?oi(r.clientId,r.taskId??null):Me(r.clientId,!0,r.taskId??void 0)),document.hidden||ai(),!document.hidden&&r.taskId&&!r.replayInProgress){let e=r.taskId;Promise.all([U(e,()=>r.taskId===e),Ee(e)]).then(([t])=>{!t||r.taskId!==e||(He(),S(!1))})}});window.addEventListener("pagehide",()=>{r.clientId&&oi(r.clientId,r.taskId??null)});var bl=80,Sl=300,Il=10,El=350,xl=24,li=!1,ce=null,M=null;function Cl(){return typeof window.visualViewport>"u"?null:window.visualViewport}function ci(){let e=Cl();return e?e.offsetTop>0||window.innerHeight-e.height>bl:!0}function vr(e){return typeof e.pointerId=="number"?e.pointerId:1}function Ll(e){if(e.pointerType!=="touch")return;if(ce=null,document.activeElement!==c.input||c.input.disabled){M=null;return}let t=e.target===c.input?"input":e.target instanceof window.Node&&c.statusBar.contains(e.target)?"status-bar":null;if(!t){M=null;return}ce={pointerId:vr(e),startX:e.clientX,startY:e.clientY,startTs:e.timeStamp,keyboardLikelyOpenAtStart:ci(),target:t}}function Pl(e){if(!ce||vr(e)!==ce.pointerId)return;let t=ce;ce=null;let n=e.timeStamp-t.startTs,s=Math.hypot(e.clientX-t.startX,e.clientY-t.startY);if(n>Sl||s>Il){M=null;return}if(document.activeElement!==c.input||c.input.disabled){M=null;return}if(t.target==="input"&&!t.keyboardLikelyOpenAtStart&&!ci()){M=null,c.input.blur();return}if(t.target==="input"){M=null;return}let a=M?t.startTs-M.endTs:Number.POSITIVE_INFINITY,i=M?Math.hypot(e.clientX-M.endX,e.clientY-M.endY):Number.POSITIVE_INFINITY;if(a>=0&&a<=El&&i<=xl){M=null,c.input.blur();return}M={endX:e.clientX,endY:e.clientY,endTs:e.timeStamp}}function Al(e){ce&&vr(e)===ce.pointerId&&(ce=null,M=null)}function di(){li||(li=!0,document.addEventListener("pointerdown",Ll,{capture:!0}),document.addEventListener("pointerup",Pl,{capture:!0}),document.addEventListener("pointercancel",Al,{capture:!0}))}var ui=!1;function pi(){ui||(ui=!0,c.inboxBtn.addEventListener("click",()=>{c.input.value?Ka("/inbox "):b("/inbox "),c.input.focus()}))}if(!localStorage.getItem(Q))throw location.replace("/login"),new Error("redirecting to /login");Nr();Rs(o);di();pi();c.messages.addEventListener("click",Sr);hn(Ir);pn();fetch("/api/v1/version").then(e=>e.json()).then(e=>{typeof e.server=="string"&&(r.serverVersion=e.server);let t=e.agent;t&&(r.agentName=typeof t.name=="string"?t.name:null,r.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"&&ma(t).catch(n=>{let s=n instanceof Error?n.message:String(n);o(`err: notification navigation failed (${s})`)})}));
|