agentglow 0.3.1 → 0.4.0

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