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