teapot-coding-agent 0.22.12 → 0.22.13
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/dist/master.js +16 -12
- package/package.json +1 -1
- package/public/assets/{index-vP-CYzAU.js → index-Bg8Y4MGZ.js} +4 -4
- package/public/assets/{index-vP-CYzAU.js.map → index-Bg8Y4MGZ.js.map} +1 -1
- package/public/assets/{shiki-CDxIkmYs.js → shiki-B-DhHuic.js} +2 -2
- package/public/assets/{shiki-CDxIkmYs.js.map → shiki-B-DhHuic.js.map} +1 -1
- package/public/index.html +1 -1
package/dist/master.js
CHANGED
|
@@ -814,19 +814,8 @@ When this task is done (or truly blocked), call finish() with a summary for @${p
|
|
|
814
814
|
resolveSessionDir(agentId, fresh) {
|
|
815
815
|
const root = this.sessionsRoot();
|
|
816
816
|
mkdirSync(root, { recursive: true });
|
|
817
|
-
// exact-restart match first: <agentId> itself (or a previously generated
|
|
818
|
-
// <agentId>-<suffix> dir when the bare name was taken) — but only when it
|
|
819
|
-
// actually carries history. An empty log here must not shadow the real
|
|
820
|
-
// one found by findLatestSessionDir below.
|
|
821
|
-
const selfDir = path.join(root, agentId);
|
|
822
|
-
const selfOwner = this.readSessionOwner(agentId);
|
|
823
|
-
const selfUsable = selfOwner === null || selfOwner === agentId;
|
|
824
|
-
if (!fresh &&
|
|
825
|
-
selfUsable &&
|
|
826
|
-
statSync(path.join(selfDir, "chat.jsonl"), { throwIfNoEntry: false })?.size) {
|
|
827
|
-
return selfDir; // restart → continue where we left off
|
|
828
|
-
}
|
|
829
817
|
// one-time migration from the ≤0.5.0 flat layout (<dataDir>/<id>.jsonl)
|
|
818
|
+
// MUST run first so the bare-name directory exists for subsequent checks
|
|
830
819
|
if (!fresh) {
|
|
831
820
|
const legacy = path.join(this.config.dataDir, `${agentId}.jsonl`);
|
|
832
821
|
if (existsSync(legacy)) {
|
|
@@ -838,11 +827,26 @@ When this task is done (or truly blocked), call finish() with a summary for @${p
|
|
|
838
827
|
}
|
|
839
828
|
}
|
|
840
829
|
}
|
|
830
|
+
// Prefer the LATEST session directory that actually carries history.
|
|
831
|
+
// This handles the case where a bare-name directory (e.g. from legacy
|
|
832
|
+
// migration) would otherwise shadow a newer UUID-suffixed incarnation
|
|
833
|
+
// (the "example-session-2 timeline empty" bug).
|
|
841
834
|
if (!fresh) {
|
|
842
835
|
const existing = this.findLatestSessionDir(agentId);
|
|
843
836
|
if (existing)
|
|
844
837
|
return existing; // restart → continue where we left off
|
|
845
838
|
}
|
|
839
|
+
// exact-restart match: bare <agentId> directory — only if no history-carrying
|
|
840
|
+
// UUID-suffixed directory was found above. This covers the very first run
|
|
841
|
+
// before any UUID-suffixed dir exists, and legacy flat migrations.
|
|
842
|
+
const selfDir = path.join(root, agentId);
|
|
843
|
+
const selfOwner = this.readSessionOwner(agentId);
|
|
844
|
+
const selfUsable = selfOwner === null || selfOwner === agentId;
|
|
845
|
+
if (!fresh &&
|
|
846
|
+
selfUsable &&
|
|
847
|
+
statSync(path.join(selfDir, "chat.jsonl"), { throwIfNoEntry: false })?.size) {
|
|
848
|
+
return selfDir; // restart → continue where we left off
|
|
849
|
+
}
|
|
846
850
|
// fresh incarnation: guaranteed-unique directory
|
|
847
851
|
let sid = "";
|
|
848
852
|
do {
|
package/package.json
CHANGED
|
@@ -21,10 +21,10 @@ WARNING: This link could potentially be dangerous`)){let e=window.open();if(e){t
|
|
|
21
21
|
- task two"title="shared with the agent — it may check items off via set_todo; your unsaved edits win until you save"style="width:100%;background:var(--bg-darkest);border:none;border-radius:6px;padding:6px 8px;color:var(--fg);font-family:ui-monospace,Menlo,monospace;font-size:12.5px;resize:vertical">`),Al=F(`<div style=display:flex;justify-content:flex-end;align-items:center;gap:10px;margin-top:4px><label class=muted title="queue a harness prompt telling the agent the task list changed"style=display:flex;align-items:center;gap:4px;font-size:11.5px;white-space:nowrap;cursor:pointer><input id=todo-notify type=checkbox checked> notify agent</label><button style="background:var(--ok);border:none;border-radius:6px;color:#fff;padding:4px 12px;cursor:pointer">✓ save tasks`),jl=F(`<h3 title="latest report_progress snapshot. The harness asks for one after real activity (time AND output gates); errors show under ⚠ problems">📈 progress`),Ml=F(`<h3 title="cumulative billed totals · the cached pill counts tokens served from the provider's prompt cache (far cheaper) · context bar turns orange ≥70% and red ≥85% of the model window">📊 runtime`),Nl=F(`<span class="pill ok">⚡ <!>% cached`),Pl=F(`<div class=statrow><span class=k>cost</span><b>$`),Fl=F(`<div class="card runcard"><div class=statgrid><div class=stat title="LLM turns taken this session"><span>turns</span><b></b></div><div class=stat title="tool calls executed"><span>tools</span><b></b></div><div class=stat title="times old turns were summarized to free context"><span>compacted</span><b></b></div></div><div class=statrow><span class=k>tokens</span><b> in / <!> out`),Il=F(`<h3>🌿 branches <span class=muted style=text-transform:none;letter-spacing:0>· click to filter the feed`),Ll=F(`<h3>⏰ schedule <span class=muted style=text-transform:none;letter-spacing:0>· cron tasks, all agents · edit in settings`),Rl=F(`<div><nav class=sidebar><div class=agent-list></div><div class=sidebar-footer><div class=footer-row style=justify-content:flex-end><button>🔔</button></div><div class=brand-row><div class=brand>🫖 teapot <span class=version>v</span><span></span></div></div><div class=metrics></div></div></nav><section class=channel></section><aside>`),zl=F(`<div class=notifbackdrop>`),Bl=F(`<button class=editbtn>clear all`),Vl=F(`<div class=notiflist>`),Hl=F(`<div class=notifpanel><div class=notifhead>notifications<span style=display:flex;gap:8px;align-items:center><button class=iconbtn title="close notifications">✕`),Ul=F(`<span class=caret>`),Wl=F(`<span class=notifbadge>🔔`),Gl=F(`<span class=subtag>🧩`),Kl=F(`<span class=mini-cron>⏰`),ql=F(`<span title="goal done">✓`),Jl=F(`<div><span></span><span>`),Yl=F(`<span class=caret-spacer>`),Xl=F(`<span class=ghosttag title="workspace missing">👻`),Zl=F(`<span>🧩 `),Ql=F(`<label class=trow>system light →<select class=w100>`),$l=F(`<label class=trow>system dark →<select class=w100>`),eu=F(`<option>`),tu=F(`<button><span class=swdots>`),nu=F(`<i>`),ru=F(`<div class=muted style=display:grid;place-items:center;height:100%>select an agent`),iu=F(`<div class="divider-msg compacting"title="the harness is compressing old turns into notes so work can continue within the context window">🗜 `),au=F(`<div class=muted style=display:grid;place-items:center;height:100%>no events yet — say something or press ▶ start`),ou=F(`<div class="content muted">thinking…`),su=F(`<span>⌨ <button class=tabx title="close this shell">✕`),cu=F(`<div><b class=mono></b><span class=muted>`),lu=F(`<div class=cmdrow><b>@</b><span class=muted>`),uu=F(`<span class=imgchip><img><button type=button class=imgx title=remove>✕`),du=F(`<span class=badge title="no goal set yet">no goal`),fu=F(`<button>`),pu=F(`<div class="card muted">no goal yet — write one below and press ✓ save. Then ▶ start (or any message) sets it in motion.`),mu=F(`<div><div class=vtitle><span class="meta muted"style=margin-left:auto></span></div><div class=content>`),hu=F(`<div class="content mdpreview"style="max-height:40vh;padding:8px 10px">`),gu=F(`<div class=muted>none yet — the harness asks for a report after real activity, and the agent can report_progress anytime`),_u=F(`<div class=progrow><b>recent</b><span class="content inline-md">`),vu=F(`<div class="progrow warn"><b>⚠ problems</b><span class="content inline-md">`),yu=F(`<div class=progrow><b>next</b><span class="content inline-md">`),bu=F(`<div class=progrow><b>goal</b><span>`),xu=F(`<div class="card prog"><div class=progrow><b>doing</b><span class="content inline-md"></span></div><div class="meta muted">`),Su=F(`<div class=statrow><span class=k>context</span><span class=muted>no window known for this model yet`),Cu=F(`<span>% of `),wu=F(`<div class=bartrack><div>`),Tu=F(`<div class=bartrack style=margin-top:4px><div>`),Eu=F(`<div class=statrow title="a compaction pass is running right now — the summarizer's output streams in the timeline"><span class=k>🗜</span><b>compacting…</b><span class=muted style=font-size:11px;color:var(--acc)>`),Du=F(`<div class=ctxblock title="estimated live context vs the model's real window. Past the window, old turns are summarized into notes (compaction); the compact line below shows where that starts."><div class=statrow><span class=k>context</span><b>~<!> tok</b></div><div class=statrow style=margin-top:4px><span class=k>compact</span><b> tok</b><span class=muted style=font-size:11px;color:var(--dim)></span></div><div class=ctrlrow style=margin-top:6px><label title="when on, older turns are automatically summarized when context exceeds the budget"><input type=checkbox>auto-compact</label><span class=muted style=font-size:11.5px>summarizes old turns when budget exceeded</span></div><div class=muted style=font-size:11px;margin-top:4px>compaction starts around ~<!> tok — older turns get summarized, recent ones stay intact`),Ou=F(`<div><span></span><span> events`),ku=F(`<div class=muted>no scheduled tasks — add them in ⚙ settings ("scheduled tasks")`),Au=F(`<span title="runs on a forked branch so chatter stays off the main line">⑂`),ju=F(`<div><div class=sched-top><b></b><span class=muted>@</span></div><div class="sched-meta mono"> → next </div><div class="sched-prompt muted">`),Mu=F(`<div class=muted style=padding:10px>nothing yet — progress, finishes, questions and errors will land here`),Nu=F(`<div class=nbody>`),Pu=F(`<div><div class=nhead><span class=nicon></span><span class=ntitle></span><span class="meta muted"></span><button class="iconbtn nreadbtn">`),Fu=F(`<div><div style=font-size:12.5px;margin-bottom:4px> event(s) came after this prompt — what should happen to them on the new branch?</div><label style=display:flex;gap:6px;align-items:center;font-size:13px;color:var(--fg)><input type=radio name=tail>summarize them into a note the agent can still read</label><label style=display:flex;gap:6px;align-items:center;font-size:13px;color:var(--fg)><input type=radio name=tail>discard them entirely (clean timeline)`),Iu=F(`<form style=display:flex;flex-direction:column;gap:10px><textarea id=edit-text class="mono w100"rows=6></textarea><div style=display:flex;justify-content:flex-end;gap:8px><button type=button>cancel</button><button type=submit style="background:var(--acc);border:none;border-radius:6px;color:#fff;padding:6px 12px;cursor:pointer">⑂ fork & resend`),Lu=F(`<span class=bashelapsed>running… `),Ru=F(`<span class=bashelapsed> elapsed`),zu=F(`<span class=thinktimer>`),Bu=F(`<div class=mono>`),Vu=F(`<pre class="mono toolbody">`),Hu=F(`<div class=meta>ms`),Uu=F(`<div class=meta>waiting for output…`),Wu=F(`<div class="meta bgjob-note">runs in background — poll with <b>bash_output(job_id="<!>")`),Gu=F(`<b>action="kill"`),Ku=F(`<div class="meta muted"> bytes — open it from 🗂 files for the full view`),qu=F(`<div class=meta>`),Ju=F(`<div class=meta>writing…`),Yu=F(`<pre class="mono toolbody del">`),Xu=F(`<pre class="mono toolbody add">`),Zu=F(`<div class=meta> · <!>ms`),Qu=F(`<div class=meta>applying…`),$u=F(`<pre class="mono toolbody patch">`),ed=F(`<div>`),td=F(`<div class="pline meta">… <!> more lines`),nd=F(`<div class=meta>validating…`),rd=F(`<a target=_blank rel="noopener noreferrer"referrerpolicy=no-referrer>open ↗`),id=F(`<span class=muted>`),ad=F(`<div class=meta>loading…`),od=F(`<div class=meta>bundled: `),sd=F(`<div class=meta>saving…`),cd=F(`<span class=actor>@`),ld=F(`<details><summary><b>⚙ </b><span class=meta></span><span class=toolcopy>`),ud=F(`<div class=divider-msg>⑂ forked from <!> → `),dd=F(`<div class=divider-msg>🎯 goal <!>: `),fd=F(`<div class=divider-msg>✅ tasks updated (<!>)`),pd=F(`<div> → `),md=F(`<div class="embed fail"><div class=mono>🛑 runaway: <!> tool failures in a row (limit <!>)</div><div class=meta>last: <!> — `),hd=F(`<div class="embed warn-embed"title="a round-fatal API error occurred; auto-retry is waiting, then a fresh round starts (onError: retry)"><div class=mono>↻ API error — retrying (attempt <!>) in <!>s…`),gd=F(`<div class=divider-msg>🗜 compacted: <!> → <!> tok (<!>)`),_d=F(`<button class=editbtn title="withdraw this message — it has not reached the model yet; the text goes back to the input box">✕ cancel`),vd=F(`<button class=editbtn title="edit this prompt — forks the conversation here (later events are dropped or summarized)">✎ edit`),yd=F(`<div class=msg-head><span class=author></span><span class=ts></span><span class=ts>`),bd=F(`<div><div></div><div class=msg-body>`),xd=F(`<span class=grouptime>`),Sd=F(`<div class=qfree><input type=text><button>reply`),Cd=F(`<div class=promptimgs>`),wd=F(`<img class=promptimg alt=attachment>`),Td=F(`<details class=reasoning><summary>💭 reasoning</summary><div class=mono>`),Ed=F(`<div class=interrupted>⚠ interrupted — partial output kept`),Dd=F(`<div class=msgfoot><span>copy summary`),Od=F(`<details><summary><span class=meta></span></summary><div class=mono></div><div class=meta>ms`),kd=F(`<div class="content muted">Rejected: `),Ad=F(`<details class="embed decision"><summary><b>📌 <span class="content inline-md"></span></b><span class=meta>decision logged</span></summary><div class=content>`),jd=F(`<div class=meta style=color:var(--ok)>✓ answered — continuing below`),Md=F(`<div class=qopts>`),Nd=F(`<div><div>❓ <div class="content inline-md">`),Pd=F(`<button class=qopt>`),Fd=F(`<div class=embed style=border-color:var(--ok)><div>📈 <div class="content inline-md">`),Id=F(`<div class="embed fail"><div class=mono>⚠ `),Ld=F(`<div class=vtitle style=margin-top:6px>what the agent kept`),Rd=F(`<details class="embed compaction"><summary><b>🗜 context compacted</b><span class=meta> · <!> → <!> tok · `),zd=F(`<div class="content muted">`),Bd=F(`<button type=button><span class=iconbtn-glyph>`),Vd=F(`<button class=copybtn>`),Hd=F(`<div class=overlay><div class=modal><div class=modal-head><b></b><button class=iconbtn>✕`),Ud=F(`<span style=color:var(--err);font-size:13px>`),Wd=F(`<form style=display:flex;flex-direction:column;gap:10px><label>workspace directory<div style=display:flex;gap:6px><input type=text class="w100 mono"><button type=button>go</button><button type=button title="parent directory">↑</button></div></label><div class=dirlist></div><div style=display:flex;gap:10px><label style=flex:1>agent name <input type=text placeholder="(directory name)"></label><label>provider<select></select></label><label style=flex:1>model <input type=text placeholder="(provider default)"></label></div><button type=submit style=align-self:flex-end>create`),Gd=F(`<div class=direntry>📁 `),Kd=F(`<span class=fsize>`),qd=F(`<div><span class=ficon></span><span class=fname>`),Jd=F(`<h3 title="the agent's workspace — lazy-loaded, dotfiles hidden; click a folder to expand, a file to preview"style=display:flex;align-items:center;gap:6px>🗂 files <span class=muted style=text-transform:none;letter-spacing:0>· `),Yd=F(`<div class=filebox>`),Xd=F(`<div class=muted style=padding:6px>`),Zd=F(`<img>`),Qd=F(`<div class=mediapreview><div class="meta muted"> preview`),$d=F(`<button title="rendered markdown">👁 preview`),ef=F(`<button title="edit and save back to the workspace">✎ edit`),tf=F(`<div class=filetoolbar><button title="syntax-highlighted source"></> code`),nf=F(`<div class=fileeditor><textarea class=mono></textarea><div class=filerow-actions><span class=muted> bytes</span><button class=savebtn>`),rf=F(`<div class=mono style=margin:0;color:var(--dim)>(binary file — inspect it from the terminal)`),af=F(`<div class="content mdpreview">`),of=F(`<video controls>`),sf=F(`<audio controls>`),cf=F(`<div class=filepreview>`),lf=F(`<div class=muted style=padding-top:6px;font-size:11.5px>… truncated (first 100 KB)`),uf=F(`<div class=muted style=padding:8px;font-size:12px>✨ highlighting <!>…`),df=F(`<pre class=mono style=max-height:62vh;overflow:auto;white-space:pre-wrap;margin:0>`),ff=F(`<div class=muted style=font-size:11.5px;margin-top:-6px>`),pf=F(`<span style=color:var(--fg)>`),mf=F(`<div class=muted style=font-size:11.5px;margin-top:-8px> models found at this endpoint`),hf=F(`<div class=overlay style=background:var(--bg-darkest)><div class=modal style=max-width:560px><div class=modal-head><b>🫖 welcome to teapot</b></div><p class=muted style="margin:0 0 10px;font-size:13px">first run — pick an OpenAI-compatible provider and you're done. everything below can be changed later in ⚙ settings.</p><form style=display:flex;flex-direction:column;gap:12px><div style=display:flex;gap:6px;flex-wrap:wrap></div><label>base url<input type=text class="w100 mono"list=wiz-preset-urls><datalist id=wiz-preset-urls></datalist></label><label>api key <input type=password class=w100 placeholder="(local providers may not need one)"></label><label>default model<input type=text class="w100 mono"list=wiz-model-list><datalist id=wiz-model-list></datalist></label><fieldset><legend>first agent</legend><label>workspace directory<input type=text class="w100 mono"></label><label title="asks for this password when opening the UI or API from another machine — plain-HTTP LAN traffic is NOT encrypted"style=margin-top:4px>protect the API with a password? <input type=password class=w100 placeholder="(optional — LAN traffic is still plain HTTP)"></label></fieldset><button type=submit style="background:var(--acc);border:none;border-radius:8px;color:#fff;padding:9px 14px;font-weight:600;cursor:pointer">`),gf=F(`<button type=button>`),_f=F(`<div class=muted style=font-size:11.5px;margin-top:-8px>models appear here automatically once the endpoint answers GET /models`),vf=F(`<label><input type=number min=0>`),yf=F(`<form style=display:flex;flex-direction:column;gap:14px><fieldset><legend>providers</legend><button type=button>+ add custom</button><div style=display:flex;gap:6px;flex-wrap:wrap;margin-top:6px><span class=muted style=font-size:11.5px>quick-add:</span></div><div><label title="agents without an explicit provider use this one"style=display:flex;align-items:center;gap:6px;margin-top:6px>default provider<select><option value>(none — first provider wins)</option></select></label></div></fieldset><fieldset><legend>agent runtime</legend><div class=cfggrid><label title="auto-compact threshold in k tokens. Leave EMPTY to derive per model (75% of its context window) — recommended, since models differ wildly in window size. Set only to force an absolute cap across all models.">compact budget (k tok)<input type=number min=0 placeholder="(derive: 75% of window)"></label></div></fieldset><fieldset><legend>scheduled tasks</legend><button type=button>+ add task</button></fieldset><fieldset><legend>agents (read-only — edit config file or use +)</legend></fieldset><fieldset><legend>live update</legend><div class=cfgrow><span class=muted>current version: </span><button type=button style="background:var(--acc);border:none;border-radius:6px;color:#fff;padding:6px 14px;cursor:pointer">update & restart</button><span class=muted style=margin-left:8px;font-size:12px>gracefully stops all agents, spawns new process, then reloads this page</span></div></fieldset><button type=submit style="align-self:flex-end;background:var(--acc);border:none;border-radius:6px;color:#fff;padding:6px 14px;cursor:pointer">save settings`),bf=F(`<div class=cfgrow><input class=cfgname placeholder=name><input placeholder=https://…/v1><input placeholder="api key"type=password><input placeholder="default model"><button type=button class=danger title="remove provider">✕`),xf=F(`<button type=button>+ `),Sf=F(`<div class=cfgcol><div class=cfgrow><input placeholder=id><input placeholder="agent id"><input placeholder="every 30m / cron"><label style=display:flex;gap:3px;align-items:center;white-space:nowrap;color:var(--dim);font-size:11px><input type=checkbox>fork</label><button type=button class=danger>✕</button></div><textarea rows=2 placeholder="prompt to send">`),Cf=F(`<span class=muted>🧩 sub of @`),wf=F(`<div class=cfgrow><b></b><span class=muted>`),Tf=new Map;function Ef(e){let t=Tf.get(e);if(t!==void 0)return t;let n=Ie(e);return Tf.set(e,n),Tf.size>500&&Tf.delete(Tf.keys().next().value),n}var Df={prompt:{name:`you`,icon:`🟧`,color:`#faa81a`},user:{name:`you`,icon:`🟧`,color:`#faa81a`},message:{name:`agent`,icon:`🫖`,color:`#5865f2`},progress:{name:`progress`,icon:`📈`,color:`#3ba55d`},question:{name:`agent`,icon:`❓`,color:`#5865f2`}},Of={name:`harness`,icon:`📣`,color:`#3ba55d`},[kf,Af]=v(``),jf,Q=e=>{Af(e),clearTimeout(jf),jf=setTimeout(()=>Af(``),3200)},Mf=[{key:`dark`,label:`Dark`,mode:`dark`,sw:[`#1a1c22`,`#2b2e39`,`#5865f2`]},{key:`midnight`,label:`Midnight`,mode:`dark`,sw:[`#0d0f18`,`#252a42`,`#8b7cf7`]},{key:`tea`,label:`Milk Tea`,mode:`dark`,sw:[`#241c16`,`#493b2d`,`#d98e32`]},{key:`coffee`,label:`Coffee`,mode:`dark`,sw:[`#191410`,`#403527`,`#c68a4b`]},{key:`matcha`,label:`Matcha`,mode:`dark`,sw:[`#1b2217`,`#3c4a33`,`#8db64e`]},{key:`matrix`,label:`Matrix`,mode:`dark`,sw:[`#060a06`,`#18301d`,`#2fd558`]},{key:`sunset`,label:`Sunset`,mode:`dark`,sw:[`#1c1422`,`#452f52`,`#f2784b`]},{key:`light`,label:`Light`,mode:`light`,sw:[`#eceef4`,`#ffffff`,`#4757d8`]},{key:`strawberry`,label:`Strawberry`,mode:`light`,sw:[`#fbe4ea`,`#fffafb`,`#e05575`]},{key:`ramune`,label:`Ramune`,mode:`light`,sw:[`#ddeff7`,`#fbfeff`,`#1d86ae`]}];function Nf(){let e=``,t=``;try{let n=getComputedStyle(document.documentElement);e=n.getPropertyValue(`--term-bg`).trim(),t=n.getPropertyValue(`--term-fg`).trim()}catch{}return{background:e||`#0d0e12`,foreground:t||`#dcdee4`}}var Pf=e=>{if(e.data?.actor)return{name:`@${String(e.data.actor)}`,icon:`🧩`,color:`#3ba0c9`};if(e.type===`tool_call`||e.type===`tool_result`)return{name:String(e.data?.name??`tool`),icon:`⚙`,color:`#3ba0c9`};if(e.type===`prompt`){let t=String(e.data?.source??`user`);return t===`user`?Df.prompt:t.startsWith(`scheduler:`)?{name:t.slice(10),icon:`📣`,color:`#3ba55d`}:Of}return Df[e.type]??{name:e.type,icon:`•`,color:`#9298a5`}},Ff=new Set([`user`,`message`,`prompt`,`tool_call`,`tool_result`,`progress`,`state`,`error`,`fork`,`goal`,`todo`,`question`,`decision`,`compaction`,`system_note`]),If=new Set([`system_note`]),Lf=e=>{let t=new Date(e);return`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`};async function $(e,t){let n=localStorage.getItem(`teapot.token`),r=new Headers(t?.headers);n&&!r.has(`authorization`)&&r.set(`authorization`,`Bearer ${n}`);let i=await fetch(e,{...t,headers:r});if(!i.ok){i.status===401&&window.dispatchEvent(new CustomEvent(`teapot:unauthorized`));let t=null;try{t=await i.json()}catch{}let n=(t&&typeof t==`object`&&`error`in t?String(t.error):``)||`${e}: HTTP ${i.status}`;throw Object.assign(Error(n),{payload:t})}return i.json()}var Rf=location.hash.match(/[#&]token=([^&]+)/);Rf&&(localStorage.setItem(`teapot.token`,decodeURIComponent(Rf[1])),history.replaceState(null,``,location.pathname+location.search));var zf=()=>{let e=localStorage.getItem(`teapot.token`);return e?`?token=${encodeURIComponent(e)}`:``};function Bf(){let[e,t]=v([]),[n,r]=v(null),[i,a]=v(``),[o,s]=v(new Map),[c,l]=v(new Map),u=!1;async function d(){if(!u){u=!0;try{let e=await $(`/api/sessions`),t=new Map,n=new Map;for(let r of e.sessions??[]){t.set(r.id,r.agentId);let e=n.get(r.agentId)??[];e.push(r.id),n.set(r.agentId,e)}s(t),l(n)}catch{}}}let[f,p]=v([]),[m,h]=v(0),[g,_]=v([]),[te,ne]=v(null),w=new Map,[re,T]=v(w.get(n()??``)??``),E=e=>{T(e);let t=n();t&&(e?w.set(t,e):w.delete(t))},[D,ie]=v({providers:{}}),[O,ae]=v(!1),[oe,se]=v(!1),[ce,le]=v(localStorage.getItem(`teapot.panel`)===null?window.innerWidth>1100:localStorage.getItem(`teapot.panel`)===`1`),k=()=>{let e=!ce();le(e),localStorage.setItem(`teapot.panel`,e?`1`:`0`)},[ue,A]=v(!1),[de,fe]=v(localStorage.getItem(`teapot.theme`)??`dark`),[pe,me]=v(localStorage.getItem(`teapot.theme.auto`)===`1`),[he,ge]=v(localStorage.getItem(`teapot.theme.light`)??`light`),[_e,ve]=v(localStorage.getItem(`teapot.theme.dark`)??`dark`),ye=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: light)`):null,[be,xe]=v(ye?.matches??!1);ee(()=>{let e=e=>xe(e.matches);ye?.addEventListener(`change`,e),C(()=>ye?.removeEventListener(`change`,e))}),b(()=>{let e=pe()?be()?he():_e():de();document.documentElement.dataset.theme=e,document.documentElement.dataset.appearance=Mf.find(t=>t.key===e)?.mode??`dark`});let[Se,Ce]=v(``),[F,we]=v(``),[ke,Ae]=v([]),je=()=>Object.keys(D().providers??{});async function Me(e){if(e)try{let t=await $(`/api/models?provider=${encodeURIComponent(e)}`);Ae(t.models??[])}catch{Ae([])}}let Ne=e=>{let t={text:`📄`,image:`🖼️`,audio:`🔊`,video:`🎬`,file:`📎`},n=e=>(e??[`text`]).map(e=>t[e]??e).join(``);return e?.modalities?`${n(e.modalities.input)} → ${n(e.modalities.output)}`:``},Pe=()=>{let e=F().trim()||V()?.model||``;if(!e)return``;let t=ke().find(t=>t.id===e);if(!t)return``;let n=[],r=Ne(t);r&&r!==`📄 → 📄`&&n.push(r),t.contextLength&&n.push(`ctx ${Xf(t.contextLength)} tok`);let i=e=>e===void 0?``:`${e*1e6>=10?Math.round(e*1e6):+(e*1e6).toFixed(1)}/M`;if(t.pricing){let e=i(t.pricing.prompt),r=i(t.pricing.completion);e&&r?n.push(`${e} in · ${r} out`):(e||r)&&n.push(i(t.pricing.prompt??t.pricing.completion))}return n.join(` · `)},Fe=null;b(()=>{let t=n();if(!t)return;let r=e().find(e=>e.id===t),i=r?.provider||D().defaultProvider||je()[0]||``;if(r){if(t!==Fe)Fe=t,S(()=>Se())!==i&&(Ce(i),Me(i)),S(()=>F())&&we(``);else{let e=S(()=>Se());!S(()=>F())&&e!==i&&(Ce(i),Me(i))}}});let[Le,Re]=v(!1),[ze,Be]=v(!0),[Ve,He]=v(0),[Ue,z]=v(null),B=()=>Ye().startsWith(`[compact] `),We=()=>B()?Ye().slice(10):Ye();b(()=>{Ue()||Je(e=>e?.text.startsWith(`[compact] `)?null:e)});let[Ge,Ke]=v(new Map),qe=()=>{let e=n();return e?Ge().get(e)??null:null},Je=e=>{let t=n();t&&Ke(n=>{let r=new Map(n),i=typeof e==`function`?e(n.get(t)??null):e;return i?r.set(t,{...i,at:Date.now()}):r.delete(t),r})},[Ye,Xe]=v(``),[Ze,Qe]=v(0),$e=()=>Ze(),[et,tt]=v(``),nt;b(()=>{if(!qe()){clearTimeout(nt),nt=void 0,Xe(``),tt(``);return}nt||=setTimeout(()=>{nt=void 0,Xe(qe()?.text??``),tt(qe()?.reasoning??``)},(qe()?.text.length??0)>2e4?250:(qe()?.text.length??0)>6e3?120:60)}),C(()=>clearTimeout(nt)),b(()=>{let e=V()?.status;if(e===`running`||e===`waiting`)return;let t=n();t&&(Ke(e=>{if(!e.has(t))return e;let n=new Map(e);return n.delete(t),n}),Qe(0))}),b(()=>{let e=Ye(),t=qe()?.reasoning??``;!e&&!t||ze()&&requestAnimationFrame(()=>{ze()&&cn(!0)})}),b(()=>{let e=V()?.pendingPrompts??0;ot(t=>e>=t.length?t:t.slice(0,e))}),b(()=>{if(!n())return;let e=()=>{document.visibilityState===`visible`&&requestAnimationFrame(()=>{sn()&&(Be(!0),He(0),cn(!0))})};document.addEventListener(`visibilitychange`,e),C(()=>document.removeEventListener(`visibilitychange`,e))});let V=x(()=>e().find(e=>e.id===n())),[rt,it]=v(null);x(()=>{let e=new Set;for(let t of f())t.type===`tool_result`&&t.data?.name===`ask_user`&&e.add(String(t.data.callId));return e});let[at,ot]=v([]),[st,ct]=v([]),[lt,ut]=v(localStorage.getItem(`teapot.hideGhosts`)===`1`),[dt,ft]=v(!1),H=()=>st().filter(e=>!e.read).length,pt=e=>{ct(t=>{let n=!1,r=t.map(t=>t.read||t.agentId!==e?t:(n=!0,{...t,read:!0}));return n?r:t})},mt=t=>{let n=st().filter(e=>!e.read&&e.agentId===t).length;for(let r of e())r.parent===t&&(n+=mt(r.id));return n},ht=0,gt=e=>{ct(t=>[{...e,id:`n${++ht}`,at:Date.now(),read:!1},...t].slice(0,50))},_t=(t,n)=>{let r=e().find(e=>e.id===t)?.id??t,i=typeof n.id==`string`?n.id:void 0;n.type===`message`&&n.data?.final===!0?gt({agentId:t,kind:`finish`,title:`${r} finished`,body:String(n.data.content??``).slice(0,300),eventId:i}):n.type===`question`?gt({agentId:t,kind:`question`,title:`${r} asks a question`,body:String(n.data.question??``).slice(0,300),eventId:i}):n.type===`error`?gt({agentId:t,kind:`error`,title:`${r} hit an error`,body:String(n.data.message??``).slice(0,300),eventId:i}):n.type===`progress`&>({agentId:t,kind:`progress`,title:`${r}: ${String(n.data.doing??`progress`)}`.slice(0,120),body:[n.data.recent&&`recent: ${n.data.recent}`,n.data.next&&`next: ${n.data.next}`].filter(Boolean).join(` · `).slice(0,300),eventId:i})},vt=e=>{let t=document.querySelector(`[data-eid="${e}"]`);t&&(t.scrollIntoView({behavior:`smooth`,block:`center`}),t.classList.add(`flash-target`),setTimeout(()=>t.classList.remove(`flash-target`),1600))},yt=x(()=>{let e=new Map,t=new Set,n=new Map;for(let r of f())if(Ff.has(r.type)){if(r.type===`tool_call`){let e=n.get(r.data.callId)??[];e.push(r),n.set(r.data.callId,e)}else if(r.type===`tool_result`){let i=n.get(r.data.callId)?.shift();i&&(e.set(i.id,r),t.add(r.id))}}return{resFor:e,consumed:t}}),bt=x(()=>{let e=new Set,t=-1,n=-1;for(let e of f())e.type===`question`?t=e.seq:e.type===`prompt`&&e.data?.source===`user`?n=e.seq:e.type===`system_note`&&e.data?.event===`prompt-delivered`&&(n=Math.max(n,e.seq));if(t>=0&&n>t)for(let t of f())t.type===`question`&&t.seq<=n&&e.add(String(t.data?.callId??``));return e}),xt=x(()=>{let{consumed:e}=yt(),t=``;for(let e of f()){if(e._prevKind=t,!Ff.has(e.type))continue;let n=e.data??{};(e.type!==`message`||String(n.content??``).trim()!==``||String(n.reasoning??``).trim()===``)&&(t=e.type===`tool_result`?`tool`:e.type)}let n=f().filter(t=>{if(!Ff.has(t.type))return!1;let n=t.type===`tool_call`||t.type===`tool_result`?String(t.data?.name??``):``;if(n===`report_progress`||n===`ask_user`)return!1;if(t.type===`tool_result`)return!e.has(t.id);if(t.type===`message`){let e=String(t.data?.content??``);return e.trim()===``&&String(t.data?.reasoning??``).trim()!==``&&t._prevKind===`tool`||t.data?.progressEcho||!t.data?.final&&e.trim()===`(tool call)`?!1:e.trim()!==``||String(t.data?.reasoning??``).trim()!==``||!!t.data?.final}return!0}),r=[];for(let e of n)if(e.type===`sub`){let t=e.data,n=String(t?.type??`message`);if(n===`state`)continue;r.push({...e,type:n,data:{...t?.data,actor:t?.sub}})}else r.push(e);let i=e=>String(e??``).replace(/\s+/g,` `).trim().toLowerCase(),a=[];for(let e=0;e<r.length;e++){let t=r[e];if(t.type===`message`&&t.data?.role===`assistant`){let n=r[e-1],a=i(t.data.content);if(n?.type===`progress`){let e=n.data;if((a.includes(i(e.doing))||e.recent&&a.includes(i(e.recent)))&&a.length<=Math.max(200,i(e.doing).length*3))continue}if(n?.type===`decision`){let e=n.data,t=i(e.decision);if(t&&a.includes(t)&&a.length<=Math.max(300,t.length*3))continue}}a.push(t)}let o=new Set,s=new Set,c=new Map;for(let e of a){let t=e.data?.promptId;t&&(e.type===`prompt`&&e.data?.source===`user`&&s.add(String(t)),e.type===`system_note`&&e.data?.event===`prompt-delivered`&&(o.add(String(t)),c.set(String(t),e.seq)))}let l=new Set;for(let e of at())e.promptId&&!o.has(e.promptId)&&l.add(e.promptId);let u=a.filter(e=>{if(e.type!==`prompt`||e.data?.source!==`user`)return!0;let t=String(e.data?.promptId??``);return t===``||!l.has(t)});for(let e of u){if(e.type!==`prompt`||e.data?.source!==`user`)continue;let t=String(e.data?.promptId??``),n=c.get(t);n&&n>e.seq&&(e.seq=n)}let d=at().filter(e=>!e.promptId||!(o.has(e.promptId)&&s.has(e.promptId))).map(e=>Ct(e)),p=u.reduce((e,t)=>Math.max(e,t.seq),0);return d.forEach((e,t)=>{e.seq=p+1+t}),[...u,...d]}),St=new Map;function Ct(e){let t=`${e.id}:${e.sent?`s`:`p`}`,n=St.get(t);if(n)return n;St.size>64&&St.clear();let r={id:e.id,seq:2**53-1,ts:new Date(e.at).toISOString(),session:V()?.session??``,branch:V()?.branch??`br0`,parent:null,type:`prompt`,data:{source:`user`,text:e.text,pending:!e.sent,...e.images?.length?{images:e.images}:{},...e.promptId?{promptId:e.promptId}:{}}};return St.set(t,r),r}let wt=()=>$(`/api/config`).then(ie).catch(()=>{}),[Tt,Et]=v(!1);ee(()=>{let e=()=>Et(!0);window.addEventListener(`teapot:unauthorized`,e),C(()=>window.removeEventListener(`teapot:unauthorized`,e))});let[Dt,Ot]=v(``),[kt,At]=v(!1),[jt,Mt]=v(!1),Nt=``;b(()=>{let t=n(),r=e().find(e=>e.id===t)?.todo??``;t&&t!==Nt?(Nt=t,Mt(!1),Ot(r)):t&&!jt()&&Ot(r)});let Pt=async()=>{let e=document.getElementById(`todo-notify`)?.checked??!0;if(n())try{await $(`/api/agents/${n()}/todo`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:Dt(),notify:e})}),Mt(!1),Q(`tasks saved${e&&Dt().trim()?` & notification queued`:``}`),It()}catch(e){Q(`save failed: ${e.message}`)}},Ft=x(()=>{let e=0,t=0;for(let n of Dt().split(`
|
|
22
22
|
`)){let r=n.match(/^\s*[-*+] \[([ xX])\]/);r&&(e++,r[1].toLowerCase()===`x`&&t++)}return{total:e,done:t}}),It=()=>$(`/api/agents`).then(e=>{let n=!1;t(t=>{let r=new Map(t.map(e=>[e.id,e]));return t.length!==(e.agents??[]).length&&(n=!0),(e.agents??[]).map(e=>{let t=r.get(e.id);return t||(n=!0),t&&JSON.stringify(t)===JSON.stringify(e)?t:e})}),n&&d()}).catch(()=>{}),Lt=()=>$(`/api/metrics`).then(ne).catch(()=>{}),[Rt,zt]=v([]),Bt=()=>$(`/api/tasks`).then(e=>zt(e.tasks)).catch(()=>{}),Vt=e=>Rt().filter(t=>t.agent===e),[Ht,Ut]=v((()=>{try{return new Set(JSON.parse(localStorage.getItem(`teapot.collapsed`)??`[]`))}catch{return new Set}})()),Wt=e=>{let t=new Set(Ht());t.has(e)?t.delete(e):t.add(e),Ut(t),localStorage.setItem(`teapot.collapsed`,JSON.stringify([...t]))},Gt=x(()=>{let t=lt()?e().filter(e=>!e.workspaceMissing):e(),n=new Map,r=[];for(let e of t)e.parent&&t.some(t=>t.id===e.parent)?(n.has(e.parent)||n.set(e.parent,[]),n.get(e.parent).unshift(e)):r.push(e);let i=[],a=(e,t)=>{for(let r of e){i.push({a:r,depth:t});let e=n.get(r.id);e?.length&&!Ht().has(r.id)&&a(e,t+1)}};return a(r,0),i}),[Kt,qt]=v(null),Jt=new Map;function Yt(e){return`${i()||(n()??`?`)}:${e.id}`}function Xt(e){let t=Array.from({length:e.length});for(let n=0;n<e.length;n++){let r=e[n],i=Yt(r),a=Jt.get(i);if(t[n]=a??r,!a&&(Jt.set(i,r),Jt.size>6e3)){let e=Jt.keys().next().value;e!==void 0&&Jt.delete(e)}}return t}let[Zt,Qt]=v(!1),[$t,U]=v(!1),en=0,tn=-1;function W(e){p(t=>{let n=new Map;for(let e of t)n.set(e.id,e);for(let t of Xt(e))n.has(t.id)||n.set(t.id,t);return[...n.values()].sort((e,t)=>e.seq-t.seq)})}async function nn(){let e=n();if(!e||$t()||Zt())return;if(f().length>=m()){U(!0);return}let t=()=>{let e=G();return e&&e.clientHeight>0?e:null},r=0;for(;r++<20&&!$t()&&n()===e;){let r=t();if(r&&r.scrollHeight>r.clientHeight+40)return;if(f().length>=m()){U(!0);return}let i=f().length;if(await rn(),f().length===i)return;ze()&&n()===e&&cn(!0)}}async function rn(){let e=n(),t=f()[0];if(!(!e||!t||Zt()||$t())){Qt(!0);try{let r=G(),a=r?.scrollHeight??0,o=r?.scrollTop??0,s=Kt(),c=i(),l=c&&c!==e?`&session=${encodeURIComponent(c)}`:``,u=(await $(`/api/agents/${e}/events?limit=300&before=${encodeURIComponent(t.id)}${l}${s?`&branch=${encodeURIComponent(s)}`:``}`)).events??[];if(u.length===0){U(!0);return}if(n()!==e||f()[0]?.id!==t.id)return;W(u),requestAnimationFrame(()=>{if(n()===e){let e=G();e&&(e.scrollTop=o+(e.scrollHeight-a))}})}catch{}finally{Qt(!1)}}}async function an(e,t){let r=en,a=t??i()??``;try{let t=Kt(),i=r!==tn||!g().length,o=a&&a!==e?`&session=${encodeURIComponent(a)}`:``,[s,c,l]=await Promise.all([$(`/api/agents/${e}/events?limit=300${o}${t?`&branch=${encodeURIComponent(t)}`:``}`),i?$(`/api/agents/${e}/branches`):Promise.resolve({branches:g()}),$(`/api/agents/${e}/skills`).catch(()=>({skills:[]}))]);if(i&&(tn=r),r!==en||n()!==e)return;p(e=>{let t=new Map;for(let n of e)t.set(n.id,n);for(let e of Xt(s.events))t.set(e.id,e);return[...t.values()].sort((e,t)=>e.seq-t.seq)}),h(s.total??s.events.length),_(c.branches),ir(l.skills??[])}catch{}}function G(){return document.querySelector(`.feed`)}function on(){let e=document.querySelector(`.composer textarea`);return 24+Math.min(Math.max((e?.scrollHeight??0)-(e?.clientHeight??0),0),160)}function sn(){let e=G();return!e||e.scrollHeight-e.scrollTop-e.clientHeight<on()}function cn(e=!1){let t=G();t&&(e||ze())&&(t.scrollTop=t.scrollHeight,He(0))}let ln=new Map;function un(e){return c().get(e)?.[0]??null}async function dn(e,t=!0){let o=n(),s=i(),l=f(),u=m();en++,c().size||d();let g=un(e)??e;if(o!==e||g!==s){if(s&&l.length&&(ln.set(s,{events:l,total:u,at:Date.now()}),ln.size>6)){let e=[...ln.entries()].sort((e,t)=>e[1].at-t[1].at)[0];e&&ln.delete(e[0])}p([]),Jt.clear(),z(null),He(0),Be(!0),dr=!1,fr=void 0}r(e),a(g),E(w.get(e)??``),qt(null),U(!1),Qt(!1),ot([]),localStorage.setItem(`teapot.session`,e),bn(g,t);let _=ln.get(g);_?.events.length&&(Xt(_.events),p(Xt(_.events)),h(_.total),requestAnimationFrame(()=>{n()===e&&cn(!0)})),$(`/api/agents/${e}/load`,{method:`POST`}).then(It).catch(()=>{}),await an(e,g),n()===e&&(z(V()?.ctx?.compacting?{phase:String(V().ctx.compacting)}:null),requestAnimationFrame(()=>{n()===e&&cn(!0)}),nn())}let[fn,pn]=v(!1),mn=null,hn=null;C(()=>mn?.close());let gn=!1,_n=null;document.addEventListener(`visibilitychange`,()=>_n?.()),C(()=>{_n=null});function vn(){let e=location.protocol===`https:`?`wss://`:`ws://`;mn=new WebSocket(`${e}${location.host}/api/ws${zf()}`),mn.onopen=()=>pn(!0),mn.onclose=()=>{pn(!1),setTimeout(vn,1500)},mn.onerror=()=>mn?.close();let r=new Set([`state`,`usage`,`session_start`]);mn.onmessage=e=>{let a=JSON.parse(e.data);if(a.kind!==`ping`&&a.kind!==`pong`){if(a.kind===`llm-delta`){if(Ke(e=>{let t=new Map(e);return t.set(a.agentId,{text:a.text??``,reasoning:a.reasoning??``,at:Date.now()}),t}),a.agentId===n()){let e=String(a.reasoning??``),t=String(a.text??``);e&&!t?Ze()||Qe(Date.now()):(t||!e&&Ze())&&Qe(0)}return}if(a.kind===`compaction-progress`){if(a.agentId!==n())return;a.phase===`done`?z(null):z({phase:a.phase,summarized:a.summarized});return}if(a.kind===`agent-update`&&a.snapshot){t(e=>{let t=e.findIndex(e=>e.id===a.snapshot.id),n=a.snapshot;if(t===-1)return[...e,n];let r=e[t];return JSON.stringify(r)===JSON.stringify(n)?e:e.map((e,r)=>r===t?n:e)});return}if(a.kind===`event`){let e=a.event?.type,t=a.event?.data??{};if((e===`system_note`&&t.event===`prompt-delivered`&&a.agentId===n()||e===`system_note`&&t.event===`prompt-cancelled`&&a.agentId===n())&&ot(e=>e.filter(e=>e.promptId!==t.promptId)),r.has(e)&&!If.has(e)||(_t(a.agentId,a.event),a.event?.agent!==n()))return}if(document.visibilityState===`hidden`){gn=!0;return}hn||=setTimeout(i,120)}},gn=!1;let i=async()=>{if(hn=null,await It(),await Lt(),n()){let e=f().at(-1)?.id,t=m();if(await an(n()),f().at(-1)?.id!==e){let e=qe();if(e&&e.text){let t=e.text.trim();(V()?.status!==`running`||f().some(e=>e.type===`message`&&e.data?.role===`assistant`&&String(e.data.content??``).trim()===t))&&Je(null)}else e&&!e.text&&V()?.status!==`running`&&Je(null);ze()?(cn(!0),pt(n())):He(Ve()+Math.max(0,m()-t))}}};_n=()=>{document.visibilityState===`visible`&&gn&&(gn=!1,i())}}let yn=()=>decodeURIComponent(location.pathname.split(`/`)[2]??``);function bn(e,t=!0){let n=`/session/${encodeURIComponent(e)}`;t?history.pushState(null,``,n):history.replaceState(null,``,n)}window.addEventListener(`popstate`,()=>{let e=yn(),t=o().get(e);t&&t!==n()&&dn(t,!1)}),b(()=>{let e=V(),t=e?`${e.status===`running`?`▶ `:e.status===`error`?`⚠ `:``}${e.id} · teapot`:`teapot`;document.title=H()>0?`(${H()}) ${t}`:t}),window.addEventListener(`keydown`,e=>{let t=e.target;if(t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable)){e.key===`Escape`&&t.blur();return}if(e.key===`Escape`){if(O()){ae(!1);return}if(oe()){se(!1);return}if(ue()){A(!1);return}if(rt()){it(null);return}let e=V();if(e?.status===`running`){$(`/api/agents/${e.id}/stop`,{method:`POST`}).then(It);return}ce()&&window.innerWidth<=1100&&le(!1);return}if(!(O()||oe())){if(e.key===`/`)e.preventDefault(),document.querySelector(`.composer textarea`)?.focus();else if(e.key===`d`)k();else if(e.key===`t`)Sn();else if(e.key===`ArrowDown`||e.key===`ArrowUp`){let t=Gt().map(e=>e.a);if(t.length===0)return;e.preventDefault();let r=t.findIndex(e=>e.id===n()),i=e.key===`ArrowDown`?Math.min(r+1,t.length-1):Math.max(r-1,0);i!==r&&dn(t[i].id)}}});let[K,xn]=v(localStorage.getItem(`teapot.term`)===`1`),Sn=()=>{let e=!K();xn(e),localStorage.setItem(`teapot.term`,e?`1`:`0`)},[Cn,wn]=v([]),[Tn,En]=v(0),[Dn,On]=v(-1),[kn,An]=v(!1),[jn,Mn]=v(0),[Nn,Pn]=v(Number(localStorage.getItem(`teapot.termH`))||Math.max(220,Math.round(window.innerHeight*.35))),Fn=new Map,In=[null,null],Ln=()=>Cn()[jn()===0?Tn():Dn()]??null;function Rn(e){if(!Cn()[e])return;let t=jn(),n=t===0?Tn():Dn(),r=t===0?Dn():Tn(),i=e=>t===0?En(e):On(e),a=e=>t===0?On(e):En(e);if(r===e){a(n),i(e);return}n!==e&&i(e)}let zn=()=>Bn();function Bn(e){let t=e??n();if(!t)return;let r=Cn().filter(e=>e.agentId===t).length;if(r>=10){Q(`max 10 shells per agent (${t}) — that's already a lot`);return}Cn().length+1;let i=r===0?{key:`${t}`,agentId:t,title:t}:{key:`${t}#${r+1}`,agentId:t,title:`${t}·${r+1}`};wn(e=>[...e,i]),jn()===0?En(Cn().length):On(Cn().length)}function Vn(e){let t=Cn()[e];if(!t)return;let n=Fn.get(t.key);if(n){n.ro?.disconnect();try{n.ws.close()}catch{}n.term.dispose(),Fn.delete(t.key)}let r=Cn().filter((t,n)=>n!==e);wn(r);let i=t=>t===e?-1:t>e?t-1:t;En(e=>Math.min(i(e),r.length-1)),On(e=>e===-1?-1:Math.min(i(e),r.length-1))}function Hn(){for(let[,e]of Fn){e.ro?.disconnect();try{e.ws.close()}catch{}e.term.dispose()}Fn.clear()}function Un(e,t){let n=Fn.get(e.key);if(n)n.el.parentElement!==t&&(t.appendChild(n.el),setTimeout(()=>{try{n.fit()}catch{}},30));else{let r=document.createElement(`div`);r.className=`termsession`,t.appendChild(r);let i=new kc({cursorBlink:!0,fontSize:12.5,fontFamily:`ui-monospace, Menlo, Consolas, monospace`,theme:Nf()}),a=new Mc;i.loadAddon(a),i.open(r);let o=location.protocol===`https:`?`wss://`:`ws://`,s=new WebSocket(`${o}${location.host}/api/agents/${e.agentId}/term${zf()}`);s.onmessage=e=>{let t=JSON.parse(e.data);t.kind===`data`?i.write(t.data):t.kind===`exit`&&i.write(`\r\n\x1b[2m[terminal exited ${t.code??``}]\x1b[0m\r\n`)},i.onData(e=>{s.readyState===WebSocket.OPEN&&s.send(JSON.stringify({kind:`input`,data:e}))});let c={cols:0,rows:0},l=[],u=()=>{try{a.fit()}catch{}(i.cols!==c.cols||i.rows!==c.rows)&&s.readyState===WebSocket.OPEN&&(c={cols:i.cols,rows:i.rows},s.send(JSON.stringify({kind:`resize`,cols:i.cols,rows:i.rows})))},d=new ResizeObserver(()=>{l[0]&&clearTimeout(l[0]),l[0]=setTimeout(u,250)});d.observe(r),setTimeout(u,60),n={el:r,term:i,fit:a,ws:s,ro:d},Fn.set(e.key,n)}return n}function Wn(e){let t=In[e];if(!t)return;let n=Cn()[e===0?Tn():Dn()];if(!n){[...Fn.values()].some(e=>e.el.parentElement===t)&&t.replaceChildren();return}let r=Un(n,t);for(let[e,r]of Fn)e!==n.key&&r.el.parentElement===t&&r.el.remove();requestAnimationFrame(()=>{r.el.parentElement!==t&&t.appendChild(r.el);try{r.fit()}catch{}if(jn()===(e===0?0:1))try{r.term.focus()}catch{}})}b(()=>{Cn(),kn(),Tn(),Dn(),Nn(),requestAnimationFrame(()=>{Wn(0),kn()&&Wn(1)})}),b(()=>{if(!K())return;let e=n();if(e){if(!Cn().some(t=>t.agentId===e)&&Cn().length===0)Bn(e);else if(!Cn().some(t=>t.agentId===e))Bn(e);else{let t=Cn().findIndex(t=>t.agentId===e);t>=0&&Rn(t)}}});let Gn=e=>{e.preventDefault();let t=e.clientY,n=Nn(),r=e=>{let r=Math.min(Math.max(n-(e.clientY-t),140),Math.round(window.innerHeight*.85));Pn(r)},i=()=>{window.removeEventListener(`pointermove`,r),window.removeEventListener(`pointerup`,i),localStorage.setItem(`teapot.termH`,String(Nn())),requestAnimationFrame(()=>{Wn(0),kn()&&Wn(1)})};window.addEventListener(`pointermove`,r),window.addEventListener(`pointerup`,i)},Kn=()=>{let e=!kn();if(An(e),e){let e=Cn().map((e,t)=>t).filter(e=>e!==Tn());(Dn()<0||Dn()===Tn()||Dn()>=Cn().length)&&On(e[0]??-1)}requestAnimationFrame(()=>{Wn(0),kn()&&Wn(1)})};C(Hn);let qn=e=>t=>{In[e]=t,t&&requestAnimationFrame(()=>{Wn(e),kn()&&Wn(1),setTimeout(()=>Wn(e),200)})};ee(()=>{wt(),It().then(async()=>{await d();let t=yn(),n=t?o().get(t):void 0,r=(n?e().find(e=>e.id===n):void 0)??e().find(e=>e.id===t&&!o().has(t))??e().find(e=>e.id===localStorage.getItem(`teapot.session`))??e()[0];r&&dn(r.id,!1)}),Lt(),Bt(),Zn(),vn();let t=setInterval(()=>{Lt(),Bt()},3e4);C(()=>clearInterval(t))});let Jn=[{cmd:`/start`,desc:`start working toward the goal`},{cmd:`/stop`,desc:`interrupt the running agent`},{cmd:`/fork`,desc:`branch the conversation here`},{cmd:`/goal`,desc:`/goal <text> — set goal & notify the agent`},{cmd:`/compact`,desc:`force a context compaction now`},{cmd:`/skill`,desc:`/skill <name> — force-load a skill and follow it`}],[Yn,Xn]=v([]),Zn=()=>$(`/api/personas`).then(e=>Xn(e.personas)).catch(()=>{}),[Qn,$n]=v(!1),er=()=>{let e=re().match(/^@([A-Za-z0-9._-]*)$/);return e?e[1].toLowerCase():null},tr=()=>{let t=er();return t===null?[]:[...Yn().map(e=>({key:e.key,label:`${e.label} — spawns a sub-agent`,kind:`persona`})),...e().filter(e=>e.id!==n()).map(e=>({key:e.id,label:`${e.status} — send directly`,kind:`agent`}))].filter(e=>e.key.toLowerCase().startsWith(t))},nr=new Set([`start`,`stop`,`fork`,`compact`]),[rr,ir]=v([]),[ar,or]=v(-1),sr=()=>{let e=re();if(!e.startsWith(`/`)||e.includes(`
|
|
23
23
|
`))return[];let t=e.match(/^\/([a-z]*)(?:\s+(.*))?$/i);if(!t)return[];let n=t[1].toLowerCase(),r=(t[2]??``).trim();if(!r&&n!==`skill`){let e=Jn.filter(e=>e.cmd.slice(1).startsWith(n));return e.find(e=>e.cmd.slice(1)===n)&&nr.has(n)?[]:e.map(e=>({insert:e.cmd+` `,title:e.desc}))}if(n===`skill`){let e=rr().filter(e=>e.name.toLowerCase().startsWith(r.toLowerCase()));return e.length===1&&e[0].name.toLowerCase()===r.toLowerCase()?[]:e.map(e=>({insert:`/skill ${e.name} `,title:e.description||`(bundled skill)`}))}return[]},cr,lr=()=>{if(!cr)return;ur=!0;let e=ze();cr.style.height=`auto`,cr.style.height=Le()?``:`${Math.min(cr.scrollHeight,360)}px`,requestAnimationFrame(()=>{let t=G();e&&t&&(t.scrollTop=t.scrollHeight),ur=!1})},ur=!1,dr=!1,fr;b(()=>{re(),lr()});let[pr,mr]=v([]),hr=e=>{let t=Array.from(e).filter(e=>e.type.startsWith(`image/`));for(let e of t){if(e.size>8e6){Q(`"${e.name}" is over 8 MB — skipped`);continue}let t=new FileReader;t.onload=()=>{mr(n=>[...n,{url:String(t.result),name:e.name}].slice(0,4))},t.readAsDataURL(e)}},gr=async(e,t)=>{let r=t??n();if(!r)return;let i=pr();try{let t=await $(`/api/agents/${r}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:e,start:!0,...i.length?{images:i}:{}})});ot(n=>[...n,{id:`@p${Date.now()}${Math.random().toString(36).slice(2,6)}`,text:e,at:Date.now(),promptId:t.promptId,...i.length?{images:i.map(e=>e.url)}:{}}]),mr([]),requestAnimationFrame(()=>requestAnimationFrame(()=>cn(!0)))}catch(t){E(e),console.error(`send failed:`,t)}},_r=async t=>{t.preventDefault();let r=n(),i=re().trim();if(!(!r||!i)){if(i.startsWith(`@`)){let t=i.indexOf(` `),r=(t===-1?i.slice(1):i.slice(1,t)).toLowerCase(),a=t===-1?``:i.slice(t+1).trim(),o=Yn().some(e=>e.key.toLowerCase()===r),s=e().some(e=>e.id.toLowerCase()===r);try{if(o){if(!a){Q(`usage: @${r} <task>`);return}Q(`🧩 spawned ${(await $(`/api/agents/${n()}/spawn`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({persona:r,task:a,context:Qn()?`fork`:`none`})})).id}${Qn()?` (forked context)`:``}`),It(),E(``)}else if(s){if(!a){Q(`usage: @${r} <message>`);return}await $(`/api/agents/${encodeURIComponent(r)}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:a,start:!0})}),Q(`→ delivered to @${r}`),E(``)}else{Q(`unknown @${r} — personas: ${Yn().map(e=>e.key).join(`, `)||`(none)`}`);return}}catch(e){Q(`@${r} failed: ${e.message}`)}return}if(i.startsWith(`/`)){let e=i.indexOf(` `),t=(e===-1?i.slice(1):i.slice(1,e)).toLowerCase(),n=e===-1?``:i.slice(e+1).trim();if(t===`goal`&&!n){E(`/goal `);return}if(t===`skill`&&!n){E(`/skill `);return}E(``);try{await vr(t,n)}catch(e){throw E(re()?`${i}\n${re()}`:i),e}return}E(``),await gr(i),Le()&&Re(!1)}},vr=async(e,t)=>{let r=n();if(!r)return;let i=(e,t)=>$(`/api/agents/${r}${e}`,{method:`POST`,headers:{"content-type":`application/json`},...t===void 0?{}:{body:JSON.stringify(t)}}).then(It);try{if(e===`start`)await i(`/start`);else if(e===`stop`)await i(`/stop`);else if(e===`fork`)await i(`/fork`,{}),await dn(r);else if(e===`compact`)Q((await i(`/compact`))?.ran?`context compacted`:`nothing to compact yet`);else if(e===`goal`){if(!t){Q(`usage: /goal <text>`);return}await i(`/goal`,{text:t,notify:!0}),Q(`goal saved & notification queued`)}else if(e===`skill`){if(!t){Q(`usage: /skill <name>`);return}await gr(`[harness] Force-load and follow the skill "${t}" now: call load_skill("${t}") and execute its playbook for the current task.`),Q(`skill "${t}" dispatched`)}else Q(`unknown command "${e}" — /start /stop /fork /goal /skill /compact`)}catch(t){Q(`/${e} failed: ${t.message}`)}},yr,br=0;b(()=>{e(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(!yr)return;let e=Math.min(br,yr.scrollHeight);Math.abs(yr.scrollTop-e)>1&&(yr.scrollTop=e)})})});let xr=e=>()=>n()&&$(`/api/agents/${n()}${e}`,{method:`POST`}).then(It),[Sr,Cr]=v(``),[wr,Tr]=v(``),[Er,Dr]=v(!1),[Or,kr]=v(!0),Ar=``;b(()=>{let e=n();e&&(V()?.goal,e!==Ar&&(Ar=e,Dr(!1),Cr(``),Tr(``)))});let jr=async e=>{if(e.preventDefault(),!(!n()||!Sr().trim()))try{await $(`/api/agents/${n()}/goal`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:Sr(),notify:Or(),...wr().trim()?{verify:wr()}:{}})}),Cr(``),Tr(``),Dr(!1),It()}catch(e){Q(`goal save failed: ${e.message}`)}};return[j(N,{get when(){return D()?.needsSetup},fallback:null,get children(){return j(mp,{onDone:()=>location.reload()})}}),j(N,{get when(){return Tt()},get children(){var e=Lc();return e.firstChild.firstChild.nextSibling.addEventListener(`submit`,e=>{e.preventDefault();let t=document.getElementById(`pw-input`);localStorage.setItem(`teapot.token`,t.value),location.reload()}),e}}),j(N,{get when(){return!D()?.needsSetup},get children(){var i=Rl(),a=i.firstChild,o=a.firstChild,s=o.nextSibling,c=s.firstChild,l=c.firstChild;l.firstChild;var u=c.nextSibling,d=u.firstChild.firstChild.nextSibling;d.firstChild;var m=d.nextSibling,h=u.nextSibling,_=a.nextSibling,v=_.nextSibling;R(o,j(M,{get each(){return Gt()},children:({a:t,depth:r})=>(()=>{var i=Jl(),a=i.firstChild,o=a.nextSibling;return i.$$click=()=>dn(t.id),R(i,j(N,{get when(){return e().some(e=>e.parent===t.id)},get fallback(){return Yl()},get children(){var e=Ul();return e.$$click=e=>{e.stopPropagation(),Wt(t.id)},R(e,()=>Ht().has(t.id)?`▸`:`▾`),y(()=>I(e,`title`,Ht().has(t.id)?`expand sub-agents`:`collapse sub-agents`)),e}}),a),R(o,()=>t.id),R(i,(()=>{var e=P(()=>!!t.workspaceMissing);return()=>e()?Xl():null})(),null),R(i,j(N,{get when(){return mt(t.id)>0},get children(){var e=Wl();return e.firstChild,R(e,()=>mt(t.id),null),y(()=>I(e,`title`,`${mt(t.id)} unread notification${mt(t.id)>1?`s`:``} (including sub-agents)`)),e}}),null),R(i,j(N,{get when(){return Ht().has(t.id)},get children(){return(()=>{let n=e().filter(e=>e.parent===t.id),r=n.filter(e=>e.status===`running`||e.status===`waiting`).length;return n.length>0?(()=>{var e=Zl();return e.firstChild,L(e,`subcount`+(r>0?` live`:``)),R(e,()=>n.length,null),R(e,r>0?` · ▶${r}`:``,null),y(()=>I(e,`title`,`${n.length} sub-agent${n.length>1?`s`:``} (${r} active)`)),e})():null})()}}),null),R(i,j(N,{get when(){return t.parent},get children(){return Gl()}}),null),R(i,j(N,{get when(){return Vt(t.id).length>0},get children(){var e=Kl();return y(()=>I(e,`title`,Vt(t.id).map(e=>`${e.id}: ${e.schedule}`).join(`
|
|
24
|
-
`))),e}}),null),R(i,j(N,{get when(){return t.goal.status===`done`},get children(){return ql()}}),null),y(e=>{var s=`agent-item`+(t.id===n()?` sel`:``)+(r>0?` sub-row`:``),c=r>0?`padding-left:${10+r*14}px`:``,l=t.parent?`sub-agent of @${t.parent}`:void 0,u=`dot ${t.status}`,d=t.workspaceMissing?` ghost`:``,f=t.workspaceMissing?`workspace not found on disk (${t.workspace}) — it will be created when this session runs`:void 0;return s!==e.e&&L(i,e.e=s),e.t=Ee(i,c,e.t),l!==e.a&&I(i,`title`,e.a=l),u!==e.o&&L(a,e.o=u),d!==e.i&&L(o,e.i=d),f!==e.n&&I(o,`title`,e.n=f),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),i})()})),R(s,j(N,{get when(){return ue()},get children(){var e=zc(),t=e.firstChild.firstChild;return t.addEventListener(`change`,e=>{let t=e.currentTarget.checked;me(t),localStorage.setItem(`teapot.theme.auto`,t?`1`:`0`)}),R(e,j(N,{get when(){return!pe()},get fallback(){return[(()=>{var e=Ql(),t=e.firstChild.nextSibling;return t.addEventListener(`change`,e=>{ge(e.currentTarget.value),localStorage.setItem(`teapot.theme.light`,e.currentTarget.value)}),R(t,j(M,{get each(){return Mf.filter(e=>e.mode===`light`)},children:e=>(()=>{var t=eu();return R(t,()=>e.label),y(()=>t.value=e.key),t})()})),y(()=>t.value=he()),e})(),(()=>{var e=$l(),t=e.firstChild.nextSibling;return t.addEventListener(`change`,e=>{ve(e.currentTarget.value),localStorage.setItem(`teapot.theme.dark`,e.currentTarget.value)}),R(t,j(M,{get each(){return Mf.filter(e=>e.mode===`dark`)},children:e=>(()=>{var t=eu();return R(t,()=>e.label),y(()=>t.value=e.key),t})()})),y(()=>t.value=_e()),e})()]},get children(){var e=Rc();return R(e,j(M,{each:Mf,children:e=>(()=>{var t=tu(),n=t.firstChild;return t.$$click=()=>{fe(e.key),localStorage.setItem(`teapot.theme`,e.key)},R(n,()=>e.sw.map(e=>(()=>{var t=nu();return De(t,`background`,e),t})())),R(t,()=>e.label,null),y(n=>{var r=`themebtn`+(de()===e.key?` on`:``),i=`${e.label} (${e.mode})`;return r!==n.e&&L(t,n.e=r),i!==n.t&&I(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()})),e}}),null),y(()=>t.checked=pe()),e}}),c),l.$$click=e=>{e.stopPropagation(),ft(!dt()),dt()||ct(e=>e.map(e=>({...e,read:!0})))},R(l,j(N,{get when(){return H()>0},get children(){var e=Bc();return R(e,H),e}}),null),R(c,j($f,{icon:`👻`,get active(){return lt()},get title(){return lt()?`show ghost sessions again (👻 workspace missing on disk)`:`hide ghost sessions (👻 — their workspace directory no longer exists)`},onClick:t=>{t.stopPropagation();let r=!lt();if(ut(r),localStorage.setItem(`teapot.hideGhosts`,r?`1`:`0`),r&&n()&&V()?.workspaceMissing){let t=e().find(e=>!e.workspaceMissing);t&&dn(t.id)}}}),null),R(c,j($f,{icon:`+`,title:`new agent`,onClick:()=>{wt(),ae(!0)}}),null),R(c,j($f,{icon:`🎨`,title:`themes`,onClick:()=>A(!ue())}),null),R(c,j($f,{icon:`⚙`,title:`settings`,onClick:()=>{wt(),se(!0)}}),null),R(d,`0.22.
|
|
24
|
+
`))),e}}),null),R(i,j(N,{get when(){return t.goal.status===`done`},get children(){return ql()}}),null),y(e=>{var s=`agent-item`+(t.id===n()?` sel`:``)+(r>0?` sub-row`:``),c=r>0?`padding-left:${10+r*14}px`:``,l=t.parent?`sub-agent of @${t.parent}`:void 0,u=`dot ${t.status}`,d=t.workspaceMissing?` ghost`:``,f=t.workspaceMissing?`workspace not found on disk (${t.workspace}) — it will be created when this session runs`:void 0;return s!==e.e&&L(i,e.e=s),e.t=Ee(i,c,e.t),l!==e.a&&I(i,`title`,e.a=l),u!==e.o&&L(a,e.o=u),d!==e.i&&L(o,e.i=d),f!==e.n&&I(o,`title`,e.n=f),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),i})()})),R(s,j(N,{get when(){return ue()},get children(){var e=zc(),t=e.firstChild.firstChild;return t.addEventListener(`change`,e=>{let t=e.currentTarget.checked;me(t),localStorage.setItem(`teapot.theme.auto`,t?`1`:`0`)}),R(e,j(N,{get when(){return!pe()},get fallback(){return[(()=>{var e=Ql(),t=e.firstChild.nextSibling;return t.addEventListener(`change`,e=>{ge(e.currentTarget.value),localStorage.setItem(`teapot.theme.light`,e.currentTarget.value)}),R(t,j(M,{get each(){return Mf.filter(e=>e.mode===`light`)},children:e=>(()=>{var t=eu();return R(t,()=>e.label),y(()=>t.value=e.key),t})()})),y(()=>t.value=he()),e})(),(()=>{var e=$l(),t=e.firstChild.nextSibling;return t.addEventListener(`change`,e=>{ve(e.currentTarget.value),localStorage.setItem(`teapot.theme.dark`,e.currentTarget.value)}),R(t,j(M,{get each(){return Mf.filter(e=>e.mode===`dark`)},children:e=>(()=>{var t=eu();return R(t,()=>e.label),y(()=>t.value=e.key),t})()})),y(()=>t.value=_e()),e})()]},get children(){var e=Rc();return R(e,j(M,{each:Mf,children:e=>(()=>{var t=tu(),n=t.firstChild;return t.$$click=()=>{fe(e.key),localStorage.setItem(`teapot.theme`,e.key)},R(n,()=>e.sw.map(e=>(()=>{var t=nu();return De(t,`background`,e),t})())),R(t,()=>e.label,null),y(n=>{var r=`themebtn`+(de()===e.key?` on`:``),i=`${e.label} (${e.mode})`;return r!==n.e&&L(t,n.e=r),i!==n.t&&I(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()})),e}}),null),y(()=>t.checked=pe()),e}}),c),l.$$click=e=>{e.stopPropagation(),ft(!dt()),dt()||ct(e=>e.map(e=>({...e,read:!0})))},R(l,j(N,{get when(){return H()>0},get children(){var e=Bc();return R(e,H),e}}),null),R(c,j($f,{icon:`👻`,get active(){return lt()},get title(){return lt()?`show ghost sessions again (👻 workspace missing on disk)`:`hide ghost sessions (👻 — their workspace directory no longer exists)`},onClick:t=>{t.stopPropagation();let r=!lt();if(ut(r),localStorage.setItem(`teapot.hideGhosts`,r?`1`:`0`),r&&n()&&V()?.workspaceMissing){let t=e().find(e=>!e.workspaceMissing);t&&dn(t.id)}}}),null),R(c,j($f,{icon:`+`,title:`new agent`,onClick:()=>{wt(),ae(!0)}}),null),R(c,j($f,{icon:`🎨`,title:`themes`,onClick:()=>A(!ue())}),null),R(c,j($f,{icon:`⚙`,title:`settings`,onClick:()=>{wt(),se(!0)}}),null),R(d,`0.22.13`,null),R(h,j(N,{get when(){return te()},get children(){return[`master rss `,P(()=>te().rssMb),`MB · heap `,P(()=>te().heapUsedMb),`MB`,Vc(),`load1 `,P(()=>te().loadavg1),` · up `,P(()=>Math.floor(te().uptimeSec/60)),`m`]}})),R(_,j(N,{get when(){return V()},get fallback(){return ru()},get children(){return[(()=>{var e=Gc(),t=e.firstChild.nextSibling,n=t.nextSibling,r=n.nextSibling,i=r.firstChild,a=i.nextSibling,o=a.nextSibling.nextSibling,s=o.nextSibling.nextSibling;s.nextSibling;var c=r.nextSibling;return R(t,()=>V().id),R(n,()=>V().status),R(e,j(N,{get when(){return(V().pendingPrompts??0)>0},get children(){var e=Hc(),t=e.firstChild.nextSibling;return t.nextSibling,R(e,()=>V().pendingPrompts,t),y(()=>I(e,`title`,`${V().pendingPrompts??0} message${(V().pendingPrompts??0)>1?`s`:``} from you waiting in the queue. They will be handed to the model at its next turn boundary — the timeline shows them as "pending (queued)…" until then, and each can be withdrawn with ✕ cancel while it's still queued.`)),e}}),r),R(e,j(N,{get when(){return Vt(V().id).length>0},get children(){var e=Uc();return e.firstChild,R(e,()=>Vt(V().id).length,null),y(()=>I(e,`title`,`scheduled tasks:\n${Vt(V().id).map(e=>`${e.schedule} · ${e.id}${e.forked?` (forked)`:``}`).join(`
|
|
25
25
|
`)}`)),e}}),r),R(r,()=>V().model,i),R(r,()=>V().session,a),R(r,()=>V().branch,o),R(r,()=>V().stats.turns,s),R(r,()=>V().stats.toolCalls,null),R(c,j(N,{get when(){return V().statusReason},get children(){var e=Wc();return y(()=>I(e,`title`,V().statusReason)),e}}),null),R(c,j($f,{icon:`⌨`,title:`terminal (t)`,onClick:Sn}),null),R(c,j($f,{icon:`▤`,title:`toggle details panel (d)`,onClick:k}),null),y(()=>L(n,`badge ${V().status}`)),e})(),(()=>{var e=Qc();return e.addEventListener(`scroll`,e=>{if(ur)return;let t=e.currentTarget,r=sn(),i=t.scrollHeight-t.scrollTop-t.clientHeight;if(!r&&fr!==void 0&&i>fr+8&&i>24?dr=!0:r&&(dr=!1),fr=i,t.scrollTop<=4&&n()&&!Zt()&&!$t()&&f().length>0&&rn(),dr&&!r){Be(!1);return}r&&Ve()&&He(0),Be(r)}),R(e,j(N,{get when(){return Ue()},children:e=>(()=>{var t=iu();return t.firstChild,R(t,(()=>{var t=P(()=>e().phase===`harvesting`);return()=>t()?`saving durable lessons…`:`summarizing ${e().summarized?Xf(e().summarized)+` `:``}older messages…`})(),null),t})()}),null),R(e,j(N,{get when(){return P(()=>!!$t())()&&xt().length>0},get children(){return Kc()}}),null),R(e,j(N,{get when(){return Zt()},get children(){return qc()}}),null),R(e,j(N,{get when(){return xt().length>0},get fallback(){return au()},get children(){return[j(M,{get each(){return xt()},children:(e,t)=>j(Gf,{e,get prev(){return xt()[t()-1]},get res(){return yt().resFor.get(e.id)},onOption:e=>void gr(e),get answeredIds(){return bt()},get agentActive(){return V()?.status===`running`||V()?.status===`waiting`},onResize:()=>{ze()&&requestAnimationFrame(()=>cn(!0))},get onCancel(){return e.data?.pending&&e.data?.promptId&&e.data?.sent!==!0?()=>{let t=String(e.data.promptId);$(`/api/agents/${n()}/prompt/cancel`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({promptId:t})}).then(e=>{let n=String(e.text??``);E(re()?`${n}\n\n${re()}`:n),ot(e=>e.filter(e=>e.promptId!==t)),Q(`message withdrawn — draft restored`)}).catch(()=>Q(`withdraw failed — it may have already been sent`))}:void 0},get onEdit(){return e.type===`prompt`&&e.data?.source===`user`&&!(e.data?.pending&&e.data?.sent!==!0)?()=>it({eventId:e.id,text:String(e.data?.text??``)}):void 0}})}),j(N,{get when(){return qe()},get children(){var e=Zc(),t=e.firstChild.nextSibling;return t.firstChild,R(t,j(N,{get when(){return et()},get children(){var e=Jc(),t=e.firstChild;t.firstChild;var n=t.nextSibling;return R(t,j(Hf,{get startedAt(){return $e()}}),null),Oe(e=>{let t=!0;e.addEventListener(`scroll`,()=>{t=e.scrollHeight-e.scrollTop-e.clientHeight<24}),b(()=>{et(),t&&(e.scrollTop=e.scrollHeight)})},n),R(n,et),e}}),null),R(t,j(N,{get when(){return Ye()},get fallback(){return ou()},get children(){return j(N,{get when(){return B()},get fallback(){return(()=>{var e=Xc();return y(()=>e.innerHTML=Ie(Ye()+`▍`)),e})()},get children(){return[Yc(),(()=>{var e=Xc();return y(()=>e.innerHTML=Ie(We()+`▍`)),e})()]}})}}),null),e}})]}}),null),e})(),j(N,{get when(){return K()},get children(){var t=rl(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=i.nextSibling,o=a.firstChild,s=r.nextSibling,c=s.firstChild;n.$$dblclick=()=>{Pn(Math.max(220,Math.round(window.innerHeight*.35))),localStorage.setItem(`teapot.termH`,String(Nn()))},n.$$pointerdown=Gn,R(i,j(M,{get each(){return Cn()},children:(e,t)=>(()=>{var n=su(),r=n.firstChild.nextSibling;return n.$$click=()=>Rn(t()),R(n,()=>e.title,r),r.$$click=e=>{e.stopPropagation(),Vn(t())},y(r=>{var i=`termtab`+(jn()===0&&Tn()===t()?` active`:``)+(kn()&&jn()===1&&Dn()===t()?` active`:``),a=`${e.title} — click to show in focused pane`;return i!==r.e&&L(n,r.e=i),a!==r.t&&I(n,`title`,r.t=a),r},{e:void 0,t:void 0}),n})()}),null),R(i,j($f,{icon:`+`,title:`new shell in this workspace`,onClick:zn}),null),R(o,(()=>{var t=P(()=>!!Ln());return()=>t()?e().find(e=>e.id===Ln().agentId)?.workspace.split(`/`).filter(Boolean).pop():V()?.workspace})()),R(a,j($f,{icon:`◫`,get title(){return kn()?`single pane`:`split panes (50/50)`},onClick:Kn}),null),R(a,j($f,{icon:`▾`,title:`hide the terminal (shells keep running; reopen with t) — close individual shells with their ✕ tab buttons`,onClick:Sn}),null);var l=qn(0);return typeof l==`function`&&Oe(l,c),c.$$pointerdown=()=>Mn(0),R(c,j(N,{get when(){return Tn()<0||Tn()>=Cn().length},get children(){return $c()}})),R(s,j(N,{get when(){return kn()},get children(){return[el(),(()=>{var e=nl(),t=qn(1);return typeof t==`function`&&Oe(t,e),e.$$pointerdown=()=>Mn(1),R(e,j(N,{get when(){return Dn()<0||Dn()>=Cn().length},get children(){return tl()}})),y(()=>e.classList.toggle(`focused`,jn()===1)),e})()]}}),null),y(e=>{var n={height:`${Nn()}px`,"--termh":`${Nn()}px`},r=!!kn(),i=jn()===0;return e.e=Ee(t,n,e.e),r!==e.t&&s.classList.toggle(`split`,e.t=r),i!==e.a&&c.classList.toggle(`focused`,e.a=i),e},{e:void 0,t:void 0,a:void 0}),t}}),(()=>{var e=ll(),t=e.firstChild,n=t.firstChild,r=n.nextSibling,i=r.nextSibling,a=i.nextSibling,o=t.nextSibling;R(e,j(N,{get when(){return!ze()||Ve()>0},get children(){var e=il();return e.firstChild,e.$$click=()=>cn(!0),R(e,(()=>{var e=P(()=>Ve()>0);return()=>e()?`${Ve()} new message${Ve()>1?`s`:``}`:`jump to present`})(),null),e}}),t),R(e,j(N,{get when(){return sr().length>0},get children(){var e=al();return R(e,j(M,{get each(){return sr()},children:(e,t)=>(()=>{var n=cu(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>{E(e.insert),or(-1)},R(r,()=>e.insert.trim()),R(i,()=>e.title),y(r=>{var i=`cmdrow`+(t()===ar()?` active`:``),a=e.title;return i!==r.e&&L(n,r.e=i),a!==r.t&&I(n,`title`,r.t=a),r},{e:void 0,t:void 0}),n})()})),e}}),t),R(e,j(N,{get when(){return tr().length>0},get children(){var e=al();return R(e,j(M,{get each(){return tr()},children:e=>(()=>{var t=lu(),n=t.firstChild;n.firstChild;var r=n.nextSibling;return t.$$click=()=>{E(`@${e.key} `),or(-1)},R(n,()=>e.key,null),R(r,()=>e.label),y(()=>I(t,`title`,e.label)),t})()})),e}}),t),t.addEventListener(`submit`,_r),R(t,j(N,{get when(){return pr().length>0},get children(){var e=ol(),t=e.firstChild,n=t.firstChild,r=n.nextSibling;return r.nextSibling,R(e,j(M,{get each(){return pr()},children:(e,t)=>(()=>{var n=uu(),r=n.firstChild,i=r.nextSibling;return i.$$click=()=>mr(e=>e.filter((e,n)=>n!==t())),y(t=>{var i=e.name,a=e.url,o=e.name;return i!==t.e&&I(n,`title`,t.e=i),a!==t.t&&I(r,`src`,t.t=a),o!==t.a&&I(r,`alt`,t.a=o),t},{e:void 0,t:void 0,a:void 0}),n})()}),t),R(t,()=>pr().length,n),R(t,()=>pr().length>1?`s`:``,r),e}}),n),n.$$keydown=e=>{let t=sr();if(t.length>0&&e.key===`ArrowDown`){e.preventDefault(),or(e=>Math.min(e+1,t.length-1));return}if(t.length>0&&e.key===`ArrowUp`){e.preventDefault(),or(e=>Math.max(e-1,0));return}if(t.length>0&&(e.key===`Tab`||e.key===`Enter`)&&!e.shiftKey&&ar()>=0){e.preventDefault(),E(t[ar()].insert),or(-1);return}if(e.key===`Escape`&&t.length>0){or(-1);return}e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),_r(e))},n.$$input=e=>{E(e.currentTarget.value),or(0),lr()},n.addEventListener(`paste`,e=>{let t=Array.from(e.clipboardData?.files??[]).filter(e=>e.type.startsWith(`image/`));t.length&&(e.preventDefault(),hr(t))});var s=cr;return typeof s==`function`?Oe(s,n):cr=n,R(t,j(N,{get when(){return P(()=>!!re().startsWith(`@`))()&&re().includes(` `)},get children(){var e=sl(),t=e.firstChild;return t.addEventListener(`change`,e=>$n(e.currentTarget.checked)),y(()=>t.checked=Qn()),e}}),r),r.$$click=()=>{let e=!Le();Re(e),requestAnimationFrame(()=>lr())},R(r,()=>Le()?`⤡`:`⤢`),R(t,j($f,{icon:`📎`,title:`attach images (or paste them straight into the box)`,onClick:()=>document.getElementById(`composer-file`)?.click()}),i),R(t,j(N,{get when(){return pr().length},get children(){var e=cl();return e.firstChild,R(e,()=>pr().length,null),e}}),i),a.addEventListener(`change`,e=>{e.currentTarget.files?.length&&hr(e.currentTarget.files),e.currentTarget.value=``}),R(o,()=>kf()||`enter send · shift+enter newline · ↑↓ sessions · / commands & focus · t terminal · d panel · esc interrupt · messages sent while the agent works queue up and land at the next turn boundary`),y(t=>{var i=`composer`+(Le()?` maximized`:``),a=`message #${V().id} — / for commands · paste or 📎 to attach images`,o=Le()?`restore composer (hide timeline)`:`maximize composer — hide the timeline and fill the main column`;return i!==t.e&&L(e,t.e=i),a!==t.t&&I(n,`placeholder`,t.t=a),o!==t.a&&I(r,`title`,t.a=o),t},{e:void 0,t:void 0,a:void 0}),y(()=>n.value=re()),e})()]}})),v.addEventListener(`scroll`,e=>{br=e.currentTarget.scrollTop});var S=yr;return typeof S==`function`?Oe(S,v):yr=v,R(v,j(N,{get when(){return V()},get children(){return[ul(),(()=>{var e=dl(),t=e.firstChild,n=t.firstChild.nextSibling,r=n.nextSibling,i=t.nextSibling,a=i.firstChild.nextSibling,o=i.nextSibling.firstChild.nextSibling,s=o.firstChild;return R(n,()=>V().id),R(r,()=>V().status),R(a,()=>V().workspace),R(o,()=>V().session,s),R(o,()=>V().branch,null),y(e=>{var t=`badge ${V().status}`,n=V().workspace;return t!==e.e&&L(r,e.e=t),n!==e.t&&I(a,`title`,e.t=n),e},{e:void 0,t:void 0}),e})(),j(N,{get when(){return V().id},keyed:!0,fallback:null,children:e=>j(up,{agentId:e,get workspace(){return V().workspace}})}),fl(),(()=>{var e=ml(),t=e.firstChild,r=t.nextSibling,i=r.firstChild,a=i.nextSibling,o=a.nextSibling,s=r.nextSibling;return s.firstChild,t.addEventListener(`change`,e=>{Ce(e.currentTarget.value),Me(e.currentTarget.value)}),R(t,j(M,{get each(){return je()},children:e=>(()=>{var t=eu();return t.value=e,R(t,e,null),R(t,()=>e===D().defaultProvider?` ★`:``,null),t})()})),i.$$input=e=>we(e.currentTarget.value),R(a,j(M,{get each(){return ke()},children:e=>(()=>{var t=eu();return y(()=>t.value=e.id),t})()})),o.$$click=async e=>{if(!n())return;let t=e.currentTarget;t.disabled=!0;try{await $(`/api/agents/${n()}/model`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({provider:Se(),model:F().trim()||void 0,contextWindowTokens:ke().find(e=>e.id===(F().trim()||void 0))?.contextLength})}),t.textContent=`✓ applied`,It()}catch(e){alert(`model switch failed: ${e.message}`)}finally{setTimeout(()=>{t.textContent=`apply`,t.disabled=!1},1200)}},R(s,()=>V().model,null),R(s,j(N,{get when(){return ke().length},get children(){return[` · `,P(()=>ke().length),` models loaded`]}}),null),R(e,j(N,{get when(){return Pe()},get children(){var e=pl();return R(e,Pe),e}}),null),y(()=>I(i,`placeholder`,V().model)),y(()=>t.value=Se()),y(()=>i.value=F()),e})(),hl(),(()=>{var i=_l(),a=i.firstChild,o=a.nextSibling,s=o.nextSibling;return Te(a,`click`,V().status===`running`?xr(`/stop`):xr(`/start`),!0),R(a,()=>V().status===`running`?`■ stop`:`▶ start`),o.$$click=()=>$(`/api/agents/${V().id}/fork`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}).then(()=>dn(V().id)),s.$$click=async()=>{let i=n();if(!i||!confirm(`remove agent ${i}? (log is kept)`))return;await $(`/api/agents/${i}`,{method:`DELETE`}).catch(()=>{});let a=e().filter(e=>e.id!==i);t(a),a[0]?dn(a[0].id):(r(null),p([]))},R(i,j(N,{get when(){return e().some(e=>e.parent===n())},get children(){var e=gl();return e.$$click=async()=>{n()&&(Q(`stopped: ${((await $(`/api/agents/${n()}/stop-children`,{method:`POST`})).stopped??[]).join(`, `)||`(none)`}`),It())},e}}),null),y(e=>{var t=V().status===`running`?`danger`:`runbtn`,n=V().status===`running`?`interrupt: aborts the current LLM call; the running tool finishes first`:`run toward the goal (starts the loop)`;return t!==e.e&&L(a,e.e=t),n!==e.t&&I(a,`title`,e.t=n),e},{e:void 0,t:void 0}),i})(),(()=>{var e=vl(),t=e.firstChild.firstChild;return t.addEventListener(`change`,e=>{n()&&$(`/api/agents/${n()}/auto-continue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({value:e.currentTarget.checked})}).then(It)}),y(()=>t.checked=V().autoContinue??!0),e})(),(()=>{var e=bl();return e.firstChild,R(e,j(N,{get when(){return!!V().goal.text.trim()},get fallback(){return du()},get children(){var e=yl();return R(e,()=>V().goal.status),y(()=>L(e,`badge ${V().goal.status===`active`?`running`:V().goal.status}`)),e}}),null),e})(),(()=>{var e=xl();return e.firstChild,R(e,j(M,{each:[`active`,`done`,`paused`],children:e=>(()=>{var t=fu();return t.$$click=()=>{n()&&$(`/api/agents/${n()}/goal`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({status:e})}).then(It)},I(t,`title`,e===`active`?`agent keeps working toward the goal (with auto-continue)`:e===`done`?`mark achieved — auto-continue stops`:`parked on purpose — resume by setting active again`),R(t,e===`active`?`▶ working`:e===`done`?`✓ done`:`⏸ paused`),y(n=>{var r=`goalstate`+(V().goal.text.trim()&&V().goal.status===e?` on ${e}`:``),i=!!V().goal.text.trim()&&V().goal.status===e;return r!==n.e&&L(t,n.e=r),i!==n.t&&(t.disabled=n.t=i),n},{e:void 0,t:void 0}),t})()}),null),e})(),j(N,{get when(){return V().goal.text},get fallback(){return pu()},get children(){return[(()=>{var e=Sl(),t=e.firstChild;return y(()=>t.innerHTML=Ie(String(V().goal.text))),e})(),j(N,{get when(){return V().goal.verify},get children(){var e=Cl(),t=e.firstChild.nextSibling;return y(()=>t.innerHTML=Ie(String(V().goal.verify))),e}}),j(N,{get when(){return V().goal.audit},children:e=>(()=>{var t=mu(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return R(n,()=>e().verdict===`approved`?`✅ audit: approved`:`⚠ audit: changes required`,r),R(r,()=>Yf(e().at)),y(n=>{var r=`card auditcard `+(e().verdict===`approved`?`ok`:`warn`),a=Ie(e().feedback);return r!==n.e&&L(t,n.e=r),a!==n.t&&(i.innerHTML=n.t=a),n},{e:void 0,t:void 0}),t})()})]}}),wl(),(()=>{var e=Tl(),t=e.firstChild,n=t.nextSibling,r=n.nextSibling.firstChild.firstChild;return e.addEventListener(`submit`,jr),t.$$input=e=>{Cr(e.currentTarget.value),Dr(!0)},n.$$input=e=>{Tr(e.currentTarget.value),Dr(!0)},r.addEventListener(`change`,e=>kr(e.currentTarget.checked)),y(()=>t.value=Sr()),y(()=>n.value=wr()),y(()=>r.checked=Or()),e})(),(()=>{var e=Dl(),t=e.firstChild.nextSibling;return R(e,j(N,{get when(){return Ft().total>0},get children(){var e=El(),t=e.firstChild,n=t.nextSibling;return n.nextSibling,R(e,()=>Ft().done,t),R(e,()=>Ft().total,n),y(t=>Ee(e,Ft().done===Ft().total?`color:var(--ok)`:`color:var(--warn)`,t)),e}}),t),e})(),j(N,{get when(){return Ft().total>0},get children(){var e=Ol(),t=e.firstChild;return y(e=>{var n=`barfill `+(Ft().done===Ft().total?``:`warn`),r=`${Math.round(Ft().done/Ft().total*100)}%`;return n!==e.e&&L(t,e.e=n),r!==e.t&&De(t,`width`,e.t=r),e},{e:void 0,t:void 0}),e}}),j(N,{get when(){return kt()},get fallback(){return(()=>{var e=hu();return y(()=>e.innerHTML=Ef(Dt())),e})()},get children(){var e=kl();return e.$$input=e=>{Ot(e.currentTarget.value),Mt(!0)},y(()=>e.value=Dt()),e}}),(()=>{var e=Al(),t=e.firstChild,n=t.nextSibling;return R(e,j($f,{get icon(){return kt()?`👁`:`✎`},get title(){return kt()?`rendered checklist`:`edit markdown`},onClick:()=>At(!kt())}),t),n.$$click=Pt,e})(),jl(),j(N,{get when(){return V().latestProgress},get fallback(){return gu()},children:e=>(()=>{var t=xu(),n=t.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling;return R(t,j(N,{get when(){return e().recent},get children(){var t=_u(),n=t.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(e().recent)),t}}),i),R(t,j(N,{get when(){return e().problems},get children(){var t=vu(),n=t.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(e().problems)),t}}),i),R(t,j(N,{get when(){return e().next},get children(){var t=yu(),n=t.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(e().next)),t}}),i),R(t,j(N,{get when(){return e().goalStatus},get children(){var t=bu(),n=t.firstChild.nextSibling;return R(n,()=>e().goalStatus),t}}),i),R(i,()=>Yf(e().ts)),y(()=>r.innerHTML=Ef(e().doing)),t})()}),Ml(),(()=>{var e=Fl(),t=e.firstChild,r=t.firstChild,i=r.firstChild.nextSibling,a=r.nextSibling,o=a.firstChild.nextSibling,s=a.nextSibling.firstChild.nextSibling,c=t.nextSibling,l=c.firstChild.nextSibling,u=l.firstChild,d=u.nextSibling;return d.nextSibling,R(i,()=>V().stats.turns),R(o,()=>V().stats.toolCalls),R(s,()=>V().stats.compactions??0),R(l,()=>Xf(V().stats.inputTokens),u),R(l,()=>Xf(V().stats.outputTokens),d),R(c,j(N,{get when(){return(V().stats.cachedInputTokens??0)>0},get children(){var e=Nl(),t=e.firstChild.nextSibling;return t.nextSibling,R(e,()=>Math.round(V().stats.cachedInputTokens/Math.max(1,V().stats.inputTokens)*1e3)/10,t),y(()=>I(e,`title`,`${Xf(V().stats.cachedInputTokens)} tokens were served from the provider's prompt cache — billed far cheaper than fresh input`)),e}}),null),R(e,j(N,{get when(){return(V().stats.costUsd??0)>0},get children(){var e=Pl(),t=e.firstChild.nextSibling;return t.firstChild,R(t,()=>Zf(V().stats.costUsd??0),null),y(()=>I(e,`title`,`≈ ${(V().stats.costUsd??0).toFixed(4)} this session, from the model's USD/token pricing and per-turn usage. Cached input is estimated at ~10% of the prompt rate; treat as an approximation, not an invoice.`)),e}}),null),R(e,j(N,{get when(){return V().ctx},keyed:!0,get fallback(){return Su()},children:e=>{let t=x(()=>{let t=e,n=ke().find(e=>e.id===V().model),r=t.window||n?.contextLength||0,i=r?Math.min(999,t.usedTokens/r*100):0;return{usedTokens:t.usedTokens,compactAt:t.compactAt,compacting:t.compacting,window:t.window,effectiveWindow:r,pct:i,cls:r?i>=85?`crit`:i>=70?`warn`:`ok`:``,derivedBudget:r?Math.round(r*.75):0,usingDerived:t.compactAtIsManual!==!0}}),r=()=>t(),i=e=>{let t=Math.round(e*10)/10;return Number.isInteger(t)?String(t):t.toFixed(1)};return(()=>{var e=Du(),t=e.firstChild,a=t.firstChild.nextSibling,o=a.firstChild.nextSibling;o.nextSibling;var s=t.nextSibling,c=s.firstChild.nextSibling,l=c.firstChild,u=c.nextSibling,d=s.nextSibling,f=d.firstChild.firstChild,p=d.nextSibling,m=p.firstChild.nextSibling;return m.nextSibling,R(a,()=>Xf(r().usedTokens),o),R(t,j(N,{get when(){return r().effectiveWindow},get children(){var e=Cu(),t=e.firstChild;return R(e,()=>i(r().pct),t),R(e,()=>Xf(r().effectiveWindow),null),y(()=>L(e,`pill ${r().cls}`)),e}}),null),R(e,j(N,{get when(){return r().effectiveWindow},get children(){var e=wu(),t=e.firstChild;return y(e=>{var n=`barfill ${r().cls}`,i=`${Math.min(100,r().pct)}%`;return n!==e.e&&L(t,e.e=n),i!==e.t&&De(t,`width`,e.t=i),e},{e:void 0,t:void 0}),e}}),s),R(c,()=>Xf(r().usingDerived?r().derivedBudget:r().compactAt),l),R(u,()=>r().usingDerived?` (75% of window)`:` (manual override)`),R(e,j(N,{get when(){return r().effectiveWindow},get children(){var e=Tu(),t=e.firstChild;return y(e=>{var n=`barfill ${r().cls}`,i=`${Math.min(100,Math.round(r().usedTokens/r().derivedBudget*100))}%`;return n!==e.e&&L(t,e.e=n),i!==e.t&&De(t,`width`,e.t=i),e},{e:void 0,t:void 0}),e}}),d),R(e,j(N,{get when(){return Ue()||r().compacting},get children(){var e=Eu(),t=e.firstChild.nextSibling.nextSibling;return R(t,()=>Ue()?.phase??String(r().compacting)),e}}),d),f.addEventListener(`change`,e=>{n()&&$(`/api/agents/${n()}/auto-compact`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({value:e.currentTarget.checked})}).then(It)}),R(p,()=>Xf(r().compactAt),m),y(()=>f.checked=V().autoCompact!==!1),e})()}}),null),e})(),Il(),j(M,{get each(){return g()},children:e=>(()=>{var t=Ou(),r=t.firstChild,i=r.nextSibling,a=i.firstChild;return t.$$click=()=>{let t=Kt()===e.branch?null:e.branch;qt(t),n()&&an(n())},R(r,()=>e.branch,null),R(r,()=>e.branch===V().branch?` (current)`:``,null),R(i,()=>e.events,a),y(n=>{var r=`branch-row`+(e.branch===V().branch||e.branch===Kt()?` cur`:``),i=e.branch===Kt()?`click to show all branches again`:`show only ${e.branch}`;return r!==n.e&&L(t,n.e=r),i!==n.t&&I(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()}),Ll(),j(N,{get when(){return Rt().length>0},get fallback(){return ku()},get children(){return j(M,{get each(){return Rt()},children:e=>(()=>{var t=ju(),r=t.firstChild,i=r.firstChild,a=i.nextSibling;a.firstChild;var o=r.nextSibling,s=o.firstChild,c=o.nextSibling;return t.$$click=()=>dn(e.agent),R(i,()=>e.id),R(a,()=>e.agent,null),R(r,j(N,{get when(){return e.forked},get children(){return Au()}}),null),R(o,()=>e.schedule,s),R(o,(()=>{var t=P(()=>!!e.next);return()=>t()?Yf(e.next):`—`})(),null),R(o,(()=>{var t=P(()=>!!e.last);return()=>t()?` · last ${Yf(e.last)}`:` · never ran`})(),null),R(c,()=>Qf(e.prompt,90)),y(r=>{var i=`sched-row`+(e.agent===n()?` cur`:``),a=`${Qf(e.prompt,200)}\nclick to open #${e.agent}`;return i!==r.e&&L(t,r.e=i),a!==r.t&&I(t,`title`,r.t=a),r},{e:void 0,t:void 0}),t})()})}})]}})),y(e=>{var t=`layout`+(ce()?``:` right-hidden`),n=`iconbtn notifbtn`+(H()>0?` has-unread`:``),r=H()>0?`${H()} unread notifications`:`notifications`,a=`conn`+(fn()?` ok`:``),o=fn()?`live (websocket)`:`reconnecting…`,s=`rightbar`+(ce()?` open`:``);return t!==e.e&&L(i,e.e=t),n!==e.t&&L(l,e.t=n),r!==e.a&&I(l,`title`,e.a=r),a!==e.o&&L(m,e.o=a),o!==e.i&&I(m,`title`,e.i=o),s!==e.n&&L(v,e.n=s),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),i}}),j(N,{get when(){return dt()},get children(){return[(()=>{var e=zl();return e.$$click=()=>ft(!1),e})(),(()=>{var t=Hl(),r=t.firstChild.firstChild.nextSibling,i=r.firstChild;return R(r,j(N,{get when(){return st().length>0},get children(){var e=Bl();return e.$$click=()=>ct([]),e}}),i),i.$$click=()=>ft(!1),R(t,j(N,{get when(){return st().length>0},get fallback(){return Mu()},get children(){var t=Vl();return R(t,j(M,{get each(){return st()},children:t=>(()=>{var r=Pu(),i=r.firstChild.firstChild,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling;return r.$$click=()=>{ct(e=>e.map(e=>e.id===t.id?{...e,read:!0}:e)),n()!==t.agentId&&e().some(e=>e.id===t.agentId)&&dn(t.agentId),ft(!1),t.eventId&&setTimeout(()=>vt(t.eventId),n()===t.agentId?60:350)},R(i,(()=>{var e=P(()=>t.kind===`finish`);return()=>e()?`✅`:P(()=>t.kind===`question`)()?`❓`:t.kind===`error`?`⚠️`:`📈`})()),R(a,()=>t.title),R(o,()=>Yf(new Date(t.at).toISOString())),s.$$click=e=>{e.stopPropagation(),ct(e=>e.map(e=>e.id===t.id?{...e,read:!0}:e))},R(s,()=>t.read?`✓`:`○`),R(r,j(N,{get when(){return t.body},get children(){var e=Nu();return R(e,()=>Jf(t.body,160)),e}}),null),y(e=>{var n=`notifitem `+t.kind+(t.read?` read`:``),i=`from ${t.agentId}`,a=t.read?`already read`:`mark as read`;return n!==e.e&&L(r,e.e=n),i!==e.t&&I(r,`title`,e.t=i),a!==e.a&&I(s,`title`,e.a=a),e},{e:void 0,t:void 0,a:void 0}),r})()})),t}}),null),t})()]}}),j(N,{get when(){return O()},get children(){return j(np,{get providers(){return Object.keys(D().providers??{})},onClose:()=>ae(!1),onCreated:e=>{ae(!1),It(),dn(e)}})}}),j(N,{get when(){return oe()},get children(){return j(hp,{get cfg(){return D()},onClose:()=>se(!1),onSaved:()=>{wt(),Bt()}})}}),j(N,{get when(){return rt()},fallback:null,children:e=>{let t=()=>f().findIndex(t=>t.id===e().eventId),r=()=>Math.max(0,f().length-t()-1),[i,a]=v(r()>0?`summarize`:`discard`);return j(tp,{title:`edit prompt — forks the conversation`,onClose:()=>it(null),get children(){var t=Iu(),o=t.firstChild,s=o.nextSibling,c=s.firstChild;return t.addEventListener(`submit`,async t=>{t.preventDefault();let r=document.getElementById(`edit-text`);try{await $(`/api/agents/${n()}/edit-prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({eventId:e().eventId,text:r.value,tail:i()})}),it(null),It();let t=n();t&&await dn(t)}catch(e){alert(`edit failed: ${e.message}`)}}),R(t,j(N,{get when(){return r()>0},get children(){var e=Fu(),t=e.firstChild,n=t.firstChild,o=t.nextSibling,s=o.firstChild,c=o.nextSibling.firstChild;return R(t,r,n),s.addEventListener(`change`,()=>a(`summarize`)),c.addEventListener(`change`,()=>a(`discard`)),y(()=>s.checked=i()===`summarize`),y(()=>c.checked=i()===`discard`),e}}),s),c.$$click=()=>it(null),y(()=>o.value=e().text),t}})}})]}function Vf(e){let t=new Date(e.startedAt).getTime(),[n,r]=v(Date.now());ee(()=>{let e=setInterval(()=>r(Date.now()),500);C(()=>clearInterval(e))});let i=()=>Math.max(0,(n()-t)/1e3),a=()=>i()<60?`${i().toFixed(1)}s`:`${Math.floor(i()/60)}m ${Math.round(i()%60)}s`;return e.inline?(()=>{var t=Lu();return t.firstChild,R(t,a,null),R(t,(()=>{var t=P(()=>!!e.timeoutMs);return()=>t()?` · timeout ${Math.round(e.timeoutMs/1e3)}s`:``})(),null),t})():(()=>{var e=Ru(),t=e.firstChild;return R(e,a,t),e})()}function Hf(e){let[t,n]=v(Date.now());ee(()=>{let e=setInterval(()=>n(Date.now()),500);C(()=>clearInterval(e))});let r=()=>Math.max(0,(t()-e.startedAt)/1e3);return(()=>{var e=zu();return R(e,(()=>{var e=P(()=>r()<60);return()=>e()?`${r().toFixed(0)}s`:`${Math.floor(r()/60)}m ${Math.round(r()%60)}s`})()),e})()}function Uf(e){let t=e.e,n=e.res,r=!e.agentActive&&!n,i=t.data??{},a=String(i.name??`tool`),o=()=>n?String(n.data?.result??``):``,s=a,c=``,l=(()=>{var e=Bu();return R(e,()=>Jf(JSON.stringify(i.args??{},null,1),2e3)),e})(),u=e=>String(i.args?.[e]??``),d=()=>a===`bash`?u(`command`):u(`path`)||JSON.stringify(i.args??{},null,1),f=()=>a===`bash`?Number(u(`timeout_ms`))||void 0:a===`wait_children`?Number(u(`timeout_ms`))||3e5:Number(u(`timeout_ms`))||void 0,p=(e,t=1500)=>(()=>{var n=Vu();return R(n,()=>Jf(e,t)),n})(),m=(e=4e3)=>n?[P(()=>p(o(),e)),(()=>{var e=Hu(),t=e.firstChild;return R(e,()=>n.data?.durationMs,t),R(e,()=>n.data?.ok===!1?` · FAILED`:``,null),R(e,j(ep,{get text(){return o()}}),null),e})()]:Uu();try{switch(a){case`bash`:{let e=u(`command`),t=i.args?.background===!0,r=t?String(o()).match(/job (bg\d+)/)?.[1]??``:``;s=(t?`⏳ `:`$ `)+Qf(e,96);let a=u(`timeout_ms`)?` · timeout ${Math.round(Number(u(`timeout_ms`))/1e3)}s`:``;c=n?t?`background job${r?` ${r}`:``}${a}`:`${n.data?.durationMs??`?`}ms${a}`:null,l=[t?(()=>{var e=Wu(),t=e.firstChild.nextSibling,n=t.firstChild.nextSibling;return n.nextSibling,R(t,r||`?`,n),R(e,r?[` · kill with `,Gu()]:null,null),e})():null,P(()=>P(()=>e!==s.slice(2))()?p(e,800):null),P(()=>m(6e3))];break}case`read_file`:{s=u(`path`)||`(no path)`;let e=[];u(`pattern`)&&e.push(`grep /${Qf(u(`pattern`),40)}/`),Number(i.args?.offset)<0?e.push(`last ${-Number(i.args.offset)} lines`):i.args?.offset&&e.push(`from L${i.args.offset}`),i.args?.limit&&e.push(`≤${i.args.limit} lines`),c=e.join(` · `),l=m(6e3);break}case`write_file`:{let e=String(i.args?.content??``);s=u(`path`)||`(no path)`,c=`${Xf(e.length)} bytes`,l=[P(()=>p(e,1500)),P(()=>P(()=>e.length>1500)()?(()=>{var t=Ku(),n=t.firstChild;return R(t,()=>Xf(e.length),n),t})():null),n?(()=>{var e=qu();return R(e,()=>Qf(o(),160)),e})():Ju()];break}case`edit_file`:s=u(`path`)||`(no path)`,c=i.args?.replace_all===!0?`replace all`:`unique spot`,l=[(()=>{var e=Yu();return R(e,()=>Jf(`- `+u(`old_text`),900)),e})(),(()=>{var e=Xu();return R(e,()=>`+ `+Jf(u(`new_text`),900)),e})(),n?(()=>{var e=Zu(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,R(e,()=>Qf(o(),120),t),R(e,()=>n.data?.durationMs,r),e})():Qu()];break;case`apply_patch`:{let e=u(`patch`).split(`
|
|
26
26
|
`).filter(e=>e&&!/^---$/.test(e.trim())),t=e.map(e=>e.match(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/)?.[1]).filter(Boolean);s=t.length?`${t.length} file${t.length>1?`s`:``}: ${Qf(t.join(`, `),80)}`:`patch`;let r=e.slice(0,60);l=[(()=>{var t=$u();return R(t,()=>r.map(e=>{let t=e.startsWith(`+`)?` add`:e.startsWith(`-`)?` del`:/^\*\*\*|^@@/.test(e)?` meta`:``;return(()=>{var n=ed();return L(n,`pline`+t),R(n,(()=>{var t=P(()=>e.length>240);return()=>t()?e.slice(0,240)+`…`:e})()),n})()}),null),R(t,(()=>{var t=P(()=>e.length>60);return()=>t()?(()=>{var t=td(),n=t.firstChild.nextSibling;return n.nextSibling,R(t,()=>e.length-60,n),t})():null})(),null),t})(),n?(()=>{var e=qu();return R(e,()=>Qf(o().split(`
|
|
27
|
-
`)[0]??``,140),null),R(e,()=>n.data?.ok===!1?` · FAILED`:``,null),e})():nd()];break}case`list_dir`:s=u(`path`)||`.`,l=m(4e3);break;case`read_url`:{let e=u(`url`);try{let t=new URL(e);e=t.host+t.pathname}catch{}s=Qf(e,70),c=`web`,l=[(()=>{var e=qu();return R(e,j(N,{get when(){return/^https?:/i.test(u(`url`))},get fallback(){return(()=>{var e=id();return R(e,()=>Qf(u(`url`),80)),e})()},get children(){var e=rd();return y(()=>I(e,`href`,u(`url`))),e}})),e})(),P(()=>m(3e3))];break}case`bash_output`:{let e=u(`action`)||`read`;s=`bash_output ${u(`job_id`)||`(?)`}`,c=e,l=m(4e3);break}case`load_skill`:{s=`skill: ${u(`name`)}`;let e=o().replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,``);l=n?[(()=>{var t=Xc();return y(()=>t.innerHTML=Ie(e)),t})(),(()=>{var e=Hu(),t=e.firstChild;return R(e,()=>n.data?.durationMs,t),e})()]:ad();break}case`save_skill`:{s=`skill: ${u(`name`)}`,c=Qf(u(`description`),60);let e=Array.isArray(i.args?.files)?i.args.files.map(e=>e?.name).filter(Boolean):[];l=[P(()=>P(()=>!!e.length)()?(()=>{var t=od();return t.firstChild,R(t,()=>e.join(`, `),null),t})():null),n?(()=>{var e=Zu(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,R(e,()=>Qf(o(),160),t),R(e,()=>n.data?.durationMs,r),e})():sd()];break}}}catch{}return(()=>{var i=ld(),u=i.firstChild,p=u.firstChild;p.firstChild;var m=p.nextSibling,h=m.nextSibling;return i.addEventListener(`toggle`,t=>{t.target.open&&e.onResize?.()}),I(i,`title`,`${a}${c?` — `+c:``}`),R(p,s,null),R(u,j(N,{get when(){return t.data?.actor},get children(){var e=cd();return e.firstChild,R(e,()=>String(t.data.actor),null),e}}),m),R(m,()=>n?c||``:r?`(result missed)`:a===`bash`||f()?j(Vf,{get startedAt(){return t.ts},inline:!0,get timeoutMs(){return f()}}):`running…`),R(h,j(ep,{get text(){return d()},label:`⧉ cmd`,title:`copy the ${a} arguments`}),null),R(h,j(N,{when:n,get children(){return j(ep,{get text(){return o()},label:`⧉ out`,title:`copy this tool's full output`})}}),null),R(i,l,null),y(()=>L(i,`embed`+(n?n.data?.ok===!1?` fail`:` done`:r?` done`:` running`))),i})()}function Wf(e){let t=e.data??{};return e.type===`prompt`?String(t.text??``):e.type===`message`?`${typeof t.reasoning==`string`&&t.reasoning.trim()?`<reasoning>\n${t.reasoning}\n</reasoning>\n\n`:``}${String(t.content??``)}`:(e.type,``)}function Gf(e){let t=e.e,n=Pf(t),r=e=>{let t=e.data??{};return e.data?.actor?`sub:${String(e.data.actor)}`:e.type===`tool_call`||e.type===`tool_result`?`agent-tools`:e.type===`prompt`?`src:${String(t.source??`user`)}`:`type:${e.type}`},i=e.prev&&r(e.prev)===r(t)&&Pf(e.prev).name===n.name&&t.session===e.prev.session&&t.branch===e.prev.branch;if(t.type===`fork`){let e=t.data??{};return(()=>{var n=ud(),r=n.firstChild.nextSibling;return r.nextSibling,R(n,()=>String(e.fromBranch??`?`),r),R(n,()=>String(e.newBranch??t.branch),null),n})()}if(t.type===`goal`){let e=t.data??{},n=e.event===`status`?`marked ${String(e.status??``)}`:Qf(String(e.text??``),80);return(()=>{var t=dd(),r=t.firstChild.nextSibling;return r.nextSibling,R(t,()=>String(e.event??``),r),R(t,n,null),t})()}if(t.type===`todo`)return(()=>{var e=fd(),n=e.firstChild.nextSibling;return n.nextSibling,R(e,()=>String(t.data?.by??`human`),n),e})();if(t.type===`state`)return t.data.from===t.data.to?null:(()=>{var e=pd(),n=e.firstChild;return R(e,()=>t.data.from,n),R(e,()=>t.data.to,null),R(e,(()=>{var e=P(()=>!!t.data.reason);return()=>e()?` — ${t.data.reason}`:``})(),null),y(()=>L(e,`divider-msg`+(t.data.to===`error`?` err`:``))),e})();if(t.type===`system_note`){let e=String(t.data?.event??``);if(e===`runaway-detected`)return(()=>{var e=md(),n=e.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling;i.nextSibling;var a=n.nextSibling,o=a.firstChild.nextSibling;return o.nextSibling,R(n,()=>String(t.data?.failures),r),R(n,()=>String(t.data?.limit),i),R(a,()=>String(t.data?.lastTool),o),R(a,()=>String(t.data?.lastError??``).slice(0,200),null),y(()=>I(e,`title`,`${t.data?.failures} consecutive tool failures hit the configured limit (${t.data?.limit})`)),e})();if(e===`error-retry`)return(()=>{var e=hd(),n=e.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling;return i.nextSibling,R(n,()=>String(t.data?.attempt),r),R(n,()=>Math.round(Number(t.data?.waitMs)/1e3),i),e})();if(e===`background-exit`){let e=t.data?.failed===!0,n=Math.round(Number(t.data?.durationMs??0)/1e3);return(()=>{var r=ed();return L(r,`divider-msg`+(e?` err`:``)),R(r,()=>(e?`⚠ background job `:`✓ background job `)+String(t.data?.jobId??`?`)+` `+(e?`FAILED (exit ${String(t.data?.code??`?`)})`:`finished (${n}s)`)),y(()=>I(r,`title`,String(t.data?.cmd??``))),r})()}return e===`context-compacted`?(()=>{var e=gd(),n=e.firstChild.nextSibling,r=n.nextSibling.nextSibling,i=r.nextSibling.nextSibling;return i.nextSibling,R(e,()=>String(t.data?.tokensBefore??`?`),n),R(e,()=>String(t.data?.tokensAfter??`?`),r),R(e,()=>String(t.data?.mode??``),i),e})():null}return(()=>{var r=bd(),a=r.firstChild,o=a.nextSibling;return L(a,`avatar avghost`+(i?` ghosted`:``)),R(a,()=>i?``:n.icon),R(o,i&&(()=>{var e=xd();return y(()=>I(e,`title`,`${Lf(t.ts)} · ${t.branch}`)),e})(),null),R(o,j(N,{when:!i,get children(){var r=yd(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling;return R(i,()=>n.name),R(r,j(N,{get when(){return t.data?.actor},get children(){var e=cd();return e.firstChild,R(e,()=>String(t.data.actor),null),e}}),a),R(a,(()=>{var e=P(()=>!!t.data?.pending);return()=>e()?`queued…`:Lf(t.ts)})()),R(o,()=>t.branch),R(r,j(N,{get when(){return e.onCancel},get children(){var t=_d();return t.$$click=t=>{t.stopPropagation(),e.onCancel()},t}}),null),R(r,j(N,{get when(){return t.type!==`tool_call`},get children(){return j(ep,{get text(){return Wf(t)},label:`⧉ copy`,title:`copy the RAW text of this message (no markdown rendering)`})}}),null),R(r,j(N,{get when(){return e.onEdit},get children(){var t=vd();return t.$$click=t=>{t.stopPropagation(),e.onEdit()},t}}),null),y(e=>De(i,`color`,n.color)),r}}),null),R(o,j(qf,{e:t,get res(){return e.res},get onOption(){return e.onOption},get answeredIds(){return e.answeredIds},get agentActive(){return e.agentActive},get onResize(){return e.onResize}}),null),y(e=>{var o=`msg`+(i?` grouped`:``)+(t.data?.pending?` pending`:``),s=t.id,c=i?`transparent`:n.color+`33`,l=i?`1px solid transparent`:`1px solid ${n.color}66`,u=i?`${Lf(t.ts)} · ${t.branch}`:void 0;return o!==e.e&&L(r,e.e=o),s!==e.t&&I(r,`data-eid`,e.t=s),c!==e.a&&De(a,`background`,e.a=c),l!==e.o&&De(a,`border`,e.o=l),u!==e.i&&I(a,`title`,e.i=u),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),r})()}function Kf(e){let[t,n]=v(``),r=()=>{let r=t().trim();!r||e.answered||(n(``),e.onOption?.(r))};return(()=>{var i=Sd(),a=i.firstChild,o=a.nextSibling;return a.$$keydown=e=>{e.key===`Enter`&&(e.preventDefault(),r())},a.$$input=e=>n(e.currentTarget.value),o.$$click=r,y(n=>{var r=e.answered?`answered`:`or type your own answer…`,i=e.answered,s=e.answered||!t().trim();return r!==n.e&&I(a,`placeholder`,n.e=r),i!==n.t&&(a.disabled=n.t=i),s!==n.a&&(o.disabled=n.a=s),n},{e:void 0,t:void 0,a:void 0}),y(()=>a.value=t()),i})()}function qf(e){let t=e.e;switch(t.type){case`prompt`:{let e=t.data?.images??[];return[(()=>{var e=Xc();return y(()=>e.innerHTML=Ef(String(t.data.text??``))),e})(),j(N,{get when(){return e.length},get children(){var t=Cd();return R(t,j(M,{each:e,children:e=>(()=>{var t=wd();return I(t,`src`,e),t})()})),t}})]}case`message`:return[j(N,{get when(){return P(()=>typeof t.data.reasoning==`string`)()&&t.data.reasoning.trim()},get children(){var e=Td(),n=e.firstChild;n.firstChild;var r=n.nextSibling;return R(n,(()=>{var e=P(()=>String(t.data.reasoning).length>4e3);return()=>e()?` (${Xf(String(t.data.reasoning).length)} — truncated)`:``})(),null),R(r,()=>Jf(String(t.data.reasoning),8e3)),e}}),(()=>{var e=Xc();return y(()=>e.innerHTML=Ef(String(t.data.content??``))),e})(),j(N,{get when(){return t.data.interrupted},get children(){return Ed()}}),j(N,{get when(){return t.data.final},get children(){var e=Dd(),n=e.firstChild;return R(e,j(ep,{get text(){return String(t.data.content??``)}}),n),e}})];case`tool_call`:return j(Uf,{e:t,get res(){return e.res},get agentActive(){return e.agentActive},get onResize(){return e.onResize}});case`tool_result`:{let e=String(t.data.result);return(()=>{var n=Od(),r=n.firstChild,i=r.firstChild,a=r.nextSibling,o=a.nextSibling,s=o.firstChild;return R(i,()=>Qf(e,120)),R(r,j(ep,{text:e}),null),R(a,()=>Jf(e,4e3)),R(o,()=>t.data.durationMs,s),R(o,()=>t.data.ok?``:` · FAILED`,null),y(()=>L(n,`embed`+(t.data.ok?``:` fail`))),n})()}case`decision`:{let e=Array.isArray(t.data?.alternatives)?t.data.alternatives:[];return(()=>{var n=Ad(),r=n.firstChild,i=r.firstChild.firstChild.nextSibling,a=r.nextSibling;return R(n,j(N,{get when(){return e.length},get children(){var t=kd();return t.firstChild,R(t,()=>e.join(` / `),null),t}}),null),y(e=>{var n=Ef(String(t.data?.decision??``)),r=Ef(String(t.data?.rationale??``));return n!==e.e&&(i.innerHTML=e.e=n),r!==e.t&&(a.innerHTML=e.t=r),e},{e:void 0,t:void 0}),n})()}case`question`:{let n=Array.isArray(t.data?.options)?t.data.options:[],r=t.data?.callId?String(t.data.callId):``,i=e.answeredIds?.has(r)??!1;return(()=>{var r=Nd(),a=r.firstChild.firstChild.nextSibling;return L(r,`embed question`+(i?` answered`:``)),R(r,j(N,{when:i,get children(){return jd()}}),null),R(r,j(N,{get when(){return n.length>0},get children(){var r=Md();return R(r,j(M,{each:n,children:n=>(()=>{var r=Pd();return r.$$click=()=>{let r=t.data?.actor;r?$(`/api/agents/${encodeURIComponent(String(r))}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:n,start:!0})}).then(()=>Q(`→ answered @${String(t.data.actor)}`)).catch(()=>Q(`answer failed`)):e.onOption?.(n)},r.disabled=i,R(r,n),r})()})),r}}),null),R(r,j(Kf,{answered:i,get onOption(){return e.onOption}}),null),y(()=>a.innerHTML=Ef(String(t.data?.question??``))),r})()}case`progress`:return(()=>{var e=Fd(),n=e.firstChild.firstChild.nextSibling;return R(e,j(N,{get when(){return t.data.goalStatus},get children(){var e=bu(),n=e.firstChild.nextSibling;return R(n,()=>String(t.data.goalStatus)),e}}),null),R(e,j(N,{get when(){return t.data.recent},get children(){var e=_u(),n=e.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(String(t.data.recent))),e}}),null),R(e,j(N,{get when(){return t.data.problems},get children(){var e=vu(),n=e.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(String(t.data.problems))),e}}),null),R(e,j(N,{get when(){return t.data.next},get children(){var e=yu(),n=e.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(String(t.data.next))),e}}),null),y(()=>n.innerHTML=Ef(String(t.data.doing??``))),e})();case`error`:return(()=>{var e=Id(),n=e.firstChild;return n.firstChild,R(n,()=>String(t.data.message??``),null),e})();case`compaction`:return(()=>{var e=Rd(),n=e.firstChild.firstChild.nextSibling,r=n.firstChild,i=r.nextSibling,a=i.nextSibling.nextSibling;return a.nextSibling,R(n,()=>String(t.data.mode??``),r),R(n,()=>Xf(Number(t.data.tokensBefore??0)),i),R(n,()=>Xf(Number(t.data.tokensAfter??0)),a),R(n,(()=>{var e=P(()=>!!t.data.summarized);return()=>e()?`${t.data.summarized} summarized`:`${t.data.dropped} dropped`})(),null),R(e,j(N,{get when(){return t.data.summary},get children(){return[Ld(),(()=>{var e=Xc();return y(()=>e.innerHTML=Ef(String(t.data.summary))),e})()]}}),null),e})();default:return(()=>{var e=zd();return R(e,()=>Jf(JSON.stringify(t.data),200)),e})()}}function Jf(e,t){return e.length>t?e.slice(0,t)+` …`:e}function Yf(e){let t=new Date(e).getTime()-Date.now(),n=Math.abs(t),r=n<9e4?`${Math.round(n/1e3)}s`:n<54e5?`${Math.round(n/6e4)}m`:`${(n/36e5).toFixed(1)}h`;return t>=0?`in ${r}`:`${r} ago`}function Xf(e){return e>=1e9?`${+(e/1e9).toFixed(1)}b`:e>=1e6?`${+(e/1e6).toFixed(1)}m`:e>=1e4?`${Math.round(e/1e3)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Zf(e){return e>=100?Math.round(e).toLocaleString():e>=10?e.toFixed(1):e>=1?e.toFixed(2):e>=.01?e.toFixed(3):e.toFixed(4)}function Qf(e,t){return Jf(e.replace(/\s+/g,` `).trim(),t)}function $f(e){return(()=>{var t=Bd(),n=t.firstChild;return Te(t,`click`,e.onClick,!0),R(n,()=>e.icon),y(n=>{var r=`iconbtn`+(e.active?` active`:``)+(e.class?` `+e.class:``),i=e.title,a=e.style;return r!==n.e&&L(t,n.e=r),i!==n.t&&I(t,`title`,n.t=i),n.a=Ee(t,a,n.a),n},{e:void 0,t:void 0,a:void 0}),t})()}function ep(e){let[t,n]=v(!1),[r,i]=v(!1),a=t=>{t.preventDefault(),t.stopPropagation();let r=e.text??``;if(!r){i(!0),setTimeout(()=>i(!1),1200);return}navigator.clipboard.writeText(r).then(()=>{n(!0),setTimeout(()=>n(!1),900)}).catch(()=>{try{let e=document.createElement(`textarea`);e.value=r,e.style.position=`fixed`,e.style.opacity=`0`,document.body.appendChild(e),e.select(),document.execCommand(`copy`),e.remove(),n(!0),setTimeout(()=>n(!1),900)}catch{i(!0),setTimeout(()=>i(!1),1200)}})};return(()=>{var n=Vd();return n.$$click=a,R(n,(()=>{var n=P(()=>!!t());return()=>n()?`✓`:P(()=>!!r())()?`✗`:e.label??`⧉`})()),y(()=>I(n,`title`,e.title??`copy to clipboard`)),n})()}function tp(e){return(()=>{var t=Hd(),n=t.firstChild,r=n.firstChild.firstChild,i=r.nextSibling;return t.$$click=t=>t.target===t.currentTarget&&e.onClose(),R(r,()=>e.title),Te(i,`click`,e.onClose,!0),R(n,()=>e.children,null),t})()}function np(e){let[t,n]=v(`~`),[r,i]=v([]),[a,o]=v(``),[s,c]=v(e.providers[0]??``),[l,u]=v(``),[d,f]=v(``);async function p(e){let r=await $(`/api/fs?path=${encodeURIComponent(e??t())}`);n(r.path),h(r.parent??``),i(r.entries??[])}ee(()=>p(t()));let[m,h]=v(``),g=async n=>{n.preventDefault(),f(``);try{let n=await $(`/api/agents`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({workspace:t(),id:a(),provider:s()||void 0,model:l()||void 0,start:!1})});e.onCreated(n.agent.id)}catch(e){f(String(e.message))}};return j(tp,{title:`new agent`,get onClose(){return e.onClose},get children(){var i=Wd(),f=i.firstChild,h=f.firstChild.nextSibling.firstChild,_=h.nextSibling,v=_.nextSibling,b=f.nextSibling,x=b.nextSibling,S=x.firstChild,ee=S.firstChild.nextSibling,C=S.nextSibling,te=C.firstChild.nextSibling,ne=C.nextSibling.firstChild.nextSibling,w=x.nextSibling;return i.addEventListener(`submit`,g),h.$$input=e=>n(e.currentTarget.value),_.$$click=()=>p(t()),v.$$click=()=>m()?p(m()):p(`..`),R(b,j(M,{get each(){return r()},children:e=>(()=>{var n=Gd();return n.firstChild,n.$$click=()=>p(`${t()}/${e}`.replace(/\/+/g,`/`)),R(n,e,null),n})()})),ee.$$input=e=>o(e.currentTarget.value),te.addEventListener(`change`,e=>c(e.currentTarget.value)),R(te,j(M,{get each(){return e.providers},children:e=>(()=>{var t=eu();return R(t,e),t})()})),ne.$$input=e=>u(e.currentTarget.value),R(i,j(N,{get when(){return d()},get children(){var e=Ud();return R(e,d),e}}),w),y(()=>h.value=t()),y(()=>ee.value=a()),y(()=>te.value=s()),y(()=>ne.value=l()),i}})}var rp=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`svg`,`bmp`,`ico`,`avif`]),ip=new Set([`mp4`,`webm`,`mov`,`mkv`,`avi`,`m4v`]),ap=new Set([`mp3`,`wav`,`ogg`,`m4a`,`flac`,`aac`,`opus`]);function op(e){let t=e.split(`.`).pop()?.toLowerCase()??``,n=sp(e);return n===`image`?`🖼`:n===`video`?`🎬`:n===`audio`?`🎵`:[`ts`,`tsx`,`mts`,`cts`].includes(t)?`🟦`:[`js`,`mjs`,`cjs`,`jsx`].includes(t)?`🟨`:t===`json`||t===`jsonc`?`🧾`:t===`md`||t===`mdx`||t===`markdown`?`📝`:t===`css`||t===`scss`||t===`less`?`🎨`:t===`html`||t===`htm`||t===`svg`?`🌐`:[`py`,`pyi`].includes(t)?`🐍`:t===`rs`?`🦀`:t===`go`?`🐹`:t===`java`||t===`kt`||t===`kts`?`☕`:t===`rb`?`💎`:t===`php`?`🐘`:t===`c`||t===`h`||t===`cpp`||t===`hpp`||t===`cc`?`🧩`:t===`sh`||t===`bash`||t===`zsh`||t===`fish`?`🐚`:t===`sql`?`🗄`:t===`yml`||t===`yaml`||t===`toml`||t===`ini`||t===`conf`?`⚙`:t===`lock`?`🔒`:e===`Dockerfile`||t===`dockerfile`?`🐳`:t===`zip`||t===`gz`||t===`tar`||t===`tgz`||t===`bz2`?`📦`:t===`pdf`?`📕`:t===`txt`||t===`log`?`📄`:`·`}function sp(e){let t=e.split(`.`).pop()?.toLowerCase()??``;return rp.has(t)?`image`:ip.has(t)?`video`:ap.has(t)?`audio`:null}var cp=new Map,lp=e=>{let t=cp.get(e);return t||(t={expanded:new Set,preview:null,media:null,viewMode:`code`},cp.set(e,t)),t};function up(e){let t=lp(e.agentId),[n,r]=v(new Map),[i,a]=v(t.expanded),[o,s]=v(t.preview),c=e=>{t.preview=e,s(e)},l=e=>{t.expanded=e,a(e)},[u,d]=v(t.media),f=e=>{t.media=e,d(e)},[p,m]=v(t.viewMode),h=e=>{t.viewMode=e,m(e)},[g,_]=v(``),[x,S]=v(localStorage.getItem(`teapot.ignoreMode`)??`dim`),ee=()=>{let e=[`dim`,`hide`,`show`],t=e[(e.indexOf(x())+1)%3];S(t),localStorage.setItem(`teapot.ignoreMode`,t)},te=e=>x()!==`hide`||!e.ignored,[ne,w]=v(localStorage.getItem(`teapot.showHidden`)===`1`),re=()=>{let e=!ne(),t=[``,...i()];Promise.all(t.map(async t=>({p:t,rows:await D(t,e)}))).then(t=>{w(e),localStorage.setItem(`teapot.showHidden`,e?`1`:`0`);for(let{p:e,rows:n}of t)n&&ie(e,n)})},T=(e,t)=>t.map(t=>({name:String(t.name),path:e?`${e}/${t.name}`:String(t.name),dir:!!t.dir,...typeof t.size==`number`?{size:t.size}:{},...t.ignored?{ignored:!0}:{}}));async function E(e){return D(e,ne())}async function D(t,n){try{let r=new URLSearchParams;t&&r.set(`path`,t),n&&r.set(`hidden`,`1`);let i=await $(`/api/agents/${e.agentId}/tree?${r.toString()}`);return T(t,i.entries??[])}catch(e){return _(e.message),null}}let ie=(e,n)=>r(r=>{let i=r.get(e);if(!i)return new Map(r).set(e,n);let a=i.map(e=>{let t=n.find(t=>t.path===e.path);return t&&t.dir===e.dir&&t.size===e.size&&t.ignored===e.ignored&&t.name===e.name?e:t??e});for(let e of n)i.some(t=>t.path===e.path)||a.push(e);let o=a.filter(e=>n.some(t=>t.path===e.path)||t.preview?.path===e.path),s=new Map(r);return s.set(e,o),s}),O=``;b(()=>{let t=e.agentId;t!==O&&(O=t,l(new Set),c(null),f(null),r(new Map),E(``).then(e=>{e&&O===t&&r(new Map([[``,e]]))}))});let ae=async e=>{let t=new Set(i());if(t.has(e.path)){t.delete(e.path),l(t);return}if(t.add(e.path),l(t),!n().has(e.path)){let t=await E(e.path);t&&ie(e.path,t)}},[oe,se]=v(``),[ce,le]=v(!1),[k,ue]=v(``),[A,de]=v(!1),fe=e=>/\.(md|markdown|mdx)$/i.test(e),pe=0,me=async e=>{let t=++pe;se(``),le(!0);try{let{highlightChunks:n}=await Ic(async()=>{let{highlightChunks:e}=await import(`./shiki-CDxIkmYs.js`);return{highlightChunks:e}},[]);for await(let r of n(e.path,e.content)){if(pe!==t)return;se(e=>e+r)}}catch{pe===t&&se(``)}finally{pe===t&&le(!1)}};C(()=>{pe++});let he=async(t,n)=>{let r=sp(t.path);if(r){c({path:t.path,content:``,binary:!0}),f({path:t.path,kind:r}),h(`media`);return}try{let r=await $(`/api/agents/${e.agentId}/file?path=${encodeURIComponent(t.path)}`);f(null),c({path:t.path,content:r.content??``,binary:r.binary,truncated:r.truncated}),ue(r.content??``),h(r.binary?`code`:n),!r.binary&&n!==`md`&&me({path:t.path,content:r.content??``,truncated:r.truncated})}catch(e){Q(`open failed: ${e.message}`)}},ge=async()=>{let t=o();if(!(!t||A())){de(!0);try{await $(`/api/agents/${e.agentId}/file?path=${encodeURIComponent(t.path)}`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({content:k(),baseContent:t.content})}),c({...t,content:k()}),Q(`saved ${t.path}`)}catch(e){let n=e.payload,r=n&&typeof n==`object`&&n.error===`file changed on disk`?n:null;r?.current===void 0?Q(`save failed: ${e.message}`):confirm(`This file changed on disk since you opened it.
|
|
27
|
+
`)[0]??``,140),null),R(e,()=>n.data?.ok===!1?` · FAILED`:``,null),e})():nd()];break}case`list_dir`:s=u(`path`)||`.`,l=m(4e3);break;case`read_url`:{let e=u(`url`);try{let t=new URL(e);e=t.host+t.pathname}catch{}s=Qf(e,70),c=`web`,l=[(()=>{var e=qu();return R(e,j(N,{get when(){return/^https?:/i.test(u(`url`))},get fallback(){return(()=>{var e=id();return R(e,()=>Qf(u(`url`),80)),e})()},get children(){var e=rd();return y(()=>I(e,`href`,u(`url`))),e}})),e})(),P(()=>m(3e3))];break}case`bash_output`:{let e=u(`action`)||`read`;s=`bash_output ${u(`job_id`)||`(?)`}`,c=e,l=m(4e3);break}case`load_skill`:{s=`skill: ${u(`name`)}`;let e=o().replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,``);l=n?[(()=>{var t=Xc();return y(()=>t.innerHTML=Ie(e)),t})(),(()=>{var e=Hu(),t=e.firstChild;return R(e,()=>n.data?.durationMs,t),e})()]:ad();break}case`save_skill`:{s=`skill: ${u(`name`)}`,c=Qf(u(`description`),60);let e=Array.isArray(i.args?.files)?i.args.files.map(e=>e?.name).filter(Boolean):[];l=[P(()=>P(()=>!!e.length)()?(()=>{var t=od();return t.firstChild,R(t,()=>e.join(`, `),null),t})():null),n?(()=>{var e=Zu(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,R(e,()=>Qf(o(),160),t),R(e,()=>n.data?.durationMs,r),e})():sd()];break}}}catch{}return(()=>{var i=ld(),u=i.firstChild,p=u.firstChild;p.firstChild;var m=p.nextSibling,h=m.nextSibling;return i.addEventListener(`toggle`,t=>{t.target.open&&e.onResize?.()}),I(i,`title`,`${a}${c?` — `+c:``}`),R(p,s,null),R(u,j(N,{get when(){return t.data?.actor},get children(){var e=cd();return e.firstChild,R(e,()=>String(t.data.actor),null),e}}),m),R(m,()=>n?c||``:r?`(result missed)`:a===`bash`||f()?j(Vf,{get startedAt(){return t.ts},inline:!0,get timeoutMs(){return f()}}):`running…`),R(h,j(ep,{get text(){return d()},label:`⧉ cmd`,title:`copy the ${a} arguments`}),null),R(h,j(N,{when:n,get children(){return j(ep,{get text(){return o()},label:`⧉ out`,title:`copy this tool's full output`})}}),null),R(i,l,null),y(()=>L(i,`embed`+(n?n.data?.ok===!1?` fail`:` done`:r?` done`:` running`))),i})()}function Wf(e){let t=e.data??{};return e.type===`prompt`?String(t.text??``):e.type===`message`?`${typeof t.reasoning==`string`&&t.reasoning.trim()?`<reasoning>\n${t.reasoning}\n</reasoning>\n\n`:``}${String(t.content??``)}`:(e.type,``)}function Gf(e){let t=e.e,n=Pf(t),r=e=>{let t=e.data??{};return e.data?.actor?`sub:${String(e.data.actor)}`:e.type===`tool_call`||e.type===`tool_result`?`agent-tools`:e.type===`prompt`?`src:${String(t.source??`user`)}`:`type:${e.type}`},i=e.prev&&r(e.prev)===r(t)&&Pf(e.prev).name===n.name&&t.session===e.prev.session&&t.branch===e.prev.branch;if(t.type===`fork`){let e=t.data??{};return(()=>{var n=ud(),r=n.firstChild.nextSibling;return r.nextSibling,R(n,()=>String(e.fromBranch??`?`),r),R(n,()=>String(e.newBranch??t.branch),null),n})()}if(t.type===`goal`){let e=t.data??{},n=e.event===`status`?`marked ${String(e.status??``)}`:Qf(String(e.text??``),80);return(()=>{var t=dd(),r=t.firstChild.nextSibling;return r.nextSibling,R(t,()=>String(e.event??``),r),R(t,n,null),t})()}if(t.type===`todo`)return(()=>{var e=fd(),n=e.firstChild.nextSibling;return n.nextSibling,R(e,()=>String(t.data?.by??`human`),n),e})();if(t.type===`state`)return t.data.from===t.data.to?null:(()=>{var e=pd(),n=e.firstChild;return R(e,()=>t.data.from,n),R(e,()=>t.data.to,null),R(e,(()=>{var e=P(()=>!!t.data.reason);return()=>e()?` — ${t.data.reason}`:``})(),null),y(()=>L(e,`divider-msg`+(t.data.to===`error`?` err`:``))),e})();if(t.type===`system_note`){let e=String(t.data?.event??``);if(e===`runaway-detected`)return(()=>{var e=md(),n=e.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling;i.nextSibling;var a=n.nextSibling,o=a.firstChild.nextSibling;return o.nextSibling,R(n,()=>String(t.data?.failures),r),R(n,()=>String(t.data?.limit),i),R(a,()=>String(t.data?.lastTool),o),R(a,()=>String(t.data?.lastError??``).slice(0,200),null),y(()=>I(e,`title`,`${t.data?.failures} consecutive tool failures hit the configured limit (${t.data?.limit})`)),e})();if(e===`error-retry`)return(()=>{var e=hd(),n=e.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling;return i.nextSibling,R(n,()=>String(t.data?.attempt),r),R(n,()=>Math.round(Number(t.data?.waitMs)/1e3),i),e})();if(e===`background-exit`){let e=t.data?.failed===!0,n=Math.round(Number(t.data?.durationMs??0)/1e3);return(()=>{var r=ed();return L(r,`divider-msg`+(e?` err`:``)),R(r,()=>(e?`⚠ background job `:`✓ background job `)+String(t.data?.jobId??`?`)+` `+(e?`FAILED (exit ${String(t.data?.code??`?`)})`:`finished (${n}s)`)),y(()=>I(r,`title`,String(t.data?.cmd??``))),r})()}return e===`context-compacted`?(()=>{var e=gd(),n=e.firstChild.nextSibling,r=n.nextSibling.nextSibling,i=r.nextSibling.nextSibling;return i.nextSibling,R(e,()=>String(t.data?.tokensBefore??`?`),n),R(e,()=>String(t.data?.tokensAfter??`?`),r),R(e,()=>String(t.data?.mode??``),i),e})():null}return(()=>{var r=bd(),a=r.firstChild,o=a.nextSibling;return L(a,`avatar avghost`+(i?` ghosted`:``)),R(a,()=>i?``:n.icon),R(o,i&&(()=>{var e=xd();return y(()=>I(e,`title`,`${Lf(t.ts)} · ${t.branch}`)),e})(),null),R(o,j(N,{when:!i,get children(){var r=yd(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling;return R(i,()=>n.name),R(r,j(N,{get when(){return t.data?.actor},get children(){var e=cd();return e.firstChild,R(e,()=>String(t.data.actor),null),e}}),a),R(a,(()=>{var e=P(()=>!!t.data?.pending);return()=>e()?`queued…`:Lf(t.ts)})()),R(o,()=>t.branch),R(r,j(N,{get when(){return e.onCancel},get children(){var t=_d();return t.$$click=t=>{t.stopPropagation(),e.onCancel()},t}}),null),R(r,j(N,{get when(){return t.type!==`tool_call`},get children(){return j(ep,{get text(){return Wf(t)},label:`⧉ copy`,title:`copy the RAW text of this message (no markdown rendering)`})}}),null),R(r,j(N,{get when(){return e.onEdit},get children(){var t=vd();return t.$$click=t=>{t.stopPropagation(),e.onEdit()},t}}),null),y(e=>De(i,`color`,n.color)),r}}),null),R(o,j(qf,{e:t,get res(){return e.res},get onOption(){return e.onOption},get answeredIds(){return e.answeredIds},get agentActive(){return e.agentActive},get onResize(){return e.onResize}}),null),y(e=>{var o=`msg`+(i?` grouped`:``)+(t.data?.pending?` pending`:``),s=t.id,c=i?`transparent`:n.color+`33`,l=i?`1px solid transparent`:`1px solid ${n.color}66`,u=i?`${Lf(t.ts)} · ${t.branch}`:void 0;return o!==e.e&&L(r,e.e=o),s!==e.t&&I(r,`data-eid`,e.t=s),c!==e.a&&De(a,`background`,e.a=c),l!==e.o&&De(a,`border`,e.o=l),u!==e.i&&I(a,`title`,e.i=u),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),r})()}function Kf(e){let[t,n]=v(``),r=()=>{let r=t().trim();!r||e.answered||(n(``),e.onOption?.(r))};return(()=>{var i=Sd(),a=i.firstChild,o=a.nextSibling;return a.$$keydown=e=>{e.key===`Enter`&&(e.preventDefault(),r())},a.$$input=e=>n(e.currentTarget.value),o.$$click=r,y(n=>{var r=e.answered?`answered`:`or type your own answer…`,i=e.answered,s=e.answered||!t().trim();return r!==n.e&&I(a,`placeholder`,n.e=r),i!==n.t&&(a.disabled=n.t=i),s!==n.a&&(o.disabled=n.a=s),n},{e:void 0,t:void 0,a:void 0}),y(()=>a.value=t()),i})()}function qf(e){let t=e.e;switch(t.type){case`prompt`:{let e=t.data?.images??[];return[(()=>{var e=Xc();return y(()=>e.innerHTML=Ef(String(t.data.text??``))),e})(),j(N,{get when(){return e.length},get children(){var t=Cd();return R(t,j(M,{each:e,children:e=>(()=>{var t=wd();return I(t,`src`,e),t})()})),t}})]}case`message`:return[j(N,{get when(){return P(()=>typeof t.data.reasoning==`string`)()&&t.data.reasoning.trim()},get children(){var e=Td(),n=e.firstChild;n.firstChild;var r=n.nextSibling;return R(n,(()=>{var e=P(()=>String(t.data.reasoning).length>4e3);return()=>e()?` (${Xf(String(t.data.reasoning).length)} — truncated)`:``})(),null),R(r,()=>Jf(String(t.data.reasoning),8e3)),e}}),(()=>{var e=Xc();return y(()=>e.innerHTML=Ef(String(t.data.content??``))),e})(),j(N,{get when(){return t.data.interrupted},get children(){return Ed()}}),j(N,{get when(){return t.data.final},get children(){var e=Dd(),n=e.firstChild;return R(e,j(ep,{get text(){return String(t.data.content??``)}}),n),e}})];case`tool_call`:return j(Uf,{e:t,get res(){return e.res},get agentActive(){return e.agentActive},get onResize(){return e.onResize}});case`tool_result`:{let e=String(t.data.result);return(()=>{var n=Od(),r=n.firstChild,i=r.firstChild,a=r.nextSibling,o=a.nextSibling,s=o.firstChild;return R(i,()=>Qf(e,120)),R(r,j(ep,{text:e}),null),R(a,()=>Jf(e,4e3)),R(o,()=>t.data.durationMs,s),R(o,()=>t.data.ok?``:` · FAILED`,null),y(()=>L(n,`embed`+(t.data.ok?``:` fail`))),n})()}case`decision`:{let e=Array.isArray(t.data?.alternatives)?t.data.alternatives:[];return(()=>{var n=Ad(),r=n.firstChild,i=r.firstChild.firstChild.nextSibling,a=r.nextSibling;return R(n,j(N,{get when(){return e.length},get children(){var t=kd();return t.firstChild,R(t,()=>e.join(` / `),null),t}}),null),y(e=>{var n=Ef(String(t.data?.decision??``)),r=Ef(String(t.data?.rationale??``));return n!==e.e&&(i.innerHTML=e.e=n),r!==e.t&&(a.innerHTML=e.t=r),e},{e:void 0,t:void 0}),n})()}case`question`:{let n=Array.isArray(t.data?.options)?t.data.options:[],r=t.data?.callId?String(t.data.callId):``,i=e.answeredIds?.has(r)??!1;return(()=>{var r=Nd(),a=r.firstChild.firstChild.nextSibling;return L(r,`embed question`+(i?` answered`:``)),R(r,j(N,{when:i,get children(){return jd()}}),null),R(r,j(N,{get when(){return n.length>0},get children(){var r=Md();return R(r,j(M,{each:n,children:n=>(()=>{var r=Pd();return r.$$click=()=>{let r=t.data?.actor;r?$(`/api/agents/${encodeURIComponent(String(r))}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:n,start:!0})}).then(()=>Q(`→ answered @${String(t.data.actor)}`)).catch(()=>Q(`answer failed`)):e.onOption?.(n)},r.disabled=i,R(r,n),r})()})),r}}),null),R(r,j(Kf,{answered:i,get onOption(){return e.onOption}}),null),y(()=>a.innerHTML=Ef(String(t.data?.question??``))),r})()}case`progress`:return(()=>{var e=Fd(),n=e.firstChild.firstChild.nextSibling;return R(e,j(N,{get when(){return t.data.goalStatus},get children(){var e=bu(),n=e.firstChild.nextSibling;return R(n,()=>String(t.data.goalStatus)),e}}),null),R(e,j(N,{get when(){return t.data.recent},get children(){var e=_u(),n=e.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(String(t.data.recent))),e}}),null),R(e,j(N,{get when(){return t.data.problems},get children(){var e=vu(),n=e.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(String(t.data.problems))),e}}),null),R(e,j(N,{get when(){return t.data.next},get children(){var e=yu(),n=e.firstChild.nextSibling;return y(()=>n.innerHTML=Ef(String(t.data.next))),e}}),null),y(()=>n.innerHTML=Ef(String(t.data.doing??``))),e})();case`error`:return(()=>{var e=Id(),n=e.firstChild;return n.firstChild,R(n,()=>String(t.data.message??``),null),e})();case`compaction`:return(()=>{var e=Rd(),n=e.firstChild.firstChild.nextSibling,r=n.firstChild,i=r.nextSibling,a=i.nextSibling.nextSibling;return a.nextSibling,R(n,()=>String(t.data.mode??``),r),R(n,()=>Xf(Number(t.data.tokensBefore??0)),i),R(n,()=>Xf(Number(t.data.tokensAfter??0)),a),R(n,(()=>{var e=P(()=>!!t.data.summarized);return()=>e()?`${t.data.summarized} summarized`:`${t.data.dropped} dropped`})(),null),R(e,j(N,{get when(){return t.data.summary},get children(){return[Ld(),(()=>{var e=Xc();return y(()=>e.innerHTML=Ef(String(t.data.summary))),e})()]}}),null),e})();default:return(()=>{var e=zd();return R(e,()=>Jf(JSON.stringify(t.data),200)),e})()}}function Jf(e,t){return e.length>t?e.slice(0,t)+` …`:e}function Yf(e){let t=new Date(e).getTime()-Date.now(),n=Math.abs(t),r=n<9e4?`${Math.round(n/1e3)}s`:n<54e5?`${Math.round(n/6e4)}m`:`${(n/36e5).toFixed(1)}h`;return t>=0?`in ${r}`:`${r} ago`}function Xf(e){return e>=1e9?`${+(e/1e9).toFixed(1)}b`:e>=1e6?`${+(e/1e6).toFixed(1)}m`:e>=1e4?`${Math.round(e/1e3)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Zf(e){return e>=100?Math.round(e).toLocaleString():e>=10?e.toFixed(1):e>=1?e.toFixed(2):e>=.01?e.toFixed(3):e.toFixed(4)}function Qf(e,t){return Jf(e.replace(/\s+/g,` `).trim(),t)}function $f(e){return(()=>{var t=Bd(),n=t.firstChild;return Te(t,`click`,e.onClick,!0),R(n,()=>e.icon),y(n=>{var r=`iconbtn`+(e.active?` active`:``)+(e.class?` `+e.class:``),i=e.title,a=e.style;return r!==n.e&&L(t,n.e=r),i!==n.t&&I(t,`title`,n.t=i),n.a=Ee(t,a,n.a),n},{e:void 0,t:void 0,a:void 0}),t})()}function ep(e){let[t,n]=v(!1),[r,i]=v(!1),a=t=>{t.preventDefault(),t.stopPropagation();let r=e.text??``;if(!r){i(!0),setTimeout(()=>i(!1),1200);return}navigator.clipboard.writeText(r).then(()=>{n(!0),setTimeout(()=>n(!1),900)}).catch(()=>{try{let e=document.createElement(`textarea`);e.value=r,e.style.position=`fixed`,e.style.opacity=`0`,document.body.appendChild(e),e.select(),document.execCommand(`copy`),e.remove(),n(!0),setTimeout(()=>n(!1),900)}catch{i(!0),setTimeout(()=>i(!1),1200)}})};return(()=>{var n=Vd();return n.$$click=a,R(n,(()=>{var n=P(()=>!!t());return()=>n()?`✓`:P(()=>!!r())()?`✗`:e.label??`⧉`})()),y(()=>I(n,`title`,e.title??`copy to clipboard`)),n})()}function tp(e){return(()=>{var t=Hd(),n=t.firstChild,r=n.firstChild.firstChild,i=r.nextSibling;return t.$$click=t=>t.target===t.currentTarget&&e.onClose(),R(r,()=>e.title),Te(i,`click`,e.onClose,!0),R(n,()=>e.children,null),t})()}function np(e){let[t,n]=v(`~`),[r,i]=v([]),[a,o]=v(``),[s,c]=v(e.providers[0]??``),[l,u]=v(``),[d,f]=v(``);async function p(e){let r=await $(`/api/fs?path=${encodeURIComponent(e??t())}`);n(r.path),h(r.parent??``),i(r.entries??[])}ee(()=>p(t()));let[m,h]=v(``),g=async n=>{n.preventDefault(),f(``);try{let n=await $(`/api/agents`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({workspace:t(),id:a(),provider:s()||void 0,model:l()||void 0,start:!1})});e.onCreated(n.agent.id)}catch(e){f(String(e.message))}};return j(tp,{title:`new agent`,get onClose(){return e.onClose},get children(){var i=Wd(),f=i.firstChild,h=f.firstChild.nextSibling.firstChild,_=h.nextSibling,v=_.nextSibling,b=f.nextSibling,x=b.nextSibling,S=x.firstChild,ee=S.firstChild.nextSibling,C=S.nextSibling,te=C.firstChild.nextSibling,ne=C.nextSibling.firstChild.nextSibling,w=x.nextSibling;return i.addEventListener(`submit`,g),h.$$input=e=>n(e.currentTarget.value),_.$$click=()=>p(t()),v.$$click=()=>m()?p(m()):p(`..`),R(b,j(M,{get each(){return r()},children:e=>(()=>{var n=Gd();return n.firstChild,n.$$click=()=>p(`${t()}/${e}`.replace(/\/+/g,`/`)),R(n,e,null),n})()})),ee.$$input=e=>o(e.currentTarget.value),te.addEventListener(`change`,e=>c(e.currentTarget.value)),R(te,j(M,{get each(){return e.providers},children:e=>(()=>{var t=eu();return R(t,e),t})()})),ne.$$input=e=>u(e.currentTarget.value),R(i,j(N,{get when(){return d()},get children(){var e=Ud();return R(e,d),e}}),w),y(()=>h.value=t()),y(()=>ee.value=a()),y(()=>te.value=s()),y(()=>ne.value=l()),i}})}var rp=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`svg`,`bmp`,`ico`,`avif`]),ip=new Set([`mp4`,`webm`,`mov`,`mkv`,`avi`,`m4v`]),ap=new Set([`mp3`,`wav`,`ogg`,`m4a`,`flac`,`aac`,`opus`]);function op(e){let t=e.split(`.`).pop()?.toLowerCase()??``,n=sp(e);return n===`image`?`🖼`:n===`video`?`🎬`:n===`audio`?`🎵`:[`ts`,`tsx`,`mts`,`cts`].includes(t)?`🟦`:[`js`,`mjs`,`cjs`,`jsx`].includes(t)?`🟨`:t===`json`||t===`jsonc`?`🧾`:t===`md`||t===`mdx`||t===`markdown`?`📝`:t===`css`||t===`scss`||t===`less`?`🎨`:t===`html`||t===`htm`||t===`svg`?`🌐`:[`py`,`pyi`].includes(t)?`🐍`:t===`rs`?`🦀`:t===`go`?`🐹`:t===`java`||t===`kt`||t===`kts`?`☕`:t===`rb`?`💎`:t===`php`?`🐘`:t===`c`||t===`h`||t===`cpp`||t===`hpp`||t===`cc`?`🧩`:t===`sh`||t===`bash`||t===`zsh`||t===`fish`?`🐚`:t===`sql`?`🗄`:t===`yml`||t===`yaml`||t===`toml`||t===`ini`||t===`conf`?`⚙`:t===`lock`?`🔒`:e===`Dockerfile`||t===`dockerfile`?`🐳`:t===`zip`||t===`gz`||t===`tar`||t===`tgz`||t===`bz2`?`📦`:t===`pdf`?`📕`:t===`txt`||t===`log`?`📄`:`·`}function sp(e){let t=e.split(`.`).pop()?.toLowerCase()??``;return rp.has(t)?`image`:ip.has(t)?`video`:ap.has(t)?`audio`:null}var cp=new Map,lp=e=>{let t=cp.get(e);return t||(t={expanded:new Set,preview:null,media:null,viewMode:`code`},cp.set(e,t)),t};function up(e){let t=lp(e.agentId),[n,r]=v(new Map),[i,a]=v(t.expanded),[o,s]=v(t.preview),c=e=>{t.preview=e,s(e)},l=e=>{t.expanded=e,a(e)},[u,d]=v(t.media),f=e=>{t.media=e,d(e)},[p,m]=v(t.viewMode),h=e=>{t.viewMode=e,m(e)},[g,_]=v(``),[x,S]=v(localStorage.getItem(`teapot.ignoreMode`)??`dim`),ee=()=>{let e=[`dim`,`hide`,`show`],t=e[(e.indexOf(x())+1)%3];S(t),localStorage.setItem(`teapot.ignoreMode`,t)},te=e=>x()!==`hide`||!e.ignored,[ne,w]=v(localStorage.getItem(`teapot.showHidden`)===`1`),re=()=>{let e=!ne(),t=[``,...i()];Promise.all(t.map(async t=>({p:t,rows:await D(t,e)}))).then(t=>{w(e),localStorage.setItem(`teapot.showHidden`,e?`1`:`0`);for(let{p:e,rows:n}of t)n&&ie(e,n)})},T=(e,t)=>t.map(t=>({name:String(t.name),path:e?`${e}/${t.name}`:String(t.name),dir:!!t.dir,...typeof t.size==`number`?{size:t.size}:{},...t.ignored?{ignored:!0}:{}}));async function E(e){return D(e,ne())}async function D(t,n){try{let r=new URLSearchParams;t&&r.set(`path`,t),n&&r.set(`hidden`,`1`);let i=await $(`/api/agents/${e.agentId}/tree?${r.toString()}`);return T(t,i.entries??[])}catch(e){return _(e.message),null}}let ie=(e,n)=>r(r=>{let i=r.get(e);if(!i)return new Map(r).set(e,n);let a=i.map(e=>{let t=n.find(t=>t.path===e.path);return t&&t.dir===e.dir&&t.size===e.size&&t.ignored===e.ignored&&t.name===e.name?e:t??e});for(let e of n)i.some(t=>t.path===e.path)||a.push(e);let o=a.filter(e=>n.some(t=>t.path===e.path)||t.preview?.path===e.path),s=new Map(r);return s.set(e,o),s}),O=``;b(()=>{let t=e.agentId;t!==O&&(O=t,l(new Set),c(null),f(null),r(new Map),E(``).then(e=>{e&&O===t&&r(new Map([[``,e]]))}))});let ae=async e=>{let t=new Set(i());if(t.has(e.path)){t.delete(e.path),l(t);return}if(t.add(e.path),l(t),!n().has(e.path)){let t=await E(e.path);t&&ie(e.path,t)}},[oe,se]=v(``),[ce,le]=v(!1),[k,ue]=v(``),[A,de]=v(!1),fe=e=>/\.(md|markdown|mdx)$/i.test(e),pe=0,me=async e=>{let t=++pe;se(``),le(!0);try{let{highlightChunks:n}=await Ic(async()=>{let{highlightChunks:e}=await import(`./shiki-B-DhHuic.js`);return{highlightChunks:e}},[]);for await(let r of n(e.path,e.content)){if(pe!==t)return;se(e=>e+r)}}catch{pe===t&&se(``)}finally{pe===t&&le(!1)}};C(()=>{pe++});let he=async(t,n)=>{let r=sp(t.path);if(r){c({path:t.path,content:``,binary:!0}),f({path:t.path,kind:r}),h(`media`);return}try{let r=await $(`/api/agents/${e.agentId}/file?path=${encodeURIComponent(t.path)}`);f(null),c({path:t.path,content:r.content??``,binary:r.binary,truncated:r.truncated}),ue(r.content??``),h(r.binary?`code`:n),!r.binary&&n!==`md`&&me({path:t.path,content:r.content??``,truncated:r.truncated})}catch(e){Q(`open failed: ${e.message}`)}},ge=async()=>{let t=o();if(!(!t||A())){de(!0);try{await $(`/api/agents/${e.agentId}/file?path=${encodeURIComponent(t.path)}`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({content:k(),baseContent:t.content})}),c({...t,content:k()}),Q(`saved ${t.path}`)}catch(e){let n=e.payload,r=n&&typeof n==`object`&&n.error===`file changed on disk`?n:null;r?.current===void 0?Q(`save failed: ${e.message}`):confirm(`This file changed on disk since you opened it.
|
|
28
28
|
OK = load the disk version into the editor (your edits are discarded)
|
|
29
|
-
Cancel = keep editing your copy`)?(ue(r.current),c({...t,content:r.current}),Q(`loaded the current file from disk`)):Q(`kept your edits — use Save As via bash to force-write`)}finally{de(!1)}}},_e=e=>!e.binary&&!e.truncated,ve=(e,t)=>[(()=>{var n=qd(),r=n.firstChild,a=r.nextSibling;return n.$$click=()=>e.dir?void ae(e):void he(e,`code`),R(r,(()=>{var t=P(()=>!!e.dir);return()=>t()?i().has(e.path)?`▾`:`▸`:op(e.name)})()),R(a,()=>e.name),R(n,j(N,{get when(){return P(()=>!e.dir)()&&e.size!==void 0},get children(){var t=Kd();return R(t,()=>Xf(e.size)),t}}),null),y(r=>{var i=`filerow`+(e.dir?` isdir`:``)+(e.ignored&&x()===`dim`?` gitignored`:``),a=`padding-left:${t*13+8}px`,o=e.dir?`browse ${e.path}`:`preview ${e.path}`;return i!==r.e&&L(n,r.e=i),r.t=Ee(n,a,r.t),o!==r.a&&I(n,`title`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),n})(),j(N,{get when(){return P(()=>!!e.dir)()&&i().has(e.path)},get children(){return j(M,{get each(){return(n().get(e.path)??[]).filter(te)},children:e=>ve(e,t+1)})}})],ye=()=>e.workspace.split(`/`).filter(Boolean).pop()??e.workspace,[be,xe]=v(!1),Se=async()=>{if(!be()){xe(!0);try{let e=[``,...i()],t=await Promise.all(e.map(async e=>({p:e,rows:await D(e,ne())})));for(let{p:e,rows:n}of t)n&&ie(e,n)}finally{xe(!1)}}};return[(()=>{var e=Jd(),t=e.firstChild.nextSibling;return t.firstChild,R(t,ye,null),R(e,j($f,{class:`filetoggle`,get icon(){return be()?`…`:`⟳`},title:`refresh the tree (root + expanded folders) — open popups are kept`,onClick:()=>void Se()}),null),R(e,j($f,{class:`filetoggle`,style:`margin-left:auto`,get icon(){return P(()=>x()===`hide`)()?`🙈`:x()===`dim`?`👁`:`✨`},get title(){return`gitignored files: ${x()} — click to cycle (dim → hidden → shown)`},onClick:ee}),null),R(e,j($f,{class:`filetoggle`,get icon(){return ne()?`◉.`:`○.`},get title(){return ne()?`dotfiles shown — click to hide`:`dotfiles hidden — click to show`},onClick:re}),null),e})(),(()=>{var e=Yd();return R(e,j(N,{get when(){return(n().get(``)??[]).length>0},get fallback(){return(()=>{var e=Xd();return R(e,()=>g()||`empty workspace`),e})()},get children(){return j(M,{get each(){return(n().get(``)??[]).filter(te)},children:e=>ve(e,0)})}})),e})(),j(N,{get when(){return o()},children:t=>j(tp,{get title(){return`🗂 ${t().path}`},onClose:()=>{pe++,c(null),f(null)},get children(){return j(N,{get when(){return u()},get fallback(){return[(()=>{var e=tf(),n=e.firstChild;return R(e,j(N,{get when(){return P(()=>!!fe(t().path))()&&!t().binary},get children(){var e=$d();return e.$$click=()=>h(`md`),y(()=>L(e,p()===`md`?`on`:``)),e}}),n),n.$$click=()=>{h(`code`),oe()||me({path:t().path,content:t().content,truncated:t().truncated})},R(e,j(N,{get when(){return _e(t())},get children(){var e=ef();return e.$$click=()=>h(`edit`),y(()=>L(e,p()===`edit`?`on`:``)),e}}),null),y(()=>L(n,p()===`code`?`on`:``)),e})(),j(N,{get when(){return!t().binary},get fallback(){return rf()},get children(){return j(N,{get when(){return p()===`edit`},get fallback(){return j(N,{get when(){return P(()=>p()===`md`)()&&fe(t().path)},get fallback(){return j(dp,{get path(){return t().path},get content(){return t().content},get html(){return oe()},get pending(){return ce()},get truncated(){return!!t().truncated}})},get children(){var e=af();return y(()=>e.innerHTML=Ie(t().content)),e}})},get children(){var e=nf(),n=e.firstChild,r=n.nextSibling.firstChild,i=r.firstChild,a=r.nextSibling;return n.$$input=e=>ue(e.currentTarget.value),I(n,`spellcheck`,!1),R(r,()=>Xf(k().length),i),a.$$click=()=>void ge(),R(a,()=>A()?`saving…`:`💾 save`),y(()=>a.disabled=A()||k()===t().content),y(()=>n.value=k()),e}})}})]},get children(){var t=Qd(),n=t.firstChild,r=n.firstChild;return R(t,j(N,{get when(){return u().kind===`image`},get fallback(){return j(N,{get when(){return u().kind===`video`},get fallback(){return(()=>{var t=sf();return y(()=>I(t,`src`,`/api/agents/${e.agentId}/raw?path=${encodeURIComponent(u().path)}`)),t})()},get children(){var t=of();return y(()=>I(t,`src`,`/api/agents/${e.agentId}/raw?path=${encodeURIComponent(u().path)}`)),t}})},get children(){var t=Zd();return y(n=>{var r=`/api/agents/${e.agentId}/raw?path=${encodeURIComponent(u().path)}`,i=u().path.split(`/`).pop();return r!==n.e&&I(t,`src`,n.e=r),i!==n.t&&I(t,`alt`,n.t=i),n},{e:void 0,t:void 0}),t}}),n),R(n,()=>u().kind,r),t}})}})})]}function dp(e){return[j(N,{get when(){return e.html},get fallback(){return P(()=>!!e.pending)()?(()=>{var t=uf(),n=t.firstChild.nextSibling;return n.nextSibling,R(t,()=>e.path.split(`/`).pop(),n),t})():(()=>{var t=df();return R(t,()=>e.content),t})()},get children(){var t=cf();return y(()=>t.innerHTML=e.html),t}}),j(N,{get when(){return e.truncated},get children(){return lf()}})]}var fp=[{key:`openrouter`,label:`OpenRouter`,url:`https://openrouter.ai/api/v1`,model:`anthropic/claude-sonnet-4`,hint:`400+ models behind one key — teapot sends app-attribution headers automatically`},{key:`orcarouter`,label:`OrcaRouter`,url:`https://api.orcarouter.ai/v1`,model:`orcarouter/auto`,hint:`zero-markup routing gateway — 'orcarouter/auto' grades each prompt and picks the model`},{key:`openai`,label:`OpenAI`,url:`https://api.openai.com/v1`,model:`gpt-4o-mini`},{key:`llamacpp`,label:`llama.cpp server`,url:`http://localhost:8080/v1`,model:``,hint:`free & local — start it with: llama-server -m ./model.gguf (any model name works)`}],pp={key:`custom`,label:`Custom`,url:``,model:``,hint:`any OpenAI-compatible /v1 endpoint — vLLM, LM Studio, llama.cpp, a company gateway… fill the fields below`};function mp(e){let[t,n]=v(fp[0]),[r,i]=v(fp[0].url),[a,o]=v(``),[s,c]=v(fp[0].model),[l,u]=v([]),[d,f]=v(`~/teapot-workspace`),[p,m]=v(``),[h,g]=v(!1),[_,x]=v(``),S=e=>{n(e),e.key!==`custom`&&e.url&&(i(e.url),e.model&&c(e.model))};b(()=>{let e=r().trim(),t=a();if(!/^https?:\/\//.test(e)){u([]);return}let n=setTimeout(async()=>{try{let n=await $(`/api/setup/models?baseUrl=${encodeURIComponent(e)}${t?`&apiKey=${encodeURIComponent(t)}`:``}`);u(n.models??[])}catch{u([])}},600);C(()=>clearTimeout(n))});let ee=e=>{let t=l().find(t=>t.id===e.trim());if(!t)return``;let n=[];t.contextLength&&n.push(`ctx ${Xf(t.contextLength)} tok`);let r=e=>e===void 0?``:`$${e*1e6>=10?Math.round(e*1e6):+(e*1e6).toFixed(1)}/M`;if(t.pricing){let e=r(t.pricing.prompt),i=r(t.pricing.completion);e&&i?n.push(`${e} in · ${i} out`):(e||i)&&n.push(r(t.pricing.prompt??t.pricing.completion))}return n.join(` · `)},te=()=>ee(s()),ne=async t=>{t.preventDefault(),x(``),g(!0);try{await $(`/api/setup`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({baseUrl:r(),apiKey:a()||void 0,model:s(),workspace:d(),...p()?{password:p()}:{}})}),e.onDone()}catch(e){x(e.message),g(!1)}};return(()=>{var e=hf(),n=e.firstChild.firstChild.nextSibling.nextSibling,u=n.firstChild,g=u.nextSibling,v=g.firstChild.nextSibling,b=v.nextSibling,x=g.nextSibling,ee=x.firstChild.nextSibling,C=x.nextSibling,w=C.firstChild.nextSibling,re=w.nextSibling,T=C.nextSibling,E=T.firstChild.nextSibling,D=E.firstChild.nextSibling,ie=E.nextSibling.firstChild.nextSibling,O=T.nextSibling;return n.addEventListener(`submit`,ne),R(u,()=>[...fp,pp].map(e=>(()=>{var n=gf();return n.$$click=()=>S(e),R(n,()=>e.label),y(r=>{var i=`presetbtn`+(t().key===e.key?` active`:``),a=e.hint||e.url;return i!==r.e&&L(n,r.e=i),a!==r.t&&I(n,`title`,r.t=a),r},{e:void 0,t:void 0}),n})())),R(n,j(N,{get when(){return t().hint},get children(){var e=ff();return R(e,()=>t().hint),e}}),g),v.$$input=e=>i(e.currentTarget.value),R(b,()=>fp.map(e=>(()=>{var t=eu();return y(()=>t.value=e.url),t})())),ee.$$input=e=>o(e.currentTarget.value),w.$$input=e=>c(e.currentTarget.value),R(re,()=>l().map(e=>(()=>{var t=eu();return y(()=>t.value=e.id),t})())),R(n,j(N,{get when(){return l().length>0},get fallback(){return _f()},get children(){var e=mf(),t=e.firstChild;return R(e,()=>l().length,t),R(e,j(N,{get when(){return te()},get children(){return[` · `,(()=>{var e=pf();return R(e,te),e})()]}}),null),e}}),T),D.$$input=e=>f(e.currentTarget.value),ie.$$input=e=>m(e.currentTarget.value),R(n,j(N,{get when(){return _()},get children(){var e=Ud();return R(e,_),e}}),O),R(O,()=>h()?`saving…`:`finish setup`),y(e=>{var n=t().key===`llamacpp`?`(any name — serves whichever gguf is loaded)`:`(type to filter models from the endpoint)`,r=h();return n!==e.e&&I(w,`placeholder`,e.e=n),r!==e.t&&(O.disabled=e.t=r),e},{e:void 0,t:void 0}),y(()=>v.value=r()),y(()=>ee.value=a()),y(()=>w.value=s()),y(()=>D.value=d()),y(()=>ie.value=p()),e})()}function hp(e){let[t,n]=v(Object.entries(e.cfg.providers??{}).map(([e,t])=>({name:e,baseUrl:t.baseUrl??``,apiKey:t.apiKey??``,model:t.model??``}))),[r,i]=v(e.cfg.defaultProvider??``),[a,o]=v(Math.round((e.cfg.progressIntervalMs??6e5)/6e4)),[s,c]=v(e.cfg.progressMinChars??4e3),[l,u]=v(e.cfg.contextTokenBudget==null?null:Math.round(e.cfg.contextTokenBudget/1e3)),[d,f]=v(e.cfg.contextWindowTokens?Math.round(e.cfg.contextWindowTokens/1e3):0),[p,m]=v(e.cfg.maxSpawnDepth??3),[h,g]=v((e.cfg.tasks??[]).map(e=>({...e}))),[_,b]=v(``),x=()=>(e.cfg.agents??[]).map(e=>e.id),S=()=>{let e={};for(let n of t()){if(!n.name.trim())return b(`provider name is required`),null;if(n.baseUrl&&!/^https?:\/\//.test(n.baseUrl))return b(`provider ${n.name}: baseUrl must start with http(s)://`),null;e[n.name.trim()]={baseUrl:n.baseUrl,...n.apiKey?{apiKey:n.apiKey}:{},...n.model?{model:n.model}:{}}}return e},ee=async t=>{t.preventDefault(),b(``);let n=S();if(!n)return;let i=h().filter(e=>e.id?.trim()||e.prompt?.trim()).map((e,t)=>({id:e.id?.trim()||`task-${t+1}`,agent:e.agent,schedule:e.schedule,prompt:e.prompt,...e.forked?{forked:!0}:{}}));for(let e of i){if(!e.agent){b(`task "${e.id}": agent is required`);return}if(!e.schedule?.trim()){b(`task "${e.id}": schedule is required`);return}}try{await $(`/api/config`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({providers:n,defaultProvider:r()||void 0,progressIntervalMs:Math.max(1,a())*6e4,progressMinChars:Math.max(100,s()),...l()==null?{}:{contextTokenBudget:Math.max(1,l())*1e3},...d()>0?{contextWindowTokens:d()*1e3}:{},maxSpawnDepth:Math.max(0,p()),tasks:i})}),e.onSaved(),e.onClose()}catch(e){b(e.message)}},C=(e,t,n,r)=>(()=>{var i=vf(),a=i.firstChild;return I(i,`title`,r),R(i,e,a),a.$$input=e=>n(Number(e.currentTarget.value)),a.value=t,i})();return j(tp,{title:`settings`,get onClose(){return e.onClose},get children(){var v=yf(),S=v.firstChild,te=S.firstChild.nextSibling,ne=te.nextSibling;ne.firstChild;var w=ne.nextSibling.firstChild.firstChild.nextSibling;w.firstChild;var re=S.nextSibling,T=re.firstChild.nextSibling,E=T.firstChild,D=E.firstChild.nextSibling,ie=re.nextSibling,O=ie.firstChild.nextSibling,ae=ie.nextSibling;ae.firstChild;var oe=ae.nextSibling,se=oe.firstChild.nextSibling.firstChild;se.firstChild;var ce=se.nextSibling,le=oe.nextSibling;return v.addEventListener(`submit`,ee),R(S,j(be,{get each(){return t()},children:(e,r)=>(()=>{var i=bf(),a=i.firstChild,o=a.nextSibling,s=o.nextSibling,c=s.nextSibling,l=c.nextSibling;return a.$$input=e=>n(t().map((t,n)=>n===r?{...t,name:e.currentTarget.value}:t)),o.$$input=e=>n(t().map((t,n)=>n===r?{...t,baseUrl:e.currentTarget.value}:t)),s.$$input=e=>n(t().map((t,n)=>n===r?{...t,apiKey:e.currentTarget.value}:t)),c.$$input=e=>n(t().map((t,n)=>n===r?{...t,model:e.currentTarget.value}:t)),l.$$click=()=>n(t().filter((e,t)=>t!==r)),y(()=>a.value=e().name),y(()=>o.value=e().baseUrl),y(()=>s.value=e().apiKey),y(()=>c.value=e().model),i})()}),te),te.$$click=()=>n([...t(),{name:``,baseUrl:``,apiKey:``,model:``}]),R(ne,j(M,{each:fp,children:e=>(()=>{var a=xf();return a.firstChild,a.$$click=()=>{let a=t().filter(t=>t.name!==e.key);n([...a,{name:e.key,baseUrl:e.url,apiKey:``,model:e.model}]),r()||i(e.key)},R(a,()=>e.label,null),y(()=>I(a,`title`,`fill a ${e.label} row — ${e.url}${e.model?` (model: ${e.model})`:``}`)),a})()}),null),w.addEventListener(`change`,e=>i(e.currentTarget.value)),R(w,j(M,{get each(){return[...new Set(t().map(e=>e.name.trim()).filter(Boolean))]},children:e=>(()=>{var t=eu();return t.value=e,R(t,e),t})()}),null),R(T,()=>C(`progress interval (min)`,a(),e=>o(e),`how often the harness asks for a progress report`),E),R(T,()=>C(`progress min chars`,s(),e=>c(e),`progress prompts wait for this much real output`),E),D.$$input=e=>u(e.currentTarget.value===``?null:Number(e.currentTarget.value)),R(T,()=>C(`context window (k tok)`,d(),e=>f(e),`model's real window — 0/blank hides the % gauge`),null),R(T,()=>C(`max spawn depth`,p(),e=>m(e),`sub-agent nesting limit (0 = no spawning)`),null),R(ie,j(N,{get when(){return h().length>0},get children(){return j(be,{get each(){return h()},children:(e,t)=>(()=>{var n=Sf(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling,c=s.firstChild,l=s.nextSibling,u=r.nextSibling;return i.$$input=e=>g(h().map((n,r)=>r===t?{...n,id:e.currentTarget.value}:n)),a.$$input=e=>g(h().map((n,r)=>r===t?{...n,agent:e.currentTarget.value}:n)),o.$$input=e=>g(h().map((n,r)=>r===t?{...n,schedule:e.currentTarget.value}:n)),c.addEventListener(`change`,e=>g(h().map((n,r)=>r===t?{...n,forked:e.currentTarget.checked}:n))),l.$$click=()=>g(h().filter((e,n)=>n!==t)),u.$$input=e=>g(h().map((n,r)=>r===t?{...n,prompt:e.currentTarget.value}:n)),y(()=>i.value=e().id),y(()=>a.value=e().agent),y(()=>o.value=e().schedule),y(()=>c.checked=!!e().forked),y(()=>u.value=e().prompt),n})()})}}),O),O.$$click=()=>g([...h(),{id:``,agent:x()[0]??``,schedule:`every 30m`,prompt:``}]),R(ae,j(M,{get each(){return e.cfg.agents??[]},children:e=>(()=>{var t=wf(),n=t.firstChild,r=n.nextSibling;return R(n,()=>e.id),R(r,()=>e.workspace),R(t,j(N,{get when(){return e.parent},get children(){var t=Cf();return t.firstChild,R(t,()=>e.parent,null),t}}),null),t})()}),null),R(se,()=>e.cfg.version??`unknown`,null),ce.$$click=async e=>{try{b(``);let t=e.currentTarget;t.disabled=!0,t.textContent=`updating…`;let n=await $(`/api/update/restart`,{method:`POST`});if(!n.ok)throw Error((await n.json()).error??`restart failed`);t.textContent=`restarting…`;for(let e=0;e<60;e++){await new Promise(e=>setTimeout(e,1e3));try{let e=await $(`/api/version`);if(e.version&&e.version!==`0.22.12`){window.location.reload();return}}catch{}}throw Error(`restart timeout — new server did not come up`)}catch(e){b(e.message)}finally{e.currentTarget.disabled=!1,e.currentTarget.textContent=`update & restart`}},R(v,j(N,{get when(){return _()},get children(){var e=Ud();return R(e,_),e}}),le),y(()=>w.value=r()),y(()=>D.value=l()??``),v}})}we([`click`,`pointerdown`,`dblclick`,`input`,`keydown`]),Ce(()=>j(Bf,{}),document.getElementById(`root`));export{Ic as t};
|
|
30
|
-
//# sourceMappingURL=index-
|
|
29
|
+
Cancel = keep editing your copy`)?(ue(r.current),c({...t,content:r.current}),Q(`loaded the current file from disk`)):Q(`kept your edits — use Save As via bash to force-write`)}finally{de(!1)}}},_e=e=>!e.binary&&!e.truncated,ve=(e,t)=>[(()=>{var n=qd(),r=n.firstChild,a=r.nextSibling;return n.$$click=()=>e.dir?void ae(e):void he(e,`code`),R(r,(()=>{var t=P(()=>!!e.dir);return()=>t()?i().has(e.path)?`▾`:`▸`:op(e.name)})()),R(a,()=>e.name),R(n,j(N,{get when(){return P(()=>!e.dir)()&&e.size!==void 0},get children(){var t=Kd();return R(t,()=>Xf(e.size)),t}}),null),y(r=>{var i=`filerow`+(e.dir?` isdir`:``)+(e.ignored&&x()===`dim`?` gitignored`:``),a=`padding-left:${t*13+8}px`,o=e.dir?`browse ${e.path}`:`preview ${e.path}`;return i!==r.e&&L(n,r.e=i),r.t=Ee(n,a,r.t),o!==r.a&&I(n,`title`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),n})(),j(N,{get when(){return P(()=>!!e.dir)()&&i().has(e.path)},get children(){return j(M,{get each(){return(n().get(e.path)??[]).filter(te)},children:e=>ve(e,t+1)})}})],ye=()=>e.workspace.split(`/`).filter(Boolean).pop()??e.workspace,[be,xe]=v(!1),Se=async()=>{if(!be()){xe(!0);try{let e=[``,...i()],t=await Promise.all(e.map(async e=>({p:e,rows:await D(e,ne())})));for(let{p:e,rows:n}of t)n&&ie(e,n)}finally{xe(!1)}}};return[(()=>{var e=Jd(),t=e.firstChild.nextSibling;return t.firstChild,R(t,ye,null),R(e,j($f,{class:`filetoggle`,get icon(){return be()?`…`:`⟳`},title:`refresh the tree (root + expanded folders) — open popups are kept`,onClick:()=>void Se()}),null),R(e,j($f,{class:`filetoggle`,style:`margin-left:auto`,get icon(){return P(()=>x()===`hide`)()?`🙈`:x()===`dim`?`👁`:`✨`},get title(){return`gitignored files: ${x()} — click to cycle (dim → hidden → shown)`},onClick:ee}),null),R(e,j($f,{class:`filetoggle`,get icon(){return ne()?`◉.`:`○.`},get title(){return ne()?`dotfiles shown — click to hide`:`dotfiles hidden — click to show`},onClick:re}),null),e})(),(()=>{var e=Yd();return R(e,j(N,{get when(){return(n().get(``)??[]).length>0},get fallback(){return(()=>{var e=Xd();return R(e,()=>g()||`empty workspace`),e})()},get children(){return j(M,{get each(){return(n().get(``)??[]).filter(te)},children:e=>ve(e,0)})}})),e})(),j(N,{get when(){return o()},children:t=>j(tp,{get title(){return`🗂 ${t().path}`},onClose:()=>{pe++,c(null),f(null)},get children(){return j(N,{get when(){return u()},get fallback(){return[(()=>{var e=tf(),n=e.firstChild;return R(e,j(N,{get when(){return P(()=>!!fe(t().path))()&&!t().binary},get children(){var e=$d();return e.$$click=()=>h(`md`),y(()=>L(e,p()===`md`?`on`:``)),e}}),n),n.$$click=()=>{h(`code`),oe()||me({path:t().path,content:t().content,truncated:t().truncated})},R(e,j(N,{get when(){return _e(t())},get children(){var e=ef();return e.$$click=()=>h(`edit`),y(()=>L(e,p()===`edit`?`on`:``)),e}}),null),y(()=>L(n,p()===`code`?`on`:``)),e})(),j(N,{get when(){return!t().binary},get fallback(){return rf()},get children(){return j(N,{get when(){return p()===`edit`},get fallback(){return j(N,{get when(){return P(()=>p()===`md`)()&&fe(t().path)},get fallback(){return j(dp,{get path(){return t().path},get content(){return t().content},get html(){return oe()},get pending(){return ce()},get truncated(){return!!t().truncated}})},get children(){var e=af();return y(()=>e.innerHTML=Ie(t().content)),e}})},get children(){var e=nf(),n=e.firstChild,r=n.nextSibling.firstChild,i=r.firstChild,a=r.nextSibling;return n.$$input=e=>ue(e.currentTarget.value),I(n,`spellcheck`,!1),R(r,()=>Xf(k().length),i),a.$$click=()=>void ge(),R(a,()=>A()?`saving…`:`💾 save`),y(()=>a.disabled=A()||k()===t().content),y(()=>n.value=k()),e}})}})]},get children(){var t=Qd(),n=t.firstChild,r=n.firstChild;return R(t,j(N,{get when(){return u().kind===`image`},get fallback(){return j(N,{get when(){return u().kind===`video`},get fallback(){return(()=>{var t=sf();return y(()=>I(t,`src`,`/api/agents/${e.agentId}/raw?path=${encodeURIComponent(u().path)}`)),t})()},get children(){var t=of();return y(()=>I(t,`src`,`/api/agents/${e.agentId}/raw?path=${encodeURIComponent(u().path)}`)),t}})},get children(){var t=Zd();return y(n=>{var r=`/api/agents/${e.agentId}/raw?path=${encodeURIComponent(u().path)}`,i=u().path.split(`/`).pop();return r!==n.e&&I(t,`src`,n.e=r),i!==n.t&&I(t,`alt`,n.t=i),n},{e:void 0,t:void 0}),t}}),n),R(n,()=>u().kind,r),t}})}})})]}function dp(e){return[j(N,{get when(){return e.html},get fallback(){return P(()=>!!e.pending)()?(()=>{var t=uf(),n=t.firstChild.nextSibling;return n.nextSibling,R(t,()=>e.path.split(`/`).pop(),n),t})():(()=>{var t=df();return R(t,()=>e.content),t})()},get children(){var t=cf();return y(()=>t.innerHTML=e.html),t}}),j(N,{get when(){return e.truncated},get children(){return lf()}})]}var fp=[{key:`openrouter`,label:`OpenRouter`,url:`https://openrouter.ai/api/v1`,model:`anthropic/claude-sonnet-4`,hint:`400+ models behind one key — teapot sends app-attribution headers automatically`},{key:`orcarouter`,label:`OrcaRouter`,url:`https://api.orcarouter.ai/v1`,model:`orcarouter/auto`,hint:`zero-markup routing gateway — 'orcarouter/auto' grades each prompt and picks the model`},{key:`openai`,label:`OpenAI`,url:`https://api.openai.com/v1`,model:`gpt-4o-mini`},{key:`llamacpp`,label:`llama.cpp server`,url:`http://localhost:8080/v1`,model:``,hint:`free & local — start it with: llama-server -m ./model.gguf (any model name works)`}],pp={key:`custom`,label:`Custom`,url:``,model:``,hint:`any OpenAI-compatible /v1 endpoint — vLLM, LM Studio, llama.cpp, a company gateway… fill the fields below`};function mp(e){let[t,n]=v(fp[0]),[r,i]=v(fp[0].url),[a,o]=v(``),[s,c]=v(fp[0].model),[l,u]=v([]),[d,f]=v(`~/teapot-workspace`),[p,m]=v(``),[h,g]=v(!1),[_,x]=v(``),S=e=>{n(e),e.key!==`custom`&&e.url&&(i(e.url),e.model&&c(e.model))};b(()=>{let e=r().trim(),t=a();if(!/^https?:\/\//.test(e)){u([]);return}let n=setTimeout(async()=>{try{let n=await $(`/api/setup/models?baseUrl=${encodeURIComponent(e)}${t?`&apiKey=${encodeURIComponent(t)}`:``}`);u(n.models??[])}catch{u([])}},600);C(()=>clearTimeout(n))});let ee=e=>{let t=l().find(t=>t.id===e.trim());if(!t)return``;let n=[];t.contextLength&&n.push(`ctx ${Xf(t.contextLength)} tok`);let r=e=>e===void 0?``:`$${e*1e6>=10?Math.round(e*1e6):+(e*1e6).toFixed(1)}/M`;if(t.pricing){let e=r(t.pricing.prompt),i=r(t.pricing.completion);e&&i?n.push(`${e} in · ${i} out`):(e||i)&&n.push(r(t.pricing.prompt??t.pricing.completion))}return n.join(` · `)},te=()=>ee(s()),ne=async t=>{t.preventDefault(),x(``),g(!0);try{await $(`/api/setup`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({baseUrl:r(),apiKey:a()||void 0,model:s(),workspace:d(),...p()?{password:p()}:{}})}),e.onDone()}catch(e){x(e.message),g(!1)}};return(()=>{var e=hf(),n=e.firstChild.firstChild.nextSibling.nextSibling,u=n.firstChild,g=u.nextSibling,v=g.firstChild.nextSibling,b=v.nextSibling,x=g.nextSibling,ee=x.firstChild.nextSibling,C=x.nextSibling,w=C.firstChild.nextSibling,re=w.nextSibling,T=C.nextSibling,E=T.firstChild.nextSibling,D=E.firstChild.nextSibling,ie=E.nextSibling.firstChild.nextSibling,O=T.nextSibling;return n.addEventListener(`submit`,ne),R(u,()=>[...fp,pp].map(e=>(()=>{var n=gf();return n.$$click=()=>S(e),R(n,()=>e.label),y(r=>{var i=`presetbtn`+(t().key===e.key?` active`:``),a=e.hint||e.url;return i!==r.e&&L(n,r.e=i),a!==r.t&&I(n,`title`,r.t=a),r},{e:void 0,t:void 0}),n})())),R(n,j(N,{get when(){return t().hint},get children(){var e=ff();return R(e,()=>t().hint),e}}),g),v.$$input=e=>i(e.currentTarget.value),R(b,()=>fp.map(e=>(()=>{var t=eu();return y(()=>t.value=e.url),t})())),ee.$$input=e=>o(e.currentTarget.value),w.$$input=e=>c(e.currentTarget.value),R(re,()=>l().map(e=>(()=>{var t=eu();return y(()=>t.value=e.id),t})())),R(n,j(N,{get when(){return l().length>0},get fallback(){return _f()},get children(){var e=mf(),t=e.firstChild;return R(e,()=>l().length,t),R(e,j(N,{get when(){return te()},get children(){return[` · `,(()=>{var e=pf();return R(e,te),e})()]}}),null),e}}),T),D.$$input=e=>f(e.currentTarget.value),ie.$$input=e=>m(e.currentTarget.value),R(n,j(N,{get when(){return _()},get children(){var e=Ud();return R(e,_),e}}),O),R(O,()=>h()?`saving…`:`finish setup`),y(e=>{var n=t().key===`llamacpp`?`(any name — serves whichever gguf is loaded)`:`(type to filter models from the endpoint)`,r=h();return n!==e.e&&I(w,`placeholder`,e.e=n),r!==e.t&&(O.disabled=e.t=r),e},{e:void 0,t:void 0}),y(()=>v.value=r()),y(()=>ee.value=a()),y(()=>w.value=s()),y(()=>D.value=d()),y(()=>ie.value=p()),e})()}function hp(e){let[t,n]=v(Object.entries(e.cfg.providers??{}).map(([e,t])=>({name:e,baseUrl:t.baseUrl??``,apiKey:t.apiKey??``,model:t.model??``}))),[r,i]=v(e.cfg.defaultProvider??``),[a,o]=v(Math.round((e.cfg.progressIntervalMs??6e5)/6e4)),[s,c]=v(e.cfg.progressMinChars??4e3),[l,u]=v(e.cfg.contextTokenBudget==null?null:Math.round(e.cfg.contextTokenBudget/1e3)),[d,f]=v(e.cfg.contextWindowTokens?Math.round(e.cfg.contextWindowTokens/1e3):0),[p,m]=v(e.cfg.maxSpawnDepth??3),[h,g]=v((e.cfg.tasks??[]).map(e=>({...e}))),[_,b]=v(``),x=()=>(e.cfg.agents??[]).map(e=>e.id),S=()=>{let e={};for(let n of t()){if(!n.name.trim())return b(`provider name is required`),null;if(n.baseUrl&&!/^https?:\/\//.test(n.baseUrl))return b(`provider ${n.name}: baseUrl must start with http(s)://`),null;e[n.name.trim()]={baseUrl:n.baseUrl,...n.apiKey?{apiKey:n.apiKey}:{},...n.model?{model:n.model}:{}}}return e},ee=async t=>{t.preventDefault(),b(``);let n=S();if(!n)return;let i=h().filter(e=>e.id?.trim()||e.prompt?.trim()).map((e,t)=>({id:e.id?.trim()||`task-${t+1}`,agent:e.agent,schedule:e.schedule,prompt:e.prompt,...e.forked?{forked:!0}:{}}));for(let e of i){if(!e.agent){b(`task "${e.id}": agent is required`);return}if(!e.schedule?.trim()){b(`task "${e.id}": schedule is required`);return}}try{await $(`/api/config`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({providers:n,defaultProvider:r()||void 0,progressIntervalMs:Math.max(1,a())*6e4,progressMinChars:Math.max(100,s()),...l()==null?{}:{contextTokenBudget:Math.max(1,l())*1e3},...d()>0?{contextWindowTokens:d()*1e3}:{},maxSpawnDepth:Math.max(0,p()),tasks:i})}),e.onSaved(),e.onClose()}catch(e){b(e.message)}},C=(e,t,n,r)=>(()=>{var i=vf(),a=i.firstChild;return I(i,`title`,r),R(i,e,a),a.$$input=e=>n(Number(e.currentTarget.value)),a.value=t,i})();return j(tp,{title:`settings`,get onClose(){return e.onClose},get children(){var v=yf(),S=v.firstChild,te=S.firstChild.nextSibling,ne=te.nextSibling;ne.firstChild;var w=ne.nextSibling.firstChild.firstChild.nextSibling;w.firstChild;var re=S.nextSibling,T=re.firstChild.nextSibling,E=T.firstChild,D=E.firstChild.nextSibling,ie=re.nextSibling,O=ie.firstChild.nextSibling,ae=ie.nextSibling;ae.firstChild;var oe=ae.nextSibling,se=oe.firstChild.nextSibling.firstChild;se.firstChild;var ce=se.nextSibling,le=oe.nextSibling;return v.addEventListener(`submit`,ee),R(S,j(be,{get each(){return t()},children:(e,r)=>(()=>{var i=bf(),a=i.firstChild,o=a.nextSibling,s=o.nextSibling,c=s.nextSibling,l=c.nextSibling;return a.$$input=e=>n(t().map((t,n)=>n===r?{...t,name:e.currentTarget.value}:t)),o.$$input=e=>n(t().map((t,n)=>n===r?{...t,baseUrl:e.currentTarget.value}:t)),s.$$input=e=>n(t().map((t,n)=>n===r?{...t,apiKey:e.currentTarget.value}:t)),c.$$input=e=>n(t().map((t,n)=>n===r?{...t,model:e.currentTarget.value}:t)),l.$$click=()=>n(t().filter((e,t)=>t!==r)),y(()=>a.value=e().name),y(()=>o.value=e().baseUrl),y(()=>s.value=e().apiKey),y(()=>c.value=e().model),i})()}),te),te.$$click=()=>n([...t(),{name:``,baseUrl:``,apiKey:``,model:``}]),R(ne,j(M,{each:fp,children:e=>(()=>{var a=xf();return a.firstChild,a.$$click=()=>{let a=t().filter(t=>t.name!==e.key);n([...a,{name:e.key,baseUrl:e.url,apiKey:``,model:e.model}]),r()||i(e.key)},R(a,()=>e.label,null),y(()=>I(a,`title`,`fill a ${e.label} row — ${e.url}${e.model?` (model: ${e.model})`:``}`)),a})()}),null),w.addEventListener(`change`,e=>i(e.currentTarget.value)),R(w,j(M,{get each(){return[...new Set(t().map(e=>e.name.trim()).filter(Boolean))]},children:e=>(()=>{var t=eu();return t.value=e,R(t,e),t})()}),null),R(T,()=>C(`progress interval (min)`,a(),e=>o(e),`how often the harness asks for a progress report`),E),R(T,()=>C(`progress min chars`,s(),e=>c(e),`progress prompts wait for this much real output`),E),D.$$input=e=>u(e.currentTarget.value===``?null:Number(e.currentTarget.value)),R(T,()=>C(`context window (k tok)`,d(),e=>f(e),`model's real window — 0/blank hides the % gauge`),null),R(T,()=>C(`max spawn depth`,p(),e=>m(e),`sub-agent nesting limit (0 = no spawning)`),null),R(ie,j(N,{get when(){return h().length>0},get children(){return j(be,{get each(){return h()},children:(e,t)=>(()=>{var n=Sf(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling,c=s.firstChild,l=s.nextSibling,u=r.nextSibling;return i.$$input=e=>g(h().map((n,r)=>r===t?{...n,id:e.currentTarget.value}:n)),a.$$input=e=>g(h().map((n,r)=>r===t?{...n,agent:e.currentTarget.value}:n)),o.$$input=e=>g(h().map((n,r)=>r===t?{...n,schedule:e.currentTarget.value}:n)),c.addEventListener(`change`,e=>g(h().map((n,r)=>r===t?{...n,forked:e.currentTarget.checked}:n))),l.$$click=()=>g(h().filter((e,n)=>n!==t)),u.$$input=e=>g(h().map((n,r)=>r===t?{...n,prompt:e.currentTarget.value}:n)),y(()=>i.value=e().id),y(()=>a.value=e().agent),y(()=>o.value=e().schedule),y(()=>c.checked=!!e().forked),y(()=>u.value=e().prompt),n})()})}}),O),O.$$click=()=>g([...h(),{id:``,agent:x()[0]??``,schedule:`every 30m`,prompt:``}]),R(ae,j(M,{get each(){return e.cfg.agents??[]},children:e=>(()=>{var t=wf(),n=t.firstChild,r=n.nextSibling;return R(n,()=>e.id),R(r,()=>e.workspace),R(t,j(N,{get when(){return e.parent},get children(){var t=Cf();return t.firstChild,R(t,()=>e.parent,null),t}}),null),t})()}),null),R(se,()=>e.cfg.version??`unknown`,null),ce.$$click=async e=>{try{b(``);let t=e.currentTarget;t.disabled=!0,t.textContent=`updating…`;let n=await $(`/api/update/restart`,{method:`POST`});if(!n.ok)throw Error((await n.json()).error??`restart failed`);t.textContent=`restarting…`;for(let e=0;e<60;e++){await new Promise(e=>setTimeout(e,1e3));try{let e=await $(`/api/version`);if(e.version&&e.version!==`0.22.13`){window.location.reload();return}}catch{}}throw Error(`restart timeout — new server did not come up`)}catch(e){b(e.message)}finally{e.currentTarget.disabled=!1,e.currentTarget.textContent=`update & restart`}},R(v,j(N,{get when(){return _()},get children(){var e=Ud();return R(e,_),e}}),le),y(()=>w.value=r()),y(()=>D.value=l()??``),v}})}we([`click`,`pointerdown`,`dblclick`,`input`,`keydown`]),Ce(()=>j(Bf,{}),document.getElementById(`root`));export{Ic as t};
|
|
30
|
+
//# sourceMappingURL=index-Bg8Y4MGZ.js.map
|