agentglow 0.2.11 → 0.2.12

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.
@@ -0,0 +1,3121 @@
1
+ var Mr = Object.defineProperty;
2
+ var xr = (e, t, n) => t in e ? Mr(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
+ var _e = (e, t, n) => xr(e, typeof t != "symbol" ? t + "" : t, n);
4
+ import { jsx as p, jsxs as E, Fragment as ye } from "react/jsx-runtime";
5
+ import { Text as En, OrbitControls as wr } from "@react-three/drei";
6
+ import { useThree as dt, useFrame as be, Canvas as kr } from "@react-three/fiber";
7
+ import { useSyncExternalStore as it, createContext as xs, useRef as U, useMemo as ne, useEffect as $, Suspense as Sr, useImperativeHandle as Or, useContext as ws, useState as le, useLayoutEffect as Er, useCallback as ks, Fragment as Rr } from "react";
8
+ import * as M from "three";
9
+ import { u as un, T as Vr } from "./index-B0urBeRS.js";
10
+ var Ms;
11
+ const rt = typeof window < "u" && !!((Ms = window.matchMedia) != null && Ms.call(window, "(prefers-reduced-motion: reduce)").matches), g = {
12
+ plane: "xy",
13
+ agents: /* @__PURE__ */ new Map(),
14
+ runs: /* @__PURE__ */ new Map(),
15
+ mcp: /* @__PURE__ */ new Map(),
16
+ /** active cluster lanes (grouped mode): eased stage positions by lane */
17
+ clusterPos: [],
18
+ clusterTarget: [],
19
+ clusterFresh: [],
20
+ graph: {
21
+ pos: new M.Vector3(),
22
+ target: new M.Vector3(),
23
+ radius: 2.6,
24
+ natural: 1,
25
+ scale: 0,
26
+ out: new M.Vector3(-1, 0, 0),
27
+ mix: 0,
28
+ fresh: !0
29
+ },
30
+ /** eased half extents of the core (agents + clusters) in the 2D layout plane (world units) */
31
+ core: { hw: 4, hh: 4, r: 4, thw: 4, thh: 4 },
32
+ /** bump when the corresponding list membership changes (slot lists re-render) */
33
+ agentsVersion: 0,
34
+ runsVersion: 0,
35
+ mcpVersion: 0,
36
+ /** the theme's GraphResource wants to draw (session has a graph AND the galaxy has nodes) */
37
+ graphWanted: !1,
38
+ /** visible runs, oldest first (rebuilt when runsVersion bumps) */
39
+ runOrder: []
40
+ };
41
+ function ce(e, t, n) {
42
+ return g.plane === "xy" ? n.set(e, t, 0) : n.set(e, 0, -t);
43
+ }
44
+ function bc(e, t, n, s) {
45
+ return s.copy(e.origin).addScaledVector(e.side, t - e.cu).addScaledVector(e.axis, n - e.cv);
46
+ }
47
+ function vc(e) {
48
+ var t;
49
+ return (t = g.agents.get(e)) == null ? void 0 : t.live;
50
+ }
51
+ function yc(e) {
52
+ var t;
53
+ return (t = g.mcp.get(e)) == null ? void 0 : t.pos;
54
+ }
55
+ function Mc(e, t) {
56
+ var n, s;
57
+ return (s = (n = g.mcp.get(e)) == null ? void 0 : n.backends.get(t)) == null ? void 0 : s.pos;
58
+ }
59
+ function xc(e, t) {
60
+ const n = g.graph;
61
+ return t.copy(e).multiplyScalar(n.scale).add(n.pos);
62
+ }
63
+ function wc(e, t) {
64
+ const n = g.graph;
65
+ return t.copy(e).sub(n.pos).divideScalar(Math.max(1e-4, n.scale));
66
+ }
67
+ let Cr = 0;
68
+ const kt = () => ++Cr, Ce = (e) => [Math.round(e.x * 100) / 100, Math.round(e.y * 100) / 100, Math.round(e.z * 100) / 100];
69
+ function Rn() {
70
+ return {
71
+ plane: g.plane,
72
+ agents: [...g.agents.values()].map((e) => ({ id: e.id, run: e.run.id, depth: e.depth, scale: Math.round(e.scale * 100) / 100, pos: Ce(e.pos) })),
73
+ runs: g.runOrder.map((e) => ({ id: e.id, members: e.members, origin: Ce(e.origin), hu: e.hu, hv: e.hv })),
74
+ mcp: [...g.mcp.values()].map((e) => ({ name: e.name, wanted: e.wanted, mix: Math.round(e.mix * 100) / 100, pos: Ce(e.pos), backends: [...e.backends.values()].map((t) => ({ res: t.res.name, mix: Math.round(t.mix * 100) / 100, pos: Ce(t.pos) })) })),
75
+ clusters: g.clusterPos.map(Ce),
76
+ core: { ...g.core },
77
+ graph: { wanted: g.graphWanted, pos: Ce(g.graph.pos), out: Ce(g.graph.out), radius: g.graph.radius, scale: g.graph.scale, mix: g.graph.mix }
78
+ };
79
+ }
80
+ typeof window < "u" && (Object.defineProperties(g, { toJSON: { value: Rn, enumerable: !1 }, summary: { value: Rn, enumerable: !1 } }), window.__agentglowKit = g);
81
+ const Ss = [
82
+ { type: "planner", label: "Planner", color: "#a78bfa" },
83
+ { type: "researcher", label: "Researcher", color: "#fbbf24" },
84
+ { type: "graph_scout", label: "Graph Scout", color: "#22d3ee" },
85
+ { type: "records_scout", label: "Records Scout", color: "#f472b6" },
86
+ { type: "data_scout", label: "Data Scout", color: "#fb7185" },
87
+ { type: "writer", label: "Writer", color: "#4ade80" }
88
+ ], Ne = Object.fromEntries(Ss.map((e) => [e.type, e.color]));
89
+ Object.fromEntries(Ss.map((e) => [e.type, e.label]));
90
+ const Os = [0, 1, 2], Tr = 6, St = ["#818cf8", "#f472b6", "#34d399", "#fb923c", "#38bdf8", "#e879f9"], kc = {
91
+ Customer: "#f59e0b",
92
+ Account: "#38bdf8",
93
+ Incident: "#22c55e",
94
+ Ticket: "#a78bfa",
95
+ Product: "#f472b6",
96
+ Region: "#ef4444",
97
+ Metric: "#facc15",
98
+ Team: "#2dd4bf",
99
+ Business: "#f59e0b",
100
+ Address: "#38bdf8",
101
+ Resolution: "#22c55e",
102
+ Meeting: "#a78bfa",
103
+ Hearing: "#f472b6",
104
+ Agency: "#ef4444",
105
+ Topic: "#facc15",
106
+ Committee: "#2dd4bf"
107
+ }, Es = 450, zr = 4e3, Rs = 1100, Pr = 6e4;
108
+ function Vs(e) {
109
+ return e.endAt ? Math.max(e.endAt, e.startAt + zr) : 0;
110
+ }
111
+ function Vn(e, t = performance.now()) {
112
+ const n = Math.min(1, Math.max(0, (t - e.startAt) / Es)), s = Vs(e), o = s ? Math.min(1, Math.max(0, 1 - (t - s) / Rs)) : 1;
113
+ return n * (2 - n) * o * o * (3 - 2 * o);
114
+ }
115
+ function Cn(e, t) {
116
+ return Math.min(Math.max(e.stepOrder.indexOf(t), 0), Os.length - 1);
117
+ }
118
+ function Cs(e, t) {
119
+ return t < Os.length - 1 ? e.stepOrder.slice(t, t + 1) : e.stepOrder.slice(t);
120
+ }
121
+ function Sc(e, t) {
122
+ const n = Cs(e, t).map((s) => e.steps[s]);
123
+ return n.length ? n.includes("running") ? "running" : n.includes("failed") ? "failed" : n.every((s) => s === "done") ? "done" : "queued" : "queued";
124
+ }
125
+ function Oc(e, t) {
126
+ const n = Cs(e, t);
127
+ return n.length < 2 ? n[0] ?? "" : `${n.find((o) => e.steps[o] === "running") ?? n[n.length - 1]} +${n.length - 1}`;
128
+ }
129
+ function Ts(e) {
130
+ for (const t of e.stepOrder) if (e.waits[t] && e.steps[t] === "running") return { step: t, ...e.waits[t] };
131
+ return null;
132
+ }
133
+ const Tn = (e) => new Date(e).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
134
+ function at(e, t = Date.now()) {
135
+ const n = e.until ? Math.abs(e.until - t) < 72e6 ? Tn(e.until) : `${new Date(e.until).toLocaleDateString([], { month: "short", day: "numeric" })}, ${Tn(e.until)}` : "";
136
+ return e.reason === "sleep" ? n ? `sleeping until ${n}` : "sleeping" : `waiting on ${e.reason}${n ? ` (until ${n})` : ""}`;
137
+ }
138
+ function zs(e, t = Tr) {
139
+ const n = e.stepOrder.length, s = n > t ? t - 1 : n;
140
+ return { shown: e.stepOrder.slice(0, s), more: n - s };
141
+ }
142
+ const Wr = {
143
+ warehouse: "#f97316",
144
+ search: "#22d3ee",
145
+ github: "#e5e7eb",
146
+ slack: "#e879f9",
147
+ "google-drive": "#facc15",
148
+ analytics: "#06b6d4"
149
+ }, dn = (e) => e.doneAt > 0, te = (e) => !e.doneAt && !e.exitAt, Ir = 12e4, Ps = 3e3, Ws = 2500, en = 6e3, Pt = { fadeMs: (e) => Ws }, Ec = (e) => Pt.fadeMs(e), f = {
150
+ runs: /* @__PURE__ */ new Map(),
151
+ instances: /* @__PURE__ */ new Map(),
152
+ comets: [],
153
+ flares: [],
154
+ /**
155
+ * MCP servers agents have CALLED (an `mcp` event). Registration alone (`mcp_register`) does not add one here:
156
+ * it only fills mcpRegistry (names / backend kinds) so a newly used server looks right immediately.
157
+ * Visibility over time: mcpWanted(srv) (shown while used, hidden after MCP_IDLE_MS idle).
158
+ */
159
+ mcpServers: /* @__PURE__ */ new Map(),
160
+ /** registered (not necessarily used) MCP servers: server -> backend name -> kind */
161
+ mcpRegistry: /* @__PURE__ */ new Map(),
162
+ mcpCalls: [],
163
+ /** in-flight MCP calls keyed `${instance}|${server}|${tool}`; resolvedAt kept briefly for a "snap back" effect */
164
+ mcpPending: /* @__PURE__ */ new Map(),
165
+ mcpResolved: [],
166
+ ticker: [],
167
+ stats: { runs: 0, spawned: 0, llmCalls: 0, tokens: 0, toolCalls: 0, graphReads: 0, graphWrites: 0, mcpCalls: 0 },
168
+ lastFinal: "",
169
+ simulated: !1,
170
+ mode: "connecting",
171
+ /** label for the graph/memory structure: names the DB only when the server provides a real graph */
172
+ graphLabel: "knowledge graph",
173
+ /**
174
+ * True once this session USES a knowledge graph: a `graph` read/write event arrived, or sim mode (the
175
+ * simulator emits graph events). A served /live/graph sample alone does not flip it (it only supplies the
176
+ * real nodes to draw once the graph is used). Sticky for the session. When false, scenes draw
177
+ * no graph centerpiece and let the agents take the center. Use `graphMix()` in useFrame for a smooth 0..1.
178
+ */
179
+ hasGraph: !1,
180
+ /** performance.now() when hasGraph flipped true (drives the fade-in / layout ease) */
181
+ hasGraphAt: 0,
182
+ /** runs that touched the graph; the side graph shows while one of them is live (see graphShown) */
183
+ graphRuns: /* @__PURE__ */ new Set(),
184
+ /** performance.now() of the last graph event */
185
+ graphAt: 0,
186
+ focus: null,
187
+ // instance id most recently active
188
+ focusAt: 0,
189
+ /** last `task` / `Agent` tool call (performance.now()): a subagent is about to spawn (FitCamera batches it) */
190
+ spawnHintAt: 0,
191
+ /** exited instances kept for the agent panel after their shape fades (newest last, capped) */
192
+ archive: /* @__PURE__ */ new Map(),
193
+ /** instance selected in the agent panel or by clicking a shape */
194
+ selected: null,
195
+ /** the server answered 401 for this scope/run/token (the HUD shows a notice; no simulator fallback) */
196
+ unauthorized: !1
197
+ }, Nr = 500;
198
+ let It = 0, Is = 0;
199
+ const ot = /* @__PURE__ */ new Set(), we = () => {
200
+ Is++, ot.forEach((e) => e());
201
+ };
202
+ function ct() {
203
+ return it(
204
+ (e) => (ot.add(e), () => ot.delete(e)),
205
+ () => Is
206
+ ), f;
207
+ }
208
+ const fn = (e, t = 0) => {
209
+ let n = 2166136261 ^ t;
210
+ for (let s = 0; s < e.length; s++) n = Math.imul(n ^ e.charCodeAt(s), 16777619);
211
+ return (n >>> 0) % 10007 / 10007;
212
+ };
213
+ function Gr() {
214
+ const e = new Set([...f.runs.values()].map((s) => s.slot)), t = [0, 1, 2, 3, 4, 5].filter((s) => !e.has(s));
215
+ if (t.length) return t[Math.floor(Math.random() * t.length)];
216
+ let n = 6;
217
+ for (; e.has(n); ) n++;
218
+ return n;
219
+ }
220
+ function Ns(e) {
221
+ var s, o;
222
+ const t = performance.now();
223
+ switch (e.type !== "mcp_register" && (f.ticker = [e, ...f.ticker].slice(0, 60)), e.type) {
224
+ case "run": {
225
+ if (e.status === "renamed") {
226
+ const r = f.runs.get(e.run_id);
227
+ r && (r.topic = e.topic);
228
+ } else if (e.status === "started") {
229
+ const r = Gr();
230
+ f.runs.set(e.run_id, {
231
+ id: e.run_id,
232
+ topic: e.topic,
233
+ workflow: e.workflow,
234
+ color: St[r % St.length],
235
+ slot: r,
236
+ status: "started",
237
+ steps: {},
238
+ waits: {},
239
+ stepOrder: [],
240
+ hasSteps: !1,
241
+ startedAt: t,
242
+ endedAt: 0,
243
+ handoffAt: 0,
244
+ handoffFrom: 0,
245
+ handoffTo: 0,
246
+ lastDone: "",
247
+ final: ""
248
+ }), f.stats.runs++;
249
+ } else {
250
+ const r = f.runs.get(e.run_id);
251
+ r && (r.status = e.status, r.endedAt = t);
252
+ for (const i of f.instances.values()) i.run === e.run_id && !i.exitAt && (i.exitAt = t);
253
+ }
254
+ break;
255
+ }
256
+ case "step": {
257
+ const r = f.runs.get(e.run_id);
258
+ if (!r) break;
259
+ r.hasSteps = !0, e.step in r.steps || r.stepOrder.push(e.step);
260
+ const i = r.steps[e.step], l = e.status === "waiting" ? "running" : e.status;
261
+ if (r.steps[e.step] = l, e.status === "waiting" ? r.waits[e.step] = { reason: e.reason || "wait", until: e.until ?? 0 } : delete r.waits[e.step], l === "done" && (r.lastDone = e.step), l === "running" && i !== "running") {
262
+ const u = r.lastDone || r.stepOrder.find((b) => b !== e.step && r.steps[b] === "running"), h = u ? Cn(r, u) : -1, c = Cn(r, e.step);
263
+ h >= 0 && h !== c && (r.handoffAt = t, r.handoffFrom = h, r.handoffTo = c);
264
+ }
265
+ break;
266
+ }
267
+ case "spawn": {
268
+ const r = e.subagent ?? e.agent.endsWith("_scout"), i = [...f.instances.values()].filter((l) => l.run === e.run_id).length;
269
+ f.instances.set(e.id, {
270
+ id: e.id,
271
+ run: e.run_id,
272
+ type: Zr(e.agent, r),
273
+ name: e.agent,
274
+ parent: e.parent_id,
275
+ status: "spawning",
276
+ subagent: r,
277
+ bornAt: t,
278
+ doneAt: 0,
279
+ exitAt: 0,
280
+ pulse: 0.8,
281
+ pulseAt: t,
282
+ tokens: 0,
283
+ index: i,
284
+ recent: [],
285
+ llmCalls: 0,
286
+ toolCalls: 0,
287
+ mcpCalls: 0,
288
+ nodes: /* @__PURE__ */ new Set(),
289
+ skills: /* @__PURE__ */ new Map(),
290
+ skill: "",
291
+ skillEndAt: 0,
292
+ chat: [],
293
+ wait: null
294
+ }), f.stats.spawned++, f.focus = e.id, f.focusAt = t;
295
+ break;
296
+ }
297
+ case "exit": {
298
+ const r = f.instances.get(e.id);
299
+ if (r) {
300
+ r.status = e.status, r.wait = null, r.doneAt = t;
301
+ const i = f.runs.get(r.run), l = !!r.parent && Date.now() - e.ts > Ps;
302
+ (!i || i.endedAt || l) && (r.exitAt = t);
303
+ }
304
+ for (const [i, l] of f.mcpPending) l.instance === e.id && f.mcpPending.delete(i);
305
+ if (r && r.skill && !r.skillEndAt) {
306
+ for (const i of r.skills.values()) i.active && (i.active = !1, i.endAt = t);
307
+ r.skillEndAt = t;
308
+ }
309
+ break;
310
+ }
311
+ case "agent": {
312
+ const r = f.instances.get(e.id);
313
+ r && (r.status = e.status, r.wait = e.status === "waiting" && e.reason ? { reason: e.reason, until: e.until ?? 0 } : null), e.status === "thinking" && (f.focus = e.id, f.focusAt = t);
314
+ break;
315
+ }
316
+ case "llm": {
317
+ const r = f.instances.get(e.id);
318
+ r && (r.pulse = Math.min(2.5, 0.6 + (e.tokens_in + e.tokens_out) / 1500), r.pulseAt = t, r.tokens += e.tokens_in + e.tokens_out, r.llmCalls++), f.stats.llmCalls++, f.stats.tokens += e.tokens_in + e.tokens_out;
319
+ break;
320
+ }
321
+ case "message":
322
+ f.comets.push({ id: ++It, run: e.run_id, from: e.from_id, to: e.to_id, start: t, dur: 1300, text: e.text }), f.focus = e.to_id, f.focusAt = t;
323
+ break;
324
+ case "tool": {
325
+ f.stats.toolCalls++, /^(task|agent)$/i.test(e.tool) && (f.spawnHintAt = t);
326
+ const r = f.instances.get(e.id);
327
+ r && (r.pulse = Math.max(r.pulse, 0.5), r.pulseAt = t, r.toolCalls++);
328
+ break;
329
+ }
330
+ case "skill": {
331
+ const r = f.instances.get(e.id);
332
+ if (!r) break;
333
+ let i = r.skills.get(e.name);
334
+ if (i || r.skills.set(e.name, i = { active: !1, count: 0, last: t, startAt: 0, endAt: 0 }), i.last = t, e.status === "start") {
335
+ const l = i.count > 0 && (!i.endAt || t < Vs(i) + Rs);
336
+ i.startAt = l ? t - Math.min(Es, t - i.startAt) : t, i.endAt = 0, i.active = !0, i.count++, r.skill = e.name, r.skillEndAt = 0;
337
+ } else if (i.active) {
338
+ i.active = !1, i.endAt = t;
339
+ let l = "";
340
+ for (const [u, h] of r.skills) h.active && (!l || h.startAt > r.skills.get(l).startAt) && (l = u);
341
+ l ? r.skill = l : r.skillEndAt = t;
342
+ }
343
+ break;
344
+ }
345
+ case "graph":
346
+ f.hasGraph && !Wt(t) && (f.hasGraphAt = t), Ds(!0, !1), f.graphAt = t, e.run_id && f.graphRuns.add(e.run_id), (s = f.instances.get(e.id)) != null && s.nodes && e.nodes.forEach((r) => f.instances.get(e.id).nodes.add(r));
347
+ for (const r of e.nodes.slice(0, 20)) f.flares.push({ id: ++It, run: e.run_id, instance: e.id, node: r, op: e.op, start: t });
348
+ e.op === "read" ? f.stats.graphReads += e.nodes.length : f.stats.graphWrites += e.nodes.length;
349
+ break;
350
+ case "mcp_register": {
351
+ let r = f.mcpRegistry.get(e.server);
352
+ r || f.mcpRegistry.set(e.server, r = /* @__PURE__ */ new Map());
353
+ for (const i of e.resources) r.has(i.name) || r.set(i.name, i.kind);
354
+ break;
355
+ }
356
+ case "mcp": {
357
+ let r = f.mcpServers.get(e.server);
358
+ r || (r = { name: e.server, color: Wr[e.server] ?? "#94a3b8", slot: f.mcpServers.size, activeAt: t, calls: 0, inflight: 0, resources: /* @__PURE__ */ new Map() }, f.mcpServers.set(e.server, r)), r.activeAt = t;
359
+ let i;
360
+ if (e.resource && (i = r.resources.get(e.resource), i || (i = { name: e.resource, kind: e.resource_kind ?? ((o = f.mcpRegistry.get(e.server)) == null ? void 0 : o.get(e.resource)) ?? "api", activeAt: t, inflight: 0, calls: 0 }, r.resources.set(e.resource, i)), i.activeAt = t, e.phase === "call" ? (i.inflight++, i.calls++) : i.inflight = Math.max(0, i.inflight - 1)), e.phase === "call") {
361
+ const u = f.instances.get(e.id);
362
+ u && u.mcpCalls++, r.calls++, r.inflight++, f.stats.mcpCalls++;
363
+ } else r.inflight = Math.max(0, r.inflight - 1);
364
+ f.mcpCalls.push({ id: ++It, run: e.run_id, instance: e.id, server: e.server, tool: e.tool, resource: e.resource, phase: e.phase, start: t, dur: 900 });
365
+ const l = `${e.id}|${e.server}|${e.tool}`;
366
+ if (e.phase === "call") f.mcpPending.set(l, { key: l, run: e.run_id, instance: e.id, server: e.server, tool: e.tool, resource: e.resource, since: t });
367
+ else {
368
+ const u = f.mcpPending.get(l);
369
+ u && f.mcpResolved.push({ ...u, resolvedAt: t }), f.mcpPending.delete(l);
370
+ }
371
+ break;
372
+ }
373
+ case "chat": {
374
+ const r = f.instances.get(e.id);
375
+ r && (r.chat = [...r.chat, { role: e.role, text: e.text }].slice(-20));
376
+ break;
377
+ }
378
+ case "final": {
379
+ const r = f.runs.get(e.run_id);
380
+ r && (r.final = e.text), f.lastFinal = e.text;
381
+ break;
382
+ }
383
+ }
384
+ const n = "id" in e ? e.id : e.type === "message" ? e.from_id : null;
385
+ if (n) {
386
+ const r = f.instances.get(n);
387
+ r && (r.recent = [e, ...r.recent].slice(0, 40));
388
+ }
389
+ we();
390
+ }
391
+ const Nt = /* @__PURE__ */ new Set(), Gt = /* @__PURE__ */ new Set(), ft = /* @__PURE__ */ new Map();
392
+ function qr(e, t) {
393
+ let n = !1;
394
+ for (const s of e.skills.values())
395
+ s.active && (t - s.startAt > Pr ? (s.active = !1, s.endAt = t) : n = !0);
396
+ n || (e.skillEndAt = t);
397
+ }
398
+ function Dr(e = performance.now()) {
399
+ let t = !1;
400
+ Nt.clear(), Gt.clear(), ft.clear();
401
+ for (const [r, i] of f.instances)
402
+ Nt.add(i.run), i.skill && !i.skillEndAt && qr(i, e), i.exitAt || (i.doneAt ? (i.doneAt > (ft.get(i.run) ?? 0) && ft.set(i.run, i.doneAt), i.parent && e - i.doneAt > Ps && (i.exitAt = e)) : Gt.add(i.run)), i.exitAt && e - i.exitAt > Pt.fadeMs(i) && (f.instances.delete(r), f.archive.set(r, i), f.archive.size > Nr && f.archive.delete(f.archive.keys().next().value), t = !0);
403
+ for (const [r, i] of ft)
404
+ if (!Gt.has(r) && e - i > Ir && !Fr(f.runs.get(r)))
405
+ for (const l of f.instances.values()) l.run === r && !l.exitAt && (l.exitAt = e);
406
+ for (const [r, i] of f.runs)
407
+ i.endedAt && e - i.endedAt > en && !Nt.has(r) && (f.runs.delete(r), t = !0);
408
+ const n = f.comets.length;
409
+ f.comets = f.comets.filter((r) => e - r.start < r.dur + 250), f.mcpResolved = f.mcpResolved.filter((r) => e - r.resolvedAt < 700);
410
+ const s = f.mcpCalls.length;
411
+ f.mcpCalls = f.mcpCalls.filter((r) => e - r.start < r.dur + 250);
412
+ const o = f.flares.length;
413
+ f.flares = f.flares.filter((r) => e - r.start < 2600), (t || n !== f.comets.length || o !== f.flares.length || s !== f.mcpCalls.length) && we();
414
+ }
415
+ const Fr = (e) => !!e && e.status === "started" && Ts(e) !== null;
416
+ function Lr(e, t = performance.now()) {
417
+ const n = Math.min(1, (t - e.bornAt) / 600), s = 1 - Math.pow(1 - n, 3);
418
+ return e.exitAt ? s * Math.max(0, 1 - (t - e.exitAt) / Pt.fadeMs(e)) : s;
419
+ }
420
+ function Ot(e, t = performance.now()) {
421
+ return e.pulse * Math.exp(-((t - e.pulseAt) / 1e3) * 2.2);
422
+ }
423
+ function Br(e, t = performance.now()) {
424
+ return (t - e.since) / 1e3;
425
+ }
426
+ const Ur = /* @__PURE__ */ new Set(["planner", "researcher", "graph_scout", "records_scout", "data_scout", "writer"]);
427
+ function Zr(e, t) {
428
+ if (Ur.has(e)) return e;
429
+ const n = e.toLowerCase();
430
+ return /plan|orchestr|router|supervis|manager|coordinat/.test(n) ? "planner" : /writ|report|summar|answer|final|compose|draft/.test(n) ? "writer" : t ? /graph|kg|memory|retriev|search|web/.test(n) ? "graph_scout" : /record|doc|file/.test(n) ? "records_scout" : "data_scout" : "researcher";
431
+ }
432
+ function Gs(e) {
433
+ return e.subagent ? 0.6 : 1.35;
434
+ }
435
+ function hn(e) {
436
+ if (e)
437
+ return f.instances.get(e) ?? f.archive.get(e);
438
+ }
439
+ function Je(e) {
440
+ f.selected !== e && (f.selected = e, we());
441
+ }
442
+ function zn(e) {
443
+ f.simulated = e, we();
444
+ }
445
+ function Hr(e) {
446
+ f.graphLabel !== e && (f.graphLabel = e, we());
447
+ }
448
+ function qs(e) {
449
+ f.unauthorized !== e && (f.unauthorized = e, we());
450
+ }
451
+ function Jr() {
452
+ f.runs.clear(), f.instances.clear(), f.comets.length = 0, f.flares.length = 0, f.mcpServers.clear(), f.mcpRegistry.clear(), f.mcpCalls.length = 0, f.mcpPending.clear(), f.mcpResolved.length = 0, f.ticker.length = 0;
453
+ for (const e of Object.keys(f.stats)) f.stats[e] = 0;
454
+ f.lastFinal = "", f.simulated = !1, f.mode = "connecting", f.focus = null, f.focusAt = 0, f.spawnHintAt = 0, f.archive.clear(), f.selected = null, f.unauthorized = !1, f.hasGraph = !1, f.hasGraphAt = 0, f.graphRuns.clear(), f.graphAt = 0, we();
455
+ }
456
+ function Pn(e) {
457
+ f.mode = e, f.simulated = e === "sim", e === "sim" && Ds(!0, !1), we();
458
+ }
459
+ function Ds(e, t = !0) {
460
+ f.hasGraph || (f.hasGraph = !0, f.hasGraphAt = f.mode === "sim" ? -1e9 : performance.now(), t && we());
461
+ }
462
+ const jr = 2500;
463
+ function Rc(e, t, n = 1.5) {
464
+ const s = (t - e - jr) / 1e3;
465
+ return s <= 0 ? 1 : Math.exp(-s * n);
466
+ }
467
+ const Xr = 9e4;
468
+ function Kr(e, t = performance.now()) {
469
+ return e.calls > 0 && (e.inflight > 0 || t - e.activeAt < Xr);
470
+ }
471
+ function Wt(e = performance.now()) {
472
+ if (!f.hasGraph) return !1;
473
+ if (f.mode === "sim" || e - f.graphAt < en) return !0;
474
+ for (const t of f.graphRuns) {
475
+ const n = f.runs.get(t);
476
+ if (n && (!n.endedAt || e - n.endedAt < en)) return !0;
477
+ (!n || n.endedAt) && f.graphRuns.delete(t);
478
+ }
479
+ return !1;
480
+ }
481
+ const Qr = 1800;
482
+ function Yr(e = performance.now()) {
483
+ if (!f.hasGraph) return 0;
484
+ const t = Math.min(1, Math.max(0, (e - f.hasGraphAt) / Qr));
485
+ return t * t * (3 - 2 * t);
486
+ }
487
+ function _r() {
488
+ return it(
489
+ (e) => (ot.add(e), () => ot.delete(e)),
490
+ () => f.hasGraph,
491
+ () => !1
492
+ );
493
+ }
494
+ const qt = { agent: 600, skill: 450, run: 400, mcp: 300, resource: 290, cluster: 250, backend: 150, graph: 140, extra: 120, sub: 100 }, qe = xs({ kind: "extra" }), H = {
495
+ entries: [],
496
+ /** a KitScene is mounted (outside one, nothing is ever hidden) */
497
+ active: 0,
498
+ /** labels project their rects this frame */
499
+ due: !1,
500
+ /** px-range multiplier: labels shrink a bit on small canvases */
501
+ pxk: 1,
502
+ last: -1e9,
503
+ /** last pass stats (debug / verification) */
504
+ stats: { shown: 0, hidden: 0, dropped: 0, off: 0 },
505
+ /** measured on-screen size of the largest cluster badge (css px; 0 = none seen yet): presets space clusters by it */
506
+ badge: { w: 0, h: 0 }
507
+ };
508
+ function $r(e, t, n) {
509
+ return { kind: e, agent: t, size: n, live: !1, clip: !1, x: 0, y: 0, w: 0, h: 0, x1: 0, y1: 0, w1: 0, h1: 0, ax: 0, ay: 0, az: 0, ox0: 0, ox1: 0, oy0: 0, oy1: 0, seen: -1e9, drawn: !1, show: H.active ? 0 : 1, subOff: !1, placed: !1, score: 0 };
510
+ }
511
+ function ea(e) {
512
+ H.entries.push(e);
513
+ }
514
+ function ta(e) {
515
+ const t = H.entries, n = t.indexOf(e);
516
+ n < 0 || (t[n] = t[t.length - 1], t.pop());
517
+ }
518
+ const na = 100, sa = { agent: !1, skill: !0, run: !1, mcp: !1, resource: !1, cluster: !1, backend: !0, graph: !0, extra: !0, sub: !0 }, ht = 3, Te = [];
519
+ let me = new Float64Array(256 * 4);
520
+ const ra = (e, t) => t.score - e.score;
521
+ function aa(e, t) {
522
+ let n = qt[e.kind];
523
+ const s = e.agent;
524
+ if (s && (e.kind === "agent" || e.kind === "sub")) {
525
+ const o = s.inst;
526
+ if (f.selected === s.id) return 1e4;
527
+ const r = Math.min(1, Ot(o, t)) * 60 + (o.status === "thinking" ? 30 : 0);
528
+ n = s.depth > 0 ? qt.sub + r * 0.5 : qt.agent + r, (o.exitAt || o.doneAt) && (n -= s.depth > 0 ? 60 : 350);
529
+ } else if (s && e.kind === "skill") {
530
+ if (f.selected === s.id) return 9990;
531
+ n += Math.min(1, Ot(s.inst, t)) * 30 + (s.depth > 0 ? 0 : 20), (s.inst.exitAt || s.inst.doneAt) && (n -= 300);
532
+ }
533
+ return n + e.size * 10 + (e.placed ? 8 : 0);
534
+ }
535
+ function Wn(e, t, n, s, o) {
536
+ const r = e - n / 2 - ht, i = e + n / 2 + ht, l = t - s / 2 - ht, u = t + s / 2 + ht;
537
+ for (let h = 0; h < o; h++) {
538
+ const c = h * 4;
539
+ if (r < me[c + 2] && i > me[c] && l < me[c + 3] && u > me[c + 1]) return !1;
540
+ }
541
+ return !0;
542
+ }
543
+ function In(e, t, n, s, o) {
544
+ if ((o + 1) * 4 > me.length) {
545
+ const i = new Float64Array(me.length * 2);
546
+ i.set(me), me = i;
547
+ }
548
+ const r = o * 4;
549
+ me[r] = e - n / 2, me[r + 1] = t - s / 2, me[r + 2] = e + n / 2, me[r + 3] = t + s / 2;
550
+ }
551
+ function oa(e) {
552
+ Te.length = 0;
553
+ for (const u of H.entries)
554
+ u.live ? (u.score = aa(u, e), Te.push(u)) : u.placed = !1;
555
+ Te.sort(ra);
556
+ let t = 0, n = 0, s = 0;
557
+ for (const u of Te)
558
+ u.clip && sa[u.kind] ? (u.show = 0, u.placed = !1, n++) : Wn(u.x, u.y, u.w, u.h, t) ? (In(u.x, u.y, u.w, u.h, t++), u.show = 1, u.subOff = !1, u.placed = !0) : u.w1 > 0 && Wn(u.x1, u.y1, u.w1, u.h1, t) ? (In(u.x1, u.y1, u.w1, u.h1, t++), u.show = 1, u.subOff = !0, u.placed = !0, s++) : (u.show = 0, u.placed = !1, n++);
559
+ let o = 0, r = 0;
560
+ for (const u of Te) u.kind === "cluster" && (o = Math.max(o, u.w), r = Math.max(r, u.h));
561
+ const i = H.badge;
562
+ o > 0 && ((!i.w || Math.abs(o - i.w) / i.w > 0.12) && (i.w = o), (!i.h || Math.abs(r - i.h) / i.h > 0.12) && (i.h = r));
563
+ const l = H.stats;
564
+ l.shown = t, l.hidden = n, l.dropped = s, l.off = H.entries.length - Te.length, Te.length = 0;
565
+ }
566
+ function ia(e, t, n) {
567
+ if (H.pxk = Math.min(1, Math.max(0.78, Math.sqrt(Math.min(t / 1280, n / 760)))), H.due) {
568
+ H.due = !1, oa(e);
569
+ for (const s of H.entries) s.live = !1;
570
+ } else e - H.last >= na && (H.last = e, H.due = !0);
571
+ }
572
+ const ca = { agent: !1, skill: !1, sub: !1, run: !0, mcp: !0, resource: !0, backend: !0, cluster: !0, graph: !1, extra: !1 };
573
+ function la(e, t) {
574
+ for (const n of H.entries) ca[n.kind] && e - n.seen < 600 && (n.show > 0 || !H.active) && t(n);
575
+ }
576
+ function ua() {
577
+ const e = H.entries.filter((n) => n.drawn && performance.now() - n.seen < 300);
578
+ let t = 0;
579
+ for (let n = 0; n < e.length; n++)
580
+ for (let s = n + 1; s < e.length; s++) {
581
+ const o = e[n], r = e[s], i = o.subOff ? o.w1 : o.w, l = o.subOff ? o.h1 : o.h, u = o.subOff ? o.x1 : o.x, h = o.subOff ? o.y1 : o.y, c = r.subOff ? r.w1 : r.w, b = r.subOff ? r.h1 : r.h, a = r.subOff ? r.x1 : r.x, d = r.subOff ? r.y1 : r.y;
582
+ Math.abs(u - a) * 2 < i + c && Math.abs(h - d) * 2 < l + b && t++;
583
+ }
584
+ return t;
585
+ }
586
+ typeof window < "u" && (window.__agentglowLabels = {
587
+ labels: H,
588
+ snapshot: () => ({ ...H.stats, total: H.entries.length, overlaps: ua() })
589
+ });
590
+ const Fs = { nRef: 4, min: 0.6, max: 1.6, minRadius: 5, maxRadius: 80, margin: 1.12 }, T = {
591
+ scale: 1,
592
+ spread: 1,
593
+ label: 1,
594
+ /** weighted visible agent count used for the current target */
595
+ n: 0,
596
+ profile: { ...Fs },
597
+ /** canvas css px + HUD insets (px) measured by FitCamera */
598
+ w: 1600,
599
+ h: 900,
600
+ insets: { top: 0, right: 0, bottom: 0, left: 0 },
601
+ /** free-area aspect (w/h after insets): presets use it to stretch layouts to the visible shape */
602
+ aspect: 16 / 9,
603
+ /**
604
+ * camera framing: `dist` = current camera distance to the orbit target (read it for fog / LOD instead of
605
+ * camera.position), `want` = committed fitted distance before the user's zoom factor `user`, `fit` = the
606
+ * instantaneous fit (what `want` would be with no batching / hysteresis); `points` = framed points
607
+ */
608
+ cam: { want: 0, fit: 0, dist: 0, user: 1, points: 0 },
609
+ /** how much of the free area the content's screen bounds fill [x, y] (debug / verification) */
610
+ fill: [0, 0],
611
+ /** world units per css px at the fitted camera distance (px-clamped labels: world size = px * wpp) */
612
+ wpp: 0.05,
613
+ /** screen shrink of a stage "up" (b) step: 1 for xy stages, |sin(elevation)| for a tilted xz ground plane */
614
+ foreshorten: 1
615
+ };
616
+ function da(e) {
617
+ T.profile = { ...Fs, ...e }, fe = -1;
618
+ }
619
+ let fe = -1, Dt = NaN;
620
+ const Me = { from: 1, t0: 0, dur: 0 }, pn = (e) => M.MathUtils.clamp(Math.sqrt(T.profile.nRef / Math.max(1, e)), T.profile.min, T.profile.max), Ls = (e) => e * e * (3 - 2 * e), je = { nLive: 0, activityAt: -1e9 };
621
+ function fa(e, t, n = t) {
622
+ je.nLive = t, n !== Dt && (Number.isNaN(Dt) || (je.activityAt = e), Dt = n), fe < 0 && (T.n = t, fe = pn(t), T.scale = fe, Me.dur = 0);
623
+ const s = Me.dur > 0 ? Math.min(1, (e - Me.t0) / Me.dur) : 1;
624
+ T.scale = Me.from + (fe - Me.from) * Ls(s), s >= 1 && (T.scale = fe), T.spread = Math.max(0.85, Math.pow(T.scale, 0.8)), T.label = M.MathUtils.clamp(Math.pow(T.scale, 0.5), 0.85, 1.25);
625
+ }
626
+ const ha = () => fe > 0 && Math.abs(pn(je.nLive) - fe) / fe > 0.06;
627
+ function Nn(e, t) {
628
+ T.n = je.nLive;
629
+ const n = pn(T.n);
630
+ fe > 0 && Math.abs(n - fe) / fe <= 0.06 || (Me.from = T.scale, Me.t0 = e, Me.dur = t, fe = n);
631
+ }
632
+ const Bs = [".hud-top", ".hud-dock", ".hud-side"], tn = "agentglow:hud-layout";
633
+ function pa(e, t = 1.6) {
634
+ var d;
635
+ const n = e.closest(".scene-root") ?? ((d = e.parentElement) == null ? void 0 : d.parentElement), s = e.getBoundingClientRect(), o = { top: 0, right: 0, bottom: 0, left: 0 };
636
+ if (!n || s.width < 1) return o;
637
+ const r = [];
638
+ for (const S of Bs) {
639
+ const A = n.querySelector(S);
640
+ if (!A || A.offsetParent === null) continue;
641
+ const m = A.getBoundingClientRect();
642
+ if (m.width < 2 || m.height < 2) continue;
643
+ const v = { left: m.left - s.left - 6, top: m.top - s.top - 6, right: m.right - s.left + 6, bottom: m.bottom - s.top + 6 };
644
+ v.right <= 0 || v.bottom <= 0 || v.left >= s.width || v.top >= s.height || r.push(v);
645
+ }
646
+ const i = s.width, l = s.height, u = (S, A) => {
647
+ if (S <= 0 || A <= 0) return 0;
648
+ const m = Math.min(S, A * t);
649
+ return m * (m / t) + S * A * 1e-3;
650
+ }, h = r.length;
651
+ let c = -1;
652
+ for (let S = 0; S < 1 << 2 * h; S++) {
653
+ let A = 0, m = 0, v = 0, y = 0;
654
+ for (let C = 0; C < h; C++) {
655
+ const R = r[C], P = S >> 2 * C & 3;
656
+ P === 0 ? A = Math.max(A, R.right) : P === 1 ? v = Math.max(v, i - R.left) : P === 2 ? m = Math.max(m, R.bottom) : y = Math.max(y, l - R.top);
657
+ }
658
+ const G = u(i - A - v, l - m - y);
659
+ G > c && (c = G, o.left = A, o.right = v, o.top = m, o.bottom = y);
660
+ }
661
+ const b = i * 0.68, a = l * 0.68;
662
+ if (o.left + o.right > b) {
663
+ const S = b / (o.left + o.right);
664
+ o.left *= S, o.right *= S;
665
+ }
666
+ if (o.top + o.bottom > a) {
667
+ const S = a / (o.top + o.bottom);
668
+ o.top *= S, o.bottom *= S;
669
+ }
670
+ return o;
671
+ }
672
+ const Gn = new M.Vector3();
673
+ new M.Vector3();
674
+ const pt = new M.Vector3(), qn = new M.Matrix4(), ve = 0.85, Ge = 8, Dn = 1100, Fn = 2500, ma = 1.04, Ln = 1e3, ga = 1.18, Bn = 7e3, Aa = 2e3, ba = 1e4, va = 450, Ft = 300, ya = 0.75, Un = 0.985;
675
+ function Ma({ points: e, origin: t }) {
676
+ const n = dt((c) => c.camera), s = dt((c) => c.controls), o = dt((c) => c.gl), r = dt((c) => c.size), i = U({
677
+ base: 0,
678
+ user: 1,
679
+ userActive: !1,
680
+ userUntil: -1e9,
681
+ want: 0,
682
+ lastMeasure: -1e9,
683
+ hudMoved: !1,
684
+ dir: new M.Vector3(),
685
+ aspect: 1.6,
686
+ refit: !0,
687
+ // committed move: fitted distance (before the user factor) + projection shift tween from -> to
688
+ cur: 0,
689
+ from: 0,
690
+ t0: 0,
691
+ dur: 0,
692
+ sx: 0,
693
+ sy: 0,
694
+ fx: 0,
695
+ fy: 0,
696
+ tx: 0,
697
+ ty: 0,
698
+ // pending zoom-out (since, largest fit seen in the batch window) / zoom-in (since)
699
+ outSince: 0,
700
+ outMax: 0,
701
+ inSince: 0,
702
+ // two-phase commit: the scale moves first, then (at `phase2`) the camera fits the resized layout in one move
703
+ phase2: 0,
704
+ phase2Ms: 0,
705
+ // the instantaneous fit has been steady (<0.5%/frame) since: layout / grouping / labels still easing otherwise
706
+ lastDesired: 0,
707
+ steadySince: 0,
708
+ // the committed framing was fitted to real content (false while the scene is empty: the theme's start distance)
709
+ framed: !1
710
+ }), l = U({ a: new Float64Array(512 * Ge), n: 0, tgt: new M.Vector3(), tpp: 0 }), { visit: u, visitLabel: h } = ne(() => {
711
+ const c = l.current, b = (a, d, S, A, m, v, y, G) => {
712
+ if (!Number.isFinite(a) || !Number.isFinite(d) || !Number.isFinite(S)) return;
713
+ if ((c.n + 1) * Ge > c.a.length) {
714
+ const R = new Float64Array(c.a.length * 2);
715
+ R.set(c.a), c.a = R;
716
+ }
717
+ pt.set(a - c.tgt.x, d - c.tgt.y, S - c.tgt.z).applyMatrix4(qn);
718
+ const C = c.n * Ge;
719
+ c.a[C] = pt.x, c.a[C + 1] = pt.y, c.a[C + 2] = pt.z, c.a[C + 3] = A, c.a[C + 4] = m, c.a[C + 5] = v, c.a[C + 6] = y, c.a[C + 7] = G, c.n++;
720
+ };
721
+ return {
722
+ visit: (a, d) => b(a.x + t.x, a.y + t.y, a.z + t.z, d, 0, 0, 0, 0),
723
+ // label anchors are world positions; css px (y down) -> view-angle units (y up)
724
+ visitLabel: (a) => b(a.ax, a.ay, a.az, 0, a.ox0 * c.tpp, a.ox1 * c.tpp, -a.oy1 * c.tpp, -a.oy0 * c.tpp)
725
+ };
726
+ }, [t]);
727
+ return $(() => {
728
+ T.w = r.width, T.h = r.height, i.current.lastMeasure = -1e9, i.current.refit = !0;
729
+ }, [r.width, r.height]), $(() => () => n.clearViewOffset(), [n]), $(() => {
730
+ const c = o.domElement.closest(".scene-root");
731
+ if (!c) return;
732
+ const b = () => {
733
+ i.current.lastMeasure = -1e9, i.current.hudMoved = !0;
734
+ };
735
+ return c.addEventListener(tn, b), () => c.removeEventListener(tn, b);
736
+ }, [o]), $(() => {
737
+ if (!s) return;
738
+ const c = i.current, b = () => c.userActive = !0, a = () => {
739
+ c.userActive = !1, c.userUntil = performance.now() + ba, c.want = c.from = c.cur, c.dur = 0;
740
+ const d = s.target ?? Gn.set(0, 0, 0), S = n.position.distanceTo(d);
741
+ c.cur > 0 && (c.user = M.MathUtils.clamp(S / c.cur, 0.35, 3));
742
+ };
743
+ return s.addEventListener("start", b), s.addEventListener("end", a), () => {
744
+ s.removeEventListener("start", b), s.removeEventListener("end", a);
745
+ };
746
+ }, [s, n]), be((c, b) => {
747
+ var Ve;
748
+ const a = i.current, d = l.current;
749
+ Us = d, nn = { camera: n, points: e, origin: t, canvas: o.domElement };
750
+ const S = Math.min(0.1, b), A = performance.now(), m = Math.max(1, r.width), v = Math.max(1, r.height);
751
+ if (A - a.lastMeasure > 700) {
752
+ a.lastMeasure = A;
753
+ const Z = T.insets;
754
+ T.insets = pa(o.domElement, Math.max(0.9, a.aspect)), a.hudMoved && (Math.max(Math.abs(Z.top - T.insets.top), Math.abs(Z.right - T.insets.right), Math.abs(Z.bottom - T.insets.bottom), Math.abs(Z.left - T.insets.left)) > 12 && (a.refit = !0), a.hudMoved = !1);
755
+ }
756
+ const y = T.insets, G = Math.max(m * 0.3, m - y.left - y.right), C = Math.max(v * 0.3, v - y.top - y.bottom);
757
+ T.aspect = G / C;
758
+ const R = (s == null ? void 0 : s.target) ?? Gn.set(0, 0, 0);
759
+ a.base || (a.base = n.position.distanceTo(R) || 20), a.dir.subVectors(n.position, R);
760
+ const P = a.dir.length() || 1;
761
+ a.dir.divideScalar(P), qn.extractRotation(n.matrixWorld).invert(), T.foreshorten = M.MathUtils.clamp(g.plane === "xz" ? Math.abs(a.dir.y) : Math.sqrt(1 - a.dir.y * a.dir.y), 0.35, 1);
762
+ const w = Math.tan(M.MathUtils.degToRad(n.fov) / 2), V = G / m * w * n.aspect, W = C / v * w;
763
+ d.n = 0, d.tgt.copy(R), d.tpp = 2 * w / v, e(u), la(A, h);
764
+ const k = d.n, x = T.profile, D = x.minRadius / Math.min(V, W), F = x.maxRadius / Math.min(V, W);
765
+ let N;
766
+ if (!k) N = a.want || a.base;
767
+ else {
768
+ const Z = x.margin;
769
+ if (Zn(d.a, k, F, Z, V, W)) {
770
+ let se = Math.max(0.5, Math.min(D, F) * 0.25), he = F;
771
+ for (let Ke = 0; Ke < 22; Ke++) {
772
+ const Fe = (se + he) / 2;
773
+ Zn(d.a, k, Fe, Z, V, W) ? he = Fe : se = Fe;
774
+ }
775
+ N = M.MathUtils.clamp(he, D, F);
776
+ } else N = F;
777
+ }
778
+ let Q = !1;
779
+ if (k) {
780
+ xt(d.a, k, P);
781
+ const Z = V * Un, se = W * Un;
782
+ Q = J[0] < a.sx - Z || J[1] > a.sx + Z || J[2] < a.sy - se || J[3] > a.sy + se, a.aspect += (M.MathUtils.clamp((J[1] - J[0]) / Math.max(1e-4, J[3] - J[2]), 0.5, 4) - a.aspect) * 0.1, T.fill[0] = (J[1] - J[0]) / (2 * V), T.fill[1] = (J[3] - J[2]) / (2 * W);
783
+ }
784
+ (!a.lastDesired || Math.abs(N - a.lastDesired) / a.lastDesired > 5e-3) && (a.steadySince = A), a.lastDesired = N;
785
+ const X = A - a.steadySince, K = a.userActive || A < a.userUntil;
786
+ let L = -1, O = 0, q = !1;
787
+ if (k || (a.framed = !1), !a.want || a.refit)
788
+ L = N, O = a.want ? va : 0, a.refit = !1;
789
+ else if (!a.framed && k && !K && X >= Ft && A - Math.max(je.activityAt, f.spawnHintAt) >= Dn)
790
+ L = Math.max(N, Math.min(a.want, a.base * ya)), O = Ln;
791
+ else if (a.phase2) {
792
+ if (A >= a.phase2 && (X >= Ft || A - a.phase2 >= Fn)) {
793
+ a.phase2 = 0;
794
+ const Z = N / a.want;
795
+ (Z > 1.02 || Z < 1 / 1.02) && (L = N, O = a.phase2Ms);
796
+ }
797
+ } else if (!K) {
798
+ const Z = N / a.want, se = A - Math.max(je.activityAt, f.spawnHintAt), he = Q && a.user >= 0.99 && (a.dur <= 0 || A - a.t0 >= a.dur);
799
+ Z > ma || he ? (a.inSince = 0, a.outSince ? a.outMax = Math.max(a.outMax, N) : (a.outSince = A, a.outMax = N), (se >= Dn && X >= Ft || A - a.outSince >= Fn) && (L = Math.max(a.outMax, N, he ? a.want : 0), O = Ln, q = !0)) : (a.outSince = 0, Z < 1 / ga ? (a.inSince || (a.inSince = A), A - a.inSince >= Bn && se >= Bn && (L = N, O = Aa, q = !0)) : a.inSince = 0);
800
+ }
801
+ if (L >= 0)
802
+ if (a.outSince = a.inSince = 0, k && (a.framed = !0), q && ha() && !rt)
803
+ Nn(A, O * 0.8), a.phase2 = A + O * 0.8 + 250, a.phase2Ms = O;
804
+ else {
805
+ const Z = rt ? 0 : O;
806
+ a.from = a.cur || L, a.want = L, a.t0 = A, a.dur = Z, a.fx = a.sx, a.fy = a.sy, k && (xt(d.a, k, L * a.user), a.tx = M.MathUtils.clamp((J[0] + J[1]) / 2, -V * ve, V * ve), a.ty = M.MathUtils.clamp((J[2] + J[3]) / 2, -W * ve, W * ve)), Nn(A, Z);
807
+ }
808
+ const B = 2 * w * a.want * a.user / v;
809
+ Math.abs(B - T.wpp) / T.wpp > 0.1 && (T.wpp = B);
810
+ const j = a.dur > 0 ? Math.min(1, (A - a.t0) / a.dur) : 1, I = Ls(j);
811
+ if (a.cur = a.from + (a.want - a.from) * I, K && k) {
812
+ xt(d.a, k, P);
813
+ const Z = 1 - Math.exp(-S / 0.3);
814
+ a.tx = M.MathUtils.clamp((J[0] + J[1]) / 2, -V * ve, V * ve), a.ty = M.MathUtils.clamp((J[2] + J[3]) / 2, -W * ve, W * ve), a.sx += (a.tx - a.sx) * Z, a.sy += (a.ty - a.sy) * Z, a.fx = a.sx, a.fy = a.sy;
815
+ } else
816
+ a.sx = a.fx + (a.tx - a.fx) * I, a.sy = a.fy + (a.ty - a.fy) * I;
817
+ T.cam.want = a.want, T.cam.fit = N, T.cam.dist = P, T.cam.user = a.user, T.cam.points = k;
818
+ const Y = y.left + G / 2, ee = y.top + C / 2, ge = m / 2 - Y + a.sx / (w * n.aspect) * (m / 2), ke = v / 2 - ee - a.sy / w * (v / 2), ae = n.view;
819
+ if ((!ae || !ae.enabled || ae.fullWidth !== m || ae.fullHeight !== v || Math.abs(ae.offsetX - ge) > 0.25 || Math.abs(ae.offsetY - ke) > 0.25) && n.setViewOffset(m, v, ge, ke, m, v), a.userActive) return;
820
+ let ie = a.cur * a.user;
821
+ (s == null ? void 0 : s.minDistance) !== void 0 && (ie = Math.max(ie, s.minDistance)), (s == null ? void 0 : s.maxDistance) !== void 0 && Number.isFinite(s.maxDistance) && (ie = Math.min(ie, s.maxDistance)), !(Math.abs(ie - P) < 1e-4) && (n.position.copy(R).addScaledVector(a.dir, ie), (Ve = s == null ? void 0 : s.update) == null || Ve.call(s));
822
+ }), null;
823
+ }
824
+ const J = new Float64Array(4);
825
+ function xt(e, t, n) {
826
+ let s = 1 / 0, o = -1 / 0, r = 1 / 0, i = -1 / 0;
827
+ for (let l = 0; l < t; l++) {
828
+ const u = l * Ge, h = e[u + 3], c = Math.max(0.05, n - e[u + 2] - h), b = e[u], a = e[u + 1];
829
+ s = Math.min(s, (b - h) / c + e[u + 4]), o = Math.max(o, (b + h) / c + e[u + 5]), r = Math.min(r, (a - h) / c + e[u + 6]), i = Math.max(i, (a + h) / c + e[u + 7]);
830
+ }
831
+ J[0] = s, J[1] = o, J[2] = r, J[3] = i;
832
+ }
833
+ function Zn(e, t, n, s, o, r) {
834
+ for (let c = 0; c < t; c++) if (n - e[c * Ge + 2] - e[c * Ge + 3] <= 0.05) return !1;
835
+ xt(e, t, n);
836
+ const i = (J[0] + J[1]) / 2, l = (J[2] + J[3]) / 2, u = Math.max(0, Math.abs(i) - o * ve), h = Math.max(0, Math.abs(l) - r * ve);
837
+ return ((J[1] - J[0]) / 2 + u) * s <= o && ((J[3] - J[2]) / 2 + h) * s <= r;
838
+ }
839
+ let Us = null, nn = null;
840
+ function xa() {
841
+ if (!nn) return null;
842
+ const { camera: e, points: t, origin: n, canvas: s } = nn, o = s.getBoundingClientRect(), r = o.width, i = o.height, l = s.closest(".scene-root") ?? document, u = [];
843
+ for (const A of Bs) {
844
+ const m = l.querySelector(A);
845
+ if (!m || m.offsetParent === null) continue;
846
+ const v = m.getBoundingClientRect();
847
+ v.width < 2 || v.height < 2 || u.push({ sel: A, l: v.left - o.left, t: v.top - o.top, r: v.right - o.left, b: v.bottom - o.top });
848
+ }
849
+ const h = Math.tan(M.MathUtils.degToRad(e.fov) / 2), c = [], b = (A, m, v, y, G, C) => {
850
+ const R = u.filter((P) => v < P.r && G > P.l && y < P.b && C > P.t).map((P) => P.sel);
851
+ (v < 0 || y < 0 || G > r || C > i) && R.push("edge"), c.push({ kind: A, name: m, l: Math.round(v), t: Math.round(y), r: Math.round(G), b: Math.round(C), hits: R });
852
+ }, a = new M.Vector3();
853
+ t((A, m) => {
854
+ a.set(A.x + n.x, A.y + n.y, A.z + n.z);
855
+ const v = a.clone().applyMatrix4(e.matrixWorldInverse).z * -1;
856
+ a.project(e);
857
+ const y = (a.x + 1) / 2 * r, G = (1 - a.y) / 2 * i, C = m / Math.max(0.05, v) * (i / 2) / h;
858
+ b("point", `${A.x.toFixed(1)},${A.y.toFixed(1)},${A.z.toFixed(1)}`, y - C, G - C, y + C, G + C);
859
+ });
860
+ const d = performance.now();
861
+ for (const A of H.entries)
862
+ if (A.drawn && d - A.seen < 600) {
863
+ const m = A.subOff ? A.w1 : A.w, v = A.subOff ? A.h1 : A.h, y = A.subOff ? A.x1 : A.x, G = A.subOff ? A.y1 : A.y;
864
+ b(`label:${A.kind}`, "", y - m / 2, G - v / 2, y + m / 2, G + v / 2);
865
+ }
866
+ const S = c.filter((A) => A.hits.length);
867
+ return { W: r, H: i, huds: u, insets: T.insets, total: c.length, clipped: S.length, items: S };
868
+ }
869
+ function wa() {
870
+ const e = Us;
871
+ if (!e) return [];
872
+ const t = [];
873
+ for (let n = 0; n < e.n; n++) {
874
+ const s = n * Ge, o = T.cam.dist - e.a[s + 2];
875
+ t.push([+(e.a[s] / o).toFixed(3), +(e.a[s + 1] / o).toFixed(3), +e.a[s + 3].toFixed(2), +e.a[s + 4].toFixed(3), +e.a[s + 5].toFixed(3)]);
876
+ }
877
+ return t;
878
+ }
879
+ typeof window < "u" && (window.__agentglowFit = Object.assign(T, { framedPoints: wa, clipReport: xa }));
880
+ const xe = Math.PI, Zs = xe * 2, Hs = 2.2, Js = (e) => ({
881
+ sx: e > 1 ? Math.min(1.7, Math.pow(e, 0.6)) : 1,
882
+ sy: e < 1 ? Math.min(1.7, Math.pow(1 / e, 0.6)) : 1
883
+ });
884
+ function js(e, t, n, s, o) {
885
+ const r = t.n;
886
+ if (r <= 1) {
887
+ n.a = 0, n.b = 0, n.angle = -xe / 2;
888
+ return;
889
+ }
890
+ const l = (r === 2 ? 0 : r === 4 ? xe / 4 : xe / 2) - e * Zs / r, h = (Math.max(t.hu, t.hv) + o / 2) / Math.sin(xe / r), { sx: c, sy: b } = Js(t.aspect);
891
+ n.a = Math.cos(l) * h * c, n.b = Math.sin(l) * h * b, n.angle = Math.atan2(n.b, n.a);
892
+ }
893
+ const ka = 186, Sa = 46, Oa = 34, Lt = { w: 7, h: 6.5 };
894
+ function Ea(e = 0) {
895
+ const t = H.pxk, n = Math.max(120, T.w - T.insets.left - T.insets.right), s = Math.max(100, T.h - T.insets.top - T.insets.bottom);
896
+ let o = (H.badge.w || ka * t) * 1.12;
897
+ o = e > 1 ? Math.min(o, 0.85 * Math.min(n, s * 1.3) / (1 / Math.sin(xe / e) + 1)) : Math.min(o, 0.85 * n / 2);
898
+ const r = Math.min((H.badge.h || Sa * t) * 1.15, 0.22 * s);
899
+ return Lt.w = Math.max(7, o * T.wpp), Lt.h = Math.max(6.5, 5 + r * T.wpp), Lt;
900
+ }
901
+ function Xs(e, t, n, s, o) {
902
+ const r = Ea(t), i = xe / 2 + xe / Math.max(1, t) - e * Zs / Math.max(1, t), l = Math.max(n.hw, n.hh) + Oa * T.wpp * H.pxk, u = Math.max(l + 3.6, t > 1 ? r.w / (2 * Math.sin(xe / t)) : 0), { sx: h, sy: c } = Js(n.aspect);
903
+ s.a = Math.cos(i) * u * h, s.b = Math.sin(i) * u * c;
904
+ }
905
+ const Ks = {
906
+ name: "radial",
907
+ local: { topGap: 3.6, fanLen: 3.4, subGap: 2.7, fan: "spread", stackGap: 2, pad: 1.3 },
908
+ run: (e, t, n) => js(e, t, n, !0, Hs),
909
+ cluster: (e, t, n, s, o) => Xs(t, n, s, o),
910
+ periphery: "sides"
911
+ }, Ra = {
912
+ name: "drift",
913
+ local: { topGap: 4, fanLen: 3.8, subGap: 3, fan: "spread", stackGap: 2.2, pad: 1.5 },
914
+ run: (e, t, n) => js(e, t, n, !0, Hs * 1.6),
915
+ cluster: (e, t, n, s, o) => Xs(t, n, s, o),
916
+ periphery: "sides"
917
+ }, Va = { radial: Ks, drift: Ra }, re = 6, Qs = 12, Ca = 9, Ta = 10, za = 12, Pa = 6, Wa = 8e3, Ia = 250, Na = 1500, Ga = 300, qa = ["planner", "researcher", "graph_scout", "records_scout", "data_scout", "writer"], Da = (e) => ({
918
+ lane: e,
919
+ active: !1,
920
+ runs: 0,
921
+ agents: 0,
922
+ thinking: 0,
923
+ tokens: 0,
924
+ energy: 0,
925
+ color: St[e % St.length],
926
+ types: { planner: 0, researcher: 0, graph_scout: 0, records_scout: 0, data_scout: 0, writer: 0 },
927
+ version: 0,
928
+ runIds: []
929
+ }), z = {
930
+ /** grouping in effect (crowded and not "show all") */
931
+ grouped: !1,
932
+ /** crowded per hysteresis, regardless of "show all" (HUD offers "group" again) */
933
+ crowded: !1,
934
+ /** user asked to see everything */
935
+ showAll: !1,
936
+ /** lane the user expanded by clicking its cluster (-1 = none) */
937
+ expandedLane: -1,
938
+ /** bumps whenever which instances/runs are expanded or labeled changes (re-filter your lists) */
939
+ version: 0,
940
+ alive: 0,
941
+ expandedAgents: 0,
942
+ expandedRuns: 0,
943
+ collapsedRuns: 0,
944
+ activeClusters: 0,
945
+ clusters: Array.from({ length: re }, (e, t) => Da(t))
946
+ }, de = /* @__PURE__ */ new Set(), Ue = /* @__PURE__ */ new Map(), Oe = /* @__PURE__ */ new Set(), $e = /* @__PURE__ */ new Map(), Fa = 0.25, mt = /* @__PURE__ */ new Map(), Le = [], Ee = /* @__PURE__ */ new Map(), Et = /* @__PURE__ */ new Map(), ze = [], Bt = new Uint16Array(re), gt = /* @__PURE__ */ new Map();
947
+ let Hn = -1e9, Jn = -1, Ie = !0, jn = null, Xn = -1;
948
+ const sn = /* @__PURE__ */ new Set();
949
+ let Ys = 0;
950
+ const Xe = () => {
951
+ Ys++, sn.forEach((e) => e());
952
+ }, mn = (e) => (e % re + re) % re;
953
+ function wt(e) {
954
+ const t = f.runs.get(e);
955
+ return t ? mn(t.slot) : Math.floor(fn(e, 77) * re) % re;
956
+ }
957
+ const La = (e) => wt(e.run);
958
+ function Ut(e) {
959
+ if (!z.grouped) return !0;
960
+ const t = typeof e == "string" ? f.instances.get(e) : e;
961
+ return t ? de.has(t.run) : !1;
962
+ }
963
+ function Kn(e) {
964
+ return !z.grouped || de.has(e);
965
+ }
966
+ function Vc(e) {
967
+ return z.grouped ? e === f.selected || Oe.has(e) : !0;
968
+ }
969
+ const rn = (e) => z.clusters[mn(e)];
970
+ function Ba(e) {
971
+ z.expandedLane = mn(e), z.showAll = !1, Ue.clear(), Ie = !0, Xe();
972
+ }
973
+ function Ua() {
974
+ z.expandedLane = -1, Ue.clear(), Ie = !0, Xe();
975
+ }
976
+ function Qn(e) {
977
+ z.showAll = e, e && (z.expandedLane = -1), Ie = !0, Xe();
978
+ }
979
+ function Za() {
980
+ return it(
981
+ (e) => (sn.add(e), () => sn.delete(e)),
982
+ () => Ys
983
+ ), z;
984
+ }
985
+ const Ha = (e, t) => Ee.get(e) - Ee.get(t) || Et.get(t) - Et.get(e);
986
+ function Ja(e) {
987
+ $e.clear(), mt.clear();
988
+ let t = 0;
989
+ for (const d of f.instances.values())
990
+ $e.set(d.run, ($e.get(d.run) ?? 0) + (d.doneAt && !d.exitAt ? Fa : 1)), te(d) && (t++, mt.set(d.run, (mt.get(d.run) ?? 0) + 1));
991
+ z.alive = t;
992
+ const n = z.crowded;
993
+ !z.crowded && t > Qs ? z.crowded = !0 : z.crowded && t < Ca && (z.crowded = !1), !z.crowded && n && (z.showAll = !1, z.expandedLane = -1);
994
+ const s = z.crowded && !z.showAll;
995
+ let o = s !== z.grouped;
996
+ if (z.grouped = s, !s) {
997
+ (de.size || Oe.size) && (o = !0), de.clear(), Ue.clear(), Oe.clear(), z.expandedAgents = t, z.expandedRuns = f.runs.size, z.collapsedRuns = 0, z.activeClusters = 0;
998
+ for (const d of z.clusters) d.active && (d.active = !1, d.runIds.length = 0, d.version++);
999
+ o && z.version++, (o || n !== z.crowded) && Xe();
1000
+ return;
1001
+ }
1002
+ const r = f.selected ? f.instances.get(f.selected) : void 0, i = (r == null ? void 0 : r.run) ?? null;
1003
+ Le.length = 0, Ee.clear(), Et.clear();
1004
+ for (const [d, S] of $e) {
1005
+ if (S <= 0) continue;
1006
+ const A = f.runs.get(d), m = wt(d), v = de.has(d) && e - (Ue.get(d) ?? 0) < Wa, y = d === i ? 0 : z.expandedLane === m ? 1 : v ? 2 : (mt.get(d) ?? 0) > 0 ? 3 : 4;
1007
+ Ee.set(d, y), Et.set(d, (A == null ? void 0 : A.startedAt) ?? 0), Le.push(d);
1008
+ }
1009
+ Le.sort(Ha);
1010
+ const l = z.expandedLane >= 0 ? za : Ta;
1011
+ let u = 0, h = 0;
1012
+ Bt.fill(0);
1013
+ for (let d = 0; d < 2; d++)
1014
+ for (const S of Le) {
1015
+ const A = Ee.get(S);
1016
+ if (A === -1) continue;
1017
+ const m = wt(S);
1018
+ if (d === 0 && A >= 2 && Bt[m]) continue;
1019
+ const v = $e.get(S);
1020
+ (A === 0 || u === 0 || u + v <= l) && (u += v, h++, Bt[m]++, Ee.set(S, -1));
1021
+ }
1022
+ for (const d of de)
1023
+ Ee.get(d) !== -1 && (de.delete(d), Ue.delete(d), o = !0);
1024
+ for (const d of Le)
1025
+ Ee.get(d) === -1 && !de.has(d) && (de.add(d), Ue.set(d, e), o = !0);
1026
+ z.expandedRuns = h;
1027
+ let c = 0;
1028
+ for (const d of z.clusters) d.runIds.length = 0;
1029
+ for (const d of Le)
1030
+ de.has(d) || (z.clusters[wt(d)].runIds.push(d), c++);
1031
+ z.collapsedRuns = c, ze.length = 0, gt.clear();
1032
+ for (const d of f.instances.values()) {
1033
+ if (!te(d) || !de.has(d.run)) continue;
1034
+ const S = Ot(d, e) + (d.status === "thinking" ? 0.6 : 0) + (Oe.has(d.id) ? 0.4 : 0) + (e - d.bornAt < 3e3 ? 1 : 0) + (d.subagent ? 0 : 0.2);
1035
+ gt.set(d.id, S), ze.push(d);
1036
+ }
1037
+ ze.sort((d, S) => gt.get(S.id) - gt.get(d.id));
1038
+ const b = Math.min(Pa, ze.length);
1039
+ let a = Oe.size !== b;
1040
+ if (!a)
1041
+ for (let d = 0; d < b; d++) Oe.has(ze[d].id) || (a = !0);
1042
+ if (a) {
1043
+ Oe.clear();
1044
+ for (let d = 0; d < b; d++) Oe.add(ze[d].id);
1045
+ o = !0;
1046
+ }
1047
+ ze.length = 0, o && (z.version++, Xe());
1048
+ }
1049
+ function ja() {
1050
+ const e = performance.now(), t = z.clusters, n = Xa;
1051
+ for (let r = 0; r < re; r++) {
1052
+ const i = t[r];
1053
+ n[r * 3] = i.agents, n[r * 3 + 1] = i.thinking, n[r * 3 + 2] = i.runs, i.agents = i.thinking = i.tokens = 0;
1054
+ for (const l of qa) i.types[l] = 0;
1055
+ Zt[r] = 0;
1056
+ }
1057
+ let s = 0;
1058
+ for (const r of f.instances.values()) {
1059
+ if (de.has(r.run)) {
1060
+ te(r) && s++;
1061
+ continue;
1062
+ }
1063
+ if (!te(r)) continue;
1064
+ const i = t[La(r)];
1065
+ i.agents++, i.tokens += r.tokens, i.types[r.type]++, r.status === "thinking" && i.thinking++, Zt[i.lane] += Ot(r, e);
1066
+ }
1067
+ z.expandedAgents = s;
1068
+ let o = 0;
1069
+ for (let r = 0; r < re; r++) {
1070
+ const i = t[r];
1071
+ i.runs = i.runIds.length;
1072
+ const l = i.runs > 0;
1073
+ l && o++;
1074
+ const u = i.agents ? Math.min(1, Zt[r] / i.agents * 0.9 + i.thinking / i.agents * 0.35) : 0;
1075
+ i.energy += (u - i.energy) * 0.08, (l !== i.active || n[r * 3] !== i.agents || n[r * 3 + 1] !== i.thinking || n[r * 3 + 2] !== i.runs) && i.version++, i.active = l;
1076
+ }
1077
+ o !== z.activeClusters && (z.activeClusters = o, Xe());
1078
+ }
1079
+ const Xa = new Float64Array(re * 3), Zt = new Float64Array(re);
1080
+ function Ka(e = performance.now()) {
1081
+ if (e === Jn) return;
1082
+ Jn = e, f.selected !== jn && (jn = f.selected, Ie = !0);
1083
+ const t = f.instances.size;
1084
+ t !== Xn && (!z.grouped || t < Qs + 4) && (Ie = !0), Xn = t, (Ie || e - Hn > Ia) && (Ie = !1, Hn = e, Ja(e)), z.grouped && ja();
1085
+ }
1086
+ Pt.fadeMs = (e) => z.crowded ? de.has(e.run) || !z.grouped ? Na : Ga : Ws;
1087
+ const Cc = (e) => e === "graph_scout" || e === "records_scout" || e === "data_scout", et = (e, t) => fn(e, t) - 0.5, Qa = (e) => e === 0 ? 0 : e % 2 ? (e + 1) / 2 : -e / 2, ue = { preset: Ks, graphNatural: 1, graphRadius: 2.6, peripheryGap: 3.6 }, _s = { planner: -1, researcher: 0, writer: 1, graph_scout: 0, records_scout: 0, data_scout: 0 };
1088
+ function Tc(e) {
1089
+ return _s[e] * ue.preset.local.topGap * T.spread;
1090
+ }
1091
+ const Rt = new M.Vector3(), Vt = new M.Vector3(), Ht = new M.Vector3(), At = { a: 0, b: 0, angle: 0 }, tt = { a: 0, b: 0 }, Re = { n: 0, aspect: 1.6, hu: 2, hv: 2, hw: 2, hh: 2 }, Pe = [];
1092
+ let Jt = -1;
1093
+ const Ya = (e, t) => 1 - Math.exp(-e / t);
1094
+ function _a(e, t, n) {
1095
+ let s = (t - e) % (Math.PI * 2);
1096
+ return s > Math.PI && (s -= Math.PI * 2), s < -Math.PI && (s += Math.PI * 2), e + s * n;
1097
+ }
1098
+ function $s(e) {
1099
+ const t = f.runs.get(e);
1100
+ return {
1101
+ uid: kt(),
1102
+ id: e,
1103
+ run: t,
1104
+ index: 0,
1105
+ count: 1,
1106
+ color: (t == null ? void 0 : t.color) ?? "#94a3b8",
1107
+ origin: new M.Vector3(),
1108
+ target: new M.Vector3(),
1109
+ axis: new M.Vector3(0, -1, 0),
1110
+ side: new M.Vector3(1, 0, 0),
1111
+ angle: -Math.PI / 2,
1112
+ targetAngle: -Math.PI / 2,
1113
+ cu: 0,
1114
+ cv: 0,
1115
+ hu: 1,
1116
+ hv: 1,
1117
+ tcu: 0,
1118
+ tcv: 0,
1119
+ fresh: !0,
1120
+ members: 0,
1121
+ u0: 0,
1122
+ u1: 0,
1123
+ v0: 0,
1124
+ v1: 0
1125
+ };
1126
+ }
1127
+ function Yn(e) {
1128
+ let t = 0;
1129
+ for (let n = !0; n; ) {
1130
+ n = !1;
1131
+ for (const s of g.agents.values())
1132
+ if (s.sib === t && e(s)) {
1133
+ n = !0, t++;
1134
+ break;
1135
+ }
1136
+ }
1137
+ return t;
1138
+ }
1139
+ function $a(e) {
1140
+ let t = g.runs.get(e.run);
1141
+ t || (t = $s(e.run), g.runs.set(e.run, t), g.runsVersion++);
1142
+ const n = e.parent ? g.agents.get(e.parent) : void 0, s = e.subagent ? n ? n.depth + 1 : 1 : 0;
1143
+ let o;
1144
+ return s === 0 ? o = Yn((r) => r.depth === 0 && r.inst.run === e.run && r.inst.type === e.type) : o = Yn((r) => r.depth > 0 && r.inst.parent === e.parent), n && s > 0 && (n.kidsMax = Math.max(n.kidsMax, o + 1)), {
1145
+ uid: kt(),
1146
+ id: e.id,
1147
+ inst: e,
1148
+ run: t,
1149
+ u: 0,
1150
+ v: 0,
1151
+ eu: 0,
1152
+ ev: 0,
1153
+ target: new M.Vector3(),
1154
+ pos: new M.Vector3(),
1155
+ live: new M.Vector3(),
1156
+ scale: Gs(e) * T.scale,
1157
+ depth: s,
1158
+ sib: o,
1159
+ sibs: 1,
1160
+ kidsMax: 0,
1161
+ fresh: !0,
1162
+ dim: dn(e) ? 1 : 0
1163
+ };
1164
+ }
1165
+ const eo = 0.6, to = 16;
1166
+ function no() {
1167
+ let e = 0;
1168
+ for (const n of f.instances.values()) {
1169
+ if (g.agents.has(n.id) || n.exitAt || !Ut(n)) continue;
1170
+ if (e >= to) break;
1171
+ const s = n.parent ? f.instances.get(n.parent) : void 0;
1172
+ s && !s.exitAt && !g.agents.has(s.id) && Ut(s) || (g.agents.set(n.id, $a(n)), g.agentsVersion++, e++);
1173
+ }
1174
+ for (const [n, s] of g.agents)
1175
+ (!f.instances.has(n) || !Ut(s.inst)) && (g.agents.delete(n), g.agentsVersion++);
1176
+ for (const n of g.runs.values()) n.members = 0;
1177
+ for (const n of g.agents.values()) n.run.members++;
1178
+ for (const n of f.runs.values())
1179
+ g.runs.has(n.id) || n.endedAt || !Kn(n.id) || (g.runs.set(n.id, $s(n.id)), g.runsVersion++);
1180
+ for (const [n, s] of g.runs) {
1181
+ const o = f.runs.get(n);
1182
+ o && !s.run && (s.run = o, s.color = o.color), !(s.members > 0) && (o && !o.endedAt && Kn(n) || (g.runs.delete(n), g.runsVersion++));
1183
+ }
1184
+ const t = performance.now();
1185
+ for (const n of f.mcpServers.values()) {
1186
+ let s = g.mcp.get(n.name);
1187
+ const o = Kr(n, t);
1188
+ if (s && (s.wanted = o), !(!o && !s) && (s || (s = { uid: kt(), name: n.name, srv: n, out: new M.Vector3(1, 0, 0), target: new M.Vector3(), pos: new M.Vector3(), backends: /* @__PURE__ */ new Map(), fresh: !0, wanted: !0, mix: 0 }, g.mcp.set(n.name, s), g.mcpVersion++), s.backends.size !== n.resources.size)) {
1189
+ for (const r of n.resources.values())
1190
+ s.backends.has(r.name) || s.backends.set(r.name, { uid: kt(), res: r, k: 0, n: 0, target: new M.Vector3(), pos: new M.Vector3(), fresh: !0, mix: 0 });
1191
+ g.mcpVersion++;
1192
+ }
1193
+ }
1194
+ }
1195
+ let _n = -1;
1196
+ function so() {
1197
+ _n === g.runsVersion && g.runOrder.length === g.runs.size || (_n = g.runsVersion, g.runOrder = [...g.runs.values()].sort((e, t) => {
1198
+ var n, s;
1199
+ return (((n = e.run) == null ? void 0 : n.startedAt) ?? 0) - (((s = t.run) == null ? void 0 : s.startedAt) ?? 0) || (e.id < t.id ? -1 : 1);
1200
+ }));
1201
+ }
1202
+ function ro(e) {
1203
+ const t = ue.preset.local, n = T.spread, s = e.inst;
1204
+ if (e.depth === 0) {
1205
+ let l = _s[s.type] * t.topGap, u = 0;
1206
+ e.sib && (l += (e.sib % 2 ? 1 : -1) * t.topGap * 0.5, u -= Math.ceil(e.sib / 2) * t.fanLen * 0.55), e.u = (l + et(e.id, 31) * 0.5) * n, e.v = (u + et(e.id, 32) * 0.4) * n;
1207
+ return;
1208
+ }
1209
+ const o = s.parent ? g.agents.get(s.parent) : void 0;
1210
+ if (!o) return;
1211
+ e.sibs = Math.max(1, o.kidsMax);
1212
+ const r = e.depth > 1 ? 0.75 : 1, i = (t.subShift ?? 0) * r;
1213
+ if (t.fan === "stack")
1214
+ e.u = o.u + (i + Qa(e.sib) * 0.35 + et(e.id, 31) * 0.4) * n, e.v = o.v + (t.fanLen + e.sib * t.stackGap) * r * n;
1215
+ else {
1216
+ const l = e.sib - (e.sibs - 1) / 2;
1217
+ e.u = o.u + (i + l * t.subGap * r + et(e.id, 31) * 0.45) * n, e.v = o.v + (t.fanLen * r + Math.abs(l) * 0.3 + et(e.id, 32) * 0.45) * n;
1218
+ }
1219
+ }
1220
+ function ao() {
1221
+ var n;
1222
+ for (let s = 0; s < 6; s++) for (const o of g.agents.values()) (o.depth === s || s === 5 && o.depth >= 5) && ro(o);
1223
+ const e = ue.preset.local.pad;
1224
+ for (const s of g.runs.values()) s.u0 = 1 / 0;
1225
+ for (const s of g.agents.values()) {
1226
+ const o = s.run, r = e * Math.max(0.7, s.scale);
1227
+ o.u0 === 1 / 0 ? (o.u0 = s.u - r, o.u1 = s.u + r, o.v0 = s.v - r, o.v1 = s.v + r) : (o.u0 = Math.min(o.u0, s.u - r), o.u1 = Math.max(o.u1, s.u + r), o.v0 = Math.min(o.v0, s.v - r), o.v1 = Math.max(o.v1, s.v + r));
1228
+ }
1229
+ const t = ue.preset.local.topGap * T.spread;
1230
+ for (const s of g.runs.values())
1231
+ (n = s.run) != null && n.hasSteps && s.u0 !== 1 / 0 && (s.u0 = Math.min(s.u0, -t - e), s.u1 = Math.max(s.u1, t + e));
1232
+ for (const s of g.runs.values()) {
1233
+ if (s.u0 === 1 / 0) {
1234
+ s.hu = s.hv = e * 1.5, s.tcu = s.tcv = 0;
1235
+ continue;
1236
+ }
1237
+ s.tcu = (s.u0 + s.u1) / 2, s.tcv = (s.v0 + s.v1) / 2, s.hu = (s.u1 - s.u0) / 2, s.hv = (s.v1 - s.v0) / 2;
1238
+ }
1239
+ }
1240
+ function gn(e, t, n) {
1241
+ const s = Math.cos(e), o = Math.sin(e);
1242
+ ce(s, o, t);
1243
+ let r = -o, i = s;
1244
+ r < -1e-3 && (r = -r, i = -i), ce(r, i, n);
1245
+ }
1246
+ function oo(e, t, n, s) {
1247
+ return gn(e.targetAngle, Rt, Vt), s.copy(e.target).addScaledVector(Vt, t - e.tcu).addScaledVector(Rt, n - e.tcv);
1248
+ }
1249
+ const an = (e) => e.x, nt = (e) => g.plane === "xy" ? e.y : -e.z;
1250
+ function io() {
1251
+ const e = ue.preset, t = g.runOrder;
1252
+ let n = 0, s = 0;
1253
+ for (const o of t)
1254
+ n = Math.max(n, o.hu), s = Math.max(s, o.hv);
1255
+ Re.n = t.length, Re.aspect = T.aspect * (e.periphery === "sides" ? 0.72 : 1) / (g.plane === "xz" ? st : 1), Re.hu = n, Re.hv = s;
1256
+ for (let o = 0; o < t.length; o++) {
1257
+ const r = t[o];
1258
+ r.index = o, r.count = t.length, e.run(o, Re, At), ce(At.a, At.b, r.target), r.targetAngle = At.angle;
1259
+ }
1260
+ }
1261
+ let st = 1;
1262
+ function co() {
1263
+ const e = ue.preset, t = Math.min(1.7, 1 / Math.max(0.35, T.foreshorten));
1264
+ Math.abs(t - st) / st > 0.1 && (st = t);
1265
+ let n = 0, s = 0;
1266
+ for (const c of g.agents.values()) {
1267
+ const b = ue.preset.local.pad * Math.max(0.7, c.scale);
1268
+ n = Math.max(n, Math.abs(an(c.target)) + b), s = Math.max(s, Math.abs(nt(c.target)) + b);
1269
+ }
1270
+ for (const c of g.runs.values())
1271
+ c.members || (n = Math.max(n, Math.abs(an(c.target)) + c.hu), s = Math.max(s, Math.abs(nt(c.target)) + c.hv));
1272
+ if (Re.hw = n, Re.hh = s, Pe.length = 0, z.grouped)
1273
+ for (let c = 0; c < re; c++) rn(c).active && Pe.push(c);
1274
+ for (let c = 0; c < Pe.length; c++) {
1275
+ const b = Pe[c];
1276
+ e.cluster(b, c, Pe.length, Re, tt), ce(tt.a, tt.b, g.clusterTarget[b]), n = Math.max(n, Math.abs(tt.a) + 2.4), s = Math.max(s, Math.abs(tt.b) + 2.4);
1277
+ }
1278
+ e.round && (n = s = Math.max(n, s));
1279
+ const o = g.core;
1280
+ (Math.abs(n - o.thw) / Math.max(1, o.thw) > 0.08 || n < o.thw * 0.75) && (o.thw = n), (Math.abs(s - o.thh) / Math.max(1, o.thh) > 0.08 || s < o.thh * 0.75) && (o.thh = s), n = Math.max(2.5, o.thw), s = Math.max(2.5, o.thh);
1281
+ const r = ue.peripheryGap, i = g.graph, l = g.graphWanted && Wt(), u = ue.graphRadius;
1282
+ i.radius = u;
1283
+ const h = lo;
1284
+ h.length = 0;
1285
+ for (const c of g.mcp.values()) c.wanted && h.push(c);
1286
+ if (h.sort(uo), e.periphery === "rim") {
1287
+ const c = Math.max(n, s) + r;
1288
+ l && ce(-(c + u), 0, i.target);
1289
+ const b = l ? fo : ho;
1290
+ for (let a = 0; a < h.length; a++) {
1291
+ const d = h[a], S = Math.floor(a / b.length), A = b[a % b.length] + S * 0.18, m = c + 1 + S * 2.6;
1292
+ ce(Math.cos(A), Math.sin(A), d.out), ce(Math.cos(A) * m, Math.sin(A) * m, d.target);
1293
+ const v = d.backends.size;
1294
+ let y = 0;
1295
+ for (const G of d.backends.values()) {
1296
+ G.k = y, G.n = v;
1297
+ const C = m + 3.2, R = A + (y - (v - 1) / 2) * (2.1 / C);
1298
+ ce(Math.cos(R) * C, Math.sin(R) * C, G.target), y++;
1299
+ }
1300
+ }
1301
+ } else {
1302
+ const c = T.aspect >= 0.85;
1303
+ l && (c ? ce(-(n + r + u), 0, i.target) : ce(0, -(s + r + u), i.target)), jt.length = 0, Xt.length = 0;
1304
+ for (let b = 0; b < h.length; b++)
1305
+ ((l ? b < Math.max(3, Math.ceil(h.length * 0.6)) : b % 2 === 0) ? Xt : jt).push(h[b]);
1306
+ $n(Xt, 1, n + r, 0), $n(jt, -1, n + r, l && c ? u * 2 + 3.5 : 0);
1307
+ }
1308
+ l && i.target.lengthSq() > 1e-6 && i.out.copy(i.target).normalize();
1309
+ }
1310
+ const lo = [], jt = [], Xt = [], uo = (e, t) => e.srv.slot - t.srv.slot, er = Math.PI / 180, fo = [0, 35, -35, 70, -70, 110, -110, 145, -145].map((e) => e * er), ho = [0, 180, 35, -145, -35, 145, 70, -110, -70, 110].map((e) => e * er);
1311
+ function $n(e, t, n, s) {
1312
+ if (!e.length) return;
1313
+ const o = st, r = (u) => Math.max(3, u.backends.size * 2.1 + 0.6) * o, i = s > 0 ? Math.ceil(e.length / 2) : e.length;
1314
+ let l = 0;
1315
+ if (s > 0) {
1316
+ l = s / 2;
1317
+ for (let u = 0; u < i; u++) l += r(e[u]);
1318
+ } else for (const u of e) l += r(u) / 2;
1319
+ for (let u = 0; u < e.length; u++) {
1320
+ s > 0 && u === i && (l = -s / 2);
1321
+ const h = e[u], c = r(h), b = l - c / 2;
1322
+ ce(t, 0, h.out), ce(t * (n + 1), b, h.target);
1323
+ const a = h.backends.size;
1324
+ let d = 0;
1325
+ for (const S of h.backends.values())
1326
+ S.k = d, S.n = a, ce(t * (n + 1 + 3.6), b + ((a - 1) / 2 - d) * 2.1 * o, S.target), d++;
1327
+ l -= c;
1328
+ }
1329
+ }
1330
+ function po(e = performance.now()) {
1331
+ const t = Jt < 0 ? 0.016 : Math.min(0.1, (e - Jt) / 1e3);
1332
+ if (Jt = e, !g.clusterPos.length)
1333
+ for (let a = 0; a < re; a++)
1334
+ g.clusterPos.push(new M.Vector3()), g.clusterTarget.push(new M.Vector3()), g.clusterFresh.push(!0);
1335
+ no(), so();
1336
+ let n = 0, s = 0;
1337
+ for (const a of g.agents.values())
1338
+ n += a.inst.subagent ? 0.5 : 1, a.inst.exitAt || s++;
1339
+ let o = 0;
1340
+ if (z.grouped)
1341
+ for (let a = 0; a < re; a++) rn(a).active && o++;
1342
+ let r = 0;
1343
+ for (const a of g.mcp.values()) a.wanted && r++;
1344
+ fa(e, n + o * 1.5, g.agents.size + s * 1e3 + o * 1e6 + g.runs.size * 1e8 + r * 1e10 + (g.graphWanted ? 1e13 : 0));
1345
+ for (const a of g.agents.values()) a.scale = Gs(a.inst) * T.scale;
1346
+ ao(), io();
1347
+ for (const a of g.agents.values()) oo(a.run, a.u, a.v, a.target);
1348
+ co();
1349
+ const i = Ya(t, 0.2);
1350
+ for (const a of g.runs.values())
1351
+ a.fresh ? (a.origin.copy(a.target), a.angle = a.targetAngle, a.cu = a.tcu, a.cv = a.tcv, a.fresh = !1) : (a.origin.lerp(a.target, i), a.angle = _a(a.angle, a.targetAngle, i), a.cu += (a.tcu - a.cu) * i, a.cv += (a.tcv - a.cv) * i), gn(a.angle, a.axis, a.side);
1352
+ for (const a of g.agents.values()) {
1353
+ a.fresh ? (a.eu = a.u, a.ev = a.v, a.fresh = !1) : (a.eu += (a.u - a.eu) * i, a.ev += (a.v - a.ev) * i);
1354
+ const d = a.run;
1355
+ a.pos.copy(d.origin).addScaledVector(d.side, a.eu - d.cu).addScaledVector(d.axis, a.ev - d.cv), a.live.copy(a.pos);
1356
+ const S = dn(a.inst) ? 1 : 0;
1357
+ a.dim = rt ? S : a.dim + (S - a.dim) * Math.min(1, t / eo);
1358
+ }
1359
+ for (const a of Pe)
1360
+ g.clusterFresh[a] ? (g.clusterPos[a].copy(g.clusterTarget[a]), g.clusterFresh[a] = !1) : g.clusterPos[a].lerp(g.clusterTarget[a], i);
1361
+ for (let a = 0; a < re; a++) rn(a).active || (g.clusterFresh[a] = !0);
1362
+ const l = g.core;
1363
+ l.hw += (Math.max(2.5, l.thw) - l.hw) * i, l.hh += (Math.max(2.5, l.thh) - l.hh) * i, l.r = Math.max(l.hw, l.hh);
1364
+ const u = Math.min(1, t / mo);
1365
+ for (const a of g.mcp.values()) {
1366
+ a.fresh ? (a.pos.copy(a.target), a.fresh = !1) : a.pos.lerp(a.target, i), a.mix = a.wanted ? Math.min(1, a.mix + u) : Math.max(0, a.mix - u);
1367
+ for (const d of a.backends.values())
1368
+ d.fresh ? (d.pos.copy(d.target), d.fresh = !1) : d.pos.lerp(d.target, i), d.mix = a.wanted ? Math.min(1, d.mix + u) : Math.min(d.mix, a.mix);
1369
+ !a.wanted && a.mix <= 0 && (g.mcp.delete(a.name), g.mcpVersion++);
1370
+ }
1371
+ const h = g.graph, c = g.graphWanted && Wt(e), b = c ? Yr(e) : 0;
1372
+ h.mix += (b - h.mix) * (c ? 1 : i), h.fresh || h.mix < 0.01 ? (h.pos.copy(h.target), h.fresh = !c) : h.pos.lerp(h.target, i), h.natural = ue.graphNatural, h.scale = h.radius / Math.max(1e-3, h.natural) * Math.max(1e-3, h.mix);
1373
+ }
1374
+ const mo = 0.9;
1375
+ function go(e, t, n = 0) {
1376
+ const s = g.plane === "xz" && n > 0;
1377
+ for (const r of g.agents.values())
1378
+ e(r.target, t * r.scale), s && e(Ht.copy(r.target).setY(r.target.y + n * r.scale), t * r.scale * 0.6);
1379
+ for (const r of Pe) e(g.clusterTarget[r], 2.4);
1380
+ for (const r of g.runs.values()) {
1381
+ r.members || e(r.target, r.hu), gn(r.targetAngle, Rt, Vt);
1382
+ const i = Math.abs(nt(Vt)) * r.hu + Math.abs(nt(Rt)) * r.hv;
1383
+ ce(an(r.target), nt(r.target) + i + 1.4, Ht), e(Ht, 1.2);
1384
+ }
1385
+ for (const r of g.mcp.values())
1386
+ if (r.wanted) {
1387
+ e(r.target, 1.7);
1388
+ for (const i of r.backends.values()) e(i.target, 1.4);
1389
+ }
1390
+ const o = g.graph;
1391
+ g.graphWanted && Wt() && e(o.target, o.radius + 0.8);
1392
+ }
1393
+ const Ao = "data:font/woff;base64,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", bo = "data:font/woff;base64,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", vo = { kitNoDim: !0 }, es = [1.2, 3.2], ts = { sans: Ao, mono: bo }, ns = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~·›…—–ו", yo = [
1394
+ [32, 126],
1395
+ [160, 255],
1396
+ [305, 305],
1397
+ [338, 339],
1398
+ [699, 700],
1399
+ [710, 710],
1400
+ [730, 730],
1401
+ [732, 732],
1402
+ [8192, 8303],
1403
+ [8364, 8364],
1404
+ [8482, 8482],
1405
+ [8593, 8593],
1406
+ [8595, 8595],
1407
+ [8722, 8722],
1408
+ [8725, 8725]
1409
+ ], Mo = (e) => {
1410
+ for (const [t, n] of yo) if (e >= t && e <= n) return !0;
1411
+ return !1;
1412
+ }, xo = { "▶": "›", "▸": "›", "→": "›", "⟶": "›", "←": "‹", "✓": "·", "✔": "·", "✕": "×", "✗": "×", "✖": "×", "⋯": "…" };
1413
+ function tr(e) {
1414
+ let t = "";
1415
+ for (const n of e) {
1416
+ const s = xo[n];
1417
+ s !== void 0 ? t += s : Mo(n.codePointAt(0)) && (t += n);
1418
+ }
1419
+ return t;
1420
+ }
1421
+ const bt = /* @__PURE__ */ new Map();
1422
+ function wo(e) {
1423
+ const t = bt.get(e);
1424
+ if (t !== void 0) return t;
1425
+ const n = tr(e).replace(/\s+/g, " ").replace(/^[\s·›]+|[\s·›]+$/g, "");
1426
+ return bt.size > 2e3 && bt.clear(), bt.set(e, n), n;
1427
+ }
1428
+ const ss = (e, t) => t > 0 && e.length > t ? e.slice(0, Math.max(1, t - 1)).trimEnd() + "…" : e, rs = new M.PlaneGeometry(1, 1), vt = () => {
1429
+ }, as = {
1430
+ top: new M.MeshBasicMaterial({ color: 16777215, transparent: !0, depthTest: !1, depthWrite: !1, toneMapped: !1, fog: !1, side: M.DoubleSide }),
1431
+ depth: new M.MeshBasicMaterial({ color: 16777215, transparent: !0, depthTest: !0, depthWrite: !1, toneMapped: !1, fog: !1, side: M.DoubleSide })
1432
+ }, ko = (
1433
+ /* glsl */
1434
+ `
1435
+ varying vec2 vUv;
1436
+ void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
1437
+ ), So = (
1438
+ /* glsl */
1439
+ `
1440
+ uniform vec2 uSize; uniform float uRadius; uniform float uBorder; uniform float uBar; uniform float uUnder;
1441
+ uniform vec3 uFill; uniform float uFillA; uniform vec3 uEdge; uniform float uEdgeA; uniform float uOpacity;
1442
+ varying vec2 vUv;
1443
+ float sdBox(vec2 p, vec2 b, float r) { vec2 q = abs(p) - b + r; return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r; }
1444
+ void main() {
1445
+ vec2 p = (vUv - 0.5) * uSize;
1446
+ float d = sdBox(p, uSize * 0.5, uRadius);
1447
+ float aa = fwidth(d) * 0.75;
1448
+ float inside = 1.0 - smoothstep(-aa, aa, d);
1449
+ float ring = inside * smoothstep(-uBorder - aa, -uBorder + aa, d) * step(0.00001, uBorder);
1450
+ float bar = inside * (1.0 - smoothstep(-aa, aa, p.x + uSize.x * 0.5 - uBar)) * step(0.00001, uBar);
1451
+ float under = inside * (1.0 - smoothstep(-aa, aa, p.y + uSize.y * 0.5 - uUnder)) * step(0.00001, uUnder);
1452
+ float e = max(max(ring, bar), under);
1453
+ vec3 col = mix(uFill, uEdge, e);
1454
+ float a = max(inside * uFillA, e * uEdgeA) * uOpacity;
1455
+ if (a < 0.002) discard;
1456
+ gl_FragColor = vec4(col, a);
1457
+ }`
1458
+ ), os = {
1459
+ // border / bar / under in × font size; round in × plate height (0.5 = pill)
1460
+ pill: { fillA: 0.52, edgeA: 0.6, border: 0.055, bar: 0, under: 0, round: 0.5 },
1461
+ box: { fillA: 0.62, edgeA: 0.55, border: 0.055, bar: 0, under: 0, round: 0.14 },
1462
+ bar: { fillA: 0.66, edgeA: 0.95, border: 0, bar: 0.14, under: 0, round: 0.06 },
1463
+ underline: { fillA: 0.52, edgeA: 0.8, border: 0, bar: 0, under: 0.07, round: 0.06 },
1464
+ none: { fillA: 0, edgeA: 0, border: 0, bar: 0, under: 0, round: 0 }
1465
+ }, nr = new M.Color("#03050b"), Kt = new M.Color("#eef2f8"), is = new M.Color("#94a3b8");
1466
+ function yt(e, t, n) {
1467
+ if (e == null) return { text: "", ranges: null, key: "" };
1468
+ if (typeof e == "string") {
1469
+ const i = wo(t ? e.toUpperCase() : e);
1470
+ return { text: i, ranges: null, key: i };
1471
+ }
1472
+ let s = "", o = "";
1473
+ const r = {};
1474
+ for (const i of e) {
1475
+ let l = tr(t ? i.text.toUpperCase() : i.text);
1476
+ if (s || (l = l.trimStart()), !l) continue;
1477
+ const u = i.color != null ? n.set(i.color).getHex() : -1;
1478
+ u >= 0 && (r[s.length] = u), o += `${l}${u}`, s += l;
1479
+ }
1480
+ return { text: s.trimEnd(), ranges: r, key: o };
1481
+ }
1482
+ function zc(e, t, n = ["working…", "done"]) {
1483
+ const s = e.status !== "started";
1484
+ if (!e.hasSteps) return [{ text: s ? e.status === "failed" ? n[2] ?? "failed" : n[1] : n[0], color: t.base }];
1485
+ const o = [{ text: "hatchet · ", color: t.base }], { shown: r, more: i } = zs(e);
1486
+ r.forEach((u, h) => {
1487
+ h && o.push({ text: " › ", color: t.base });
1488
+ const c = e.steps[u], b = c === "running" && !!e.waits[u];
1489
+ o.push({ text: u, color: b ? cs : c === "running" ? t.current : c === "done" ? t.done : c === "failed" ? "#ff5d5d" : t.queued ?? Eo(t.base) });
1490
+ }), i && o.push({ text: ` +${i}`, color: t.base });
1491
+ const l = s ? null : Ts(e);
1492
+ return l && o.push({ text: ` · ${at(l)}`, color: cs }), o;
1493
+ }
1494
+ const cs = "#f59e0b", Oo = new M.Color(), Eo = (e) => "#" + Oo.set(e).lerp(nr, 0.45).getHexString();
1495
+ function Pc({ prefix: e = "", suffix: t = "", ...n }) {
1496
+ const s = ct();
1497
+ return /* @__PURE__ */ p(An, { declutter: "resource", ...n, text: e + s.graphLabel + t });
1498
+ }
1499
+ function An(e) {
1500
+ return /* @__PURE__ */ p(Sr, { fallback: null, children: /* @__PURE__ */ p(Vo, { ...e }) });
1501
+ }
1502
+ const Ro = {
1503
+ color: "#818cf8",
1504
+ size: 0.24,
1505
+ opacity: 1,
1506
+ maxWidth: 0,
1507
+ anchorX: "center",
1508
+ anchorY: "middle",
1509
+ textAlign: "center",
1510
+ plate: "pill",
1511
+ font: "sans",
1512
+ uppercase: !1,
1513
+ letterSpacing: 0,
1514
+ depthTest: !1,
1515
+ depthFade: 0.22,
1516
+ fadeRange: [14, 80],
1517
+ renderOrder: 20,
1518
+ fadeMs: 0,
1519
+ pxRange: [7.5, 15],
1520
+ glow: 1,
1521
+ leader: !1,
1522
+ fit: !1
1523
+ };
1524
+ function Vo(e) {
1525
+ var G, C;
1526
+ const t = { ...Ro, ...Co(e) }, n = U(t);
1527
+ n.current = t;
1528
+ const s = U(null), o = U(null), r = U(null), i = U(null), l = U(null), u = U(null), h = U(null), c = ne(
1529
+ () => ({
1530
+ target: t.opacity,
1531
+ cur: t.opacity,
1532
+ emph: !1,
1533
+ accent: new M.Color(t.color),
1534
+ textCol: new M.Color(t.textColor ?? Kt),
1535
+ subCol: new M.Color(t.secondaryColor ?? is),
1536
+ mainColor: new M.Color(),
1537
+ subColor: new M.Color(),
1538
+ tmp: new M.Color(),
1539
+ wp: new M.Vector3(),
1540
+ q: new M.Quaternion(),
1541
+ hasSub: !1,
1542
+ /** declutter: eased visibility factor, secondary line dropped, plate rects (billboard units) */
1543
+ dc: 1,
1544
+ subOff: !1,
1545
+ W: 0,
1546
+ H: 0,
1547
+ bx: 0,
1548
+ by: 0,
1549
+ W1: 0,
1550
+ H1: 0,
1551
+ bx1: 0,
1552
+ by1: 0,
1553
+ ndc: new M.Vector3(),
1554
+ keyM: "\0",
1555
+ keyS: "\0"
1556
+ }),
1557
+ // eslint-disable-next-line react-hooks/exhaustive-deps
1558
+ []
1559
+ ), b = ne(
1560
+ () => ({
1561
+ plate: new M.ShaderMaterial({
1562
+ vertexShader: ko,
1563
+ fragmentShader: So,
1564
+ transparent: !0,
1565
+ depthWrite: !1,
1566
+ toneMapped: !1,
1567
+ uniforms: {
1568
+ uSize: { value: new M.Vector2(1, 1) },
1569
+ uRadius: { value: 0.1 },
1570
+ uBorder: { value: 0 },
1571
+ uBar: { value: 0 },
1572
+ uUnder: { value: 0 },
1573
+ uFill: { value: nr.clone() },
1574
+ uFillA: { value: 0.5 },
1575
+ uEdge: { value: new M.Color() },
1576
+ uEdgeA: { value: 0.5 },
1577
+ uOpacity: { value: 1 }
1578
+ }
1579
+ }),
1580
+ leader: new M.MeshBasicMaterial({ transparent: !0, depthWrite: !1, toneMapped: !1, fog: !1 })
1581
+ }),
1582
+ []
1583
+ );
1584
+ $(() => () => (b.plate.dispose(), b.leader.dispose()), [b]), b.plate.depthTest = t.depthTest, b.leader.depthTest = t.depthTest;
1585
+ const a = ne(() => {
1586
+ const R = () => n.current.secondarySize ?? n.current.size * 0.78, P = () => {
1587
+ const k = n.current;
1588
+ return k.maxWidth > 0 ? Math.max(4, Math.floor(k.maxWidth / (k.size * (k.font === "mono" ? 0.62 : 0.56) * (1 + k.letterSpacing)))) : 0;
1589
+ };
1590
+ return { applyColors: () => {
1591
+ const k = n.current, x = b.plate.uniforms, D = os[k.plate];
1592
+ x.uEdge.value.copy(c.accent).lerp(Kt, c.emph ? 0.3 : 0), x.uEdgeA.value = Math.min(1, D.edgeA * (c.emph ? 1.45 : 1)), x.uFillA.value = D.fillA, b.leader.color.copy(c.accent).multiplyScalar(0.85);
1593
+ const F = k.glow * (c.emph ? 1.12 : 0.95);
1594
+ c.mainColor.copy(c.textCol).multiplyScalar(F), c.subColor.copy(c.subCol).multiplyScalar(F);
1595
+ }, layout: () => {
1596
+ var he, Ke, Fe, yn, Mn;
1597
+ const k = u.current;
1598
+ if (!k || !i.current || !r.current) return;
1599
+ const x = n.current, D = x.size, F = (he = k.textRenderInfo) == null ? void 0 : he.blockBounds, N = c.hasSub ? (Fe = (Ke = h.current) == null ? void 0 : Ke.textRenderInfo) == null ? void 0 : Fe.blockBounds : void 0, Q = F && k.text ? F[2] - F[0] : 0, X = N ? N[2] - N[0] : 0, K = D * 1.16, L = os[x.plate], O = L.bar * D, q = x.plate === "none", B = q ? 0 : D * 0.28, j = ((yn = x.offset) == null ? void 0 : yn[0]) ?? 0, I = ((Mn = x.offset) == null ? void 0 : Mn[1]) ?? 0;
1600
+ let Y = 0, ee = 0, ge = 0, ke = 0, ae = 0;
1601
+ for (let Se = 0; Se < 2; Se++) {
1602
+ const ut = Se === 0 && c.hasSub, yr = q ? 0 : D * (x.plate === "pill" && !ut ? 0.6 : 0.5), xn = ut ? Math.max(Q, X) : Q, wn = ut ? R() * 1.2 : 0, kn = ut ? D * 0.1 : 0, Qe = xn + yr * 2 + O, Ye = K + kn + wn + B * 2, Sn = j + (x.anchorX === "left" ? Qe / 2 : x.anchorX === "right" ? -Qe / 2 : 0), On = I + (x.anchorY === "bottom" ? Ye / 2 : x.anchorY === "top" ? -Ye / 2 : 0);
1603
+ Se === 0 ? (c.W = Qe, c.H = Ye, c.bx = Sn, c.by = On) : (c.W1 = c.hasSub ? Qe : 0, c.H1 = Ye, c.bx1 = Sn, c.by1 = On), Se === 0 == !(c.hasSub && c.subOff) && (Y = Qe, ee = Ye, ge = xn, ke = wn, ae = kn);
1604
+ }
1605
+ const ie = b.plate.uniforms;
1606
+ ie.uSize.value.set(Y, ee), ie.uRadius.value = Math.min(ee * L.round, ee * 0.5), ie.uBorder.value = L.border * D, ie.uBar.value = O, ie.uUnder.value = L.under * D, i.current.scale.set(Math.max(Y, 1e-4), Math.max(ee, 1e-4), 1), i.current.visible = !q && ge > 0;
1607
+ const Ve = x.textAlign === "left" ? -ge / 2 + O / 2 : x.textAlign === "right" ? ge / 2 + O / 2 : O / 2, Z = ee / 2 - B - K / 2;
1608
+ k.position.set(Ve, Z, 1e-3), h.current && (h.current.position.set(Ve, Z - K / 2 - ae - ke / 2, 1e-3), h.current.visible = c.hasSub && !c.subOff), r.current.position.set(j + (x.anchorX === "left" ? Y / 2 : x.anchorX === "right" ? -Y / 2 : 0), I + (x.anchorY === "bottom" ? ee / 2 : x.anchorY === "top" ? -ee / 2 : 0), 0);
1609
+ const se = l.current;
1610
+ if (se) {
1611
+ const Se = Math.hypot(j, I);
1612
+ se.visible = Se > 1e-3, se.position.set(j / 2, I / 2, 0), se.rotation.z = Math.atan2(I, j), se.scale.set(Math.max(Se, 1e-4), D * 0.05, 1);
1613
+ }
1614
+ }, setLines: (k, x) => {
1615
+ const D = u.current, F = h.current;
1616
+ if (!D) return;
1617
+ const N = n.current, Q = P(), X = yt(k, N.uppercase, c.tmp), K = yt(x, N.uppercase, c.tmp), L = `${X.key}|${Q}`, O = `${K.key}|${Q}`;
1618
+ if (L !== c.keyM && (c.keyM = L, D.text = ss(X.text, Q), D.colorRanges = X.ranges, D.sync()), F && O !== c.keyS) {
1619
+ c.keyS = O;
1620
+ const q = ss(K.text, Q ? Math.round(Q * N.size / R()) : 0);
1621
+ c.hasSub = !!q, F.visible = c.hasSub && !c.subOff, F.text = q, F.colorRanges = K.ranges, F.sync();
1622
+ }
1623
+ } };
1624
+ }, [b, c]);
1625
+ $(() => {
1626
+ const R = [u.current, h.current].filter(Boolean), P = () => a.layout();
1627
+ for (const w of R) w.addEventListener("synccomplete", P);
1628
+ return a.applyColors(), a.setLines(n.current.text, n.current.secondary), a.layout(), () => {
1629
+ for (const w of R) w.removeEventListener("synccomplete", P);
1630
+ };
1631
+ }, [a]);
1632
+ const d = yt(t.text, t.uppercase, c.tmp).key, S = yt(t.secondary, t.uppercase, c.tmp).key;
1633
+ $(() => a.setLines(n.current.text, n.current.secondary), [a, d, S, t.uppercase, t.maxWidth, t.size]), $(() => {
1634
+ c.accent.set(n.current.color), c.textCol.set(n.current.textColor ?? Kt), c.subCol.set(n.current.secondaryColor ?? is), a.applyColors();
1635
+ }, [a, c, t.color, t.textColor, t.secondaryColor, t.glow, t.plate]), $(() => void (c.target = t.opacity), [c, t.opacity]), $(() => a.layout(), [a, t.size, t.plate, t.anchorX, t.anchorY, t.textAlign, (G = t.offset) == null ? void 0 : G[0], (C = t.offset) == null ? void 0 : C[1]]), Or(
1636
+ t.ref,
1637
+ () => ({
1638
+ get object() {
1639
+ return s.current;
1640
+ },
1641
+ setOpacity(R, P = !1) {
1642
+ c.target = R, P && (c.cur = R);
1643
+ },
1644
+ setText(R, P) {
1645
+ a.setLines(R, P ?? null);
1646
+ },
1647
+ setColor(R) {
1648
+ c.tmp.set(R), c.tmp.equals(c.accent) || (c.accent.copy(c.tmp), a.applyColors());
1649
+ },
1650
+ setEmphasis(R) {
1651
+ R !== c.emph && (c.emph = R, a.applyColors());
1652
+ }
1653
+ }),
1654
+ [a, c]
1655
+ );
1656
+ const A = ws(qe), m = ne(
1657
+ () => t.declutter === !1 ? null : $r(t.declutter ?? A.kind, A.agent, t.size),
1658
+ [t.declutter, A, t.size]
1659
+ );
1660
+ $(() => {
1661
+ if (m)
1662
+ return ea(m), () => ta(m);
1663
+ }, [m]), be(({ camera: R, size: P }, w) => {
1664
+ const V = s.current, W = o.current;
1665
+ if (!V || !W) return;
1666
+ const k = n.current;
1667
+ c.cur !== c.target && (k.fadeMs <= 0 ? c.cur = c.target : (c.cur += (c.target - c.cur) * Math.min(1, w * 1e3 / k.fadeMs), Math.abs(c.target - c.cur) < 4e-3 && (c.cur = c.target)));
1668
+ const x = m;
1669
+ if (x) {
1670
+ const B = H.active ? x.show : 1;
1671
+ c.dc += (B - c.dc) * Math.min(1, w / 0.12), Math.abs(B - c.dc) < 0.01 && (c.dc = B);
1672
+ const j = H.active ? x.subOff : !1;
1673
+ j !== c.subOff && c.hasSub && (c.subOff = j, a.layout()), x.live = !1;
1674
+ }
1675
+ if (x && (x.drawn = !1), c.cur <= 4e-3 || !V.visible) {
1676
+ W.visible = !1;
1677
+ return;
1678
+ }
1679
+ V.getWorldPosition(c.wp), V.getWorldQuaternion(c.q);
1680
+ const D = c.wp.distanceTo(R.position), F = k.fit ? T.label : 1;
1681
+ let N = F;
1682
+ const Q = R, X = R, K = Q.isPerspectiveCamera ? 2 * D * Math.tan(M.MathUtils.degToRad(Q.fov) / 2) / (Q.zoom * P.height) : (X.top - X.bottom) / (X.zoom * P.height);
1683
+ if (k.pxRange) {
1684
+ const B = k.size * F / Math.max(K, 1e-6), j = H.pxk;
1685
+ N = M.MathUtils.clamp(B, k.pxRange[0] * j, k.pxRange[1] * j) / B * F;
1686
+ }
1687
+ if (x && H.due && ls(V) && (c.ndc.copy(c.wp).project(R), c.ndc.z < 1 && c.ndc.z > -1)) {
1688
+ const B = N / Math.max(K, 1e-6), j = (c.ndc.x + 1) / 2 * P.width, I = (1 - c.ndc.y) / 2 * P.height;
1689
+ x.x = j + c.bx * B, x.y = I - c.by * B, x.w = c.W * B, x.h = c.H * B, x.x1 = j + c.bx1 * B, x.y1 = I - c.by1 * B, x.w1 = c.W1 * B, x.h1 = c.H1 * B, x.live = x.w > 1 && x.x + x.w / 2 > 0 && x.x - x.w / 2 < P.width && x.y + x.h / 2 > 0 && x.y - x.h / 2 < P.height, x.clip = x.x - x.w / 2 < -2 || x.x + x.w / 2 > P.width + 2 || x.y - x.h / 2 < -2 || x.y + x.h / 2 > P.height + 2, x.ax = c.wp.x, x.ay = c.wp.y, x.az = c.wp.z, x.ox0 = x.x - x.w / 2 - j, x.ox1 = x.x + x.w / 2 - j, x.oy0 = x.y - x.h / 2 - I, x.oy1 = x.y + x.h / 2 - I, x.w > 1 && (x.seen = performance.now());
1690
+ }
1691
+ const L = A.agent, q = M.MathUtils.smoothstep(D, es[0], es[1]) * c.cur * c.dc * (L ? 1 - 0.55 * L.dim : 1) * (1 - k.depthFade * M.MathUtils.smoothstep(D, k.fadeRange[0], k.fadeRange[1]));
1692
+ if (q <= 4e-3) {
1693
+ W.visible = !1;
1694
+ return;
1695
+ }
1696
+ W.visible = !0, x && (x.drawn = q > 0.05 && ls(V.parent)), W.quaternion.copy(c.q.invert()).multiply(R.quaternion), W.scale.setScalar(N / (V.matrixWorld.getMaxScaleOnAxis() || 1)), b.plate.uniforms.uOpacity.value = q, b.leader.opacity = q * 0.65, u.current && (u.current.fillOpacity = q), h.current && (h.current.fillOpacity = q * 0.92);
1697
+ });
1698
+ const v = t.depthTest ? as.depth : as.top, y = !!t.onClick;
1699
+ return /* @__PURE__ */ p("group", { ref: s, position: t.position, visible: t.visible ?? !0, userData: vo, children: /* @__PURE__ */ E("group", { ref: o, visible: !1, children: [
1700
+ t.leader && /* @__PURE__ */ p("mesh", { ref: l, geometry: rs, material: b.leader, renderOrder: t.renderOrder, raycast: vt }),
1701
+ /* @__PURE__ */ E("group", { ref: r, children: [
1702
+ /* @__PURE__ */ p(
1703
+ "mesh",
1704
+ {
1705
+ ref: i,
1706
+ geometry: rs,
1707
+ material: b.plate,
1708
+ renderOrder: t.renderOrder,
1709
+ raycast: y ? M.Mesh.prototype.raycast : vt,
1710
+ onClick: t.onClick,
1711
+ onPointerOver: y ? () => {
1712
+ var R;
1713
+ return document.body.style.cursor = "pointer", (R = t.onHover) == null ? void 0 : R.call(t, !0);
1714
+ } : void 0,
1715
+ onPointerOut: y ? () => {
1716
+ var R;
1717
+ return document.body.style.cursor = "", (R = t.onHover) == null ? void 0 : R.call(t, !1);
1718
+ } : void 0
1719
+ }
1720
+ ),
1721
+ /* @__PURE__ */ p(
1722
+ En,
1723
+ {
1724
+ ref: u,
1725
+ font: ts[t.font],
1726
+ characters: ns,
1727
+ fontSize: t.size,
1728
+ letterSpacing: t.letterSpacing,
1729
+ anchorX: t.textAlign,
1730
+ anchorY: "middle",
1731
+ material: v,
1732
+ renderOrder: t.renderOrder + 1,
1733
+ raycast: vt,
1734
+ color: c.mainColor,
1735
+ children: ""
1736
+ }
1737
+ ),
1738
+ /* @__PURE__ */ p(
1739
+ En,
1740
+ {
1741
+ ref: h,
1742
+ font: ts[t.font],
1743
+ characters: ns,
1744
+ fontSize: t.secondarySize ?? t.size * 0.78,
1745
+ letterSpacing: t.letterSpacing,
1746
+ anchorX: t.textAlign,
1747
+ anchorY: "middle",
1748
+ material: v,
1749
+ renderOrder: t.renderOrder + 1,
1750
+ raycast: vt,
1751
+ color: c.subColor,
1752
+ visible: !1,
1753
+ children: ""
1754
+ }
1755
+ ),
1756
+ t.children
1757
+ ] })
1758
+ ] }) });
1759
+ }
1760
+ function ls(e) {
1761
+ for (; e; e = e.parent) if (!e.visible) return !1;
1762
+ return !0;
1763
+ }
1764
+ function Co(e) {
1765
+ const t = {};
1766
+ for (const n in e) e[n] !== void 0 && (t[n] = e[n]);
1767
+ return t;
1768
+ }
1769
+ const Be = 220, sr = ["planner", "researcher", "writer", "graph_scout", "records_scout", "data_scout"], To = Object.fromEntries(sr.map((e) => [e, new M.Color(Ne[e])]));
1770
+ let Mt = null;
1771
+ function zo() {
1772
+ if (Mt) return Mt;
1773
+ const e = document.createElement("canvas");
1774
+ e.width = e.height = 128;
1775
+ const t = e.getContext("2d"), n = t.createRadialGradient(64, 64, 0, 64, 64, 64);
1776
+ return n.addColorStop(0, "rgba(255,255,255,1)"), n.addColorStop(0.18, "rgba(255,255,255,0.55)"), n.addColorStop(0.5, "rgba(255,255,255,0.12)"), n.addColorStop(1, "rgba(255,255,255,0)"), t.fillStyle = n, t.fillRect(0, 0, 128, 128), Mt = new M.CanvasTexture(e), Mt;
1777
+ }
1778
+ const Po = (
1779
+ /* glsl */
1780
+ `
1781
+ attribute vec4 aSeed; // theta, phi(cos), radius 0..1, speed
1782
+ attribute vec3 aColor;
1783
+ attribute float aBright;
1784
+ uniform float uTime, uRadius, uEnergy, uSize, uFlat, uChaos, uPix;
1785
+ varying vec3 vColor;
1786
+ varying float vA;
1787
+ void main() {
1788
+ float th = aSeed.x + uTime * aSeed.w * (0.35 + uEnergy * 0.9);
1789
+ float cp = aSeed.y;
1790
+ float sp = sqrt(max(0.0, 1.0 - cp * cp));
1791
+ float r = uRadius * (0.35 + 0.65 * aSeed.z) * (1.0 + 0.06 * sin(uTime * 1.7 + aSeed.x * 7.0) * (0.4 + uEnergy));
1792
+ vec3 p = vec3(cos(th) * sp, cp * (1.0 - uFlat), sin(th) * sp) * r;
1793
+ // swarm: drift on a lissajous so the school churns
1794
+ p += uChaos * uRadius * 0.22 * vec3(sin(uTime * 0.9 * aSeed.w + aSeed.x * 3.0), sin(uTime * 1.1 + aSeed.z * 9.0), cos(uTime * 0.7 * aSeed.w + aSeed.y * 5.0));
1795
+ vec4 mv = modelViewMatrix * vec4(p, 1.0);
1796
+ gl_Position = projectionMatrix * mv;
1797
+ float tw = 0.75 + 0.25 * sin(uTime * (2.0 + aSeed.w * 3.0) + aSeed.x * 11.0);
1798
+ gl_PointSize = uSize * uPix * (0.7 + 0.6 * aSeed.z) * (1.0 + aBright * 0.6) * tw / max(0.5, -mv.z);
1799
+ vColor = aColor * (0.55 + aBright * 0.9 + uEnergy * 0.5);
1800
+ vA = tw;
1801
+ }
1802
+ `
1803
+ ), Wo = (
1804
+ /* glsl */
1805
+ `
1806
+ uniform float uOpacity;
1807
+ varying vec3 vColor;
1808
+ varying float vA;
1809
+ void main() {
1810
+ vec2 d = gl_PointCoord - 0.5;
1811
+ float r = length(d);
1812
+ float a = smoothstep(0.5, 0.0, r);
1813
+ a *= a;
1814
+ gl_FragColor = vec4(vColor * a * vA * uOpacity, 1.0);
1815
+ }
1816
+ `
1817
+ );
1818
+ function Io() {
1819
+ const e = new M.BufferGeometry(), t = new Float32Array(Be * 3), n = new Float32Array(Be * 4);
1820
+ for (let s = 0; s < Be; s++)
1821
+ n[s * 4] = s * 2.39996 + Math.random() * 0.3, n[s * 4 + 1] = 1 - 2 * (s * 0.618034 % 1), n[s * 4 + 2] = Math.pow(Math.random(), 0.45), n[s * 4 + 3] = (0.25 + Math.random() * 0.6) * (Math.random() < 0.5 ? -1 : 1);
1822
+ return e.setAttribute("position", new M.BufferAttribute(t, 3)), e.setAttribute("aSeed", new M.BufferAttribute(n, 4)), e.setAttribute("aColor", new M.BufferAttribute(new Float32Array(Be * 3), 3)), e.setAttribute("aBright", new M.BufferAttribute(new Float32Array(Be), 1)), e.setDrawRange(0, 0), e.boundingSphere = new M.Sphere(new M.Vector3(), 50), e;
1823
+ }
1824
+ function No({ cluster: e, position: t, place: n, color: s, radius: o = 1.4, variant: r = "orb", pointSize: i = 1, labelBelow: l = 1.25, glowGain: u = 1, onClick: h }) {
1825
+ const c = U(null), b = U(null), a = U(null), d = U(null), S = U(null), A = U(null), m = U(null), v = ne(() => new M.Color(s ?? e.color), [s, e.color]), y = ne(() => ({ l1: "", l2: "", seen: -1, vis: 0, hover: 0, over: !1, r: o, pos: new M.Vector3(), c: new M.Color(), tokSeen: -1, thSeen: -1, fresh: !0 }), [o]), G = ne(Io, []), C = ne(() => {
1826
+ const w = (W) => new M.SpriteMaterial({ map: zo(), color: "#000", blending: M.AdditiveBlending, depthWrite: !1, transparent: !0, toneMapped: !1, opacity: W }), V = new M.ShaderMaterial({
1827
+ vertexShader: Po,
1828
+ fragmentShader: Wo,
1829
+ transparent: !0,
1830
+ depthWrite: !1,
1831
+ blending: M.AdditiveBlending,
1832
+ toneMapped: !1,
1833
+ uniforms: {
1834
+ uTime: { value: 0 },
1835
+ uRadius: { value: o },
1836
+ uEnergy: { value: 0 },
1837
+ uSize: { value: 0.16 * o * i },
1838
+ uFlat: { value: r === "stars" ? 0.55 : 0 },
1839
+ uChaos: { value: r === "swarm" ? 1 : r === "stars" ? 0 : 0.25 },
1840
+ uPix: { value: 1 },
1841
+ uOpacity: { value: 0 }
1842
+ }
1843
+ });
1844
+ return { core: w(1), hot: w(1), halo: w(1), points: V, hit: new M.MeshBasicMaterial({ visible: !1 }) };
1845
+ }, [o, i, r]);
1846
+ be(({ clock: w, gl: V, camera: W }) => {
1847
+ var I, Y;
1848
+ const k = e, x = w.elapsedTime, D = k.active && z.grouped ? 1 : 0;
1849
+ y.vis += (D - y.vis) * (D ? 0.06 : 0.12), y.vis < 3e-3 && (y.vis = 0);
1850
+ const F = y.vis > 0;
1851
+ if (c.current && (c.current.visible = F), m.current && !(F && D) && m.current.setOpacity(0, !0), !F) {
1852
+ y.fresh = !0;
1853
+ return;
1854
+ }
1855
+ c.current && (n ? n(k.lane, y.pos, x) : t && y.pos.set(t[0], t[1], t[2]), y.fresh ? (c.current.position.copy(y.pos), y.fresh = !1) : c.current.position.lerp(y.pos, 0.06));
1856
+ const N = k.energy, Q = 0.8 + 0.22 * Math.log2(1 + k.agents / 6);
1857
+ y.hover += ((y.over ? 1 : 0) - y.hover) * 0.15;
1858
+ const X = o * Math.min(1.7, Q) * (0.6 + 0.4 * y.vis) * (1 + y.hover * 0.08), K = Math.sin(x * (1.1 + N * 2.6) + k.lane), L = 1 + K * (0.04 + N * 0.1), O = C.points.uniforms;
1859
+ O.uTime.value = x, O.uRadius.value = X, O.uEnergy.value = N;
1860
+ const q = W.fov ?? 50;
1861
+ O.uPix.value = V.domElement.height / (2 * Math.tan(q * Math.PI / 360)), O.uOpacity.value = y.vis;
1862
+ const B = u * y.vis;
1863
+ if (b.current && (b.current.scale.setScalar(X * 2.4 * L), C.core.color.copy(v).multiplyScalar((0.32 + N * 0.45 + y.hover * 0.2) * B)), a.current && (a.current.scale.setScalar(X * 0.9 * L), C.hot.color.copy(v).lerp(Go, 0.55).multiplyScalar((0.35 + N * 0.6) * B)), d.current && (d.current.scale.setScalar(X * 5.5 * (1 + K * 0.03)), C.halo.color.copy(v).multiplyScalar((0.07 + N * 0.08) * B)), (I = S.current) == null || I.scale.setScalar(X * 1.15), (Y = A.current) == null || Y.position.set(0, -X * l - 0.35, 0), k.version !== y.seen) {
1864
+ y.seen = k.version;
1865
+ const ee = Math.min(Be, Math.max(18, k.agents * 2)), ge = G.getAttribute("aColor"), ke = G.getAttribute("aBright");
1866
+ let ae = 0;
1867
+ const ie = k.agents ? ee / k.agents : 1;
1868
+ for (const Z of sr) {
1869
+ const se = Math.round(k.types[Z] * ie);
1870
+ for (let he = 0; he < se && ae < ee; he++, ae++)
1871
+ y.c.copy(To[Z]).lerp(v, 0.25), ge.setXYZ(ae, y.c.r, y.c.g, y.c.b);
1872
+ }
1873
+ for (; ae < ee; ae++) ge.setXYZ(ae, v.r, v.g, v.b);
1874
+ const Ve = k.agents ? k.thinking / k.agents : 0;
1875
+ for (let Z = 0; Z < ee; Z++) ke.setX(Z, Z * 0.618034 % 1 < Ve ? 1 : 0);
1876
+ ge.needsUpdate = !0, ke.needsUpdate = !0, G.setDrawRange(0, ee), y.l1 = `${k.runs} run${k.runs === 1 ? "" : "s"} · ${k.agents} agent${k.agents === 1 ? "" : "s"}`;
1877
+ }
1878
+ const j = Math.round(k.tokens / 1e3);
1879
+ (j !== y.tokSeen || k.thinking !== y.thSeen) && (y.tokSeen = j, y.thSeen = k.thinking, y.l2 = `${k.thinking} thinking · ${j >= 1e3 ? `${(j / 1e3).toFixed(1)}M` : `${j}k`} tok`), m.current && (m.current.setText(y.l1, y.l2), m.current.setEmphasis(y.over), D && m.current.setOpacity(Math.min(1, y.vis * 1.2), !0));
1880
+ });
1881
+ const R = (w) => {
1882
+ var V;
1883
+ (V = w == null ? void 0 : w.stopPropagation) == null || V.call(w), (h ?? Ba)(e.lane);
1884
+ }, P = (w) => {
1885
+ y.over = w, document.body.style.cursor = w ? "pointer" : "";
1886
+ };
1887
+ return /* @__PURE__ */ E("group", { ref: c, visible: !1, children: [
1888
+ /* @__PURE__ */ p("sprite", { ref: d, material: C.halo }),
1889
+ /* @__PURE__ */ p("sprite", { ref: b, material: C.core }),
1890
+ /* @__PURE__ */ p("sprite", { ref: a, material: C.hot }),
1891
+ /* @__PURE__ */ p("points", { geometry: G, material: C.points, frustumCulled: !1 }),
1892
+ /* @__PURE__ */ p("mesh", { ref: S, material: C.hit, onClick: R, onPointerOver: () => P(!0), onPointerOut: () => P(!1), children: /* @__PURE__ */ p("sphereGeometry", { args: [1, 12, 8] }) }),
1893
+ /* @__PURE__ */ p("group", { ref: A, children: /* @__PURE__ */ p(
1894
+ An,
1895
+ {
1896
+ ref: m,
1897
+ text: "",
1898
+ secondary: "",
1899
+ color: s ?? e.color,
1900
+ plate: "box",
1901
+ size: 0.36,
1902
+ opacity: 0,
1903
+ pxRange: [10, 14],
1904
+ renderOrder: 28,
1905
+ onClick: (w) => R(w),
1906
+ onHover: (w) => P(w)
1907
+ }
1908
+ ) })
1909
+ ] });
1910
+ }
1911
+ const Go = new M.Color("#ffffff"), qo = Array.from({ length: re }, (e, t) => t);
1912
+ function Do({ place: e, color: t, ...n }) {
1913
+ return /* @__PURE__ */ p(ye, { children: qo.map((s) => /* @__PURE__ */ p(No, { cluster: z.clusters[s], place: e, color: typeof t == "function" ? t(s) : t, ...n }, s)) });
1914
+ }
1915
+ const Fo = 3, Lo = [
1916
+ "Why is churn rising for Acme Corp?",
1917
+ "Root cause of payment latency incidents",
1918
+ "Which region has the most incidents?",
1919
+ "Is Fraud Shield worth expanding to Globex?",
1920
+ "Summarize Q3 support escalations",
1921
+ "Which customers are at risk of downgrading?",
1922
+ "Why did checkout conversion drop last week?",
1923
+ "Compare onboarding time across regions"
1924
+ ], Qt = [
1925
+ ["Acme Corp", "Enterprise Plan", "Churn Q3"],
1926
+ ["Payments API", "Incident #4821", "p99 Latency"],
1927
+ ["EMEA", "Incident #4790", "On-call Team"],
1928
+ ["Fraud Shield", "Globex", "Chargeback Rate"],
1929
+ ["Support Escalations", "Ticket #9917", "Initech"],
1930
+ ["Umbrella Co", "Seat Downgrade", "Renewal 2026"],
1931
+ ["Checkout Funnel", "Conversion Rate", "Release 4.12"],
1932
+ ["APAC", "Onboarding Time", "Customer Success"]
1933
+ ], Bo = {
1934
+ analytics: [["Metrics API", "api"], ["Postgres", "db"]],
1935
+ warehouse: [["Snowflake", "warehouse"], ["Spark cluster", "spark"]],
1936
+ github: [["GitHub API", "api"]],
1937
+ "google-drive": [["Drive storage", "storage"]],
1938
+ slack: [["Slack API", "api"], ["Kafka events", "queue"]]
1939
+ }, Ae = (e) => e[Math.floor(Math.random() * e.length)], Uo = () => Math.random().toString(36).slice(2, 7);
1940
+ function Zo(e) {
1941
+ const t = `run-${Uo()}`, n = Ae(Lo), s = () => Date.now();
1942
+ let o = 0;
1943
+ const r = (w, V) => {
1944
+ o += w, e(o, V);
1945
+ }, i = (w, V, W) => r(250, () => ({ type: "spawn", run_id: t, id: w, agent: V, parent_id: W, ts: s() })), l = (w) => r(150, () => ({ type: "agent", run_id: t, id: w, status: "thinking", ts: s() })), u = (w, V = 120) => r(V, () => ({ type: "agent", run_id: t, id: w, status: "waiting", ts: s() })), h = (w, V) => r(V, () => ({ type: "llm", run_id: t, id: w, tokens_in: 1200 + Math.round(Math.random() * 3e3), tokens_out: 150 + Math.round(Math.random() * 700), latency_ms: 700 + Math.random() * 1800, ts: s() })), c = (w, V = 250) => r(V, () => ({ type: "exit", run_id: t, id: w, status: "done", ts: s() })), b = (w, V, W, k = 120) => r(k, () => ({ type: "message", run_id: t, from_id: w, to_id: V, text: W, ts: s() })), a = (w, V, W = 120) => r(W, () => [
1946
+ { type: "tool", run_id: t, id: w, tool: "Skill", args_preview: V, ts: s() },
1947
+ { type: "skill", run_id: t, id: w, name: V, status: "start", ts: s() }
1948
+ ]), d = (w, V, W = 120) => r(W, () => ({ type: "skill", run_id: t, id: w, name: V, status: "end", ts: s() })), S = (w, V, W = 120) => r(W, () => ({ type: "step", run_id: t, step: w, status: V, ts: s() }));
1949
+ r(0, () => ({ type: "run", run_id: t, status: "started", topic: n, workflow: "research_brief", ts: s() })), S("plan", "running", 300);
1950
+ const A = `${t}:planner`;
1951
+ i(A, "planner", null), l(A), h(A, 1500), h(A, 900), S("plan", "done", 300);
1952
+ const m = `${t}:researcher`;
1953
+ S("research", "running", 200), i(m, "researcher", A), b(A, m, `3 questions on "${n}"`, 150), c(A, 200), l(m);
1954
+ const v = Math.random() < 0.6 ? Ae(["deep-research", "search-first"]) : "";
1955
+ v && a(m, v, 200), h(m, 1200), v && d(m, v, 400);
1956
+ const y = 2 + Math.floor(Math.random() * 3), G = [];
1957
+ for (let w = 0; w < y; w++) {
1958
+ const V = w % 2 === 0 ? "graph_scout" : "records_scout", W = `${t}:${V}:${w}`;
1959
+ G.push(W), r(200, () => ({ type: "tool", run_id: t, id: m, tool: "task", args_preview: `${V}: angle ${w + 1} of "${n}"`, ts: s() })), i(W, V, m), b(m, W, `Investigate angle ${w + 1}`, 80);
1960
+ }
1961
+ u(m, 200);
1962
+ const C = o;
1963
+ G.forEach((w, V) => {
1964
+ let W = C + 200 + V * 220;
1965
+ const k = (O, q) => {
1966
+ W += O, e(W, q);
1967
+ }, x = Ae(Qt), D = w.includes("graph_scout");
1968
+ k(0, () => ({ type: "agent", run_id: t, id: w, status: "thinking", ts: s() }));
1969
+ const F = Math.random() < 0.45 ? Ae(D ? ["graph-query", "dataviz"] : ["xlsx", "pdf"]) : "";
1970
+ F && (k(250, () => ({ type: "tool", run_id: t, id: w, tool: "Skill", args_preview: F, ts: s() })), k(0, () => ({ type: "skill", run_id: t, id: w, name: F, status: "start", ts: s() }))), k(500 + Math.random() * 500, () => ({ type: "tool", run_id: t, id: w, tool: D ? "graph_neighbors" : "search_records", args_preview: `"${x[0]}"`, ts: s() })), k(600, () => ({ type: "graph", run_id: t, id: w, op: "read", nodes: x, ts: s() })), k(700 + Math.random() * 900, () => ({ type: "llm", run_id: t, id: w, tokens_in: 1500 + Math.round(Math.random() * 2e3), tokens_out: 200 + Math.round(Math.random() * 400), latency_ms: 900 + Math.random() * 1200, ts: s() }));
1971
+ const [N, Q] = Ae(D ? [["analytics", "query_metrics"], ["github", "search_code"]] : [["warehouse", "run_sql"], ["analytics", "list_incidents"], ["google-drive", "read_doc"]]), X = 600 + Math.random() * 1400, [K, L] = Ae(Bo[N]);
1972
+ k(400, () => ({ type: "mcp", run_id: t, id: w, server: N, tool: Q, phase: "call", resource: K, resource_kind: L, ts: s() })), k(X, () => ({ type: "mcp", run_id: t, id: w, server: N, tool: Q, phase: "result", latency_ms: X, resource: K, resource_kind: L, ts: s() })), Math.random() < 0.7 && k(500, () => ({ type: "graph", run_id: t, id: w, op: "read", nodes: Ae(Qt), ts: s() })), F && k(300, () => ({ type: "skill", run_id: t, id: w, name: F, status: "end", ts: s() })), k(800 + Math.random() * 1200, () => ({ type: "message", run_id: t, from_id: w, to_id: m, text: `Found ${2 + Math.floor(Math.random() * 6)} linked records`, ts: s() })), k(200, () => ({ type: "exit", run_id: t, id: w, status: "done", ts: s() })), o = Math.max(o, W);
1973
+ }), l(m), h(m, 1300), S("research", "done", 300);
1974
+ const R = `${t}:writer`;
1975
+ S("write", "running", 200), i(R, "writer", m), b(m, R, "Findings merged - draft the brief", 120), c(m, 200), l(R);
1976
+ const P = [Ae(["pptx", "docx", "pdf"]), "dataviz", "haiku"].slice(0, 2 + Math.floor(Math.random() * 2));
1977
+ return P.forEach((w, V) => a(R, w, V ? 500 : 150)), h(R, 1800), r(400, () => ({ type: "graph", run_id: t, id: R, op: "write", nodes: [`Brief: ${n}`, ...Ae(Qt).slice(0, 2)], ts: s() })), r(300, () => ({ type: "mcp", run_id: t, id: R, server: "slack", tool: "post_message", phase: "call", resource: "Slack API", resource_kind: "api", ts: s() })), r(700, () => ({ type: "mcp", run_id: t, id: R, server: "slack", tool: "post_message", phase: "result", latency_ms: 700, resource: "Slack API", resource_kind: "api", ts: s() })), P.forEach((w, V) => d(R, w, V ? 900 : 300)), S("write", "done", 400), r(150, () => ({ type: "final", run_id: t, text: `Brief on "${n}": linked accounts, incidents and metrics summarized with sources.`, ts: s() })), c(R, 100), r(200, () => ({ type: "run", run_id: t, status: "completed", topic: n, workflow: "research_brief", ts: s() })), o;
1978
+ }
1979
+ function Ho() {
1980
+ zn(!0);
1981
+ let e = !1;
1982
+ const t = [];
1983
+ let n = 0;
1984
+ const s = () => {
1985
+ if (e) return;
1986
+ n++;
1987
+ const i = Zo((l, u) => {
1988
+ t.push(
1989
+ window.setTimeout(() => {
1990
+ if (e) return;
1991
+ const h = u(performance.now());
1992
+ (Array.isArray(h) ? h : [h]).forEach(Ns);
1993
+ }, l)
1994
+ );
1995
+ });
1996
+ t.push(window.setTimeout(() => (n--, o()), i + 300));
1997
+ }, o = () => {
1998
+ if (!e)
1999
+ for (; n < Fo; ) {
2000
+ const r = 1500 + Math.random() * 3500;
2001
+ n++, t.push(window.setTimeout(() => (n--, s()), r));
2002
+ }
2003
+ };
2004
+ return s(), t.push(window.setTimeout(o, 2500)), () => {
2005
+ e = !0, t.forEach(clearTimeout), zn(!1);
2006
+ };
2007
+ }
2008
+ const Ze = ["Customer", "Account", "Incident", "Ticket", "Product", "Region", "Metric", "Team"], us = [0.24, 0.24, 0.22, 0.12, 0.06, 0.03, 0.05, 0.04], Yt = [
2009
+ "Acme Corp",
2010
+ "Globex",
2011
+ "Initech",
2012
+ "Umbrella Co",
2013
+ "Payments API",
2014
+ "Fraud Shield",
2015
+ "Checkout Funnel",
2016
+ "Enterprise Plan",
2017
+ "Incident #4821",
2018
+ "Incident #4790",
2019
+ "Ticket #9917",
2020
+ "EMEA",
2021
+ "APAC",
2022
+ "North America",
2023
+ "p99 Latency",
2024
+ "Churn Q3",
2025
+ "Conversion Rate",
2026
+ "Chargeback Rate",
2027
+ "On-call Team",
2028
+ "Customer Success",
2029
+ "Release 4.12",
2030
+ "Renewal 2026"
2031
+ ];
2032
+ function rr(e = 320) {
2033
+ const t = Array.from({ length: e }, (s, o) => {
2034
+ if (o < Yt.length) return { id: Yt[o], name: Yt[o], kind: Ze[o % Ze.length] };
2035
+ let r = Math.random(), i = 0;
2036
+ for (; i < us.length - 1 && (r -= us[i]) > 0; ) i++;
2037
+ return { id: `n${o}`, name: `${Ze[i]} ${o}`, kind: Ze[i] };
2038
+ }), n = Array.from({ length: e }, () => ({ source: t[Math.floor(Math.random() * e)].id, target: t[Math.floor(Math.random() * e)].id }));
2039
+ return { nodes: t, links: n };
2040
+ }
2041
+ const on = { nodes: [], links: [] }, Jo = 400;
2042
+ class jo {
2043
+ constructor() {
2044
+ _e(this, "nodes", []);
2045
+ _e(this, "links", []);
2046
+ _e(this, "seen", /* @__PURE__ */ new Set());
2047
+ _e(this, "linkSeen", /* @__PURE__ */ new Set());
2048
+ }
2049
+ /** add the event's nodes (+ chain links between them); true when anything new was added */
2050
+ add(t) {
2051
+ let n = !1;
2052
+ const s = [];
2053
+ for (const o of t) {
2054
+ const r = String(o).trim();
2055
+ if (!r) continue;
2056
+ const i = r.toLowerCase();
2057
+ s.push(i), !(this.seen.has(i) || this.nodes.length >= Jo) && (this.seen.add(i), this.nodes.push({ id: i, name: r, kind: Ze[Math.floor(fn(i, 3) * Ze.length)] }), n = !0);
2058
+ }
2059
+ for (let o = 1; o < s.length; o++) {
2060
+ const r = s[o - 1], i = s[o];
2061
+ if (r === i || !this.seen.has(r) || !this.seen.has(i)) continue;
2062
+ const l = r < i ? `${r}|${i}` : `${i}|${r}`;
2063
+ this.linkSeen.has(l) || (this.linkSeen.add(l), this.links.push({ source: r, target: i }), n = !0);
2064
+ }
2065
+ return n;
2066
+ }
2067
+ snapshot() {
2068
+ return { nodes: [...this.nodes], links: [...this.links] };
2069
+ }
2070
+ }
2071
+ function lt(e) {
2072
+ const t = {};
2073
+ return e.token && (t.authorization = `Bearer ${e.token}`), e.scope && (t["x-agentglow-scope"] = e.scope), e.run && (t["x-agentglow-run"] = e.run), t;
2074
+ }
2075
+ const Xo = (e, t) => new Promise((n) => {
2076
+ const s = window.setTimeout(n, e);
2077
+ t.addEventListener("abort", () => (window.clearTimeout(s), n()), { once: !0 });
2078
+ });
2079
+ function Ko(e, t, n, s) {
2080
+ const o = new AbortController(), { signal: r } = o;
2081
+ let i = 2e3, l = 0;
2082
+ return (async () => {
2083
+ for (; !r.aborted; ) {
2084
+ try {
2085
+ const h = await fetch(e, { headers: { ...t, accept: "text/event-stream" }, cache: "no-store", signal: r });
2086
+ if (h.status === 401 || h.status === 403) return s();
2087
+ if (!h.ok || !h.body) throw new Error(`stream ${h.status}`);
2088
+ l = 0;
2089
+ const c = h.body.pipeThrough(new TextDecoderStream()).getReader();
2090
+ let b = "", a = [], d = "";
2091
+ for (; ; ) {
2092
+ const { value: S, done: A } = await c.read();
2093
+ if (A) break;
2094
+ b += S;
2095
+ const m = b.split(/\r\n|\r|\n/);
2096
+ b = m.pop() ?? "";
2097
+ for (const v of m) {
2098
+ if (v === "") {
2099
+ a.length && (d === "" || d === "message") && n(a.join(`
2100
+ `)), a = [], d = "";
2101
+ continue;
2102
+ }
2103
+ if (v.startsWith(":")) continue;
2104
+ const y = v.indexOf(":"), G = y < 0 ? v : v.slice(0, y);
2105
+ let C = y < 0 ? "" : v.slice(y + 1);
2106
+ C.startsWith(" ") && (C = C.slice(1)), G === "data" ? a.push(C) : G === "event" ? d = C : G === "retry" && /^\d+$/.test(C) && (i = Number(C));
2107
+ }
2108
+ }
2109
+ } catch {
2110
+ if (r.aborted) return;
2111
+ }
2112
+ const u = Math.min(i * 2 ** l, 3e4) * (0.75 + Math.random() * 0.5);
2113
+ l = Math.min(l + 1, 6), await Xo(u, r);
2114
+ }
2115
+ })(), () => o.abort();
2116
+ }
2117
+ let _ = null, cn = !1;
2118
+ const De = /* @__PURE__ */ new Set(), We = () => De.forEach((e) => e());
2119
+ function Ct(e) {
2120
+ cn !== e && (cn = e, We());
2121
+ }
2122
+ const bn = [];
2123
+ let ar = bn;
2124
+ function or(e) {
2125
+ ar = e.length ? e : bn, We();
2126
+ }
2127
+ function Qo() {
2128
+ return it(
2129
+ (e) => (De.add(e), () => De.delete(e)),
2130
+ () => ar,
2131
+ () => bn
2132
+ );
2133
+ }
2134
+ async function Yo(e, t) {
2135
+ try {
2136
+ const n = await fetch(`${e}/live/run`, { headers: { ...lt(t), accept: "application/json" }, signal: AbortSignal.timeout(5e3) }), s = n.ok ? await n.json() : {};
2137
+ return Array.isArray(s.workflows) ? s.workflows.filter((o) => o && typeof o.id == "string") : [];
2138
+ } catch {
2139
+ return [];
2140
+ }
2141
+ }
2142
+ function _o() {
2143
+ return it(
2144
+ (e) => (De.add(e), () => De.delete(e)),
2145
+ () => cn,
2146
+ () => !1
2147
+ );
2148
+ }
2149
+ const ir = "unauthorized";
2150
+ async function $o(e, t) {
2151
+ try {
2152
+ const n = await fetch(`${e}/live/health`, { headers: lt(t), signal: AbortSignal.timeout(2500) });
2153
+ return n.status === 401 || n.status === 403 ? ir : n.ok ? await n.json().catch(() => ({})) ?? {} : null;
2154
+ } catch {
2155
+ return null;
2156
+ }
2157
+ }
2158
+ async function ei(e, t, n) {
2159
+ if (typeof n.run == "boolean") return n.run;
2160
+ try {
2161
+ return (await fetch(`${e}/live/run`, { headers: { ...lt(t), accept: "application/json" }, signal: AbortSignal.timeout(2500) })).status === 405;
2162
+ } catch {
2163
+ return !1;
2164
+ }
2165
+ }
2166
+ function ti(e, t) {
2167
+ const n = () => {
2168
+ e.dead || (Pn("sim"), e.stop = Ho(), We());
2169
+ };
2170
+ if (t) return n();
2171
+ const s = (o) => {
2172
+ if (!(e.served || !e.events.add(o))) {
2173
+ if (!e.galaxy.nodes.length) {
2174
+ e.galaxy = e.events.snapshot(), We();
2175
+ return;
2176
+ }
2177
+ e.growTimer || (e.growTimer = window.setTimeout(() => {
2178
+ e.growTimer = 0, !(e.dead || e.served) && (e.galaxy = e.events.snapshot(), We());
2179
+ }, 700));
2180
+ }
2181
+ };
2182
+ (async () => {
2183
+ const o = await $o(e.source, e.auth);
2184
+ if (e.dead) return;
2185
+ const r = () => {
2186
+ e.dead || (qs(!0), Ct(!1));
2187
+ };
2188
+ if (o === ir) return r();
2189
+ if (!o)
2190
+ return e.galaxy = rr(), n();
2191
+ Pn("live");
2192
+ const i = lt(e.auth);
2193
+ ei(e.source, e.auth, o).then((l) => {
2194
+ e.dead || (Ct(l), l && Yo(e.source, e.auth).then((u) => !e.dead && or(u)));
2195
+ }), fetch(`${e.source}/live/graph`, { headers: i }).then((l) => l.status === 401 || l.status === 403 ? (r(), null) : l.ok ? l.json() : null).then((l) => {
2196
+ var u;
2197
+ !e.dead && ((u = l == null ? void 0 : l.nodes) != null && u.length) && (e.galaxy = l, e.served = !0, Hr(l.label ?? "FalkorDB · knowledge graph"), We());
2198
+ }).catch(() => {
2199
+ }), e.stop = Ko(`${e.source}/live/stream`, i, (l) => {
2200
+ try {
2201
+ const u = JSON.parse(l), h = f.hasGraph;
2202
+ Ns(u), u.type === "graph" && Array.isArray(u.nodes) && (s(u.nodes), !h && f.hasGraph && We());
2203
+ } catch {
2204
+ }
2205
+ }, r);
2206
+ })();
2207
+ }
2208
+ function cr(e) {
2209
+ var t;
2210
+ e.dead = !0, (t = e.stop) == null || t.call(e), e.growTimer && window.clearTimeout(e.growTimer), _ === e && (_ = null, Ct(!1), or([]));
2211
+ }
2212
+ function ni(e, t, n) {
2213
+ const s = t ? "sim" : `live:${e}|${n.scope ?? ""}|${n.run ?? ""}|${n.token ?? ""}`;
2214
+ if (_ && _.key === s && !_.dead)
2215
+ return _.refs++, _;
2216
+ _ && ((_.source !== e || _.key === "sim" || s === "sim") && console.warn(`[agentglow] one data source per page: switching from "${_.source || _.key}" to "${e || s}"`), cr(_)), Jr();
2217
+ const o = { key: s, source: e, auth: n, refs: 1, dead: !1, galaxy: t ? rr() : on, served: !1, events: new jo(), growTimer: 0 };
2218
+ return _ = o, ti(o, t), o;
2219
+ }
2220
+ function si(e) {
2221
+ window.setTimeout(() => {
2222
+ --e.refs <= 0 && cr(e);
2223
+ }, 0);
2224
+ }
2225
+ async function ri(e, t) {
2226
+ const n = (_ == null ? void 0 : _.source) ?? "", s = (_ == null ? void 0 : _.auth) ?? {}, o = { topic: e, ...s.scope ? { scope: s.scope } : {}, ...t ? { workflow: t } : {} }, r = await fetch(`${n}/live/run`, { method: "POST", headers: { ...lt(s), "content-type": "application/json" }, body: JSON.stringify(o) });
2227
+ return (r.status === 404 || r.status === 405) && Ct(!1), (r.status === 401 || r.status === 403) && qs(!0), r.ok ? (await r.json().catch(() => ({}))).run_id ?? "started" : null;
2228
+ }
2229
+ function ai() {
2230
+ const { source: e, sim: t, scope: n, run: s, token: o } = un(), [r, i] = le(on);
2231
+ return $(() => {
2232
+ const l = ni(e, t, { scope: n || void 0, run: s || void 0, token: o || void 0 }), u = () => i(f.hasGraph ? l.galaxy : on);
2233
+ return u(), De.add(u), () => {
2234
+ De.delete(u), si(l);
2235
+ };
2236
+ }, [e, t, n, s, o]), r;
2237
+ }
2238
+ function Wc(e, t) {
2239
+ const n = e.nodes.findIndex((o) => o.name.toLowerCase() === t.toLowerCase());
2240
+ if (n >= 0) return n;
2241
+ let s = 7;
2242
+ for (const o of t.toLowerCase()) s = s * 31 + o.charCodeAt(0) >>> 0;
2243
+ return e.nodes.length ? s % e.nodes.length : 0;
2244
+ }
2245
+ const oi = Vr;
2246
+ function He(e) {
2247
+ return e.replace("run-", "").slice(0, 6);
2248
+ }
2249
+ function oe(e) {
2250
+ const t = f.instances.get(e) ?? f.archive.get(e);
2251
+ if (t) return `${t.name} · ${He(t.run)}`;
2252
+ const [n, s, o] = e.split(":");
2253
+ return `${s ?? e.slice(0, 6)}${o !== void 0 ? `#${Number(o) + 1}` : ""} · ${He(n)}`;
2254
+ }
2255
+ function lr(e) {
2256
+ var t;
2257
+ switch (e.type) {
2258
+ case "run":
2259
+ return `run ${e.status} · ${e.topic}`;
2260
+ case "step":
2261
+ return e.status === "waiting" ? `step ${e.step} ${at({ reason: e.reason || "wait", until: e.until ?? 0 })} · ${He(e.run_id)}` : `step ${e.step} ${e.status} · ${He(e.run_id)}`;
2262
+ case "spawn":
2263
+ return `spawned ${oe(e.id)}`;
2264
+ case "exit":
2265
+ return `${oe(e.id)} ${e.status}`;
2266
+ case "agent":
2267
+ return e.status === "waiting" && e.reason ? `${oe(e.id)} ${at({ reason: e.reason, until: e.until ?? 0 })}` : `${oe(e.id)} ${e.status}`;
2268
+ case "llm":
2269
+ return e.tokens_in || e.tokens_out ? `${oe(e.id)} · LLM ${e.tokens_in}→${e.tokens_out} tok` : `${oe(e.id)} · thinking…`;
2270
+ // no usage (e.g. Claude Code hooks): no fake 0→0
2271
+ case "message":
2272
+ return `${oe(e.from_id)} → ${oe(e.to_id)}: ${e.text}`;
2273
+ case "tool":
2274
+ return `${oe(e.id)} · ${e.tool}(${e.args_preview})`;
2275
+ case "graph":
2276
+ return `${oe(e.id)} ${e.op === "read" ? "read" : "WROTE"} graph: ${e.nodes.slice(0, 2).join(", ")}`;
2277
+ case "mcp":
2278
+ return e.phase === "call" ? `${oe(e.id)} → mcp ${e.server}.${e.tool}()${e.resource ? ` → ${e.resource}` : ""}` : `mcp ${e.server}.${e.tool} returned${e.latency_ms ? ` · ${Math.round(e.latency_ms)}ms` : ""}`;
2279
+ case "mcp_register":
2280
+ return `mcp server ${e.server} online`;
2281
+ case "skill":
2282
+ return e.status === "start" ? `${oe(e.id)} · skill: ${e.name}` : `${oe(e.id)} · skill: ${e.name} done`;
2283
+ case "final":
2284
+ return `final answer · ${He(e.run_id)}`;
2285
+ case "chat":
2286
+ return `${e.role === "user" ? "you" : ((t = f.instances.get(e.id)) == null ? void 0 : t.name) ?? "agent"}: ${e.text}`;
2287
+ }
2288
+ }
2289
+ const ii = "#f5b83d";
2290
+ function Tt(e, t) {
2291
+ const n = e.steps[t] === "running" ? e.waits[t] : void 0;
2292
+ return n ? ["waiting", `${t}: ${at(n)}`] : [e.steps[t], `${t}: ${e.steps[t]}`];
2293
+ }
2294
+ function ci(e) {
2295
+ var s;
2296
+ if (e.type === "skill") return ii;
2297
+ const t = "id" in e ? e.id : e.type === "message" ? e.from_id : null, n = t ? f.instances.get(t) : null;
2298
+ return n ? Ne[n.type] : e.type === "graph" ? "#c7d2fe" : e.type === "mcp" ? ((s = f.mcpServers.get(e.server)) == null ? void 0 : s.color) ?? "#94a3b8" : e.type === "run" || e.type === "step" ? "#fde68a" : "#c7d2fe";
2299
+ }
2300
+ function li(e) {
2301
+ const { hud: t } = un();
2302
+ return $(() => {
2303
+ e.selected && Je(e.selected);
2304
+ }, [e.selected]), t ? /* @__PURE__ */ p(pi, { ...e }) : /* @__PURE__ */ p(ye, { children: e.children });
2305
+ }
2306
+ const ln = ["agents", "events", "selected"], _t = { agents: "Agents", events: "Events", selected: "Selected" }, ui = 720, ur = "agentglow.hud.sidebar";
2307
+ function di() {
2308
+ try {
2309
+ const e = JSON.parse(localStorage.getItem(ur) ?? "null");
2310
+ if (e && ln.includes(e.tab)) return { collapsed: !!e.collapsed, tab: e.tab === "selected" ? "agents" : e.tab };
2311
+ } catch {
2312
+ }
2313
+ return { collapsed: !1, tab: "agents" };
2314
+ }
2315
+ function fi(e) {
2316
+ try {
2317
+ localStorage.setItem(ur, JSON.stringify(e));
2318
+ } catch {
2319
+ }
2320
+ }
2321
+ const hi = (e) => e >= 1e3 ? `${(e / 1e3).toFixed(1)}k` : `${e}`;
2322
+ function pi({ title: e, subtitle: t, onClose: n, inset: s, children: o }) {
2323
+ const { embedded: r, scope: i, run: l } = un(), u = _o(), h = ct(), [, c] = le(0), [b, a] = le(!1), [d, S] = le(di), A = U(null), m = U(!1), v = U(null), y = U(null), G = U(null), C = U({ t0: performance.now(), head: null, at: performance.now(), done: !1 });
2324
+ $(() => {
2325
+ const O = window.setInterval(() => c((q) => q + 1), 500);
2326
+ return () => clearInterval(O);
2327
+ }, []), Er(() => {
2328
+ var q;
2329
+ const O = (q = y.current) == null ? void 0 : q.closest(".scene-root");
2330
+ O && O.clientWidth < ui && (m.current = !0, S((B) => ({ ...B, collapsed: !0 })));
2331
+ }, []);
2332
+ const R = (O) => {
2333
+ S(O), m.current || fi(O);
2334
+ }, P = h.selected;
2335
+ $(() => {
2336
+ P && S((O) => (O.tab !== "selected" && (A.current = O), { collapsed: !1, tab: "selected" }));
2337
+ }, [P]), $(() => {
2338
+ var j;
2339
+ const O = (j = y.current) == null ? void 0 : j.closest(".scene-root");
2340
+ if (!O || typeof ResizeObserver > "u") return;
2341
+ let q = 0;
2342
+ const B = new ResizeObserver(() => {
2343
+ cancelAnimationFrame(q), q = requestAnimationFrame(() => O.dispatchEvent(new Event(tn)));
2344
+ });
2345
+ return v.current && B.observe(v.current), y.current && B.observe(y.current), () => {
2346
+ cancelAnimationFrame(q), B.disconnect();
2347
+ };
2348
+ }, []);
2349
+ const w = C.current;
2350
+ if (!w.done) {
2351
+ const O = performance.now(), q = h.ticker[0] ?? null;
2352
+ q !== w.head && (w.head = q, w.at = O), q && O - w.at > 1e3 || O - w.t0 > 4e3 ? w.done = !0 : G.current = q;
2353
+ }
2354
+ d.tab === "events" && !d.collapsed && (G.current = h.ticker[0] ?? null);
2355
+ const V = G.current ? h.ticker.indexOf(G.current) : -1, W = d.tab === "events" && !d.collapsed ? 0 : V >= 0 ? V : h.ticker.length, k = [...h.instances.values()].filter(te), x = [...h.runs.values()].filter((O) => O.status === "started"), D = h.stats.graphReads + h.stats.graphWrites, F = () => {
2356
+ Je(null), n == null || n();
2357
+ const O = A.current ?? { collapsed: d.collapsed, tab: "agents" };
2358
+ A.current = null, R(O);
2359
+ }, N = (O) => R({ collapsed: !1, tab: O }), Q = r ? "" : location.pathname.replace(/\/$/, "").slice(1), X = r ? "" : location.search, K = hn(h.selected), L = { agents: k.length ? `${k.length}` : "", events: W ? W >= 60 ? "60+" : `${W}` : "", selected: K ? "1" : "" };
2360
+ return /* @__PURE__ */ E(ye, { children: [
2361
+ /* @__PURE__ */ E("div", { ref: v, className: `hud-topwrap${d.collapsed ? " is-rail" : ""}`, children: [
2362
+ /* @__PURE__ */ E("header", { className: "hud hud-top", children: [
2363
+ /* @__PURE__ */ E("div", { className: "hud-bar", children: [
2364
+ /* @__PURE__ */ E("div", { className: "hud-title", children: [
2365
+ /* @__PURE__ */ p("span", { className: "hud-dot" }),
2366
+ e
2367
+ ] }),
2368
+ h.mode === "sim" && /* @__PURE__ */ p("span", { className: "hud-badge", children: "sim" }),
2369
+ h.mode === "live" && !h.unauthorized && /* @__PURE__ */ p("span", { className: "hud-badge hud-badge--live", children: "live" }),
2370
+ i && /* @__PURE__ */ p(fs, { label: "scope", value: i }),
2371
+ l && /* @__PURE__ */ p(fs, { label: "run", value: l }),
2372
+ h.unauthorized && /* @__PURE__ */ p("span", { className: "hud-badge hud-badge--denied", role: "status", title: "The server answered 401: this token / scope is not allowed to watch these agents", children: "not authorized for this scope" }),
2373
+ /* @__PURE__ */ p("button", { className: `hud-info${b ? " on" : ""}`, onClick: () => a((O) => !O), "aria-label": "What am I looking at?", "aria-expanded": b, title: "What am I looking at?", children: "i" }),
2374
+ h.mode === "live" && u && /* @__PURE__ */ p(xi, {}),
2375
+ !r && /* @__PURE__ */ E("select", { className: "hud-theme", value: Q, "aria-label": "Theme", onChange: (O) => location.href = `/${O.target.value}${X}`, children: [
2376
+ /* @__PURE__ */ p("option", { value: "", children: "all themes" }),
2377
+ oi.map((O) => /* @__PURE__ */ p("option", { value: O, children: O }, O))
2378
+ ] }),
2379
+ /* @__PURE__ */ E("div", { className: "hud-stats", "aria-label": "Live totals", children: [
2380
+ /* @__PURE__ */ E("span", { className: "hud-stat", title: "active runs", children: [
2381
+ /* @__PURE__ */ p("b", { children: x.length }),
2382
+ " runs"
2383
+ ] }),
2384
+ /* @__PURE__ */ E("span", { className: "hud-stat", title: "agents alive", children: [
2385
+ /* @__PURE__ */ p("b", { children: k.length }),
2386
+ " agents"
2387
+ ] }),
2388
+ /* @__PURE__ */ E("span", { className: "hud-stat", title: "tokens", children: [
2389
+ /* @__PURE__ */ p("b", { children: hi(h.stats.tokens) }),
2390
+ " tok"
2391
+ ] }),
2392
+ D > 0 && /* @__PURE__ */ E("span", { className: "hud-stat", title: `graph reads ${h.stats.graphReads} · writes ${h.stats.graphWrites}`, children: [
2393
+ /* @__PURE__ */ p("b", { children: D }),
2394
+ " graph"
2395
+ ] }),
2396
+ h.stats.mcpCalls > 0 && /* @__PURE__ */ E("span", { className: "hud-stat", title: "MCP calls", children: [
2397
+ /* @__PURE__ */ p("b", { children: h.stats.mcpCalls }),
2398
+ " MCP"
2399
+ ] })
2400
+ ] })
2401
+ ] }),
2402
+ b && /* @__PURE__ */ p("div", { className: "hud-sub", children: t })
2403
+ ] }),
2404
+ /* @__PURE__ */ E("div", { className: "hud-dock", children: [
2405
+ /* @__PURE__ */ p(bi, {}),
2406
+ s
2407
+ ] })
2408
+ ] }),
2409
+ /* @__PURE__ */ E("aside", { ref: y, className: `hud hud-side${d.collapsed ? " is-rail" : ""}`, "aria-label": "Agent sidebar", children: [
2410
+ d.collapsed ? /* @__PURE__ */ E("nav", { className: "hs-rail", children: [
2411
+ /* @__PURE__ */ p("button", { className: "hs-collapse", onClick: () => R({ ...d, collapsed: !1 }), "aria-label": "Expand sidebar", title: "Expand sidebar", children: "«" }),
2412
+ ln.map((O) => /* @__PURE__ */ E("button", { className: `hs-icon${d.tab === O ? " on" : ""}`, onClick: () => N(O), "aria-label": `${_t[O]}${L[O] ? ` (${L[O]})` : ""}`, title: _t[O], children: [
2413
+ /* @__PURE__ */ p(mi, { tab: O }),
2414
+ L[O] && /* @__PURE__ */ p("em", { children: O === "selected" ? "" : L[O] })
2415
+ ] }, O))
2416
+ ] }) : /* @__PURE__ */ E("div", { className: "hs-head", role: "tablist", "aria-label": "Sidebar", children: [
2417
+ ln.map((O) => /* @__PURE__ */ E("button", { role: "tab", "aria-selected": d.tab === O, className: d.tab === O ? "on" : "", onClick: () => N(O), children: [
2418
+ _t[O],
2419
+ L[O] && O !== "selected" && /* @__PURE__ */ p("em", { children: L[O] })
2420
+ ] }, O)),
2421
+ /* @__PURE__ */ p("button", { className: "hs-collapse", onClick: () => R({ ...d, collapsed: !0 }), "aria-label": "Collapse sidebar", title: "Collapse sidebar", children: "»" })
2422
+ ] }),
2423
+ /* @__PURE__ */ p("div", { className: "hs-body", hidden: d.collapsed || d.tab !== "agents", children: /* @__PURE__ */ p(Si, {}) }),
2424
+ /* @__PURE__ */ p("div", { className: "hs-body", hidden: d.collapsed || d.tab !== "events", children: /* @__PURE__ */ p(Ai, {}) }),
2425
+ /* @__PURE__ */ p("div", { className: "hs-body", hidden: d.collapsed || d.tab !== "selected", children: K ? /* @__PURE__ */ E(ye, { children: [
2426
+ /* @__PURE__ */ p("div", { className: "ap-head", children: /* @__PURE__ */ p("button", { className: "ap-link", onClick: F, "aria-label": "Close agent inspector", children: "← back" }) }),
2427
+ /* @__PURE__ */ p(Oi, { i: K })
2428
+ ] }) : /* @__PURE__ */ p("p", { className: "hs-empty", children: "Click an agent in the scene, the Agents list or the Events log to inspect it." }) })
2429
+ ] }),
2430
+ o
2431
+ ] });
2432
+ }
2433
+ function mi({ tab: e }) {
2434
+ const t = { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", "aria-hidden": !0 };
2435
+ return e === "agents" ? /* @__PURE__ */ E("svg", { ...t, children: [
2436
+ /* @__PURE__ */ p("circle", { cx: "5", cy: "5", r: "2.2" }),
2437
+ /* @__PURE__ */ p("circle", { cx: "11.5", cy: "6.5", r: "1.8" }),
2438
+ /* @__PURE__ */ p("circle", { cx: "6.5", cy: "11.5", r: "1.8" }),
2439
+ /* @__PURE__ */ p("path", { d: "M6.8 6.3l3 0.6M5.4 7.2l0.7 2.4" })
2440
+ ] }) : e === "events" ? /* @__PURE__ */ E("svg", { ...t, children: [
2441
+ /* @__PURE__ */ p("path", { d: "M5.5 4h8M5.5 8h8M5.5 12h6" }),
2442
+ /* @__PURE__ */ p("circle", { cx: "2.5", cy: "4", r: "0.6", fill: "currentColor" }),
2443
+ /* @__PURE__ */ p("circle", { cx: "2.5", cy: "8", r: "0.6", fill: "currentColor" }),
2444
+ /* @__PURE__ */ p("circle", { cx: "2.5", cy: "12", r: "0.6", fill: "currentColor" })
2445
+ ] }) : /* @__PURE__ */ E("svg", { ...t, children: [
2446
+ /* @__PURE__ */ p("circle", { cx: "8", cy: "8", r: "5" }),
2447
+ /* @__PURE__ */ p("circle", { cx: "8", cy: "8", r: "1.6", fill: "currentColor" }),
2448
+ /* @__PURE__ */ p("path", { d: "M8 1v2M8 13v2M1 8h2M13 8h2" })
2449
+ ] });
2450
+ }
2451
+ function gi(e) {
2452
+ const t = "id" in e ? e.id : e.type === "message" ? e.from_id : null;
2453
+ return t && hn(t) ? t : null;
2454
+ }
2455
+ function Ai() {
2456
+ const e = ct();
2457
+ return e.ticker.length ? /* @__PURE__ */ p("ul", { className: "hs-events", children: e.ticker.map((t, n) => {
2458
+ const s = gi(t), o = /* @__PURE__ */ E(ye, { children: [
2459
+ /* @__PURE__ */ p("i", {}),
2460
+ t.type === "skill" && /* @__PURE__ */ p("b", { className: "hs-skill", children: t.status === "start" ? "skill" : "skill done" }),
2461
+ /* @__PURE__ */ p("span", { children: lr(t) })
2462
+ ] });
2463
+ return /* @__PURE__ */ p("li", { className: t.type === "skill" ? "is-skill" : void 0, style: { "--c": ci(t) }, children: s ? /* @__PURE__ */ p("button", { onClick: () => Je(s), title: "Inspect agent", children: o }) : /* @__PURE__ */ p("div", { children: o }) }, `${t.ts}-${t.type}-${n}`);
2464
+ }) }) : /* @__PURE__ */ p("p", { className: "hs-empty", children: "Waiting for events…" });
2465
+ }
2466
+ function bi() {
2467
+ const e = Za();
2468
+ return e.crowded ? e.showAll ? /* @__PURE__ */ E("div", { className: "hud hud-lod", children: [
2469
+ /* @__PURE__ */ p("i", {}),
2470
+ /* @__PURE__ */ E("span", { children: [
2471
+ "showing all ",
2472
+ /* @__PURE__ */ p("b", { children: e.alive }),
2473
+ " agents"
2474
+ ] }),
2475
+ /* @__PURE__ */ p("button", { onClick: () => Qn(!1), children: "group" })
2476
+ ] }) : e.activeClusters ? /* @__PURE__ */ E("div", { className: "hud hud-lod", children: [
2477
+ /* @__PURE__ */ p("i", {}),
2478
+ /* @__PURE__ */ E("span", { children: [
2479
+ "grouped: ",
2480
+ /* @__PURE__ */ p("b", { children: e.collapsedRuns }),
2481
+ " run",
2482
+ e.collapsedRuns === 1 ? "" : "s",
2483
+ " in ",
2484
+ /* @__PURE__ */ p("b", { children: e.activeClusters }),
2485
+ " cluster",
2486
+ e.activeClusters === 1 ? "" : "s"
2487
+ ] }),
2488
+ e.expandedLane >= 0 && /* @__PURE__ */ p("button", { onClick: Ua, children: "collapse" }),
2489
+ /* @__PURE__ */ p("button", { onClick: () => Qn(!0), children: "show all" })
2490
+ ] }) : null : null;
2491
+ }
2492
+ const ds = ["Why is churn rising for Acme Corp?", "Root cause of payment latency incidents", "Which region has the most incidents?", "Is Fraud Shield worth expanding to Globex?"];
2493
+ let vi = 0;
2494
+ function fs({ label: e, value: t }) {
2495
+ const n = t.length > 18 ? `${t.slice(0, 16)}…` : t;
2496
+ return /* @__PURE__ */ E("span", { className: "hud-badge hud-chip", title: `${e}: ${t}`, children: [
2497
+ e,
2498
+ ": ",
2499
+ /* @__PURE__ */ p("b", { children: n })
2500
+ ] });
2501
+ }
2502
+ const dr = "agentglow.hud.workflow";
2503
+ function yi() {
2504
+ try {
2505
+ return localStorage.getItem(dr) ?? "";
2506
+ } catch {
2507
+ return "";
2508
+ }
2509
+ }
2510
+ function Mi(e) {
2511
+ try {
2512
+ localStorage.setItem(dr, e);
2513
+ } catch {
2514
+ }
2515
+ }
2516
+ function xi() {
2517
+ const e = Qo(), [t, n] = le(yi), [s, o] = le(!1), [r, i] = le(""), l = e.find((c) => c.id === t) ?? e[0], u = async () => {
2518
+ const c = (l == null ? void 0 : l.topic) || ds[vi++ % ds.length];
2519
+ o(!0);
2520
+ try {
2521
+ i(await ri(c, l == null ? void 0 : l.id) ? `started · ${c}` : "failed to start"), window.setTimeout(() => i(""), 6e3);
2522
+ } finally {
2523
+ o(!1);
2524
+ }
2525
+ }, h = (c) => {
2526
+ n(c), Mi(c);
2527
+ };
2528
+ return /* @__PURE__ */ E("div", { className: "hud-run", children: [
2529
+ e.length > 1 && /* @__PURE__ */ p("select", { value: l == null ? void 0 : l.id, onChange: (c) => h(c.target.value), disabled: s, "aria-label": "Workflow to run", title: l == null ? void 0 : l.topic, children: e.map((c) => /* @__PURE__ */ p("option", { value: c.id, children: c.label }, c.id)) }),
2530
+ /* @__PURE__ */ p("button", { onClick: u, disabled: s, title: (l == null ? void 0 : l.topic) || void 0, children: s ? "Starting…" : "▶ Run agents" }),
2531
+ r && /* @__PURE__ */ p("span", { children: r })
2532
+ ] });
2533
+ }
2534
+ const wi = ["all", "alive", "thinking", "waiting", "done"];
2535
+ function ki(e, t) {
2536
+ return t === "all" ? !0 : t === "alive" ? te(e) : t === "done" ? !te(e) : te(e) && e.status === t;
2537
+ }
2538
+ function fr(e) {
2539
+ const t = ((e.doneAt || e.exitAt || performance.now()) - e.bornAt) / 1e3;
2540
+ return t < 60 ? `${t.toFixed(0)}s` : `${(t / 60).toFixed(1)}m`;
2541
+ }
2542
+ function $t(e) {
2543
+ return !te(e) || !e.skill || e.skillEndAt ? "" : e.skill;
2544
+ }
2545
+ function Si() {
2546
+ const e = ct(), [t, n] = le(""), [s, o] = le(/* @__PURE__ */ new Set()), [r, i] = le("alive"), [l, u] = le(""), h = ne(() => [...e.instances.values(), ...[...e.archive.values()].reverse()], [e.instances.size, e.archive.size, e.ticker]), c = ne(() => {
2547
+ var v;
2548
+ const m = /* @__PURE__ */ new Map();
2549
+ for (const y of h) m.set(y.run, ((v = e.runs.get(y.run)) == null ? void 0 : v.topic) ?? y.run);
2550
+ return [...m];
2551
+ }, [h]), b = t.trim().toLowerCase(), a = h.filter((m) => s.size ? s.has(m.name) : !0).filter((m) => ki(m, r)).filter((m) => l ? m.run === l : !0).filter((m) => {
2552
+ var y;
2553
+ if (!b) return !0;
2554
+ const v = ((y = e.runs.get(m.run)) == null ? void 0 : y.topic) ?? "";
2555
+ return `${m.id} ${m.name} ${v} ${[...m.nodes].join(" ")}`.toLowerCase().includes(b);
2556
+ }).sort((m, v) => +!te(m) - +!te(v) || +(v.status === "thinking") - +(m.status === "thinking") || v.bornAt - m.bornAt), d = a.slice(0, 150), S = ne(() => {
2557
+ const m = /* @__PURE__ */ new Map();
2558
+ for (const v of h) {
2559
+ const y = m.get(v.name) ?? { color: Ne[v.type], alive: 0 };
2560
+ te(v) && y.alive++, m.set(v.name, y);
2561
+ }
2562
+ return [...m].slice(0, 12);
2563
+ }, [h]), A = (m) => o((v) => {
2564
+ const y = new Set(v);
2565
+ return y.has(m) ? y.delete(m) : y.add(m), y;
2566
+ });
2567
+ return /* @__PURE__ */ E(ye, { children: [
2568
+ /* @__PURE__ */ E("div", { className: "ap-searchrow", children: [
2569
+ /* @__PURE__ */ p("input", { className: "ap-search", value: t, onChange: (m) => n(m.target.value), placeholder: "Search agent or run topic…", "aria-label": "Search agents" }),
2570
+ /* @__PURE__ */ E("span", { className: "ap-count", title: "matching / all agents", children: [
2571
+ a.length,
2572
+ a.length !== h.length ? ` / ${h.length}` : ""
2573
+ ] })
2574
+ ] }),
2575
+ /* @__PURE__ */ p("div", { className: "ap-chips", children: S.map(([m, v]) => /* @__PURE__ */ E("button", { className: s.has(m) ? "on" : "", "aria-pressed": s.has(m), style: { "--c": v.color }, onClick: () => A(m), children: [
2576
+ /* @__PURE__ */ p("i", {}),
2577
+ m,
2578
+ /* @__PURE__ */ p("em", { children: v.alive || "" })
2579
+ ] }, m)) }),
2580
+ /* @__PURE__ */ E("div", { className: "ap-row-filters", children: [
2581
+ /* @__PURE__ */ p("div", { className: "ap-seg", children: wi.map((m) => /* @__PURE__ */ p("button", { className: r === m ? "on" : "", "aria-pressed": r === m, onClick: () => i(m), children: m }, m)) }),
2582
+ /* @__PURE__ */ E("select", { value: l, "aria-label": "Filter by run", onChange: (m) => u(m.target.value), children: [
2583
+ /* @__PURE__ */ p("option", { value: "", children: "all runs" }),
2584
+ c.map(([m, v]) => /* @__PURE__ */ p("option", { value: m, children: v }, m))
2585
+ ] })
2586
+ ] }),
2587
+ /* @__PURE__ */ E("ul", { className: "ap-list", children: [
2588
+ d.map((m) => {
2589
+ var v;
2590
+ return /* @__PURE__ */ p("li", { children: /* @__PURE__ */ E("button", { onClick: () => Je(m.id), style: { "--c": Ne[m.type] }, className: te(m) ? "" : "is-done", children: [
2591
+ /* @__PURE__ */ p("i", { "data-status": te(m) ? m.status : "done" }),
2592
+ /* @__PURE__ */ E("span", { className: "ap-name", children: [
2593
+ /* @__PURE__ */ E("span", { className: "ap-title", children: [
2594
+ oe(m.id),
2595
+ $t(m) && /* @__PURE__ */ p("em", { className: "ap-skill", title: `using skill ${$t(m)}`, children: $t(m) })
2596
+ ] }),
2597
+ /* @__PURE__ */ p("small", { children: ((v = e.runs.get(m.run)) == null ? void 0 : v.topic) ?? "finished run" })
2598
+ ] }),
2599
+ /* @__PURE__ */ E("span", { className: "ap-meta", children: [
2600
+ /* @__PURE__ */ p("b", { children: m.status }),
2601
+ (m.tokens / 1e3).toFixed(1),
2602
+ "k · ",
2603
+ fr(m)
2604
+ ] })
2605
+ ] }) }, m.id);
2606
+ }),
2607
+ a.length > d.length && /* @__PURE__ */ E("li", { className: "ap-more", children: [
2608
+ "+",
2609
+ a.length - d.length,
2610
+ " more - refine the filter"
2611
+ ] }),
2612
+ a.length === 0 && /* @__PURE__ */ p("li", { className: "ap-more", children: "No agents match." })
2613
+ ] })
2614
+ ] });
2615
+ }
2616
+ function hs(e) {
2617
+ const t = e.stepOrder.find((n) => Tt(e, n)[0] === "waiting");
2618
+ return t ? Tt(e, t)[1] : "";
2619
+ }
2620
+ function Oi({ i: e }) {
2621
+ const t = ct(), n = t.runs.get(e.run), s = n != null && n.hasSteps ? zs(n) : null, o = hn(e.parent), r = [...t.instances.values(), ...t.archive.values()].filter((l) => l.parent === e.id), i = [...t.mcpPending.values()].filter((l) => l.instance === e.id);
2622
+ return /* @__PURE__ */ E("div", { className: "ap-detail", style: { "--c": Ne[e.type] }, children: [
2623
+ /* @__PURE__ */ E("h3", { children: [
2624
+ /* @__PURE__ */ p("i", {}),
2625
+ " ",
2626
+ e.name,
2627
+ " ",
2628
+ /* @__PURE__ */ E("small", { children: [
2629
+ e.subagent ? "subagent" : "agent",
2630
+ " · ",
2631
+ He(e.run)
2632
+ ] })
2633
+ ] }),
2634
+ /* @__PURE__ */ E("div", { className: "ap-status", "data-status": te(e) ? e.status : "done", children: [
2635
+ te(e) ? e.status === "waiting" && e.wait ? at(e.wait) : e.status : `finished (${e.status})`,
2636
+ " · alive ",
2637
+ fr(e)
2638
+ ] }),
2639
+ /* @__PURE__ */ E("dl", { className: "ap-stats", children: [
2640
+ /* @__PURE__ */ E("div", { children: [
2641
+ /* @__PURE__ */ p("dt", { children: "tokens" }),
2642
+ /* @__PURE__ */ E("dd", { children: [
2643
+ (e.tokens / 1e3).toFixed(1),
2644
+ "k"
2645
+ ] })
2646
+ ] }),
2647
+ /* @__PURE__ */ E("div", { children: [
2648
+ /* @__PURE__ */ p("dt", { children: "LLM calls" }),
2649
+ /* @__PURE__ */ p("dd", { children: e.llmCalls })
2650
+ ] }),
2651
+ /* @__PURE__ */ E("div", { children: [
2652
+ /* @__PURE__ */ p("dt", { children: "tool calls" }),
2653
+ /* @__PURE__ */ p("dd", { children: e.toolCalls })
2654
+ ] }),
2655
+ /* @__PURE__ */ E("div", { children: [
2656
+ /* @__PURE__ */ p("dt", { children: "MCP calls" }),
2657
+ /* @__PURE__ */ p("dd", { children: e.mcpCalls })
2658
+ ] })
2659
+ ] }),
2660
+ /* @__PURE__ */ E("section", { children: [
2661
+ /* @__PURE__ */ p("h4", { children: "Run" }),
2662
+ /* @__PURE__ */ p("p", { children: n ? n.topic : e.run }),
2663
+ n && hs(n) && /* @__PURE__ */ p("p", { className: "ap-wait", children: hs(n) }),
2664
+ n && s && /* @__PURE__ */ E("div", { className: "ap-steps", children: [
2665
+ s.shown.map((l) => {
2666
+ const [u, h] = Tt(n, l);
2667
+ return /* @__PURE__ */ p("span", { "data-status": u, title: h, children: l }, l);
2668
+ }),
2669
+ s.more > 0 && /* @__PURE__ */ E("span", { title: n.stepOrder.slice(-s.more).map((l) => Tt(n, l)[1]).join(`
2670
+ `), children: [
2671
+ "+",
2672
+ s.more
2673
+ ] })
2674
+ ] })
2675
+ ] }),
2676
+ (o || r.length > 0) && /* @__PURE__ */ E("section", { children: [
2677
+ /* @__PURE__ */ p("h4", { children: "Lineage" }),
2678
+ o && /* @__PURE__ */ E("button", { className: "ap-chip-link", style: { "--c": Ne[o.type] }, onClick: () => Je(o.id), children: [
2679
+ "↑ spawned by ",
2680
+ oe(o.id)
2681
+ ] }),
2682
+ r.map((l) => /* @__PURE__ */ E("button", { className: "ap-chip-link", style: { "--c": Ne[l.type] }, onClick: () => Je(l.id), children: [
2683
+ "↓ ",
2684
+ oe(l.id),
2685
+ " ",
2686
+ dn(l) ? "✓" : ""
2687
+ ] }, l.id))
2688
+ ] }),
2689
+ e.skills.size > 0 && /* @__PURE__ */ E("section", { children: [
2690
+ /* @__PURE__ */ p("h4", { children: "Skills used" }),
2691
+ /* @__PURE__ */ p("div", { className: "ap-skills", children: [...e.skills].map(([l, u]) => /* @__PURE__ */ E("span", { className: u.active && te(e) ? "on" : "", title: u.active && te(e) ? "in use now" : `used ${u.count}x`, children: [
2692
+ l,
2693
+ /* @__PURE__ */ E("em", { children: [
2694
+ u.count,
2695
+ "x"
2696
+ ] })
2697
+ ] }, l)) })
2698
+ ] }),
2699
+ i.length > 0 && /* @__PURE__ */ E("section", { children: [
2700
+ /* @__PURE__ */ p("h4", { children: "Waiting on MCP" }),
2701
+ i.map((l) => /* @__PURE__ */ E("p", { className: "ap-wait", children: [
2702
+ l.server,
2703
+ ".",
2704
+ l.tool,
2705
+ "() · ",
2706
+ Br(l).toFixed(1),
2707
+ "s"
2708
+ ] }, l.key))
2709
+ ] }),
2710
+ e.chat.length > 0 && /* @__PURE__ */ E("section", { children: [
2711
+ /* @__PURE__ */ p("h4", { children: "Conversation" }),
2712
+ /* @__PURE__ */ p("ul", { className: "ap-chat", children: e.chat.map((l, u) => /* @__PURE__ */ E("li", { "data-role": l.role, children: [
2713
+ /* @__PURE__ */ E("b", { children: [
2714
+ l.role === "user" ? "you" : e.name,
2715
+ ":"
2716
+ ] }),
2717
+ " ",
2718
+ l.text
2719
+ ] }, u)) })
2720
+ ] }),
2721
+ /* @__PURE__ */ E("section", { children: [
2722
+ /* @__PURE__ */ p("h4", { children: "Activity" }),
2723
+ /* @__PURE__ */ p("ul", { className: "ap-events", children: e.recent.map((l, u) => /* @__PURE__ */ p("li", { children: lr(l) }, u)) })
2724
+ ] })
2725
+ ] });
2726
+ }
2727
+ const Ei = 0.7, ps = 0.45, ms = 0.32, gs = new M.Color("#ef4444"), zt = "__kitDim", Ri = M.Object3D.prototype.onBeforeRender;
2728
+ function Vi(e, t, n, s, o) {
2729
+ var c, b, a, d;
2730
+ const r = this.userData[zt];
2731
+ if (!r || r.k <= 2e-3 || Array.isArray(o)) return;
2732
+ const i = o, l = 1 - Ei * r.k;
2733
+ r.hasColor = !!((c = i.color) != null && c.isColor), r.hasColor && (r.color.copy(i.color), i.color.multiplyScalar(l), r.failed && i.color.lerp(gs, ms * r.k * 0.6)), r.hasEmissive = !!((b = i.emissive) != null && b.isColor), r.hasEmissive && (r.emissive.copy(i.emissive), i.emissive.multiplyScalar(l), r.failed && i.emissive.lerp(gs, ms * r.k * 0.4), r.ei = i.emissiveIntensity ?? 1);
2734
+ const u = ((a = i.uniforms) == null ? void 0 : a.uOpacity) ?? ((d = i.uniforms) == null ? void 0 : d.opacity), h = !!u && typeof u.value == "number";
2735
+ r.op = i.opacity, h && (r.uop = u.value), i.transparent && (i.opacity = r.op * (1 - ps * r.k)), h && (u.value = r.uop * (1 - ps * r.k)), r.on = !0, e.state.useProgram(null);
2736
+ }
2737
+ function Ci(e, t, n, s, o) {
2738
+ var u, h;
2739
+ const r = this.userData[zt];
2740
+ if (!r || !r.on) return;
2741
+ r.on = !1;
2742
+ const i = o;
2743
+ r.hasColor && i.color.copy(r.color), r.hasEmissive && (i.emissive.copy(r.emissive), i.emissiveIntensity = r.ei), i.opacity = r.op;
2744
+ const l = ((u = i.uniforms) == null ? void 0 : u.uOpacity) ?? ((h = i.uniforms) == null ? void 0 : h.opacity);
2745
+ l && typeof l.value == "number" && (l.value = r.uop), e.state.useProgram(null);
2746
+ }
2747
+ let hr = 0, pr = !1;
2748
+ function mr(e) {
2749
+ if (e.userData.kitNoDim) return;
2750
+ if (e.isMesh || e.isLine || e.isPoints || e.isSprite) {
2751
+ let s = e.userData[zt];
2752
+ if (!s) {
2753
+ if (e.onBeforeRender !== Ri) return;
2754
+ s = { k: 0, failed: !1, on: !1, color: new M.Color(), emissive: new M.Color(), hasColor: !1, hasEmissive: !1, ei: 1, op: 1, uop: 1 }, e.userData[zt] = s, e.onBeforeRender = Vi, e.onAfterRender = Ci;
2755
+ }
2756
+ s.k = hr, s.failed = pr;
2757
+ }
2758
+ const n = e.children;
2759
+ for (let s = 0; s < n.length; s++) mr(n[s]);
2760
+ }
2761
+ function Ti(e, t, n, s) {
2762
+ t <= 2e-3 && s <= 2e-3 || (hr = t, pr = n, mr(e));
2763
+ }
2764
+ const As = "#f5b83d", gr = "#fde7b0", Ar = "#c08a3a", pe = 3, zi = 1.22, bs = 0.11, br = 1.48, Pi = new M.PlaneGeometry(2, 2), Wi = () => {
2765
+ }, Ii = (
2766
+ /* glsl */
2767
+ `
2768
+ varying vec2 vP;
2769
+ void main() { vP = position.xy * ${br.toFixed(2)}; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
2770
+ ), Ni = (
2771
+ /* glsl */
2772
+ `
2773
+ uniform vec3 uColor; uniform vec3 uCore; uniform vec3 uMix; uniform vec3 uRad; uniform float uA; uniform float uOuter;
2774
+ uniform float uRot; uniform float uPulse;
2775
+ varying vec2 vP;
2776
+ const float PI = 3.14159265;
2777
+ float band(float d, float w, float aa) { return 1.0 - smoothstep(w, w + aa, abs(d)); }
2778
+ void main() {
2779
+ float grow = mix(0.86, 1.0, uA);
2780
+ vec2 p = vP / grow;
2781
+ float r = length(p);
2782
+ float aa = max(fwidth(r), 1e-4) * 1.2;
2783
+ float ang = atan(p.y, p.x);
2784
+ // gap around the top diamond
2785
+ float gap = smoothstep(0.075, 0.115, abs(atan(p.x, p.y)));
2786
+ float w = max(0.011, aa * 0.65);
2787
+ // the rings: crisp thin lines (>= ~1.3px) + a soft halo for Bloom
2788
+ float line = 0.0, halo = 0.0;
2789
+ for (int k = 0; k < 3; k++) {
2790
+ float m = uMix[k];
2791
+ float d = r - uRad[k];
2792
+ float g = k == 0 ? 1.0 : 0.8;
2793
+ line += band(d, w, aa) * m * g;
2794
+ halo += exp(-abs(d) * 30.0) * 0.2 * m * g;
2795
+ }
2796
+ line *= gap;
2797
+ halo *= gap * uPulse;
2798
+ // 12 short ticks just outside the outermost ring, turning slowly
2799
+ float a = ang + uRot;
2800
+ float seg = PI * 2.0 / 12.0;
2801
+ float da = abs(a - floor(a / seg + 0.5) * seg) * r;
2802
+ float t0 = uOuter + 0.05;
2803
+ float tick = band(da, max(0.006, aa * 0.4), aa) * step(t0, r) * (1.0 - smoothstep(t0 + 0.06, t0 + 0.06 + aa, r)) * 0.55 * gap * uA;
2804
+ // the diamond at the top of the outermost ring
2805
+ vec2 q = p - vec2(0.0, uOuter);
2806
+ float dd = abs(q.x) + abs(q.y);
2807
+ float gem = (1.0 - smoothstep(0.055, 0.055 + aa * 1.4, dd)) * uA;
2808
+ float gemHalo = exp(-dd * 22.0) * 0.45 * uA;
2809
+ float alpha = line * (0.9 + 0.1 * uPulse) + halo + tick + gem + gemHalo;
2810
+ if (alpha < 0.003) discard;
2811
+ vec3 col = mix(uColor, uCore, clamp(line * 0.55 + gem * 0.8, 0.0, 1.0));
2812
+ gl_FragColor = vec4(col * alpha, 1.0);
2813
+ }`
2814
+ );
2815
+ function Gi({ agent: e, radius: t, height: n }) {
2816
+ const [s, o] = le(() => !!e.inst.skill);
2817
+ return be(() => {
2818
+ !s && e.inst.skill && o(!0);
2819
+ }), s ? /* @__PURE__ */ p(Li, { agent: e, radius: t, height: n }) : null;
2820
+ }
2821
+ const qi = (e) => [
2822
+ { text: "skill:", color: Ar },
2823
+ { text: e, color: gr }
2824
+ ], Di = 1.75, Fi = 7, vs = new M.Vector3();
2825
+ function Li({ agent: e, radius: t, height: n }) {
2826
+ const s = U(null), o = U([]), r = U([]), i = e.depth > 0, l = i ? 0.16 : 0.2, u = ne(() => i ? [8.5, 11] : [9.5, 12.5], [i]), h = ne(() => {
2827
+ const b = {
2828
+ slots: Array.from({ length: pe }, () => ({ use: null, mix: 0 })),
2829
+ pending: Array.from({ length: pe }, () => ""),
2830
+ now: 0,
2831
+ extra: 0,
2832
+ shownExtra: -1,
2833
+ extraMix: 0,
2834
+ visit: (a, d) => {
2835
+ if (!(!a.active && Vn(a, b.now) <= 2e-3)) {
2836
+ for (const S of b.slots) if (S.use === a) return;
2837
+ for (let S = 0; S < pe; S++) {
2838
+ const A = b.slots[S];
2839
+ if (!A.use) {
2840
+ A.use = a, A.mix = 0, b.pending[S] = d;
2841
+ return;
2842
+ }
2843
+ }
2844
+ b.extra++;
2845
+ }
2846
+ }
2847
+ };
2848
+ return b;
2849
+ }, []), c = ne(
2850
+ () => new M.ShaderMaterial({
2851
+ vertexShader: Ii,
2852
+ fragmentShader: Ni,
2853
+ transparent: !0,
2854
+ depthTest: !1,
2855
+ depthWrite: !1,
2856
+ blending: M.AdditiveBlending,
2857
+ toneMapped: !1,
2858
+ uniforms: {
2859
+ uColor: { value: new M.Color(As).multiplyScalar(0.82) },
2860
+ uCore: { value: new M.Color("#ffe9b8").multiplyScalar(0.95) },
2861
+ uMix: { value: new M.Vector3() },
2862
+ uRad: { value: new M.Vector3(1, 1, 1) },
2863
+ uA: { value: 0 },
2864
+ uOuter: { value: 1 },
2865
+ uRot: { value: 0 },
2866
+ uPulse: { value: 1 }
2867
+ }
2868
+ }),
2869
+ []
2870
+ );
2871
+ return $(() => () => c.dispose(), [c]), be(({ camera: b, clock: a, size: d }) => {
2872
+ var q, B, j;
2873
+ const S = s.current;
2874
+ if (!S) return;
2875
+ const A = performance.now(), m = e.inst, v = Lr(m, A) * (1 - 0.5 * e.dim);
2876
+ h.now = A;
2877
+ for (const I of h.slots)
2878
+ I.use && (I.mix = Vn(I.use, A), I.mix <= 2e-3 && !I.use.active && (I.use = null, I.mix = 0));
2879
+ h.extra = 0, m.skills.forEach(h.visit);
2880
+ for (let I = 0; I < pe; I++) {
2881
+ const Y = h.pending[I];
2882
+ Y && (h.pending[I] = "", (q = r.current[I]) == null || q.setText(qi(Y)));
2883
+ }
2884
+ h.extraMix += ((h.extra > 0 ? 1 : 0) - h.extraMix) * 0.12, h.extra > 0 && h.extra !== h.shownExtra && (h.shownExtra = h.extra, (B = r.current[pe]) == null || B.setText(`+${h.extra} more`));
2885
+ const y = c.uniforms.uMix.value, G = c.uniforms.uRad.value;
2886
+ let C = 0, R = 0;
2887
+ for (let I = 0; I < pe; I++) {
2888
+ const Y = h.slots[I].mix;
2889
+ y.setComponent(I, Y * v), G.setComponent(I, 1 + bs * C), C += Y, R = Math.max(R, Y);
2890
+ }
2891
+ R *= v;
2892
+ const P = R > 3e-3;
2893
+ S.visible = P;
2894
+ for (const I of o.current) I && (I.visible = P);
2895
+ if (!P) return;
2896
+ const w = 1 + bs * Math.max(0, C - 1), V = e.scale, W = Math.max(t, n * 0.55) * V * zi;
2897
+ S.position.copy(e.live), g.plane === "xz" && (S.position.y += n * V * 0.5), S.quaternion.copy(b.quaternion), S.scale.setScalar(W * br);
2898
+ const k = c.uniforms;
2899
+ k.uA.value = R, k.uOuter.value = w;
2900
+ const x = a.elapsedTime;
2901
+ k.uRot.value = rt ? 0 : x * 0.16, k.uPulse.value = rt ? 1 : 0.82 + 0.18 * Math.sin(x * 1.7), vs.set(0, 1, 0).applyQuaternion(b.quaternion);
2902
+ const D = 0.86 + 0.14 * R, F = W * D * (w + 0.1) + 0.03, N = b, Q = S.position.distanceTo(b.position) || 1, X = N.isPerspectiveCamera ? 2 * Q * Math.tan(M.MathUtils.degToRad(N.fov) / 2) / (N.zoom * d.height) : 0.01, L = (M.MathUtils.clamp(l * T.label / Math.max(X, 1e-6), u[0] * H.pxk, u[1] * H.pxk) * Di + Fi) * X;
2903
+ let O = 0;
2904
+ for (let I = 0; I <= pe; I++) {
2905
+ const Y = o.current[I], ee = I < pe ? h.slots[I].mix : h.extraMix;
2906
+ Y && Y.position.copy(S.position).addScaledVector(vs, F + O), (j = r.current[I]) == null || j.setOpacity(ee * v, !0), O += L * ee;
2907
+ }
2908
+ }), /* @__PURE__ */ E(ye, { children: [
2909
+ /* @__PURE__ */ p("mesh", { ref: s, geometry: Pi, material: c, renderOrder: 22, raycast: Wi, visible: !1, frustumCulled: !1 }),
2910
+ Array.from({ length: pe + 1 }, (b, a) => /* @__PURE__ */ p("group", { ref: (d) => void (o.current[a] = d), visible: !1, children: /* @__PURE__ */ p(
2911
+ An,
2912
+ {
2913
+ ref: (d) => void (r.current[a] = d),
2914
+ text: "",
2915
+ color: As,
2916
+ textColor: a < pe ? gr : Ar,
2917
+ size: a < pe ? l : l * 0.85,
2918
+ pxRange: u,
2919
+ anchorY: "bottom",
2920
+ plate: a < pe ? "underline" : "none",
2921
+ font: "mono",
2922
+ opacity: 0,
2923
+ glow: 1.08,
2924
+ renderOrder: 24,
2925
+ declutter: !1,
2926
+ fit: !0
2927
+ }
2928
+ ) }, a))
2929
+ ] });
2930
+ }
2931
+ const vr = xs({ nodes: [], links: [] }), Ic = () => ws(vr);
2932
+ function vn(e, t) {
2933
+ const [n, s] = le(() => ({ v: e(), value: t() })), o = U(n.v);
2934
+ return be(() => {
2935
+ const r = e();
2936
+ r !== o.current && (o.current = r, s({ v: r, value: t() }));
2937
+ }), n.value;
2938
+ }
2939
+ const Bi = () => [...g.agents.values()], Ui = () => [...g.runs.values()], Zi = () => [...g.mcp.values()], Hi = () => g.agentsVersion, Ji = () => g.runsVersion, ji = () => g.mcpVersion, Xi = () => vn(Hi, Bi), Ki = () => vn(Ji, Ui), Qi = () => vn(ji, Zi);
2940
+ function Yi() {
2941
+ return $(() => (H.active++, () => void H.active--), []), be(({ size: e }) => {
2942
+ const t = performance.now();
2943
+ Dr(t), Ka(t), po(t), ia(t, e.width, e.height);
2944
+ }, -2), null;
2945
+ }
2946
+ const _i = { kind: "run" }, $i = { kind: "mcp" }, ec = { kind: "backend" }, tc = { kind: "graph" }, nc = { kind: "cluster" };
2947
+ function sc({ agent: e, children: t }) {
2948
+ const n = ne(() => ({ kind: e.depth > 0 ? "sub" : "agent", agent: e }), [e]);
2949
+ return /* @__PURE__ */ p(qe.Provider, { value: n, children: t });
2950
+ }
2951
+ function rc({ agent: e, children: t }) {
2952
+ const n = U(null), s = U(0);
2953
+ return be(() => {
2954
+ n.current && (Ti(n.current, e.dim, e.inst.status === "failed", s.current), s.current = e.dim);
2955
+ }), /* @__PURE__ */ p("group", { ref: n, children: t });
2956
+ }
2957
+ function ac({ Agent: e, Edge: t, selected: n, onSelect: s, radius: o, height: r }) {
2958
+ const i = Xi();
2959
+ return /* @__PURE__ */ p(ye, { children: i.map((l) => /* @__PURE__ */ E(sc, { agent: l, children: [
2960
+ /* @__PURE__ */ E(rc, { agent: l, children: [
2961
+ t && l.inst.parent && /* @__PURE__ */ p(t, { child: l }),
2962
+ /* @__PURE__ */ p(e, { agent: l, selected: n === l.id, onSelect: s })
2963
+ ] }),
2964
+ /* @__PURE__ */ p(Gi, { agent: l, radius: o, height: r })
2965
+ ] }, l.uid)) });
2966
+ }
2967
+ function oc({ RunMarker: e }) {
2968
+ const t = Ki();
2969
+ return /* @__PURE__ */ p(qe.Provider, { value: _i, children: t.map((n) => /* @__PURE__ */ p(e, { run: n }, n.uid)) });
2970
+ }
2971
+ function ic({ McpServer: e, Backend: t }) {
2972
+ const n = Qi();
2973
+ return /* @__PURE__ */ p(ye, { children: n.map((s) => /* @__PURE__ */ E(Rr, { children: [
2974
+ /* @__PURE__ */ p(qe.Provider, { value: $i, children: e && /* @__PURE__ */ p(ys, { item: s, children: /* @__PURE__ */ p(e, { mcp: s }) }) }),
2975
+ /* @__PURE__ */ p(qe.Provider, { value: ec, children: t && [...s.backends.values()].map((o) => /* @__PURE__ */ p(ys, { item: o, children: /* @__PURE__ */ p(t, { mcp: s, backend: o }) }, o.uid)) })
2976
+ ] }, s.uid)) });
2977
+ }
2978
+ function ys({ item: e, children: t }) {
2979
+ const n = U(null), s = U(null);
2980
+ return be(() => {
2981
+ const o = n.current, r = s.current;
2982
+ if (!o || !r) return;
2983
+ const i = Math.min(1, Math.max(0, e.mix)), l = i * i * (3 - 2 * i);
2984
+ o.position.copy(e.pos), o.scale.setScalar(Math.max(1e-4, l)), r.position.copy(e.pos).negate(), o.visible = l > 2e-3;
2985
+ }, -1), /* @__PURE__ */ p("group", { ref: n, scale: 1e-4, visible: !1, children: /* @__PURE__ */ p("group", { ref: s, children: t }) });
2986
+ }
2987
+ const cc = Array.from({ length: re }, (e, t) => t);
2988
+ function lc({ cluster: e, Cluster: t, offset: n }) {
2989
+ const s = (n == null ? void 0 : n[0]) ?? 0, o = (n == null ? void 0 : n[1]) ?? 0, r = (n == null ? void 0 : n[2]) ?? 0, i = ks((l, u) => {
2990
+ const h = g.clusterPos[l];
2991
+ h ? u.set(h.x + s, h.y + o, h.z + r) : u.set(s, o, r);
2992
+ }, [s, o, r]);
2993
+ return t ? /* @__PURE__ */ p(ye, { children: cc.map((l) => /* @__PURE__ */ p(t, { lane: l, cluster: z.clusters[l], pos: g.clusterPos[l] ?? new M.Vector3() }, l)) }) : /* @__PURE__ */ p(Do, { place: i, ...e });
2994
+ }
2995
+ function uc({ galaxy: e, Graph: t }) {
2996
+ const s = _r() && e.nodes.length > 0;
2997
+ g.graphWanted = s, $(
2998
+ () => () => {
2999
+ g.graphWanted = !1;
3000
+ },
3001
+ []
3002
+ );
3003
+ const o = U(null);
3004
+ return be(() => {
3005
+ const r = o.current;
3006
+ if (!r) return;
3007
+ const i = g.graph;
3008
+ r.position.copy(i.pos), r.scale.setScalar(Math.max(1e-4, i.scale)), r.visible = i.mix > 2e-3;
3009
+ }, -1), s ? /* @__PURE__ */ p("group", { ref: o, scale: 1e-4, visible: !1, children: /* @__PURE__ */ p(qe.Provider, { value: tc, children: /* @__PURE__ */ p(t, { galaxy: e }) }) }) : null;
3010
+ }
3011
+ function Nc({ children: e }) {
3012
+ const t = U(null);
3013
+ return be(() => {
3014
+ const n = t.current;
3015
+ if (!n) return;
3016
+ const s = Math.max(1e-4, g.graph.scale);
3017
+ n.scale.setScalar(1 / s), n.position.copy(g.graph.pos).multiplyScalar(-1 / s);
3018
+ }, -1), /* @__PURE__ */ p("group", { ref: t, children: e });
3019
+ }
3020
+ const dc = new M.Vector3();
3021
+ function Gc(e) {
3022
+ var b, a;
3023
+ const t = ai(), [n, s] = le(null);
3024
+ ue.preset = typeof e.preset == "string" ? Va[e.preset] : e.preset, ue.graphNatural = ((b = e.graph) == null ? void 0 : b.natural) ?? 1, ue.graphRadius = ((a = e.graph) == null ? void 0 : a.radius) ?? 2.6, ue.peripheryGap = e.peripheryGap ?? 3.6, g.plane = e.plane;
3025
+ const o = JSON.stringify(e.fit ?? {});
3026
+ ne(() => da(e.fit ?? {}), [o]), $(() => {
3027
+ for (const d of g.agents.values()) d.fresh = !0;
3028
+ for (const d of g.runs.values()) d.fresh = !0;
3029
+ for (const d of g.mcp.values()) d.fresh = !0;
3030
+ g.graph.fresh = !0;
3031
+ }, []);
3032
+ const r = U(e.extents);
3033
+ r.current = e.extents;
3034
+ const i = e.agentRadius ?? 1.1, l = e.agentHeight ?? 0, u = ks(
3035
+ (d) => {
3036
+ var S;
3037
+ go(d, i, l), (S = r.current) == null || S.call(r, d);
3038
+ },
3039
+ [i, l]
3040
+ ), h = e.target ?? [0, 0, 0], c = ne(() => Object.fromEntries(Object.entries(e.controls ?? {}).filter(([, d]) => d !== void 0)), [e.controls]);
3041
+ return /* @__PURE__ */ E("div", { className: `scene-root${e.className ? ` ${e.className}` : ""}`, children: [
3042
+ /* @__PURE__ */ E(
3043
+ kr,
3044
+ {
3045
+ camera: { position: e.camera.position, fov: e.camera.fov ?? 46, near: e.camera.near ?? 0.1, far: e.camera.far ?? 600 },
3046
+ dpr: [1, 2],
3047
+ gl: { antialias: !1, powerPreference: "high-performance", ...e.gl },
3048
+ onPointerMissed: () => s(null),
3049
+ children: [
3050
+ e.bg && /* @__PURE__ */ p("color", { attach: "background", args: [e.bg] }),
3051
+ /* @__PURE__ */ p(Yi, {}),
3052
+ e.Background,
3053
+ /* @__PURE__ */ p(vr.Provider, { value: t, children: /* @__PURE__ */ E("group", { children: [
3054
+ e.RunMarker && /* @__PURE__ */ p(oc, { RunMarker: e.RunMarker }),
3055
+ e.GraphResource && /* @__PURE__ */ p(uc, { galaxy: t, Graph: e.GraphResource }),
3056
+ /* @__PURE__ */ p(ic, { McpServer: e.McpServer, Backend: e.Backend }),
3057
+ /* @__PURE__ */ p(ac, { Agent: e.Agent, Edge: e.Edge, selected: n, onSelect: s, radius: i, height: e.plane === "xz" ? l : 0 }),
3058
+ /* @__PURE__ */ p(qe.Provider, { value: nc, children: /* @__PURE__ */ p(lc, { cluster: e.cluster, Cluster: e.Cluster, offset: e.clusterOffset }) }),
3059
+ e.children
3060
+ ] }) }),
3061
+ /* @__PURE__ */ p(
3062
+ wr,
3063
+ {
3064
+ makeDefault: !0,
3065
+ target: h,
3066
+ enableDamping: !0,
3067
+ dampingFactor: 0.06,
3068
+ enablePan: !1,
3069
+ minDistance: 2,
3070
+ maxDistance: 400,
3071
+ ...c
3072
+ }
3073
+ ),
3074
+ /* @__PURE__ */ p(Ma, { points: u, origin: dc }),
3075
+ e.PostFX
3076
+ ]
3077
+ }
3078
+ ),
3079
+ /* @__PURE__ */ p(li, { title: e.title, subtitle: e.subtitle, selected: n, onClose: () => s(null), inset: e.hudInset, children: e.hudChildren })
3080
+ ] });
3081
+ }
3082
+ export {
3083
+ Oc as A,
3084
+ Ic as B,
3085
+ Nc as C,
3086
+ Mc as D,
3087
+ te as E,
3088
+ Ws as F,
3089
+ Pc as G,
3090
+ kc as K,
3091
+ An as L,
3092
+ en as R,
3093
+ Os as S,
3094
+ Ne as T,
3095
+ vc as a,
3096
+ Ut as b,
3097
+ yc as c,
3098
+ Br as d,
3099
+ Ot as e,
3100
+ T as f,
3101
+ z as g,
3102
+ fn as h,
3103
+ Cc as i,
3104
+ Sc as j,
3105
+ zs as k,
3106
+ Ec as l,
3107
+ Rc as m,
3108
+ Gc as n,
3109
+ g as o,
3110
+ Lr as p,
3111
+ wc as q,
3112
+ rt as r,
3113
+ Vc as s,
3114
+ Wc as t,
3115
+ ct as u,
3116
+ zc as v,
3117
+ f as w,
3118
+ xc as x,
3119
+ bc as y,
3120
+ Tc as z
3121
+ };