agentglow 0.3.0 → 0.3.2

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,4605 @@
1
+ var Ha = Object.defineProperty;
2
+ var ja = (t, e, n) => e in t ? Ha(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n;
3
+ var Ve = (t, e, n) => ja(t, typeof e != "symbol" ? e + "" : e, n);
4
+ import { jsx as f, jsxs as R, Fragment as kt } from "react/jsx-runtime";
5
+ import { Text as lr, OrbitControls as Za } from "@react-three/drei";
6
+ import { useThree as Ke, useFrame as dt, Canvas as Ja } from "@react-three/fiber";
7
+ import { useSyncExternalStore as Oe, createContext as So, useRef as U, useMemo as st, useEffect as ot, Suspense as Xa, useImperativeHandle as Ka, useContext as Oo, useState as ut, useLayoutEffect as Qa, useCallback as Eo, Fragment as Ya } from "react";
8
+ import * as y from "three";
9
+ import { u as Ns, T as _a } from "./index-OgLlwjoE.js";
10
+ var ko;
11
+ const xt = typeof window < "u" && !!((ko = window.matchMedia) != null && ko.call(window, "(prefers-reduced-motion: reduce)").matches), k = {
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 y.Vector3(),
22
+ target: new y.Vector3(),
23
+ radius: 2.6,
24
+ natural: 1,
25
+ scale: 0,
26
+ out: new y.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 gt(t, e, n) {
42
+ return k.plane === "xy" ? n.set(t, e, 0) : n.set(t, 0, -e);
43
+ }
44
+ function If(t, e, n, s) {
45
+ return s.copy(t.origin).addScaledVector(t.side, e - t.cu).addScaledVector(t.axis, n - t.cv);
46
+ }
47
+ function Nf(t) {
48
+ var e;
49
+ return (e = k.agents.get(t)) == null ? void 0 : e.live;
50
+ }
51
+ function $a(t) {
52
+ var e;
53
+ return (e = k.mcp.get(t)) == null ? void 0 : e.pos;
54
+ }
55
+ function qf(t, e) {
56
+ var n, s;
57
+ return (s = (n = k.mcp.get(t)) == null ? void 0 : n.backends.get(e)) == null ? void 0 : s.pos;
58
+ }
59
+ function Df(t, e) {
60
+ const n = k.graph;
61
+ return e.copy(t).multiplyScalar(n.scale).add(n.pos);
62
+ }
63
+ function Lf(t, e) {
64
+ const n = k.graph;
65
+ return e.copy(t).sub(n.pos).divideScalar(Math.max(1e-4, n.scale));
66
+ }
67
+ let ti = 0;
68
+ const bn = () => ++ti, Yt = (t) => [Math.round(t.x * 100) / 100, Math.round(t.y * 100) / 100, Math.round(t.z * 100) / 100];
69
+ function ur() {
70
+ return {
71
+ plane: k.plane,
72
+ agents: [...k.agents.values()].map((t) => ({ id: t.id, run: t.run.id, depth: t.depth, scale: Math.round(t.scale * 100) / 100, pos: Yt(t.pos) })),
73
+ runs: k.runOrder.map((t) => ({ id: t.id, members: t.members, origin: Yt(t.origin), hu: t.hu, hv: t.hv })),
74
+ mcp: [...k.mcp.values()].map((t) => ({ name: t.name, wanted: t.wanted, mix: Math.round(t.mix * 100) / 100, pos: Yt(t.pos), backends: [...t.backends.values()].map((e) => ({ res: e.res.name, mix: Math.round(e.mix * 100) / 100, pos: Yt(e.pos) })) })),
75
+ clusters: k.clusterPos.map(Yt),
76
+ core: { ...k.core },
77
+ graph: { wanted: k.graphWanted, pos: Yt(k.graph.pos), out: Yt(k.graph.out), radius: k.graph.radius, scale: k.graph.scale, mix: k.graph.mix }
78
+ };
79
+ }
80
+ typeof window < "u" && (Object.defineProperties(k, { toJSON: { value: ur, enumerable: !1 }, summary: { value: ur, enumerable: !1 } }), window.__agentglowKit = k);
81
+ const Qe = 1500, ei = 8, qs = ["allow", "deny", "yes", "no", "r0", "r1", "r2", "r3", "other"], To = ["#4ade80", "#fb3b5c", "#5eead4", "#fbbf24", "#60a5fa", "#c084fc", "#f472b6", "#facc15", "#94a3b8"], ve = /* @__PURE__ */ new Map(), ni = (t) => {
82
+ let e = ve.get(t);
83
+ return e === void 0 && ve.size < 4 && ve.set(t, e = ve.size), e === void 0 ? 8 : 4 + e;
84
+ }, si = 0.35, xn = 2500, Ds = 1500;
85
+ function Ls(t, e = performance.now()) {
86
+ if (!t) return 0;
87
+ const n = e - t.at, s = Math.min(1, (e - t.at + 1e3 * t.windows) / 600);
88
+ return n < xn ? s : Math.max(0, 1 - (n - xn) / Ds) * s;
89
+ }
90
+ const Gs = (t, e = performance.now()) => !!t.hv && e - t.hv.at < xn + Ds;
91
+ function ri(t) {
92
+ const e = t.rate >= 10 ? Math.round(t.rate) : Math.round(t.rate * 10) / 10, n = t.deny * 100;
93
+ return `${t.provider} ${e}/s · ${n > 0 && n < 1 ? "<1" : Math.round(n)}% deny · p50 ${Math.round(t.p50)}ms`;
94
+ }
95
+ const se = 150, oi = 1800, ai = 2400, ii = 2500, ci = 3100, li = 220, ui = 800, di = 1150, fi = 12, Un = (t) => t.hv ? di + (wt(t) ? 300 : 0) : wt(t) ? ci : ai;
96
+ function dr(t, e = performance.now()) {
97
+ const n = e - t.at, s = wt(t), a = t.hv ? ui + (s ? 300 : 0) : s ? ii : oi, r = Un(t);
98
+ if (n <= 0 || n >= r || t.hidden) return 0;
99
+ const l = t.cut ? Math.max(0, 1 - (e - t.cut) / 160) : 1;
100
+ if (l < 1) return l * (n < se ? n / se : 1);
101
+ if (n < se) return n / se;
102
+ if (n < a) return 1;
103
+ const d = 1 - (n - a) / (r - a);
104
+ return d * d * (3 - 2 * d);
105
+ }
106
+ const wt = (t) => t.kind === "noul" && t.purpose === "guard" && t.result === "no", fr = (t) => t === void 0 ? "" : ` ${Math.round(t * 100)}%`;
107
+ function Co(t) {
108
+ return t.kind === "noul" && t.purpose === "guard" ? `guard: ${t.result === "no" ? "deny" : "allow"} ${t.target || t.question}${fr(t.p)}` : `${He(t.provider)} · ${t.purpose || t.question} → ${t.result}${fr(t.p)}`;
109
+ }
110
+ const wn = (t) => t === "noul" ? "YES/NO" : t === "score" ? "SCORE" : "PICK", Ro = (t) => ({ important: "key", flip: "changed mind", low_p: "unsure", deny: "DENY" })[t] ?? t, He = (t) => t === "code" ? "rule" : t;
111
+ function Ws(t) {
112
+ const e = t.price === void 0 ? "" : t.price > 0 && t.price < 1 ? ` @ ${Math.round(t.price * 100)}c` : ` @ ${t.price}`;
113
+ return `${t.side.toUpperCase()} ${t.qty}${e}${t.status && t.status !== "would_place" ? ` ${t.status}` : ""}`;
114
+ }
115
+ const Po = [
116
+ { type: "planner", label: "Planner", color: "#a78bfa" },
117
+ { type: "researcher", label: "Researcher", color: "#fbbf24" },
118
+ { type: "graph_scout", label: "Graph Scout", color: "#22d3ee" },
119
+ { type: "records_scout", label: "Records Scout", color: "#f472b6" },
120
+ { type: "data_scout", label: "Data Scout", color: "#fb7185" },
121
+ { type: "writer", label: "Writer", color: "#4ade80" }
122
+ ], Kt = Object.fromEntries(Po.map((t) => [t.type, t.color]));
123
+ Object.fromEntries(Po.map((t) => [t.type, t.label]));
124
+ const Vo = [0, 1, 2], pi = 6, kn = ["#818cf8", "#f472b6", "#34d399", "#fb923c", "#38bdf8", "#e879f9"], Gf = {
125
+ Customer: "#f59e0b",
126
+ Account: "#38bdf8",
127
+ Incident: "#22c55e",
128
+ Ticket: "#a78bfa",
129
+ Product: "#f472b6",
130
+ Region: "#ef4444",
131
+ Metric: "#facc15",
132
+ Team: "#2dd4bf",
133
+ Business: "#f59e0b",
134
+ Address: "#38bdf8",
135
+ Resolution: "#22c55e",
136
+ Meeting: "#a78bfa",
137
+ Hearing: "#f472b6",
138
+ Agency: "#ef4444",
139
+ Topic: "#facc15",
140
+ Committee: "#2dd4bf"
141
+ }, zo = 450, hi = 4e3, Io = 1100, mi = 6e4;
142
+ function No(t) {
143
+ return t.endAt ? Math.max(t.endAt, t.startAt + hi) : 0;
144
+ }
145
+ function pr(t, e = performance.now()) {
146
+ const n = Math.min(1, Math.max(0, (e - t.startAt) / zo)), s = No(t), a = s ? Math.min(1, Math.max(0, 1 - (e - s) / Io)) : 1;
147
+ return n * (2 - n) * a * a * (3 - 2 * a);
148
+ }
149
+ function hr(t, e) {
150
+ return Math.min(Math.max(t.stepOrder.indexOf(e), 0), Vo.length - 1);
151
+ }
152
+ function qo(t, e) {
153
+ return e < Vo.length - 1 ? t.stepOrder.slice(e, e + 1) : t.stepOrder.slice(e);
154
+ }
155
+ function Wf(t, e) {
156
+ const n = qo(t, e).map((s) => t.steps[s]);
157
+ return n.length ? n.includes("running") ? "running" : n.includes("failed") ? "failed" : n.every((s) => s === "done") ? "done" : "queued" : "queued";
158
+ }
159
+ function Ff(t, e) {
160
+ const n = qo(t, e);
161
+ return n.length < 2 ? n[0] ?? "" : `${n.find((a) => t.steps[a] === "running") ?? n[n.length - 1]} +${n.length - 1}`;
162
+ }
163
+ function Do(t) {
164
+ for (const e of t.stepOrder) if (t.waits[e] && t.steps[e] === "running") return { step: e, ...t.waits[e] };
165
+ return null;
166
+ }
167
+ const mr = (t) => new Date(t).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }), gi = 2e4, vi = 15e3;
168
+ function Ze(t, e = performance.now(), n = Date.now()) {
169
+ if (!t || t.status !== "started" || e - t.lastEventAt < gi) return !1;
170
+ const s = (a) => !!a && !!a.until && n - a.until > vi;
171
+ if (Object.values(t.waits).some(s)) return !0;
172
+ for (const a of h.instances.values()) if (a.run === t.id && !a.exitAt && s(a.wait)) return !0;
173
+ return !1;
174
+ }
175
+ const Fs = "stale: no worker activity";
176
+ function we(t, e = Date.now()) {
177
+ const n = t.until ? Math.abs(t.until - e) < 72e6 ? mr(t.until) : `${new Date(t.until).toLocaleDateString([], { month: "short", day: "numeric" })}, ${mr(t.until)}` : "";
178
+ return t.reason === "sleep" ? n ? `sleeping until ${n}` : "sleeping" : `waiting on ${t.reason}${n ? ` (until ${n})` : ""}`;
179
+ }
180
+ function Lo(t, e = pi) {
181
+ const n = t.stepOrder.length, s = n > e ? e - 1 : n;
182
+ return { shown: t.stepOrder.slice(0, s), more: n - s };
183
+ }
184
+ const Ai = {
185
+ warehouse: "#f97316",
186
+ search: "#22d3ee",
187
+ github: "#e5e7eb",
188
+ slack: "#e879f9",
189
+ "google-drive": "#facc15",
190
+ analytics: "#06b6d4"
191
+ }, Us = (t) => t.doneAt > 0, pt = (t) => !t.doneAt && !t.exitAt, yi = 12e4, Go = 3e3, Wo = 2500, xs = 6e3, Bn = { fadeMs: (t) => Wo }, Uf = (t) => Bn.fadeMs(t), h = {
192
+ runs: /* @__PURE__ */ new Map(),
193
+ instances: /* @__PURE__ */ new Map(),
194
+ comets: [],
195
+ flares: [],
196
+ /**
197
+ * MCP servers agents have CALLED (an `mcp` event). Registration alone (`mcp_register`) does not add one here:
198
+ * it only fills mcpRegistry (names / backend kinds) so a newly used server looks right immediately.
199
+ * Visibility over time: mcpWanted(srv) (shown while used, hidden after MCP_IDLE_MS idle).
200
+ */
201
+ mcpServers: /* @__PURE__ */ new Map(),
202
+ /** registered (not necessarily used) MCP servers: server -> backend name -> kind */
203
+ mcpRegistry: /* @__PURE__ */ new Map(),
204
+ mcpCalls: [],
205
+ /** in-flight MCP calls keyed `${instance}|${server}|${tool}`; resolvedAt kept briefly for a "snap back" effect */
206
+ mcpPending: /* @__PURE__ */ new Map(),
207
+ mcpResolved: [],
208
+ /** MCP tool name -> the server it was last called on (a guard deny on that tool flashes the line to it) */
209
+ mcpTools: /* @__PURE__ */ new Map(),
210
+ ticker: [],
211
+ stats: { runs: 0, spawned: 0, llmCalls: 0, tokens: 0, toolCalls: 0, graphReads: 0, graphWrites: 0, mcpCalls: 0, decisions: 0, decisionMs: 0 },
212
+ /** decisions per provider (jev / laya / llm ...): count + summed latency (HUD chip tooltip) */
213
+ decisionProviders: /* @__PURE__ */ new Map(),
214
+ /** session-wide decision rate (HUD): last full second's rate, deny share, p50/p95, 60 s sparkline (per second) */
215
+ rate: { perS: 0, deny: 0, p50: 0, p95: 0, spark: [], rollAt: 0, acc: { n: 0, deny: 0, msN: 0, p50: 0, p95: 0 } },
216
+ /** orders seen: total, paper (dry_run), rejected/cancelled */
217
+ orders: { n: 0, paper: 0, rejected: 0 },
218
+ lastFinal: "",
219
+ simulated: !1,
220
+ mode: "connecting",
221
+ /** label for the graph/memory structure: names the DB only when the server provides a real graph */
222
+ graphLabel: "knowledge graph",
223
+ /**
224
+ * True once this session USES a knowledge graph: a `graph` read/write event arrived, or sim mode (the
225
+ * simulator emits graph events). A served /live/graph sample alone does not flip it (it only supplies the
226
+ * real nodes to draw once the graph is used). Sticky for the session. When false, scenes draw
227
+ * no graph centerpiece and let the agents take the center. Use `graphMix()` in useFrame for a smooth 0..1.
228
+ */
229
+ hasGraph: !1,
230
+ /** performance.now() when hasGraph flipped true (drives the fade-in / layout ease) */
231
+ hasGraphAt: 0,
232
+ /** runs that touched the graph; the side graph shows while one of them is live (see graphShown) */
233
+ graphRuns: /* @__PURE__ */ new Set(),
234
+ /** performance.now() of the last graph event */
235
+ graphAt: 0,
236
+ focus: null,
237
+ // instance id most recently active
238
+ focusAt: 0,
239
+ /** last `task` / `Agent` tool call (performance.now()): a subagent is about to spawn (FitCamera batches it) */
240
+ spawnHintAt: 0,
241
+ /** exited instances kept for the agent panel after their shape fades (newest last, capped) */
242
+ archive: /* @__PURE__ */ new Map(),
243
+ /** instance selected in the agent panel or by clicking a shape */
244
+ selected: null,
245
+ /** the server answered 401 for this scope/run/token (the HUD shows a notice; no simulator fallback) */
246
+ unauthorized: !1,
247
+ /** desk-wide halts (global-scope guard denies, see Halt), keyed by the owning agent */
248
+ halts: /* @__PURE__ */ new Map()
249
+ }, Bs = /* @__PURE__ */ new Set();
250
+ function Mi(t) {
251
+ let e = t, n = h.instances.get(t);
252
+ for (let s = 0; n != null && n.parent && s < 32; s++)
253
+ Bs.has(n.parent) && (e = n.parent), n = h.instances.get(n.parent);
254
+ return e;
255
+ }
256
+ const bi = (t) => t.replace(/\s*(\?|\bok\b|\boff\b|\bon\b)\s*$/i, "").trim() || t;
257
+ function xi(t, e) {
258
+ Bs.add(t.id);
259
+ const n = Mi(t.id);
260
+ if (n !== t.id) return !1;
261
+ if (t.kind !== "noul" || t.purpose !== "guard") return !0;
262
+ let s = h.halts.get(n);
263
+ const a = t.result === "no";
264
+ if (!s || s.end) {
265
+ if (!a) return !0;
266
+ s = { id: n, run: t.run_id, reason: "", since: e, end: 0, qs: /* @__PURE__ */ new Map() }, h.halts.set(n, s);
267
+ }
268
+ return s.qs.set(t.question, a), a && (!s.reason || t.why === "important") && (s.reason = bi(t.question)), [...s.qs.values()].some(Boolean) || (s.end = e), !0;
269
+ }
270
+ function Hs(t, e = performance.now()) {
271
+ const n = h.halts.get(t);
272
+ if (!n) return;
273
+ const s = h.instances.get(t);
274
+ if (!n.end && (!s || s.exitAt) && (n.end = e), n.end && e - n.end > Fo) {
275
+ h.halts.delete(t);
276
+ return;
277
+ }
278
+ return n;
279
+ }
280
+ const Fo = 900;
281
+ function wi(t = performance.now()) {
282
+ for (const e of h.halts.values()) if (Hs(e.id, t) && !e.end) return e;
283
+ }
284
+ const ki = 500;
285
+ let jn = 0, Uo = 0;
286
+ const je = /* @__PURE__ */ new Set(), Wt = () => {
287
+ Uo++, je.forEach((t) => t());
288
+ };
289
+ function Ee() {
290
+ return Oe(
291
+ (t) => (je.add(t), () => je.delete(t)),
292
+ () => Uo
293
+ ), h;
294
+ }
295
+ const Hn = (t, e = 0) => {
296
+ let n = 2166136261 ^ e;
297
+ for (let s = 0; s < t.length; s++) n = Math.imul(n ^ t.charCodeAt(s), 16777619);
298
+ return (n >>> 0) % 10007 / 10007;
299
+ };
300
+ function Si() {
301
+ const t = new Set([...h.runs.values()].map((s) => s.slot)), e = [0, 1, 2, 3, 4, 5].filter((s) => !t.has(s));
302
+ if (e.length) return e[Math.floor(Math.random() * e.length)];
303
+ let n = 6;
304
+ for (; t.has(n); ) n++;
305
+ return n;
306
+ }
307
+ const Oi = new Array(qs.length).fill(0), Ei = 3, Ti = 650, Tt = [], Ut = (t) => t.why === "important" ? 4 : wt(t) ? 3 : t.why === "flip" ? 2 : 1;
308
+ function Ci(t, e) {
309
+ for (let n = Tt.length - 1; n >= 0; n--) {
310
+ const s = Tt[n];
311
+ (s.cut || e - s.at >= Un(s)) && Tt.splice(n, 1);
312
+ }
313
+ if (Tt.length >= Ei) {
314
+ let n = -1;
315
+ for (let s = 0; s < Tt.length; s++) {
316
+ const a = Tt[s];
317
+ if (Ut(a) > Ut(t) || Ut(a) === Ut(t) && e - a.at < Ti) continue;
318
+ const r = n >= 0 ? Tt[n] : null;
319
+ (!r || Ut(a) < Ut(r) || Ut(a) === Ut(r) && a.at < r.at) && (n = s);
320
+ }
321
+ if (n < 0)
322
+ return t.hidden = !0, !1;
323
+ Tt[n].cut = e, Tt.splice(n, 1);
324
+ }
325
+ return Tt.push(t), !0;
326
+ }
327
+ const Ri = /* @__PURE__ */ new Set(["decision", "decision_stats", "order"]), Bo = 250;
328
+ let Sn = !1, On = 0;
329
+ function js(t) {
330
+ var a, r, l, d;
331
+ const e = performance.now(), n = "run_id" in t ? h.runs.get(t.run_id) : void 0;
332
+ switch (n && (n.lastEventAt = e), t.type !== "mcp_register" && t.type !== "decision_stats" && (h.ticker.unshift(t), h.ticker.length > 60 && (h.ticker.length = 60)), t.type) {
333
+ case "run": {
334
+ if (t.status === "renamed") {
335
+ const i = h.runs.get(t.run_id);
336
+ i && (i.topic = t.topic);
337
+ } else if (t.status === "started") {
338
+ const i = Si();
339
+ h.runs.set(t.run_id, {
340
+ id: t.run_id,
341
+ topic: t.topic,
342
+ workflow: t.workflow,
343
+ color: kn[i % kn.length],
344
+ slot: i,
345
+ status: "started",
346
+ steps: {},
347
+ waits: {},
348
+ stepOrder: [],
349
+ hasSteps: !1,
350
+ startedAt: e,
351
+ endedAt: 0,
352
+ handoffAt: 0,
353
+ handoffFrom: 0,
354
+ handoffTo: 0,
355
+ lastDone: "",
356
+ final: "",
357
+ lastEventAt: e
358
+ }), h.stats.runs++;
359
+ } else {
360
+ const i = h.runs.get(t.run_id);
361
+ i && (i.status = t.status, i.endedAt = e);
362
+ for (const u of h.instances.values()) u.run === t.run_id && !u.exitAt && (u.exitAt = e);
363
+ }
364
+ break;
365
+ }
366
+ case "step": {
367
+ const i = h.runs.get(t.run_id);
368
+ if (!i) break;
369
+ i.hasSteps = !0, t.step in i.steps || i.stepOrder.push(t.step);
370
+ const u = i.steps[t.step], o = t.status === "waiting" ? "running" : t.status;
371
+ if (i.steps[t.step] = o, t.status === "waiting" ? i.waits[t.step] = { reason: t.reason || "wait", until: t.until ?? 0 } : delete i.waits[t.step], o === "done" && (i.lastDone = t.step), o === "running" && u !== "running") {
372
+ const g = i.lastDone || i.stepOrder.find((b) => b !== t.step && i.steps[b] === "running"), c = g ? hr(i, g) : -1, m = hr(i, t.step);
373
+ c >= 0 && c !== m && (i.handoffAt = e, i.handoffFrom = c, i.handoffTo = m);
374
+ }
375
+ break;
376
+ }
377
+ case "spawn": {
378
+ const i = t.subagent ?? t.agent.endsWith("_scout"), u = [...h.instances.values()].filter((o) => o.run === t.run_id).length;
379
+ h.instances.set(t.id, {
380
+ id: t.id,
381
+ run: t.run_id,
382
+ type: Di(t.agent, i),
383
+ name: t.agent,
384
+ parent: t.parent_id,
385
+ status: "spawning",
386
+ subagent: i,
387
+ bornAt: e,
388
+ doneAt: 0,
389
+ exitAt: 0,
390
+ pulse: 0.8,
391
+ pulseAt: e,
392
+ tokens: 0,
393
+ tokensCached: 0,
394
+ index: u,
395
+ recent: [],
396
+ llmCalls: 0,
397
+ toolCalls: 0,
398
+ mcpCalls: 0,
399
+ nodes: /* @__PURE__ */ new Set(),
400
+ skills: /* @__PURE__ */ new Map(),
401
+ skill: "",
402
+ skillEndAt: 0,
403
+ decisions: [],
404
+ hv: null,
405
+ orders: [],
406
+ chat: [],
407
+ wait: null
408
+ }), h.stats.spawned++, h.focus = t.id, h.focusAt = e;
409
+ break;
410
+ }
411
+ case "exit": {
412
+ const i = h.instances.get(t.id);
413
+ if (i) {
414
+ i.status = t.status, i.wait = null, i.doneAt = e;
415
+ const u = h.runs.get(i.run), o = !!i.parent && Date.now() - t.ts > Go;
416
+ (!u || u.endedAt || o) && (i.exitAt = e);
417
+ }
418
+ for (const [u, o] of h.mcpPending) o.instance === t.id && h.mcpPending.delete(u);
419
+ if (i && i.skill && !i.skillEndAt) {
420
+ for (const u of i.skills.values()) u.active && (u.active = !1, u.endAt = e);
421
+ i.skillEndAt = e;
422
+ }
423
+ break;
424
+ }
425
+ case "agent": {
426
+ const i = h.instances.get(t.id);
427
+ i && (i.status = t.status, i.wait = t.status === "waiting" && t.reason ? { reason: t.reason, until: t.until ?? 0 } : null), t.status === "thinking" && (h.focus = t.id, h.focusAt = e);
428
+ break;
429
+ }
430
+ case "llm": {
431
+ const i = h.instances.get(t.id);
432
+ i && (i.pulse = Math.min(2.5, 0.6 + (t.tokens_in + t.tokens_out) / 1500), i.pulseAt = e, i.tokens += t.tokens_in + t.tokens_out, i.tokensCached += t.tokens_cached ?? 0, i.llmCalls++), h.stats.llmCalls++, h.stats.tokens += t.tokens_in + t.tokens_out;
433
+ break;
434
+ }
435
+ case "message":
436
+ h.comets.push({ id: ++jn, run: t.run_id, from: t.from_id, to: t.to_id, start: e, dur: 1300, text: t.text }), h.focus = t.to_id, h.focusAt = e;
437
+ break;
438
+ case "tool": {
439
+ h.stats.toolCalls++, /^(task|agent)$/i.test(t.tool) && (h.spawnHintAt = e);
440
+ const i = h.instances.get(t.id);
441
+ i && (i.pulse = Math.max(i.pulse, 0.5), i.pulseAt = e, i.toolCalls++);
442
+ break;
443
+ }
444
+ case "skill": {
445
+ const i = h.instances.get(t.id);
446
+ if (!i) break;
447
+ let u = i.skills.get(t.name);
448
+ if (u || i.skills.set(t.name, u = { active: !1, count: 0, last: e, startAt: 0, endAt: 0 }), u.last = e, t.status === "start") {
449
+ const o = u.count > 0 && (!u.endAt || e < No(u) + Io);
450
+ u.startAt = o ? e - Math.min(zo, e - u.startAt) : e, u.endAt = 0, u.active = !0, u.count++, i.skill = t.name, i.skillEndAt = 0;
451
+ } else if (u.active) {
452
+ u.active = !1, u.endAt = e;
453
+ let o = "";
454
+ for (const [g, c] of i.skills) c.active && (!o || c.startAt > i.skills.get(o).startAt) && (o = g);
455
+ o ? i.skill = o : i.skillEndAt = e;
456
+ }
457
+ break;
458
+ }
459
+ case "decision": {
460
+ const i = h.instances.get(t.id), u = !!t.hv || !!i && Gs(i, e);
461
+ if (!u) {
462
+ h.stats.decisions++, h.stats.decisionMs += t.ms;
463
+ const A = h.decisionProviders.get(t.provider) ?? { n: 0, ms: 0 };
464
+ A.n++, A.ms += t.ms, h.decisionProviders.set(t.provider, A);
465
+ const M = h.rate.acc;
466
+ M.n++, wt(t) && M.deny++, M.msN++, M.p50 += t.ms, M.p95 += t.ms;
467
+ }
468
+ if (!i) break;
469
+ i.status === "spawning" && (i.status = "thinking");
470
+ let o = !1;
471
+ if (t.scope === "global") {
472
+ const A = xi(t, e);
473
+ !A && wt(t) && i.hv && (i.hv.bump = e, i.hv.bumpDeny = !0), o = A || wt(t);
474
+ }
475
+ const g = i.decisions[i.decisions.length - 1], { type: c, run_id: m, id: b, ...v } = t, p = { ...v, hv: u, at: u || o || !g ? e : Math.max(e, g.at + li) };
476
+ o ? p.hidden = !0 : u && !Ci(p, e) && i.hv && (i.hv.bump = e, i.hv.bumpDeny = wt(p)), i.decisions.push(p), i.decisions.length > fi && i.decisions.shift();
477
+ break;
478
+ }
479
+ case "decision_stats": {
480
+ h.stats.decisions += t.n, h.stats.decisionMs += t.p50_ms * t.n;
481
+ for (const [M, O] of Object.entries(t.providers)) {
482
+ const C = h.decisionProviders.get(M) ?? { n: 0, ms: 0 };
483
+ C.n += O, C.ms += t.p50_ms * O, h.decisionProviders.set(M, C);
484
+ }
485
+ const i = t.by_purpose, u = h.rate.acc;
486
+ u.n += t.n, u.deny += ((a = i.guard) == null ? void 0 : a.deny) ?? 0, u.msN += t.n, u.p50 += t.p50_ms * t.n, u.p95 += t.p95_ms * t.n;
487
+ const o = h.instances.get(t.id);
488
+ if (!o || t.n <= 0) break;
489
+ o.status === "spawning" && (o.status = "thinking");
490
+ const g = Oi.fill(0);
491
+ if (i.guard && (g[0] += i.guard.allow, g[1] += i.guard.deny), i.check && (g[2] += i.check.yes, g[3] += i.check.no, g[8] += Math.max(0, i.check.n - i.check.yes - i.check.no)), i.route) for (const [M, O] of Object.entries(i.route.results)) g[M === "other" ? 8 : ni(M)] += O;
492
+ const c = g.reduce((M, O) => M + O, 0) || 1, m = t.n * 1e3 / Math.max(1, t.window_ms), b = (((r = i.guard) == null ? void 0 : r.deny) ?? 0) / t.n;
493
+ let v = "", p = -1;
494
+ for (const [M, O] of Object.entries(t.providers)) O > p && (v = M, p = O);
495
+ const A = o.hv;
496
+ if (!A || e - A.at > xn + Ds)
497
+ o.hv = { at: e, bump: (A == null ? void 0 : A.bump) ?? 0, bumpDeny: (A == null ? void 0 : A.bumpDeny) ?? !1, rate: m, deny: b, p50: t.p50_ms, p95: t.p95_ms, seg: g.map((M) => M / c), provider: v || "llm", n: t.n, windows: A ? A.windows : 0 };
498
+ else {
499
+ const M = si;
500
+ A.at = e, A.rate += (m - A.rate) * M, A.deny += (b - A.deny) * M, A.p50 += (t.p50_ms - A.p50) * M, A.p95 += (t.p95_ms - A.p95) * M;
501
+ for (let O = 0; O < g.length; O++) A.seg[O] += (g[O] / c - A.seg[O]) * M;
502
+ A.provider = v || A.provider, A.n = t.n, A.windows++;
503
+ }
504
+ break;
505
+ }
506
+ case "order": {
507
+ h.orders.n++, t.dry_run && h.orders.paper++, (t.status === "rejected" || t.status === "cancelled") && h.orders.rejected++;
508
+ const i = h.instances.get(t.id);
509
+ if (!i) break;
510
+ const { type: u, run_id: o, id: g, ...c } = t;
511
+ i.orders.push({ ...c, at: e }), i.orders.length > ei && i.orders.shift();
512
+ break;
513
+ }
514
+ case "graph":
515
+ h.hasGraph && !Je(e) && (h.hasGraphAt = e), Ho(!0, !1), h.graphAt = e, t.run_id && h.graphRuns.add(t.run_id), (l = h.instances.get(t.id)) != null && l.nodes && t.nodes.forEach((i) => h.instances.get(t.id).nodes.add(i));
516
+ for (const i of t.nodes.slice(0, 20)) h.flares.push({ id: ++jn, run: t.run_id, instance: t.id, node: i, op: t.op, start: e });
517
+ t.op === "read" ? h.stats.graphReads += t.nodes.length : h.stats.graphWrites += t.nodes.length;
518
+ break;
519
+ case "mcp_register": {
520
+ let i = h.mcpRegistry.get(t.server);
521
+ i || h.mcpRegistry.set(t.server, i = /* @__PURE__ */ new Map());
522
+ for (const u of t.resources) i.has(u.name) || i.set(u.name, u.kind);
523
+ break;
524
+ }
525
+ case "mcp": {
526
+ let i = h.mcpServers.get(t.server);
527
+ i || (i = { name: t.server, color: Ai[t.server] ?? "#94a3b8", slot: h.mcpServers.size, activeAt: e, calls: 0, inflight: 0, resources: /* @__PURE__ */ new Map() }, h.mcpServers.set(t.server, i)), i.activeAt = e;
528
+ let u;
529
+ if (t.resource && (u = i.resources.get(t.resource), u || (u = { name: t.resource, kind: t.resource_kind ?? ((d = h.mcpRegistry.get(t.server)) == null ? void 0 : d.get(t.resource)) ?? "api", activeAt: e, inflight: 0, calls: 0 }, i.resources.set(t.resource, u)), u.activeAt = e, t.phase === "call" ? (u.inflight++, u.calls++) : u.inflight = Math.max(0, u.inflight - 1)), t.phase === "call") {
530
+ const g = h.instances.get(t.id);
531
+ g && (g.mcpCalls++, g.lastMcp = t.server), h.mcpTools.set(t.tool, t.server), i.calls++, i.inflight++, h.stats.mcpCalls++;
532
+ } else i.inflight = Math.max(0, i.inflight - 1);
533
+ h.mcpCalls.push({ id: ++jn, run: t.run_id, instance: t.id, server: t.server, tool: t.tool, resource: t.resource, phase: t.phase, start: e, dur: 900 });
534
+ const o = `${t.id}|${t.server}|${t.tool}`;
535
+ if (t.phase === "call") h.mcpPending.set(o, { key: o, run: t.run_id, instance: t.id, server: t.server, tool: t.tool, resource: t.resource, since: e });
536
+ else {
537
+ const g = h.mcpPending.get(o);
538
+ g && h.mcpResolved.push({ ...g, resolvedAt: e }), h.mcpPending.delete(o);
539
+ }
540
+ break;
541
+ }
542
+ case "chat": {
543
+ const i = h.instances.get(t.id);
544
+ i && (i.chat = [...i.chat, { role: t.role, text: t.text }].slice(-20));
545
+ break;
546
+ }
547
+ case "final": {
548
+ const i = h.runs.get(t.run_id);
549
+ i && (i.final = t.text), h.lastFinal = t.text;
550
+ break;
551
+ }
552
+ }
553
+ const s = t.type === "decision_stats" ? null : "id" in t ? t.id : t.type === "message" ? t.from_id : null;
554
+ if (s) {
555
+ const i = h.instances.get(s);
556
+ i && (i.recent.unshift(t), i.recent.length > 40 && (i.recent.length = 40));
557
+ }
558
+ Ri.has(t.type) && e - On < Bo ? Sn = !0 : (On = e, Sn = !1, Wt());
559
+ }
560
+ function Pi(t) {
561
+ const e = h.rate;
562
+ e.rollAt || (e.rollAt = t);
563
+ const n = t - e.rollAt;
564
+ if (n < 1e3) return !1;
565
+ const s = e.acc;
566
+ return e.perS = s.n * 1e3 / n, e.deny = s.n ? s.deny / s.n : 0, s.msN && (e.p50 = s.p50 / s.msN, e.p95 = s.p95 / s.msN), e.spark.push(e.perS), e.spark.length > 60 && e.spark.shift(), s.n = s.deny = s.msN = s.p50 = s.p95 = 0, e.rollAt = t, !0;
567
+ }
568
+ const Zn = /* @__PURE__ */ new Set(), Jn = /* @__PURE__ */ new Set(), Ye = /* @__PURE__ */ new Map();
569
+ function Vi(t, e) {
570
+ let n = !1;
571
+ for (const s of t.skills.values())
572
+ s.active && (e - s.startAt > mi ? (s.active = !1, s.endAt = e) : n = !0);
573
+ n || (t.skillEndAt = e);
574
+ }
575
+ const Xn = /* @__PURE__ */ new Set();
576
+ let gr = 0;
577
+ function zi(t = performance.now()) {
578
+ let e = Pi(t);
579
+ if (t - gr > 1e3) {
580
+ gr = t;
581
+ for (const r of h.runs.values()) {
582
+ const l = Ze(r, t);
583
+ l !== Xn.has(r.id) && (l ? Xn.add(r.id) : Xn.delete(r.id), e = !0);
584
+ }
585
+ }
586
+ Sn && t - On >= Bo && (e = !0), Zn.clear(), Jn.clear(), Ye.clear();
587
+ for (const [r, l] of h.instances)
588
+ Zn.add(l.run), l.skill && !l.skillEndAt && Vi(l, t), l.exitAt || (l.doneAt ? (l.doneAt > (Ye.get(l.run) ?? 0) && Ye.set(l.run, l.doneAt), l.parent && t - l.doneAt > Go && (l.exitAt = t)) : Jn.add(l.run)), l.exitAt && t - l.exitAt > Bn.fadeMs(l) && (h.instances.delete(r), h.archive.set(r, l), h.archive.size > ki && h.archive.delete(h.archive.keys().next().value), e = !0);
589
+ for (const [r, l] of Ye)
590
+ if (!Jn.has(r) && t - l > yi && !Ii(h.runs.get(r)))
591
+ for (const d of h.instances.values()) d.run === r && !d.exitAt && (d.exitAt = t);
592
+ for (const [r, l] of h.runs)
593
+ l.endedAt && t - l.endedAt > xs && !Zn.has(r) && (h.runs.delete(r), e = !0);
594
+ const n = h.comets.length;
595
+ h.comets = h.comets.filter((r) => t - r.start < r.dur + 250), h.mcpResolved = h.mcpResolved.filter((r) => t - r.resolvedAt < 700);
596
+ const s = h.mcpCalls.length;
597
+ h.mcpCalls = h.mcpCalls.filter((r) => t - r.start < r.dur + 250);
598
+ const a = h.flares.length;
599
+ h.flares = h.flares.filter((r) => t - r.start < 2600), (e || n !== h.comets.length || a !== h.flares.length || s !== h.mcpCalls.length) && (On = t, Sn = !1, Wt());
600
+ }
601
+ const Ii = (t) => !!t && t.status === "started" && Do(t) !== null;
602
+ function Te(t, e = performance.now()) {
603
+ const n = Math.min(1, (e - t.bornAt) / 600), s = 1 - Math.pow(1 - n, 3);
604
+ return t.exitAt ? s * Math.max(0, 1 - (e - t.exitAt) / Bn.fadeMs(t)) : s;
605
+ }
606
+ function En(t, e = performance.now()) {
607
+ return t.pulse * Math.exp(-((e - t.pulseAt) / 1e3) * 2.2);
608
+ }
609
+ function Ni(t, e = performance.now()) {
610
+ return (e - t.since) / 1e3;
611
+ }
612
+ const qi = /* @__PURE__ */ new Set(["planner", "researcher", "graph_scout", "records_scout", "data_scout", "writer"]);
613
+ function Di(t, e) {
614
+ if (qi.has(t)) return t;
615
+ const n = t.toLowerCase();
616
+ return /plan|orchestr|router|supervis|manager|coordinat/.test(n) ? "planner" : /writ|report|summar|answer|final|compose|draft/.test(n) ? "writer" : e ? /graph|kg|memory|retriev|search|web/.test(n) ? "graph_scout" : /record|doc|file/.test(n) ? "records_scout" : "data_scout" : "researcher";
617
+ }
618
+ function vr(t) {
619
+ return t.subagent ? 0.6 : 1.35;
620
+ }
621
+ function Zs(t) {
622
+ if (t)
623
+ return h.instances.get(t) ?? h.archive.get(t);
624
+ }
625
+ function le(t) {
626
+ h.selected !== t && (h.selected = t, Wt());
627
+ }
628
+ function Tn(t) {
629
+ h.simulated = t, Wt();
630
+ }
631
+ function Li(t) {
632
+ h.graphLabel !== t && (h.graphLabel = t, Wt());
633
+ }
634
+ function Js(t) {
635
+ h.unauthorized !== t && (h.unauthorized = t, Wt());
636
+ }
637
+ function Gi() {
638
+ h.runs.clear(), h.instances.clear(), h.comets.length = 0, h.flares.length = 0, h.mcpServers.clear(), h.mcpRegistry.clear(), h.mcpCalls.length = 0, h.mcpPending.clear(), h.mcpTools.clear(), h.mcpResolved.length = 0, h.ticker.length = 0;
639
+ for (const t of Object.keys(h.stats)) h.stats[t] = 0;
640
+ h.decisionProviders.clear(), h.rate = { perS: 0, deny: 0, p50: 0, p95: 0, spark: [], rollAt: 0, acc: { n: 0, deny: 0, msN: 0, p50: 0, p95: 0 } }, h.orders = { n: 0, paper: 0, rejected: 0 }, ve.clear(), Tt.length = 0, h.lastFinal = "", h.simulated = !1, h.mode = "connecting", h.focus = null, h.focusAt = 0, h.spawnHintAt = 0, h.archive.clear(), h.selected = null, h.unauthorized = !1, h.hasGraph = !1, h.hasGraphAt = 0, h.graphRuns.clear(), h.graphAt = 0, h.halts.clear(), Bs.clear(), Wt();
641
+ }
642
+ function Ar(t) {
643
+ h.mode = t, h.simulated = t === "sim", t === "sim" && Ho(!0, !1), Wt();
644
+ }
645
+ function Ho(t, e = !0) {
646
+ h.hasGraph || (h.hasGraph = !0, h.hasGraphAt = h.mode === "sim" ? -1e9 : performance.now(), e && Wt());
647
+ }
648
+ const Wi = 2500;
649
+ function Bf(t, e, n = 1.5) {
650
+ const s = (e - t - Wi) / 1e3;
651
+ return s <= 0 ? 1 : Math.exp(-s * n);
652
+ }
653
+ const Fi = 9e4;
654
+ function Ui(t, e = performance.now()) {
655
+ return t.calls > 0 && (t.inflight > 0 || e - t.activeAt < Fi);
656
+ }
657
+ function Je(t = performance.now()) {
658
+ if (!h.hasGraph) return !1;
659
+ if (h.mode === "sim" || t - h.graphAt < xs) return !0;
660
+ for (const e of h.graphRuns) {
661
+ const n = h.runs.get(e);
662
+ if (n && (!n.endedAt || t - n.endedAt < xs)) return !0;
663
+ (!n || n.endedAt) && h.graphRuns.delete(e);
664
+ }
665
+ return !1;
666
+ }
667
+ const Bi = 1800;
668
+ function Hi(t = performance.now()) {
669
+ if (!h.hasGraph) return 0;
670
+ const e = Math.min(1, Math.max(0, (t - h.hasGraphAt) / Bi));
671
+ return e * e * (3 - 2 * e);
672
+ }
673
+ function ji() {
674
+ return Oe(
675
+ (t) => (je.add(t), () => je.delete(t)),
676
+ () => h.hasGraph,
677
+ () => !1
678
+ );
679
+ }
680
+ const _e = { decision: 2e4, agent: 600, skill: 450, run: 400, mcp: 300, resource: 290, cluster: 250, backend: 150, graph: 140, extra: 120, sub: 100 }, ue = So({ kind: "extra" }), j = {
681
+ entries: [],
682
+ /** a KitScene is mounted (outside one, nothing is ever hidden) */
683
+ active: 0,
684
+ /** labels project their rects this frame */
685
+ due: !1,
686
+ /** px-range multiplier: labels shrink a bit on small canvases */
687
+ pxk: 1,
688
+ last: -1e9,
689
+ /** last pass stats (debug / verification) */
690
+ stats: { shown: 0, hidden: 0, dropped: 0, off: 0 },
691
+ /** measured on-screen size of the largest cluster badge (css px; 0 = none seen yet): presets space clusters by it */
692
+ badge: { w: 0, h: 0 }
693
+ };
694
+ function Zi(t, e, n) {
695
+ return { kind: t, agent: e, 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: j.active ? 0 : 1, subOff: !1, placed: !1, score: 0, born: 0 };
696
+ }
697
+ function Ji(t) {
698
+ j.entries.push(t);
699
+ }
700
+ function Xi(t) {
701
+ const e = j.entries, n = e.indexOf(t);
702
+ n < 0 || (e[n] = e[e.length - 1], e.pop());
703
+ }
704
+ const Ki = 100, Qi = { decision: !1, agent: !1, skill: !0, run: !1, mcp: !1, resource: !1, cluster: !1, backend: !0, graph: !0, extra: !0, sub: !0 }, $e = 3, _t = [];
705
+ let Ot = new Float64Array(256 * 4);
706
+ const Yi = (t, e) => e.score - t.score;
707
+ function _i(t, e) {
708
+ if (t.kind === "decision") return _e.decision + Math.min(5e3, Math.max(0, 5e3 - (e - t.born) / 10));
709
+ let n = _e[t.kind];
710
+ const s = t.agent;
711
+ if (s && (t.kind === "agent" || t.kind === "sub")) {
712
+ const a = s.inst;
713
+ if (h.selected === s.id) return 1e4;
714
+ const r = Math.min(1, En(a, e)) * 60 + (a.status === "thinking" ? 30 : 0);
715
+ n = s.depth > 0 ? _e.sub + r * 0.5 : _e.agent + r, (a.exitAt || a.doneAt) && (n -= s.depth > 0 ? 60 : 350);
716
+ } else if (s && t.kind === "skill") {
717
+ if (h.selected === s.id) return 9990;
718
+ n += Math.min(1, En(s.inst, e)) * 30 + (s.depth > 0 ? 0 : 20), (s.inst.exitAt || s.inst.doneAt) && (n -= 300);
719
+ }
720
+ return n + t.size * 10 + (t.placed ? 8 : 0);
721
+ }
722
+ function yr(t, e, n, s, a) {
723
+ const r = t - n / 2 - $e, l = t + n / 2 + $e, d = e - s / 2 - $e, i = e + s / 2 + $e;
724
+ for (let u = 0; u < a; u++) {
725
+ const o = u * 4;
726
+ if (r < Ot[o + 2] && l > Ot[o] && d < Ot[o + 3] && i > Ot[o + 1]) return !1;
727
+ }
728
+ return !0;
729
+ }
730
+ function Mr(t, e, n, s, a) {
731
+ if ((a + 1) * 4 > Ot.length) {
732
+ const l = new Float64Array(Ot.length * 2);
733
+ l.set(Ot), Ot = l;
734
+ }
735
+ const r = a * 4;
736
+ Ot[r] = t - n / 2, Ot[r + 1] = e - s / 2, Ot[r + 2] = t + n / 2, Ot[r + 3] = e + s / 2;
737
+ }
738
+ function $i(t) {
739
+ _t.length = 0;
740
+ for (const i of j.entries)
741
+ i.live ? (i.score = _i(i, t), _t.push(i)) : i.placed = !1;
742
+ _t.sort(Yi);
743
+ let e = 0, n = 0, s = 0;
744
+ for (const i of _t)
745
+ i.clip && Qi[i.kind] ? (i.show = 0, i.placed = !1, n++) : yr(i.x, i.y, i.w, i.h, e) ? (Mr(i.x, i.y, i.w, i.h, e++), i.show = 1, i.subOff = !1, i.placed = !0) : i.w1 > 0 && yr(i.x1, i.y1, i.w1, i.h1, e) ? (Mr(i.x1, i.y1, i.w1, i.h1, e++), i.show = 1, i.subOff = !0, i.placed = !0, s++) : (i.show = 0, i.placed = !1, n++);
746
+ let a = 0, r = 0;
747
+ for (const i of _t) i.kind === "cluster" && (a = Math.max(a, i.w), r = Math.max(r, i.h));
748
+ const l = j.badge;
749
+ a > 0 && ((!l.w || Math.abs(a - l.w) / l.w > 0.12) && (l.w = a), (!l.h || Math.abs(r - l.h) / l.h > 0.12) && (l.h = r));
750
+ const d = j.stats;
751
+ d.shown = e, d.hidden = n, d.dropped = s, d.off = j.entries.length - _t.length, _t.length = 0;
752
+ }
753
+ function tc(t, e, n) {
754
+ if (j.pxk = Math.min(1, Math.max(0.78, Math.sqrt(Math.min(e / 1280, n / 760)))), j.due) {
755
+ j.due = !1, $i(t);
756
+ for (const s of j.entries) s.live = !1;
757
+ } else t - j.last >= Ki && (j.last = t, j.due = !0);
758
+ }
759
+ const ec = { decision: !1, agent: !1, skill: !1, sub: !1, run: !0, mcp: !0, resource: !0, backend: !0, cluster: !0, graph: !1, extra: !1 };
760
+ function nc(t, e) {
761
+ for (const n of j.entries) ec[n.kind] && t - n.seen < 600 && (n.show > 0 || !j.active) && e(n);
762
+ }
763
+ function sc() {
764
+ const t = j.entries.filter((n) => n.drawn && performance.now() - n.seen < 300);
765
+ let e = 0;
766
+ for (let n = 0; n < t.length; n++)
767
+ for (let s = n + 1; s < t.length; s++) {
768
+ const a = t[n], r = t[s], l = a.subOff ? a.w1 : a.w, d = a.subOff ? a.h1 : a.h, i = a.subOff ? a.x1 : a.x, u = a.subOff ? a.y1 : a.y, o = r.subOff ? r.w1 : r.w, g = r.subOff ? r.h1 : r.h, c = r.subOff ? r.x1 : r.x, m = r.subOff ? r.y1 : r.y;
769
+ Math.abs(i - c) * 2 < l + o && Math.abs(u - m) * 2 < d + g && e++;
770
+ }
771
+ return e;
772
+ }
773
+ typeof window < "u" && (window.__agentglowLabels = {
774
+ labels: j,
775
+ snapshot: () => ({ ...j.stats, total: j.entries.length, overlaps: sc() })
776
+ });
777
+ const jo = { nRef: 4, min: 0.6, max: 1.6, minRadius: 5, maxRadius: 80, margin: 1.12 }, D = {
778
+ scale: 1,
779
+ spread: 1,
780
+ label: 1,
781
+ /** weighted visible agent count used for the current target */
782
+ n: 0,
783
+ profile: { ...jo },
784
+ /** canvas css px + HUD insets (px) measured by FitCamera */
785
+ w: 1600,
786
+ h: 900,
787
+ insets: { top: 0, right: 0, bottom: 0, left: 0 },
788
+ /** free-area aspect (w/h after insets): presets use it to stretch layouts to the visible shape */
789
+ aspect: 16 / 9,
790
+ /**
791
+ * camera framing: `dist` = current camera distance to the orbit target (read it for fog / LOD instead of
792
+ * camera.position), `want` = committed fitted distance before the user's zoom factor `user`, `fit` = the
793
+ * instantaneous fit (what `want` would be with no batching / hysteresis); `points` = framed points
794
+ */
795
+ cam: { want: 0, fit: 0, dist: 0, user: 1, points: 0 },
796
+ /** how much of the free area the content's screen bounds fill [x, y] (debug / verification) */
797
+ fill: [0, 0],
798
+ /** world units per css px at the fitted camera distance (px-clamped labels: world size = px * wpp) */
799
+ wpp: 0.05,
800
+ /** screen shrink of a stage "up" (b) step: 1 for xy stages, |sin(elevation)| for a tilted xz ground plane */
801
+ foreshorten: 1
802
+ };
803
+ function rc(t) {
804
+ D.profile = { ...jo, ...t }, bt = -1;
805
+ }
806
+ let bt = -1, Kn = NaN;
807
+ const Nt = { from: 1, t0: 0, dur: 0 }, Xs = (t) => y.MathUtils.clamp(Math.sqrt(D.profile.nRef / Math.max(1, t)), D.profile.min, D.profile.max), Zo = (t) => t * t * (3 - 2 * t), ke = { nLive: 0, activityAt: -1e9 };
808
+ function oc(t, e, n = e) {
809
+ ke.nLive = e, n !== Kn && (Number.isNaN(Kn) || (ke.activityAt = t), Kn = n), bt < 0 && (D.n = e, bt = Xs(e), D.scale = bt, Nt.dur = 0);
810
+ const s = Nt.dur > 0 ? Math.min(1, (t - Nt.t0) / Nt.dur) : 1;
811
+ D.scale = Nt.from + (bt - Nt.from) * Zo(s), s >= 1 && (D.scale = bt), D.spread = Math.max(0.85, Math.pow(D.scale, 0.8)), D.label = y.MathUtils.clamp(Math.pow(D.scale, 0.5), 0.85, 1.25);
812
+ }
813
+ const ac = () => bt > 0 && Math.abs(Xs(ke.nLive) - bt) / bt > 0.06;
814
+ function br(t, e) {
815
+ D.n = ke.nLive;
816
+ const n = Xs(D.n);
817
+ bt > 0 && Math.abs(n - bt) / bt <= 0.06 || (Nt.from = D.scale, Nt.t0 = t, Nt.dur = e, bt = n);
818
+ }
819
+ const Jo = [".hud-top", ".hud-dock", ".hud-side"], ws = "agentglow:hud-layout";
820
+ function ic(t, e = 1.6) {
821
+ var m;
822
+ const n = t.closest(".scene-root") ?? ((m = t.parentElement) == null ? void 0 : m.parentElement), s = t.getBoundingClientRect(), a = { top: 0, right: 0, bottom: 0, left: 0 };
823
+ if (!n || s.width < 1) return a;
824
+ const r = [];
825
+ for (const b of Jo) {
826
+ const v = n.querySelector(b);
827
+ if (!v || v.offsetParent === null) continue;
828
+ const p = v.getBoundingClientRect();
829
+ if (p.width < 2 || p.height < 2) continue;
830
+ const A = { left: p.left - s.left - 6, top: p.top - s.top - 6, right: p.right - s.left + 6, bottom: p.bottom - s.top + 6 };
831
+ A.right <= 0 || A.bottom <= 0 || A.left >= s.width || A.top >= s.height || r.push(A);
832
+ }
833
+ const l = s.width, d = s.height, i = (b, v) => {
834
+ if (b <= 0 || v <= 0) return 0;
835
+ const p = Math.min(b, v * e);
836
+ return p * (p / e) + b * v * 1e-3;
837
+ }, u = r.length;
838
+ let o = -1;
839
+ for (let b = 0; b < 1 << 2 * u; b++) {
840
+ let v = 0, p = 0, A = 0, M = 0;
841
+ for (let C = 0; C < u; C++) {
842
+ const x = r[C], S = b >> 2 * C & 3;
843
+ S === 0 ? v = Math.max(v, x.right) : S === 1 ? A = Math.max(A, l - x.left) : S === 2 ? p = Math.max(p, x.bottom) : M = Math.max(M, d - x.top);
844
+ }
845
+ const O = i(l - v - A, d - p - M);
846
+ O > o && (o = O, a.left = v, a.right = A, a.top = p, a.bottom = M);
847
+ }
848
+ const g = l * 0.68, c = d * 0.68;
849
+ if (a.left + a.right > g) {
850
+ const b = g / (a.left + a.right);
851
+ a.left *= b, a.right *= b;
852
+ }
853
+ if (a.top + a.bottom > c) {
854
+ const b = c / (a.top + a.bottom);
855
+ a.top *= b, a.bottom *= b;
856
+ }
857
+ return a;
858
+ }
859
+ const xr = new y.Vector3();
860
+ new y.Vector3();
861
+ const tn = new y.Vector3(), wr = new y.Matrix4(), Pt = 0.85, ae = 8, kr = 1100, Sr = 2500, cc = 1.04, Or = 1e3, lc = 1.18, Er = 7e3, uc = 2e3, dc = 1e4, fc = 450, Qn = 300, pc = 0.75, Tr = 0.985;
862
+ function hc({ points: t, origin: e }) {
863
+ const n = Ke((o) => o.camera), s = Ke((o) => o.controls), a = Ke((o) => o.gl), r = Ke((o) => o.size), l = U({
864
+ base: 0,
865
+ user: 1,
866
+ userActive: !1,
867
+ userUntil: -1e9,
868
+ want: 0,
869
+ lastMeasure: -1e9,
870
+ hudMoved: !1,
871
+ dir: new y.Vector3(),
872
+ aspect: 1.6,
873
+ refit: !0,
874
+ // committed move: fitted distance (before the user factor) + projection shift tween from -> to
875
+ cur: 0,
876
+ from: 0,
877
+ t0: 0,
878
+ dur: 0,
879
+ sx: 0,
880
+ sy: 0,
881
+ fx: 0,
882
+ fy: 0,
883
+ tx: 0,
884
+ ty: 0,
885
+ // pending zoom-out (since, largest fit seen in the batch window) / zoom-in (since)
886
+ outSince: 0,
887
+ outMax: 0,
888
+ inSince: 0,
889
+ // two-phase commit: the scale moves first, then (at `phase2`) the camera fits the resized layout in one move
890
+ phase2: 0,
891
+ phase2Ms: 0,
892
+ // the instantaneous fit has been steady (<0.5%/frame) since: layout / grouping / labels still easing otherwise
893
+ lastDesired: 0,
894
+ steadySince: 0,
895
+ // the committed framing was fitted to real content (false while the scene is empty: the theme's start distance)
896
+ framed: !1
897
+ }), d = U({ a: new Float64Array(512 * ae), n: 0, tgt: new y.Vector3(), tpp: 0 }), { visit: i, visitLabel: u } = st(() => {
898
+ const o = d.current, g = (c, m, b, v, p, A, M, O) => {
899
+ if (!Number.isFinite(c) || !Number.isFinite(m) || !Number.isFinite(b)) return;
900
+ if ((o.n + 1) * ae > o.a.length) {
901
+ const x = new Float64Array(o.a.length * 2);
902
+ x.set(o.a), o.a = x;
903
+ }
904
+ tn.set(c - o.tgt.x, m - o.tgt.y, b - o.tgt.z).applyMatrix4(wr);
905
+ const C = o.n * ae;
906
+ o.a[C] = tn.x, o.a[C + 1] = tn.y, o.a[C + 2] = tn.z, o.a[C + 3] = v, o.a[C + 4] = p, o.a[C + 5] = A, o.a[C + 6] = M, o.a[C + 7] = O, o.n++;
907
+ };
908
+ return {
909
+ visit: (c, m) => g(c.x + e.x, c.y + e.y, c.z + e.z, m, 0, 0, 0, 0),
910
+ // label anchors are world positions; css px (y down) -> view-angle units (y up)
911
+ visitLabel: (c) => g(c.ax, c.ay, c.az, 0, c.ox0 * o.tpp, c.ox1 * o.tpp, -c.oy1 * o.tpp, -c.oy0 * o.tpp)
912
+ };
913
+ }, [e]);
914
+ return ot(() => {
915
+ D.w = r.width, D.h = r.height, l.current.lastMeasure = -1e9, l.current.refit = !0;
916
+ }, [r.width, r.height]), ot(() => () => n.clearViewOffset(), [n]), ot(() => {
917
+ const o = a.domElement.closest(".scene-root");
918
+ if (!o) return;
919
+ const g = () => {
920
+ l.current.lastMeasure = -1e9, l.current.hudMoved = !0;
921
+ };
922
+ return o.addEventListener(ws, g), () => o.removeEventListener(ws, g);
923
+ }, [a]), ot(() => {
924
+ if (!s) return;
925
+ const o = l.current, g = () => o.userActive = !0, c = () => {
926
+ o.userActive = !1, o.userUntil = performance.now() + dc, o.want = o.from = o.cur, o.dur = 0;
927
+ const m = s.target ?? xr.set(0, 0, 0), b = n.position.distanceTo(m);
928
+ o.cur > 0 && (o.user = y.MathUtils.clamp(b / o.cur, 0.35, 3));
929
+ };
930
+ return s.addEventListener("start", g), s.addEventListener("end", c), () => {
931
+ s.removeEventListener("start", g), s.removeEventListener("end", c);
932
+ };
933
+ }, [s, n]), dt((o, g) => {
934
+ var Z;
935
+ const c = l.current, m = d.current;
936
+ Xo = m, ks = { camera: n, points: t, origin: e, canvas: a.domElement };
937
+ const b = Math.min(0.1, g), v = performance.now(), p = Math.max(1, r.width), A = Math.max(1, r.height);
938
+ if (v - c.lastMeasure > 700) {
939
+ c.lastMeasure = v;
940
+ const z = D.insets;
941
+ D.insets = ic(a.domElement, Math.max(0.9, c.aspect)), c.hudMoved && (Math.max(Math.abs(z.top - D.insets.top), Math.abs(z.right - D.insets.right), Math.abs(z.bottom - D.insets.bottom), Math.abs(z.left - D.insets.left)) > 12 && (c.refit = !0), c.hudMoved = !1);
942
+ }
943
+ const M = D.insets, O = Math.max(p * 0.3, p - M.left - M.right), C = Math.max(A * 0.3, A - M.top - M.bottom);
944
+ D.aspect = O / C;
945
+ const x = (s == null ? void 0 : s.target) ?? xr.set(0, 0, 0);
946
+ c.base || (c.base = n.position.distanceTo(x) || 20), c.dir.subVectors(n.position, x);
947
+ const S = c.dir.length() || 1;
948
+ c.dir.divideScalar(S), wr.extractRotation(n.matrixWorld).invert(), D.foreshorten = y.MathUtils.clamp(k.plane === "xz" ? Math.abs(c.dir.y) : Math.sqrt(1 - c.dir.y * c.dir.y), 0.35, 1);
949
+ const N = Math.tan(y.MathUtils.degToRad(n.fov) / 2), T = O / p * N * n.aspect, P = C / A * N;
950
+ m.n = 0, m.tgt.copy(x), m.tpp = 2 * N / A, t(i), nc(v, u);
951
+ const E = m.n, w = D.profile, L = w.minRadius / Math.min(T, P), W = w.maxRadius / Math.min(T, P);
952
+ let G;
953
+ if (!E) G = c.want || c.base;
954
+ else {
955
+ const z = w.margin;
956
+ if (Cr(m.a, E, W, z, T, P)) {
957
+ let J = Math.max(0.5, Math.min(L, W) * 0.25), X = W;
958
+ for (let mt = 0; mt < 22; mt++) {
959
+ const it = (J + X) / 2;
960
+ Cr(m.a, E, it, z, T, P) ? X = it : J = it;
961
+ }
962
+ G = y.MathUtils.clamp(X, L, W);
963
+ } else G = W;
964
+ }
965
+ let $ = !1;
966
+ if (E) {
967
+ gn(m.a, E, S);
968
+ const z = T * Tr, J = P * Tr;
969
+ $ = tt[0] < c.sx - z || tt[1] > c.sx + z || tt[2] < c.sy - J || tt[3] > c.sy + J, c.aspect += (y.MathUtils.clamp((tt[1] - tt[0]) / Math.max(1e-4, tt[3] - tt[2]), 0.5, 4) - c.aspect) * 0.1, D.fill[0] = (tt[1] - tt[0]) / (2 * T), D.fill[1] = (tt[3] - tt[2]) / (2 * P);
970
+ }
971
+ (!c.lastDesired || Math.abs(G - c.lastDesired) / c.lastDesired > 5e-3) && (c.steadySince = v), c.lastDesired = G;
972
+ const _ = v - c.steadySince, et = c.userActive || v < c.userUntil;
973
+ let Q = -1, B = 0, Y = !1;
974
+ if (E || (c.framed = !1), !c.want || c.refit)
975
+ Q = G, B = c.want ? fc : 0, c.refit = !1;
976
+ else if (!c.framed && E && !et && _ >= Qn && v - Math.max(ke.activityAt, h.spawnHintAt) >= kr)
977
+ Q = Math.max(G, Math.min(c.want, c.base * pc)), B = Or;
978
+ else if (c.phase2) {
979
+ if (v >= c.phase2 && (_ >= Qn || v - c.phase2 >= Sr)) {
980
+ c.phase2 = 0;
981
+ const z = G / c.want;
982
+ (z > 1.02 || z < 1 / 1.02) && (Q = G, B = c.phase2Ms);
983
+ }
984
+ } else if (!et) {
985
+ const z = G / c.want, J = v - Math.max(ke.activityAt, h.spawnHintAt), X = $ && c.user >= 0.99 && (c.dur <= 0 || v - c.t0 >= c.dur);
986
+ z > cc || X ? (c.inSince = 0, c.outSince ? c.outMax = Math.max(c.outMax, G) : (c.outSince = v, c.outMax = G), (J >= kr && _ >= Qn || v - c.outSince >= Sr) && (Q = Math.max(c.outMax, G, X ? c.want : 0), B = Or, Y = !0)) : (c.outSince = 0, z < 1 / lc ? (c.inSince || (c.inSince = v), v - c.inSince >= Er && J >= Er && (Q = G, B = uc, Y = !0)) : c.inSince = 0);
987
+ }
988
+ if (Q >= 0)
989
+ if (c.outSince = c.inSince = 0, E && (c.framed = !0), Y && ac() && !xt)
990
+ br(v, B * 0.8), c.phase2 = v + B * 0.8 + 250, c.phase2Ms = B;
991
+ else {
992
+ const z = xt ? 0 : B;
993
+ c.from = c.cur || Q, c.want = Q, c.t0 = v, c.dur = z, c.fx = c.sx, c.fy = c.sy, E && (gn(m.a, E, Q * c.user), c.tx = y.MathUtils.clamp((tt[0] + tt[1]) / 2, -T * Pt, T * Pt), c.ty = y.MathUtils.clamp((tt[2] + tt[3]) / 2, -P * Pt, P * Pt)), br(v, z);
994
+ }
995
+ const H = 2 * N * c.want * c.user / A;
996
+ Math.abs(H - D.wpp) / D.wpp > 0.1 && (D.wpp = H);
997
+ const V = c.dur > 0 ? Math.min(1, (v - c.t0) / c.dur) : 1, I = Zo(V);
998
+ if (c.cur = c.from + (c.want - c.from) * I, et && E) {
999
+ gn(m.a, E, S);
1000
+ const z = 1 - Math.exp(-b / 0.3);
1001
+ c.tx = y.MathUtils.clamp((tt[0] + tt[1]) / 2, -T * Pt, T * Pt), c.ty = y.MathUtils.clamp((tt[2] + tt[3]) / 2, -P * Pt, P * Pt), c.sx += (c.tx - c.sx) * z, c.sy += (c.ty - c.sy) * z, c.fx = c.sx, c.fy = c.sy;
1002
+ } else
1003
+ c.sx = c.fx + (c.tx - c.fx) * I, c.sy = c.fy + (c.ty - c.fy) * I;
1004
+ D.cam.want = c.want, D.cam.fit = G, D.cam.dist = S, D.cam.user = c.user, D.cam.points = E;
1005
+ const nt = M.left + O / 2, at = M.top + C / 2, At = p / 2 - nt + c.sx / (N * n.aspect) * (p / 2), Et = A / 2 - at - c.sy / N * (A / 2), ft = n.view;
1006
+ if ((!ft || !ft.enabled || ft.fullWidth !== p || ft.fullHeight !== A || Math.abs(ft.offsetX - At) > 0.25 || Math.abs(ft.offsetY - Et) > 0.25) && n.setViewOffset(p, A, At, Et, p, A), c.userActive) return;
1007
+ let q = c.cur * c.user;
1008
+ (s == null ? void 0 : s.minDistance) !== void 0 && (q = Math.max(q, s.minDistance)), (s == null ? void 0 : s.maxDistance) !== void 0 && Number.isFinite(s.maxDistance) && (q = Math.min(q, s.maxDistance)), !(Math.abs(q - S) < 1e-4) && (n.position.copy(x).addScaledVector(c.dir, q), (Z = s == null ? void 0 : s.update) == null || Z.call(s));
1009
+ }), null;
1010
+ }
1011
+ const tt = new Float64Array(4);
1012
+ function gn(t, e, n) {
1013
+ let s = 1 / 0, a = -1 / 0, r = 1 / 0, l = -1 / 0;
1014
+ for (let d = 0; d < e; d++) {
1015
+ const i = d * ae, u = t[i + 3], o = Math.max(0.05, n - t[i + 2] - u), g = t[i], c = t[i + 1];
1016
+ s = Math.min(s, (g - u) / o + t[i + 4]), a = Math.max(a, (g + u) / o + t[i + 5]), r = Math.min(r, (c - u) / o + t[i + 6]), l = Math.max(l, (c + u) / o + t[i + 7]);
1017
+ }
1018
+ tt[0] = s, tt[1] = a, tt[2] = r, tt[3] = l;
1019
+ }
1020
+ function Cr(t, e, n, s, a, r) {
1021
+ for (let o = 0; o < e; o++) if (n - t[o * ae + 2] - t[o * ae + 3] <= 0.05) return !1;
1022
+ gn(t, e, n);
1023
+ const l = (tt[0] + tt[1]) / 2, d = (tt[2] + tt[3]) / 2, i = Math.max(0, Math.abs(l) - a * Pt), u = Math.max(0, Math.abs(d) - r * Pt);
1024
+ return ((tt[1] - tt[0]) / 2 + i) * s <= a && ((tt[3] - tt[2]) / 2 + u) * s <= r;
1025
+ }
1026
+ let Xo = null, ks = null;
1027
+ function mc() {
1028
+ if (!ks) return null;
1029
+ const { camera: t, points: e, origin: n, canvas: s } = ks, a = s.getBoundingClientRect(), r = a.width, l = a.height, d = s.closest(".scene-root") ?? document, i = [];
1030
+ for (const v of Jo) {
1031
+ const p = d.querySelector(v);
1032
+ if (!p || p.offsetParent === null) continue;
1033
+ const A = p.getBoundingClientRect();
1034
+ A.width < 2 || A.height < 2 || i.push({ sel: v, l: A.left - a.left, t: A.top - a.top, r: A.right - a.left, b: A.bottom - a.top });
1035
+ }
1036
+ const u = Math.tan(y.MathUtils.degToRad(t.fov) / 2), o = [], g = (v, p, A, M, O, C) => {
1037
+ const x = i.filter((S) => A < S.r && O > S.l && M < S.b && C > S.t).map((S) => S.sel);
1038
+ (A < 0 || M < 0 || O > r || C > l) && x.push("edge"), o.push({ kind: v, name: p, l: Math.round(A), t: Math.round(M), r: Math.round(O), b: Math.round(C), hits: x });
1039
+ }, c = new y.Vector3();
1040
+ e((v, p) => {
1041
+ c.set(v.x + n.x, v.y + n.y, v.z + n.z);
1042
+ const A = c.clone().applyMatrix4(t.matrixWorldInverse).z * -1;
1043
+ c.project(t);
1044
+ const M = (c.x + 1) / 2 * r, O = (1 - c.y) / 2 * l, C = p / Math.max(0.05, A) * (l / 2) / u;
1045
+ g("point", `${v.x.toFixed(1)},${v.y.toFixed(1)},${v.z.toFixed(1)}`, M - C, O - C, M + C, O + C);
1046
+ });
1047
+ const m = performance.now();
1048
+ for (const v of j.entries)
1049
+ if (v.drawn && m - v.seen < 600) {
1050
+ const p = v.subOff ? v.w1 : v.w, A = v.subOff ? v.h1 : v.h, M = v.subOff ? v.x1 : v.x, O = v.subOff ? v.y1 : v.y;
1051
+ g(`label:${v.kind}`, "", M - p / 2, O - A / 2, M + p / 2, O + A / 2);
1052
+ }
1053
+ const b = o.filter((v) => v.hits.length);
1054
+ return { W: r, H: l, huds: i, insets: D.insets, total: o.length, clipped: b.length, items: b };
1055
+ }
1056
+ function gc() {
1057
+ const t = Xo;
1058
+ if (!t) return [];
1059
+ const e = [];
1060
+ for (let n = 0; n < t.n; n++) {
1061
+ const s = n * ae, a = D.cam.dist - t.a[s + 2];
1062
+ e.push([+(t.a[s] / a).toFixed(3), +(t.a[s + 1] / a).toFixed(3), +t.a[s + 3].toFixed(2), +t.a[s + 4].toFixed(3), +t.a[s + 5].toFixed(3)]);
1063
+ }
1064
+ return e;
1065
+ }
1066
+ typeof window < "u" && (window.__agentglowFit = Object.assign(D, { framedPoints: gc, clipReport: mc }));
1067
+ const Dt = Math.PI, Ko = Dt * 2, Qo = 2.2, Yo = (t) => ({
1068
+ sx: t > 1 ? Math.min(1.7, Math.pow(t, 0.6)) : 1,
1069
+ sy: t < 1 ? Math.min(1.7, Math.pow(1 / t, 0.6)) : 1
1070
+ });
1071
+ function _o(t, e, n, s, a) {
1072
+ const r = e.n;
1073
+ if (r <= 1) {
1074
+ n.a = 0, n.b = 0, n.angle = -Dt / 2;
1075
+ return;
1076
+ }
1077
+ const d = (r === 2 ? 0 : r === 4 ? Dt / 4 : Dt / 2) - t * Ko / r, u = (Math.max(e.hu, e.hv) + a / 2) / Math.sin(Dt / r), { sx: o, sy: g } = Yo(e.aspect);
1078
+ n.a = Math.cos(d) * u * o, n.b = Math.sin(d) * u * g, n.angle = Math.atan2(n.b, n.a);
1079
+ }
1080
+ const vc = 186, Ac = 46, yc = 34, Yn = { w: 7, h: 6.5 };
1081
+ function Mc(t = 0) {
1082
+ const e = j.pxk, n = Math.max(120, D.w - D.insets.left - D.insets.right), s = Math.max(100, D.h - D.insets.top - D.insets.bottom);
1083
+ let a = (j.badge.w || vc * e) * 1.12;
1084
+ a = t > 1 ? Math.min(a, 0.85 * Math.min(n, s * 1.3) / (1 / Math.sin(Dt / t) + 1)) : Math.min(a, 0.85 * n / 2);
1085
+ const r = Math.min((j.badge.h || Ac * e) * 1.15, 0.22 * s);
1086
+ return Yn.w = Math.max(7, a * D.wpp), Yn.h = Math.max(6.5, 5 + r * D.wpp), Yn;
1087
+ }
1088
+ function $o(t, e, n, s, a) {
1089
+ const r = Mc(e), l = Dt / 2 + Dt / Math.max(1, e) - t * Ko / Math.max(1, e), d = Math.max(n.hw, n.hh) + yc * D.wpp * j.pxk, i = Math.max(d + 3.6, e > 1 ? r.w / (2 * Math.sin(Dt / e)) : 0), { sx: u, sy: o } = Yo(n.aspect);
1090
+ s.a = Math.cos(l) * i * u, s.b = Math.sin(l) * i * o;
1091
+ }
1092
+ const ta = {
1093
+ name: "radial",
1094
+ local: { topGap: 3.6, fanLen: 3.4, subGap: 2.7, fan: "spread", stackGap: 2, pad: 1.3 },
1095
+ run: (t, e, n) => _o(t, e, n, !0, Qo),
1096
+ cluster: (t, e, n, s, a) => $o(e, n, s, a),
1097
+ periphery: "sides"
1098
+ }, bc = {
1099
+ name: "drift",
1100
+ local: { topGap: 4, fanLen: 3.8, subGap: 3, fan: "spread", stackGap: 2.2, pad: 1.5 },
1101
+ run: (t, e, n) => _o(t, e, n, !0, Qo * 1.6),
1102
+ cluster: (t, e, n, s, a) => $o(e, n, s, a),
1103
+ periphery: "sides"
1104
+ }, xc = { radial: ta, drift: bc }, ht = 6, ea = 12, wc = 9, kc = 10, Sc = 12, Oc = 6, Ec = 8e3, Tc = 250, Cc = 1500, Rc = 300, Pc = ["planner", "researcher", "graph_scout", "records_scout", "data_scout", "writer"], Vc = (t) => ({
1105
+ lane: t,
1106
+ active: !1,
1107
+ runs: 0,
1108
+ agents: 0,
1109
+ thinking: 0,
1110
+ tokens: 0,
1111
+ energy: 0,
1112
+ color: kn[t % kn.length],
1113
+ types: { planner: 0, researcher: 0, graph_scout: 0, records_scout: 0, data_scout: 0, writer: 0 },
1114
+ version: 0,
1115
+ runIds: []
1116
+ }), F = {
1117
+ /** grouping in effect (crowded and not "show all") */
1118
+ grouped: !1,
1119
+ /** crowded per hysteresis, regardless of "show all" (HUD offers "group" again) */
1120
+ crowded: !1,
1121
+ /** user asked to see everything */
1122
+ showAll: !1,
1123
+ /** lane the user expanded by clicking its cluster (-1 = none) */
1124
+ expandedLane: -1,
1125
+ /** bumps whenever which instances/runs are expanded or labeled changes (re-filter your lists) */
1126
+ version: 0,
1127
+ alive: 0,
1128
+ expandedAgents: 0,
1129
+ expandedRuns: 0,
1130
+ collapsedRuns: 0,
1131
+ activeClusters: 0,
1132
+ clusters: Array.from({ length: ht }, (t, e) => Vc(e))
1133
+ }, Mt = /* @__PURE__ */ new Set(), Ae = /* @__PURE__ */ new Map(), Ht = /* @__PURE__ */ new Set(), ze = /* @__PURE__ */ new Map(), zc = 0.25, en = /* @__PURE__ */ new Map(), de = [], Zt = /* @__PURE__ */ new Map(), Cn = /* @__PURE__ */ new Map(), $t = [], _n = new Uint16Array(ht), nn = /* @__PURE__ */ new Map();
1134
+ let Rr = -1e9, Pr = -1, re = !0, Vr = null, zr = -1;
1135
+ const Ss = /* @__PURE__ */ new Set();
1136
+ let na = 0;
1137
+ const Se = () => {
1138
+ na++, Ss.forEach((t) => t());
1139
+ }, Ks = (t) => (t % ht + ht) % ht;
1140
+ function vn(t) {
1141
+ const e = h.runs.get(t);
1142
+ return e ? Ks(e.slot) : Math.floor(Hn(t, 77) * ht) % ht;
1143
+ }
1144
+ const Ic = (t) => vn(t.run);
1145
+ function $n(t) {
1146
+ if (!F.grouped) return !0;
1147
+ const e = typeof t == "string" ? h.instances.get(t) : t;
1148
+ return e ? Mt.has(e.run) : !1;
1149
+ }
1150
+ function Ir(t) {
1151
+ return !F.grouped || Mt.has(t);
1152
+ }
1153
+ function Hf(t) {
1154
+ return F.grouped ? t === h.selected || Ht.has(t) : !0;
1155
+ }
1156
+ const Os = (t) => F.clusters[Ks(t)];
1157
+ function Nc(t) {
1158
+ F.expandedLane = Ks(t), F.showAll = !1, Ae.clear(), re = !0, Se();
1159
+ }
1160
+ function qc() {
1161
+ F.expandedLane = -1, Ae.clear(), re = !0, Se();
1162
+ }
1163
+ function Nr(t) {
1164
+ F.showAll = t, t && (F.expandedLane = -1), re = !0, Se();
1165
+ }
1166
+ function Dc() {
1167
+ return Oe(
1168
+ (t) => (Ss.add(t), () => Ss.delete(t)),
1169
+ () => na
1170
+ ), F;
1171
+ }
1172
+ const Lc = (t, e) => Zt.get(t) - Zt.get(e) || Cn.get(e) - Cn.get(t);
1173
+ function Gc(t) {
1174
+ ze.clear(), en.clear();
1175
+ let e = 0;
1176
+ for (const m of h.instances.values())
1177
+ ze.set(m.run, (ze.get(m.run) ?? 0) + (m.doneAt && !m.exitAt ? zc : 1)), pt(m) && (e++, en.set(m.run, (en.get(m.run) ?? 0) + 1));
1178
+ F.alive = e;
1179
+ const n = F.crowded;
1180
+ !F.crowded && e > ea ? F.crowded = !0 : F.crowded && e < wc && (F.crowded = !1), !F.crowded && n && (F.showAll = !1, F.expandedLane = -1);
1181
+ const s = F.crowded && !F.showAll;
1182
+ let a = s !== F.grouped;
1183
+ if (F.grouped = s, !s) {
1184
+ (Mt.size || Ht.size) && (a = !0), Mt.clear(), Ae.clear(), Ht.clear(), F.expandedAgents = e, F.expandedRuns = h.runs.size, F.collapsedRuns = 0, F.activeClusters = 0;
1185
+ for (const m of F.clusters) m.active && (m.active = !1, m.runIds.length = 0, m.version++);
1186
+ a && F.version++, (a || n !== F.crowded) && Se();
1187
+ return;
1188
+ }
1189
+ const r = h.selected ? h.instances.get(h.selected) : void 0, l = (r == null ? void 0 : r.run) ?? null;
1190
+ de.length = 0, Zt.clear(), Cn.clear();
1191
+ for (const [m, b] of ze) {
1192
+ if (b <= 0) continue;
1193
+ const v = h.runs.get(m), p = vn(m), A = Mt.has(m) && t - (Ae.get(m) ?? 0) < Ec, M = m === l ? 0 : F.expandedLane === p ? 1 : A ? 2 : (en.get(m) ?? 0) > 0 ? 3 : 4;
1194
+ Zt.set(m, M), Cn.set(m, (v == null ? void 0 : v.startedAt) ?? 0), de.push(m);
1195
+ }
1196
+ de.sort(Lc);
1197
+ const d = F.expandedLane >= 0 ? Sc : kc;
1198
+ let i = 0, u = 0;
1199
+ _n.fill(0);
1200
+ for (let m = 0; m < 2; m++)
1201
+ for (const b of de) {
1202
+ const v = Zt.get(b);
1203
+ if (v === -1) continue;
1204
+ const p = vn(b);
1205
+ if (m === 0 && v >= 2 && _n[p]) continue;
1206
+ const A = ze.get(b);
1207
+ (v === 0 || i === 0 || i + A <= d) && (i += A, u++, _n[p]++, Zt.set(b, -1));
1208
+ }
1209
+ for (const m of Mt)
1210
+ Zt.get(m) !== -1 && (Mt.delete(m), Ae.delete(m), a = !0);
1211
+ for (const m of de)
1212
+ Zt.get(m) === -1 && !Mt.has(m) && (Mt.add(m), Ae.set(m, t), a = !0);
1213
+ F.expandedRuns = u;
1214
+ let o = 0;
1215
+ for (const m of F.clusters) m.runIds.length = 0;
1216
+ for (const m of de)
1217
+ Mt.has(m) || (F.clusters[vn(m)].runIds.push(m), o++);
1218
+ F.collapsedRuns = o, $t.length = 0, nn.clear();
1219
+ for (const m of h.instances.values()) {
1220
+ if (!pt(m) || !Mt.has(m.run)) continue;
1221
+ const b = En(m, t) + (m.status === "thinking" ? 0.6 : 0) + (Ht.has(m.id) ? 0.4 : 0) + (t - m.bornAt < 3e3 ? 1 : 0) + (m.subagent ? 0 : 0.2);
1222
+ nn.set(m.id, b), $t.push(m);
1223
+ }
1224
+ $t.sort((m, b) => nn.get(b.id) - nn.get(m.id));
1225
+ const g = Math.min(Oc, $t.length);
1226
+ let c = Ht.size !== g;
1227
+ if (!c)
1228
+ for (let m = 0; m < g; m++) Ht.has($t[m].id) || (c = !0);
1229
+ if (c) {
1230
+ Ht.clear();
1231
+ for (let m = 0; m < g; m++) Ht.add($t[m].id);
1232
+ a = !0;
1233
+ }
1234
+ $t.length = 0, a && (F.version++, Se());
1235
+ }
1236
+ function Wc() {
1237
+ const t = performance.now(), e = F.clusters, n = Fc;
1238
+ for (let r = 0; r < ht; r++) {
1239
+ const l = e[r];
1240
+ n[r * 3] = l.agents, n[r * 3 + 1] = l.thinking, n[r * 3 + 2] = l.runs, l.agents = l.thinking = l.tokens = 0;
1241
+ for (const d of Pc) l.types[d] = 0;
1242
+ ts[r] = 0;
1243
+ }
1244
+ let s = 0;
1245
+ for (const r of h.instances.values()) {
1246
+ if (Mt.has(r.run)) {
1247
+ pt(r) && s++;
1248
+ continue;
1249
+ }
1250
+ if (!pt(r)) continue;
1251
+ const l = e[Ic(r)];
1252
+ l.agents++, l.tokens += r.tokens, l.types[r.type]++, r.status === "thinking" && l.thinking++, ts[l.lane] += En(r, t);
1253
+ }
1254
+ F.expandedAgents = s;
1255
+ let a = 0;
1256
+ for (let r = 0; r < ht; r++) {
1257
+ const l = e[r];
1258
+ l.runs = l.runIds.length;
1259
+ const d = l.runs > 0;
1260
+ d && a++;
1261
+ const i = l.agents ? Math.min(1, ts[r] / l.agents * 0.9 + l.thinking / l.agents * 0.35) : 0;
1262
+ l.energy += (i - l.energy) * 0.08, (d !== l.active || n[r * 3] !== l.agents || n[r * 3 + 1] !== l.thinking || n[r * 3 + 2] !== l.runs) && l.version++, l.active = d;
1263
+ }
1264
+ a !== F.activeClusters && (F.activeClusters = a, Se());
1265
+ }
1266
+ const Fc = new Float64Array(ht * 3), ts = new Float64Array(ht);
1267
+ function Uc(t = performance.now()) {
1268
+ if (t === Pr) return;
1269
+ Pr = t, h.selected !== Vr && (Vr = h.selected, re = !0);
1270
+ const e = h.instances.size;
1271
+ e !== zr && (!F.grouped || e < ea + 4) && (re = !0), zr = e, (re || t - Rr > Tc) && (re = !1, Rr = t, Gc(t)), F.grouped && Wc();
1272
+ }
1273
+ Bn.fadeMs = (t) => F.crowded ? Mt.has(t.run) || !F.grouped ? Cc : Rc : Wo;
1274
+ const jf = (t) => t === "graph_scout" || t === "records_scout" || t === "data_scout", qr = (t, e) => Hn(t, e) - 0.5, vt = { preset: ta, graphNatural: 1, graphRadius: 2.6, peripheryGap: 3.6 }, sa = { planner: -1, researcher: 0, writer: 1, graph_scout: 0, records_scout: 0, data_scout: 0 };
1275
+ function Zf(t) {
1276
+ return sa[t] * vt.preset.local.topGap * D.spread;
1277
+ }
1278
+ const Rn = new y.Vector3(), Pn = new y.Vector3(), zt = new y.Vector3(), sn = { a: 0, b: 0, angle: 0 }, Ie = { a: 0, b: 0 }, Jt = { n: 0, aspect: 1.6, hu: 2, hv: 2, hw: 2, hh: 2 }, ee = [];
1279
+ let es = -1;
1280
+ const Bc = (t, e) => 1 - Math.exp(-t / e);
1281
+ function Hc(t, e, n) {
1282
+ let s = (e - t) % (Math.PI * 2);
1283
+ return s > Math.PI && (s -= Math.PI * 2), s < -Math.PI && (s += Math.PI * 2), t + s * n;
1284
+ }
1285
+ function ra(t) {
1286
+ const e = h.runs.get(t);
1287
+ return {
1288
+ uid: bn(),
1289
+ id: t,
1290
+ run: e,
1291
+ index: 0,
1292
+ count: 1,
1293
+ color: (e == null ? void 0 : e.color) ?? "#94a3b8",
1294
+ origin: new y.Vector3(),
1295
+ target: new y.Vector3(),
1296
+ axis: new y.Vector3(0, -1, 0),
1297
+ side: new y.Vector3(1, 0, 0),
1298
+ angle: -Math.PI / 2,
1299
+ targetAngle: -Math.PI / 2,
1300
+ cu: 0,
1301
+ cv: 0,
1302
+ hu: 1,
1303
+ hv: 1,
1304
+ tcu: 0,
1305
+ tcv: 0,
1306
+ fresh: !0,
1307
+ members: 0,
1308
+ foot: 0,
1309
+ tops: 0,
1310
+ u0: 0,
1311
+ u1: 0,
1312
+ v0: 0,
1313
+ v1: 0
1314
+ };
1315
+ }
1316
+ function Dr(t) {
1317
+ let e = 0;
1318
+ for (let n = !0; n; ) {
1319
+ n = !1;
1320
+ for (const s of k.agents.values())
1321
+ if (s.sib === e && t(s)) {
1322
+ n = !0, e++;
1323
+ break;
1324
+ }
1325
+ }
1326
+ return e;
1327
+ }
1328
+ function jc(t) {
1329
+ let e = k.runs.get(t.run);
1330
+ e || (e = ra(t.run), k.runs.set(t.run, e), k.runsVersion++);
1331
+ const n = t.parent ? k.agents.get(t.parent) : void 0, s = t.subagent ? n ? n.depth + 1 : 1 : n && n.depth > 0 ? n.depth + 1 : 0;
1332
+ let a;
1333
+ return s === 0 ? a = Dr((r) => r.depth === 0 && r.inst.run === t.run && r.inst.type === t.type) : a = Dr((r) => r.depth > 0 && r.inst.parent === t.parent), n && s > 0 && (n.kidsMax = Math.max(n.kidsMax, a + 1)), {
1334
+ uid: bn(),
1335
+ id: t.id,
1336
+ inst: t,
1337
+ run: e,
1338
+ u: 0,
1339
+ v: 0,
1340
+ eu: 0,
1341
+ ev: 0,
1342
+ target: new y.Vector3(),
1343
+ pos: new y.Vector3(),
1344
+ live: new y.Vector3(),
1345
+ scale: oa(t, s) * D.scale,
1346
+ depth: s,
1347
+ sib: a,
1348
+ sibs: 1,
1349
+ kidsMax: 0,
1350
+ kidFoot: 0,
1351
+ foot: 0,
1352
+ rx: 0,
1353
+ ry: 0,
1354
+ rings: 0,
1355
+ cell: 0,
1356
+ ringOff: 0,
1357
+ ringAt: -1,
1358
+ fresh: !0,
1359
+ dim: Us(t) ? 1 : 0
1360
+ };
1361
+ }
1362
+ const oa = (t, e) => e > 0 ? Math.min(vr(t), 0.6) : vr(t), Qs = 6, Zc = 1.15;
1363
+ function Jc(t) {
1364
+ return t.depth === 1 && t.sibs >= Qs ? Zc : oa(t.inst, t.depth);
1365
+ }
1366
+ const Xc = 0.6, Kc = 16;
1367
+ function Qc() {
1368
+ let t = 0;
1369
+ for (const n of h.instances.values()) {
1370
+ if (k.agents.has(n.id) || n.exitAt || !$n(n)) continue;
1371
+ if (t >= Kc) break;
1372
+ const s = n.parent ? h.instances.get(n.parent) : void 0;
1373
+ s && !s.exitAt && !k.agents.has(s.id) && $n(s) || (k.agents.set(n.id, jc(n)), k.agentsVersion++, t++);
1374
+ }
1375
+ for (const [n, s] of k.agents)
1376
+ (!h.instances.has(n) || !$n(s.inst)) && (k.agents.delete(n), k.agentsVersion++);
1377
+ for (const n of k.runs.values()) n.members = 0;
1378
+ for (const n of k.agents.values()) n.run.members++;
1379
+ for (const n of h.runs.values())
1380
+ k.runs.has(n.id) || n.endedAt || !Ir(n.id) || (k.runs.set(n.id, ra(n.id)), k.runsVersion++);
1381
+ for (const [n, s] of k.runs) {
1382
+ const a = h.runs.get(n);
1383
+ a && !s.run && (s.run = a, s.color = a.color), !(s.members > 0) && (a && !a.endedAt && Ir(n) || (k.runs.delete(n), k.runsVersion++));
1384
+ }
1385
+ const e = performance.now();
1386
+ for (const n of h.mcpServers.values()) {
1387
+ let s = k.mcp.get(n.name);
1388
+ const a = Ui(n, e);
1389
+ if (s && (s.wanted = a), !(!a && !s) && (s || (s = { uid: bn(), name: n.name, srv: n, out: new y.Vector3(1, 0, 0), target: new y.Vector3(), pos: new y.Vector3(), backends: /* @__PURE__ */ new Map(), fresh: !0, wanted: !0, mix: 0 }, k.mcp.set(n.name, s), k.mcpVersion++), s.backends.size !== n.resources.size)) {
1390
+ for (const r of n.resources.values())
1391
+ s.backends.has(r.name) || s.backends.set(r.name, { uid: bn(), res: r, k: 0, n: 0, target: new y.Vector3(), pos: new y.Vector3(), fresh: !0, mix: 0 });
1392
+ k.mcpVersion++;
1393
+ }
1394
+ }
1395
+ }
1396
+ let Lr = -1;
1397
+ function Yc() {
1398
+ Lr === k.runsVersion && k.runOrder.length === k.runs.size || (Lr = k.runsVersion, k.runOrder = [...k.runs.values()].sort((t, e) => {
1399
+ var n, s;
1400
+ return (((n = t.run) == null ? void 0 : n.startedAt) ?? 0) - (((s = e.run) == null ? void 0 : s.startedAt) ?? 0) || (t.id < e.id ? -1 : 1);
1401
+ }));
1402
+ }
1403
+ const _c = 16, $c = 2.6, tl = 1.45, aa = 0.9, Fe = 1.3, Vn = Math.PI * 2, he = 96, Rt = { rx: 0, ry: 0, t: new Float64Array(he + 1) };
1404
+ function el(t, e, n) {
1405
+ if (e !== Rt.rx || n !== Rt.ry) {
1406
+ Rt.rx = e, Rt.ry = n;
1407
+ let d = 0;
1408
+ Rt.t[0] = 0;
1409
+ for (let i = 1; i <= he; i++) {
1410
+ const u = Math.PI / 2 + (i - 0.5) / he * Vn;
1411
+ d += Math.hypot(e * Math.sin(u), n * Math.cos(u)), Rt.t[i] = d;
1412
+ }
1413
+ for (let i = 1; i <= he; i++) Rt.t[i] /= d;
1414
+ }
1415
+ t -= Math.floor(t);
1416
+ let s = 1;
1417
+ for (; s < he && Rt.t[s] < t; ) s++;
1418
+ const a = Rt.t[s - 1], r = Rt.t[s], l = r > a ? (t - a) / (r - a) : 0;
1419
+ return Math.PI / 2 + (s - 1 + l) / he * Vn;
1420
+ }
1421
+ function nl() {
1422
+ if (vt.preset.periphery !== "sides") return !1;
1423
+ if (k.graphWanted && Je()) return !0;
1424
+ for (const t of k.mcp.values()) if (t.wanted) return !0;
1425
+ return !1;
1426
+ }
1427
+ function sl() {
1428
+ const t = vt.preset.local;
1429
+ for (const e of k.agents.values()) e.kidFoot = 0;
1430
+ for (const e of k.runs.values()) e.foot = Fe, e.tops = 0;
1431
+ for (const e of k.agents.values()) e.depth === 0 && e.run.tops++;
1432
+ for (let e = 6; e >= 0; e--)
1433
+ for (const n of k.agents.values()) {
1434
+ if (n.depth !== e && !(e === 6 && n.depth > 6)) continue;
1435
+ const s = n.kidsMax;
1436
+ if (!s)
1437
+ n.rx = n.ry = 0, n.rings = 0, n.foot = Fe;
1438
+ else {
1439
+ const r = n.depth === 0, l = Math.ceil(s / _c), d = Math.ceil(s / l), i = Math.max(Fe, n.kidFoot), u = Math.max(t.subGap * (r ? $c : tl), s < Qs ? i * 2 + 0.6 : 0), o = Math.max(r ? t.fanLen * 1.3 : t.fanLen * 0.85, s > 1 ? d * u / Vn : 0);
1440
+ if (r && s > 1 && k.runs.size === 1) {
1441
+ const c = y.MathUtils.clamp(D.aspect * (nl() ? 0.8 : 1.15), 1, 2.4);
1442
+ n.rx = o * Math.sqrt(c), n.ry = Math.max(u * 0.6, o / Math.sqrt(c)) * (k.plane === "xz" ? be : 1);
1443
+ } else n.rx = n.ry = o;
1444
+ n.rings = l, n.cell = u;
1445
+ const g = (l - 1) * u * aa;
1446
+ n.foot = Math.max(n.rx, n.ry) + g + i;
1447
+ }
1448
+ const a = n.inst.parent ? k.agents.get(n.inst.parent) : void 0;
1449
+ a && n.depth > 0 ? a.kidFoot = Math.max(a.kidFoot, n.foot) : n.depth === 0 && (n.run.foot = Math.max(n.run.foot, n.foot));
1450
+ }
1451
+ }
1452
+ function ia(t, e, n, s) {
1453
+ const a = t.depth > 0 && t.inst.parent ? k.agents.get(t.inst.parent) : void 0;
1454
+ return a ? Math.atan2(a.v - t.v, a.u - t.u) + e * Vn : -el(e, n, s);
1455
+ }
1456
+ function rl(t) {
1457
+ const e = Math.cos(t.targetAngle), n = Math.sin(t.targetAngle);
1458
+ let s = -n, a = e;
1459
+ return s < -1e-3 && (s = -s, a = -a), Math.atan2(-n, -a);
1460
+ }
1461
+ const ol = (t, e) => Math.abs(Math.atan2(Math.sin(t - e), Math.cos(t - e))), fe = [], Ne = [];
1462
+ let Es = 0;
1463
+ function al(t, e) {
1464
+ var d;
1465
+ if (t.ringAt === Es) return t.ringOff;
1466
+ t.ringAt = Es, fe.length = Ne.length = 0, fe.push(rl(t.run)), Ne.push(1);
1467
+ const n = t.depth > 0 && t.inst.parent ? k.agents.get(t.inst.parent) : void 0;
1468
+ n ? (fe.push(Math.atan2(n.v - t.v, n.u - t.u)), Ne.push(1)) : (t.run.tops > 1 || (d = t.run.run) != null && d.hasSteps) && (fe.push(0, Math.PI), Ne.push(0.8, 0.8));
1469
+ const s = Math.max(1e-3, t.rx), a = Math.max(1e-3, t.ry);
1470
+ let r = 0, l = -1;
1471
+ for (let i = 0; i < 12; i++) {
1472
+ const u = i / 12;
1473
+ let o = 1 / 0;
1474
+ for (let g = 0; g < e && o > l; g++) {
1475
+ const c = ia(t, (g + u) / e, s, a);
1476
+ for (let m = 0; m < fe.length; m++) o = Math.min(o, ol(c, fe[m]) / Ne[m]);
1477
+ }
1478
+ o > l + 1e-3 && (l = o, r = u);
1479
+ }
1480
+ return t.ringOff = r, r;
1481
+ }
1482
+ function il(t) {
1483
+ const e = vt.preset.local, n = D.spread, s = t.inst;
1484
+ if (t.depth === 0) {
1485
+ const v = Math.max(e.topGap, t.run.foot + Fe + 0.8);
1486
+ let p = sa[s.type] * v, A = 0;
1487
+ t.sib && (p += (t.sib % 2 ? 1 : -1) * v * 0.5, A -= Math.ceil(t.sib / 2) * Math.max(e.fanLen * 0.55, t.run.foot * 1.8)), t.u = (p + qr(t.id, 31) * 0.5) * n, t.v = (A + qr(t.id, 32) * 0.4) * n;
1488
+ return;
1489
+ }
1490
+ const a = s.parent ? k.agents.get(s.parent) : void 0;
1491
+ if (!a) return;
1492
+ const r = t.sibs = Math.max(1, a.kidsMax), l = Math.max(1, a.rings), d = t.sib % l, i = Math.floor(t.sib / l), u = Math.floor(r / l) + (d < r % l ? 1 : 0), o = 1 + d * a.cell * aa / Math.max(1e-3, Math.max(a.rx, a.ry)), g = a.rx * o, c = a.ry * o;
1493
+ let m, b;
1494
+ if (!a.inst.parent && u === 1 && l === 1)
1495
+ m = Math.SQRT1_2 * g, b = Math.SQRT1_2 * c;
1496
+ else {
1497
+ const v = al(a, u), p = ia(a, (i + v + d % 2 * 0.5) / u, g, c);
1498
+ m = Math.cos(p) * g, b = Math.sin(p) * c;
1499
+ }
1500
+ t.u = a.u + m * n, t.v = a.v + b * n;
1501
+ }
1502
+ function cl() {
1503
+ var n;
1504
+ sl();
1505
+ for (let s = 0; s < 6; s++) for (const a of k.agents.values()) (a.depth === s || s === 5 && a.depth >= 5) && il(a);
1506
+ const t = vt.preset.local.pad;
1507
+ for (const s of k.runs.values()) s.u0 = 1 / 0;
1508
+ for (const s of k.agents.values()) {
1509
+ const a = s.run, r = t * Math.max(0.7, s.scale);
1510
+ a.u0 === 1 / 0 ? (a.u0 = s.u - r, a.u1 = s.u + r, a.v0 = s.v - r, a.v1 = s.v + r) : (a.u0 = Math.min(a.u0, s.u - r), a.u1 = Math.max(a.u1, s.u + r), a.v0 = Math.min(a.v0, s.v - r), a.v1 = Math.max(a.v1, s.v + r));
1511
+ }
1512
+ const e = vt.preset.local.topGap * D.spread;
1513
+ for (const s of k.runs.values())
1514
+ (n = s.run) != null && n.hasSteps && s.u0 !== 1 / 0 && (s.u0 = Math.min(s.u0, -e - t), s.u1 = Math.max(s.u1, e + t));
1515
+ for (const s of k.runs.values()) {
1516
+ if (s.u0 === 1 / 0) {
1517
+ s.hu = s.hv = t * 1.5, s.tcu = s.tcv = 0;
1518
+ continue;
1519
+ }
1520
+ 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;
1521
+ }
1522
+ }
1523
+ function Ys(t, e, n) {
1524
+ const s = Math.cos(t), a = Math.sin(t);
1525
+ gt(s, a, e);
1526
+ let r = -a, l = s;
1527
+ r < -1e-3 && (r = -r, l = -l), gt(r, l, n);
1528
+ }
1529
+ function ll(t, e, n, s) {
1530
+ return Ys(t.targetAngle, Rn, Pn), s.copy(t.target).addScaledVector(Pn, e - t.tcu).addScaledVector(Rn, n - t.tcv);
1531
+ }
1532
+ const Ue = (t) => t.x, ne = (t) => k.plane === "xy" ? t.y : -t.z;
1533
+ function ul() {
1534
+ const t = vt.preset, e = k.runOrder;
1535
+ let n = 0, s = 0;
1536
+ for (const a of e)
1537
+ n = Math.max(n, a.hu), s = Math.max(s, a.hv);
1538
+ Jt.n = e.length, Jt.aspect = D.aspect * (t.periphery === "sides" ? 0.72 : 1) / (k.plane === "xz" ? be : 1), Jt.hu = n, Jt.hv = s;
1539
+ for (let a = 0; a < e.length; a++) {
1540
+ const r = e[a];
1541
+ r.index = a, r.count = e.length, t.run(a, Jt, sn), gt(sn.a, sn.b, r.target), r.targetAngle = sn.angle;
1542
+ }
1543
+ }
1544
+ let be = 1;
1545
+ function dl() {
1546
+ const t = vt.preset, e = Math.min(1.7, 1 / Math.max(0.35, D.foreshorten));
1547
+ Math.abs(e - be) / be > 0.1 && (be = e);
1548
+ let n = 0, s = 0;
1549
+ for (const o of k.agents.values()) {
1550
+ const g = vt.preset.local.pad * Math.max(0.7, o.scale);
1551
+ n = Math.max(n, Math.abs(Ue(o.target)) + g), s = Math.max(s, Math.abs(ne(o.target)) + g);
1552
+ }
1553
+ for (const o of k.runs.values())
1554
+ o.members || (n = Math.max(n, Math.abs(Ue(o.target)) + o.hu), s = Math.max(s, Math.abs(ne(o.target)) + o.hv));
1555
+ if (Jt.hw = n, Jt.hh = s, ee.length = 0, F.grouped)
1556
+ for (let o = 0; o < ht; o++) Os(o).active && ee.push(o);
1557
+ for (let o = 0; o < ee.length; o++) {
1558
+ const g = ee[o];
1559
+ t.cluster(g, o, ee.length, Jt, Ie), gt(Ie.a, Ie.b, k.clusterTarget[g]), n = Math.max(n, Math.abs(Ie.a) + 2.4), s = Math.max(s, Math.abs(Ie.b) + 2.4);
1560
+ }
1561
+ t.round && (n = s = Math.max(n, s));
1562
+ const a = k.core;
1563
+ (Math.abs(n - a.thw) / Math.max(1, a.thw) > 0.08 || n < a.thw * 0.75) && (a.thw = n), (Math.abs(s - a.thh) / Math.max(1, a.thh) > 0.08 || s < a.thh * 0.75) && (a.thh = s), n = Math.max(2.5, a.thw), s = Math.max(2.5, a.thh);
1564
+ const r = vt.peripheryGap, l = k.graph, d = k.graphWanted && Je(), i = vt.graphRadius;
1565
+ l.radius = i;
1566
+ const u = fl;
1567
+ u.length = 0;
1568
+ for (const o of k.mcp.values()) o.wanted && u.push(o);
1569
+ if (u.sort(pl), t.periphery === "rim") {
1570
+ const o = Math.max(n, s) + r;
1571
+ d && gt(-(o + i), 0, l.target);
1572
+ const g = d ? hl : ml;
1573
+ for (let c = 0; c < u.length; c++) {
1574
+ const m = u[c], b = Math.floor(c / g.length), v = g[c % g.length] + b * 0.18, p = o + 1 + b * 2.6;
1575
+ gt(Math.cos(v), Math.sin(v), m.out), gt(Math.cos(v) * p, Math.sin(v) * p, m.target);
1576
+ const A = m.backends.size;
1577
+ let M = 0;
1578
+ for (const O of m.backends.values()) {
1579
+ O.k = M, O.n = A;
1580
+ const C = p + 3.2, x = v + (M - (A - 1) / 2) * (2.1 / C);
1581
+ gt(Math.cos(x) * C, Math.sin(x) * C, O.target), M++;
1582
+ }
1583
+ }
1584
+ } else {
1585
+ const o = D.aspect >= 0.85;
1586
+ d && (o ? gt(-(n + r + i), 0, l.target) : gt(0, -(s + r + i), l.target)), ns.length = 0, ss.length = 0;
1587
+ for (let g = 0; g < u.length; g++)
1588
+ ((d ? g < Math.max(3, Math.ceil(u.length * 0.6)) : g % 2 === 0) ? ss : ns).push(u[g]);
1589
+ Gr(ss, 1, n + r, 0), Gr(ns, -1, n + r, d && o ? i * 2 + 3.5 : 0);
1590
+ }
1591
+ d && l.target.lengthSq() > 1e-6 && l.out.copy(l.target).normalize();
1592
+ }
1593
+ const fl = [], ns = [], ss = [], pl = (t, e) => t.srv.slot - e.srv.slot, ca = Math.PI / 180, hl = [0, 35, -35, 70, -70, 110, -110, 145, -145].map((t) => t * ca), ml = [0, 180, 35, -145, -35, 145, 70, -110, -70, 110].map((t) => t * ca);
1594
+ function Gr(t, e, n, s) {
1595
+ if (!t.length) return;
1596
+ const a = be, r = (i) => Math.max(3, i.backends.size * 2.1 + 0.6) * a, l = s > 0 ? Math.ceil(t.length / 2) : t.length;
1597
+ let d = 0;
1598
+ if (s > 0) {
1599
+ d = s / 2;
1600
+ for (let i = 0; i < l; i++) d += r(t[i]);
1601
+ } else for (const i of t) d += r(i) / 2;
1602
+ for (let i = 0; i < t.length; i++) {
1603
+ s > 0 && i === l && (d = -s / 2);
1604
+ const u = t[i], o = r(u), g = d - o / 2;
1605
+ gt(e, 0, u.out), gt(e * (n + 1), g, u.target);
1606
+ const c = u.backends.size;
1607
+ let m = 0;
1608
+ for (const b of u.backends.values())
1609
+ b.k = m, b.n = c, gt(e * (n + 1 + 3.6), g + ((c - 1) / 2 - m) * 2.1 * a, b.target), m++;
1610
+ d -= o;
1611
+ }
1612
+ }
1613
+ function gl(t = performance.now()) {
1614
+ const e = es < 0 ? 0.016 : Math.min(0.1, (t - es) / 1e3);
1615
+ if (es = t, !k.clusterPos.length)
1616
+ for (let c = 0; c < ht; c++)
1617
+ k.clusterPos.push(new y.Vector3()), k.clusterTarget.push(new y.Vector3()), k.clusterFresh.push(!0);
1618
+ Qc(), Yc(), Es++;
1619
+ let n = 0, s = 0;
1620
+ for (const c of k.agents.values())
1621
+ n += c.inst.subagent ? 0.5 : 1, c.inst.exitAt || s++;
1622
+ let a = 0;
1623
+ if (F.grouped)
1624
+ for (let c = 0; c < ht; c++) Os(c).active && a++;
1625
+ let r = 0;
1626
+ for (const c of k.mcp.values()) c.wanted && r++;
1627
+ oc(t, n + a * 1.5, k.agents.size + s * 1e3 + a * 1e6 + k.runs.size * 1e8 + r * 1e10 + (k.graphWanted ? 1e13 : 0));
1628
+ for (const c of k.agents.values()) c.scale = Jc(c) * D.scale;
1629
+ cl(), ul();
1630
+ for (const c of k.agents.values()) ll(c.run, c.u, c.v, c.target);
1631
+ dl();
1632
+ const l = Bc(e, 0.2);
1633
+ for (const c of k.runs.values())
1634
+ c.fresh ? (c.origin.copy(c.target), c.angle = c.targetAngle, c.cu = c.tcu, c.cv = c.tcv, c.fresh = !1) : (c.origin.lerp(c.target, l), c.angle = Hc(c.angle, c.targetAngle, l), c.cu += (c.tcu - c.cu) * l, c.cv += (c.tcv - c.cv) * l), Ys(c.angle, c.axis, c.side);
1635
+ for (const c of k.agents.values()) {
1636
+ c.fresh ? (c.eu = c.u, c.ev = c.v, c.fresh = !1) : (c.eu += (c.u - c.eu) * l, c.ev += (c.v - c.ev) * l);
1637
+ const m = c.run;
1638
+ c.pos.copy(m.origin).addScaledVector(m.side, c.eu - m.cu).addScaledVector(m.axis, c.ev - m.cv), c.live.copy(c.pos);
1639
+ const b = Us(c.inst) ? 1 : 0;
1640
+ c.dim = xt ? b : c.dim + (b - c.dim) * Math.min(1, e / Xc);
1641
+ }
1642
+ for (const c of ee)
1643
+ k.clusterFresh[c] ? (k.clusterPos[c].copy(k.clusterTarget[c]), k.clusterFresh[c] = !1) : k.clusterPos[c].lerp(k.clusterTarget[c], l);
1644
+ for (let c = 0; c < ht; c++) Os(c).active || (k.clusterFresh[c] = !0);
1645
+ const d = k.core;
1646
+ d.hw += (Math.max(2.5, d.thw) - d.hw) * l, d.hh += (Math.max(2.5, d.thh) - d.hh) * l, d.r = Math.max(d.hw, d.hh);
1647
+ const i = Math.min(1, e / yl);
1648
+ for (const c of k.mcp.values()) {
1649
+ c.fresh ? (c.pos.copy(c.target), c.fresh = !1) : c.pos.lerp(c.target, l), c.mix = c.wanted ? Math.min(1, c.mix + i) : Math.max(0, c.mix - i);
1650
+ for (const m of c.backends.values())
1651
+ m.fresh ? (m.pos.copy(m.target), m.fresh = !1) : m.pos.lerp(m.target, l), m.mix = c.wanted ? Math.min(1, m.mix + i) : Math.min(m.mix, c.mix);
1652
+ !c.wanted && c.mix <= 0 && (k.mcp.delete(c.name), k.mcpVersion++);
1653
+ }
1654
+ const u = k.graph, o = k.graphWanted && Je(t), g = o ? Hi(t) : 0;
1655
+ u.mix += (g - u.mix) * (o ? 1 : l), u.fresh || u.mix < 0.01 ? (u.pos.copy(u.target), u.fresh = !o) : u.pos.lerp(u.target, l), u.natural = vt.graphNatural, u.scale = u.radius / Math.max(1e-3, u.natural) * Math.max(1e-3, u.mix);
1656
+ }
1657
+ const vl = 46, Al = 18, yl = 0.9;
1658
+ function Ml(t, e, n = 0) {
1659
+ const s = k.plane === "xz" && n > 0;
1660
+ for (const r of k.agents.values()) {
1661
+ const l = r.depth === 1 && r.sibs >= Qs && r.kidsMax > 0 ? (r.foot - Fe) * D.spread : 0;
1662
+ t(r.target, e * r.scale + l);
1663
+ const d = e * r.scale * 1.3;
1664
+ gt(Ue(r.target), ne(r.target) - d - vl * D.wpp / D.foreshorten, zt), t(k.plane === "xz" ? zt.setY(r.target.y) : zt, 0), gt(Ue(r.target), ne(r.target) + d + Al * D.wpp / D.foreshorten, zt), t(k.plane === "xz" ? zt.setY(r.target.y) : zt, 0), s && t(zt.copy(r.target).setY(r.target.y + n * r.scale), e * r.scale * 0.6);
1665
+ }
1666
+ for (const r of ee) t(k.clusterTarget[r], 2.4);
1667
+ for (const r of k.runs.values()) {
1668
+ r.members || t(r.target, r.hu), Ys(r.targetAngle, Rn, Pn);
1669
+ const l = Math.abs(ne(Pn)) * r.hu + Math.abs(ne(Rn)) * r.hv;
1670
+ gt(Ue(r.target), ne(r.target) + l + 1.4, zt), t(zt, 1.2);
1671
+ }
1672
+ for (const r of k.mcp.values())
1673
+ if (r.wanted) {
1674
+ t(r.target, 1.7);
1675
+ for (const l of r.backends.values()) t(l.target, 1.4);
1676
+ }
1677
+ const a = k.graph;
1678
+ k.graphWanted && Je() && t(a.target, a.radius + 0.8);
1679
+ }
1680
+ const bl = "data:font/woff;base64,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", xl = "data:font/woff;base64,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", wl = { kitNoDim: !0 }, Wr = [1.2, 3.2], Fr = { sans: bl, mono: xl }, Ur = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~·›…—–ו", kl = [
1681
+ [32, 126],
1682
+ [160, 255],
1683
+ [305, 305],
1684
+ [338, 339],
1685
+ [699, 700],
1686
+ [710, 710],
1687
+ [730, 730],
1688
+ [732, 732],
1689
+ [8192, 8303],
1690
+ [8364, 8364],
1691
+ [8482, 8482],
1692
+ [8593, 8593],
1693
+ [8595, 8595],
1694
+ [8722, 8722],
1695
+ [8725, 8725]
1696
+ ], Sl = (t) => {
1697
+ for (const [e, n] of kl) if (t >= e && t <= n) return !0;
1698
+ return !1;
1699
+ }, Ol = { "▶": "›", "▸": "›", "→": "›", "⟶": "›", "←": "‹", "✓": "·", "✔": "·", "✕": "×", "✗": "×", "✖": "×", "⋯": "…" };
1700
+ function la(t) {
1701
+ let e = "";
1702
+ for (const n of t) {
1703
+ const s = Ol[n];
1704
+ s !== void 0 ? e += s : Sl(n.codePointAt(0)) && (e += n);
1705
+ }
1706
+ return e;
1707
+ }
1708
+ const rn = /* @__PURE__ */ new Map();
1709
+ function El(t) {
1710
+ const e = rn.get(t);
1711
+ if (e !== void 0) return e;
1712
+ const n = la(t).replace(/\s+/g, " ").replace(/^[\s·›]+|[\s·›]+$/g, "");
1713
+ return rn.size > 2e3 && rn.clear(), rn.set(t, n), n;
1714
+ }
1715
+ const Br = (t, e) => e > 0 && t.length > e ? t.slice(0, Math.max(1, e - 1)).trimEnd() + "…" : t, Hr = new y.PlaneGeometry(1, 1), on = () => {
1716
+ }, jr = {
1717
+ top: new y.MeshBasicMaterial({ color: 16777215, transparent: !0, depthTest: !1, depthWrite: !1, toneMapped: !1, fog: !1, side: y.DoubleSide }),
1718
+ depth: new y.MeshBasicMaterial({ color: 16777215, transparent: !0, depthTest: !0, depthWrite: !1, toneMapped: !1, fog: !1, side: y.DoubleSide })
1719
+ }, Tl = (
1720
+ /* glsl */
1721
+ `
1722
+ varying vec2 vUv;
1723
+ void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
1724
+ ), Cl = (
1725
+ /* glsl */
1726
+ `
1727
+ uniform vec2 uSize; uniform float uRadius; uniform float uBorder; uniform float uBar; uniform float uUnder;
1728
+ uniform vec3 uFill; uniform float uFillA; uniform vec3 uEdge; uniform float uEdgeA; uniform float uOpacity;
1729
+ varying vec2 vUv;
1730
+ 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; }
1731
+ void main() {
1732
+ vec2 p = (vUv - 0.5) * uSize;
1733
+ float d = sdBox(p, uSize * 0.5, uRadius);
1734
+ float aa = fwidth(d) * 0.75;
1735
+ float inside = 1.0 - smoothstep(-aa, aa, d);
1736
+ float ring = inside * smoothstep(-uBorder - aa, -uBorder + aa, d) * step(0.00001, uBorder);
1737
+ float bar = inside * (1.0 - smoothstep(-aa, aa, p.x + uSize.x * 0.5 - uBar)) * step(0.00001, uBar);
1738
+ float under = inside * (1.0 - smoothstep(-aa, aa, p.y + uSize.y * 0.5 - uUnder)) * step(0.00001, uUnder);
1739
+ float e = max(max(ring, bar), under);
1740
+ vec3 col = mix(uFill, uEdge, e);
1741
+ float a = max(inside * uFillA, e * uEdgeA) * uOpacity;
1742
+ if (a < 0.002) discard;
1743
+ gl_FragColor = vec4(col, a);
1744
+ }`
1745
+ ), Zr = {
1746
+ // border / bar / under in × font size; round in × plate height (0.5 = pill)
1747
+ pill: { fillA: 0.52, edgeA: 0.6, border: 0.055, bar: 0, under: 0, round: 0.5 },
1748
+ // a near-opaque dark pill with a bold accent border: short-lived callouts (decision labels) that must read on anything
1749
+ tag: { fillA: 0.86, edgeA: 0.95, border: 0.085, bar: 0, under: 0, round: 0.5 },
1750
+ box: { fillA: 0.62, edgeA: 0.55, border: 0.055, bar: 0, under: 0, round: 0.14 },
1751
+ bar: { fillA: 0.66, edgeA: 0.95, border: 0, bar: 0.14, under: 0, round: 0.06 },
1752
+ underline: { fillA: 0.52, edgeA: 0.8, border: 0, bar: 0, under: 0.07, round: 0.06 },
1753
+ none: { fillA: 0, edgeA: 0, border: 0, bar: 0, under: 0, round: 0 }
1754
+ }, ua = new y.Color("#03050b"), rs = new y.Color("#eef2f8"), Jr = new y.Color("#94a3b8");
1755
+ function an(t, e, n) {
1756
+ if (t == null) return { text: "", ranges: null, key: "" };
1757
+ if (typeof t == "string") {
1758
+ const l = El(e ? t.toUpperCase() : t);
1759
+ return { text: l, ranges: null, key: l };
1760
+ }
1761
+ let s = "", a = "";
1762
+ const r = {};
1763
+ for (const l of t) {
1764
+ let d = la(e ? l.text.toUpperCase() : l.text);
1765
+ if (s || (d = d.trimStart()), !d) continue;
1766
+ const i = l.color != null ? n.set(l.color).getHex() : -1;
1767
+ i >= 0 && (r[s.length] = i), a += `${d}${i}`, s += d;
1768
+ }
1769
+ return { text: s.trimEnd(), ranges: r, key: a };
1770
+ }
1771
+ function Jf(t, e, n = ["working…", "done"]) {
1772
+ const s = t.status !== "started";
1773
+ if (Ze(t)) return [{ text: Fs, color: os }];
1774
+ if (!t.hasSteps) return [{ text: s ? t.status === "failed" ? n[2] ?? "failed" : n[1] : n[0], color: e.base }];
1775
+ const a = [{ text: "hatchet · ", color: e.base }], { shown: r, more: l } = Lo(t);
1776
+ r.forEach((i, u) => {
1777
+ u && a.push({ text: " › ", color: e.base });
1778
+ const o = t.steps[i], g = o === "running" && !!t.waits[i];
1779
+ a.push({ text: i, color: g ? os : o === "running" ? e.current : o === "done" ? e.done : o === "failed" ? "#ff5d5d" : e.queued ?? Pl(e.base) });
1780
+ }), l && a.push({ text: ` +${l}`, color: e.base });
1781
+ const d = s ? null : Do(t);
1782
+ return d && a.push({ text: ` · ${we(d)}`, color: os }), a;
1783
+ }
1784
+ const os = "#f59e0b", Rl = new y.Color(), Pl = (t) => "#" + Rl.set(t).lerp(ua, 0.45).getHexString();
1785
+ function Xf({ prefix: t = "", suffix: e = "", ...n }) {
1786
+ const s = Ee();
1787
+ return /* @__PURE__ */ f(Lt, { declutter: "resource", ...n, text: t + s.graphLabel + e });
1788
+ }
1789
+ function Lt(t) {
1790
+ return /* @__PURE__ */ f(Xa, { fallback: null, children: /* @__PURE__ */ f(zl, { ...t }) });
1791
+ }
1792
+ const Vl = {
1793
+ color: "#818cf8",
1794
+ size: 0.24,
1795
+ opacity: 1,
1796
+ maxWidth: 0,
1797
+ anchorX: "center",
1798
+ anchorY: "middle",
1799
+ textAlign: "center",
1800
+ plate: "pill",
1801
+ font: "sans",
1802
+ uppercase: !1,
1803
+ letterSpacing: 0,
1804
+ depthTest: !1,
1805
+ depthFade: 0.22,
1806
+ fadeRange: [14, 80],
1807
+ renderOrder: 20,
1808
+ fadeMs: 0,
1809
+ pxRange: [7.5, 15],
1810
+ glow: 1,
1811
+ leader: !1,
1812
+ fit: !1
1813
+ };
1814
+ function zl(t) {
1815
+ var O, C;
1816
+ const e = { ...Vl, ...Il(t) }, n = U(e);
1817
+ n.current = e;
1818
+ const s = U(null), a = U(null), r = U(null), l = U(null), d = U(null), i = U(null), u = U(null), o = st(
1819
+ () => ({
1820
+ target: e.opacity,
1821
+ cur: e.opacity,
1822
+ emph: !1,
1823
+ accent: new y.Color(e.color),
1824
+ textCol: new y.Color(e.textColor ?? rs),
1825
+ subCol: new y.Color(e.secondaryColor ?? Jr),
1826
+ mainColor: new y.Color(),
1827
+ subColor: new y.Color(),
1828
+ tmp: new y.Color(),
1829
+ wp: new y.Vector3(),
1830
+ q: new y.Quaternion(),
1831
+ hasSub: !1,
1832
+ /** declutter: eased visibility factor, secondary line dropped, plate rects (billboard units) */
1833
+ dc: 1,
1834
+ subOff: !1,
1835
+ W: 0,
1836
+ H: 0,
1837
+ bx: 0,
1838
+ by: 0,
1839
+ W1: 0,
1840
+ H1: 0,
1841
+ bx1: 0,
1842
+ by1: 0,
1843
+ ndc: new y.Vector3(),
1844
+ on: !1,
1845
+ keyM: "\0",
1846
+ keyS: "\0"
1847
+ }),
1848
+ // eslint-disable-next-line react-hooks/exhaustive-deps
1849
+ []
1850
+ ), g = st(
1851
+ () => ({
1852
+ plate: new y.ShaderMaterial({
1853
+ vertexShader: Tl,
1854
+ fragmentShader: Cl,
1855
+ transparent: !0,
1856
+ depthWrite: !1,
1857
+ toneMapped: !1,
1858
+ uniforms: {
1859
+ uSize: { value: new y.Vector2(1, 1) },
1860
+ uRadius: { value: 0.1 },
1861
+ uBorder: { value: 0 },
1862
+ uBar: { value: 0 },
1863
+ uUnder: { value: 0 },
1864
+ uFill: { value: ua.clone() },
1865
+ uFillA: { value: 0.5 },
1866
+ uEdge: { value: new y.Color() },
1867
+ uEdgeA: { value: 0.5 },
1868
+ uOpacity: { value: 1 }
1869
+ }
1870
+ }),
1871
+ leader: new y.MeshBasicMaterial({ transparent: !0, depthWrite: !1, toneMapped: !1, fog: !1 })
1872
+ }),
1873
+ []
1874
+ );
1875
+ ot(() => () => (g.plate.dispose(), g.leader.dispose()), [g]), g.plate.depthTest = e.depthTest, g.leader.depthTest = e.depthTest;
1876
+ const c = st(() => {
1877
+ const x = () => n.current.secondarySize ?? n.current.size * 0.78, S = () => {
1878
+ const E = n.current;
1879
+ return E.maxWidth > 0 ? Math.max(4, Math.floor(E.maxWidth / (E.size * (E.font === "mono" ? 0.62 : 0.56) * (1 + E.letterSpacing)))) : 0;
1880
+ };
1881
+ return { applyColors: () => {
1882
+ const E = n.current, w = g.plate.uniforms, L = Zr[E.plate];
1883
+ w.uEdge.value.copy(o.accent).lerp(rs, o.emph ? 0.3 : 0), w.uEdgeA.value = Math.min(1, L.edgeA * (o.emph ? 1.45 : 1)), w.uFillA.value = L.fillA, g.leader.color.copy(o.accent).multiplyScalar(0.85);
1884
+ const W = E.glow * (o.emph ? 1.12 : 0.95);
1885
+ o.mainColor.copy(o.textCol).multiplyScalar(W), o.subColor.copy(o.subCol).multiplyScalar(W);
1886
+ }, layout: () => {
1887
+ var X, mt, it, Vt, sr;
1888
+ const E = i.current;
1889
+ if (!E || !l.current || !r.current) return;
1890
+ const w = n.current, L = w.size, W = (X = E.textRenderInfo) == null ? void 0 : X.blockBounds, G = o.hasSub ? (it = (mt = u.current) == null ? void 0 : mt.textRenderInfo) == null ? void 0 : it.blockBounds : void 0, $ = W && E.text ? W[2] - W[0] : 0, _ = G ? G[2] - G[0] : 0, et = L * 1.16, Q = Zr[w.plate], B = Q.bar * L, Y = w.plate === "none", H = Y ? 0 : L * 0.28, V = ((Vt = w.offset) == null ? void 0 : Vt[0]) ?? 0, I = ((sr = w.offset) == null ? void 0 : sr[1]) ?? 0;
1891
+ let nt = 0, at = 0, At = 0, Et = 0, ft = 0;
1892
+ for (let Ft = 0; Ft < 2; Ft++) {
1893
+ const Xe = Ft === 0 && o.hasSub, Ba = Y ? 0 : L * ((w.plate === "pill" || w.plate === "tag") && !Xe ? 0.6 : 0.5), rr = Xe ? Math.max($, _) : $, or = Xe ? x() * 1.2 : 0, ar = Xe ? L * 0.1 : 0, Re = rr + Ba * 2 + B, Pe = et + ar + or + H * 2, ir = V + (w.anchorX === "left" ? Re / 2 : w.anchorX === "right" ? -Re / 2 : 0), cr = I + (w.anchorY === "bottom" ? Pe / 2 : w.anchorY === "top" ? -Pe / 2 : 0);
1894
+ Ft === 0 ? (o.W = Re, o.H = Pe, o.bx = ir, o.by = cr) : (o.W1 = o.hasSub ? Re : 0, o.H1 = Pe, o.bx1 = ir, o.by1 = cr), Ft === 0 == !(o.hasSub && o.subOff) && (nt = Re, at = Pe, At = rr, Et = or, ft = ar);
1895
+ }
1896
+ const q = g.plate.uniforms;
1897
+ q.uSize.value.set(nt, at), q.uRadius.value = Math.min(at * Q.round, at * 0.5), q.uBorder.value = Q.border * L, q.uBar.value = B, q.uUnder.value = Q.under * L, l.current.scale.set(Math.max(nt, 1e-4), Math.max(at, 1e-4), 1), l.current.visible = !Y && At > 0;
1898
+ const Z = w.textAlign === "left" ? -At / 2 + B / 2 : w.textAlign === "right" ? At / 2 + B / 2 : B / 2, z = at / 2 - H - et / 2;
1899
+ E.position.set(Z, z, 1e-3), u.current && (u.current.position.set(Z, z - et / 2 - ft - Et / 2, 1e-3), u.current.visible = o.hasSub && !o.subOff), r.current.position.set(V + (w.anchorX === "left" ? nt / 2 : w.anchorX === "right" ? -nt / 2 : 0), I + (w.anchorY === "bottom" ? at / 2 : w.anchorY === "top" ? -at / 2 : 0), 0);
1900
+ const J = d.current;
1901
+ if (J) {
1902
+ const Ft = Math.hypot(V, I);
1903
+ J.visible = Ft > 1e-3, J.position.set(V / 2, I / 2, 0), J.rotation.z = Math.atan2(I, V), J.scale.set(Math.max(Ft, 1e-4), L * 0.05, 1);
1904
+ }
1905
+ }, setLines: (E, w) => {
1906
+ const L = i.current, W = u.current;
1907
+ if (!L) return;
1908
+ const G = n.current, $ = S(), _ = an(E, G.uppercase, o.tmp), et = an(w, G.uppercase, o.tmp), Q = `${_.key}|${$}`, B = `${et.key}|${$}`;
1909
+ if (Q !== o.keyM && (o.keyM = Q, L.text = Br(_.text, $), L.colorRanges = _.ranges, L.sync()), W && B !== o.keyS) {
1910
+ o.keyS = B;
1911
+ const Y = Br(et.text, $ ? Math.round($ * G.size / x()) : 0);
1912
+ o.hasSub = !!Y, W.visible = o.hasSub && !o.subOff, W.text = Y, W.colorRanges = et.ranges, W.sync();
1913
+ }
1914
+ } };
1915
+ }, [g, o]);
1916
+ ot(() => {
1917
+ const x = [i.current, u.current].filter(Boolean), S = () => c.layout();
1918
+ for (const N of x) N.addEventListener("synccomplete", S);
1919
+ return c.applyColors(), c.setLines(n.current.text, n.current.secondary), c.layout(), () => {
1920
+ for (const N of x) N.removeEventListener("synccomplete", S);
1921
+ };
1922
+ }, [c]);
1923
+ const m = an(e.text, e.uppercase, o.tmp).key, b = an(e.secondary, e.uppercase, o.tmp).key;
1924
+ ot(() => c.setLines(n.current.text, n.current.secondary), [c, m, b, e.uppercase, e.maxWidth, e.size]), ot(() => {
1925
+ o.accent.set(n.current.color), o.textCol.set(n.current.textColor ?? rs), o.subCol.set(n.current.secondaryColor ?? Jr), c.applyColors();
1926
+ }, [c, o, e.color, e.textColor, e.secondaryColor, e.glow, e.plate]), ot(() => void (o.target = e.opacity), [o, e.opacity]), ot(() => c.layout(), [c, e.size, e.plate, e.anchorX, e.anchorY, e.textAlign, (O = e.offset) == null ? void 0 : O[0], (C = e.offset) == null ? void 0 : C[1]]), Ka(
1927
+ e.ref,
1928
+ () => ({
1929
+ get object() {
1930
+ return s.current;
1931
+ },
1932
+ setOpacity(x, S = !1) {
1933
+ o.target = x, S && (o.cur = x);
1934
+ },
1935
+ setText(x, S) {
1936
+ c.setLines(x, S ?? null);
1937
+ },
1938
+ setColor(x) {
1939
+ o.tmp.set(x), o.tmp.equals(o.accent) || (o.accent.copy(o.tmp), c.applyColors());
1940
+ },
1941
+ setEmphasis(x) {
1942
+ x !== o.emph && (o.emph = x, c.applyColors());
1943
+ }
1944
+ }),
1945
+ [c, o]
1946
+ );
1947
+ const v = Oo(ue), p = st(
1948
+ () => e.declutter === !1 ? null : Zi(e.declutter ?? v.kind, v.agent, e.size),
1949
+ [e.declutter, v, e.size]
1950
+ );
1951
+ ot(() => {
1952
+ if (p)
1953
+ return Ji(p), () => Xi(p);
1954
+ }, [p]), dt(({ camera: x, size: S }, N) => {
1955
+ const T = s.current, P = a.current;
1956
+ if (!T || !P) return;
1957
+ const E = n.current;
1958
+ o.cur !== o.target && (E.fadeMs <= 0 ? o.cur = o.target : (o.cur += (o.target - o.cur) * Math.min(1, N * 1e3 / E.fadeMs), Math.abs(o.target - o.cur) < 4e-3 && (o.cur = o.target)));
1959
+ const w = p;
1960
+ if (w) {
1961
+ const H = j.active ? w.show : 1;
1962
+ o.dc += (H - o.dc) * Math.min(1, N / 0.12), Math.abs(H - o.dc) < 0.01 && (o.dc = H);
1963
+ const V = j.active ? w.subOff : !1;
1964
+ V !== o.subOff && o.hasSub && (o.subOff = V, c.layout()), w.live = !1;
1965
+ }
1966
+ if (w) {
1967
+ w.drawn = !1;
1968
+ const H = o.cur > 4e-3 && T.visible;
1969
+ H && !o.on && (w.born = performance.now(), w.kind === "decision" && (w.show = 1, o.dc = 1)), o.on = H;
1970
+ }
1971
+ if (o.cur <= 4e-3 || !T.visible) {
1972
+ P.visible = !1;
1973
+ return;
1974
+ }
1975
+ T.getWorldPosition(o.wp), T.getWorldQuaternion(o.q);
1976
+ const L = o.wp.distanceTo(x.position), W = E.fit ? D.label : 1;
1977
+ let G = W;
1978
+ const $ = x, _ = x, et = $.isPerspectiveCamera ? 2 * L * Math.tan(y.MathUtils.degToRad($.fov) / 2) / ($.zoom * S.height) : (_.top - _.bottom) / (_.zoom * S.height);
1979
+ if (E.pxRange) {
1980
+ const H = E.size * W / Math.max(et, 1e-6), V = j.pxk;
1981
+ G = y.MathUtils.clamp(H, E.pxRange[0] * V, E.pxRange[1] * V) / H * W;
1982
+ }
1983
+ if (w && j.due && Xr(T) && (o.ndc.copy(o.wp).project(x), o.ndc.z < 1 && o.ndc.z > -1)) {
1984
+ const H = G / Math.max(et, 1e-6), V = (o.ndc.x + 1) / 2 * S.width, I = (1 - o.ndc.y) / 2 * S.height;
1985
+ w.x = V + o.bx * H, w.y = I - o.by * H, w.w = o.W * H, w.h = o.H * H, w.x1 = V + o.bx1 * H, w.y1 = I - o.by1 * H, w.w1 = o.W1 * H, w.h1 = o.H1 * H, w.live = w.w > 1 && w.x + w.w / 2 > 0 && w.x - w.w / 2 < S.width && w.y + w.h / 2 > 0 && w.y - w.h / 2 < S.height, w.clip = w.x - w.w / 2 < -2 || w.x + w.w / 2 > S.width + 2 || w.y - w.h / 2 < -2 || w.y + w.h / 2 > S.height + 2, w.ax = o.wp.x, w.ay = o.wp.y, w.az = o.wp.z, w.ox0 = w.x - w.w / 2 - V, w.ox1 = w.x + w.w / 2 - V, w.oy0 = w.y - w.h / 2 - I, w.oy1 = w.y + w.h / 2 - I, w.w > 1 && (w.seen = performance.now());
1986
+ }
1987
+ const Q = v.agent, Y = y.MathUtils.smoothstep(L, Wr[0], Wr[1]) * o.cur * o.dc * (Q ? 1 - 0.55 * Q.dim : 1) * (1 - E.depthFade * y.MathUtils.smoothstep(L, E.fadeRange[0], E.fadeRange[1]));
1988
+ if (Y <= 4e-3) {
1989
+ P.visible = !1;
1990
+ return;
1991
+ }
1992
+ P.visible = !0, w && (w.drawn = Y > 0.05 && Xr(T.parent)), P.quaternion.copy(o.q.invert()).multiply(x.quaternion), P.scale.setScalar(G / (T.matrixWorld.getMaxScaleOnAxis() || 1)), g.plate.uniforms.uOpacity.value = Y, g.leader.opacity = Y * 0.65, i.current && (i.current.fillOpacity = Y), u.current && (u.current.fillOpacity = Y * 0.92);
1993
+ });
1994
+ const A = e.depthTest ? jr.depth : jr.top, M = !!e.onClick;
1995
+ return /* @__PURE__ */ f("group", { ref: s, position: e.position, visible: e.visible ?? !0, userData: wl, children: /* @__PURE__ */ R("group", { ref: a, visible: !1, children: [
1996
+ e.leader && /* @__PURE__ */ f("mesh", { ref: d, geometry: Hr, material: g.leader, renderOrder: e.renderOrder, raycast: on }),
1997
+ /* @__PURE__ */ R("group", { ref: r, children: [
1998
+ /* @__PURE__ */ f(
1999
+ "mesh",
2000
+ {
2001
+ ref: l,
2002
+ geometry: Hr,
2003
+ material: g.plate,
2004
+ renderOrder: e.renderOrder,
2005
+ raycast: M ? y.Mesh.prototype.raycast : on,
2006
+ onClick: e.onClick,
2007
+ onPointerOver: M ? () => {
2008
+ var x;
2009
+ return document.body.style.cursor = "pointer", (x = e.onHover) == null ? void 0 : x.call(e, !0);
2010
+ } : void 0,
2011
+ onPointerOut: M ? () => {
2012
+ var x;
2013
+ return document.body.style.cursor = "", (x = e.onHover) == null ? void 0 : x.call(e, !1);
2014
+ } : void 0
2015
+ }
2016
+ ),
2017
+ /* @__PURE__ */ f(
2018
+ lr,
2019
+ {
2020
+ ref: i,
2021
+ font: Fr[e.font],
2022
+ characters: Ur,
2023
+ fontSize: e.size,
2024
+ letterSpacing: e.letterSpacing,
2025
+ anchorX: e.textAlign,
2026
+ anchorY: "middle",
2027
+ material: A,
2028
+ renderOrder: e.renderOrder + 1,
2029
+ raycast: on,
2030
+ color: o.mainColor,
2031
+ children: ""
2032
+ }
2033
+ ),
2034
+ /* @__PURE__ */ f(
2035
+ lr,
2036
+ {
2037
+ ref: u,
2038
+ font: Fr[e.font],
2039
+ characters: Ur,
2040
+ fontSize: e.secondarySize ?? e.size * 0.78,
2041
+ letterSpacing: e.letterSpacing,
2042
+ anchorX: e.textAlign,
2043
+ anchorY: "middle",
2044
+ material: A,
2045
+ renderOrder: e.renderOrder + 1,
2046
+ raycast: on,
2047
+ color: o.subColor,
2048
+ visible: !1,
2049
+ children: ""
2050
+ }
2051
+ ),
2052
+ e.children
2053
+ ] })
2054
+ ] }) });
2055
+ }
2056
+ function Xr(t) {
2057
+ for (; t; t = t.parent) if (!t.visible) return !1;
2058
+ return !0;
2059
+ }
2060
+ function Il(t) {
2061
+ const e = {};
2062
+ for (const n in t) t[n] !== void 0 && (e[n] = t[n]);
2063
+ return e;
2064
+ }
2065
+ const me = "#5eead4", _s = "#4ade80", ie = "#fb3b5c", Nl = "#fbbf24", Be = "#f1fffd", oe = "#9fc4bf", ql = "#a7b8b6", Dl = "#c4b5fd", ct = 3, Ll = 1.3, as = 0.2, Ct = 5, Ts = 0.8, Xt = (t) => 1 + 0.45 * t, xe = (t) => 0.45 + 0.3 * t, Kr = [3, 4.4, 1.6, 1.7, 2.1, 1.2], Gl = 36, Wl = 55, Qr = [0.7, 2.7], Fl = 1400, cn = { until: 0, d: null }, Ul = 3, qe = [];
2066
+ function Bl(t, e, n) {
2067
+ for (let s = qe.length - 1; s >= 0; s--) {
2068
+ const a = qe[s];
2069
+ (a.cut || e - a.at >= Un(a)) && qe.splice(s, 1);
2070
+ }
2071
+ return !n && qe.length >= Ul ? !1 : (qe.push(t), !0);
2072
+ }
2073
+ const da = 1, Hl = da + 1, is = { size: 0.46, px: [17, 22] }, ln = { size: 0.34, px: [14, 17] }, De = { size: 0.26, px: [11.5, 13.5] }, cs = 1100, jl = 190, Zl = 95, Jl = new y.PlaneGeometry(2, 2), Xl = new y.PlaneGeometry(1, 1), Yr = () => {
2074
+ }, Kl = (
2075
+ /* glsl */
2076
+ `
2077
+ uniform float uQ;
2078
+ varying vec2 vP;
2079
+ void main() { vP = position.xy * uQ; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
2080
+ ), Ql = (
2081
+ /* glsl */
2082
+ `
2083
+ uniform float uKind; uniform float uA; uniform float uS; uniform float uF; uniform float uR0; uniform float uT; uniform float uM;
2084
+ uniform float uOpt[${Ct}]; uniform float uN; uniform float uWin; uniform float uStep; uniform float uRay;
2085
+ uniform float uLevel; uniform float uShock;
2086
+ uniform vec3 uColor; uniform vec3 uCore;
2087
+ varying vec2 vP;
2088
+ const float PI = 3.14159265;
2089
+ float band(float d, float w, float aa) { return 1.0 - smoothstep(w, w + aa, abs(d)); }
2090
+ float adiff(float a, float b) { float d = a - b; return atan(sin(d), cos(d)); }
2091
+ float sdSeg(vec2 p, vec2 a, vec2 b) { vec2 pa = p - a, ba = b - a; float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0); return length(pa - ba * h); }
2092
+ void main() {
2093
+ vec2 p = vP;
2094
+ float r = length(p);
2095
+ float aa = max(fwidth(r), 1e-4) * 1.3;
2096
+ float ang = atan(p.y, p.x);
2097
+ float r0 = uR0;
2098
+ float line = 0.0, core = 0.0, dimv = 0.0;
2099
+ if (uKind < 0.5) {
2100
+ // choice: option rays fanned out to the right, highest p on top; winner long, thick, bright, pulsing outward
2101
+ float n = max(uN, 1.0);
2102
+ float rs = r0 * ${Ts.toFixed(2)};
2103
+ for (int i = 0; i < ${Ct}; i++) {
2104
+ float fi = float(i);
2105
+ if (fi >= n) break;
2106
+ float a = ((n - 1.0) * 0.5 - fi) * uStep;
2107
+ float po = uOpt[i];
2108
+ bool win = abs(fi - uWin) < 0.5;
2109
+ float L = (win ? ${Xt(0).toFixed(2)} + ${(Xt(1) - Xt(0)).toFixed(2)} * po : ${xe(0).toFixed(2)} + ${(xe(1) - xe(0)).toFixed(2)} * po) * uS * uRay;
2110
+ float da = adiff(ang, a);
2111
+ float along = r * cos(da);
2112
+ float perp = abs(r * sin(da));
2113
+ float fwd = step(0.0, cos(da));
2114
+ float inSeg = step(rs, along) * (1.0 - smoothstep(rs + L, rs + L + aa, along)) * fwd;
2115
+ vec2 tip = vec2(cos(a), sin(a)) * (rs + L);
2116
+ float dt = length(p - tip);
2117
+ if (win) {
2118
+ float w = 0.034 + 0.03 * po;
2119
+ float v = band(perp, w, aa) * inSeg;
2120
+ float tr = 0.075;
2121
+ float tipv = 1.0 - smoothstep(tr, tr + aa, dt);
2122
+ // two pulses travel out along the winner ray after the snap
2123
+ float tp = (uT - 0.12) / 0.55;
2124
+ float ph = fract(tp);
2125
+ float pulseOn = step(0.0, tp) * step(tp, 2.0) * uM;
2126
+ float dpl = along - (rs + L * ph);
2127
+ float pulse = exp(-dpl * dpl * 260.0) * band(perp, w * 2.6, aa) * fwd * step(rs, along) * pulseOn;
2128
+ line += v * 1.35 + tipv + pulse + band(dt - tr * 2.0, 0.014, aa) * 0.8;
2129
+ core += band(perp, w * 0.3, aa) * inSeg * 0.35 + tipv * 0.8 + pulse * 1.6 + exp(-dt * 12.0) * 0.7 * uF;
2130
+ } else {
2131
+ float v = band(perp, 0.011, aa) * inSeg;
2132
+ float tipv = 1.0 - smoothstep(0.035, 0.035 + aa, dt);
2133
+ dimv += v + tipv;
2134
+ }
2135
+ }
2136
+ } else if (uKind < 1.5) {
2137
+ // guard deny: a shut red ring, a big red X over the agent, a shockwave out of it
2138
+ float s = r0 * 0.92 * (0.82 + 0.18 * uS);
2139
+ vec2 q = abs(p);
2140
+ float dx = abs(q.x - q.y) * 0.7071;
2141
+ float x = band(dx, 0.1, aa) * (1.0 - smoothstep(s, s + aa, max(q.x, q.y)));
2142
+ line += x * uS * 1.3;
2143
+ core += band(dx, 0.035, aa) * (1.0 - smoothstep(s, s + aa, max(q.x, q.y))) * uS * 0.9;
2144
+ line += band(r - r0 * 1.05, 0.05, aa) * uS;
2145
+ core += band(r - r0 * 1.05, 0.015, aa) * uS * 0.6;
2146
+ for (int k = 0; k < 2; k++) {
2147
+ float tk = uT - 0.05 - float(k) * 0.2;
2148
+ if (tk > 0.0 && tk < 1.1 && uM > 0.5) {
2149
+ float e = 1.0 - pow(1.0 - tk / 1.1, 3.0);
2150
+ float rr = r0 * 1.05 + uShock * e;
2151
+ float ww = 0.09 * (1.0 - e) + 0.012;
2152
+ float fa = (1.0 - tk / 1.1) * (k == 0 ? 1.0 : 0.55);
2153
+ line += band(r - rr, ww, aa) * fa * 1.5;
2154
+ core += band(r - rr, ww * 0.35, aa) * fa;
2155
+ }
2156
+ }
2157
+ core += exp(-r * 2.2) * uF * 0.9;
2158
+ } else if (uKind > 4.5) {
2159
+ // compact deny (another deny is playing): a small red X badge at the agent's upper right, a thin ring round it
2160
+ vec2 c = vec2(0.72, 0.72) * r0;
2161
+ vec2 q = p - c;
2162
+ float s = 0.15 * (0.7 + 0.3 * uS);
2163
+ vec2 qa = abs(q);
2164
+ float x = band(abs(qa.x - qa.y) * 0.7071, 0.032, aa) * (1.0 - smoothstep(s, s + aa, max(qa.x, qa.y)));
2165
+ float o = band(length(q) - s * 1.55, 0.02, aa);
2166
+ line += (x * 1.2 + o * 0.7) * uS;
2167
+ core += x * 0.5 * uS + exp(-length(q) * 9.0) * uF * 0.6;
2168
+ } else if (uKind < 2.5) {
2169
+ // guard allow: a small green tick at the agent's upper left
2170
+ vec2 c = vec2(-0.72, 0.72) * r0;
2171
+ vec2 q = (p - c) / 0.2;
2172
+ float d = min(sdSeg(q, vec2(-0.5, 0.02), vec2(-0.12, -0.36)), sdSeg(q, vec2(-0.12, -0.36), vec2(0.55, 0.42))) * 0.2;
2173
+ float t = 1.0 - smoothstep(0.022, 0.022 + aa, d);
2174
+ line += t * uS * 0.9;
2175
+ core += t * uS * 0.3;
2176
+ } else if (uKind < 3.5) {
2177
+ // check: a progress ring filling clockwise from 12 o'clock to the result's p, head dot at the fill
2178
+ float rr = r0 + 0.06;
2179
+ float t = mod(PI * 0.5 - ang + 2.0 * PI, 2.0 * PI) / (2.0 * PI);
2180
+ float fillTo = uLevel * uS;
2181
+ float on = step(t, fillTo);
2182
+ line += band(r - rr, 0.012, aa) * 0.3;
2183
+ line += band(r - rr, 0.05, aa) * on;
2184
+ core += band(r - rr, 0.016, aa) * on * 0.6;
2185
+ float ha = PI * 0.5 - fillTo * 2.0 * PI;
2186
+ float dh = length(p - vec2(cos(ha), sin(ha)) * rr);
2187
+ line += (1.0 - smoothstep(0.075, 0.075 + aa, dh));
2188
+ core += exp(-dh * 14.0) * (0.5 + uF);
2189
+ } else {
2190
+ // score: gauge under the agent (outside a skill sigil's rings), lower left (a0) round to lower right (a1)
2191
+ r0 += 0.32;
2192
+ float a0 = PI * 1.15;
2193
+ float a1 = PI * 1.85;
2194
+ float t = clamp((mod(ang + 2.0 * PI, 2.0 * PI) - a0) / (a1 - a0), -1.0, 2.0);
2195
+ float inArc = step(0.0, t) * step(t, 1.0);
2196
+ float fillTo = uLevel * uS;
2197
+ line += band(r - r0, 0.016, aa) * inArc * 0.4;
2198
+ line += band(r - r0, 0.055, aa) * inArc * step(t, fillTo);
2199
+ core += band(r - r0, 0.016, aa) * inArc * step(t, fillTo) * 0.35;
2200
+ float tt = t * 4.0;
2201
+ float tick = band((tt - floor(tt + 0.5)) * (a1 - a0) * r / 4.0, 0.013, aa) * inArc;
2202
+ line += tick * step(r0 - 0.16, r) * (1.0 - smoothstep(r0 - 0.07, r0 - 0.07 + aa, r)) * 0.7;
2203
+ float na = a0 + (a1 - a0) * fillTo;
2204
+ float dn = abs(adiff(ang, na)) * r;
2205
+ float needle = band(dn, 0.026, aa) * step(r0 - 0.22, r) * (1.0 - smoothstep(r0 + 0.14, r0 + 0.14 + aa, r));
2206
+ line += needle;
2207
+ core += needle * 0.8 + exp(-length(p - vec2(cos(na), sin(na)) * r0) * 14.0) * uF * 0.9;
2208
+ }
2209
+ float bright = (line + core * 0.5) * uA;
2210
+ float dim = dimv * 0.38 * uA;
2211
+ if (bright + dim < 0.003) discard;
2212
+ vec3 col = mix(uColor, uCore, clamp(core, 0.0, 1.0));
2213
+ gl_FragColor = vec4(col * bright + uColor * 0.8 * dim, 1.0);
2214
+ }`
2215
+ ), Yl = (
2216
+ /* glsl */
2217
+ `
2218
+ uniform float uA; uniform float uT; uniform vec3 uColor;
2219
+ varying vec2 vUv;
2220
+ void main() {
2221
+ float y = abs(vUv.y - 0.5) * 2.0;
2222
+ float body = 1.0 - smoothstep(0.25, 1.0, y);
2223
+ float x = vUv.x;
2224
+ float head = exp(-pow((x - fract(uT * 1.6)) * 9.0, 2.0));
2225
+ float flick = 0.75 + 0.25 * sin(uT * 38.0);
2226
+ float a = (body * 0.7 * flick + head * body * 1.2) * uA;
2227
+ if (a < 0.003) discard;
2228
+ gl_FragColor = vec4(mix(uColor, vec3(1.0, 0.85, 0.88), head * 0.6) * a, 1.0);
2229
+ }`
2230
+ ), _l = (
2231
+ /* glsl */
2232
+ `
2233
+ varying vec2 vUv;
2234
+ void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
2235
+ );
2236
+ function $l({ agent: t, radius: e, height: n }) {
2237
+ const [s, a] = ut(() => t.inst.decisions.length > 0);
2238
+ return dt(() => {
2239
+ !s && t.inst.decisions.length > 0 && a(!0);
2240
+ }), s ? /* @__PURE__ */ f(au, { agent: t, radius: e, height: n }) : null;
2241
+ }
2242
+ const tu = (t) => t.kind === "noul" && t.purpose === "guard", fa = (t) => t.kind === "choice" ? 0 : t.kind === "score" ? 4 : tu(t) ? t.result === "no" ? 1 : 2 : 3, $s = (t) => t.kind === "noul" ? t.result === "no" ? ie : (t.p ?? 1) < 0.6 ? Nl : _s : me, ye = (t) => t === void 0 ? "" : `${Math.round(t * 100)}%`, eu = (t) => t < 10 ? `${Math.round(t * 10) / 10} ms` : `${Math.round(t)} ms`, Cs = (t, e = 16) => t.length > e ? t.slice(0, e - 1) + "…" : t;
2243
+ function pa(t) {
2244
+ const e = t.map((r) => r.replace(/^.*[:/]/, "") || r), n = e.map((r) => r.split("-"));
2245
+ let s = 0;
2246
+ if (e.length > 1) for (; n.every((r) => r.length > s + 1 && r[s] === n[0][s]); ) s++;
2247
+ let a = n.map((r) => r.slice(s).join("-"));
2248
+ return new Set(a).size !== a.length && (a = e), a.map((r) => Cs(r));
2249
+ }
2250
+ const ls = (t) => t.length <= 22 ? t : t.split(/\s+/).slice(0, 2).join(" ").replace(/\?*$/, "?");
2251
+ function nu(t) {
2252
+ const e = $s(t), n = fa(t);
2253
+ if (n === 1) return [{ text: "BLOCKED ", color: ie }, { text: Cs(t.target || t.question, 22), color: Be }, { text: ` · ${ye(t.p)}`, color: ie }];
2254
+ if (n === 2) return [{ text: "allow ", color: _s }, { text: `${Cs(t.target || t.question, 20)} ${ye(t.p)}`, color: oe }];
2255
+ if (n === 3) return [{ text: `${ls(t.question)} `, color: oe }, { text: `${t.result} ${ye(t.p)}`, color: e }];
2256
+ if (n === 0) {
2257
+ const s = t.target && t.target !== t.result ? pa([t.target])[0] : t.result;
2258
+ return [{ text: `${t.purpose || ls(t.question)} › `, color: oe }, { text: s, color: e }];
2259
+ }
2260
+ return [{ text: `${ls(t.question)} › `, color: oe }, { text: t.result, color: e }, { text: ` ${ye(t.p)}`, color: Be }];
2261
+ }
2262
+ const su = (t) => [{ text: He(t.provider), color: Dl }, { text: ` · ${wn(t.kind)} · ${t.purpose || ""}${t.purpose ? " · " : ""}${eu(t.ms)}`, color: oe }];
2263
+ function ru(t) {
2264
+ const e = Number(t.result), n = (t.options ?? []).map((a) => Number(a.name)).filter((a) => Number.isFinite(a));
2265
+ if (Number.isFinite(e)) {
2266
+ const a = n.length > 1 ? Math.min(...n, e) : Math.min(1, e), r = n.length > 1 ? Math.max(...n, e) : Math.max(5, e);
2267
+ return r > a ? (e - a) / (r - a) : 1;
2268
+ }
2269
+ const s = /^(very )?(low|poor|bad)/i.test(t.result) ? 0.2 : /^(high|good|great|excellent)/i.test(t.result) ? 0.9 : /^(med|mid|ok|fair)/i.test(t.result) ? 0.55 : -1;
2270
+ return s >= 0 ? s : t.p ?? 0.5;
2271
+ }
2272
+ function ou(t, e) {
2273
+ const n = t.target || "";
2274
+ return h.mcpTools.get(n) ?? (k.mcp.has(n) ? n : e.inst.lastMcp ?? "");
2275
+ }
2276
+ const us = new y.Vector3(), _r = new y.Vector3(), Bt = new y.Vector3(), te = new y.Vector3(), ds = new y.Vector3(), $r = new y.Vector3(), to = new y.Vector3(), eo = new y.Matrix4();
2277
+ function au({ agent: t, radius: e, height: n }) {
2278
+ const s = U([]), a = U([]), r = U([]), l = U([]), d = U([]), i = U(null), u = U([]), o = st(
2279
+ () => ({
2280
+ slots: Array.from({ length: ct }, () => ({ d: null, mix: 0, kind: 0, server: "" })),
2281
+ extra: 0,
2282
+ shownExtra: -1,
2283
+ extraMix: 0,
2284
+ /** slot whose options the ray labels show (-1 none), option count, winner, angular step, ray tip y (scratch) */
2285
+ optSlot: -1,
2286
+ optN: 0,
2287
+ optWin: 0,
2288
+ optP: new Array(Ct).fill(0),
2289
+ ys: new Array(Ct).fill(0),
2290
+ small: Array.from({ length: ct }, () => !1),
2291
+ /** compact deny: no label line */
2292
+ quiet: Array.from({ length: ct }, () => !1)
2293
+ }),
2294
+ []
2295
+ ), g = st(
2296
+ () => Array.from(
2297
+ { length: ct },
2298
+ () => new y.ShaderMaterial({
2299
+ vertexShader: Kl,
2300
+ fragmentShader: Ql,
2301
+ transparent: !0,
2302
+ depthTest: !1,
2303
+ depthWrite: !1,
2304
+ blending: y.AdditiveBlending,
2305
+ toneMapped: !1,
2306
+ uniforms: {
2307
+ uQ: { value: 2 },
2308
+ uKind: { value: 0 },
2309
+ uA: { value: 0 },
2310
+ uS: { value: 0 },
2311
+ uF: { value: 0 },
2312
+ uT: { value: 0 },
2313
+ uM: { value: xt ? 0 : 1 },
2314
+ uR0: { value: 1 },
2315
+ uOpt: { value: new Array(Ct).fill(0) },
2316
+ uN: { value: 1 },
2317
+ uWin: { value: 0 },
2318
+ uStep: { value: 0.3 },
2319
+ uRay: { value: 1 },
2320
+ uLevel: { value: 0.5 },
2321
+ uShock: { value: 2.7 },
2322
+ uColor: { value: new y.Color(me) },
2323
+ uCore: { value: new y.Color("#ffffff") }
2324
+ }
2325
+ })
2326
+ ),
2327
+ []
2328
+ ), c = st(
2329
+ () => new y.ShaderMaterial({
2330
+ vertexShader: _l,
2331
+ fragmentShader: Yl,
2332
+ transparent: !0,
2333
+ depthTest: !1,
2334
+ depthWrite: !1,
2335
+ blending: y.AdditiveBlending,
2336
+ toneMapped: !1,
2337
+ side: y.DoubleSide,
2338
+ uniforms: { uA: { value: 0 }, uT: { value: 0 }, uColor: { value: new y.Color(ie) } }
2339
+ }),
2340
+ []
2341
+ );
2342
+ ot(() => () => (g.forEach((b) => b.dispose()), c.dispose()), [g, c]);
2343
+ const m = (b, v, p) => {
2344
+ var E;
2345
+ const A = o.slots[b], M = g[b].uniforms;
2346
+ let O = fa(v);
2347
+ if (O === 1)
2348
+ if (p < cn.until && cn.d !== v) {
2349
+ O = 5;
2350
+ const w = t.inst.hv;
2351
+ w && (w.bump = p, w.bumpDeny = !0);
2352
+ } else cn.until = p + Fl, cn.d = v;
2353
+ o.quiet[b] = O === 5 || !Bl(v, p, O === 1), A.kind = O, A.server = O === 1 ? ou(v, t) : "", M.uKind.value = O;
2354
+ const C = M.uOpt.value, x = (v.options ?? []).slice(0, Ct);
2355
+ for (let w = 0; w < Ct; w++) C[w] = w < x.length ? x[w].p : 0;
2356
+ x.length || (C[0] = v.p ?? 1), M.uN.value = Math.max(1, x.length);
2357
+ const S = x.findIndex((w) => w.name === v.result);
2358
+ M.uWin.value = S >= 0 ? S : 0, M.uLevel.value = Math.min(1, Math.max(0.04, O === 3 ? v.p ?? 1 : ru(v)));
2359
+ const N = $s(v);
2360
+ M.uColor.value.set(N), M.uCore.value.set(O === 1 ? "#ffd6dd" : "#f2fffd");
2361
+ const T = O === 2;
2362
+ o.small[b] = T;
2363
+ const P = T ? u.current[b] : r.current[b];
2364
+ if (P == null || P.setText(nu(v), T ? null : su(v)), P == null || P.setColor(N), P == null || P.setEmphasis(O === 1), (E = T ? r.current[b] : u.current[b]) == null || E.setOpacity(0, !0), o.quiet[b] && (P == null || P.setOpacity(0, !0)), O === 0 && x.length && !v.hv) {
2365
+ o.optSlot = b, o.optN = x.length, o.optWin = S >= 0 ? S : 0;
2366
+ const w = pa(x.map((L) => L.name));
2367
+ for (let L = 0; L < Ct; L++) {
2368
+ const W = d.current[L];
2369
+ if (!W || (o.optP[L] = L < x.length ? x[L].p : 0, L >= x.length)) continue;
2370
+ const G = L === o.optWin;
2371
+ W.setText(G ? [{ text: w[L], color: Be }, { text: ` ${ye(x[L].p)}`, color: me }] : [{ text: `${w[L]} ${ye(x[L].p)}`, color: ql }]), W.setColor(G ? me : "#3b4a4a"), W.setEmphasis(G);
2372
+ }
2373
+ } else o.optSlot === b && (o.optSlot = -1);
2374
+ };
2375
+ return dt(({ camera: b, size: v }) => {
2376
+ var at, At, Et, ft;
2377
+ const p = performance.now(), A = t.inst, M = Te(A, p) * (1 - 0.4 * t.dim);
2378
+ for (let q = 0; q < ct; q++) {
2379
+ const Z = o.slots[q];
2380
+ Z.d && (p - Z.d.at >= Un(Z.d) || Z.d.cut && p - Z.d.cut > 160) && (Z.d = null, Z.mix = 0, o.optSlot === q && (o.optSlot = -1));
2381
+ }
2382
+ o.extra = 0;
2383
+ const O = Gs(A, p) ? 1 : ct;
2384
+ let C = 0;
2385
+ for (let q = 0; q < ct; q++) o.slots[q].d && C++;
2386
+ for (let q = 0; q < A.decisions.length; q++) {
2387
+ const Z = A.decisions[q];
2388
+ if (dr(Z, p) <= 0) continue;
2389
+ let z = !1, J = -1;
2390
+ for (let X = 0; X < ct; X++)
2391
+ o.slots[X].d === Z ? z = !0 : J < 0 && !o.slots[X].d && C < O && (J = X);
2392
+ z || (J >= 0 ? (o.slots[J].d = Z, C++, m(J, Z, p)) : o.extra++);
2393
+ }
2394
+ let x = !1;
2395
+ for (let q = 0; q < ct; q++) o.slots[q].d && !o.quiet[q] && (x = !0);
2396
+ o.extraMix += ((o.extra > 0 && x ? 1 : 0) - o.extraMix) * 0.25, o.extra > 0 && o.extra !== o.shownExtra && (o.shownExtra = o.extra, (at = r.current[ct]) == null || at.setText(O === 1 ? `+${o.extra}` : `+${o.extra} more`));
2397
+ const S = t.scale;
2398
+ us.set(0, 1, 0).applyQuaternion(b.quaternion), _r.set(1, 0, 0).applyQuaternion(b.quaternion);
2399
+ const N = b;
2400
+ Bt.copy(t.live), k.plane === "xz" && (Bt.y += n * S * 0.5);
2401
+ const T = Bt.distanceTo(b.position) || 1, P = N.isPerspectiveCamera ? 2 * T * Math.tan(y.MathUtils.degToRad(N.fov) / 2) / (N.zoom * v.height) : 0.01, E = Math.min(Math.max(e, n * 0.55) * S * Ll, Gl * P * j.pxk), w = y.MathUtils.clamp(Wl * P * j.pxk / E, Qr[0], Qr[1]), L = (q, Z) => y.MathUtils.clamp(q * D.label / Math.max(P, 1e-6), Z[0] * j.pxk, Z[1] * j.pxk), W = (L(ln.size, ln.px) * 1.8 + 12) * P, G = y.MathUtils.clamp(jl * P / (E * Xt(1)), Zl * P / (E * Xt(0)), 1), $ = y.MathUtils.clamp(W / (E * (Ts + xe(0) * G)), 0.22, 0.55);
2402
+ let _ = !1, et = 0, Q = 0, B = null;
2403
+ for (let q = 0; q < ct; q++) {
2404
+ const Z = s.current[q], z = o.slots[q];
2405
+ if (!Z) continue;
2406
+ z.mix = z.d ? dr(z.d, p) : 0;
2407
+ const J = z.mix * M;
2408
+ if (Z.visible = J > 3e-3, !Z.visible || !z.d) continue;
2409
+ _ = !0;
2410
+ const X = p - z.d.at, mt = Math.min(1, X / se), it = g[q].uniforms;
2411
+ it.uA.value = J * (z.kind === 2 ? 0.75 : 1), it.uS.value = xt ? 1 : 1 + Hl * (mt - 1) ** 3 + da * (mt - 1) ** 2, it.uF.value = xt ? 0 : X < se ? mt : Math.exp(-(X - se) / 160), it.uT.value = X / 1e3, it.uStep.value = $, it.uRay.value = G, it.uShock.value = w, it.uR0.value = 1 + as * et, et += z.mix, Q = Math.max(Q, z.kind === 4 ? 1.75 : z.kind === 1 ? 1.45 : 1.3), z.kind === 1 && X < cs && z.server && (B = z), Z.position.copy(Bt), Z.quaternion.copy(b.quaternion);
2412
+ const Vt = z.kind === 0 ? Math.max(Kr[0], 1.4 + Xt(1) * G) : z.kind === 1 ? 1.05 * (1 + as * ct) + w + 0.2 : Kr[z.kind];
2413
+ it.uQ.value = Vt, Z.scale.setScalar(E * Vt);
2414
+ }
2415
+ const Y = i.current;
2416
+ if (Y) {
2417
+ const q = B ? $a(B.server) : void 0, Z = B ? ((At = k.mcp.get(B.server)) == null ? void 0 : At.mix) ?? 0 : 0;
2418
+ if (Y.visible = !!q && Z > 0.2, Y.visible && q && (B != null && B.d)) {
2419
+ const z = p - B.d.at;
2420
+ te.copy(q).sub(Bt);
2421
+ const J = te.length();
2422
+ te.divideScalar(J || 1);
2423
+ const X = E * 0.95;
2424
+ b.getWorldDirection(ds).cross(te).normalize(), $r.copy(te).cross(ds).normalize(), to.copy(Bt).addScaledVector(te, X + (J - X) * 0.5);
2425
+ const mt = Math.max(J - X, 1e-3), it = Math.max(E * 0.1, 6 * P);
2426
+ eo.makeBasis(te.multiplyScalar(mt), ds.multiplyScalar(it), $r).setPosition(to), Y.matrix.copy(eo), Y.matrixWorldNeedsUpdate = !0, c.uniforms.uA.value = (z < cs - 300 ? 1 : (cs - z) / 300) * M * Z * Math.min(1, z / 80), c.uniforms.uT.value = xt ? 0.3 : z / 1e3;
2427
+ }
2428
+ }
2429
+ for (const q of a.current) q && (q.visible = _);
2430
+ let H = 0;
2431
+ const V = E * Q + 6 * P;
2432
+ for (let q = 0; q <= ct; q++) {
2433
+ const Z = a.current[q], z = q < ct ? o.slots[q] : null, J = z ? z.mix : o.extraMix;
2434
+ Z && Z.position.copy(Bt).addScaledVector(us, -(V + H));
2435
+ const X = q < ct && o.small[q], mt = q < ct && o.quiet[q];
2436
+ if ((Et = X ? u.current[q] : r.current[q]) == null || Et.setOpacity(mt ? 0 : Math.min(1, J * 1.6) * M * (X ? 0.85 : 1), !0), mt) continue;
2437
+ const it = X ? L(De.size, De.px) : L(is.size, is.px), Vt = !z || X ? 1 : 1.75;
2438
+ H += (it * 1.16 * Vt + it * 0.7 + 6) * P * Math.min(1, J * 2);
2439
+ }
2440
+ const I = o.optSlot >= 0 ? o.slots[o.optSlot] : null, nt = I && I.d ? I.mix * M : 0;
2441
+ if (I && nt > 3e-3) {
2442
+ const q = o.optN, Z = (1 + as * o.optSlot) * Ts;
2443
+ for (let z = 0; z < q; z++) {
2444
+ const J = ((q - 1) * 0.5 - z) * $, X = Z + (z === o.optWin ? Xt(o.optP[z]) : xe(o.optP[z])) * G;
2445
+ o.ys[z] = X * Math.sin(J) * E;
2446
+ }
2447
+ for (let z = 1; z < q; z++) o.ys[z - 1] - o.ys[z] < W && (o.ys[z] = o.ys[z - 1] - W);
2448
+ for (let z = 0; z < Ct; z++) {
2449
+ const J = l.current[z], X = d.current[z];
2450
+ if (!J || !X || (J.visible = z < q, z >= q)) continue;
2451
+ const mt = ((q - 1) * 0.5 - z) * $, it = z === o.optWin, Vt = Z + (it ? Xt(o.optP[z]) : xe(o.optP[z])) * G;
2452
+ J.position.copy(Bt).addScaledVector(_r, Vt * Math.cos(mt) * E + (it ? 0.16 * E : 0.08 * E) + 8 * P).addScaledVector(us, o.ys[z]), X.setOpacity(Math.min(1, nt * 1.6) * (it ? 1 : 0.85), !0);
2453
+ }
2454
+ } else for (let q = 0; q < Ct; q++) (ft = d.current[q]) == null || ft.setOpacity(0, !0);
2455
+ }), /* @__PURE__ */ R(kt, { children: [
2456
+ Array.from({ length: ct }, (b, v) => /* @__PURE__ */ f("mesh", { ref: (p) => void (s.current[v] = p), geometry: Jl, material: g[v], renderOrder: 23, raycast: Yr, visible: !1, frustumCulled: !1 }, v)),
2457
+ /* @__PURE__ */ f("mesh", { ref: i, geometry: Xl, material: c, renderOrder: 22, raycast: Yr, visible: !1, frustumCulled: !1, matrixAutoUpdate: !1 }),
2458
+ Array.from({ length: ct + 1 }, (b, v) => {
2459
+ const p = v < ct ? is : De;
2460
+ return /* @__PURE__ */ R("group", { ref: (A) => void (a.current[v] = A), visible: !1, children: [
2461
+ /* @__PURE__ */ f(
2462
+ Lt,
2463
+ {
2464
+ ref: (A) => void (r.current[v] = A),
2465
+ text: "",
2466
+ color: me,
2467
+ textColor: v < ct ? Be : oe,
2468
+ size: p.size,
2469
+ secondarySize: p.size * 0.68,
2470
+ pxRange: p.px,
2471
+ anchorY: "top",
2472
+ plate: v < ct ? "tag" : "none",
2473
+ font: "mono",
2474
+ opacity: 0,
2475
+ fadeMs: 0,
2476
+ glow: 1.1,
2477
+ renderOrder: 26,
2478
+ declutter: "decision",
2479
+ fit: !0
2480
+ }
2481
+ ),
2482
+ v < ct && /* @__PURE__ */ f(
2483
+ Lt,
2484
+ {
2485
+ ref: (A) => void (u.current[v] = A),
2486
+ text: "",
2487
+ color: _s,
2488
+ textColor: oe,
2489
+ size: De.size,
2490
+ pxRange: De.px,
2491
+ anchorY: "top",
2492
+ plate: "none",
2493
+ font: "mono",
2494
+ opacity: 0,
2495
+ fadeMs: 0,
2496
+ glow: 1,
2497
+ renderOrder: 26,
2498
+ declutter: "skill",
2499
+ fit: !0
2500
+ }
2501
+ )
2502
+ ] }, v);
2503
+ }),
2504
+ Array.from({ length: Ct }, (b, v) => /* @__PURE__ */ f("group", { ref: (p) => void (l.current[v] = p), visible: !1, children: /* @__PURE__ */ f(
2505
+ Lt,
2506
+ {
2507
+ ref: (p) => void (d.current[v] = p),
2508
+ text: "",
2509
+ color: me,
2510
+ textColor: Be,
2511
+ size: ln.size,
2512
+ pxRange: ln.px,
2513
+ anchorX: "left",
2514
+ anchorY: "middle",
2515
+ plate: "tag",
2516
+ font: "mono",
2517
+ opacity: 0,
2518
+ fadeMs: 0,
2519
+ glow: 1.05,
2520
+ renderOrder: 26,
2521
+ declutter: "decision",
2522
+ fit: !0
2523
+ }
2524
+ ) }, `o${v}`))
2525
+ ] });
2526
+ }
2527
+ const fs = 512, ha = 1.12, Rs = 1.25, ps = new y.PlaneGeometry(2, 2), ma = () => {
2528
+ }, iu = (
2529
+ /* glsl */
2530
+ `
2531
+ attribute vec4 iSegA; attribute vec4 iSegB; attribute vec4 iP;
2532
+ varying vec2 vP; varying vec4 vA; varying vec4 vB; varying vec4 vI;
2533
+ void main() {
2534
+ vP = position.xy * ${Rs.toFixed(2)};
2535
+ vA = iSegA; vB = iSegB; vI = iP;
2536
+ gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
2537
+ }`
2538
+ ), cu = (
2539
+ /* glsl */
2540
+ `
2541
+ uniform vec3 uC[${qs.length}]; uniform float uM;
2542
+ varying vec2 vP; varying vec4 vA; varying vec4 vB; varying vec4 vI;
2543
+ const float PI = 3.14159265;
2544
+ void main() {
2545
+ float r = length(vP);
2546
+ float aa = max(fwidth(r), 1e-4);
2547
+ float w = max(vI.y, aa * 0.9);
2548
+ float ring = 1.0 - smoothstep(w, w + aa * 1.2, abs(r - 1.0));
2549
+ if (ring < 0.002) discard;
2550
+ float t = mod(PI * 0.5 - atan(vP.y, vP.x) + 2.0 * PI, 2.0 * PI) / (2.0 * PI);
2551
+ float e[8]; e[0] = vA.x; e[1] = vA.y; e[2] = vA.z; e[3] = vA.w; e[4] = vB.x; e[5] = vB.y; e[6] = vB.z; e[7] = vB.w;
2552
+ vec3 col = uC[8];
2553
+ float lo = 0.0; float hi = 1.0; bool found = false;
2554
+ for (int k = 0; k < 8; k++) {
2555
+ if (!found && t < e[k]) { col = uC[k]; hi = e[k]; found = true; }
2556
+ if (!found) lo = e[k];
2557
+ }
2558
+ // small gaps between outcome segments (only where a segment really starts / ends)
2559
+ float g = min(t - lo, hi - t) * 2.0 * PI;
2560
+ float gap = (lo > 0.0005 || hi < 0.9995) ? smoothstep(0.012, 0.012 + aa * 2.0, g) : 1.0;
2561
+ float d = abs(fract(t - vI.w + 0.5) - 0.5);
2562
+ float spark = exp(-d * d * 900.0) * uM;
2563
+ float a = ring * gap * vI.x * (vI.z + spark * 1.4);
2564
+ gl_FragColor = vec4(mix(col, vec3(1.0), spark * 0.5) * a, 1.0);
2565
+ }`
2566
+ ), zn = new y.Vector3(), no = new y.Vector3(), Qt = new y.Vector3(), lu = new y.Vector3(), so = new y.Matrix4();
2567
+ function tr(t, e, n, s) {
2568
+ return s.copy(t.live), k.plane === "xz" && (s.y += n * t.scale * 0.5), Math.max(e, n * 0.55) * t.scale * ha;
2569
+ }
2570
+ const uu = (t) => Math.min(1, Math.max(0, Math.log2(Math.max(t, 1e-3) / 2) / 5));
2571
+ function du({ radius: t, height: e }) {
2572
+ const n = U(null), { geo: s, mat: a, a: r, b: l, p: d } = st(() => {
2573
+ const i = new y.InstancedBufferGeometry();
2574
+ i.index = ps.index, i.setAttribute("position", ps.getAttribute("position")), i.setAttribute("uv", ps.getAttribute("uv"));
2575
+ const u = () => new y.InstancedBufferAttribute(new Float32Array(fs * 4), 4).setUsage(y.DynamicDrawUsage), o = u(), g = u(), c = u();
2576
+ i.setAttribute("iSegA", o), i.setAttribute("iSegB", g), i.setAttribute("iP", c);
2577
+ const m = new y.ShaderMaterial({
2578
+ vertexShader: iu,
2579
+ fragmentShader: cu,
2580
+ transparent: !0,
2581
+ depthTest: !1,
2582
+ depthWrite: !1,
2583
+ blending: y.AdditiveBlending,
2584
+ toneMapped: !1,
2585
+ uniforms: { uC: { value: To.map((b) => new y.Color(b)) }, uM: { value: xt ? 0 : 1 } }
2586
+ });
2587
+ return { geo: i, mat: m, a: o, b: g, p: c };
2588
+ }, []);
2589
+ return ot(() => () => (s.dispose(), a.dispose()), [s, a]), dt(({ camera: i }) => {
2590
+ const u = n.current;
2591
+ if (!u) return;
2592
+ const o = performance.now();
2593
+ let g = 0;
2594
+ for (const c of k.agents.values()) {
2595
+ const m = c.inst.hv;
2596
+ if (!m || g >= fs) continue;
2597
+ const b = Ls(m, o) * Te(c.inst, o) * (1 - 0.5 * c.dim);
2598
+ if (b <= 3e-3) continue;
2599
+ const v = tr(c, t, e, Qt);
2600
+ so.compose(Qt, i.quaternion, lu.setScalar(v * Rs)), u.setMatrixAt(g, so);
2601
+ let p = 0;
2602
+ for (let O = 0; O < 8; O++)
2603
+ p += m.seg[O], (O < 4 ? r.array : l.array)[g * 4 + (O & 3)] = Math.min(1, p);
2604
+ const A = uu(m.rate);
2605
+ d.array[g * 4] = b, d.array[g * 4 + 1] = (0.018 + 0.05 * A) / Rs;
2606
+ const M = m.bump ? Math.exp(-(o - m.bump) / 260) : 0;
2607
+ d.array[g * 4 + 2] = 0.45 + 0.75 * A + M * (m.bumpDeny ? 2.2 : 1.2), d.array[g * 4 + 3] = xt ? 0 : o / 1e3 * (0.12 + 0.25 * A) + Hn(c.id), g++;
2608
+ }
2609
+ u.count = g, fu(o), u.visible = g > 0, g && (u.instanceMatrix.needsUpdate = !0, r.needsUpdate = l.needsUpdate = d.needsUpdate = !0);
2610
+ }), /* @__PURE__ */ f("instancedMesh", { ref: n, args: [s, a, fs], renderOrder: 21, raycast: ma, frustumCulled: !1, visible: !1 });
2611
+ }
2612
+ const un = 3, An = /* @__PURE__ */ new Set();
2613
+ let ro = 0;
2614
+ const pe = [], dn = [];
2615
+ function fu(t) {
2616
+ if (!(t - ro < 1e3)) {
2617
+ ro = t, pe.length = dn.length = 0;
2618
+ for (const e of k.agents.values()) {
2619
+ const n = e.inst.hv;
2620
+ if (!n || Ls(n, t) <= 0.05) continue;
2621
+ const s = n.rate * (An.has(e.id) ? 1.15 : 1);
2622
+ let a = pe.length;
2623
+ for (; a > 0 && dn[a - 1] < s; ) a--;
2624
+ a >= un || (pe.splice(a, 0, e.id), dn.splice(a, 0, s), pe.length > un && (pe.length = un, dn.length = un));
2625
+ }
2626
+ An.clear();
2627
+ for (const e of pe) An.add(e);
2628
+ }
2629
+ }
2630
+ const In = "#f1fffd", yn = "#9fc4bf", pu = "#c4b5fd", hu = "#fb7185", oo = { size: 0.3, px: [11.5, 14] }, mu = 250;
2631
+ function gu({ agent: t, radius: e, height: n }) {
2632
+ const [s, a] = ut(() => !!t.inst.hv);
2633
+ return dt(() => {
2634
+ !s && t.inst.hv && a(!0);
2635
+ }), s ? /* @__PURE__ */ f(vu, { agent: t, radius: e, height: n }) : null;
2636
+ }
2637
+ function vu({ agent: t, radius: e, height: n }) {
2638
+ const s = U(null), a = U(null), r = st(() => ({ at: 0, key: "", vis: 0 }), []);
2639
+ return dt(({ camera: l, size: d }) => {
2640
+ var A, M;
2641
+ const i = t.inst.hv, u = s.current;
2642
+ if (!i || !u) return;
2643
+ const o = performance.now(), g = An.has(t.id) || h.selected === t.id;
2644
+ r.vis += ((g ? 1 : 0) - r.vis) * 0.15;
2645
+ const c = Ls(i, o) * Te(t.inst, o) * (1 - 0.5 * t.dim) * r.vis;
2646
+ if (u.visible = c > 3e-3, (A = a.current) == null || A.setOpacity(Math.min(1, c * 1.4) * 0.92, !0), !u.visible) return;
2647
+ if (o - r.at > mu) {
2648
+ r.at = o;
2649
+ const O = i.rate >= 10 ? `${Math.round(i.rate)}` : `${Math.round(i.rate * 10) / 10}`, C = i.deny * 100, x = C > 0 && C < 1 ? "<1" : `${Math.round(C)}`, S = `${Math.round(i.p50)}`, N = `${i.provider}|${O}|${x}|${S}`;
2650
+ N !== r.key && (r.key = N, (M = a.current) == null || M.setText([
2651
+ { text: `${i.provider} `, color: pu },
2652
+ { text: `${O}/s`, color: In },
2653
+ { text: " · ", color: yn },
2654
+ { text: `${x}% deny`, color: C >= 1 ? hu : yn },
2655
+ { text: ` · p50 ${S}ms`, color: yn }
2656
+ ]));
2657
+ }
2658
+ const m = tr(t, e, n, Qt);
2659
+ zn.set(0, 1, 0).applyQuaternion(l.quaternion);
2660
+ const b = l, v = Qt.distanceTo(l.position) || 1, p = b.isPerspectiveCamera ? 2 * v * Math.tan(y.MathUtils.degToRad(b.fov) / 2) / (b.zoom * d.height) : 0.01;
2661
+ u.position.copy(Qt).addScaledVector(zn, m + 5 * p);
2662
+ }), /* @__PURE__ */ f("group", { ref: s, visible: !1, children: /* @__PURE__ */ f(Lt, { ref: a, text: "", color: "#5eead4", textColor: In, size: oo.size, pxRange: oo.px, anchorY: "bottom", plate: "none", font: "mono", opacity: 0, fadeMs: 0, glow: 1, renderOrder: 25, declutter: "skill", fit: !0 }) });
2663
+ }
2664
+ const Au = (
2665
+ /* glsl */
2666
+ `
2667
+ varying vec2 vUv;
2668
+ void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
2669
+ ), yu = (
2670
+ /* glsl */
2671
+ `
2672
+ uniform vec2 uSize; uniform vec3 uColor; uniform float uA; uniform float uDash; uniform float uStrike;
2673
+ varying vec2 vUv;
2674
+ void main() {
2675
+ vec2 p = (vUv - 0.5) * uSize;
2676
+ vec2 hs = uSize * 0.5;
2677
+ float rad = min(hs.y, 7.0);
2678
+ vec2 q = abs(p) - hs + rad;
2679
+ float d = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - rad;
2680
+ if (d > 0.5) discard;
2681
+ float inside = 1.0 - smoothstep(-0.5, 0.5, d);
2682
+ float border = 1.0 - smoothstep(0.6, 1.4, abs(d + 1.0));
2683
+ // dashes along the perimeter (x on the long edges, y on the short ones)
2684
+ float along = abs(p.y) > hs.y - rad ? p.x : p.y + 1000.0;
2685
+ float dash = mix(1.0, step(0.5, fract(along / 7.0)), uDash);
2686
+ float strike = uStrike * (1.0 - smoothstep(0.6, 1.3, abs(p.y))) * step(abs(p.x), hs.x - 4.0);
2687
+ vec3 fill = uColor * 0.16 + vec3(0.02, 0.03, 0.05);
2688
+ vec3 col = mix(fill, uColor, max(border * dash, strike));
2689
+ float a = inside * (0.86 + 0.14 * max(border * dash, strike)) * uA;
2690
+ gl_FragColor = vec4(col, a);
2691
+ }`
2692
+ ), Le = { size: 0.3, px: [12, 15] }, Ps = "#4ade80", Mu = "#fb7185", ga = "#94a3b8", bu = 220, Mn = (t) => t.status === "rejected" || t.status === "cancelled", xu = (t) => Mn(t) ? ga : t.side === "sell" || t.side === "no" ? Mu : Ps;
2693
+ function wu({ agent: t, radius: e, height: n }) {
2694
+ const [s, a] = ut(() => t.inst.orders.length > 0);
2695
+ return dt(() => {
2696
+ !s && t.inst.orders.length > 0 && a(!0);
2697
+ }), s ? /* @__PURE__ */ f(ku, { agent: t, radius: e, height: n }) : null;
2698
+ }
2699
+ function ku({ agent: t, radius: e, height: n }) {
2700
+ const s = U(null), a = U(null), r = U(null), l = st(() => ({ cur: null, chars: 0 }), []), d = st(
2701
+ () => new y.ShaderMaterial({
2702
+ vertexShader: Au,
2703
+ fragmentShader: yu,
2704
+ transparent: !0,
2705
+ depthTest: !1,
2706
+ depthWrite: !1,
2707
+ toneMapped: !1,
2708
+ uniforms: { uSize: { value: new y.Vector2(80, 22) }, uColor: { value: new y.Color(Ps) }, uA: { value: 0 }, uDash: { value: 0 }, uStrike: { value: 0 } }
2709
+ }),
2710
+ []
2711
+ );
2712
+ return ot(() => () => d.dispose(), [d]), dt(({ camera: i, size: u }) => {
2713
+ var $, _, et;
2714
+ const o = s.current, g = a.current;
2715
+ if (!o || !g) return;
2716
+ const c = performance.now(), m = t.inst.orders, b = m[m.length - 1], v = b && c - b.at < Qe ? b : null;
2717
+ if (v !== l.cur && (l.cur = v, v)) {
2718
+ const Q = Ws({ ...v, status: Mn(v) ? v.status : void 0 }), B = v.dry_run ? " paper" : "";
2719
+ l.chars = Q.length + B.length;
2720
+ const Y = xu(v);
2721
+ ($ = r.current) == null || $.setText([{ text: Q, color: Mn(v) ? ga : In }, { text: B, color: yn }]), d.uniforms.uColor.value.set(Y), d.uniforms.uDash.value = v.dry_run ? 1 : 0, d.uniforms.uStrike.value = Mn(v) ? 1 : 0;
2722
+ }
2723
+ if (o.visible = !!v, !v) {
2724
+ (_ = r.current) == null || _.setOpacity(0, !0);
2725
+ return;
2726
+ }
2727
+ const p = c - v.at, A = Te(t.inst, c), M = p < Qe - 400 ? 1 : (Qe - p) / 400, O = Math.min(1, p / bu), C = xt ? 1 : 1 + 2.2 * (O - 1) ** 3 + 1.2 * (O - 1) ** 2, x = M * A * Math.min(1, p / 60), S = tr(t, e, n, Qt) / ha;
2728
+ zn.set(0, 1, 0).applyQuaternion(i.quaternion), no.set(1, 0, 0).applyQuaternion(i.quaternion);
2729
+ const N = i, T = Qt.distanceTo(i.position) || 1, P = N.isPerspectiveCamera ? 2 * T * Math.tan(y.MathUtils.degToRad(N.fov) / 2) / (N.zoom * u.height) : 0.01, E = y.MathUtils.clamp(Le.size * D.label / Math.max(P, 1e-6), Le.px[0] * j.pxk, Le.px[1] * j.pxk), w = l.chars * E * 0.6 + E * 1.3, L = E * 1.75;
2730
+ d.uniforms.uSize.value.set(w, L), d.uniforms.uA.value = x;
2731
+ const W = (S * 1.15 + 10 * P) * C + S * 0.2 * (p / Qe);
2732
+ o.position.copy(Qt).addScaledVector(no, (S * 1.05 + (w * 0.5 + 4) * P) * C).addScaledVector(zn, W), g.quaternion.copy(i.quaternion);
2733
+ const G = Math.max(1e-4, C);
2734
+ g.scale.set(w * P * G, L * P * G, 1), (et = r.current) == null || et.setOpacity(x * Math.min(1, O * 1.5), !0);
2735
+ }), /* @__PURE__ */ R("group", { ref: s, visible: !1, children: [
2736
+ /* @__PURE__ */ f("mesh", { ref: a, geometry: Su, material: d, renderOrder: 27, raycast: ma, frustumCulled: !1 }),
2737
+ /* @__PURE__ */ f(Lt, { ref: r, text: "", color: Ps, textColor: In, size: Le.size, pxRange: Le.px, anchorX: "center", anchorY: "middle", plate: "none", font: "mono", opacity: 0, fadeMs: 0, glow: 1.05, renderOrder: 28, declutter: "decision", fit: !0 })
2738
+ ] });
2739
+ }
2740
+ const Su = new y.PlaneGeometry(1, 1), ge = 220, va = ["planner", "researcher", "writer", "graph_scout", "records_scout", "data_scout"], Ou = Object.fromEntries(va.map((t) => [t, new y.Color(Kt[t])]));
2741
+ let fn = null;
2742
+ function Eu() {
2743
+ if (fn) return fn;
2744
+ const t = document.createElement("canvas");
2745
+ t.width = t.height = 128;
2746
+ const e = t.getContext("2d"), n = e.createRadialGradient(64, 64, 0, 64, 64, 64);
2747
+ 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)"), e.fillStyle = n, e.fillRect(0, 0, 128, 128), fn = new y.CanvasTexture(t), fn;
2748
+ }
2749
+ const Tu = (
2750
+ /* glsl */
2751
+ `
2752
+ attribute vec4 aSeed; // theta, phi(cos), radius 0..1, speed
2753
+ attribute vec3 aColor;
2754
+ attribute float aBright;
2755
+ uniform float uTime, uRadius, uEnergy, uSize, uFlat, uChaos, uPix;
2756
+ varying vec3 vColor;
2757
+ varying float vA;
2758
+ void main() {
2759
+ float th = aSeed.x + uTime * aSeed.w * (0.35 + uEnergy * 0.9);
2760
+ float cp = aSeed.y;
2761
+ float sp = sqrt(max(0.0, 1.0 - cp * cp));
2762
+ float r = uRadius * (0.35 + 0.65 * aSeed.z) * (1.0 + 0.06 * sin(uTime * 1.7 + aSeed.x * 7.0) * (0.4 + uEnergy));
2763
+ vec3 p = vec3(cos(th) * sp, cp * (1.0 - uFlat), sin(th) * sp) * r;
2764
+ // swarm: drift on a lissajous so the school churns
2765
+ 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));
2766
+ vec4 mv = modelViewMatrix * vec4(p, 1.0);
2767
+ gl_Position = projectionMatrix * mv;
2768
+ float tw = 0.75 + 0.25 * sin(uTime * (2.0 + aSeed.w * 3.0) + aSeed.x * 11.0);
2769
+ gl_PointSize = uSize * uPix * (0.7 + 0.6 * aSeed.z) * (1.0 + aBright * 0.6) * tw / max(0.5, -mv.z);
2770
+ vColor = aColor * (0.55 + aBright * 0.9 + uEnergy * 0.5);
2771
+ vA = tw;
2772
+ }
2773
+ `
2774
+ ), Cu = (
2775
+ /* glsl */
2776
+ `
2777
+ uniform float uOpacity;
2778
+ varying vec3 vColor;
2779
+ varying float vA;
2780
+ void main() {
2781
+ vec2 d = gl_PointCoord - 0.5;
2782
+ float r = length(d);
2783
+ float a = smoothstep(0.5, 0.0, r);
2784
+ a *= a;
2785
+ gl_FragColor = vec4(vColor * a * vA * uOpacity, 1.0);
2786
+ }
2787
+ `
2788
+ );
2789
+ function Ru() {
2790
+ const t = new y.BufferGeometry(), e = new Float32Array(ge * 3), n = new Float32Array(ge * 4);
2791
+ for (let s = 0; s < ge; s++)
2792
+ 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);
2793
+ return t.setAttribute("position", new y.BufferAttribute(e, 3)), t.setAttribute("aSeed", new y.BufferAttribute(n, 4)), t.setAttribute("aColor", new y.BufferAttribute(new Float32Array(ge * 3), 3)), t.setAttribute("aBright", new y.BufferAttribute(new Float32Array(ge), 1)), t.setDrawRange(0, 0), t.boundingSphere = new y.Sphere(new y.Vector3(), 50), t;
2794
+ }
2795
+ function Pu({ cluster: t, position: e, place: n, color: s, radius: a = 1.4, variant: r = "orb", pointSize: l = 1, labelBelow: d = 1.25, glowGain: i = 1, onClick: u }) {
2796
+ const o = U(null), g = U(null), c = U(null), m = U(null), b = U(null), v = U(null), p = U(null), A = st(() => new y.Color(s ?? t.color), [s, t.color]), M = st(() => ({ l1: "", l2: "", seen: -1, vis: 0, hover: 0, over: !1, r: a, pos: new y.Vector3(), c: new y.Color(), tokSeen: -1, thSeen: -1, fresh: !0 }), [a]), O = st(Ru, []), C = st(() => {
2797
+ const N = (P) => new y.SpriteMaterial({ map: Eu(), color: "#000", blending: y.AdditiveBlending, depthWrite: !1, transparent: !0, toneMapped: !1, opacity: P }), T = new y.ShaderMaterial({
2798
+ vertexShader: Tu,
2799
+ fragmentShader: Cu,
2800
+ transparent: !0,
2801
+ depthWrite: !1,
2802
+ blending: y.AdditiveBlending,
2803
+ toneMapped: !1,
2804
+ uniforms: {
2805
+ uTime: { value: 0 },
2806
+ uRadius: { value: a },
2807
+ uEnergy: { value: 0 },
2808
+ uSize: { value: 0.16 * a * l },
2809
+ uFlat: { value: r === "stars" ? 0.55 : 0 },
2810
+ uChaos: { value: r === "swarm" ? 1 : r === "stars" ? 0 : 0.25 },
2811
+ uPix: { value: 1 },
2812
+ uOpacity: { value: 0 }
2813
+ }
2814
+ });
2815
+ return { core: N(1), hot: N(1), halo: N(1), points: T, hit: new y.MeshBasicMaterial({ visible: !1 }) };
2816
+ }, [a, l, r]);
2817
+ dt(({ clock: N, gl: T, camera: P }) => {
2818
+ var I, nt;
2819
+ const E = t, w = N.elapsedTime, L = E.active && F.grouped ? 1 : 0;
2820
+ M.vis += (L - M.vis) * (L ? 0.06 : 0.12), M.vis < 3e-3 && (M.vis = 0);
2821
+ const W = M.vis > 0;
2822
+ if (o.current && (o.current.visible = W), p.current && !(W && L) && p.current.setOpacity(0, !0), !W) {
2823
+ M.fresh = !0;
2824
+ return;
2825
+ }
2826
+ o.current && (n ? n(E.lane, M.pos, w) : e && M.pos.set(e[0], e[1], e[2]), M.fresh ? (o.current.position.copy(M.pos), M.fresh = !1) : o.current.position.lerp(M.pos, 0.06));
2827
+ const G = E.energy, $ = 0.8 + 0.22 * Math.log2(1 + E.agents / 6);
2828
+ M.hover += ((M.over ? 1 : 0) - M.hover) * 0.15;
2829
+ const _ = a * Math.min(1.7, $) * (0.6 + 0.4 * M.vis) * (1 + M.hover * 0.08), et = Math.sin(w * (1.1 + G * 2.6) + E.lane), Q = 1 + et * (0.04 + G * 0.1), B = C.points.uniforms;
2830
+ B.uTime.value = w, B.uRadius.value = _, B.uEnergy.value = G;
2831
+ const Y = P.fov ?? 50;
2832
+ B.uPix.value = T.domElement.height / (2 * Math.tan(Y * Math.PI / 360)), B.uOpacity.value = M.vis;
2833
+ const H = i * M.vis;
2834
+ if (g.current && (g.current.scale.setScalar(_ * 2.4 * Q), C.core.color.copy(A).multiplyScalar((0.32 + G * 0.45 + M.hover * 0.2) * H)), c.current && (c.current.scale.setScalar(_ * 0.9 * Q), C.hot.color.copy(A).lerp(Vu, 0.55).multiplyScalar((0.35 + G * 0.6) * H)), m.current && (m.current.scale.setScalar(_ * 5.5 * (1 + et * 0.03)), C.halo.color.copy(A).multiplyScalar((0.07 + G * 0.08) * H)), (I = b.current) == null || I.scale.setScalar(_ * 1.15), (nt = v.current) == null || nt.position.set(0, -_ * d - 0.35, 0), E.version !== M.seen) {
2835
+ M.seen = E.version;
2836
+ const at = Math.min(ge, Math.max(18, E.agents * 2)), At = O.getAttribute("aColor"), Et = O.getAttribute("aBright");
2837
+ let ft = 0;
2838
+ const q = E.agents ? at / E.agents : 1;
2839
+ for (const z of va) {
2840
+ const J = Math.round(E.types[z] * q);
2841
+ for (let X = 0; X < J && ft < at; X++, ft++)
2842
+ M.c.copy(Ou[z]).lerp(A, 0.25), At.setXYZ(ft, M.c.r, M.c.g, M.c.b);
2843
+ }
2844
+ for (; ft < at; ft++) At.setXYZ(ft, A.r, A.g, A.b);
2845
+ const Z = E.agents ? E.thinking / E.agents : 0;
2846
+ for (let z = 0; z < at; z++) Et.setX(z, z * 0.618034 % 1 < Z ? 1 : 0);
2847
+ At.needsUpdate = !0, Et.needsUpdate = !0, O.setDrawRange(0, at), M.l1 = `${E.runs} run${E.runs === 1 ? "" : "s"} · ${E.agents} agent${E.agents === 1 ? "" : "s"}`;
2848
+ }
2849
+ const V = Math.round(E.tokens / 1e3);
2850
+ (V !== M.tokSeen || E.thinking !== M.thSeen) && (M.tokSeen = V, M.thSeen = E.thinking, M.l2 = `${E.thinking} thinking · ${V >= 1e3 ? `${(V / 1e3).toFixed(1)}M` : `${V}k`} tok`), p.current && (p.current.setText(M.l1, M.l2), p.current.setEmphasis(M.over), L && p.current.setOpacity(Math.min(1, M.vis * 1.2), !0));
2851
+ });
2852
+ const x = (N) => {
2853
+ var T;
2854
+ (T = N == null ? void 0 : N.stopPropagation) == null || T.call(N), (u ?? Nc)(t.lane);
2855
+ }, S = (N) => {
2856
+ M.over = N, document.body.style.cursor = N ? "pointer" : "";
2857
+ };
2858
+ return /* @__PURE__ */ R("group", { ref: o, visible: !1, children: [
2859
+ /* @__PURE__ */ f("sprite", { ref: m, material: C.halo }),
2860
+ /* @__PURE__ */ f("sprite", { ref: g, material: C.core }),
2861
+ /* @__PURE__ */ f("sprite", { ref: c, material: C.hot }),
2862
+ /* @__PURE__ */ f("points", { geometry: O, material: C.points, frustumCulled: !1 }),
2863
+ /* @__PURE__ */ f("mesh", { ref: b, material: C.hit, onClick: x, onPointerOver: () => S(!0), onPointerOut: () => S(!1), children: /* @__PURE__ */ f("sphereGeometry", { args: [1, 12, 8] }) }),
2864
+ /* @__PURE__ */ f("group", { ref: v, children: /* @__PURE__ */ f(
2865
+ Lt,
2866
+ {
2867
+ ref: p,
2868
+ text: "",
2869
+ secondary: "",
2870
+ color: s ?? t.color,
2871
+ plate: "box",
2872
+ size: 0.36,
2873
+ opacity: 0,
2874
+ pxRange: [10, 14],
2875
+ renderOrder: 28,
2876
+ onClick: (N) => x(N),
2877
+ onHover: (N) => S(N)
2878
+ }
2879
+ ) })
2880
+ ] });
2881
+ }
2882
+ const Vu = new y.Color("#ffffff"), zu = Array.from({ length: ht }, (t, e) => e);
2883
+ function Iu({ place: t, color: e, ...n }) {
2884
+ return /* @__PURE__ */ f(kt, { children: zu.map((s) => /* @__PURE__ */ f(Pu, { cluster: F.clusters[s], place: t, color: typeof e == "function" ? e(s) : e, ...n }, s)) });
2885
+ }
2886
+ const Nu = 3, qu = [
2887
+ "Why is churn rising for Acme Corp?",
2888
+ "Root cause of payment latency incidents",
2889
+ "Which region has the most incidents?",
2890
+ "Is Fraud Shield worth expanding to Globex?",
2891
+ "Summarize Q3 support escalations",
2892
+ "Which customers are at risk of downgrading?",
2893
+ "Why did checkout conversion drop last week?",
2894
+ "Compare onboarding time across regions"
2895
+ ], hs = [
2896
+ ["Acme Corp", "Enterprise Plan", "Churn Q3"],
2897
+ ["Payments API", "Incident #4821", "p99 Latency"],
2898
+ ["EMEA", "Incident #4790", "On-call Team"],
2899
+ ["Fraud Shield", "Globex", "Chargeback Rate"],
2900
+ ["Support Escalations", "Ticket #9917", "Initech"],
2901
+ ["Umbrella Co", "Seat Downgrade", "Renewal 2026"],
2902
+ ["Checkout Funnel", "Conversion Rate", "Release 4.12"],
2903
+ ["APAC", "Onboarding Time", "Customer Success"]
2904
+ ], Du = {
2905
+ analytics: [["Metrics API", "api"], ["Postgres", "db"]],
2906
+ warehouse: [["Snowflake", "warehouse"], ["Spark cluster", "spark"]],
2907
+ github: [["GitHub API", "api"]],
2908
+ "google-drive": [["Drive storage", "storage"]],
2909
+ slack: [["Slack API", "api"], ["Kafka events", "queue"]]
2910
+ }, yt = (t) => t[Math.floor(Math.random() * t.length)], Lu = ["haiku", "sonnet", "opus", "gpt-4.1-mini"];
2911
+ function Nn() {
2912
+ const t = Math.random();
2913
+ return t < 0.65 ? ["jev", 4 + Math.round(Math.random() * 18)] : t < 0.88 ? ["laya", 9 + Math.round(Math.random() * 30)] : ["llm", 380 + Math.round(Math.random() * 700)];
2914
+ }
2915
+ function pn() {
2916
+ const [t, e] = Nn(), n = [...Lu].sort(() => Math.random() - 0.5), s = 0.55 + Math.random() * 0.42;
2917
+ let a = 1 - s;
2918
+ const r = n.map((l, d) => {
2919
+ if (d === 0) return { name: l, p: s };
2920
+ const i = d === n.length - 1 ? a : a * (0.45 + Math.random() * 0.3);
2921
+ return a -= i, { name: l, p: Math.round(i * 1e3) / 1e3 };
2922
+ });
2923
+ return { type: "decision", kind: "choice", question: "route", result: r[0].name, p: Math.round(s * 1e3) / 1e3, options: r, provider: t, purpose: "route", target: r[0].name, ms: e };
2924
+ }
2925
+ function hn(t, e) {
2926
+ const [n, s] = Nn(), a = Math.round((0.86 + Math.random() * 0.13) * 1e3) / 1e3;
2927
+ return { type: "decision", kind: "noul", question: "tool allowed?", result: e ? "no" : "yes", p: a, provider: n, purpose: "guard", target: t, ms: s };
2928
+ }
2929
+ const Gu = () => Math.random().toString(36).slice(2, 7);
2930
+ function Wu(t) {
2931
+ const e = `run-${Gu()}`, n = yt(qu), s = () => Date.now();
2932
+ let a = 0;
2933
+ const r = (T, P) => {
2934
+ a += T, t(a, P);
2935
+ }, l = (T, P, E) => r(250, () => ({ type: "spawn", run_id: e, id: T, agent: P, parent_id: E, ts: s() })), d = (T) => r(150, () => ({ type: "agent", run_id: e, id: T, status: "thinking", ts: s() })), i = (T, P = 120) => r(P, () => ({ type: "agent", run_id: e, id: T, status: "waiting", ts: s() })), u = (T, P) => r(P, () => ({ type: "llm", run_id: e, id: T, tokens_in: 1200 + Math.round(Math.random() * 3e3), tokens_out: 150 + Math.round(Math.random() * 700), latency_ms: 700 + Math.random() * 1800, ts: s() })), o = (T, P = 250) => r(P, () => ({ type: "exit", run_id: e, id: T, status: "done", ts: s() })), g = (T, P, E, w = 120) => r(w, () => ({ type: "message", run_id: e, from_id: T, to_id: P, text: E, ts: s() })), c = (T, P, E = 120) => r(E, () => [
2936
+ { type: "tool", run_id: e, id: T, tool: "Skill", args_preview: P, ts: s() },
2937
+ { type: "skill", run_id: e, id: T, name: P, status: "start", ts: s() }
2938
+ ]), m = (T, P, E = 120) => r(E, () => ({ type: "skill", run_id: e, id: T, name: P, status: "end", ts: s() })), b = (T, P, E = 60) => r(E, () => ({ ...P(), run_id: e, id: T, ts: s() })), v = (T, P, E = 120) => r(E, () => ({ type: "step", run_id: e, step: T, status: P, ts: s() }));
2939
+ r(0, () => ({ type: "run", run_id: e, status: "started", topic: n, workflow: "research_brief", ts: s() })), v("plan", "running", 300);
2940
+ const p = `${e}:planner`;
2941
+ l(p, "planner", null), b(p, pn), d(p), u(p, 1500), u(p, 900), v("plan", "done", 300);
2942
+ const A = `${e}:researcher`;
2943
+ v("research", "running", 200), l(A, "researcher", p), g(p, A, `3 questions on "${n}"`, 150), o(p, 200), b(A, pn), d(A);
2944
+ const M = Math.random() < 0.6 ? yt(["deep-research", "search-first"]) : "";
2945
+ M && c(A, M, 200), u(A, 1200), M && m(A, M, 400);
2946
+ const O = 2 + Math.floor(Math.random() * 3), C = [];
2947
+ for (let T = 0; T < O; T++) {
2948
+ const P = T % 2 === 0 ? "graph_scout" : "records_scout", E = `${e}:${P}:${T}`;
2949
+ C.push(E), T === 0 && b(A, () => hn("task", !1), 120), r(200, () => ({ type: "tool", run_id: e, id: A, tool: "task", args_preview: `${P}: angle ${T + 1} of "${n}"`, ts: s() })), l(E, P, A), g(A, E, `Investigate angle ${T + 1}`, 80);
2950
+ }
2951
+ i(A, 200);
2952
+ const x = a;
2953
+ C.forEach((T, P) => {
2954
+ let E = x + 200 + P * 220;
2955
+ const w = (Y, H) => {
2956
+ E += Y, t(E, H);
2957
+ }, L = yt(hs), W = T.includes("graph_scout");
2958
+ w(0, () => ({ type: "agent", run_id: e, id: T, status: "thinking", ts: s() })), w(60, () => ({ ...pn(), run_id: e, id: T, ts: s() }));
2959
+ const G = Math.random() < 0.45 ? yt(W ? ["graph-query", "dataviz"] : ["xlsx", "pdf"]) : "";
2960
+ G && (w(250, () => ({ type: "tool", run_id: e, id: T, tool: "Skill", args_preview: G, ts: s() })), w(0, () => ({ type: "skill", run_id: e, id: T, name: G, status: "start", ts: s() }))), w(500 + Math.random() * 500, () => ({ type: "tool", run_id: e, id: T, tool: W ? "graph_neighbors" : "search_records", args_preview: `"${L[0]}"`, ts: s() })), w(600, () => ({ type: "graph", run_id: e, id: T, op: "read", nodes: L, ts: s() })), w(700 + Math.random() * 900, () => ({ type: "llm", run_id: e, id: T, tokens_in: 1500 + Math.round(Math.random() * 2e3), tokens_out: 200 + Math.round(Math.random() * 400), latency_ms: 900 + Math.random() * 1200, ts: s() }));
2961
+ const [$, _] = yt(W ? [["analytics", "query_metrics"], ["github", "search_code"]] : [["warehouse", "run_sql"], ["analytics", "list_incidents"], ["google-drive", "read_doc"]]), et = 600 + Math.random() * 1400, [Q, B] = yt(Du[$]);
2962
+ w(200, () => ({ ...hn(_, !1), run_id: e, id: T, ts: s() })), w(400, () => ({ type: "mcp", run_id: e, id: T, server: $, tool: _, phase: "call", resource: Q, resource_kind: B, ts: s() })), w(et, () => ({ type: "mcp", run_id: e, id: T, server: $, tool: _, phase: "result", latency_ms: et, resource: Q, resource_kind: B, ts: s() })), Math.random() < 0.35 && w(300, () => ({ ...hn(yt(["rollback_deploy", "delete_records", "drop_table"]), !0), run_id: e, id: T, ts: s() })), Math.random() < 0.7 && w(500, () => ({ type: "graph", run_id: e, id: T, op: "read", nodes: yt(hs), ts: s() })), G && w(300, () => ({ type: "skill", run_id: e, id: T, name: G, status: "end", ts: s() })), w(800 + Math.random() * 1200, () => ({ type: "message", run_id: e, from_id: T, to_id: A, text: `Found ${2 + Math.floor(Math.random() * 6)} linked records`, ts: s() })), w(200, () => ({ type: "exit", run_id: e, id: T, status: "done", ts: s() })), a = Math.max(a, E);
2963
+ }), d(A), u(A, 1300), v("research", "done", 300), b(A, () => {
2964
+ const [T, P] = Nn(), E = Math.round((0.45 + Math.random() * 0.5) * 1e3) / 1e3;
2965
+ return { type: "decision", kind: "noul", question: "grounded?", result: Math.random() < 0.15 ? "no" : "yes", p: E, provider: T, purpose: "check", ms: P };
2966
+ }, 200);
2967
+ const S = `${e}:writer`;
2968
+ v("write", "running", 200), l(S, "writer", A), g(A, S, "Findings merged - draft the brief", 120), o(A, 200), b(S, pn), d(S);
2969
+ const N = [yt(["pptx", "docx", "pdf"]), "dataviz", "haiku"].slice(0, 2 + Math.floor(Math.random() * 2));
2970
+ return N.forEach((T, P) => c(S, T, P ? 500 : 150)), u(S, 1800), b(
2971
+ S,
2972
+ () => {
2973
+ const [T, P] = Nn(), E = yt(["3", "4", "4", "5"]), w = Math.round((0.5 + Math.random() * 0.4) * 1e3) / 1e3, L = ["5", "4", "3", "2", "1"].map((W) => ({ name: W, p: W === E ? w : Math.round((1 - w) / 4 * 1e3) / 1e3 })).sort((W, G) => G.p - W.p);
2974
+ return { type: "decision", kind: "score", question: "draft quality", result: E, p: w, options: L, provider: T, purpose: "check", ms: P };
2975
+ },
2976
+ 200
2977
+ ), b(S, () => ({ type: "decision", kind: "noul", question: "ready to send?", result: "yes", p: 0.93, provider: "jev", purpose: "check", ms: 7 }), 120), b(S, () => hn("post_message", !1), 120), r(400, () => ({ type: "graph", run_id: e, id: S, op: "write", nodes: [`Brief: ${n}`, ...yt(hs).slice(0, 2)], ts: s() })), r(300, () => ({ type: "mcp", run_id: e, id: S, server: "slack", tool: "post_message", phase: "call", resource: "Slack API", resource_kind: "api", ts: s() })), r(700, () => ({ type: "mcp", run_id: e, id: S, server: "slack", tool: "post_message", phase: "result", latency_ms: 700, resource: "Slack API", resource_kind: "api", ts: s() })), N.forEach((T, P) => m(S, T, P ? 900 : 300)), v("write", "done", 400), r(150, () => ({ type: "final", run_id: e, text: `Brief on "${n}": linked accounts, incidents and metrics summarized with sources.`, ts: s() })), o(S, 100), r(200, () => ({ type: "run", run_id: e, status: "completed", topic: n, workflow: "research_brief", ts: s() })), a;
2978
+ }
2979
+ function Fu() {
2980
+ Tn(!0);
2981
+ let t = !1;
2982
+ const e = [];
2983
+ let n = 0;
2984
+ const s = () => {
2985
+ if (t) return;
2986
+ n++;
2987
+ const l = Wu((d, i) => {
2988
+ e.push(
2989
+ window.setTimeout(() => {
2990
+ if (t) return;
2991
+ const u = i(performance.now());
2992
+ (Array.isArray(u) ? u : [u]).forEach(js);
2993
+ }, d)
2994
+ );
2995
+ });
2996
+ e.push(window.setTimeout(() => (n--, a()), l + 300));
2997
+ }, a = () => {
2998
+ if (!t)
2999
+ for (; n < Nu; ) {
3000
+ const r = 1500 + Math.random() * 3500;
3001
+ n++, e.push(window.setTimeout(() => (n--, s()), r));
3002
+ }
3003
+ };
3004
+ return s(), e.push(window.setTimeout(a, 2500)), () => {
3005
+ t = !0, e.forEach(clearTimeout), Tn(!1);
3006
+ };
3007
+ }
3008
+ const Uu = 20, ms = [
3009
+ "temp-nyc-hi",
3010
+ "temp-chi-hi",
3011
+ "temp-mia-hi",
3012
+ "temp-aus-hi",
3013
+ "temp-den-hi",
3014
+ "temp-lax-hi",
3015
+ "temp-phl-hi",
3016
+ "rain-nyc",
3017
+ "snow-den",
3018
+ "temp-sea-hi",
3019
+ "cpi",
3020
+ "cpi-core",
3021
+ "payrolls",
3022
+ "unemployment",
3023
+ "fed-decision",
3024
+ "gdp",
3025
+ "jobless-claims",
3026
+ "pce",
3027
+ "retail-sales",
3028
+ "ism",
3029
+ "nba-game-1",
3030
+ "nba-game-2",
3031
+ "nhl-game-1",
3032
+ "mlb-game-1",
3033
+ "mlb-game-2",
3034
+ "nfl-spread",
3035
+ "nba-total",
3036
+ "nhl-total",
3037
+ "mlb-total",
3038
+ "wnba-game-1"
3039
+ ], gs = ["hold", "quote", "take"], Bu = 6, ao = (t, e) => {
3040
+ const n = typeof location < "u" ? Number(new URLSearchParams(location.search).get(t) ?? NaN) : NaN;
3041
+ return Number.isFinite(n) && n >= 0 ? n : e;
3042
+ }, K = Math.random, It = (t) => Math.round(t * 1e3) / 1e3;
3043
+ function Ge() {
3044
+ const t = K();
3045
+ return t < 0.78 ? ["jev", 3 + Math.round(K() * 22)] : t < 0.97 ? ["laya", 8 + Math.round(K() * 40)] : ["llm", 300 + Math.round(K() * 500)];
3046
+ }
3047
+ const io = () => ({ n: 0, route: {}, routeN: 0, g: [0, 0, 0], c: [0, 0, 0], ms: [], prov: {} }), co = (t, e) => {
3048
+ if (!t.length) return 0;
3049
+ const n = [...t].sort((s, a) => s - a);
3050
+ return Math.round(n[Math.min(n.length - 1, Math.floor(e * (n.length - 1) + 0.5))]);
3051
+ };
3052
+ function Hu() {
3053
+ Tn(!0);
3054
+ const t = [];
3055
+ let e = !1;
3056
+ const n = [], s = [];
3057
+ let a = [];
3058
+ const r = performance.now(), l = () => Date.now(), d = (O) => !e && js(O), i = (O, C) => t.push(window.setTimeout(() => !e && C(), O)), u = Math.max(1, Math.min(ms.length, Math.round(ao("markets", ms.length)))), o = ao("halt", 25) * 1e3;
3059
+ let g = !1;
3060
+ const c = "hf-desk", m = `${c}:desk`;
3061
+ d({ type: "run", run_id: c, status: "started", topic: `Trading desk · ${u} markets (paper)`, workflow: "market_desk", ts: l() }), d({ type: "spawn", run_id: c, id: m, agent: "desk", parent_id: null, ts: l() }), d({ type: "agent", run_id: c, id: m, status: "thinking", ts: l() }), s.push({ id: m, run: c, next: performance.now() + 2e3 + K() * 3e3 }), ms.slice(0, u).forEach((O, C) => {
3062
+ i(300 + C * 90, () => {
3063
+ const x = `${c}:${O}`;
3064
+ d({ type: "spawn", run_id: c, id: x, agent: O, parent_id: m, subagent: !0, ts: l() }), d({ type: "message", run_id: c, from_id: m, to_id: x, text: `make ${O}`, ts: l() }), d({ type: "agent", run_id: c, id: x, status: "thinking", ts: l() });
3065
+ const S = performance.now();
3066
+ n.push({ id: x, run: c, name: O, phase: K(), next: S + 400 + K() * 1e3, strat: gs[Math.floor(K() * 3)], risk: C === 13 ? 0.18 : 0.02 + K() * 0.03, win: io() });
3067
+ });
3068
+ });
3069
+ const b = (O, C, x) => {
3070
+ const S = O.win;
3071
+ S.n++, S.ms.push(C.ms), S.prov[C.provider] = (S.prov[C.provider] ?? 0) + 1, C.purpose === "route" ? (S.routeN++, S.route[C.result] = (S.route[C.result] ?? 0) + 1) : C.purpose === "guard" ? (S.g[0]++, S.g[C.result === "no" ? 2 : 1]++) : (S.c[0]++, S.c[C.result === "yes" ? 1 : 2]++), x && a.push({ score: x === "deny" ? 3 : x === "flip" ? 2 : 1, ts: l(), agent: O.id, ev: { type: "decision", run_id: O.run, id: O.id, ...C, ts: l(), hv: !0, why: x } });
3072
+ }, v = (O) => {
3073
+ if (g) {
3074
+ b(O, { kind: "noul", question: "feed fresh", result: "no", p: 1, provider: "code", purpose: "guard", target: "quote", scope: "global", ms: 0 }, "deny");
3075
+ return;
3076
+ }
3077
+ const C = K() < 0.06;
3078
+ C && (O.strat = gs.filter((W) => W !== O.strat)[Math.floor(K() * 2)]);
3079
+ let [x, S] = Ge();
3080
+ const N = 0.55 + K() * 0.4, T = gs.filter((W) => W !== O.strat), P = It((1 - N) * (0.55 + K() * 0.3));
3081
+ b(O, { kind: "choice", question: "strategy", result: O.strat, p: It(N), options: [{ name: O.strat, p: It(N) }, { name: T[0], p: P }, { name: T[1], p: It(1 - N - P) }], provider: x, purpose: "route", target: O.strat, ms: S }, C ? "flip" : null), [x, S] = Ge();
3082
+ const E = K() < O.risk, w = !E && K() < 0.02;
3083
+ b(O, { kind: "noul", question: "risk ok?", result: E ? "no" : "yes", p: It(w ? 0.4 + K() * 0.2 : 0.82 + K() * 0.17), provider: x, purpose: "guard", target: "place_order", ms: S }, E ? "deny" : w ? "low_p" : null), [x, S] = Ge();
3084
+ const L = K() < 0.62;
3085
+ if (b(O, { kind: "noul", question: "edge > fee?", result: L ? "yes" : "no", p: It(K() < 0.1 ? 0.4 + K() * 0.2 : 0.62 + K() * 0.36), provider: x, purpose: "check", target: O.name, ms: S }, null), K() < 0.55 && ([x, S] = Ge(), b(O, { kind: "noul", question: "spread ok?", result: K() < 0.8 ? "yes" : "no", p: It(0.7 + K() * 0.29), provider: x, purpose: "check", target: O.name, ms: S }, null)), O.strat === "take" && !E && L && K() < 0.22) {
3086
+ const W = K() < 0.07, G = K() < 0.5 ? "yes" : "no";
3087
+ i(
3088
+ 30 + K() * 120,
3089
+ () => d({ type: "order", run_id: O.run, id: O.id, side: G, qty: 1 + Math.floor(K() * 9), price: It(0.05 + Math.round(K() * 90) / 100), status: W ? "rejected" : "would_place", instrument: `${O.name.toUpperCase()}-42`, dry_run: !0, reason: W ? "post-only would cross" : `edge ${2 + Math.floor(K() * 6)}c`, ts: l() })
3090
+ );
3091
+ }
3092
+ }, p = () => {
3093
+ for (const x of n) {
3094
+ const S = x.win;
3095
+ if (!S.n) continue;
3096
+ const N = {};
3097
+ S.routeN && (N.route = { n: S.routeN, results: { ...S.route } }), S.g[0] && (N.guard = { n: S.g[0], allow: S.g[1], deny: S.g[2] }), S.c[0] && (N.check = { n: S.c[0], yes: S.c[1], no: S.c[2] }), d({ type: "decision_stats", run_id: x.run, id: x.id, window_ms: 1e3, n: S.n, by_purpose: N, p50_ms: co(S.ms, 0.5), p95_ms: co(S.ms, 0.95), providers: { ...S.prov }, ts: l() }), x.win = io();
3098
+ }
3099
+ const O = /* @__PURE__ */ new Map(), C = a.sort((x, S) => S.score - x.score || x.ts - S.ts).map((x) => {
3100
+ const S = O.get(x.agent) ?? 0;
3101
+ return O.set(x.agent, S + 1), { c: x, r: S };
3102
+ }).sort((x, S) => S.c.score - x.c.score || x.r - S.r || x.c.ts - S.c.ts).slice(0, Uu).sort((x, S) => x.c.ts - S.c.ts);
3103
+ a = [], C.forEach(({ c: x }, S) => i(S * 1e3 / Math.max(C.length, 1) + K() * 40, () => d(x.ev)));
3104
+ };
3105
+ let A = r;
3106
+ const M = window.setInterval(() => {
3107
+ if (e) return;
3108
+ const O = performance.now();
3109
+ for (const x of n)
3110
+ O < x.next || (x.next += 1e3, x.next < O && (x.next = O + 1e3), v(x));
3111
+ for (const x of s)
3112
+ if (!(O < x.next) && (x.next = O + 3500 + K() * 4e3, d({ type: "llm", run_id: x.run, id: x.id, tokens_in: 900 + Math.floor(K() * 1500), tokens_out: 60 + Math.floor(K() * 200), latency_ms: 700, ts: l() }), K() < 0.6)) {
3113
+ const [S, N] = Ge(), T = K() < 0.85;
3114
+ d({ type: "decision", run_id: x.run, id: x.id, kind: "noul", question: "exposure within limits?", result: T ? "yes" : "no", p: It(0.7 + K() * 0.29), provider: S, purpose: "check", target: "desk book", ms: N, ts: l() });
3115
+ }
3116
+ const C = o > 0 && O - r >= o && O - r < o + Bu * 1e3;
3117
+ C !== g && (g = C, d({ type: "decision", run_id: c, id: m, kind: "noul", question: "kill switch off", result: C ? "no" : "yes", p: 1, provider: "code", purpose: "guard", target: "all markets", scope: "global", ms: 0, ts: l() })), O - A >= 1e3 && (A = O, p());
3118
+ }, 100);
3119
+ return t.push(M), () => {
3120
+ e = !0, t.forEach((O) => (clearTimeout(O), clearInterval(O))), Tn(!1);
3121
+ };
3122
+ }
3123
+ function ju(t, e = "", n = 2e3) {
3124
+ let s = "", a = [], r = "", l = e;
3125
+ const d = {
3126
+ lastId: e,
3127
+ retry: n,
3128
+ feed(i) {
3129
+ s += i;
3130
+ const u = s.split(/\r\n|\r|\n/);
3131
+ s = u.pop() ?? "";
3132
+ for (const o of u) {
3133
+ if (o === "") {
3134
+ d.lastId = l, a.length && (r === "" || r === "message") && t(a.join(`
3135
+ `)), a = [], r = "";
3136
+ continue;
3137
+ }
3138
+ if (o.startsWith(":")) continue;
3139
+ const g = o.indexOf(":"), c = g < 0 ? o : o.slice(0, g);
3140
+ let m = g < 0 ? "" : o.slice(g + 1);
3141
+ m.startsWith(" ") && (m = m.slice(1)), c === "data" ? a.push(m) : c === "event" ? r = m : c === "id" && !m.includes("\0") ? l = m : c === "retry" && /^\d+$/.test(m) && (d.retry = Number(m));
3142
+ }
3143
+ }
3144
+ };
3145
+ return d;
3146
+ }
3147
+ const Me = ["Customer", "Account", "Incident", "Ticket", "Product", "Region", "Metric", "Team"], lo = [0.24, 0.24, 0.22, 0.12, 0.06, 0.03, 0.05, 0.04], vs = [
3148
+ "Acme Corp",
3149
+ "Globex",
3150
+ "Initech",
3151
+ "Umbrella Co",
3152
+ "Payments API",
3153
+ "Fraud Shield",
3154
+ "Checkout Funnel",
3155
+ "Enterprise Plan",
3156
+ "Incident #4821",
3157
+ "Incident #4790",
3158
+ "Ticket #9917",
3159
+ "EMEA",
3160
+ "APAC",
3161
+ "North America",
3162
+ "p99 Latency",
3163
+ "Churn Q3",
3164
+ "Conversion Rate",
3165
+ "Chargeback Rate",
3166
+ "On-call Team",
3167
+ "Customer Success",
3168
+ "Release 4.12",
3169
+ "Renewal 2026"
3170
+ ];
3171
+ function Aa(t = 320) {
3172
+ const e = Array.from({ length: t }, (s, a) => {
3173
+ if (a < vs.length) return { id: vs[a], name: vs[a], kind: Me[a % Me.length] };
3174
+ let r = Math.random(), l = 0;
3175
+ for (; l < lo.length - 1 && (r -= lo[l]) > 0; ) l++;
3176
+ return { id: `n${a}`, name: `${Me[l]} ${a}`, kind: Me[l] };
3177
+ }), n = Array.from({ length: t }, () => ({ source: e[Math.floor(Math.random() * t)].id, target: e[Math.floor(Math.random() * t)].id }));
3178
+ return { nodes: e, links: n };
3179
+ }
3180
+ const qn = { nodes: [], links: [] }, Zu = 400;
3181
+ class Ju {
3182
+ constructor() {
3183
+ Ve(this, "nodes", []);
3184
+ Ve(this, "links", []);
3185
+ Ve(this, "seen", /* @__PURE__ */ new Set());
3186
+ Ve(this, "linkSeen", /* @__PURE__ */ new Set());
3187
+ }
3188
+ /** add the event's nodes (+ chain links between them); true when anything new was added */
3189
+ add(e) {
3190
+ let n = !1;
3191
+ const s = [];
3192
+ for (const a of e) {
3193
+ const r = String(a).trim();
3194
+ if (!r) continue;
3195
+ const l = r.toLowerCase();
3196
+ s.push(l), !(this.seen.has(l) || this.nodes.length >= Zu) && (this.seen.add(l), this.nodes.push({ id: l, name: r, kind: Me[Math.floor(Hn(l, 3) * Me.length)] }), n = !0);
3197
+ }
3198
+ for (let a = 1; a < s.length; a++) {
3199
+ const r = s[a - 1], l = s[a];
3200
+ if (r === l || !this.seen.has(r) || !this.seen.has(l)) continue;
3201
+ const d = r < l ? `${r}|${l}` : `${l}|${r}`;
3202
+ this.linkSeen.has(d) || (this.linkSeen.add(d), this.links.push({ source: r, target: l }), n = !0);
3203
+ }
3204
+ return n;
3205
+ }
3206
+ snapshot() {
3207
+ return { nodes: [...this.nodes], links: [...this.links] };
3208
+ }
3209
+ }
3210
+ function Ce(t) {
3211
+ const e = {};
3212
+ return t.token && (e.authorization = `Bearer ${t.token}`), t.scope && (e["x-agentglow-scope"] = t.scope), t.run && (e["x-agentglow-run"] = t.run), e;
3213
+ }
3214
+ const Xu = (t, e) => new Promise((n) => {
3215
+ const s = window.setTimeout(n, t);
3216
+ e.addEventListener("abort", () => (window.clearTimeout(s), n()), { once: !0 });
3217
+ });
3218
+ function Ku(t, e, n, s) {
3219
+ const a = new AbortController(), { signal: r } = a;
3220
+ let l = "", d = 2e3, i = 0;
3221
+ return (async () => {
3222
+ for (; !r.aborted; ) {
3223
+ const u = ju(n, l, d);
3224
+ try {
3225
+ const g = { ...e, accept: "text/event-stream" };
3226
+ l && (g["last-event-id"] = l);
3227
+ const c = await fetch(t, { headers: g, cache: "no-store", signal: r });
3228
+ if (c.status === 401 || c.status === 403) return s();
3229
+ if (!c.ok || !c.body) throw new Error(`stream ${c.status}`);
3230
+ i = 0;
3231
+ const m = c.body.pipeThrough(new TextDecoderStream()).getReader();
3232
+ for (; ; ) {
3233
+ const { value: b, done: v } = await m.read();
3234
+ if (v) break;
3235
+ u.feed(b), l = u.lastId, d = u.retry;
3236
+ }
3237
+ } catch {
3238
+ if (r.aborted) return;
3239
+ }
3240
+ l = u.lastId, d = u.retry;
3241
+ const o = Math.min(d * 2 ** i, 3e4) * (0.75 + Math.random() * 0.5);
3242
+ i = Math.min(i + 1, 6), await Xu(o, r);
3243
+ }
3244
+ })(), () => a.abort();
3245
+ }
3246
+ let rt = null, Vs = !1, zs = !1;
3247
+ const Gt = /* @__PURE__ */ new Set(), qt = () => Gt.forEach((t) => t());
3248
+ function Dn(t) {
3249
+ Vs !== t && (Vs = t, qt());
3250
+ }
3251
+ function Ln(t) {
3252
+ zs !== t && (zs = t, qt());
3253
+ }
3254
+ function ya() {
3255
+ return Oe(
3256
+ (t) => (Gt.add(t), () => Gt.delete(t)),
3257
+ () => zs,
3258
+ () => !1
3259
+ );
3260
+ }
3261
+ async function Qu(t, e, n) {
3262
+ const s = (rt == null ? void 0 : rt.source) ?? "", a = (rt == null ? void 0 : rt.auth) ?? {};
3263
+ try {
3264
+ const r = await fetch(`${s}/live/approve`, {
3265
+ method: "POST",
3266
+ headers: { ...Ce(a), "content-type": "application/json" },
3267
+ body: JSON.stringify({ run_id: t, agent_id: e, approve: n })
3268
+ });
3269
+ return (r.status === 404 || r.status === 405) && Ln(!1), (r.status === 401 || r.status === 403) && Js(!0), r.ok ? "ok" : r.status === 409 ? "gone" : "error";
3270
+ } catch {
3271
+ return "error";
3272
+ }
3273
+ }
3274
+ const er = [];
3275
+ let Ma = er;
3276
+ function ba(t) {
3277
+ Ma = t.length ? t : er, qt();
3278
+ }
3279
+ function Yu() {
3280
+ return Oe(
3281
+ (t) => (Gt.add(t), () => Gt.delete(t)),
3282
+ () => Ma,
3283
+ () => er
3284
+ );
3285
+ }
3286
+ async function _u(t, e) {
3287
+ try {
3288
+ const n = await fetch(`${t}/live/run`, { headers: { ...Ce(e), accept: "application/json" }, signal: AbortSignal.timeout(5e3) }), s = n.ok ? await n.json() : {};
3289
+ return Array.isArray(s.workflows) ? s.workflows.filter((a) => a && typeof a.id == "string") : [];
3290
+ } catch {
3291
+ return [];
3292
+ }
3293
+ }
3294
+ function $u() {
3295
+ return Oe(
3296
+ (t) => (Gt.add(t), () => Gt.delete(t)),
3297
+ () => Vs,
3298
+ () => !1
3299
+ );
3300
+ }
3301
+ const xa = "unauthorized";
3302
+ async function td(t, e) {
3303
+ try {
3304
+ const n = await fetch(`${t}/live/health`, { headers: Ce(e), signal: AbortSignal.timeout(2500) });
3305
+ return n.status === 401 || n.status === 403 ? xa : n.ok ? await n.json().catch(() => ({})) ?? {} : null;
3306
+ } catch {
3307
+ return null;
3308
+ }
3309
+ }
3310
+ async function ed(t, e, n) {
3311
+ if (typeof n.run == "boolean") return n.run;
3312
+ try {
3313
+ return (await fetch(`${t}/live/run`, { headers: { ...Ce(e), accept: "application/json" }, signal: AbortSignal.timeout(2500) })).status === 405;
3314
+ } catch {
3315
+ return !1;
3316
+ }
3317
+ }
3318
+ function nd(t, e) {
3319
+ const n = () => {
3320
+ if (!t.dead) {
3321
+ if (Ar("sim"), e === "hf") {
3322
+ h.hasGraph = !1, t.galaxy = qn, t.stop = Hu(), qt();
3323
+ return;
3324
+ }
3325
+ t.stop = Fu(), qt();
3326
+ }
3327
+ };
3328
+ if (e) return n();
3329
+ const s = (a) => {
3330
+ if (!(t.served || !t.events.add(a))) {
3331
+ if (!t.galaxy.nodes.length) {
3332
+ t.galaxy = t.events.snapshot(), qt();
3333
+ return;
3334
+ }
3335
+ t.growTimer || (t.growTimer = window.setTimeout(() => {
3336
+ t.growTimer = 0, !(t.dead || t.served) && (t.galaxy = t.events.snapshot(), qt());
3337
+ }, 700));
3338
+ }
3339
+ };
3340
+ (async () => {
3341
+ const a = await td(t.source, t.auth);
3342
+ if (t.dead) return;
3343
+ const r = () => {
3344
+ t.dead || (Js(!0), Dn(!1), Ln(!1));
3345
+ };
3346
+ if (a === xa) return r();
3347
+ if (!a)
3348
+ return t.galaxy = Aa(), n();
3349
+ Ar("live"), Ln(a.approve === !0);
3350
+ const l = Ce(t.auth);
3351
+ ed(t.source, t.auth, a).then((d) => {
3352
+ t.dead || (Dn(d), d && _u(t.source, t.auth).then((i) => !t.dead && ba(i)));
3353
+ }), fetch(`${t.source}/live/graph`, { headers: l }).then((d) => d.status === 401 || d.status === 403 ? (r(), null) : d.ok ? d.json() : null).then((d) => {
3354
+ var i;
3355
+ !t.dead && ((i = d == null ? void 0 : d.nodes) != null && i.length) && (t.galaxy = d, t.served = !0, Li(d.label ?? "FalkorDB · knowledge graph"), qt());
3356
+ }).catch(() => {
3357
+ }), t.stop = Ku(`${t.source}/live/stream`, l, (d) => {
3358
+ try {
3359
+ const i = JSON.parse(d), u = h.hasGraph;
3360
+ js(i), i.type === "graph" && Array.isArray(i.nodes) && (s(i.nodes), !u && h.hasGraph && qt());
3361
+ } catch {
3362
+ }
3363
+ }, r);
3364
+ })();
3365
+ }
3366
+ function wa(t) {
3367
+ var e;
3368
+ t.dead = !0, (e = t.stop) == null || e.call(t), t.growTimer && window.clearTimeout(t.growTimer), rt === t && (rt = null, Dn(!1), Ln(!1), ba([]));
3369
+ }
3370
+ function sd(t, e, n) {
3371
+ const s = e ? e === "hf" ? "sim:hf" : "sim" : `live:${t}|${n.scope ?? ""}|${n.run ?? ""}|${n.token ?? ""}`;
3372
+ if (rt && rt.key === s && !rt.dead)
3373
+ return rt.refs++, rt;
3374
+ rt && ((rt.source !== t || rt.key.startsWith("sim") || s.startsWith("sim")) && console.warn(`[agentglow] one data source per page: switching from "${rt.source || rt.key}" to "${t || s}"`), wa(rt)), Gi();
3375
+ const a = { key: s, source: t, auth: n, refs: 1, dead: !1, galaxy: e ? Aa() : qn, served: !1, events: new Ju(), growTimer: 0 };
3376
+ return rt = a, nd(a, e), a;
3377
+ }
3378
+ function rd(t) {
3379
+ window.setTimeout(() => {
3380
+ --t.refs <= 0 && wa(t);
3381
+ }, 0);
3382
+ }
3383
+ async function od(t, e) {
3384
+ const n = (rt == null ? void 0 : rt.source) ?? "", s = (rt == null ? void 0 : rt.auth) ?? {}, a = { topic: t, ...s.scope ? { scope: s.scope } : {}, ...e ? { workflow: e } : {} }, r = await fetch(`${n}/live/run`, { method: "POST", headers: { ...Ce(s), "content-type": "application/json" }, body: JSON.stringify(a) });
3385
+ return (r.status === 404 || r.status === 405) && Dn(!1), (r.status === 401 || r.status === 403) && Js(!0), r.ok ? (await r.json().catch(() => ({}))).run_id ?? "started" : null;
3386
+ }
3387
+ function ad() {
3388
+ const { source: t, sim: e, scope: n, run: s, token: a } = Ns(), [r, l] = ut(qn);
3389
+ return ot(() => {
3390
+ const d = sd(t, e, { scope: n || void 0, run: s || void 0, token: a || void 0 }), i = () => l(h.hasGraph ? d.galaxy : qn);
3391
+ return i(), Gt.add(i), () => {
3392
+ Gt.delete(i), rd(d);
3393
+ };
3394
+ }, [t, e, n, s, a]), r;
3395
+ }
3396
+ function Kf(t, e) {
3397
+ const n = t.nodes.findIndex((a) => a.name.toLowerCase() === e.toLowerCase());
3398
+ if (n >= 0) return n;
3399
+ let s = 7;
3400
+ for (const a of e.toLowerCase()) s = s * 31 + a.charCodeAt(0) >>> 0;
3401
+ return t.nodes.length ? s % t.nodes.length : 0;
3402
+ }
3403
+ const id = _a;
3404
+ function ce(t) {
3405
+ return t.replace("run-", "").slice(0, 6);
3406
+ }
3407
+ function lt(t) {
3408
+ const e = h.instances.get(t) ?? h.archive.get(t);
3409
+ if (e) return `${e.name} · ${ce(e.run)}`;
3410
+ const [n, s, a] = t.split(":");
3411
+ return `${s ?? t.slice(0, 6)}${a !== void 0 ? `#${Number(a) + 1}` : ""} · ${ce(n)}`;
3412
+ }
3413
+ function ka(t) {
3414
+ var e;
3415
+ switch (t.type) {
3416
+ case "run":
3417
+ return `run ${t.status} · ${t.topic}`;
3418
+ case "step":
3419
+ return t.status === "waiting" ? `step ${t.step} ${we({ reason: t.reason || "wait", until: t.until ?? 0 })} · ${ce(t.run_id)}` : `step ${t.step} ${t.status} · ${ce(t.run_id)}`;
3420
+ case "spawn":
3421
+ return `spawned ${lt(t.id)}`;
3422
+ case "exit":
3423
+ return `${lt(t.id)} ${t.status}`;
3424
+ case "agent":
3425
+ return t.status === "waiting" && t.reason ? `${lt(t.id)} ${we({ reason: t.reason, until: t.until ?? 0 })}` : `${lt(t.id)} ${t.status}`;
3426
+ case "llm":
3427
+ return t.tokens_in || t.tokens_out ? `${lt(t.id)} · LLM ${t.tokens_in}→${t.tokens_out} tok` : `${lt(t.id)} · thinking…`;
3428
+ // no usage (e.g. Claude Code hooks): no fake 0→0
3429
+ case "message":
3430
+ return `${lt(t.from_id)} → ${lt(t.to_id)}: ${t.text}`;
3431
+ case "tool":
3432
+ return `${lt(t.id)} · ${t.tool}(${t.args_preview})`;
3433
+ case "graph":
3434
+ return `${lt(t.id)} ${t.op === "read" ? "read" : "WROTE"} graph: ${t.nodes.slice(0, 2).join(", ")}`;
3435
+ case "mcp":
3436
+ return t.phase === "call" ? `${lt(t.id)} → mcp ${t.server}.${t.tool}()${t.resource ? ` → ${t.resource}` : ""}` : `mcp ${t.server}.${t.tool} returned${t.latency_ms ? ` · ${Math.round(t.latency_ms)}ms` : ""}`;
3437
+ case "mcp_register":
3438
+ return `mcp server ${t.server} online`;
3439
+ case "skill":
3440
+ return t.status === "start" ? `${lt(t.id)} · skill: ${t.name}` : `${lt(t.id)} · skill: ${t.name} done`;
3441
+ case "decision":
3442
+ return `${lt(t.id)} · ${Co(t)} · ${Math.round(t.ms)}ms${t.why ? ` · ${Ro(t.why)}` : ""}${t.scope === "global" ? " · desk-wide" : ""}`;
3443
+ case "decision_stats":
3444
+ return `${lt(t.id)} · ${t.n} decisions in ${Math.round(t.window_ms)}ms`;
3445
+ case "order":
3446
+ return `${lt(t.id)} · ${Ws(t)}${t.reason ? ` · ${t.reason}` : ""}`;
3447
+ case "final":
3448
+ return `final answer · ${ce(t.run_id)}`;
3449
+ case "chat":
3450
+ return `${t.role === "user" ? "you" : ((e = h.instances.get(t.id)) == null ? void 0 : e.name) ?? "agent"}: ${t.text}`;
3451
+ }
3452
+ }
3453
+ const cd = "#f5b83d";
3454
+ function Gn(t, e) {
3455
+ const n = t.steps[e] === "running" ? t.waits[e] : void 0;
3456
+ return n ? ["waiting", `${e}: ${we(n)}`] : [t.steps[e], `${e}: ${t.steps[e]}`];
3457
+ }
3458
+ const Sa = (t) => t.status === "rejected" || t.status === "cancelled" ? "#94a3b8" : t.side === "sell" || t.side === "no" ? "#fb7185" : "#4ade80";
3459
+ function ld({ data: t }) {
3460
+ if (t.length < 2) return null;
3461
+ const e = Math.max(...t, 1), n = 60, s = 14, a = t.map((r, l) => `${(l + 60 - t.length) / 59 * n},${s - 1 - r / e * (s - 2)}`).join(" ");
3462
+ return /* @__PURE__ */ f("svg", { className: "hud-spark", width: n, height: s, viewBox: `0 0 ${n} ${s}`, "aria-hidden": "true", children: /* @__PURE__ */ f("polyline", { points: a, fill: "none", stroke: "currentColor", strokeWidth: "1.2", strokeLinejoin: "round" }) });
3463
+ }
3464
+ const Oa = (t) => $s(t);
3465
+ function ud(t) {
3466
+ var s;
3467
+ if (t.type === "skill") return cd;
3468
+ if (t.type === "decision") return Oa(t);
3469
+ if (t.type === "order") return Sa(t);
3470
+ const e = "id" in t ? t.id : t.type === "message" ? t.from_id : null, n = e ? h.instances.get(e) : null;
3471
+ return n ? Kt[n.type] : t.type === "graph" ? "#c7d2fe" : t.type === "mcp" ? ((s = h.mcpServers.get(t.server)) == null ? void 0 : s.color) ?? "#94a3b8" : t.type === "run" || t.type === "step" ? "#fde68a" : "#c7d2fe";
3472
+ }
3473
+ function dd(t) {
3474
+ const { hud: e } = Ns();
3475
+ return ot(() => {
3476
+ t.selected && le(t.selected);
3477
+ }, [t.selected]), e ? /* @__PURE__ */ f(gd, { ...t }) : /* @__PURE__ */ f(kt, { children: t.children });
3478
+ }
3479
+ const Is = ["agents", "events", "selected"], As = { agents: "Agents", events: "Events", selected: "Selected" }, fd = 720, Ea = "agentglow.hud.sidebar";
3480
+ function pd() {
3481
+ try {
3482
+ const t = JSON.parse(localStorage.getItem(Ea) ?? "null");
3483
+ if (t && Is.includes(t.tab)) return { collapsed: !!t.collapsed, tab: t.tab === "selected" ? "agents" : t.tab };
3484
+ } catch {
3485
+ }
3486
+ return { collapsed: !1, tab: "agents" };
3487
+ }
3488
+ function hd(t) {
3489
+ try {
3490
+ localStorage.setItem(Ea, JSON.stringify(t));
3491
+ } catch {
3492
+ }
3493
+ }
3494
+ const md = (t) => t >= 1e3 ? `${(t / 1e3).toFixed(1)}k` : `${t}`;
3495
+ function gd({ title: t, subtitle: e, onClose: n, inset: s, children: a }) {
3496
+ const { embedded: r, scope: l, run: d } = Ns(), i = $u(), u = ya(), o = Ee(), g = o.ticker.find((V) => V.type === "decision"), c = wi(), [, m] = ut(0), [b, v] = ut(!1), [p, A] = ut(pd), M = U(null), O = U(!1), C = U(null), x = U(null), S = U(null), N = U({ t0: performance.now(), head: null, at: performance.now(), done: !1 });
3497
+ ot(() => {
3498
+ const V = window.setInterval(() => m((I) => I + 1), 500);
3499
+ return () => clearInterval(V);
3500
+ }, []), Qa(() => {
3501
+ var I;
3502
+ const V = (I = x.current) == null ? void 0 : I.closest(".scene-root");
3503
+ V && V.clientWidth < fd && (O.current = !0, A((nt) => ({ ...nt, collapsed: !0 })));
3504
+ }, []);
3505
+ const T = (V) => {
3506
+ A(V), O.current || hd(V);
3507
+ }, P = o.selected;
3508
+ ot(() => {
3509
+ P && A((V) => (V.tab !== "selected" && (M.current = V), { collapsed: !1, tab: "selected" }));
3510
+ }, [P]), ot(() => {
3511
+ var at;
3512
+ const V = (at = x.current) == null ? void 0 : at.closest(".scene-root");
3513
+ if (!V || typeof ResizeObserver > "u") return;
3514
+ let I = 0;
3515
+ const nt = new ResizeObserver(() => {
3516
+ cancelAnimationFrame(I), I = requestAnimationFrame(() => V.dispatchEvent(new Event(ws)));
3517
+ });
3518
+ return C.current && nt.observe(C.current), x.current && nt.observe(x.current), () => {
3519
+ cancelAnimationFrame(I), nt.disconnect();
3520
+ };
3521
+ }, []);
3522
+ const E = N.current;
3523
+ if (!E.done) {
3524
+ const V = performance.now(), I = o.ticker[0] ?? null;
3525
+ I !== E.head && (E.head = I, E.at = V), I && V - E.at > 1e3 || V - E.t0 > 4e3 ? E.done = !0 : S.current = I;
3526
+ }
3527
+ p.tab === "events" && !p.collapsed && (S.current = o.ticker[0] ?? null);
3528
+ const w = S.current ? o.ticker.indexOf(S.current) : -1, L = p.tab === "events" && !p.collapsed ? 0 : w >= 0 ? w : o.ticker.length, W = [...o.instances.values()].filter(pt), G = [...o.runs.values()].filter((V) => V.status === "started" && !Ze(V)), $ = o.stats.graphReads + o.stats.graphWrites, _ = () => {
3529
+ le(null), n == null || n();
3530
+ const V = M.current ?? { collapsed: p.collapsed, tab: "agents" };
3531
+ M.current = null, T(V);
3532
+ }, et = (V) => T({ collapsed: !1, tab: V }), Q = r ? "" : location.pathname.replace(/\/$/, "").slice(1), B = r ? "" : location.search, Y = Zs(o.selected), H = { agents: W.length ? `${W.length}` : "", events: L ? L >= 60 ? "60+" : `${L}` : "", selected: Y ? "1" : "" };
3533
+ return /* @__PURE__ */ R(kt, { children: [
3534
+ /* @__PURE__ */ R("div", { ref: C, className: `hud-topwrap${p.collapsed ? " is-rail" : ""}`, children: [
3535
+ /* @__PURE__ */ R("header", { className: "hud hud-top", children: [
3536
+ /* @__PURE__ */ R("div", { className: "hud-bar", children: [
3537
+ /* @__PURE__ */ R("div", { className: "hud-title", children: [
3538
+ /* @__PURE__ */ f("span", { className: "hud-dot" }),
3539
+ t
3540
+ ] }),
3541
+ o.mode === "sim" && /* @__PURE__ */ f("span", { className: "hud-badge", children: "sim" }),
3542
+ o.mode === "live" && !o.unauthorized && /* @__PURE__ */ f("span", { className: "hud-badge hud-badge--live", children: "live" }),
3543
+ l && /* @__PURE__ */ f(fo, { label: "scope", value: l }),
3544
+ d && /* @__PURE__ */ f(fo, { label: "run", value: d }),
3545
+ o.unauthorized && /* @__PURE__ */ f("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" }),
3546
+ /* @__PURE__ */ f("button", { className: `hud-info${b ? " on" : ""}`, onClick: () => v((V) => !V), "aria-label": "What am I looking at?", "aria-expanded": b, title: "What am I looking at?", children: "i" }),
3547
+ o.mode === "live" && i && /* @__PURE__ */ f(kd, {}),
3548
+ !r && /* @__PURE__ */ R("select", { className: "hud-theme", value: Q, "aria-label": "Theme", onChange: (V) => location.href = `/${V.target.value}${B}`, children: [
3549
+ /* @__PURE__ */ f("option", { value: "", children: "all themes" }),
3550
+ id.map((V) => /* @__PURE__ */ f("option", { value: V, children: V }, V))
3551
+ ] }),
3552
+ /* @__PURE__ */ R("div", { className: "hud-stats", "aria-label": "Live totals", children: [
3553
+ /* @__PURE__ */ R("span", { className: "hud-stat", title: "active runs", children: [
3554
+ /* @__PURE__ */ f("b", { children: G.length }),
3555
+ " runs"
3556
+ ] }),
3557
+ /* @__PURE__ */ R("span", { className: "hud-stat", title: "agents alive", children: [
3558
+ /* @__PURE__ */ f("b", { children: W.length }),
3559
+ " agents"
3560
+ ] }),
3561
+ /* @__PURE__ */ R("span", { className: "hud-stat", title: "tokens", children: [
3562
+ /* @__PURE__ */ f("b", { children: md(o.stats.tokens) }),
3563
+ " tok"
3564
+ ] }),
3565
+ $ > 0 && /* @__PURE__ */ R("span", { className: "hud-stat", title: `graph reads ${o.stats.graphReads} · writes ${o.stats.graphWrites}`, children: [
3566
+ /* @__PURE__ */ f("b", { children: $ }),
3567
+ " graph"
3568
+ ] }),
3569
+ c && /* @__PURE__ */ R("span", { className: "hud-stat hud-halt", title: `desk-wide halt on ${c.id ? lt(c.id) : "the desk"}: a global guard said no (${[...c.qs].filter(([, V]) => V).map(([V]) => V).join(", ")}); its agents' own denies only flash their halos`, children: [
3570
+ /* @__PURE__ */ f("b", { children: "HALTED" }),
3571
+ " · ",
3572
+ c.reason
3573
+ ] }),
3574
+ o.stats.decisions > 0 && o.rate.perS > 2 && /* @__PURE__ */ R(
3575
+ "span",
3576
+ {
3577
+ className: `hud-stat hud-dec-hv${o.rate.deny > 0.05 && !c ? " is-deny" : ""}`,
3578
+ title: `decisions per second (last 60 s)
3579
+ ${o.stats.decisions} decisions in total
3580
+ ${[...o.decisionProviders].map(([V, I]) => `${He(V)}: ${I.n}`).join(`
3581
+ `)}`,
3582
+ children: [
3583
+ /* @__PURE__ */ R("b", { children: [
3584
+ Math.round(o.rate.perS),
3585
+ "/s"
3586
+ ] }),
3587
+ " · deny ",
3588
+ (o.rate.deny * 100).toFixed(o.rate.deny < 0.1 ? 1 : 0),
3589
+ "% · ",
3590
+ Math.round(o.rate.p50),
3591
+ "/",
3592
+ Math.round(o.rate.p95),
3593
+ " ms",
3594
+ /* @__PURE__ */ f(ld, { data: o.rate.spark })
3595
+ ]
3596
+ }
3597
+ ),
3598
+ o.stats.decisions > 0 && o.rate.perS <= 2 && /* @__PURE__ */ R(
3599
+ "span",
3600
+ {
3601
+ className: `hud-stat hud-dec${g && wt(g) ? " is-deny" : ""}`,
3602
+ title: [...o.decisionProviders].map(([V, I]) => `${He(V)}: ${I.n} · avg ${Math.round(I.ms / I.n)} ms`).join(`
3603
+ `),
3604
+ children: [
3605
+ /* @__PURE__ */ f("b", { children: o.stats.decisions }),
3606
+ " decisions · avg ",
3607
+ Math.round(o.stats.decisionMs / o.stats.decisions),
3608
+ " ms"
3609
+ ]
3610
+ },
3611
+ o.stats.decisions
3612
+ ),
3613
+ o.orders.n > 0 && /* @__PURE__ */ R("span", { className: "hud-stat", title: `orders: ${o.orders.n} · paper ${o.orders.paper} · rejected/cancelled ${o.orders.rejected}`, children: [
3614
+ "orders ",
3615
+ /* @__PURE__ */ f("b", { children: o.orders.n }),
3616
+ o.orders.paper > 0 && o.orders.paper === o.orders.n ? " (paper)" : o.orders.paper > 0 ? ` (${o.orders.paper} paper)` : ""
3617
+ ] }),
3618
+ o.stats.mcpCalls > 0 && /* @__PURE__ */ R("span", { className: "hud-stat", title: "MCP calls", children: [
3619
+ /* @__PURE__ */ f("b", { children: o.stats.mcpCalls }),
3620
+ " MCP"
3621
+ ] })
3622
+ ] })
3623
+ ] }),
3624
+ b && /* @__PURE__ */ f("div", { className: "hud-sub", children: e })
3625
+ ] }),
3626
+ /* @__PURE__ */ R("div", { className: "hud-dock", children: [
3627
+ /* @__PURE__ */ f(Md, {}),
3628
+ s
3629
+ ] })
3630
+ ] }),
3631
+ /* @__PURE__ */ R("aside", { ref: x, className: `hud hud-side${p.collapsed ? " is-rail" : ""}`, "aria-label": "Agent sidebar", children: [
3632
+ p.collapsed ? /* @__PURE__ */ R("nav", { className: "hs-rail", children: [
3633
+ /* @__PURE__ */ f("button", { className: "hs-collapse", onClick: () => T({ ...p, collapsed: !1 }), "aria-label": "Expand sidebar", title: "Expand sidebar", children: "«" }),
3634
+ Is.map((V) => /* @__PURE__ */ R("button", { className: `hs-icon${p.tab === V ? " on" : ""}`, onClick: () => et(V), "aria-label": `${As[V]}${H[V] ? ` (${H[V]})` : ""}`, title: As[V], children: [
3635
+ /* @__PURE__ */ f(vd, { tab: V }),
3636
+ H[V] && /* @__PURE__ */ f("em", { children: V === "selected" ? "" : H[V] })
3637
+ ] }, V))
3638
+ ] }) : /* @__PURE__ */ R("div", { className: "hs-head", role: "tablist", "aria-label": "Sidebar", children: [
3639
+ Is.map((V) => /* @__PURE__ */ R("button", { role: "tab", "aria-selected": p.tab === V, className: p.tab === V ? "on" : "", onClick: () => et(V), children: [
3640
+ As[V],
3641
+ H[V] && V !== "selected" && /* @__PURE__ */ f("em", { children: H[V] })
3642
+ ] }, V)),
3643
+ /* @__PURE__ */ f("button", { className: "hs-collapse", onClick: () => T({ ...p, collapsed: !0 }), "aria-label": "Collapse sidebar", title: "Collapse sidebar", children: "»" })
3644
+ ] }),
3645
+ /* @__PURE__ */ f("div", { className: "hs-body", hidden: p.collapsed || p.tab !== "agents", children: /* @__PURE__ */ f(Vd, {}) }),
3646
+ /* @__PURE__ */ f("div", { className: "hs-body", hidden: p.collapsed || p.tab !== "events", children: /* @__PURE__ */ f(yd, {}) }),
3647
+ /* @__PURE__ */ f("div", { className: "hs-body", hidden: p.collapsed || p.tab !== "selected", children: Y ? /* @__PURE__ */ R(kt, { children: [
3648
+ /* @__PURE__ */ f("div", { className: "ap-head", children: /* @__PURE__ */ f("button", { className: "ap-link", onClick: _, "aria-label": "Close agent inspector", children: "← back" }) }),
3649
+ /* @__PURE__ */ f(zd, { i: Y })
3650
+ ] }) : /* @__PURE__ */ f("p", { className: "hs-empty", children: "Click an agent in the scene, the Agents list or the Events log to inspect it." }) })
3651
+ ] }),
3652
+ o.mode === "live" && u && /* @__PURE__ */ f(Cd, { rail: p.collapsed }),
3653
+ a
3654
+ ] });
3655
+ }
3656
+ function vd({ tab: t }) {
3657
+ const e = { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", "aria-hidden": !0 };
3658
+ return t === "agents" ? /* @__PURE__ */ R("svg", { ...e, children: [
3659
+ /* @__PURE__ */ f("circle", { cx: "5", cy: "5", r: "2.2" }),
3660
+ /* @__PURE__ */ f("circle", { cx: "11.5", cy: "6.5", r: "1.8" }),
3661
+ /* @__PURE__ */ f("circle", { cx: "6.5", cy: "11.5", r: "1.8" }),
3662
+ /* @__PURE__ */ f("path", { d: "M6.8 6.3l3 0.6M5.4 7.2l0.7 2.4" })
3663
+ ] }) : t === "events" ? /* @__PURE__ */ R("svg", { ...e, children: [
3664
+ /* @__PURE__ */ f("path", { d: "M5.5 4h8M5.5 8h8M5.5 12h6" }),
3665
+ /* @__PURE__ */ f("circle", { cx: "2.5", cy: "4", r: "0.6", fill: "currentColor" }),
3666
+ /* @__PURE__ */ f("circle", { cx: "2.5", cy: "8", r: "0.6", fill: "currentColor" }),
3667
+ /* @__PURE__ */ f("circle", { cx: "2.5", cy: "12", r: "0.6", fill: "currentColor" })
3668
+ ] }) : /* @__PURE__ */ R("svg", { ...e, children: [
3669
+ /* @__PURE__ */ f("circle", { cx: "8", cy: "8", r: "5" }),
3670
+ /* @__PURE__ */ f("circle", { cx: "8", cy: "8", r: "1.6", fill: "currentColor" }),
3671
+ /* @__PURE__ */ f("path", { d: "M8 1v2M8 13v2M1 8h2M13 8h2" })
3672
+ ] });
3673
+ }
3674
+ function Ad(t) {
3675
+ const e = "id" in t ? t.id : t.type === "message" ? t.from_id : null;
3676
+ return e && Zs(e) ? e : null;
3677
+ }
3678
+ function yd() {
3679
+ const t = Ee();
3680
+ return t.ticker.length ? /* @__PURE__ */ f("ul", { className: "hs-events", children: t.ticker.map((e, n) => {
3681
+ const s = Ad(e), a = /* @__PURE__ */ R(kt, { children: [
3682
+ /* @__PURE__ */ f("i", {}),
3683
+ e.type === "skill" && /* @__PURE__ */ f("b", { className: "hs-skill", children: e.status === "start" ? "skill" : "skill done" }),
3684
+ e.type === "decision" && /* @__PURE__ */ f("b", { className: "hs-dec", children: wt(e) ? "DENY" : wn(e.kind) }),
3685
+ /* @__PURE__ */ f("span", { children: ka(e) })
3686
+ ] });
3687
+ return /* @__PURE__ */ f("li", { className: e.type === "skill" ? "is-skill" : e.type === "decision" ? wt(e) ? "is-dec is-deny" : "is-dec" : void 0, style: { "--c": ud(e) }, children: s ? /* @__PURE__ */ f("button", { onClick: () => le(s), title: "Inspect agent", children: a }) : /* @__PURE__ */ f("div", { children: a }) }, `${e.ts}-${e.type}-${n}`);
3688
+ }) }) : /* @__PURE__ */ f("p", { className: "hs-empty", children: "Waiting for events…" });
3689
+ }
3690
+ function Md() {
3691
+ const t = Dc();
3692
+ return t.crowded ? t.showAll ? /* @__PURE__ */ R("div", { className: "hud hud-lod", children: [
3693
+ /* @__PURE__ */ f("i", {}),
3694
+ /* @__PURE__ */ R("span", { children: [
3695
+ "showing all ",
3696
+ /* @__PURE__ */ f("b", { children: t.alive }),
3697
+ " agents"
3698
+ ] }),
3699
+ /* @__PURE__ */ f("button", { onClick: () => Nr(!1), children: "group" })
3700
+ ] }) : t.activeClusters ? /* @__PURE__ */ R("div", { className: "hud hud-lod", children: [
3701
+ /* @__PURE__ */ f("i", {}),
3702
+ /* @__PURE__ */ R("span", { children: [
3703
+ "grouped: ",
3704
+ /* @__PURE__ */ f("b", { children: t.collapsedRuns }),
3705
+ " run",
3706
+ t.collapsedRuns === 1 ? "" : "s",
3707
+ " in ",
3708
+ /* @__PURE__ */ f("b", { children: t.activeClusters }),
3709
+ " cluster",
3710
+ t.activeClusters === 1 ? "" : "s"
3711
+ ] }),
3712
+ t.expandedLane >= 0 && /* @__PURE__ */ f("button", { onClick: qc, children: "collapse" }),
3713
+ /* @__PURE__ */ f("button", { onClick: () => Nr(!0), children: "show all" })
3714
+ ] }) : null : null;
3715
+ }
3716
+ const uo = ["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?"];
3717
+ let bd = 0;
3718
+ function fo({ label: t, value: e }) {
3719
+ const n = e.length > 18 ? `${e.slice(0, 16)}…` : e;
3720
+ return /* @__PURE__ */ R("span", { className: "hud-badge hud-chip", title: `${t}: ${e}`, children: [
3721
+ t,
3722
+ ": ",
3723
+ /* @__PURE__ */ f("b", { children: n })
3724
+ ] });
3725
+ }
3726
+ const Ta = "agentglow.hud.workflow";
3727
+ function xd() {
3728
+ try {
3729
+ return localStorage.getItem(Ta) ?? "";
3730
+ } catch {
3731
+ return "";
3732
+ }
3733
+ }
3734
+ function wd(t) {
3735
+ try {
3736
+ localStorage.setItem(Ta, t);
3737
+ } catch {
3738
+ }
3739
+ }
3740
+ function kd() {
3741
+ const t = Yu(), [e, n] = ut(xd), [s, a] = ut(!1), [r, l] = ut(""), d = t.find((o) => o.id === e) ?? t[0], i = async () => {
3742
+ const o = (d == null ? void 0 : d.topic) || uo[bd++ % uo.length];
3743
+ a(!0);
3744
+ try {
3745
+ l(await od(o, d == null ? void 0 : d.id) ? `started · ${o}` : "failed to start"), window.setTimeout(() => l(""), 6e3);
3746
+ } finally {
3747
+ a(!1);
3748
+ }
3749
+ }, u = (o) => {
3750
+ n(o), wd(o);
3751
+ };
3752
+ return /* @__PURE__ */ R("div", { className: "hud-run", children: [
3753
+ t.length > 1 && /* @__PURE__ */ f("select", { value: d == null ? void 0 : d.id, onChange: (o) => u(o.target.value), disabled: s, "aria-label": "Workflow to run", title: d == null ? void 0 : d.topic, children: t.map((o) => /* @__PURE__ */ f("option", { value: o.id, children: o.label }, o.id)) }),
3754
+ /* @__PURE__ */ f("button", { onClick: i, disabled: s, title: (d == null ? void 0 : d.topic) || void 0, children: s ? "Starting…" : "▶ Run agents" }),
3755
+ r && /* @__PURE__ */ f("span", { children: r })
3756
+ ] });
3757
+ }
3758
+ function Ca(t) {
3759
+ return pt(t) && t.status === "waiting" && !!t.wait && /human|approv/i.test(t.wait.reason);
3760
+ }
3761
+ const jt = /* @__PURE__ */ new Map(), Wn = /* @__PURE__ */ new Set(), Ra = (t) => {
3762
+ var e, n;
3763
+ return `${t.id}|${(e = t.wait) == null ? void 0 : e.reason}|${(n = t.wait) == null ? void 0 : n.until}`;
3764
+ };
3765
+ async function po(t, e) {
3766
+ const n = Ra(t), s = (r) => {
3767
+ jt.set(n, r), jt.size > 500 && jt.delete(jt.keys().next().value), Wn.forEach((l) => l());
3768
+ };
3769
+ s(e ? "approving" : "rejecting"), setTimeout(() => {
3770
+ const r = jt.get(n);
3771
+ r && r !== "error" && r !== "gone" && (jt.delete(n), Wn.forEach((l) => l()));
3772
+ }, Sd);
3773
+ const a = await Qu(t.run, t.id, e);
3774
+ jt.has(n) && s(a === "ok" ? e ? "approved" : "rejected" : a);
3775
+ }
3776
+ const Sd = 1e4, Od = 1e4;
3777
+ function Ed(t, e) {
3778
+ var s;
3779
+ const n = (s = t.wait) == null ? void 0 : s.until;
3780
+ return n ? e < n ? [`${Math.round((n - e) / 1e3)}s`, ""] : e - n < Od ? ["auto-approve due", "due"] : ["overdue", "overdue"] : ["", ""];
3781
+ }
3782
+ const Td = {
3783
+ approving: "approving…",
3784
+ rejecting: "rejecting…",
3785
+ approved: "approved · resuming…",
3786
+ rejected: "rejected · resuming…",
3787
+ gone: "no longer waiting",
3788
+ error: "failed, try again"
3789
+ };
3790
+ function Pa({ i: t, compact: e }) {
3791
+ var r, l;
3792
+ const [, n] = ut(0);
3793
+ ot(() => {
3794
+ const d = () => n((i) => i + 1);
3795
+ return Wn.add(d), () => void Wn.delete(d);
3796
+ }, []);
3797
+ const s = jt.get(Ra(t));
3798
+ return /* @__PURE__ */ R("div", { className: `hud-approve${e ? " is-compact" : ""}`, "data-verdict": s, children: [
3799
+ !(s !== void 0 && s !== "error") && /* @__PURE__ */ R(kt, { children: [
3800
+ /* @__PURE__ */ f("button", { className: "ha-yes", onClick: () => po(t, !0), title: `Approve: ${(r = t.wait) == null ? void 0 : r.reason}`, children: "Approve" }),
3801
+ /* @__PURE__ */ f("button", { className: "ha-no", onClick: () => po(t, !1), title: `Reject: ${(l = t.wait) == null ? void 0 : l.reason}`, children: "Reject" })
3802
+ ] }),
3803
+ s && /* @__PURE__ */ f("span", { role: "status", children: Td[s] })
3804
+ ] });
3805
+ }
3806
+ const ys = 3;
3807
+ function Cd({ rail: t }) {
3808
+ const e = Ee(), [, n] = ut(0);
3809
+ ot(() => {
3810
+ const r = setInterval(() => n((l) => l + 1), 1e3);
3811
+ return () => clearInterval(r);
3812
+ }, []);
3813
+ const s = [...e.instances.values()].filter(Ca).sort((r, l) => (r.wait.until || 1 / 0) - (l.wait.until || 1 / 0));
3814
+ if (!s.length) return null;
3815
+ const a = Date.now();
3816
+ return /* @__PURE__ */ R("section", { className: `hud hud-approvals${t ? " is-rail" : ""}`, "aria-label": "Agents waiting on you", children: [
3817
+ /* @__PURE__ */ R("h4", { children: [
3818
+ "Needs you ",
3819
+ /* @__PURE__ */ f("em", { children: s.length })
3820
+ ] }),
3821
+ /* @__PURE__ */ f("ul", { children: s.slice(0, ys).map((r) => {
3822
+ const l = Ze(e.runs.get(r.run)), [d, i] = l ? [Fs, "overdue"] : Ed(r, a);
3823
+ return /* @__PURE__ */ R("li", { style: { "--c": Kt[r.type] }, children: [
3824
+ /* @__PURE__ */ R("button", { className: "ha-who", onClick: () => le(r.id), title: `${r.name} · ${ce(r.run)}
3825
+ ${we(r.wait)}`, children: [
3826
+ /* @__PURE__ */ f("i", {}),
3827
+ /* @__PURE__ */ f("b", { children: r.name }),
3828
+ /* @__PURE__ */ R("span", { children: [
3829
+ r.wait.reason,
3830
+ d && (i ? /* @__PURE__ */ R("em", { className: `ha-late is-${i}`, children: [
3831
+ " · ",
3832
+ d
3833
+ ] }) : ` · ${d}`)
3834
+ ] })
3835
+ ] }),
3836
+ !l && /* @__PURE__ */ f(Pa, { i: r, compact: !0 })
3837
+ ] }, r.id);
3838
+ }) }),
3839
+ s.length > ys && /* @__PURE__ */ R("p", { children: [
3840
+ "+",
3841
+ s.length - ys,
3842
+ " more waiting (Agents → waiting)"
3843
+ ] })
3844
+ ] });
3845
+ }
3846
+ const Rd = ["all", "alive", "thinking", "waiting", "done"];
3847
+ function Pd(t, e) {
3848
+ return e === "all" ? !0 : e === "alive" ? pt(t) : e === "done" ? !pt(t) : pt(t) && t.status === e;
3849
+ }
3850
+ function Va(t) {
3851
+ return t.status === "thinking" && t.tokens === 0 ? "working" : t.status;
3852
+ }
3853
+ function za(t) {
3854
+ const e = ((t.doneAt || t.exitAt || performance.now()) - t.bornAt) / 1e3;
3855
+ return e < 60 ? `${e.toFixed(0)}s` : `${(e / 60).toFixed(1)}m`;
3856
+ }
3857
+ function Ms(t) {
3858
+ return !pt(t) || !t.skill || t.skillEndAt ? "" : t.skill;
3859
+ }
3860
+ function Vd() {
3861
+ const t = Ee(), [e, n] = ut(""), [s, a] = ut(/* @__PURE__ */ new Set()), [r, l] = ut("alive"), [d, i] = ut(""), u = st(() => [...t.instances.values(), ...[...t.archive.values()].reverse()], [t.instances.size, t.archive.size, t.ticker]), o = st(() => {
3862
+ var A;
3863
+ const p = /* @__PURE__ */ new Map();
3864
+ for (const M of u) p.set(M.run, ((A = t.runs.get(M.run)) == null ? void 0 : A.topic) ?? M.run);
3865
+ return [...p];
3866
+ }, [u]), g = e.trim().toLowerCase(), c = u.filter((p) => s.size ? s.has(p.name) : !0).filter((p) => Pd(p, r)).filter((p) => d ? p.run === d : !0).filter((p) => {
3867
+ var M;
3868
+ if (!g) return !0;
3869
+ const A = ((M = t.runs.get(p.run)) == null ? void 0 : M.topic) ?? "";
3870
+ return `${p.id} ${p.name} ${A} ${[...p.nodes].join(" ")}`.toLowerCase().includes(g);
3871
+ }).sort((p, A) => +!pt(p) - +!pt(A) || +(A.status === "thinking") - +(p.status === "thinking") || A.bornAt - p.bornAt), m = c.slice(0, 150), b = st(() => {
3872
+ const p = /* @__PURE__ */ new Map();
3873
+ for (const A of u) {
3874
+ const M = p.get(A.name) ?? { color: Kt[A.type], alive: 0 };
3875
+ pt(A) && M.alive++, p.set(A.name, M);
3876
+ }
3877
+ return [...p].slice(0, 12);
3878
+ }, [u]), v = (p) => a((A) => {
3879
+ const M = new Set(A);
3880
+ return M.has(p) ? M.delete(p) : M.add(p), M;
3881
+ });
3882
+ return /* @__PURE__ */ R(kt, { children: [
3883
+ /* @__PURE__ */ R("div", { className: "ap-searchrow", children: [
3884
+ /* @__PURE__ */ f("input", { className: "ap-search", value: e, onChange: (p) => n(p.target.value), placeholder: "Search agent or run topic…", "aria-label": "Search agents" }),
3885
+ /* @__PURE__ */ R("span", { className: "ap-count", title: "matching / all agents", children: [
3886
+ c.length,
3887
+ c.length !== u.length ? ` / ${u.length}` : ""
3888
+ ] })
3889
+ ] }),
3890
+ /* @__PURE__ */ f("div", { className: "ap-chips", children: b.map(([p, A]) => /* @__PURE__ */ R("button", { className: s.has(p) ? "on" : "", "aria-pressed": s.has(p), style: { "--c": A.color }, onClick: () => v(p), children: [
3891
+ /* @__PURE__ */ f("i", {}),
3892
+ p,
3893
+ /* @__PURE__ */ f("em", { children: A.alive || "" })
3894
+ ] }, p)) }),
3895
+ /* @__PURE__ */ R("div", { className: "ap-row-filters", children: [
3896
+ /* @__PURE__ */ f("div", { className: "ap-seg", children: Rd.map((p) => /* @__PURE__ */ f("button", { className: r === p ? "on" : "", "aria-pressed": r === p, onClick: () => l(p), children: p }, p)) }),
3897
+ /* @__PURE__ */ R("select", { value: d, "aria-label": "Filter by run", onChange: (p) => i(p.target.value), children: [
3898
+ /* @__PURE__ */ f("option", { value: "", children: "all runs" }),
3899
+ o.map(([p, A]) => /* @__PURE__ */ f("option", { value: p, children: A }, p))
3900
+ ] })
3901
+ ] }),
3902
+ /* @__PURE__ */ R("ul", { className: "ap-list", children: [
3903
+ m.map((p) => {
3904
+ var A;
3905
+ return /* @__PURE__ */ f("li", { children: /* @__PURE__ */ R("button", { onClick: () => le(p.id), style: { "--c": Kt[p.type] }, className: pt(p) ? "" : "is-done", children: [
3906
+ /* @__PURE__ */ f("i", { "data-status": pt(p) ? p.status : "done" }),
3907
+ /* @__PURE__ */ R("span", { className: "ap-name", children: [
3908
+ /* @__PURE__ */ R("span", { className: "ap-title", children: [
3909
+ lt(p.id),
3910
+ Ms(p) && /* @__PURE__ */ f("em", { className: "ap-skill", title: `using skill ${Ms(p)}`, children: Ms(p) })
3911
+ ] }),
3912
+ /* @__PURE__ */ f("small", { children: ((A = t.runs.get(p.run)) == null ? void 0 : A.topic) ?? "finished run" })
3913
+ ] }),
3914
+ /* @__PURE__ */ R("span", { className: "ap-meta", children: [
3915
+ /* @__PURE__ */ f("b", { children: Va(p) }),
3916
+ (p.tokens / 1e3).toFixed(1),
3917
+ "k · ",
3918
+ za(p)
3919
+ ] })
3920
+ ] }) }, p.id);
3921
+ }),
3922
+ c.length > m.length && /* @__PURE__ */ R("li", { className: "ap-more", children: [
3923
+ "+",
3924
+ c.length - m.length,
3925
+ " more - refine the filter"
3926
+ ] }),
3927
+ c.length === 0 && /* @__PURE__ */ f("li", { className: "ap-more", children: "No agents match." })
3928
+ ] })
3929
+ ] });
3930
+ }
3931
+ function ho(t) {
3932
+ const e = t.stepOrder.find((n) => Gn(t, n)[0] === "waiting");
3933
+ return e ? Gn(t, e)[1] : "";
3934
+ }
3935
+ function zd({ i: t }) {
3936
+ const e = Ee(), n = ya() && e.mode === "live", s = e.runs.get(t.run), a = s != null && s.hasSteps ? Lo(s) : null, r = Zs(t.parent), l = [...e.instances.values(), ...e.archive.values()].filter((i) => i.parent === t.id), d = [...e.mcpPending.values()].filter((i) => i.instance === t.id);
3937
+ return /* @__PURE__ */ R("div", { className: "ap-detail", style: { "--c": Kt[t.type] }, children: [
3938
+ /* @__PURE__ */ R("h3", { children: [
3939
+ /* @__PURE__ */ f("i", {}),
3940
+ " ",
3941
+ t.name,
3942
+ " ",
3943
+ /* @__PURE__ */ R("small", { children: [
3944
+ t.subagent ? "subagent" : "agent",
3945
+ " · ",
3946
+ ce(t.run)
3947
+ ] })
3948
+ ] }),
3949
+ /* @__PURE__ */ R("div", { className: "ap-status", "data-status": pt(t) ? t.status : "done", children: [
3950
+ pt(t) ? t.status === "waiting" && t.wait ? we(t.wait) : Va(t) : `finished (${t.status})`,
3951
+ " · alive ",
3952
+ za(t)
3953
+ ] }),
3954
+ n && Ca(t) && /* @__PURE__ */ f(Pa, { i: t }),
3955
+ /* @__PURE__ */ R("dl", { className: "ap-stats", children: [
3956
+ /* @__PURE__ */ R("div", { children: [
3957
+ /* @__PURE__ */ f("dt", { children: "tokens" }),
3958
+ /* @__PURE__ */ R("dd", { title: "prompt + completion tokens; cached = prompt-cache reads, already counted in the prompt", children: [
3959
+ (t.tokens / 1e3).toFixed(1),
3960
+ "k",
3961
+ t.tokensCached > 0 ? ` (${(t.tokensCached / 1e3).toFixed(1)}k cached)` : ""
3962
+ ] })
3963
+ ] }),
3964
+ /* @__PURE__ */ R("div", { children: [
3965
+ /* @__PURE__ */ f("dt", { children: "LLM calls" }),
3966
+ /* @__PURE__ */ f("dd", { children: t.llmCalls })
3967
+ ] }),
3968
+ /* @__PURE__ */ R("div", { children: [
3969
+ /* @__PURE__ */ f("dt", { children: "tool calls" }),
3970
+ /* @__PURE__ */ f("dd", { children: t.toolCalls })
3971
+ ] }),
3972
+ /* @__PURE__ */ R("div", { children: [
3973
+ /* @__PURE__ */ f("dt", { children: "MCP calls" }),
3974
+ /* @__PURE__ */ f("dd", { children: t.mcpCalls })
3975
+ ] })
3976
+ ] }),
3977
+ /* @__PURE__ */ R("section", { children: [
3978
+ /* @__PURE__ */ f("h4", { children: "Run" }),
3979
+ /* @__PURE__ */ f("p", { children: s ? s.topic : t.run }),
3980
+ s && Ze(s) && /* @__PURE__ */ f("p", { className: "ap-wait", children: Fs }),
3981
+ s && ho(s) && /* @__PURE__ */ f("p", { className: "ap-wait", children: ho(s) }),
3982
+ s && a && /* @__PURE__ */ R("div", { className: "ap-steps", children: [
3983
+ a.shown.map((i) => {
3984
+ const [u, o] = Gn(s, i);
3985
+ return /* @__PURE__ */ f("span", { "data-status": u, title: o, children: i }, i);
3986
+ }),
3987
+ a.more > 0 && /* @__PURE__ */ R("span", { title: s.stepOrder.slice(-a.more).map((i) => Gn(s, i)[1]).join(`
3988
+ `), children: [
3989
+ "+",
3990
+ a.more
3991
+ ] })
3992
+ ] })
3993
+ ] }),
3994
+ (r || l.length > 0) && /* @__PURE__ */ R("section", { children: [
3995
+ /* @__PURE__ */ f("h4", { children: "Lineage" }),
3996
+ r && /* @__PURE__ */ R("button", { className: "ap-chip-link", style: { "--c": Kt[r.type] }, onClick: () => le(r.id), children: [
3997
+ "↑ spawned by ",
3998
+ lt(r.id)
3999
+ ] }),
4000
+ l.map((i) => /* @__PURE__ */ R("button", { className: "ap-chip-link", style: { "--c": Kt[i.type] }, onClick: () => le(i.id), children: [
4001
+ "↓ ",
4002
+ lt(i.id),
4003
+ " ",
4004
+ Us(i) ? "✓" : ""
4005
+ ] }, i.id))
4006
+ ] }),
4007
+ t.skills.size > 0 && /* @__PURE__ */ R("section", { children: [
4008
+ /* @__PURE__ */ f("h4", { children: "Skills used" }),
4009
+ /* @__PURE__ */ f("div", { className: "ap-skills", children: [...t.skills].map(([i, u]) => /* @__PURE__ */ R("span", { className: u.active && pt(t) ? "on" : "", title: u.active && pt(t) ? "in use now" : `used ${u.count}x`, children: [
4010
+ i,
4011
+ /* @__PURE__ */ R("em", { children: [
4012
+ u.count,
4013
+ "x"
4014
+ ] })
4015
+ ] }, i)) })
4016
+ ] }),
4017
+ t.hv && /* @__PURE__ */ R("section", { children: [
4018
+ /* @__PURE__ */ R("h4", { children: [
4019
+ "Decision rate ",
4020
+ Gs(t) ? "" : "(quiet)"
4021
+ ] }),
4022
+ /* @__PURE__ */ R("p", { className: "ap-hv", children: [
4023
+ ri(t.hv),
4024
+ " · p95 ",
4025
+ Math.round(t.hv.p95),
4026
+ "ms"
4027
+ ] }),
4028
+ /* @__PURE__ */ f("div", { className: "ap-hv-bar", title: "outcome mix (smoothed)", children: t.hv.seg.map(
4029
+ (i, u) => i > 5e-3 ? /* @__PURE__ */ f("span", { style: { flexGrow: i, background: To[u] }, title: `${Id(u)} ${Math.round(i * 100)}%` }, u) : null
4030
+ ) })
4031
+ ] }),
4032
+ t.orders.length > 0 && /* @__PURE__ */ R("section", { children: [
4033
+ /* @__PURE__ */ f("h4", { children: "Orders" }),
4034
+ /* @__PURE__ */ f("ul", { className: "ap-decisions", children: [...t.orders].reverse().map((i, u) => /* @__PURE__ */ R("li", { className: i.status === "rejected" || i.status === "cancelled" ? "is-strike" : void 0, style: { "--c": Sa(i) }, title: i.reason || i.instrument, children: [
4035
+ /* @__PURE__ */ f("b", { children: i.dry_run ? "paper" : i.status }),
4036
+ /* @__PURE__ */ f("span", { children: Ws(i) }),
4037
+ /* @__PURE__ */ f("em", { children: i.instrument })
4038
+ ] }, u)) })
4039
+ ] }),
4040
+ t.decisions.length > 0 && /* @__PURE__ */ R("section", { children: [
4041
+ /* @__PURE__ */ f("h4", { children: t.hv ? "Interesting decisions" : "Decisions" }),
4042
+ /* @__PURE__ */ f("ul", { className: "ap-decisions", children: [...t.decisions].reverse().map((i, u) => {
4043
+ var o;
4044
+ return /* @__PURE__ */ R("li", { className: wt(i) ? "is-deny" : void 0, style: { "--c": Oa(i) }, title: `${wn(i.kind)} · ${He(i.provider)} · ${i.question}${(o = i.options) != null && o.length ? `
4045
+ ` + i.options.map((g) => `${g.name} ${Math.round(g.p * 100)}%`).join(`
4046
+ `) : ""}`, children: [
4047
+ /* @__PURE__ */ f("b", { children: i.why ? Ro(i.why) : wt(i) ? "DENY" : wn(i.kind) }),
4048
+ /* @__PURE__ */ f("span", { children: Co(i) }),
4049
+ /* @__PURE__ */ R("em", { children: [
4050
+ Math.round(i.ms),
4051
+ "ms"
4052
+ ] })
4053
+ ] }, u);
4054
+ }) })
4055
+ ] }),
4056
+ d.length > 0 && /* @__PURE__ */ R("section", { children: [
4057
+ /* @__PURE__ */ f("h4", { children: "Waiting on MCP" }),
4058
+ d.map((i) => /* @__PURE__ */ R("p", { className: "ap-wait", children: [
4059
+ i.server,
4060
+ ".",
4061
+ i.tool,
4062
+ "() · ",
4063
+ Ni(i).toFixed(1),
4064
+ "s"
4065
+ ] }, i.key))
4066
+ ] }),
4067
+ t.chat.length > 0 && /* @__PURE__ */ R("section", { children: [
4068
+ /* @__PURE__ */ f("h4", { children: "Conversation" }),
4069
+ /* @__PURE__ */ f("ul", { className: "ap-chat", children: t.chat.map((i, u) => /* @__PURE__ */ R("li", { "data-role": i.role, children: [
4070
+ /* @__PURE__ */ R("b", { children: [
4071
+ i.role === "user" ? "you" : t.name,
4072
+ ":"
4073
+ ] }),
4074
+ " ",
4075
+ i.text
4076
+ ] }, u)) })
4077
+ ] }),
4078
+ /* @__PURE__ */ R("section", { children: [
4079
+ /* @__PURE__ */ f("h4", { children: "Activity" }),
4080
+ /* @__PURE__ */ f("ul", { className: "ap-events", children: t.recent.map((i, u) => /* @__PURE__ */ f("li", { children: ka(i) }, u)) })
4081
+ ] })
4082
+ ] });
4083
+ }
4084
+ function Id(t) {
4085
+ const e = qs[t];
4086
+ if (e.startsWith("r") && e.length === 2) {
4087
+ for (const [n, s] of ve) if (`r${s}` === e) return n;
4088
+ }
4089
+ return e === "yes" ? "check yes" : e === "no" ? "check no" : e;
4090
+ }
4091
+ const Nd = 0.7, mo = 0.45, go = 0.32, mn = new y.Color("#ef4444"), vo = 0.75, Fn = "__kitDim", qd = y.Object3D.prototype.onBeforeRender;
4092
+ function Dd(t, e, n, s, a) {
4093
+ var o, g, c, m;
4094
+ const r = this.userData[Fn];
4095
+ if (!r || r.k <= 2e-3 && r.red <= 2e-3 || Array.isArray(a)) return;
4096
+ const l = a, d = 1 - Nd * r.k;
4097
+ r.hasColor = !!((o = l.color) != null && o.isColor), r.hasColor && (r.color.copy(l.color), l.color.multiplyScalar(d), r.failed && l.color.lerp(mn, go * r.k * 0.6), r.red > 2e-3 && l.color.lerp(mn, vo * r.red)), r.hasEmissive = !!((g = l.emissive) != null && g.isColor), r.hasEmissive && (r.emissive.copy(l.emissive), l.emissive.multiplyScalar(d), r.failed && l.emissive.lerp(mn, go * r.k * 0.4), r.red > 2e-3 && l.emissive.lerp(mn, vo * r.red), r.ei = l.emissiveIntensity ?? 1);
4098
+ const i = ((c = l.uniforms) == null ? void 0 : c.uOpacity) ?? ((m = l.uniforms) == null ? void 0 : m.opacity), u = !!i && typeof i.value == "number";
4099
+ r.op = l.opacity, u && (r.uop = i.value), l.transparent && (l.opacity = r.op * (1 - mo * r.k)), u && (i.value = r.uop * (1 - mo * r.k)), r.on = !0, t.state.useProgram(null);
4100
+ }
4101
+ function Ld(t, e, n, s, a) {
4102
+ var i, u;
4103
+ const r = this.userData[Fn];
4104
+ if (!r || !r.on) return;
4105
+ r.on = !1;
4106
+ const l = a;
4107
+ r.hasColor && l.color.copy(r.color), r.hasEmissive && (l.emissive.copy(r.emissive), l.emissiveIntensity = r.ei), l.opacity = r.op;
4108
+ const d = ((i = l.uniforms) == null ? void 0 : i.uOpacity) ?? ((u = l.uniforms) == null ? void 0 : u.opacity);
4109
+ d && typeof d.value == "number" && (d.value = r.uop), t.state.useProgram(null);
4110
+ }
4111
+ let Ia = 0, Na = !1, qa = 0;
4112
+ function Da(t) {
4113
+ if (t.userData.kitNoDim) return;
4114
+ if (t.isMesh || t.isLine || t.isPoints || t.isSprite) {
4115
+ let s = t.userData[Fn];
4116
+ if (!s) {
4117
+ if (t.onBeforeRender !== qd) return;
4118
+ s = { k: 0, failed: !1, red: 0, on: !1, color: new y.Color(), emissive: new y.Color(), hasColor: !1, hasEmissive: !1, ei: 1, op: 1, uop: 1 }, t.userData[Fn] = s, t.onBeforeRender = Dd, t.onAfterRender = Ld;
4119
+ }
4120
+ s.k = Ia, s.failed = Na, s.red = qa;
4121
+ }
4122
+ const n = t.children;
4123
+ for (let s = 0; s < n.length; s++) Da(n[s]);
4124
+ }
4125
+ function Gd(t, e, n, s, a = 0) {
4126
+ e <= 2e-3 && a <= 2e-3 && s <= 2e-3 || (Ia = e, Na = n, qa = a, Da(t));
4127
+ }
4128
+ const Ao = "#f5b83d", La = "#fde7b0", Ga = "#c08a3a", St = 3, Wd = 1.22, yo = 0.11, Wa = 1.48, Fd = new y.PlaneGeometry(2, 2), Ud = () => {
4129
+ }, Bd = (
4130
+ /* glsl */
4131
+ `
4132
+ varying vec2 vP;
4133
+ void main() { vP = position.xy * ${Wa.toFixed(2)}; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
4134
+ ), Hd = (
4135
+ /* glsl */
4136
+ `
4137
+ uniform vec3 uColor; uniform vec3 uCore; uniform vec3 uMix; uniform vec3 uRad; uniform float uA; uniform float uOuter;
4138
+ uniform float uRot; uniform float uPulse;
4139
+ varying vec2 vP;
4140
+ const float PI = 3.14159265;
4141
+ float band(float d, float w, float aa) { return 1.0 - smoothstep(w, w + aa, abs(d)); }
4142
+ void main() {
4143
+ float grow = mix(0.86, 1.0, uA);
4144
+ vec2 p = vP / grow;
4145
+ float r = length(p);
4146
+ float aa = max(fwidth(r), 1e-4) * 1.2;
4147
+ float ang = atan(p.y, p.x);
4148
+ // gap around the top diamond
4149
+ float gap = smoothstep(0.075, 0.115, abs(atan(p.x, p.y)));
4150
+ float w = max(0.011, aa * 0.65);
4151
+ // the rings: crisp thin lines (>= ~1.3px) + a soft halo for Bloom
4152
+ float line = 0.0, halo = 0.0;
4153
+ for (int k = 0; k < 3; k++) {
4154
+ float m = uMix[k];
4155
+ float d = r - uRad[k];
4156
+ float g = k == 0 ? 1.0 : 0.8;
4157
+ line += band(d, w, aa) * m * g;
4158
+ halo += exp(-abs(d) * 30.0) * 0.2 * m * g;
4159
+ }
4160
+ line *= gap;
4161
+ halo *= gap * uPulse;
4162
+ // 12 short ticks just outside the outermost ring, turning slowly
4163
+ float a = ang + uRot;
4164
+ float seg = PI * 2.0 / 12.0;
4165
+ float da = abs(a - floor(a / seg + 0.5) * seg) * r;
4166
+ float t0 = uOuter + 0.05;
4167
+ 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;
4168
+ // the diamond at the top of the outermost ring
4169
+ vec2 q = p - vec2(0.0, uOuter);
4170
+ float dd = abs(q.x) + abs(q.y);
4171
+ float gem = (1.0 - smoothstep(0.055, 0.055 + aa * 1.4, dd)) * uA;
4172
+ float gemHalo = exp(-dd * 22.0) * 0.45 * uA;
4173
+ float alpha = line * (0.9 + 0.1 * uPulse) + halo + tick + gem + gemHalo;
4174
+ if (alpha < 0.003) discard;
4175
+ vec3 col = mix(uColor, uCore, clamp(line * 0.55 + gem * 0.8, 0.0, 1.0));
4176
+ gl_FragColor = vec4(col * alpha, 1.0);
4177
+ }`
4178
+ );
4179
+ function jd({ agent: t, radius: e, height: n }) {
4180
+ const [s, a] = ut(() => !!t.inst.skill);
4181
+ return dt(() => {
4182
+ !s && t.inst.skill && a(!0);
4183
+ }), s ? /* @__PURE__ */ f(Kd, { agent: t, radius: e, height: n }) : null;
4184
+ }
4185
+ const Zd = (t) => [
4186
+ { text: "skill:", color: Ga },
4187
+ { text: t, color: La }
4188
+ ], Jd = 1.75, Xd = 7, Mo = new y.Vector3();
4189
+ function Kd({ agent: t, radius: e, height: n }) {
4190
+ const s = U(null), a = U([]), r = U([]), l = t.depth > 0, d = l ? 0.16 : 0.2, i = st(() => l ? [8.5, 11] : [9.5, 12.5], [l]), u = st(() => {
4191
+ const g = {
4192
+ slots: Array.from({ length: St }, () => ({ use: null, mix: 0 })),
4193
+ pending: Array.from({ length: St }, () => ""),
4194
+ now: 0,
4195
+ extra: 0,
4196
+ shownExtra: -1,
4197
+ extraMix: 0,
4198
+ visit: (c, m) => {
4199
+ if (!(!c.active && pr(c, g.now) <= 2e-3)) {
4200
+ for (const b of g.slots) if (b.use === c) return;
4201
+ for (let b = 0; b < St; b++) {
4202
+ const v = g.slots[b];
4203
+ if (!v.use) {
4204
+ v.use = c, v.mix = 0, g.pending[b] = m;
4205
+ return;
4206
+ }
4207
+ }
4208
+ g.extra++;
4209
+ }
4210
+ }
4211
+ };
4212
+ return g;
4213
+ }, []), o = st(
4214
+ () => new y.ShaderMaterial({
4215
+ vertexShader: Bd,
4216
+ fragmentShader: Hd,
4217
+ transparent: !0,
4218
+ depthTest: !1,
4219
+ depthWrite: !1,
4220
+ blending: y.AdditiveBlending,
4221
+ toneMapped: !1,
4222
+ uniforms: {
4223
+ uColor: { value: new y.Color(Ao).multiplyScalar(0.82) },
4224
+ uCore: { value: new y.Color("#ffe9b8").multiplyScalar(0.95) },
4225
+ uMix: { value: new y.Vector3() },
4226
+ uRad: { value: new y.Vector3(1, 1, 1) },
4227
+ uA: { value: 0 },
4228
+ uOuter: { value: 1 },
4229
+ uRot: { value: 0 },
4230
+ uPulse: { value: 1 }
4231
+ }
4232
+ }),
4233
+ []
4234
+ );
4235
+ return ot(() => () => o.dispose(), [o]), dt(({ camera: g, clock: c, size: m }) => {
4236
+ var Y, H, V;
4237
+ const b = s.current;
4238
+ if (!b) return;
4239
+ const v = performance.now(), p = t.inst, A = Te(p, v) * (1 - 0.5 * t.dim);
4240
+ u.now = v;
4241
+ for (const I of u.slots)
4242
+ I.use && (I.mix = pr(I.use, v), I.mix <= 2e-3 && !I.use.active && (I.use = null, I.mix = 0));
4243
+ u.extra = 0, p.skills.forEach(u.visit);
4244
+ for (let I = 0; I < St; I++) {
4245
+ const nt = u.pending[I];
4246
+ nt && (u.pending[I] = "", (Y = r.current[I]) == null || Y.setText(Zd(nt)));
4247
+ }
4248
+ u.extraMix += ((u.extra > 0 ? 1 : 0) - u.extraMix) * 0.12, u.extra > 0 && u.extra !== u.shownExtra && (u.shownExtra = u.extra, (H = r.current[St]) == null || H.setText(`+${u.extra} more`));
4249
+ const M = o.uniforms.uMix.value, O = o.uniforms.uRad.value;
4250
+ let C = 0, x = 0;
4251
+ for (let I = 0; I < St; I++) {
4252
+ const nt = u.slots[I].mix;
4253
+ M.setComponent(I, nt * A), O.setComponent(I, 1 + yo * C), C += nt, x = Math.max(x, nt);
4254
+ }
4255
+ x *= A;
4256
+ const S = x > 3e-3;
4257
+ b.visible = S;
4258
+ for (const I of a.current) I && (I.visible = S);
4259
+ if (!S) return;
4260
+ const N = 1 + yo * Math.max(0, C - 1), T = t.scale, P = Math.max(e, n * 0.55) * T * Wd;
4261
+ b.position.copy(t.live), k.plane === "xz" && (b.position.y += n * T * 0.5), b.quaternion.copy(g.quaternion), b.scale.setScalar(P * Wa);
4262
+ const E = o.uniforms;
4263
+ E.uA.value = x, E.uOuter.value = N;
4264
+ const w = c.elapsedTime;
4265
+ E.uRot.value = xt ? 0 : w * 0.16, E.uPulse.value = xt ? 1 : 0.82 + 0.18 * Math.sin(w * 1.7), Mo.set(0, 1, 0).applyQuaternion(g.quaternion);
4266
+ const L = 0.86 + 0.14 * x, W = P * L * (N + 0.1) + 0.03, G = g, $ = b.position.distanceTo(g.position) || 1, _ = G.isPerspectiveCamera ? 2 * $ * Math.tan(y.MathUtils.degToRad(G.fov) / 2) / (G.zoom * m.height) : 0.01, Q = (y.MathUtils.clamp(d * D.label / Math.max(_, 1e-6), i[0] * j.pxk, i[1] * j.pxk) * Jd + Xd) * _;
4267
+ let B = 0;
4268
+ for (let I = 0; I <= St; I++) {
4269
+ const nt = a.current[I], at = I < St ? u.slots[I].mix : u.extraMix;
4270
+ nt && nt.position.copy(b.position).addScaledVector(Mo, W + B), (V = r.current[I]) == null || V.setOpacity(at * A, !0), B += Q * at;
4271
+ }
4272
+ }), /* @__PURE__ */ R(kt, { children: [
4273
+ /* @__PURE__ */ f("mesh", { ref: s, geometry: Fd, material: o, renderOrder: 22, raycast: Ud, visible: !1, frustumCulled: !1 }),
4274
+ Array.from({ length: St + 1 }, (g, c) => /* @__PURE__ */ f("group", { ref: (m) => void (a.current[c] = m), visible: !1, children: /* @__PURE__ */ f(
4275
+ Lt,
4276
+ {
4277
+ ref: (m) => void (r.current[c] = m),
4278
+ text: "",
4279
+ color: Ao,
4280
+ textColor: c < St ? La : Ga,
4281
+ size: c < St ? d : d * 0.85,
4282
+ pxRange: i,
4283
+ anchorY: "bottom",
4284
+ plate: c < St ? "underline" : "none",
4285
+ font: "mono",
4286
+ opacity: 0,
4287
+ glow: 1.08,
4288
+ renderOrder: 24,
4289
+ declutter: !1,
4290
+ fit: !0
4291
+ }
4292
+ ) }, c))
4293
+ ] });
4294
+ }
4295
+ const bo = [34, 64], Qd = new y.PlaneGeometry(2, 2), Yd = () => {
4296
+ }, bs = { size: 0.46, px: [16, 21] }, _d = (
4297
+ /* glsl */
4298
+ `
4299
+ varying vec2 vP;
4300
+ void main() { vP = position.xy * 1.6; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`
4301
+ ), $d = (
4302
+ /* glsl */
4303
+ `
4304
+ uniform float uA; uniform float uT; uniform float uM; uniform vec3 uColor;
4305
+ varying vec2 vP;
4306
+ float band(float d, float w, float aa) { return 1.0 - smoothstep(w, w + aa, abs(d)); }
4307
+ void main() {
4308
+ float r = length(vP);
4309
+ float aa = max(fwidth(r), 1e-4) * 1.3;
4310
+ float ang = atan(vP.y, vP.x);
4311
+ float ring = band(r - 1.0, 0.035, aa);
4312
+ float dash = step(0.5, fract(ang * 12.0 / 6.2831853 + uT * 0.15 * uM)) * band(r - 1.16, 0.045, aa);
4313
+ float pulse = 0.5 + 0.5 * sin(uT * 3.2 * uM);
4314
+ float glow = exp(-abs(r - 1.0) * 9.0) * (0.35 + 0.35 * pulse);
4315
+ float a = (ring * 1.2 + dash * 0.85 + glow) * uA;
4316
+ if (a < 0.003) discard;
4317
+ gl_FragColor = vec4(mix(uColor, vec3(1.0, 0.86, 0.9), ring * 0.35) * a, 1.0);
4318
+ }`
4319
+ );
4320
+ function Fa(t, e = performance.now()) {
4321
+ const n = Hs(t, e);
4322
+ if (!n) return 0;
4323
+ const s = Math.min(1, (e - n.since) / 250);
4324
+ return n.end ? s * Math.max(0, 1 - (e - n.end) / Fo) : s;
4325
+ }
4326
+ function tf(t) {
4327
+ var n;
4328
+ let e = 0;
4329
+ for (const s of h.instances.values()) {
4330
+ if (s.exitAt) continue;
4331
+ let a = s.parent;
4332
+ for (let r = 0; a && r < 32; r++) {
4333
+ if (a === t) {
4334
+ e++;
4335
+ break;
4336
+ }
4337
+ a = ((n = h.instances.get(a)) == null ? void 0 : n.parent) ?? null;
4338
+ }
4339
+ }
4340
+ return e;
4341
+ }
4342
+ function ef({ agent: t, radius: e, height: n }) {
4343
+ const [s, a] = ut(() => h.halts.has(t.id));
4344
+ return dt(() => {
4345
+ !s && h.halts.has(t.id) && a(!0);
4346
+ }), s ? /* @__PURE__ */ f(nf, { agent: t, radius: e, height: n }) : null;
4347
+ }
4348
+ const We = new y.Vector3(), xo = new y.Vector3();
4349
+ function nf({ agent: t, radius: e, height: n }) {
4350
+ const s = U(null), a = U(null), r = U(null), l = st(() => ({ key: "", main: [], sub: null }), []), d = st(
4351
+ () => new y.ShaderMaterial({
4352
+ vertexShader: _d,
4353
+ fragmentShader: $d,
4354
+ transparent: !0,
4355
+ depthTest: !1,
4356
+ depthWrite: !1,
4357
+ blending: y.AdditiveBlending,
4358
+ toneMapped: !1,
4359
+ uniforms: { uA: { value: 0 }, uT: { value: 0 }, uM: { value: xt ? 0 : 1 }, uColor: { value: new y.Color(ie) } }
4360
+ }),
4361
+ []
4362
+ );
4363
+ return ot(() => () => d.dispose(), [d]), dt(({ camera: i, size: u, clock: o }) => {
4364
+ var C, x;
4365
+ const g = s.current, c = a.current;
4366
+ if (!g || !c) return;
4367
+ const m = performance.now(), b = Fa(t.id, m) * Te(t.inst, m);
4368
+ if (g.visible = c.visible = b > 3e-3, (C = r.current) == null || C.setOpacity(Math.min(1, b * 1.4), !0), !g.visible) return;
4369
+ const v = Hs(t.id, m);
4370
+ if (v) {
4371
+ const S = tf(t.id), N = `${v.reason}|${S}|${v.end ? 1 : 0}`;
4372
+ N !== l.key && (l.key = N, l.main = [
4373
+ { text: v.end ? "RESUMED" : "HALTED", color: v.end ? "#4ade80" : ie },
4374
+ { text: ` · ${v.reason}`, color: "#f1fffd" }
4375
+ ], l.sub = S ? [{ text: v.end ? `${S} agents trading again` : `${S} agent${S === 1 ? "" : "s"} paused`, color: "#fca5b4" }] : null), (x = r.current) == null || x.setText(l.main, l.sub);
4376
+ }
4377
+ We.copy(t.live), k.plane === "xz" && (We.y += n * t.scale * 0.5);
4378
+ const p = i, A = We.distanceTo(i.position) || 1, M = p.isPerspectiveCamera ? 2 * A * Math.tan(y.MathUtils.degToRad(p.fov) / 2) / (p.zoom * u.height) : 0.01, O = y.MathUtils.clamp(Math.max(e, n * 0.55) * t.scale * 1.45, bo[0] * M * j.pxk, bo[1] * M * j.pxk);
4379
+ g.position.copy(We), g.quaternion.copy(i.quaternion), g.scale.setScalar(O * 1.6), d.uniforms.uA.value = b, d.uniforms.uT.value = o.elapsedTime, xo.set(0, 1, 0).applyQuaternion(i.quaternion), c.position.copy(We).addScaledVector(xo, O * 1.25 + 8 * M);
4380
+ }), /* @__PURE__ */ R(kt, { children: [
4381
+ /* @__PURE__ */ f("mesh", { ref: s, geometry: Qd, material: d, renderOrder: 24, raycast: Yd, visible: !1, frustumCulled: !1 }),
4382
+ /* @__PURE__ */ f("group", { ref: a, visible: !1, children: /* @__PURE__ */ f(
4383
+ Lt,
4384
+ {
4385
+ ref: r,
4386
+ text: "",
4387
+ color: ie,
4388
+ textColor: "#f1fffd",
4389
+ size: bs.size,
4390
+ secondarySize: bs.size * 0.66,
4391
+ pxRange: bs.px,
4392
+ anchorY: "bottom",
4393
+ plate: "tag",
4394
+ font: "mono",
4395
+ opacity: 0,
4396
+ fadeMs: 0,
4397
+ glow: 1.2,
4398
+ renderOrder: 26,
4399
+ declutter: "decision",
4400
+ fit: !0
4401
+ }
4402
+ ) })
4403
+ ] });
4404
+ }
4405
+ const Ua = So({ nodes: [], links: [] }), Qf = () => Oo(Ua);
4406
+ function nr(t, e) {
4407
+ const [n, s] = ut(() => ({ v: t(), value: e() })), a = U(n.v);
4408
+ return dt(() => {
4409
+ const r = t();
4410
+ r !== a.current && (a.current = r, s({ v: r, value: e() }));
4411
+ }), n.value;
4412
+ }
4413
+ const sf = () => [...k.agents.values()], rf = () => [...k.runs.values()], of = () => [...k.mcp.values()], af = () => k.agentsVersion, cf = () => k.runsVersion, lf = () => k.mcpVersion, uf = () => nr(af, sf), df = () => nr(cf, rf), ff = () => nr(lf, of);
4414
+ function pf() {
4415
+ return ot(() => (j.active++, () => void j.active--), []), dt(({ size: t }) => {
4416
+ const e = performance.now();
4417
+ zi(e), Uc(e), gl(e), tc(e, t.width, t.height);
4418
+ }, -2), null;
4419
+ }
4420
+ const hf = { kind: "run" }, mf = { kind: "mcp" }, gf = { kind: "backend" }, vf = { kind: "graph" }, Af = { kind: "cluster" };
4421
+ function yf({ agent: t, children: e }) {
4422
+ const n = st(() => ({ kind: t.depth > 0 ? "sub" : "agent", agent: t }), [t]);
4423
+ return /* @__PURE__ */ f(ue.Provider, { value: n, children: e });
4424
+ }
4425
+ function Mf({ agent: t, children: e }) {
4426
+ const n = U(null), s = U(0);
4427
+ return dt(() => {
4428
+ if (!n.current) return;
4429
+ const a = h.halts.size ? Fa(t.id) : 0;
4430
+ Gd(n.current, t.dim, t.inst.status === "failed", s.current, a), s.current = Math.max(t.dim, a);
4431
+ }), /* @__PURE__ */ f("group", { ref: n, children: e });
4432
+ }
4433
+ function bf({ Agent: t, Edge: e, selected: n, onSelect: s, radius: a, height: r }) {
4434
+ const l = uf();
4435
+ return /* @__PURE__ */ R(kt, { children: [
4436
+ l.map((d) => /* @__PURE__ */ R(yf, { agent: d, children: [
4437
+ /* @__PURE__ */ R(Mf, { agent: d, children: [
4438
+ e && d.inst.parent && /* @__PURE__ */ f(e, { child: d }),
4439
+ /* @__PURE__ */ f(t, { agent: d, selected: n === d.id, onSelect: s })
4440
+ ] }),
4441
+ /* @__PURE__ */ f(jd, { agent: d, radius: a, height: r }),
4442
+ /* @__PURE__ */ f($l, { agent: d, radius: a, height: r }),
4443
+ /* @__PURE__ */ f(gu, { agent: d, radius: a, height: r }),
4444
+ /* @__PURE__ */ f(wu, { agent: d, radius: a, height: r }),
4445
+ /* @__PURE__ */ f(ef, { agent: d, radius: a, height: r })
4446
+ ] }, d.uid)),
4447
+ /* @__PURE__ */ f(du, { radius: a, height: r })
4448
+ ] });
4449
+ }
4450
+ function xf({ RunMarker: t }) {
4451
+ const e = df();
4452
+ return /* @__PURE__ */ f(ue.Provider, { value: hf, children: e.map((n) => /* @__PURE__ */ f(t, { run: n }, n.uid)) });
4453
+ }
4454
+ function wf({ McpServer: t, Backend: e }) {
4455
+ const n = ff();
4456
+ return /* @__PURE__ */ f(kt, { children: n.map((s) => /* @__PURE__ */ R(Ya, { children: [
4457
+ /* @__PURE__ */ f(ue.Provider, { value: mf, children: t && /* @__PURE__ */ f(wo, { item: s, children: /* @__PURE__ */ f(t, { mcp: s }) }) }),
4458
+ /* @__PURE__ */ f(ue.Provider, { value: gf, children: e && [...s.backends.values()].map((a) => /* @__PURE__ */ f(wo, { item: a, children: /* @__PURE__ */ f(e, { mcp: s, backend: a }) }, a.uid)) })
4459
+ ] }, s.uid)) });
4460
+ }
4461
+ function wo({ item: t, children: e }) {
4462
+ const n = U(null), s = U(null);
4463
+ return dt(() => {
4464
+ const a = n.current, r = s.current;
4465
+ if (!a || !r) return;
4466
+ const l = Math.min(1, Math.max(0, t.mix)), d = l * l * (3 - 2 * l);
4467
+ a.position.copy(t.pos), a.scale.setScalar(Math.max(1e-4, d)), r.position.copy(t.pos).negate(), a.visible = d > 2e-3;
4468
+ }, -1), /* @__PURE__ */ f("group", { ref: n, scale: 1e-4, visible: !1, children: /* @__PURE__ */ f("group", { ref: s, children: e }) });
4469
+ }
4470
+ const kf = Array.from({ length: ht }, (t, e) => e);
4471
+ function Sf({ cluster: t, Cluster: e, offset: n }) {
4472
+ const s = (n == null ? void 0 : n[0]) ?? 0, a = (n == null ? void 0 : n[1]) ?? 0, r = (n == null ? void 0 : n[2]) ?? 0, l = Eo((d, i) => {
4473
+ const u = k.clusterPos[d];
4474
+ u ? i.set(u.x + s, u.y + a, u.z + r) : i.set(s, a, r);
4475
+ }, [s, a, r]);
4476
+ return e ? /* @__PURE__ */ f(kt, { children: kf.map((d) => /* @__PURE__ */ f(e, { lane: d, cluster: F.clusters[d], pos: k.clusterPos[d] ?? new y.Vector3() }, d)) }) : /* @__PURE__ */ f(Iu, { place: l, ...t });
4477
+ }
4478
+ function Of({ galaxy: t, Graph: e }) {
4479
+ const s = ji() && t.nodes.length > 0;
4480
+ k.graphWanted = s, ot(
4481
+ () => () => {
4482
+ k.graphWanted = !1;
4483
+ },
4484
+ []
4485
+ );
4486
+ const a = U(null);
4487
+ return dt(() => {
4488
+ const r = a.current;
4489
+ if (!r) return;
4490
+ const l = k.graph;
4491
+ r.position.copy(l.pos), r.scale.setScalar(Math.max(1e-4, l.scale)), r.visible = l.mix > 2e-3;
4492
+ }, -1), s ? /* @__PURE__ */ f("group", { ref: a, scale: 1e-4, visible: !1, children: /* @__PURE__ */ f(ue.Provider, { value: vf, children: /* @__PURE__ */ f(e, { galaxy: t }) }) }) : null;
4493
+ }
4494
+ function Yf({ children: t }) {
4495
+ const e = U(null);
4496
+ return dt(() => {
4497
+ const n = e.current;
4498
+ if (!n) return;
4499
+ const s = Math.max(1e-4, k.graph.scale);
4500
+ n.scale.setScalar(1 / s), n.position.copy(k.graph.pos).multiplyScalar(-1 / s);
4501
+ }, -1), /* @__PURE__ */ f("group", { ref: e, children: t });
4502
+ }
4503
+ const Ef = new y.Vector3();
4504
+ function _f(t) {
4505
+ var g, c;
4506
+ const e = ad(), [n, s] = ut(null);
4507
+ vt.preset = typeof t.preset == "string" ? xc[t.preset] : t.preset, vt.graphNatural = ((g = t.graph) == null ? void 0 : g.natural) ?? 1, vt.graphRadius = ((c = t.graph) == null ? void 0 : c.radius) ?? 2.6, vt.peripheryGap = t.peripheryGap ?? 3.6, k.plane = t.plane;
4508
+ const a = JSON.stringify(t.fit ?? {});
4509
+ st(() => rc(t.fit ?? {}), [a]), ot(() => {
4510
+ for (const m of k.agents.values()) m.fresh = !0;
4511
+ for (const m of k.runs.values()) m.fresh = !0;
4512
+ for (const m of k.mcp.values()) m.fresh = !0;
4513
+ k.graph.fresh = !0;
4514
+ }, []);
4515
+ const r = U(t.extents);
4516
+ r.current = t.extents;
4517
+ const l = t.agentRadius ?? 1.1, d = t.agentHeight ?? 0, i = Eo(
4518
+ (m) => {
4519
+ var b;
4520
+ Ml(m, l, d), (b = r.current) == null || b.call(r, m);
4521
+ },
4522
+ [l, d]
4523
+ ), u = t.target ?? [0, 0, 0], o = st(() => Object.fromEntries(Object.entries(t.controls ?? {}).filter(([, m]) => m !== void 0)), [t.controls]);
4524
+ return /* @__PURE__ */ R("div", { className: `scene-root${t.className ? ` ${t.className}` : ""}`, children: [
4525
+ /* @__PURE__ */ R(
4526
+ Ja,
4527
+ {
4528
+ camera: { position: t.camera.position, fov: t.camera.fov ?? 46, near: t.camera.near ?? 0.1, far: t.camera.far ?? 600 },
4529
+ dpr: [1, 2],
4530
+ gl: { antialias: !1, powerPreference: "high-performance", ...t.gl },
4531
+ onPointerMissed: () => s(null),
4532
+ children: [
4533
+ t.bg && /* @__PURE__ */ f("color", { attach: "background", args: [t.bg] }),
4534
+ /* @__PURE__ */ f(pf, {}),
4535
+ t.Background,
4536
+ /* @__PURE__ */ f(Ua.Provider, { value: e, children: /* @__PURE__ */ R("group", { children: [
4537
+ t.RunMarker && /* @__PURE__ */ f(xf, { RunMarker: t.RunMarker }),
4538
+ t.GraphResource && /* @__PURE__ */ f(Of, { galaxy: e, Graph: t.GraphResource }),
4539
+ /* @__PURE__ */ f(wf, { McpServer: t.McpServer, Backend: t.Backend }),
4540
+ /* @__PURE__ */ f(bf, { Agent: t.Agent, Edge: t.Edge, selected: n, onSelect: s, radius: l, height: t.plane === "xz" ? d : 0 }),
4541
+ /* @__PURE__ */ f(ue.Provider, { value: Af, children: /* @__PURE__ */ f(Sf, { cluster: t.cluster, Cluster: t.Cluster, offset: t.clusterOffset }) }),
4542
+ t.children
4543
+ ] }) }),
4544
+ /* @__PURE__ */ f(
4545
+ Za,
4546
+ {
4547
+ makeDefault: !0,
4548
+ target: u,
4549
+ enableDamping: !0,
4550
+ dampingFactor: 0.06,
4551
+ enablePan: !1,
4552
+ minDistance: 2,
4553
+ maxDistance: 400,
4554
+ ...o
4555
+ }
4556
+ ),
4557
+ /* @__PURE__ */ f(hc, { points: i, origin: Ef }),
4558
+ t.PostFX
4559
+ ]
4560
+ }
4561
+ ),
4562
+ /* @__PURE__ */ f(dd, { title: t.title, subtitle: t.subtitle, selected: n, onClose: () => s(null), inset: t.hudInset, children: t.hudChildren })
4563
+ ] });
4564
+ }
4565
+ export {
4566
+ Zf as A,
4567
+ Ff as B,
4568
+ Qf as C,
4569
+ Yf as D,
4570
+ qf as E,
4571
+ Wo as F,
4572
+ Xf as G,
4573
+ pt as H,
4574
+ Gf as K,
4575
+ Lt as L,
4576
+ xs as R,
4577
+ Vo as S,
4578
+ Kt as T,
4579
+ Nf as a,
4580
+ $n as b,
4581
+ $a as c,
4582
+ Ni as d,
4583
+ En as e,
4584
+ D as f,
4585
+ F as g,
4586
+ Hn as h,
4587
+ jf as i,
4588
+ Wf as j,
4589
+ Lo as k,
4590
+ Uf as l,
4591
+ Bf as m,
4592
+ _f as n,
4593
+ k as o,
4594
+ Te as p,
4595
+ Lf as q,
4596
+ xt as r,
4597
+ Hf as s,
4598
+ Kf as t,
4599
+ Ee as u,
4600
+ Ze as v,
4601
+ h as w,
4602
+ Jf as x,
4603
+ Df as y,
4604
+ If as z
4605
+ };