teapot-coding-agent 0.13.0 → 0.13.1
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/agent/agent.js +12 -0
- package/dist/agent/tools.js +28 -1
- package/dist/master.js +70 -1
- package/dist/server/api.js +23 -0
- package/package.json +1 -1
- package/public/assets/index-CO9AhxUA.css +1 -0
- package/public/assets/index-_IZWOALZ.js +15 -0
- package/public/assets/index-_IZWOALZ.js.map +1 -0
- package/public/index.html +2 -2
- package/public/assets/index-DC44teo7.js +0 -15
- package/public/assets/index-DC44teo7.js.map +0 -1
- package/public/assets/index-DN50nK9M.css +0 -1
package/dist/agent/agent.js
CHANGED
|
@@ -476,6 +476,7 @@ export class Agent {
|
|
|
476
476
|
todo: this.todo.slice(0, 32_000), // match set_todo's cap — no silent truncation
|
|
477
477
|
parent: this.opts.parent,
|
|
478
478
|
awaiting: this.awaitingUser,
|
|
479
|
+
autoContinue: this.opts.autoContinue,
|
|
479
480
|
};
|
|
480
481
|
}
|
|
481
482
|
/**
|
|
@@ -723,6 +724,17 @@ export class Agent {
|
|
|
723
724
|
return finished;
|
|
724
725
|
if (call.function.name === "finish") {
|
|
725
726
|
await this.handleFinish(call.function.arguments);
|
|
727
|
+
// surface still-running children so the operator knows work may
|
|
728
|
+
// continue after this agent goes idle
|
|
729
|
+
try {
|
|
730
|
+
const running = (this.toolCtx.subAgents?.list?.() ?? []).filter((k) => k.status === "running");
|
|
731
|
+
if (running.length)
|
|
732
|
+
await this.log.append("system_note", this.currentSession, this.currentBranch, {
|
|
733
|
+
event: "subs-still-running",
|
|
734
|
+
detail: running.map((k) => `${k.id} (${k.status})`).join(", "),
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
catch { /* best-effort notice */ }
|
|
726
738
|
// answer the tool_call so a follow-up round stays API-valid
|
|
727
739
|
await this.answerMeta(call, this.goal.status === "done" ? "(goal complete)" : "(round ended)");
|
|
728
740
|
finished = true;
|
package/dist/agent/tools.js
CHANGED
|
@@ -741,7 +741,7 @@ export const TOOLS = [
|
|
|
741
741
|
context,
|
|
742
742
|
name: str(args.name).trim() || undefined,
|
|
743
743
|
});
|
|
744
|
-
return { ok: true, result: `spawned sub-agent ${r.id} —
|
|
744
|
+
return { ok: true, result: `spawned sub-agent ${r.id} — park with wait_children() until it reports (never bash sleep), steer via message_agent, halt via stop_children` };
|
|
745
745
|
}
|
|
746
746
|
catch (e) {
|
|
747
747
|
return { ok: false, result: `spawn failed: ${e.message}` };
|
|
@@ -788,6 +788,33 @@ export const TOOLS = [
|
|
|
788
788
|
};
|
|
789
789
|
},
|
|
790
790
|
},
|
|
791
|
+
{
|
|
792
|
+
name: "wait_children",
|
|
793
|
+
description: "Park until at least one sub-agent settles (finished, errored, stopped, or asks you a question) — " +
|
|
794
|
+
"or until the timeout lapses. Costs zero tokens while parked: prefer this over bash sleep when " +
|
|
795
|
+
"waiting on spawned work. The settling child's report is delivered to you afterwards.",
|
|
796
|
+
parameters: {
|
|
797
|
+
type: "object",
|
|
798
|
+
properties: {
|
|
799
|
+
ids: { type: "array", items: { type: "string" }, description: "sub-agent ids; omit for all" },
|
|
800
|
+
timeout_ms: { type: "number", description: "default 300000 (5 min), max 3600000" },
|
|
801
|
+
},
|
|
802
|
+
},
|
|
803
|
+
async run(args, ctx) {
|
|
804
|
+
const sa = ctx.subAgents;
|
|
805
|
+
if (!sa)
|
|
806
|
+
return { ok: false, result: "sub-agents are not available here" };
|
|
807
|
+
const ids = Array.isArray(args.ids) ? args.ids.map(String) : undefined;
|
|
808
|
+
const ms = Math.min(Math.max(num(args.timeout_ms, 300_000), 1_000), 3_600_000);
|
|
809
|
+
try {
|
|
810
|
+
const r = await sa.wait(ids, ms);
|
|
811
|
+
return { ok: true, result: r.note };
|
|
812
|
+
}
|
|
813
|
+
catch (e) {
|
|
814
|
+
return { ok: false, result: `wait failed: ${e.message}` };
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
},
|
|
791
818
|
{
|
|
792
819
|
name: "message_agent",
|
|
793
820
|
description: "Send a message to a specific sub-agent (steer it mid-flight or answer its ask_user question).",
|
package/dist/master.js
CHANGED
|
@@ -176,6 +176,7 @@ function printAgentEvent(e) {
|
|
|
176
176
|
export class Master {
|
|
177
177
|
agents = new Map();
|
|
178
178
|
tasks = [];
|
|
179
|
+
childWaiters = new Map();
|
|
179
180
|
startedAt = Date.now();
|
|
180
181
|
config;
|
|
181
182
|
configPath;
|
|
@@ -357,7 +358,7 @@ export class Master {
|
|
|
357
358
|
sessionDir,
|
|
358
359
|
progressIntervalMs: this.config.progressIntervalMs,
|
|
359
360
|
...(this.config.progressMinChars ? { progressMinChars: this.config.progressMinChars } : {}),
|
|
360
|
-
autoContinue: true,
|
|
361
|
+
autoContinue: ac.autoContinue ?? true,
|
|
361
362
|
...(this.config.contextTokenBudget ? { contextTokenBudget: this.config.contextTokenBudget } : {}),
|
|
362
363
|
...(ac.contextWindowTokens || this.config.contextWindowTokens || inferredWindow
|
|
363
364
|
? {
|
|
@@ -395,6 +396,7 @@ export class Master {
|
|
|
395
396
|
})),
|
|
396
397
|
stop: (ids) => this.stopChildrenFor(ac.id, ids),
|
|
397
398
|
message: (id, text) => this.messageChild(ac.id, id, text),
|
|
399
|
+
wait: (ids, ms) => this.waitChildren(ac.id, ids, ms),
|
|
398
400
|
};
|
|
399
401
|
agent.toolCtx.subAgents = hooks;
|
|
400
402
|
}
|
|
@@ -517,6 +519,69 @@ export class Master {
|
|
|
517
519
|
return { stopped };
|
|
518
520
|
}
|
|
519
521
|
/** Deliver a parent's message into a child's mailbox (and wake it). */
|
|
522
|
+
/**
|
|
523
|
+
* Event-driven parking for a parent waiting on sub-agents: resolves as soon
|
|
524
|
+
* as ANY listed child settles (finish/error/stop/waiting) — zero API cost
|
|
525
|
+
* while parked. Falls back to a timeout so waits can never hang forever.
|
|
526
|
+
*/
|
|
527
|
+
waitChildren(parentId, ids, timeoutMs, signal) {
|
|
528
|
+
const targets = (ids && ids.length
|
|
529
|
+
? ids
|
|
530
|
+
: this.childrenOf(parentId).map((c) => c.id)).filter((id) => this.agents.has(id));
|
|
531
|
+
if (targets.length === 0)
|
|
532
|
+
return Promise.resolve({ note: "no live sub-agents to wait for" });
|
|
533
|
+
const active = () => targets.filter((id) => {
|
|
534
|
+
const s = this.agents.get(id)?.status;
|
|
535
|
+
return s === "running" || s === "waiting";
|
|
536
|
+
});
|
|
537
|
+
const first = active();
|
|
538
|
+
if (first.length === 0)
|
|
539
|
+
return Promise.resolve({ note: `all sub-agents already settled: ${targets.join(", ")}` });
|
|
540
|
+
return new Promise((resolve) => {
|
|
541
|
+
let done = false;
|
|
542
|
+
const finish = (note) => {
|
|
543
|
+
if (done)
|
|
544
|
+
return;
|
|
545
|
+
done = true;
|
|
546
|
+
clearTimeout(timer);
|
|
547
|
+
set.delete(wake);
|
|
548
|
+
signal?.removeEventListener("abort", onAbort);
|
|
549
|
+
resolve({ note });
|
|
550
|
+
};
|
|
551
|
+
const onAbort = () => finish("aborted while waiting");
|
|
552
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
553
|
+
const timer = setTimeout(() => {
|
|
554
|
+
const left = active();
|
|
555
|
+
finish(`timeout after ${Math.round(timeoutMs / 1000)}s — still running: ${left.join(", ") || "(none)"}`);
|
|
556
|
+
}, timeoutMs);
|
|
557
|
+
const wake = (_note) => {
|
|
558
|
+
const left = active();
|
|
559
|
+
if (left.length > 0)
|
|
560
|
+
return; // something is still working — keep parked
|
|
561
|
+
clearTimeout(timer);
|
|
562
|
+
finish(`all sub-agents settled: ${targets.join(", ")}`);
|
|
563
|
+
};
|
|
564
|
+
const set = this.childWaiters.get(parentId) ?? new Set();
|
|
565
|
+
if (!this.childWaiters.has(parentId))
|
|
566
|
+
this.childWaiters.set(parentId, set);
|
|
567
|
+
set.add(wake);
|
|
568
|
+
// re-check immediately: children may have settled between snapshot & register
|
|
569
|
+
if (active().length === 0)
|
|
570
|
+
wake();
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
/** wake every waiter of a parent (child lifecycle event happened) */
|
|
574
|
+
wakeParentWaiters(parentId) {
|
|
575
|
+
const set = this.childWaiters.get(parentId);
|
|
576
|
+
if (!set)
|
|
577
|
+
return;
|
|
578
|
+
for (const fn of [...set]) {
|
|
579
|
+
try {
|
|
580
|
+
fn("child event");
|
|
581
|
+
}
|
|
582
|
+
catch { /* ignore */ }
|
|
583
|
+
}
|
|
584
|
+
}
|
|
520
585
|
async messageChild(parentId, childId, text) {
|
|
521
586
|
const cfg = this.config.agents.find((a) => a.id === childId);
|
|
522
587
|
if (!cfg || cfg.parent !== parentId)
|
|
@@ -536,6 +601,10 @@ export class Master {
|
|
|
536
601
|
const parentId = ac.parent;
|
|
537
602
|
if (!parentId)
|
|
538
603
|
return;
|
|
604
|
+
// any child lifecycle movement wakes a parked wait_children (the waiter
|
|
605
|
+
// re-checks whether its targets are all settled)
|
|
606
|
+
if (parentId)
|
|
607
|
+
this.wakeParentWaiters(parentId);
|
|
539
608
|
const parent = this.agents.get(parentId);
|
|
540
609
|
if (!parent)
|
|
541
610
|
return;
|
package/dist/server/api.js
CHANGED
|
@@ -436,6 +436,22 @@ export function buildApp(master) {
|
|
|
436
436
|
return c.json({ error: err.message }, 400);
|
|
437
437
|
}
|
|
438
438
|
});
|
|
439
|
+
// per-agent auto-continue toggle (loops toward an active goal)
|
|
440
|
+
app.post("/api/agents/:id/auto-continue", async (c) => {
|
|
441
|
+
const a = master.agents.get(c.req.param("id"));
|
|
442
|
+
if (!a)
|
|
443
|
+
return c.json({ error: "not found" }, 404);
|
|
444
|
+
const body = await c.req.json().catch(() => null);
|
|
445
|
+
if (!body || typeof body.value !== "boolean")
|
|
446
|
+
return c.json({ error: "boolean value required" }, 400);
|
|
447
|
+
const ac = master.config.agents.find((x) => x.id === c.req.param("id"));
|
|
448
|
+
if (ac)
|
|
449
|
+
ac.autoContinue = body.value;
|
|
450
|
+
a.opts.autoContinue = body.value;
|
|
451
|
+
master.saveConfig();
|
|
452
|
+
bus.emit("update", { kind: "agent-update", agentId: c.req.param("id") });
|
|
453
|
+
return c.json({ ok: true, value: body.value });
|
|
454
|
+
});
|
|
439
455
|
// default sub-agent personas for @mentions and spawn_agent
|
|
440
456
|
app.get("/api/personas", (c) => c.json({
|
|
441
457
|
personas: Object.entries(SUB_PERSONAS).map(([key, p]) => ({ key, label: p.label, directive: p.directive })),
|
|
@@ -529,6 +545,13 @@ export function buildApp(master) {
|
|
|
529
545
|
events = events.filter((e) => e.branch === branch);
|
|
530
546
|
if (session)
|
|
531
547
|
events = events.filter((e) => e.session === session);
|
|
548
|
+
// cursor pagination for older pages: everything strictly BEFORE this id
|
|
549
|
+
const before = c.req.query("before");
|
|
550
|
+
if (before) {
|
|
551
|
+
const idx = events.findIndex((e) => e.id === before);
|
|
552
|
+
events = idx === -1 ? [] : events.slice(0, idx);
|
|
553
|
+
return c.json({ events: events.slice(-limit), total: events.length });
|
|
554
|
+
}
|
|
532
555
|
return c.json({ events: events.slice(-limit), total: events.length });
|
|
533
556
|
});
|
|
534
557
|
app.get("/api/agents/:id/branches", async (c) => {
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg-darkest:#1a1c22;--bg-dark:#232630;--bg-mid:#2b2e39;--bg-light:#343845;--fg:#dcdee4;--dim:#9298a5;--line:#1d2027;--acc:#5865f2;--ok:#3ba55d;--warn:#faa81a;--err:#ed4245;--tool:#3ba0c9;font-family:gg sans,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg-dark);color:var(--fg);font-size:15px}.layout{grid-template-columns:250px 1fr 300px;height:100dvh;display:grid;overflow:hidden}.layout.right-hidden{grid-template-columns:250px 1fr}.layout.right-hidden .rightbar{display:none}@media (width<=1100px){.layout,.layout.right-hidden{grid-template-columns:220px 1fr}.layout.right-hidden .rightbar{display:block}.rightbar{z-index:5;width:min(320px,88vw);transition:transform .18s;position:fixed;top:0;bottom:0;right:0;transform:translate(100%);box-shadow:-8px 0 24px #0007}.rightbar.open{transform:none}}.sidebar{background:var(--bg-darkest);flex-direction:column;padding:10px 8px;display:flex;overflow-y:auto}.sidebar h1{color:var(--fg);flex-shrink:0;margin:0;padding:4px 8px 10px;font-size:14px}.agent-list{flex:1;min-height:0;overflow-y:auto}.agent-item{cursor:pointer;color:var(--dim);border-radius:6px;align-items:center;gap:8px;margin-bottom:2px;padding:7px 10px;display:flex}.agent-item .subtag{color:var(--dim);font-size:10px}.caret{cursor:pointer;width:12px;color:var(--dim);text-align:center;-webkit-user-select:none;user-select:none;flex-shrink:0;font-size:9px}.caret:hover{color:var(--fg)}.caret-spacer{flex-shrink:0;width:12px}.agent-item:hover{background:var(--bg-mid)}.agent-item.sel{background:var(--bg-mid);color:var(--fg)}.dot{border-radius:50%;flex-shrink:0;width:9px;height:9px}.dot.running{background:var(--ok);box-shadow:0 0 6px var(--ok)}.dot.waiting{background:var(--acc);box-shadow:0 0 6px var(--acc);animation:1.6s ease-in-out infinite pulse}.badge.waiting{color:var(--acc)}.dot.idle{background:var(--warn)}.dot.stopped{background:var(--dim)}.dot.error{background:var(--err);box-shadow:0 0 6px var(--err)}.sidebar .metrics{color:var(--dim);border-top:1px solid var(--line);margin-top:12px;padding:8px 10px;font-size:11px;line-height:1.7}.channel{flex-direction:column;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.chan-head{border-bottom:2px solid var(--line);background:var(--bg-dark);flex-shrink:0;align-items:center;gap:10px;padding:10px 16px;display:flex}.chan-head .hash{color:var(--dim);font-size:20px}.chan-head .title{font-weight:700}.chan-head .sub{color:var(--dim);text-overflow:ellipsis;white-space:nowrap;margin-left:8px;font-size:12px;overflow:hidden}.badge{background:var(--bg-light);vertical-align:middle;border-radius:10px;padding:1px 8px;font-size:11px}.badge.running{color:var(--ok)}.badge.error{color:var(--err)}.badge.idle{color:var(--warn)}.badge.done{color:var(--acc)}.badge.queued{color:var(--warn);white-space:nowrap;background:#faa81a1a;border:1px solid #faa81a44}.feed{overscroll-behavior:contain;flex:1;min-height:0;padding:14px 0 8px;overflow-y:auto}.msg{gap:14px;padding:3px 18px;display:flex}.msg:hover{background:#ffffff08}.msg.pending{opacity:.55}.msg.pending .ts{color:var(--warn)}.msg.grouped{padding-top:0}.avatar{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:38px;height:38px;margin-top:2px;font-size:17px;display:flex}.msg-body{flex:1;min-width:0}.msg-head{align-items:baseline;gap:8px;display:flex}.actor{color:var(--warn);white-space:nowrap;font-size:11px}.ctxwarn{color:var(--warn);font-weight:600}.ctxcrit{color:var(--err);font-weight:700}.author{font-size:14.5px;font-weight:600}.ts{color:var(--dim);font-size:11px}.content{white-space:pre-wrap;word-break:break-word;line-height:1.45}.content p{margin:2px 0}.content pre{background:var(--bg-darkest);border-radius:6px;padding:8px;overflow-x:auto}.content code{background:var(--bg-darkest);border-radius:4px;padding:1px 4px;font-size:13px}.content pre code{background:0 0;padding:0}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{margin:8px 0 2px;font-size:15px}.content h1{font-size:16.5px}.content h2{font-size:15.5px}.content blockquote{border-left:3px solid var(--bg-light);color:var(--dim);background:#ffffff05;border-radius:0 4px 4px 0;margin:4px 0;padding:2px 10px}.content blockquote p{margin:2px 0}.content hr{border:none;border-top:1px solid var(--bg-light);margin:8px 0}.content del{color:var(--dim)}.content img{border-radius:6px;max-width:100%}.content li.task{margin-left:-18px;list-style:none}.content li:has(>input[type=checkbox]){margin-left:-18px;list-style:none}.content li input[type=checkbox]{accent-color:var(--ok);margin-right:6px}.tbl{margin:6px 0;overflow-x:auto}.tbl table{border-collapse:collapse;font-size:13px}.tbl th,.tbl td{border:1px solid var(--bg-light);text-align:left;padding:3px 9px}.tbl th{background:var(--bg-darkest);font-weight:600}.embed{border-left:3px solid var(--tool);background:var(--bg-darkest);border-radius:4px;margin-top:3px;padding:6px 10px;font-size:13.5px}.embed.fail{border-color:var(--err)}.embed.done{border-color:var(--ok)}.embed.running{border-color:var(--warn)}.embed.running summary .meta:after{content:"⋯";color:var(--warn);margin-left:6px;animation:1s step-end infinite blink;display:inline-block}.embed summary{gap:8px}.embed summary .mono{font-family:ui-monospace,Menlo,monospace}.toolbody{background:var(--bg-darkest);white-space:pre-wrap;word-break:break-word;border-radius:4px;max-height:340px;margin:4px 0;padding:6px 8px;font-size:12.5px;overflow-y:auto}.toolbody.del{border-left:2px solid var(--err);color:#f0a5a6;background:#ed424514}.toolbody.add{border-left:2px solid var(--ok);color:#9fd8ae;background:#3ba55d14}.toolbody.patch{padding:4px 8px}.toolbody.patch .pline{white-space:pre-wrap;word-break:break-word}.toolbody.patch .pline.add{color:#9fd8ae;border-left:2px solid var(--ok);background:#3ba55d14;padding-left:4px}.toolbody.patch .pline.del{color:#f0a5a6;border-left:2px solid var(--err);background:#ed424514;padding-left:4px}.toolbody.patch .pline.meta{color:var(--dim)}.embed.question{border-color:var(--acc);background:#5865f20f}.qopts{flex-wrap:wrap;gap:6px;margin-top:6px;display:flex}.qopt{background:var(--acc);color:#fff;cursor:pointer;border:none;border-radius:999px;padding:3px 12px;font-size:12.5px}.qopt:hover{filter:brightness(1.15)}.embed.question .meta{margin-top:6px}.embed.decision{border-color:var(--acc);background:#5865f20f}.embed.decision summary .meta{margin-left:6px}.embed.decision .content{margin-top:3px;font-size:13px}.embed summary{cursor:pointer;-webkit-user-select:none;user-select:none;list-style-position:outside}.embed summary::marker{color:var(--dim)}.embed[open] summary{margin-bottom:4px}.embed .mono{white-space:pre-wrap;word-break:break-word;max-height:340px;font-family:ui-monospace,Menlo,monospace;font-size:12.5px;overflow-y:auto}.embed .meta{color:var(--dim);margin-top:3px;font-size:11px}.reasoning{border-left:3px dashed var(--bg-light);color:var(--dim);background:#ffffff05;border-radius:4px;margin:2px 0;padding:2px 10px;font-size:12.5px}.reasoning summary{cursor:pointer;-webkit-user-select:none;user-select:none;opacity:.75}.reasoning summary:hover{opacity:1;color:var(--fg)}.reasoning[open] summary{margin-bottom:4px}.reasoning .mono{white-space:pre-wrap;word-break:break-word;max-height:260px;overflow-y:auto}.msg.live .avatar{animation:1.6s ease-in-out infinite pulse}.cursor{color:var(--acc);animation:1s step-end infinite blink}.interrupted{color:var(--warn);margin-top:3px;font-size:11.5px}@keyframes blink{50%{opacity:0}}@keyframes pulse{50%{opacity:.55}}.conn{background:var(--err);vertical-align:middle;width:8px;height:8px;box-shadow:0 0 6px var(--err);border-radius:50%;margin-left:8px;display:inline-block}.conn.ok{background:var(--ok);box-shadow:0 0 6px var(--ok)}.copybtn{border:1px solid var(--bg-light);color:var(--dim);cursor:pointer;background:0 0;border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;line-height:16px}.copybtn:hover{color:var(--fg);filter:brightness(1.3)}.embed summary{align-items:center;gap:6px;display:flex}.msgfoot{color:var(--dim);align-items:center;gap:6px;margin-top:4px;font-size:11px;display:flex}.termdrawer{border-top:2px solid var(--line);background:#0d0e12;flex-direction:column;flex-shrink:0;height:38vh;min-height:220px;display:flex}.termbar{color:var(--dim);border-bottom:1px solid var(--line);background:var(--bg-darkest);justify-content:space-between;align-items:center;padding:4px 10px;font-size:11.5px;display:flex}.termhost{flex:1;min-height:0;padding:6px 8px;overflow:hidden}.jump{background:var(--acc);color:#fff;cursor:pointer;z-index:2;border:none;border-radius:999px;padding:6px 14px;font-size:12.5px;font-weight:600;position:absolute;bottom:86px;left:50%;transform:translate(-50%);box-shadow:0 4px 14px #0008}.divider-msg{color:var(--dim);align-items:center;gap:10px;padding:4px 18px;font-size:11.5px;display:flex}.divider-msg:before,.divider-msg:after{content:"";background:var(--line);flex:1;height:1px}.divider-msg.err{color:var(--err)}.day-divider{align-items:center;gap:10px;padding:14px 18px 6px;display:flex}.day-divider:before,.day-divider:after{content:"";background:var(--bg-light);flex:1;height:1px}.day-divider span{color:var(--dim);font-size:11px}.composer{padding:0 16px 18px;position:relative}.composer form{background:var(--bg-light);border-radius:10px;align-items:flex-end;gap:8px;padding:10px 12px;display:flex}.composer textarea{color:var(--fg);font:inherit;resize:none;background:0 0;border:none;outline:none;flex:1;max-height:160px;line-height:1.4;overflow-y:auto}.cmds{background:var(--bg-mid);border:1px solid var(--bg-light);z-index:3;border-radius:8px;position:absolute;bottom:calc(100% - 8px);left:16px;right:16px;overflow:hidden;box-shadow:0 -6px 20px #0007}.cmdrow{cursor:pointer;align-items:baseline;gap:10px;padding:7px 12px;font-size:13.5px;display:flex}.cmdrow:hover{background:var(--bg-light)}.cmdrow.active{background:var(--acc);color:#fff}.cmdrow.active .muted{color:#e6e9ff}.cmdrow .muted{font-size:12px}.composer button{background:var(--acc);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:7px 14px;font-weight:600}.composer button:hover{opacity:.9}.composer label{color:var(--dim);white-space:nowrap;align-items:center;gap:4px;font-size:12px;display:flex}.hint{color:var(--dim);margin-top:5px;font-size:11px}.rightbar{background:var(--bg-dark);border-left:2px solid var(--line);flex-direction:column;min-height:0;padding:14px;font-size:13px;display:flex;overflow-y:auto}.rightbar>*{flex-shrink:0}.rightbar h3{text-transform:uppercase;letter-spacing:.04em;color:var(--dim);margin:14px 0 6px;font-size:11px}.rightbar h3:first-child{margin-top:0}.card{background:var(--bg-darkest);white-space:pre-wrap;word-break:break-word;border-radius:8px;max-height:200px;padding:10px;overflow-y:auto}.muted{color:var(--dim)}.prog .progrow{gap:8px;margin-bottom:4px;display:flex}.prog .progrow b{color:var(--dim);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;min-width:62px;padding-top:2px;font-size:10px}.prog .progrow.warn span{color:var(--err)}.msg-head .editbtn{color:var(--dim);cursor:pointer;opacity:0;background:0 0;border:none;padding:0 2px;font-size:11px;transition:opacity .12s}.msg:hover .msg-head .editbtn{opacity:1}.msg-head .editbtn:hover{color:var(--acc)}.branch-row{color:var(--dim);cursor:pointer;justify-content:space-between;padding:3px 0;font-size:12px;display:flex}.branch-row:hover,.branch-row.cur{color:var(--fg)}.mini-cron{opacity:.75;margin-left:auto;font-size:10px}.sched-row{cursor:pointer;border-radius:6px;margin-bottom:2px;padding:6px 8px}.sched-row:hover,.sched-row.cur{background:var(--bg-mid)}.sched-top{align-items:baseline;gap:6px;font-size:12.5px;display:flex}.sched-row .sched-meta{color:var(--dim);margin-top:2px;font-size:11px}.sched-row .sched-prompt{color:var(--dim);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:11.5px;overflow:hidden}.badge.cron{color:var(--tool);white-space:nowrap;background:#3ba0c91a;border:1px solid #3ba0c944}.sesscard{flex-direction:column;gap:6px;font-size:12.5px;display:flex}.sessrow{align-items:center;gap:8px;display:flex}.sessrow .k{color:var(--dim);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0;width:74px;font-size:10px}.ellip{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;overflow:hidden}.modelbox{background:var(--bg-darkest);border-radius:8px;flex-direction:column;gap:6px;padding:10px;display:flex}.modelbox select,.modelbox input[type=text]{background:var(--bg-mid);color:var(--fg);font:inherit;border:none;border-radius:6px;outline:none;min-width:0;padding:6px 8px}.modelbox button{background:var(--acc);color:#fff;cursor:pointer;white-space:nowrap;border:none;border-radius:6px;padding:6px 10px;font-size:12.5px;font-weight:600}.modelbox button:hover{opacity:.9}.modelbox .meta{color:var(--dim);font-size:11px}.btnrow{gap:6px;margin:8px 0;display:flex}.btnrow button{background:var(--bg-light);color:var(--fg);cursor:pointer;border:none;border-radius:6px;padding:6px 10px;font-size:13px}.btnrow button:hover{filter:brightness(1.2)}.btnrow .runbtn{background:var(--ok);color:#fff;font-weight:600}.btnrow .danger{background:var(--err);color:#fff;font-weight:600}.ctrlrow{align-items:center;gap:8px;margin-top:6px;font-size:12.5px;display:flex}.ctrlrow label{cursor:pointer;color:var(--fg);white-space:nowrap;align-items:center;gap:5px;display:flex}.ctrlrow .muted{font-size:11.5px}.iconbtn{background:var(--bg-light);color:var(--fg);cursor:pointer;border:none;border-radius:6px;width:26px;height:24px;font-size:13px}.iconbtn:hover{filter:brightness(1.3)}.overlay{z-index:10;background:#0009;place-items:center;display:grid;position:fixed;inset:0}.modal{background:var(--bg-mid);border-radius:10px;width:min(620px,92vw);max-height:88vh;padding:16px 18px;overflow-y:auto}.modal-head{justify-content:space-between;align-items:center;margin-bottom:12px;font-size:16px;display:flex}.modal label{color:var(--dim);flex-direction:column;gap:4px;font-size:12.5px;display:flex}.modal input[type=text],.modal input[type=number],.modal select,.modal textarea{background:var(--bg-darkest);color:var(--fg);font:inherit;border:none;border-radius:6px;outline:none;padding:7px 9px}.modal textarea{resize:vertical}.w100{width:100%}.mono{font-family:ui-monospace,Menlo,monospace;font-size:13px}.modal fieldset{border:1px solid var(--bg-light);border-radius:8px;margin:0 0 4px;padding:10px}.modal fieldset legend{color:var(--dim);text-transform:uppercase;letter-spacing:.05em;padding:0 6px;font-size:11px}.cfgrow{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:6px;display:flex}.cfgrow input{background:var(--bg-darkest);color:var(--fg);border:none;border-radius:5px;flex:1;min-width:0;padding:5px 8px;font-size:12.5px}.cfgrow .cfgname{width:90px;color:var(--warn);flex:none;font-weight:600}.cfggrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px;display:grid}.cfggrid label,.cfgcol label{color:var(--dim);flex-direction:column;gap:3px;font-size:11px;display:flex}.cfggrid input{background:var(--bg-darkest);color:var(--fg);border:none;border-radius:5px;width:100%;padding:5px 8px}.cfgcol{margin-bottom:8px}.cfgcol textarea{background:var(--bg-darkest);color:var(--fg);font:inherit;border:none;border-radius:5px;width:100%;margin-top:4px;padding:5px 8px;font-size:12.5px}.presetbtn{background:var(--bg-light);color:var(--fg);cursor:pointer;border:1px solid #0000;border-radius:6px;flex:1;padding:7px 10px;font-size:13px}.presetbtn.active{background:var(--acc);color:#fff}.forkchip{white-space:nowrap;color:var(--dim);cursor:pointer;align-items:center;gap:4px;font-size:11.5px;display:flex}.dirlist{background:var(--bg-darkest);border-radius:6px;max-height:160px;padding:4px;overflow-y:auto}.direntry{cursor:pointer;border-radius:4px;padding:4px 8px;font-size:14px}.direntry:hover{background:var(--bg-light)}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return t(this.context.count)},getNextContextId(){return t(this.context.count++)}};function t(t){let n=String(t),r=n.length-1;return e.context.id+(r?String.fromCharCode(96+r):``)+n}function n(t){e.context=t}var r=(e,t)=>e===t,i=Symbol(`solid-track`),a={equals:r},o=null,s=ie,c=1,l=2,u={owned:null,cleanups:null,context:null,owner:null},d=null,f=null,p=null,m=null,h=null,g=0;function _(e,t){let n=p,r=d,i=e.length===0,a=t===void 0?r:t,o=i?u:{owned:null,cleanups:null,context:a?a.context:null,owner:a},s=i?e:()=>e(()=>S(()=>P(o)));d=o,p=null;try{return M(s,!0)}finally{p=n,d=r}}function v(e,t){t=t?Object.assign({},a,t):a;let n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0};return[k.bind(n),e=>(typeof e==`function`&&(e=f&&f.running&&f.sources.has(n)?e(n.tValue):e(n.value)),ee(n,e))]}function y(e,t,n){A(j(e,t,!1,c))}function b(e,t,n){s=ae;let r=j(e,t,!1,c),i=O&&D(O);i&&(r.suspense=i),(!n||!n.render)&&(r.user=!0),h?h.push(r):A(r)}function x(e,t,n){n=n?Object.assign({},a,n):a;let r=j(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,A(r),k.bind(r)}function S(e){if(p===null)return e();let t=p;p=null;try{return e()}finally{p=t}}function C(e){b(()=>S(e))}function w(e){return d===null||(d.cleanups===null?d.cleanups=[e]:d.cleanups.push(e)),e}var[T,E]=v(!1);function D(e){let t;return d&&d.context&&(t=d.context[e.id])!==void 0?t:e.defaultValue}var O;function k(){let e=f&&f.running;if(this.sources&&(e?this.tState:this.state)){if((e?this.tState:this.state)===c)A(this);else{let e=m;m=null,M(()=>oe(this),!1),m=e}}if(p){let e=this.observers;if(!e||e[e.length-1]!==p){let t=e?e.length:0;p.sources?(p.sources.push(this),p.sourceSlots.push(t)):(p.sources=[this],p.sourceSlots=[t]),e?(e.push(p),this.observerSlots.push(p.sources.length-1)):(this.observers=[p],this.observerSlots=[p.sources.length-1])}}return e&&f.sources.has(this)?this.tValue:this.value}function ee(e,t,n){let r=f&&f.running&&f.sources.has(e)?e.tValue:e.value;if(!e.comparator||!e.comparator(r,t)){if(f){let r=f.running;(r||!n&&f.sources.has(e))&&(f.sources.add(e),e.tValue=t),r||(e.value=t)}else e.value=t;e.observers&&e.observers.length&&M(()=>{for(let t=0;t<e.observers.length;t+=1){let n=e.observers[t],r=f&&f.running;r&&f.disposed.has(n)||((r?!n.tState:!n.state)&&(n.pure?m.push(n):h.push(n),n.observers&&N(n)),r?n.tState=c:n.state=c)}if(m.length>1e6)throw m=[],Error()},!1)}return t}function A(e){if(!e.fn)return;P(e);let t=g;te(e,f&&f.running&&f.sources.has(e)?e.tValue:e.value,t),f&&!f.running&&f.sources.has(e)&&queueMicrotask(()=>{M(()=>{f&&(f.running=!0),p=d=e,te(e,e.tValue,t),p=d=null},!1)})}function te(e,t,n){let r,i=d,a=p;p=d=e;try{r=e.fn(t)}catch(t){return e.pure&&(f&&f.running?(e.tState=c,e.tOwned&&e.tOwned.forEach(P),e.tOwned=void 0):(e.state=c,e.owned&&e.owned.forEach(P),e.owned=null)),e.updatedAt=n+1,ue(t)}finally{p=a,d=i}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&`observers`in e?ee(e,r,!0):f&&f.running&&e.pure?(f.sources.has(e)||(e.value=r),f.sources.add(e),e.tValue=r):e.value=r,e.updatedAt=n)}function j(e,t,n,r=c,i){let a={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:d,context:d?d.context:null,pure:n};return f&&f.running&&(a.state=0,a.tState=r),d===null||d!==u&&(f&&f.running&&d.pure?d.tOwned?d.tOwned.push(a):d.tOwned=[a]:d.owned?d.owned.push(a):d.owned=[a]),a}function ne(e){let t=f&&f.running;if((t?e.tState:e.state)===0)return;if((t?e.tState:e.state)===l)return oe(e);if(e.suspense&&S(e.suspense.inFallback))return e.suspense.effects.push(e);let n=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<g);){if(t&&f.disposed.has(e))return;(t?e.tState:e.state)&&n.push(e)}for(let r=n.length-1;r>=0;r--){if(e=n[r],t){let t=e,i=n[r+1];for(;(t=t.owner)&&t!==i;)if(f.disposed.has(t))return}if((t?e.tState:e.state)===c)A(e);else if((t?e.tState:e.state)===l){let t=m;m=null,M(()=>oe(e,n[0]),!1),m=t}}}function M(e,t){if(m)return e();let n=!1;t||(m=[]),h?n=!0:h=[],g++;try{let t=e();return re(n),t}catch(e){n||(h=null),m=null,ue(e)}}function re(e){if(m&&=(ie(m),null),e)return;let t;if(f){if(!f.promises.size&&!f.queue.size){let e=f.sources,n=f.disposed;h.push.apply(h,f.effects),t=f.resolve;for(let e of h)`tState`in e&&(e.state=e.tState),delete e.tState;f=null,M(()=>{for(let e of n)P(e);for(let t of e){if(t.value=t.tValue,t.owned)for(let e=0,n=t.owned.length;e<n;e++)P(t.owned[e]);t.tOwned&&(t.owned=t.tOwned),delete t.tValue,delete t.tOwned,t.tState=0}E(!1)},!1)}else if(f.running){f.running=!1,f.effects.push.apply(f.effects,h),h=null,E(!0);return}}let n=h;h=null,n.length&&M(()=>s(n),!1),t&&t()}function ie(e){for(let t=0;t<e.length;t++)ne(e[t])}function ae(t){let r,i=0;for(r=0;r<t.length;r++){let e=t[r];e.user?t[i++]=e:ne(e)}if(e.context){if(e.count){e.effects||=[],e.effects.push(...t.slice(0,i));return}n()}for(e.effects&&(e.done||!e.count)&&(t=[...e.effects,...t],i+=e.effects.length,delete e.effects),r=0;r<i;r++)ne(t[r])}function oe(e,t){let n=f&&f.running;n?e.tState=0:e.state=0;for(let r=0;r<e.sources.length;r+=1){let i=e.sources[r];if(i.sources){let e=n?i.tState:i.state;e===c?i!==t&&(!i.updatedAt||i.updatedAt<g)&&ne(i):e===l&&oe(i,t)}}}function N(e){let t=f&&f.running;for(let n=0;n<e.observers.length;n+=1){let r=e.observers[n];(t?!r.tState:!r.state)&&(t?r.tState=l:r.state=l,r.pure?m.push(r):h.push(r),r.observers&&N(r))}}function P(e){let t;if(e.sources)for(;e.sources.length;){let t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){let e=r.pop(),i=t.observerSlots.pop();n<r.length&&(e.sourceSlots[i]=n,r[n]=e,t.observerSlots[n]=i)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)P(e.tOwned[t]);delete e.tOwned}if(f&&f.running&&e.pure)se(e,!0);else if(e.owned){for(t=e.owned.length-1;t>=0;t--)P(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}f&&f.running?e.tState=0:e.state=0}function se(e,t){if(t||(e.tState=0,f.disposed.add(e)),e.owned)for(let t=0;t<e.owned.length;t++)se(e.owned[t])}function ce(e){return e instanceof Error?e:Error(typeof e==`string`?e:`Unknown error`,{cause:e})}function le(e,t,n){try{for(let n of t)n(e)}catch(e){ue(e,n&&n.owner||null)}}function ue(e,t=d){let n=o&&t&&t.context&&t.context[o],r=ce(e);if(!n)throw r;h?h.push({fn(){le(r,n,t)},state:c}):le(r,n,t)}var de=Symbol(`fallback`);function F(e){for(let t=0;t<e.length;t++)e[t]()}function fe(e,t,n={}){let r=[],a=[],o=[],s=0,c=t.length>1?[]:null;return w(()=>F(o)),()=>{let l=e()||[],u=l.length,d,f;return l[i],S(()=>{let e,t,i,m,h,g,v,y,b;if(u===0)s!==0&&(F(o),o=[],r=[],a=[],s=0,c&&=[]),n.fallback&&(r=[de],a[0]=_(e=>(o[0]=e,n.fallback())),s=1);else if(s===0){for(a=Array(u),f=0;f<u;f++)r[f]=l[f],a[f]=_(p);s=u}else{for(i=Array(u),m=Array(u),c&&(h=Array(u)),g=0,v=Math.min(s,u);g<v&&r[g]===l[g];g++);for(v=s-1,y=u-1;v>=g&&y>=g&&r[v]===l[y];v--,y--)i[y]=a[v],m[y]=o[v],c&&(h[y]=c[v]);for(e=new Map,t=Array(y+1),f=y;f>=g;f--)b=l[f],d=e.get(b),t[f]=d===void 0?-1:d,e.set(b,f);for(d=g;d<=v;d++)b=r[d],f=e.get(b),f!==void 0&&f!==-1?(i[f]=a[d],m[f]=o[d],c&&(h[f]=c[d]),f=t[f],e.set(b,f)):o[d]();for(f=g;f<u;f++)f in i?(a[f]=i[f],o[f]=m[f],c&&(c[f]=h[f],c[f](f))):a[f]=_(p);a=a.slice(0,s=u),r=l.slice(0)}return a});function p(e){if(o[f]=e,c){let[e,n]=v(f);return c[f]=n,t(l[f],e)}return t(l[f])}}}function I(e,t){return S(()=>e(t||{}))}var pe=e=>`Stale read from <${e}>.`;function L(e){let t=`fallback`in e&&{fallback:()=>e.fallback};return x(fe(()=>e.each,e.children,t||void 0))}function R(e){let t=e.keyed,n=x(()=>e.when,void 0,void 0),r=t?n:x(n,void 0,{equals:(e,t)=>!e==!t});return x(()=>{let i=r();if(i){let a=e.children;return typeof a==`function`&&a.length>0?S(()=>a(t?i:()=>{if(!S(r))throw pe(`Show`);return n()})):a}return e.fallback},void 0,void 0)}var z=e=>x(()=>e());function me(e,t,n){let r=n.length,i=t.length,a=r,o=0,s=0,c=t[i-1].nextSibling,l=null;for(;o<i||s<a;){if(t[o]===n[s]){o++,s++;continue}for(;t[i-1]===n[a-1];)i--,a--;if(i===o){let t=a<r?s?n[s-1].nextSibling:n[a-s]:c;for(;s<a;)e.insertBefore(n[s++],t)}else if(a===s)for(;o<i;)(!l||!l.has(t[o]))&&t[o].remove(),o++;else if(t[o]===n[a-1]&&n[s]===t[i-1]){let r=t[--i].nextSibling;e.insertBefore(n[s++],t[o++].nextSibling),e.insertBefore(n[--a],r),t[i]=n[a]}else{if(!l){l=new Map;let e=s;for(;e<a;)l.set(n[e],e++)}let r=l.get(t[o]);if(r!=null){if(s<r&&r<a){let c=o,u=1,d;for(;++c<i&&c<a&&(d=l.get(t[c]))!=null&&d===r+u;)u++;if(u>r-s){let i=t[o];for(;s<r;)e.insertBefore(n[s++],i)}else e.replaceChild(n[s++],t[o++])}else o++}else t[o++].remove()}}}var he=`_$DX_DELEGATE`;function ge(e,t,n,r={}){let i;return _(r=>{i=r,t===document?e():U(t,e(),t.firstChild?null:void 0,n)},r.owner),()=>{i(),t.textContent=``}}function B(e,t,n,r){let i,a=()=>{let t=r?document.createElementNS(`http://www.w3.org/1998/Math/MathML`,`template`):document.createElement(`template`);return t.innerHTML=e,n?t.content.firstChild.firstChild:r?t.firstChild:t.content.firstChild},o=t?()=>S(()=>document.importNode(i||=a(),!0)):()=>(i||=a()).cloneNode(!0);return o.cloneNode=o,o}function _e(e,t=window.document){let n=t[he]||(t[he]=new Set);for(let r=0,i=e.length;r<i;r++){let i=e[r];n.has(i)||(n.add(i),t.addEventListener(i,Ce))}}function V(e,t,n){Se(e)||(n==null?e.removeAttribute(t):e.setAttribute(t,n))}function H(e,t){Se(e)||(t==null?e.removeAttribute(`class`):e.className=t)}function ve(e,t,n,r){if(r)Array.isArray(n)?(e[`$$${t}`]=n[0],e[`$$${t}Data`]=n[1]):e[`$$${t}`]=n;else if(Array.isArray(n)){let r=n[0];e.addEventListener(t,n[0]=t=>r.call(e,n[1],t))}else e.addEventListener(t,n,typeof n!=`function`&&n)}function ye(e,t,n){if(!t)return n?V(e,`style`):t;let r=e.style;if(typeof t==`string`)return r.cssText=t;typeof n==`string`&&(r.cssText=n=void 0),n||={},t||={};let i,a;for(a in n)t[a]??r.removeProperty(a),delete n[a];for(a in t)i=t[a],i!==n[a]&&(r.setProperty(a,i),n[a]=i);return n}function be(e,t,n){n==null?e.style.removeProperty(t):e.style.setProperty(t,n)}function xe(e,t,n){return S(()=>e(t,n))}function U(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!=`function`)return W(e,t,r,n);y(r=>W(e,t(),r,n),r)}function Se(t){return!!e.context&&!e.done&&(!t||t.isConnected)}function Ce(t){if(e.registry&&e.events&&e.events.find(([e,n])=>n===t))return;let n=t.target,r=`$$${t.type}`,i=t.target,a=t.currentTarget,o=e=>Object.defineProperty(t,"target",{configurable:!0,value:e}),s=()=>{let e=n[r];if(e&&!n.disabled){let i=n[`${r}Data`];if(i===void 0?e.call(n,t):e.call(n,i,t),t.cancelBubble)return}return n.host&&typeof n.host!=`string`&&!n.host._$host&&n.contains(t.target)&&o(n.host),!0},c=()=>{for(;s()&&(n=n._$host||n.parentNode||n.host););};if(Object.defineProperty(t,"currentTarget",{configurable:!0,get(){return n||document}}),e.registry&&!e.done&&(e.done=_$HY.done=!0),t.composedPath){let e=t.composedPath();o(e[0]);for(let t=0;t<e.length-2&&(n=e[t],s());t++){if(n._$host){n=n._$host,c();break}if(n.parentNode===a)break}}else c();o(i)}function W(e,t,n,r,i){let a=Se(e);if(a){!n&&(n=[...e.childNodes]);let t=[];for(let e=0;e<n.length;e++){let r=n[e];r.nodeType===8&&r.data.slice(0,2)===`!$`?r.remove():t.push(r)}n=t}for(;typeof n==`function`;)n=n();if(t===n)return n;let o=typeof t,s=r!==void 0;if(e=s&&n[0]&&n[0].parentNode||e,o===`string`||o===`number`){if(a||o===`number`&&(t=t.toString(),t===n))return n;if(s){let i=n[0];i&&i.nodeType===3?i.data!==t&&(i.data=t):i=document.createTextNode(t),n=G(e,n,r,i)}else n=n!==``&&typeof n==`string`?e.firstChild.data=t:e.textContent=t}else if(t==null||o===`boolean`){if(a)return n;n=G(e,n,r)}else if(o===`function`)return y(()=>{let i=t();for(;typeof i==`function`;)i=i();n=W(e,i,n,r)}),()=>n;else if(Array.isArray(t)){let o=[],c=n&&Array.isArray(n);if(we(o,t,n,i))return y(()=>n=W(e,o,n,r,!0)),()=>n;if(a){if(!o.length)return n;if(r===void 0)return n=[...e.childNodes];let t=o[0];if(t.parentNode!==e)return n;let i=[t];for(;(t=t.nextSibling)!==r;)i.push(t);return n=i}if(o.length===0){if(n=G(e,n,r),s)return n}else c?n.length===0?Te(e,o,r):me(e,n,o):(n&&G(e),Te(e,o));n=o}else if(t.nodeType){if(a&&t.parentNode)return n=s?[t]:t;if(Array.isArray(n)){if(s)return n=G(e,n,r,t);G(e,n,null,t)}else n==null||n===``||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}return n}function we(e,t,n,r){let i=!1;for(let a=0,o=t.length;a<o;a++){let o=t[a],s=n&&n[e.length],c;if(o!=null&&o!==!0&&o!==!1){if((c=typeof o)==`object`&&o.nodeType)e.push(o);else if(Array.isArray(o))i=we(e,o,s)||i;else if(c===`function`){if(r){for(;typeof o==`function`;)o=o();i=we(e,Array.isArray(o)?o:[o],Array.isArray(s)?s:[s])||i}else e.push(o),i=!0}else{let t=String(o);s&&s.nodeType===3&&s.data===t?e.push(s):e.push(document.createTextNode(t))}}}return i}function Te(e,t,n=null){for(let r=0,i=t.length;r<i;r++)e.insertBefore(t[r],n)}function G(e,t,n,r){if(n===void 0)return e.textContent=``;let i=r||document.createTextNode(``);if(t.length){let r=!1;for(let a=t.length-1;a>=0;a--){let o=t[a];if(i!==o){let t=o.parentNode===e;!r&&!a?t?e.replaceChild(i,o):e.insertBefore(i,n):t&&o.remove()}else r=!0}}else e.insertBefore(i,n);return[i]}var K=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/;function Ee(e){return q(ke(e.replace(/\r\n/g,`
|
|
2
|
+
`)).split(`
|
|
3
|
+
`))}function q(e){let t=[],n=0;for(;n<e.length;){let o=e[n];if(/^```\w*\s*$/.test(o)){let r=[];for(n++;n<e.length&&!/^```\s*$/.test(e[n]);)r.push(e[n++]);n++,t.push(`<pre><code>${r.join(`
|
|
4
|
+
`)}</code></pre>`);continue}if(/^ {0,3}(?:-{3,}|\*{3,}|_{3,})\s*$/.test(o)){t.push(`<hr>`),n++;continue}let s=o.match(/^(#{1,6})\s+(.*)$/);if(s){t.push(`<h${s[1].length}>${a(s[2])}</h${s[1].length}>`),n++;continue}if(/^\s*>/.test(o)){let r=[];for(;n<e.length&&/^\s*>/.test(e[n]);)r.push(e[n++].replace(/^\s*>\s?/,``));t.push(`<blockquote>${q(r)}</blockquote>`);continue}if(o.includes(`|`)&&n+1<e.length&&Oe(e[n+1])){let r=De(e[n+1]).map(e=>e.startsWith(`:`)&&e.endsWith(`:`)?`center`:e.endsWith(`:`)?`right`:`left`),i=De(o);n+=2;let s=[];for(;n<e.length&&/\S/.test(e[n])&&e[n].includes(`|`);)s.push(De(e[n])),n++;let c=(e,t,n)=>{let i=r[t];return`<${n}${i&&i!==`left`?` style="text-align:${i}"`:``}>${a(e)}</${n}>`};t.push(`<div class="tbl"><table><thead><tr>${i.map((e,t)=>c(e,t,`th`)).join(``)}</tr></thead><tbody>${s.map(e=>`<tr>${e.map((e,t)=>c(e,t,`td`)).join(``)}</tr>`).join(``)}</tbody></table></div>`);continue}if(K.test(o)){t.push(i(r(o.match(K)[1])));continue}if(/^\s*$/.test(o)){n++;continue}let c=[];for(;n<e.length&&!/^\s*$/.test(e[n])&&!/^#{1,6}\s/.test(e[n])&&!/^```/.test(e[n])&&!/^ {0,3}(?:-{3,}|\*{3,}|_{3,})\s*$/.test(e[n])&&!/^\s*>/.test(e[n])&&!K.test(e[n])&&!(e[n].includes(`|`)&&n+1<e.length&&Oe(e[n+1]));)c.push(e[n++]);t.push(`<p>${c.map(a).join(`<br>`)}</p>`)}return t.join(`
|
|
5
|
+
`);function r(e){return e.replace(/\t/g,` `).length}function i(t){let o=null,s=[];for(;n<e.length;){let c=e[n].match(K);if(!c)break;let l=r(c[1]);if(l<t)break;let u=/^\d/.test(c[2]);if(o===null)o=u;else if(u!==o)break;n++;let d=c[3];for(;n<e.length&&/\S/.test(e[n])&&!K.test(e[n])&&!/^#{1,6}\s/.test(e[n])&&!/^```/.test(e[n])&&!/^\s*>/.test(e[n]);)d+=` `+e[n].trim(),n++;let f=``,p=e[n]?.match(K);p&&r(p[1])>l&&(f=i(r(p[1])));let m=d.match(/^\[( |x|X)\]\s+(.*)$/),h=m?`<input type="checkbox" disabled${m[1].toLowerCase()===`x`?` checked`:``}> `:``;s.push(`<li>${h}${a(m?m[2]:d)}${f}</li>`)}return o?`<ol>${s.join(``)}</ol>`:`<ul>${s.join(``)}</ul>`}function a(e){let t=[];return e=e.replace(/`([^`]+)`/g,(e,n)=>(t.push(`<code>${n}</code>`),`\u0000${t.length-1}\u0000`)),e=e.replace(/!\[([^\]]*)\]\((https?:\/\/[^)\s]+)(?:\s+"[^)]*")?\)/g,`<img src="$2" alt="$1" loading="lazy">`),e=e.replace(/\[([^\]]+)\]\((https?:\/\/[^)\s]+)(?:\s+"[^)]*")?\)/g,`<a href="$2" rel="noopener noreferrer" target="_blank">$1</a>`),e=e.replace(/(?<!["'=\w])(https?:\/\/[^\s<>"')\]]*[^\s<>"')\].,;:!?"')\]])/g,`<a href="$1">$1</a>`),e=e.replace(/\*\*\*([\s\S]+?)\*\*\*/g,`<strong><em>$1</em></strong>`),e=e.replace(/\*\*([\s\S]+?)\*\*/g,`<strong>$1</strong>`),e=e.replace(/(^|[^\w])__(?=\S)([\s\S]*?\S)__(?!\w)/g,`$1<strong>$2</strong>`),e=e.replace(/(^|[^\w*])\*(?!\s)([^*\n]+?)\*(?![\w*])/g,`$1<em>$2</em>`),e=e.replace(/(^|[^\w])_(?!\s)([^_\n]+?)_(?!\w)/g,`$1<em>$2</em>`),e=e.replace(/~~([\s\S]+?)~~/g,`<del>$1</del>`),e.replace(/\u0000(\d+)\u0000/g,(e,n)=>t[+n])}}function De(e){let t=e.trim();t.startsWith(`|`)&&(t=t.slice(1));let n=[],r=``;for(let e=0;e<t.length;e++){if(t[e]===`\\`&&t[e+1]===`|`){r+=`|`,e++;continue}if(t[e]===`|`&&e===t.length-1)break;if(t[e]===`|`){n.push(r.trim()),r=``;continue}r+=t[e]}return n.push(r.trim()),n.filter((e,r)=>!(e===``&&r===n.length-1&&t.endsWith(`|`)))}function Oe(e){let t=e.trim();if(!t.includes(`|`)||!t.includes(`-`))return!1;let n=De(t);return n.every(e=>/^:?-+:?$/.test(e))&&n.some(e=>e!==``)}function ke(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var Ae=`modulepreload`,je=function(e){return`/`+e},Me={},Ne=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=je(t,n),t=s(t),t in Me)return;Me[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Ae,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Pe=B(`<div class=overlay><div class=modal style=max-width:360px><div class=modal-head><b>🔒 sign in</b><span></span></div><form style=display:flex;flex-direction:column;gap:10px><input id=pw-input type=password placeholder=password autofocus><button type=submit style="background:var(--acc);border:none;border-radius:6px;color:#fff;padding:7px 12px;cursor:pointer">unlock</button><span class=muted style=font-size:11px>the token is stored locally and sent as Bearer to this server only`),Fe=B(`<br>`),Ie=B(`<span class="badge queued">⏳ <!> queued`),Le=B(`<span class="badge cron">⏰ `),Re=B(`<span class=sub>ℹ`),ze=B(`<header class=chan-head><span class=hash>#</span><span class=title></span><span></span><span class=sub> · <!>/<!> · turns <!> · tools </span><span style=margin-left:auto;display:flex;gap:4px><button class=iconbtn title="terminal (t)">⌨</button><button class=iconbtn title="toggle details panel (d)">▤`),Be=B(`<div class=divider-msg>── beginning of log ──`),Ve=B(`<div class=divider-msg>loading older events…`),He=B(`<details class=reasoning><summary>💭 reasoning</summary><div class=mono>`),Ue=B(`<div class=content>`),We=B(`<div class="msg live"><div class=avatar style="background:#5865f233;border:1px solid #5865f266">🫖</div><div class=msg-body><div class=msg-head><span class=author style=color:var(--acc)>agent</span><span class=ts>streaming…`),Ge=B(`<div class=feed>`),Ke=B(`<button class=jump>↓ `),qe=B(`<div class=termdrawer><div class=termbar><span>⌨ terminal — <span class=mono></span></span><button class=iconbtn title="close terminal (t)">✕</button></div><div class=termhost>`),Je=B(`<div class=cmds>`),Ye=B(`<label class=forkchip title="inherit the conversation prefix byte-exactly — the sub-agent's provider prefix cache starts warm"><input type=checkbox>fork ctx`),Xe=B(`<div class=composer><form><textarea rows=1></textarea><button type=submit>send</button></form><div class=hint>`),Ze=B(`<h3 title="identity + storage locations for this agent">🎛 session`),Qe=B(`<div class="card sesscard"><div class=sessrow><span class=k>agent</span><b></b><span></span></div><div class=sessrow><span class=k>workspace</span><span class="mono ellip"></span></div><div class=sessrow><span class=k>session</span><span class=mono>/`),$e=B(`<h3 title="switch provider/model live — applies from the agent's next turn; the list shows context window & pricing from the provider">🧦 model`),et=B(`<div class=meta style=color:var(--fg)>`),tt=B(`<div class=modelbox><select title="provider (OpenAI-compatible endpoint)"></select><div style=display:flex;gap:4px><input type=text list=model-list style=flex:1;min-width:0><datalist id=model-list></datalist><button title="apply to this session — takes effect from the agent's next turn">apply</button></div><div class=meta>current: `),nt=B(`<h3>⏯ controls`),rt=B(`<button class=danger title="interrupt: aborts the current LLM call; the running tool finishes first">■ stop`),it=B(`<button title="stop every sub-agent this agent spawned (descendants included)">⏹ subs`),at=B(`<div class=btnrow><button title="branch off the conversation here — try things without disturbing the main line">⑂ fork</button><button title="remove agent from teapot (session log stays on disk)">🗑 remove`),ot=B(`<div class=ctrlrow><label title="auto-continue fires after a round ONLY when all hold: ① this toggle is on ② a goal is set and its status is 'active' ③ the round ended cleanly (no error / not stopped). It stops when the goal is marked done, or if you press ■ stop. Sending any prompt also starts an idle agent regardless."><input type=checkbox>auto-continue</label><span class=muted>loops while goal is active · stops on done / stop`),st=B(`<h3>🎯 goal <span>`),ct=B(`<form style=display:flex;flex-direction:column;gap:6px;margin-bottom:6px><textarea id=goal-input rows=3 placeholder="set new goal…"style="background:var(--bg-darkest);border:none;border-radius:6px;padding:6px 8px;color:var(--fg);font:inherit;width:100%;resize:vertical"></textarea><div style=display:flex;justify-content:flex-end;align-items:center;gap:10px><label class=muted title="queue a harness prompt telling the agent about the new goal at its next turn boundary"style=display:flex;align-items:center;gap:4px;font-size:11.5px;white-space:nowrap;cursor:pointer><input id=goal-notify type=checkbox checked> notify agent</label><button type=submit style="background:var(--acc);border:none;border-radius:6px;color:#fff;padding:4px 12px;cursor:pointer">✓ save`),lt=B(`<div class=card>`),ut=B(`<div class=muted style=font-size:11px;margin-top:4px>stored with the session · the model reads it via get_goal() ·`),dt=B(`<h3 title="todo.md — saved to the session dir. With notify on, the agent is told at its next turn boundary and will work through these items">✅ tasks <span class=muted style=text-transform:none;letter-spacing:0>· todo.md, editable by you and the agent`),ft=B(`<textarea id=todo-input class=mono rows=5 placeholder="- task one
|
|
6
|
+
- 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">`),pt=B(`<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`),mt=B(`<h3 title="latest report_progress snapshot. The harness asks for one after real activity (time AND output gates); errors show under ⚠ problems">📈 progress`),ht=B(`<h3 title="tokens in/out are cumulative billed totals · cached % rode the provider prompt cache · context % turns orange ≥70% and red ≥85% of the model window">📊 runtime`),gt=B(`<div class="card muted">turns <!> · tools <!> · compacted <!>
|
|
7
|
+
tokens in/out <!>/`),_t=B(`<h3>🌿 branches <span class=muted style=text-transform:none;letter-spacing:0>· click to filter the feed`),vt=B(`<h3>⏰ schedule <span class=muted style=text-transform:none;letter-spacing:0>· cron tasks, all agents · edit in settings`),yt=B(`<div><nav class=sidebar><h1>🫖 teapot<span></span><span style=float:right;display:flex;gap:4px><button class=iconbtn title="new agent">+</button><button class=iconbtn title=settings>⚙</button></span></h1><div class=agent-list></div><div class=metrics></div></nav><section class=channel></section><aside>`),bt=B(`<span class=caret>`),xt=B(`<span class=subtag>🧩`),St=B(`<span class=mini-cron>⏰`),Ct=B(`<span title="goal done">✓`),wt=B(`<div><span></span><span>`),Tt=B(`<span class=caret-spacer>`),Et=B(`<div class=muted style=display:grid;place-items:center;height:100%>select an agent`),Dt=B(`<div class=muted style=display:grid;place-items:center;height:100%>no events yet — say something or press ▶ start`),Ot=B(`<div class="content muted">thinking…`),kt=B(`<div><b class=mono></b><span class=muted>`),At=B(`<div class=cmdrow><b>@</b><span class=muted>`),jt=B(`<option>`),Mt=B(`<button class=runbtn title="run toward the goal (starts the loop)">▶ start`),Nt=B(`<div class=muted>none yet — the harness asks for a report after real activity, and the agent can report_progress anytime`),Pt=B(`<div class=progrow><b>recent</b><span>`),Ft=B(`<div class="progrow warn"><b>⚠ problems</b><span>`),It=B(`<div class=progrow><b>next</b><span>`),Lt=B(`<div class=progrow><b>goal</b><span>`),Rt=B(`<div class="card prog"><div class=progrow><b>doing</b><span></span></div><div class="meta muted">`),zt=B(`<span>`),Bt=B(`<div><span></span><span> events`),Vt=B(`<div class=muted>no scheduled tasks — add them in ⚙ settings ("scheduled tasks")`),Ht=B(`<span title="runs on a forked branch so chatter stays off the main line">⑂`),Ut=B(`<div><div class=sched-top><b></b><span class=muted>@</span></div><div class="sched-meta mono"> → next </div><div class="sched-prompt muted">`),Wt=B(`<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)`),Gt=B(`<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`),Kt=B(`<div class=mono>`),qt=B(`<pre class="mono toolbody">`),Jt=B(`<div class=meta>ms`),Yt=B(`<div class=meta>waiting for output…`),Xt=B(`<div class=meta>`),Zt=B(`<div class=meta>writing…`),Qt=B(`<pre class="mono toolbody del">`),$t=B(`<pre class="mono toolbody add">`),en=B(`<div class=meta> · <!>ms`),tn=B(`<div class=meta>applying…`),nn=B(`<pre class="mono toolbody patch">`),rn=B(`<div>`),an=B(`<div class=meta>validating…`),on=B(`<a target=_blank rel="noopener noreferrer"referrerpolicy=no-referrer>open ↗`),sn=B(`<span class=muted>`),cn=B(`<div class=meta>loading…`),ln=B(`<div class=meta>bundled: `),J=B(`<div class=meta>saving…`),un=B(`<span class=actor>@`),dn=B(`<details><summary><b>⚙ </b><span class=meta>`),Y=B(`<div class=divider-msg>⑂ forked from <!> → `),fn=B(`<div class=divider-msg>🎯 goal <!>: `),pn=B(`<div class=divider-msg>✅ tasks updated (<!>)`),mn=B(`<div> → `),hn=B(`<div class=avatar>`),gn=B(`<button class=editbtn title="edit this prompt — forks the conversation here (later events are dropped or summarized)">✎ edit`),_n=B(`<div class=msg-head><span class=author></span><span class=ts></span><span class=ts>`),vn=B(`<div><div class=msg-body>`),yn=B(`<span style=width:38px>`),bn=B(`<div class=interrupted>⚠ interrupted — partial output kept`),xn=B(`<div class=msgfoot><span>copy summary`),Sn=B(`<details><summary><span class=meta></span></summary><div class=mono></div><div class=meta>ms`),Cn=B(`<div class="content muted">Rejected: `),wn=B(`<details class="embed decision"><summary><b>📌 </b><span class=meta>decision logged</span></summary><div class=content><b>Why:`),Tn=B(`<div class=qopts>`),En=B(`<div class="embed question"><div>❓ </div><div class=meta>the agent is waiting for your reply — answer below or tap an option`),Dn=B(`<button class=qopt>`),On=B(`<div class=meta>⚠ `),kn=B(`<div class=meta>→ `),X=B(`<div class=embed style=border-color:var(--ok)><div>📈 `),An=B(`<div class="embed fail"><div class=mono>⚠ `),jn=B(`<div class="content muted">`),Mn=B(`<button class=copybtn title="copy to clipboard">`),Nn=B(`<div class=overlay><div class=modal><div class=modal-head><b></b><button class=iconbtn>✕`),Pn=B(`<span style=color:var(--err);font-size:13px>`),Fn=B(`<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>↑</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 & start`),In=B(`<div class=direntry>📁 `),Ln=B(`<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></div><label>base url<input type=text class="w100 mono"></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"></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">`),Rn=B(`<button type=button>`),zn=B(`<label><input type=number min=0>`),Bn=B(`<form style=display:flex;flex-direction:column;gap:14px><fieldset><legend>providers</legend><button type=button>+ add provider</button><div><label style=display:flex;align-items:center;gap:6px;margin-top:6px>default provider<input type=text></label></div></fieldset><fieldset><legend>agent runtime</legend><div class=cfggrid></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><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`),Vn=B(`<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">✕`),Z=B(`<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">`),Hn=B(`<span class=muted>🧩 sub of @`),Un=B(`<div class=cfgrow><b></b><span class=muted>`),Wn={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`}},Gn={name:`harness`,icon:`📣`,color:`#3ba55d`},Kn=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`?Wn.prompt:t.startsWith(`scheduler:`)?{name:t.slice(10),icon:`📣`,color:`#3ba55d`}:Gn}return Wn[e.type]??{name:e.type,icon:`•`,color:`#9298a5`}},qn=new Set([`user`,`message`,`prompt`,`tool_call`,`tool_result`,`progress`,`state`,`error`,`fork`,`goal`,`todo`,`question`,`decision`]),Jn=e=>{let t=new Date(e);return`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`};async function Q(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=``;try{t=(await i.json())?.error??``}catch{}throw Error(t||`${e}: HTTP ${i.status}`)}return i.json()}var Yn=location.hash.match(/[#&]token=([^&]+)/);Yn&&(localStorage.setItem(`teapot.token`,decodeURIComponent(Yn[1])),history.replaceState(null,``,location.pathname+location.search));var Xn=()=>{let e=localStorage.getItem(`teapot.token`);return e?`?token=${encodeURIComponent(e)}`:``};function Zn(){let[e,t]=v([]),[n,r]=v(null),[i,a]=v([]),[o,s]=v(0),[c,l]=v([]),[u,d]=v(null),[f,p]=v(``),[m,h]=v({providers:{}}),[g,_]=v(!1),[S,T]=v(!1),[E,D]=v(localStorage.getItem(`teapot.panel`)===null?window.innerWidth>1100:localStorage.getItem(`teapot.panel`)===`1`),O=()=>{let e=!E();D(e),localStorage.setItem(`teapot.panel`,e?`1`:`0`)},[k,ee]=v(``),[A,te]=v(``),[j,ne]=v([]),M=()=>Object.keys(m().providers??{});async function re(e){if(e)try{let t=await Q(`/api/models?provider=${encodeURIComponent(e)}`);ne(t.models??[])}catch{ne([])}}let ie=()=>{let e=A().trim()||F()?.model||``;if(!e)return``;let t=j().find(t=>t.id===e);if(!t)return``;let n=[];t.contextLength&&n.push(`ctx ${rr(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(` · `)};b(()=>{let e=F();e&&(ee(e.provider||m().defaultProvider||M()[0]||``),te(``),re(k()))});let[ae,oe]=v(!0),[N,P]=v(0),[se,ce]=v(null),[le,ue]=v(``),de;b(()=>{if(!se()){clearTimeout(de),de=void 0,ue(``);return}de||=setTimeout(()=>{de=void 0,ue(se()?.text??``)},60)}),w(()=>clearTimeout(de)),b(()=>{le()&&ae()&&requestAnimationFrame(()=>{cn()&&ln(!0)})});let F=x(()=>e().find(e=>e.id===n())),[fe,pe]=v(null),[me,he]=v([]),ge=x(()=>{let e=new Map,t=new Set,n=new Map;for(let r of i())if(qn.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}}),B=x(()=>{let{consumed:e}=ge(),t=i().filter(t=>qn.has(t.type)?t.type===`tool_result`?!e.has(t.id):t.type!==`message`||String(t.data?.content??``).trim()!==``||String(t.data?.reasoning??``).trim()!==``||!!t.data?.final:!1),n=[];for(let e of t)if(e.type===`sub`){let t=e.data,r=String(t?.type??`message`);if(r===`state`)continue;n.push({...e,type:r,data:{...t?.data??{},actor:t?.sub}})}else n.push(e);let r=me().filter(e=>!n.some(t=>t.type===`prompt`&&t.data?.source===`user`&&t.data?.text===e.text&&new Date(t.ts).getTime()>=e.at-1e3)).map(e=>({id:e.id,seq:0,ts:new Date(e.at).toISOString(),session:F()?.session??``,branch:F()?.branch??`br0`,parent:null,type:`prompt`,data:{source:`user`,text:e.text,pending:!0}}));return[...n,...r]}),_e=()=>Q(`/api/config`).then(h).catch(()=>{}),[be,Se]=v(!1);C(()=>{let e=()=>Se(!0);window.addEventListener(`teapot:unauthorized`,e),w(()=>window.removeEventListener(`teapot:unauthorized`,e))});let[Ce,W]=v(``),[we,Te]=v(!1),G=``;b(()=>{let t=n(),r=e().find(e=>e.id===t)?.todo??``;t&&t!==G?(G=t,Te(!1),W(r)):t&&!we()&&W(r)});let K=async()=>{let e=document.getElementById(`todo-notify`)?.checked??!0;if(n())try{await Q(`/api/agents/${n()}/todo`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:Ce(),notify:e})}),Te(!1),X(`tasks saved${e&&Ce().trim()?` & notification queued`:``}`),q()}catch(e){X(`save failed: ${e.message}`)}},q=()=>Q(`/api/agents`).then(e=>t(e.agents)).catch(()=>{}),De=()=>Q(`/api/metrics`).then(d).catch(()=>{}),[Oe,ke]=v([]),Ae=()=>Q(`/api/tasks`).then(e=>ke(e.tasks)).catch(()=>{}),je=e=>Oe().filter(t=>t.agent===e),[Me,Kt]=v((()=>{try{return new Set(JSON.parse(localStorage.getItem(`teapot.collapsed`)??`[]`))}catch{return new Set}})()),qt=e=>{let t=new Set(Me());t.has(e)?t.delete(e):t.add(e),Kt(t),localStorage.setItem(`teapot.collapsed`,JSON.stringify([...t]))},Jt=x(()=>{let t=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).push(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&&!Me().has(r.id)&&a(e,t+1)}};return a(r,0),i}),[Yt,Xt]=v(null),Zt=new Map;function Qt(e){let t=Array(e.length);for(let n=0;n<e.length;n++){let r=e[n],i=Zt.get(r.id);if(t[n]=i??r,!i&&(Zt.set(r.id,r),Zt.size>3e3)){let e=Zt.keys().next().value;e!==void 0&&Zt.delete(e)}}return t}let[$t,en]=v(!1),[tn,nn]=v(!1);function rn(e){a(t=>{let n=new Map;for(let e of t)n.set(e.id,e);for(let t of Qt(e))n.has(t.id)||n.set(t.id,t);return[...n.values()].sort((e,t)=>e.seq-t.seq)})}async function an(){let e=n(),t=i()[0];if(!(!e||!t||$t()||tn())){en(!0);try{let n=sn(),r=n?.scrollHeight??0,i=n?.scrollTop??0,a=Yt(),o=(await Q(`/api/agents/${e}/events?limit=300&before=${encodeURIComponent(t.id)}${a?`&branch=${encodeURIComponent(a)}`:``}`)).events??[];if(o.length===0){nn(!0);return}rn(o),requestAnimationFrame(()=>{let e=sn();e&&(e.scrollTop=i+(e.scrollHeight-r))})}catch{}finally{en(!1)}}}async function on(e){try{let t=Yt(),[n,r,i]=await Promise.all([Q(`/api/agents/${e}/events?limit=300${t?`&branch=${encodeURIComponent(t)}`:``}`),Q(`/api/agents/${e}/branches`),Q(`/api/agents/${e}/skills`).catch(()=>({skills:[]}))]);a(e=>{let t=new Map;for(let n of e)t.set(n.id,n);for(let e of Qt(n.events))t.set(e.id,e);return[...t.values()].sort((e,t)=>e.seq-t.seq)}),s(n.total??n.events.length),l(r.branches),Bn(i.skills??[])}catch{}}function sn(){return document.querySelector(`.feed`)}function cn(){let e=sn();return!e||e.scrollHeight-e.scrollTop-e.clientHeight<80}function ln(e=!1){let t=sn();t&&(e||ae())&&(t.scrollTop=t.scrollHeight,P(0))}async function J(e,t=!0){r(e),ce(null),Xt(null),nn(!1),en(!1),he([]),localStorage.setItem(`teapot.session`,e),hn(e,t),Q(`/api/agents/${e}/load`,{method:`POST`}).then(q).catch(()=>{}),await on(e),requestAnimationFrame(()=>ln(!0))}let[un,dn]=v(!1),Y=null,fn=null;w(()=>Y?.close());function pn(){let e=location.protocol===`https:`?`wss://`:`ws://`;Y=new WebSocket(`${e}${location.host}/api/ws${Xn()}`),Y.onopen=()=>dn(!0),Y.onclose=()=>{dn(!1),setTimeout(pn,1500)},Y.onerror=()=>Y?.close();let t=new Set([`state`,`usage`,`session_start`]),r=null;Y.onmessage=e=>{let a=JSON.parse(e.data);if(a.kind!==`ping`&&a.kind!==`pong`){if(a.kind===`llm-delta`){r={id:a.agentId,at:Date.now()},a.agentId===n()&&ce({text:a.text??``,reasoning:a.reasoning??``});return}a.kind===`event`&&t.has(a.event?.type)||(fn||=setTimeout(async()=>{if(fn=null,await q(),await De(),n()){let e=i().at(-1)?.id,t=o(),a=Date.now();await on(n()),i().at(-1)?.id!==e&&(r?.id===n()&&r.at>=a||ce(null),cn()?ln(!0):P(N()+Math.max(0,o()-t))),he(e=>e.filter(e=>!i().some(t=>t.type===`prompt`&&t.data?.text===e.text&&new Date(t.ts).getTime()>=e.at-1e3)))}},400))}}}let mn=()=>decodeURIComponent(location.pathname.split(`/`)[2]??``);function hn(e,t=!0){let n=`/session/${encodeURIComponent(e)}`;t?history.pushState(null,``,n):history.replaceState(null,``,n)}window.addEventListener(`popstate`,()=>{let t=mn();t&&e().some(e=>e.id===t)&&t!==n()&&J(t,!1)}),b(()=>{let e=F();document.title=e?`${e.status===`running`?`▶ `:e.status===`error`?`⚠ `:``}${e.id} · teapot`:`teapot`}),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(g()){_(!1);return}if(S()){T(!1);return}let e=F();if(e?.status===`running`){Q(`/api/agents/${e.id}/stop`,{method:`POST`}).then(q);return}E()&&window.innerWidth<=1100&&D(!1);return}if(!(g()||S())){if(e.key===`/`)e.preventDefault(),document.querySelector(`.composer textarea`)?.focus();else if(e.key===`d`)O();else if(e.key===`t`)vn();else if(e.key===`ArrowDown`||e.key===`ArrowUp`){let t=Jt().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&&J(t[i].id)}}});let[gn,_n]=v(localStorage.getItem(`teapot.term`)===`1`),vn=()=>{let e=!gn();_n(e),localStorage.setItem(`teapot.term`,e?`1`:`0`)},yn=null,bn=null,xn=null,Sn=null,Cn={cols:0,rows:0},wn=null;function Tn(){Sn?.disconnect(),Sn=null,xn?.close(),xn=null,bn?.dispose(),bn=null}function En(e){Tn(),yn&&Promise.all([Ne(()=>import(`./xterm-C3BHN0de.js`),[]),Ne(()=>import(`./addon-fit-DIOBYJe3.js`),[])]).then(([{Terminal:t},{FitAddon:n}])=>{let r=new t({cursorBlink:!0,fontSize:12.5,fontFamily:`ui-monospace, Menlo, Consolas, monospace`,theme:{background:`#0d0e12`,foreground:`#dcdee4`}}),i=new n;r.loadAddon(i),r.open(yn),i.fit(),bn=r;let a=location.protocol===`https:`?`wss://`:`ws://`,o=new WebSocket(`${a}${location.host}/api/agents/${e}/term${Xn()}`);xn=o,o.onmessage=e=>{let t=JSON.parse(e.data);t.kind===`data`?r.write(t.data):t.kind===`exit`&&r.write(`\r\n\x1b[2m[terminal exited ${t.code??``}]\x1b[0m\r\n`)},r.onData(e=>{o.readyState===WebSocket.OPEN&&o.send(JSON.stringify({kind:`input`,data:e}))});let s=()=>{try{i.fit()}catch{}let{cols:e,rows:t}=r;(e!==Cn.cols||t!==Cn.rows)&&o.readyState===WebSocket.OPEN&&(Cn={cols:e,rows:t},o.send(JSON.stringify({kind:`resize`,cols:e,rows:t})))};Sn=new ResizeObserver(()=>{wn&&clearTimeout(wn),wn=setTimeout(s,300)}),Sn.observe(yn),setTimeout(s,50)})}b(()=>{let e=n();!gn()||!e?Tn():requestAnimationFrame(()=>e&&En(e))}),w(Tn),C(()=>{_e(),q().then(()=>{let t=mn()||localStorage.getItem(`teapot.session`)||``,n=e().find(e=>e.id===t)??e()[0];n&&J(n.id,!1)}),De(),Ae(),Nn(),pn();let t=setInterval(()=>{De(),Ae()},3e4);w(()=>clearInterval(t))});let[Dn,On]=v(``),kn,X=e=>{On(e),clearTimeout(kn),kn=setTimeout(()=>On(``),3200)},An=[{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`}],[jn,Mn]=v([]),Nn=()=>Q(`/api/personas`).then(e=>Mn(e.personas)).catch(()=>{}),[Pn,Fn]=v(!1),In=()=>{let e=f().match(/^@([A-Za-z0-9._-]*)$/);return e?e[1].toLowerCase():null},Ln=()=>{let t=In();return t===null?[]:[...jn().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))},Rn=new Set([`start`,`stop`,`fork`,`compact`]),[zn,Bn]=v([]),[Vn,Z]=v(-1),Hn=()=>{let e=f();if(!e.startsWith(`/`)||e.includes(`
|
|
8
|
+
`))return[];let t=e.match(/^\/([a-z]*)(?:\s+(.*))?$/i);if(!t)return[];let n=t[1].toLowerCase(),r=(t[3]??``).trim();if(!r&&n!==`skill`){let e=An.filter(e=>e.cmd.slice(1).startsWith(n));return e.find(e=>e.cmd.slice(1)===n)&&Rn.has(n)?[]:e.map(e=>({insert:e.cmd+` `,title:e.desc}))}if(n===`skill`){let e=zn().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[]},Un,Wn=()=>{Un&&(Un.style.height=`auto`,Un.style.height=`${Math.min(Un.scrollHeight,160)}px`)};b(()=>{f(),Wn()});let Gn=async(e,t)=>{let r=t??n();if(r)try{await Q(`/api/agents/${r}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:e,start:!0})}),he(t=>[...t,{id:`@p${Date.now()}${Math.random().toString(36).slice(2,6)}`,text:e,at:Date.now()}]),requestAnimationFrame(()=>ln(!0))}catch(t){p(e),console.error(`send failed:`,t)}},Kn=async t=>{t.preventDefault();let r=n(),i=f().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=jn().some(e=>e.key.toLowerCase()===r),s=e().some(e=>e.id.toLowerCase()===r);try{if(o){if(!a){X(`usage: @${r} <task>`);return}let e=await Q(`/api/agents/${n()}/spawn`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({persona:r,task:a,context:Pn()?`fork`:`none`})});X(`🧩 spawned ${e.id}${Pn()?` (forked context)`:``}`),q(),p(``)}else if(s){if(!a){X(`usage: @${r} <message>`);return}await Q(`/api/agents/${encodeURIComponent(r)}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:a,start:!0})}),X(`→ delivered to @${r}`),p(``)}else{X(`unknown @${r} — personas: ${jn().map(e=>e.key).join(`, `)||`(none)`}`);return}}catch(e){X(`@${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){p(`/goal `);return}if(t===`skill`&&!n){p(`/skill `);return}p(``),await Jn(t,n);return}p(``),await Gn(i)}},Jn=async(e,t)=>{let r=n();if(!r)return;let i=(e,t)=>Q(`/api/agents/${r}${e}`,{method:`POST`,headers:{"content-type":`application/json`},...t===void 0?{}:{body:JSON.stringify(t)}}).then(q);try{if(e===`start`)await i(`/start`);else if(e===`stop`)await i(`/stop`);else if(e===`fork`)await i(`/fork`,{}),await J(r);else if(e===`compact`){let e=await i(`/compact`);X(e?.ran?`context compacted`:`nothing to compact yet`)}else if(e===`goal`){if(!t){X(`usage: /goal <text>`);return}await i(`/goal`,{text:t,notify:!0}),X(`goal saved & notification queued`)}else if(e===`skill`){if(!t){X(`usage: /skill <name>`);return}await Gn(`[harness] Force-load and follow the skill "${t}" now: call load_skill("${t}") and execute its playbook for the current task.`),X(`skill "${t}" dispatched`)}else X(`unknown command "${e}" — /start /stop /fork /goal /skill /compact`)}catch(t){X(`/${e} failed: ${t.message}`)}},Yn=e=>()=>n()&&Q(`/api/agents/${n()}${e}`,{method:`POST`}).then(q),Zn=async e=>{e.preventDefault();let t=document.getElementById(`goal-input`),r=document.getElementById(`goal-notify`)?.checked??!0;!n()||!t.value.trim()||(await Q(`/api/agents/${n()}/goal`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:t.value,notify:r})}),t.value=``,q())};return[I(R,{get when(){return m()?.needsSetup},fallback:null,get children(){return I(cr,{onDone:()=>location.reload()})}}),I(R,{get when(){return be()},get children(){var e=Pe();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}}),I(R,{get when(){return!m()?.needsSetup},get children(){var o=yt(),s=o.firstChild,l=s.firstChild,d=l.firstChild.nextSibling,h=d.nextSibling.firstChild,g=h.nextSibling,v=l.nextSibling,b=v.nextSibling,x=s.nextSibling,S=x.nextSibling;return h.$$click=()=>{_e(),_(!0)},g.$$click=()=>{_e(),T(!0)},U(v,I(L,{get each(){return Jt()},children:({a:t,depth:r})=>(()=>{var i=wt(),a=i.firstChild,o=a.nextSibling;return i.$$click=()=>J(t.id),U(i,I(R,{get when(){return e().some(e=>e.parent===t.id)},get fallback(){return Tt()},get children(){var e=bt();return e.$$click=e=>{e.stopPropagation(),qt(t.id)},U(e,()=>Me().has(t.id)?`▸`:`▾`),y(()=>V(e,`title`,Me().has(t.id)?`expand sub-agents`:`collapse sub-agents`)),e}}),a),U(o,()=>t.id),U(i,I(R,{get when(){return t.parent},get children(){return xt()}}),null),U(i,I(R,{get when(){return je(t.id).length>0},get children(){var e=St();return y(()=>V(e,`title`,je(t.id).map(e=>`${e.id}: ${e.schedule}`).join(`
|
|
9
|
+
`))),e}}),null),U(i,I(R,{get when(){return t.goal.status===`done`},get children(){return Ct()}}),null),y(e=>{var o=`agent-item`+(t.id===n()?` sel`:``)+(r>0?` sub-row`:``),s=r>0?`padding-left:${10+r*14}px`:``,c=t.parent?`sub-agent of @${t.parent}`:void 0,l=`dot ${t.status}`;return o!==e.e&&H(i,e.e=o),e.t=ye(i,s,e.t),c!==e.a&&V(i,`title`,e.a=c),l!==e.o&&H(a,e.o=l),e},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()})),U(b,I(R,{get when(){return u()},get children(){return[`master rss `,z(()=>u().rssMb),`MB · heap `,z(()=>u().heapUsedMb),`MB`,Fe(),`load1 `,z(()=>u().loadavg1),` · up `,z(()=>Math.floor(u().uptimeSec/60)),`m`]}})),U(x,I(R,{get when(){return F()},get fallback(){return Et()},get children(){return[(()=>{var e=ze(),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,l=c.firstChild,u=l.nextSibling;return U(t,()=>F().id),U(n,()=>F().status),U(e,I(R,{get when(){return(F().pendingPrompts??0)>0},get children(){var e=Ie(),t=e.firstChild.nextSibling;return t.nextSibling,U(e,()=>F().pendingPrompts,t),y(()=>V(e,`title`,`${F().pendingPrompts} prompt(s) waiting — the agent picks them up at the next turn boundary`)),e}}),r),U(e,I(R,{get when(){return je(F().id).length>0},get children(){var e=Le();return e.firstChild,U(e,()=>je(F().id).length,null),y(()=>V(e,`title`,`scheduled tasks:\n${je(F().id).map(e=>`${e.schedule} · ${e.id}${e.forked?` (forked)`:``}`).join(`
|
|
10
|
+
`)}`)),e}}),r),U(r,()=>F().model,i),U(r,()=>F().session,a),U(r,()=>F().branch,o),U(r,()=>F().stats.turns,s),U(r,()=>F().stats.toolCalls,null),U(c,I(R,{get when(){return F().statusReason},get children(){var e=Re();return y(()=>V(e,`title`,F().statusReason)),e}}),l),l.$$click=vn,u.$$click=O,y(()=>H(n,`badge ${F().status}`)),e})(),(()=>{var e=Ge();return e.addEventListener(`scroll`,e=>{let t=e.currentTarget,r=cn();r&&N()&&P(0),oe(r),t.scrollTop<=4&&n()&&!$t()&&!tn()&&i().length>0&&an()}),U(e,I(R,{get when(){return z(()=>!!tn())()&&B().length>0},get children(){return Be()}}),null),U(e,I(R,{get when(){return $t()},get children(){return Ve()}}),null),U(e,I(R,{get when(){return B().length>0},get fallback(){return Dt()},get children(){return[I(L,{get each(){return B()},children:(e,t)=>I($n,{e,get prev(){return B()[t()-1]},get res(){return ge().resFor.get(e.id)},onOption:e=>void Gn(e),get onEdit(){return e.type===`prompt`&&e.data?.source===`user`?()=>pe({eventId:e.id,text:String(e.data?.text??``)}):void 0}})}),I(R,{get when(){return se()},get children(){var e=We(),t=e.firstChild.nextSibling;return t.firstChild,U(t,I(R,{get when(){return se().reasoning},get children(){var e=He(),t=e.firstChild.nextSibling;return U(t,()=>se().reasoning),e}}),null),U(t,I(R,{get when(){return le()},get fallback(){return Ot()},get children(){var e=Ue();return y(()=>e.innerHTML=Ee(le()+`▍`)),e}}),null),e}})]}}),null),e})(),I(R,{get when(){return!ae()||N()>0},get children(){var e=Ke();return e.firstChild,e.$$click=()=>ln(!0),U(e,(()=>{var e=z(()=>N()>0);return()=>e()?`${N()} new message${N()>1?`s`:``}`:`jump to present`})(),null),e}}),I(R,{get when(){return z(()=>!!gn())()&&F()},get children(){var e=qe(),t=e.firstChild,n=t.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling,a=t.nextSibling;return U(r,()=>F().workspace),i.$$click=vn,xe(e=>yn=e,a),e}}),(()=>{var e=Xe(),t=e.firstChild,n=t.firstChild,r=n.nextSibling,i=t.nextSibling;U(e,I(R,{get when(){return Hn().length>0},get children(){var e=Je();return U(e,I(L,{get each(){return Hn()},children:(e,t)=>(()=>{var n=kt(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>{p(e.insert),Z(-1)},U(r,()=>e.insert.trim()),U(i,()=>e.title),y(r=>{var i=`cmdrow`+(t()===Vn()?` active`:``),a=e.title;return i!==r.e&&H(n,r.e=i),a!==r.t&&V(n,`title`,r.t=a),r},{e:void 0,t:void 0}),n})()})),e}}),t),U(e,I(R,{get when(){return Ln().length>0},get children(){var e=Je();return U(e,I(L,{get each(){return Ln()},children:e=>(()=>{var t=At(),n=t.firstChild;n.firstChild;var r=n.nextSibling;return t.$$click=()=>{p(`@${e.key} `),Z(-1)},U(n,()=>e.key,null),U(r,()=>e.label),y(()=>V(t,`title`,e.label)),t})()})),e}}),t),t.addEventListener(`submit`,Kn),n.$$keydown=e=>{let t=Hn();if(t.length>0&&e.key===`ArrowDown`){e.preventDefault(),Z(e=>Math.min(e()+1,t.length-1));return}if(t.length>0&&e.key===`ArrowUp`){e.preventDefault(),Z(e=>Math.max(e()-1,0));return}if(t.length>0&&(e.key===`Tab`||e.key===`Enter`)&&!e.shiftKey&&Vn()>=0){e.preventDefault(),p(t[Vn()].insert),Z(-1);return}if(e.key===`Escape`&&t.length>0){Z(-1);return}e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),Kn(e))},n.$$input=e=>{p(e.currentTarget.value),Z(0),Wn()};var a=Un;return typeof a==`function`?xe(a,n):Un=n,U(t,I(R,{get when(){return z(()=>!!f().startsWith(`@`))()&&f().includes(` `)},get children(){var e=Ye(),t=e.firstChild;return t.addEventListener(`change`,e=>Fn(e.currentTarget.checked)),y(()=>t.checked=Pn()),e}}),r),U(i,()=>Dn()||`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(()=>V(n,`placeholder`,`message #${F().id} — / for commands`)),y(()=>n.value=f()),e})()]}})),U(S,I(R,{get when(){return F()},get children(){return[Ze(),(()=>{var e=Qe(),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 U(n,()=>F().id),U(r,()=>F().status),U(a,()=>F().workspace),U(o,()=>F().session,s),U(o,()=>F().branch,null),y(e=>{var t=`badge ${F().status}`,n=F().workspace;return t!==e.e&&H(r,e.e=t),n!==e.t&&V(a,`title`,e.t=n),e},{e:void 0,t:void 0}),e})(),$e(),(()=>{var e=tt(),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=>{ee(e.currentTarget.value),re(e.currentTarget.value)}),U(t,I(L,{get each(){return M()},children:e=>(()=>{var t=jt();return t.value=e,U(t,e,null),U(t,()=>e===m().defaultProvider?` ★`:``,null),t})()})),i.$$input=e=>te(e.currentTarget.value),U(a,I(L,{get each(){return j()},children:e=>(()=>{var t=jt();return y(()=>t.value=e.id),t})()})),o.$$click=async e=>{if(!n())return;let t=e.currentTarget;t.disabled=!0;try{await Q(`/api/agents/${n()}/model`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({provider:k(),model:A().trim()||void 0,contextWindowTokens:j().find(e=>e.id===(A().trim()||void 0))?.contextLength})}),t.textContent=`✓ applied`,q()}catch(e){alert(`model switch failed: ${e.message}`)}finally{setTimeout(()=>{t.textContent=`apply`,t.disabled=!1},1200)}},U(s,()=>F().model,null),U(s,I(R,{get when(){return j().length},get children(){return[` · `,z(()=>j().length),` models loaded`]}}),null),U(e,I(R,{get when(){return ie()},get children(){var e=et();return U(e,ie),e}}),null),y(()=>V(i,`placeholder`,F().model)),y(()=>t.value=k()),y(()=>i.value=A()),e})(),nt(),(()=>{var i=at(),o=i.firstChild,s=o.nextSibling;return U(i,I(R,{get when(){return F().status===`running`},get fallback(){return(()=>{var e=Mt();return ve(e,`click`,Yn(`/start`),!0),e})()},get children(){var e=rt();return ve(e,`click`,Yn(`/stop`),!0),e}}),o),o.$$click=()=>Q(`/api/agents/${F().id}/fork`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}).then(()=>J(F().id)),s.$$click=async()=>{let i=n();if(!i||!confirm(`remove agent ${i}? (log is kept)`))return;await Q(`/api/agents/${i}`,{method:`DELETE`}).catch(()=>{});let o=e().filter(e=>e.id!==i);t(o),o[0]?J(o[0].id):(r(null),a([]))},U(i,I(R,{get when(){return e().some(e=>e.parent===n())},get children(){var e=it();return e.$$click=async()=>{if(!n())return;let e=await Q(`/api/agents/${n()}/stop-children`,{method:`POST`});X(`stopped: ${(e.stopped??[]).join(`, `)||`(none)`}`),q()},e}}),null),i})(),(()=>{var e=ot(),t=e.firstChild.firstChild;return t.addEventListener(`change`,e=>{n()&&Q(`/api/agents/${n()}/auto-continue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({value:e.currentTarget.checked})}).then(q)}),y(()=>t.checked=F().autoContinue??!0),e})(),(()=>{var e=st(),t=e.firstChild.nextSibling;return U(t,()=>F().goal.status),y(()=>H(t,`badge ${F().goal.status===`done`?`done`:``}`)),e})(),(()=>{var e=ct();return e.addEventListener(`submit`,Zn),e})(),(()=>{var e=lt();return U(e,()=>F().goal.text||`no goal set — the agent has nothing to auto-continue toward`),e})(),(()=>{var e=ut();return e.firstChild,U(e,I(R,{get when(){return z(()=>!!F().goal.text)()&&F().goal.status===`active`},children:` auto-continue keeps it working until this is done`}),null),U(e,I(R,{get when(){return!F().goal.text},children:` set one and tick ▶ start to begin`}),null),e})(),dt(),(()=>{var e=ft();return e.$$input=e=>{W(e.currentTarget.value),Te(!0)},y(()=>e.value=Ce()),e})(),(()=>{var e=pt(),t=e.firstChild.nextSibling;return t.$$click=K,e})(),mt(),I(R,{get when(){return F().latestProgress},get fallback(){return Nt()},children:e=>(()=>{var t=Rt(),n=t.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling;return U(r,()=>e().doing),U(t,I(R,{get when(){return e().recent},get children(){var t=Pt(),n=t.firstChild.nextSibling;return U(n,()=>e().recent),t}}),i),U(t,I(R,{get when(){return e().problems},get children(){var t=Ft(),n=t.firstChild.nextSibling;return U(n,()=>e().problems),t}}),i),U(t,I(R,{get when(){return e().next},get children(){var t=It(),n=t.firstChild.nextSibling;return U(n,()=>e().next),t}}),i),U(t,I(R,{get when(){return e().goalStatus},get children(){var t=Lt(),n=t.firstChild.nextSibling;return U(n,()=>e().goalStatus),t}}),i),U(i,()=>nr(e().ts)),t})()}),ht(),(()=>{var e=gt(),t=e.firstChild.nextSibling,n=t.nextSibling.nextSibling,r=n.nextSibling.nextSibling,i=r.nextSibling.nextSibling;return i.nextSibling,U(e,()=>F().stats.turns,t),U(e,()=>F().stats.toolCalls,n),U(e,()=>F().stats.compactions??0,r),U(e,()=>rr(F().stats.inputTokens),i),U(e,()=>rr(F().stats.outputTokens),null),U(e,I(R,{get when(){return F().stats.cachedInputTokens>0},get children(){return[` · `,`cached `,z(()=>Math.round(F().stats.cachedInputTokens/Math.max(1,F().stats.inputTokens)*100)),`% (`,z(()=>rr(F().stats.cachedInputTokens)),`)`]}}),null),U(e,I(R,{get when(){return F().ctx},children:e=>{let t=j().find(e=>e.id===F().model);t?.contextLength;let n=e().window||t?.contextLength,r=n?Math.min(999,Math.round(e().usedTokens/n*100)):null,i=n?r>=85?` ctxcrit`:r>=70?` ctxwarn`:``:``;return[`
|
|
11
|
+
`,`context ~`,z(()=>rr(e().usedTokens)),` tok`,I(R,{get when(){return e().window||t?.contextLength},get children(){return[` · `,(()=>{var e=zt();return U(e,n?`${pct}% of {fmtK(effectiveWindow)} (model window)`:`${pct}% of {fmtK(c().window)} (budget)`),y(()=>H(e,i.trim())),e})()]}}),`
|
|
12
|
+
`,`compaction at ~`,z(()=>rr(e().compactAt)),` tok (older turns summarized)`]}}),null),e})(),_t(),I(L,{get each(){return c()},children:e=>(()=>{var t=Bt(),r=t.firstChild,i=r.nextSibling,a=i.firstChild;return t.$$click=()=>{let t=Yt()===e.branch?null:e.branch;Xt(t),n()&&on(n())},U(r,()=>e.branch,null),U(r,()=>e.branch===F().branch?` (current)`:``,null),U(i,()=>e.events,a),y(n=>{var r=`branch-row`+(e.branch===F().branch||e.branch===Yt()?` cur`:``),i=e.branch===Yt()?`click to show all branches again`:`show only ${e.branch}`;return r!==n.e&&H(t,n.e=r),i!==n.t&&V(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()}),vt(),I(R,{get when(){return Oe().length>0},get fallback(){return Vt()},get children(){return I(L,{get each(){return Oe()},children:e=>(()=>{var t=Ut(),r=t.firstChild,i=r.firstChild,a=i.nextSibling;a.firstChild;var o=r.nextSibling,s=o.firstChild,c=o.nextSibling;return t.$$click=()=>J(e.agent),U(i,()=>e.id),U(a,()=>e.agent,null),U(r,I(R,{get when(){return e.forked},get children(){return Ht()}}),null),U(o,()=>e.schedule,s),U(o,(()=>{var t=z(()=>!!e.next);return()=>t()?nr(e.next):`—`})(),null),U(o,(()=>{var t=z(()=>!!e.last);return()=>t()?` · last ${nr(e.last)}`:` · never ran`})(),null),U(c,()=>$(e.prompt,90)),y(r=>{var i=`sched-row`+(e.agent===n()?` cur`:``),a=`${$(e.prompt,200)}\nclick to open #${e.agent}`;return i!==r.e&&H(t,r.e=i),a!==r.t&&V(t,`title`,r.t=a),r},{e:void 0,t:void 0}),t})()})}})]}})),y(e=>{var t=`layout`+(E()?``:` right-hidden`),n=`conn`+(un()?` ok`:``),r=un()?`live (websocket)`:`reconnecting…`,i=`rightbar`+(E()?` open`:``);return t!==e.e&&H(o,e.e=t),n!==e.t&&H(d,e.t=n),r!==e.a&&V(d,`title`,e.a=r),i!==e.o&&H(S,e.o=i),e},{e:void 0,t:void 0,a:void 0,o:void 0}),o}}),I(R,{get when(){return g()},get children(){return I(or,{get providers(){return Object.keys(m().providers??{})},onClose:()=>_(!1),onCreated:e=>{_(!1),q(),J(e)}})}}),I(R,{get when(){return S()},get children(){return I(lr,{get cfg(){return m()},onClose:()=>T(!1),onSaved:()=>{_e(),Ae()}})}}),I(R,{get when(){return fe()},fallback:null,children:e=>{let t=()=>i().findIndex(t=>t.id===e().eventId),r=()=>Math.max(0,i().length-t()-1),[a,o]=v(r()>0?`summarize`:`discard`);return I(ar,{title:`edit prompt — forks the conversation`,onClose:()=>pe(null),get children(){var t=Gt(),i=t.firstChild,s=i.nextSibling,c=s.firstChild;return t.addEventListener(`submit`,async t=>{t.preventDefault();let r=document.getElementById(`edit-text`);try{await Q(`/api/agents/${n()}/edit-prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({eventId:e().eventId,text:r.value,tail:a()})}),pe(null),q(),n()&&await J(n())}catch(e){alert(`edit failed: ${e.message}`)}}),U(t,I(R,{get when(){return r()>0},get children(){var e=Wt(),t=e.firstChild,n=t.firstChild,i=t.nextSibling,s=i.firstChild,c=i.nextSibling.firstChild;return U(t,r,n),s.addEventListener(`change`,()=>o(`summarize`)),c.addEventListener(`change`,()=>o(`discard`)),y(()=>s.checked=a()===`summarize`),y(()=>c.checked=a()===`discard`),e}}),s),c.$$click=()=>pe(null),y(()=>i.value=e().text),t}})}})]}function Qn(e){let t=e.e,n=e.res,r=t.data??{},i=String(r.name??`tool`),a=()=>n?String(n.data?.result??``):``,o=i,s=``,c=(()=>{var e=Kt();return U(e,()=>tr(JSON.stringify(r.args??{},null,1),2e3)),e})(),l=e=>String(r.args?.[e]??``),u=(e,t=1500)=>(()=>{var n=qt();return U(n,()=>tr(e,t)),n})(),d=(e=4e3)=>n?[z(()=>u(a(),e)),(()=>{var e=Jt(),t=e.firstChild;return U(e,()=>n.data?.durationMs,t),U(e,()=>n.data?.ok===!1?` · FAILED`:``,null),U(e,I(ir,{get text(){return a()}}),null),e})()]:Yt();try{switch(i){case`bash`:{let e=l(`command`);o=`$ `+$(e,96),s=l(`timeout_ms`)?`timeout ${Math.round(Number(l(`timeout_ms`))/1e3)}s`:``,c=[z(()=>z(()=>e!==o.slice(2))()?u(e,800):null),z(()=>d(6e3))];break}case`read_file`:{o=l(`path`)||`(no path)`;let e=[];l(`pattern`)&&e.push(`grep /${$(l(`pattern`),40)}/`),Number(r.args?.offset)<0?e.push(`last ${-Number(r.args.offset)} lines`):r.args?.offset&&e.push(`from L${r.args.offset}`),r.args?.limit&&e.push(`≤${r.args.limit} lines`),s=e.join(` · `),c=d(6e3);break}case`write_file`:{let e=String(r.args?.content??``);o=l(`path`)||`(no path)`,s=`${e.length} bytes`,c=[z(()=>u(e)),n?(()=>{var e=Xt();return U(e,()=>$(a(),160)),e})():Zt()];break}case`edit_file`:o=l(`path`)||`(no path)`,s=r.args?.replace_all===!0?`replace all`:`unique spot`,c=[(()=>{var e=Qt();return U(e,()=>tr(`- `+l(`old_text`),900)),e})(),(()=>{var e=$t();return U(e,()=>`+ `+tr(l(`new_text`),900)),e})(),n?(()=>{var e=en(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,U(e,()=>$(a(),120),t),U(e,()=>n.data?.durationMs,r),e})():tn()];break;case`apply_patch`:{let e=l(`patch`).split(`
|
|
13
|
+
`).filter(e=>e&&!/^---$/.test(e.trim())),t=e.map(e=>e.match(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/)?.[1]).filter(Boolean);o=t.length?`${t.length} file${t.length>1?`s`:``}: ${$(t.join(`, `),80)}`:`patch`,c=[(()=>{var t=nn();return U(t,()=>e.map(e=>{let t=e.startsWith(`+`)?` add`:e.startsWith(`-`)?` del`:/^\*\*\*|^@@/.test(e)?` meta`:``;return(()=>{var n=rn();return H(n,`pline`+t),U(n,(()=>{var t=z(()=>e.length>240);return()=>t()?e.slice(0,240)+`…`:e})()),n})()})),t})(),n?(()=>{var e=Xt();return U(e,()=>$(a().split(`
|
|
14
|
+
`)[0]??``,140),null),U(e,()=>n.data?.ok===!1?` · FAILED`:``,null),e})():an()];break}case`list_dir`:o=l(`path`)||`.`,c=d(4e3);break;case`read_url`:{let e=l(`url`);try{let t=new URL(e);e=t.host+t.pathname}catch{}o=$(e,70),s=`web`,c=[(()=>{var e=Xt();return U(e,I(R,{get when(){return/^https?:/i.test(l(`url`))},get fallback(){return(()=>{var e=sn();return U(e,()=>$(l(`url`),80)),e})()},get children(){var e=on();return y(()=>V(e,`href`,l(`url`))),e}})),e})(),z(()=>d(3e3))];break}case`load_skill`:{o=`skill: ${l(`name`)}`;let e=a().replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,``);c=n?[(()=>{var t=Ue();return y(()=>t.innerHTML=Ee(e)),t})(),(()=>{var e=Jt(),t=e.firstChild;return U(e,()=>n.data?.durationMs,t),e})()]:cn();break}case`save_skill`:{o=`skill: ${l(`name`)}`,s=$(l(`description`),60);let e=Array.isArray(r.args?.files)?r.args.files.map(e=>e?.name).filter(Boolean):[];c=[z(()=>z(()=>!!e.length)()?(()=>{var t=ln();return t.firstChild,U(t,()=>e.join(`, `),null),t})():null),n?(()=>{var e=en(),t=e.firstChild,r=t.nextSibling;return r.nextSibling,U(e,()=>$(a(),160),t),U(e,()=>n.data?.durationMs,r),e})():J()];break}}}catch{}return(()=>{var e=dn(),r=e.firstChild,a=r.firstChild;a.firstChild;var l=a.nextSibling;return V(e,`title`,`${i}${s?` — `+s:``}`),U(a,o,null),U(r,I(R,{get when(){return t.data?.actor},get children(){var e=un();return e.firstChild,U(e,()=>String(t.data.actor),null),e}}),l),U(l,n?s||``:`running…`),U(e,c,null),y(()=>H(e,`embed`+(n?n.data?.ok===!1?` fail`:` done`:` running`))),e})()}function $n(e){let t=e.e,n=Kn(t),r=e.prev&&e.prev.type===t.type&&Kn(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=Y(),r=n.firstChild.nextSibling;return r.nextSibling,U(n,()=>String(e.fromBranch??`?`),r),U(n,()=>String(e.newBranch??t.branch),null),n})()}if(t.type===`goal`){let e=t.data??{},n=e.event===`status`?`marked ${String(e.status??``)}`:$(String(e.text??``),80);return(()=>{var t=fn(),r=t.firstChild.nextSibling;return r.nextSibling,U(t,()=>String(e.event??``),r),U(t,n,null),t})()}return t.type===`todo`?(()=>{var e=pn(),n=e.firstChild.nextSibling;return n.nextSibling,U(e,()=>String(t.data?.by??`human`),n),e})():t.type===`state`?t.data.from===t.data.to?null:(()=>{var e=mn(),n=e.firstChild;return U(e,()=>t.data.from,n),U(e,()=>t.data.to,null),U(e,(()=>{var e=z(()=>!!t.data.reason);return()=>e()?` — ${t.data.reason}`:``})(),null),y(()=>H(e,`divider-msg`+(t.data.to===`error`?` err`:``))),e})():(()=>{var i=vn(),a=i.firstChild;return U(i,I(R,{when:!r,get fallback(){return yn()},get children(){var e=hn();return U(e,()=>n.icon),y(t=>{var r=n.color+`33`,i=`1px solid ${n.color}66`;return r!==t.e&&be(e,`background`,t.e=r),i!==t.t&&be(e,`border`,t.t=i),t},{e:void 0,t:void 0}),e}}),a),U(a,I(R,{when:!r,get children(){var r=_n(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling;return U(i,()=>n.name),U(r,I(R,{get when(){return t.data?.actor},get children(){var e=un();return e.firstChild,U(e,()=>String(t.data.actor),null),e}}),a),U(a,(()=>{var e=z(()=>!!t.data?.pending);return()=>e()?`pending…`:Jn(t.ts)})()),U(o,()=>t.branch),U(r,I(R,{get when(){return e.onEdit},get children(){var t=gn();return t.$$click=t=>{t.stopPropagation(),e.onEdit()},t}}),null),y(e=>be(i,`color`,n.color)),r}}),null),U(a,I(er,{e:t,get res(){return e.res},get onOption(){return e.onOption}}),null),y(()=>H(i,`msg`+(r?` grouped`:``)+(t.data?.pending?` pending`:``))),i})()}function er(e){let t=e.e;switch(t.type){case`prompt`:return(()=>{var e=Ue();return y(()=>e.innerHTML=Ee(String(t.data.text??``))),e})();case`message`:return[I(R,{get when(){return z(()=>typeof t.data.reasoning==`string`)()&&t.data.reasoning.trim()},get children(){var e=He(),n=e.firstChild.nextSibling;return U(n,()=>String(t.data.reasoning)),e}}),(()=>{var e=Ue();return y(()=>e.innerHTML=Ee(String(t.data.content??``))),e})(),I(R,{get when(){return t.data.interrupted},get children(){return bn()}}),I(R,{get when(){return t.data.final},get children(){var e=xn(),n=e.firstChild;return U(e,I(ir,{get text(){return String(t.data.content??``)}}),n),e}})];case`tool_call`:return I(Qn,{e:t,get res(){return e.res}});case`tool_result`:{let e=String(t.data.result);return(()=>{var n=Sn(),r=n.firstChild,i=r.firstChild,a=r.nextSibling,o=a.nextSibling,s=o.firstChild;return U(i,()=>$(e,120)),U(r,I(ir,{text:e}),null),U(a,()=>tr(e,4e3)),U(o,()=>t.data.durationMs,s),U(o,()=>t.data.ok?``:` · FAILED`,null),y(()=>H(n,`embed`+(t.data.ok?``:` fail`))),n})()}case`decision`:{let e=Array.isArray(t.data?.alternatives)?t.data.alternatives:[];return(()=>{var n=wn(),r=n.firstChild,i=r.firstChild;i.firstChild;var a=r.nextSibling;return a.firstChild,U(i,()=>$(String(t.data?.decision??``),90),null),U(a,()=>String(t.data?.rationale??``),null),U(n,I(R,{get when(){return e.length},get children(){var t=Cn();return t.firstChild,U(t,()=>e.join(` / `),null),t}}),null),n})()}case`question`:{let n=Array.isArray(t.data?.options)?t.data.options:[];return(()=>{var r=En(),i=r.firstChild;i.firstChild;var a=i.nextSibling;return U(i,()=>String(t.data?.question??``),null),U(r,I(R,{get when(){return n.length>0},get children(){var r=Tn();return U(r,I(L,{each:n,children:n=>(()=>{var r=Dn();return r.$$click=()=>{let r=t.data?.actor;r?Q(`/api/agents/${encodeURIComponent(String(r))}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({text:n,start:!0})}).then(()=>flashHint(`→ answered @${String(t.data.actor)}`)).catch(()=>flashHint(`answer failed`)):e.onOption?.(n)},U(r,n),r})()})),r}}),a),r})()}case`progress`:return(()=>{var e=X(),n=e.firstChild;return n.firstChild,U(n,()=>String(t.data.doing??``),null),U(e,I(R,{get when(){return t.data.recent},get children(){var e=Xt();return U(e,()=>String(t.data.recent)),e}}),null),U(e,I(R,{get when(){return t.data.problems},get children(){var e=On();return e.firstChild,U(e,()=>String(t.data.problems),null),e}}),null),U(e,I(R,{get when(){return t.data.next},get children(){var e=kn();return e.firstChild,U(e,()=>String(t.data.next),null),e}}),null),e})();case`error`:return(()=>{var e=An(),n=e.firstChild;return n.firstChild,U(n,()=>String(t.data.message??``),null),e})();default:return(()=>{var e=jn();return U(e,()=>tr(JSON.stringify(t.data),200)),e})()}}function tr(e,t){return e.length>t?e.slice(0,t)+` …`:e}function nr(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 rr(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 $(e,t){return tr(e.replace(/\s+/g,` `).trim(),t)}function ir(e){let[t,n]=v(!1);return(()=>{var r=Mn();return r.$$click=t=>{t.stopPropagation(),navigator.clipboard.writeText(e.text).then(()=>{n(!0),setTimeout(()=>n(!1),900)})},U(r,()=>t()?`✓`:`⧉`),r})()}function ar(e){return(()=>{var t=Nn(),n=t.firstChild,r=n.firstChild.firstChild,i=r.nextSibling;return t.$$click=t=>t.target===t.currentTarget&&e.onClose(),U(r,()=>e.title),ve(i,`click`,e.onClose,!0),U(n,()=>e.children,null),t})()}function or(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 t=await Q(`/api/fs${e?`?path=${encodeURIComponent(e)}`:``}`);n(t.path),i(t.entries)}C(()=>p(t()));let m=async n=>{n.preventDefault(),f(``);try{let n=await Q(`/api/agents`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({workspace:t(),id:a(),provider:s()||void 0,model:l()||void 0})});e.onCreated(n.agent.id)}catch(e){f(String(e.message))}};return I(ar,{title:`new agent`,get onClose(){return e.onClose},get children(){var i=Fn(),f=i.firstChild,h=f.firstChild.nextSibling.firstChild,g=h.nextSibling,_=g.nextSibling,v=f.nextSibling,b=v.nextSibling,x=b.firstChild,S=x.firstChild.nextSibling,C=x.nextSibling,w=C.firstChild.nextSibling,T=C.nextSibling.firstChild.nextSibling,E=b.nextSibling;return i.addEventListener(`submit`,m),h.$$input=e=>n(e.currentTarget.value),g.$$click=()=>p(t()),_.$$click=()=>p(`..`),U(v,I(L,{get each(){return r()},children:e=>(()=>{var n=In();return n.firstChild,n.$$click=()=>p(`${t()}/${e}`.replace(/\/+/g,`/`)),U(n,e,null),n})()})),S.$$input=e=>o(e.currentTarget.value),w.addEventListener(`change`,e=>c(e.currentTarget.value)),U(w,I(L,{get each(){return e.providers},children:e=>(()=>{var t=jt();return U(t,e),t})()})),T.$$input=e=>u(e.currentTarget.value),U(i,I(R,{get when(){return d()},get children(){var e=Pn();return U(e,d),e}}),E),y(()=>h.value=t()),y(()=>S.value=a()),y(()=>w.value=s()),y(()=>T.value=l()),i}})}var sr=[{key:`openrouter`,label:`OpenRouter`,url:`https://openrouter.ai/api/v1`,model:`anthropic/claude-sonnet-4`},{key:`openai`,label:`OpenAI`,url:`https://api.openai.com/v1`,model:`gpt-4o-mini`},{key:`ollama`,label:`Ollama (local)`,url:`http://localhost:11434/v1`,model:`qwen3-coder`}];function cr(e){let[t,n]=v(sr[0]),[r,i]=v(sr[0].url),[a,o]=v(``),[s,c]=v(sr[0].model),[l,u]=v(`~/teapot-workspace`),[d,f]=v(``),[p,m]=v(!1),[h,g]=v(``),_=e=>{n(e),e.url&&(i(e.url),c(e.model))},b=async t=>{t.preventDefault(),g(``),m(!0);try{await Q(`/api/setup`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({baseUrl:r(),apiKey:a()||void 0,model:s(),workspace:l(),...d()?{password:d()}:{}})}),e.onDone()}catch(e){g(e.message),m(!1)}};return(()=>{var e=Ln(),n=e.firstChild.firstChild.nextSibling.nextSibling,m=n.firstChild,g=m.nextSibling,v=g.firstChild.nextSibling,x=g.nextSibling,S=x.firstChild.nextSibling,C=x.nextSibling,w=C.firstChild.nextSibling,T=C.nextSibling,E=T.firstChild.nextSibling,D=E.firstChild.nextSibling,O=E.nextSibling.firstChild.nextSibling,k=T.nextSibling;return n.addEventListener(`submit`,b),U(m,I(L,{each:sr,children:e=>(()=>{var n=Rn();return n.$$click=()=>_(e),U(n,()=>e.label),y(()=>H(n,`presetbtn`+(t().key===e.key?` active`:``))),n})()})),v.$$input=e=>i(e.currentTarget.value),S.$$input=e=>o(e.currentTarget.value),w.$$input=e=>c(e.currentTarget.value),D.$$input=e=>u(e.currentTarget.value),O.$$input=e=>f(e.currentTarget.value),U(n,I(R,{get when(){return h()},get children(){var e=Pn();return U(e,h),e}}),k),U(k,()=>p()?`saving…`:`finish setup`),y(()=>k.disabled=p()),y(()=>v.value=r()),y(()=>S.value=a()),y(()=>w.value=s()),y(()=>D.value=l()),y(()=>O.value=d()),e})()}function lr(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(Math.round((e.cfg.contextTokenBudget??96e3)/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},C=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 Q(`/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()),contextTokenBudget:Math.max(1e3,l())*1e3,...d()>0?{contextWindowTokens:d()*1e3}:{},maxSpawnDepth:Math.max(0,p()),tasks:i})}),e.onSaved(),e.onClose()}catch(e){b(e.message)}},w=(e,t,n,r)=>(()=>{var i=zn(),a=i.firstChild;return V(i,`title`,r),U(i,e,a),a.$$input=e=>n(Number(e.currentTarget.value)),a.value=t,i})();return I(ar,{title:`settings`,get onClose(){return e.onClose},get children(){var v=Bn(),b=v.firstChild,S=b.firstChild.nextSibling,T=S.nextSibling.firstChild.firstChild.nextSibling,E=b.nextSibling,D=E.firstChild.nextSibling,O=E.nextSibling,k=O.firstChild.nextSibling,ee=O.nextSibling;ee.firstChild;var A=ee.nextSibling;return v.addEventListener(`submit`,C),U(b,I(L,{get each(){return t()},children:(e,r)=>(()=>{var i=Vn(),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})()}),S),S.$$click=()=>n([...t(),{name:``,baseUrl:``,apiKey:``,model:``}]),T.$$input=e=>i(e.currentTarget.value),U(D,()=>w(`progress interval (min)`,a(),e=>o(e),`how often the harness asks for a progress report`),null),U(D,()=>w(`progress min chars`,s(),e=>c(e),`progress prompts wait for this much real output`),null),U(D,()=>w(`compact budget (k tok)`,l(),e=>u(e),`auto-compact when estimated context exceeds this`),null),U(D,()=>w(`context window (k tok)`,d(),e=>f(e),`model's real window — 0/blank hides the % gauge`),null),U(D,()=>w(`max spawn depth`,p(),e=>m(e),`sub-agent nesting limit (0 = no spawning)`),null),U(O,I(R,{get when(){return h().length>0},get children(){return I(L,{get each(){return h()},children:(e,t)=>(()=>{var n=Z(),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})()})}}),k),k.$$click=()=>g([...h(),{id:``,agent:x()[0]??``,schedule:`every 30m`,prompt:``}]),U(ee,I(L,{get each(){return e.cfg.agents??[]},children:e=>(()=>{var t=Un(),n=t.firstChild,r=n.nextSibling;return U(n,()=>e.id),U(r,()=>e.workspace),U(t,I(R,{get when(){return e.parent},get children(){var t=Hn();return t.firstChild,U(t,()=>e.parent,null),t}}),null),t})()}),null),U(v,I(R,{get when(){return _()},get children(){var e=Pn();return U(e,_),e}}),A),y(()=>T.value=r()),v}})}_e([`click`,`input`,`keydown`]),ge(()=>I(Zn,{}),document.getElementById(`root`));
|
|
15
|
+
//# sourceMappingURL=index-_IZWOALZ.js.map
|