agentglow 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,14 +5,14 @@ import { jsxs as Y, Fragment as de, jsx as u } from "react/jsx-runtime";
5
5
  import { Stars as at } from "@react-three/drei";
6
6
  import { EffectComposer as st, Bloom as it, Vignette as ct } from "@react-three/postprocessing";
7
7
  import { useFrame as re, useThree as lt } from "@react-three/fiber";
8
- import { useRef as z, useMemo as P, useEffect as ut, useState as $e } from "react";
8
+ import { useRef as z, useMemo as V, useEffect as ut, useState as $e } from "react";
9
9
  import * as o from "three";
10
- import { T as Xe, w as L, a as ge, f as Ee, p as pt, e as ft, s as dt, r as fe, L as be, l as mt, g as ht, b as We, K as gt, o as vt, q as wt, G as yt, t as bt, R as Mt, u as St, v as Ct, m as De, c as Ye, d as At, n as xt } from "./KitScene-C_6JIRsN.js";
11
- const ee = (e) => e < 0 ? 0 : e > 1 ? 1 : e, Ie = (e) => 1 - Math.pow(1 - ee(e), 3), Me = (e) => (e = ee(e), e < 0.5 ? 4 * e * e * e : 1 - Math.pow(-2 * e + 2, 3) / 2), Rt = (e) => {
10
+ import { T as Xe, w as L, a as ge, p as pt, e as ft, s as dt, r as fe, f as Ue, L as be, l as mt, g as ht, b as We, K as gt, o as vt, q as wt, G as yt, t as bt, R as Mt, u as St, v as Ct, m as De, c as Ye, d as At, n as xt } from "./KitScene-DC6xid52.js";
11
+ const ee = (e) => e < 0 ? 0 : e > 1 ? 1 : e, ke = (e) => 1 - Math.pow(1 - ee(e), 3), Me = (e) => (e = ee(e), e < 0.5 ? 4 * e * e * e : 1 - Math.pow(-2 * e + 2, 3) / 2), Rt = (e) => {
12
12
  e = ee(e);
13
13
  const r = 2.2;
14
14
  return 1 + (r + 1) * Math.pow(e - 1, 3) + r * Math.pow(e - 1, 2);
15
- }, Pe = Object.fromEntries(Object.entries(Xe).map(([e, r]) => [e, new o.Color(r)])), Fe = (e) => e === "graph_scout" || e === "records_scout" || e === "data_scout";
15
+ }, Ve = Object.fromEntries(Object.entries(Xe).map(([e, r]) => [e, new o.Color(r)])), Ee = (e) => e === "graph_scout" || e === "records_scout" || e === "data_scout";
16
16
  let Ae = null;
17
17
  function Tt() {
18
18
  if (Ae) return Ae;
@@ -27,7 +27,7 @@ function le(e = "#fff") {
27
27
  function se(e = "#fff") {
28
28
  return new o.MeshBasicMaterial({ color: e, blending: o.AdditiveBlending, depthWrite: !1, transparent: !0, toneMapped: !1 });
29
29
  }
30
- function Vt(e = 64, r = 7) {
30
+ function Pt(e = 64, r = 7) {
31
31
  const t = [], n = [];
32
32
  for (let a = 0; a <= e; a++) {
33
33
  const i = a / e;
@@ -44,10 +44,10 @@ function Vt(e = 64, r = 7) {
44
44
  const s = new o.BufferGeometry();
45
45
  return s.setAttribute("position", new o.Float32BufferAttribute(t, 3)), s.setIndex(n), s.boundingSphere = new o.Sphere(new o.Vector3(), 1e4), s;
46
46
  }
47
- const Ze = Vt(), Ge = new o.SphereGeometry(1, 32, 24);
47
+ const Ze = Pt(), Ge = new o.SphereGeometry(1, 32, 24);
48
48
  new o.SphereGeometry(1, 40, 28);
49
49
  new o.IcosahedronGeometry(1, 1);
50
- const Ke = new o.ConeGeometry(1, 1, 14).translate(0, 0.5, 0), Pt = new o.ConeGeometry(1, 1, 6, 1, !0).translate(0, 0.5, 0), Gt = (
50
+ const Ie = new o.ConeGeometry(1, 1, 14).translate(0, 0.5, 0), Vt = new o.ConeGeometry(1, 1, 6, 1, !0).translate(0, 0.5, 0), Gt = (
51
51
  /* glsl */
52
52
  `
53
53
  uniform vec3 uP0; uniform vec3 uP1; uniform vec3 uP2; uniform float uRadius; uniform float uTaper;
@@ -135,7 +135,7 @@ const Be = class Be {
135
135
  te(this, "a", new o.Vector3());
136
136
  te(this, "b", new o.Vector3());
137
137
  te(this, "d", new o.Vector3());
138
- this.max = r, this.colors = new Float32Array(r * 3), this.mesh = new o.InstancedMesh(Ke, new o.MeshBasicMaterial({ blending: o.AdditiveBlending, depthWrite: !1, transparent: !0, toneMapped: !1 }), r), this.mesh.instanceColor = new o.InstancedBufferAttribute(this.colors, 3), this.mesh.frustumCulled = !1, this.mesh.count = 0;
138
+ this.max = r, this.colors = new Float32Array(r * 3), this.mesh = new o.InstancedMesh(Ie, new o.MeshBasicMaterial({ blending: o.AdditiveBlending, depthWrite: !1, transparent: !0, toneMapped: !1 }), r), this.mesh.instanceColor = new o.InstancedBufferAttribute(this.colors, 3), this.mesh.frustumCulled = !1, this.mesh.count = 0;
139
139
  }
140
140
  begin() {
141
141
  this.n = 0;
@@ -150,9 +150,9 @@ const Be = class Be {
150
150
  };
151
151
  te(Be, "UP", new o.Vector3(0, 1, 0));
152
152
  let ze = Be;
153
- const _e = new o.Vector3(), xe = new o.Vector3(), Bt = new o.Vector3(0, 1, 0);
153
+ const Fe = new o.Vector3(), xe = new o.Vector3(), Bt = new o.Vector3(0, 1, 0);
154
154
  function He(e, r, t, n, s, a, i) {
155
- ne(r, t, n, s, _e), ne(r, t, n, Math.min(1, Math.max(0, s + 0.02 * a)), xe), e.position.copy(_e), xe.sub(_e), xe.lengthSq() > 1e-8 && e.quaternion.setFromUnitVectors(Bt, xe.normalize()), e.scale.set(i * 0.4, i, i * 0.4);
155
+ ne(r, t, n, s, Fe), ne(r, t, n, Math.min(1, Math.max(0, s + 0.02 * a)), xe), e.position.copy(Fe), xe.sub(Fe), xe.lengthSq() > 1e-8 && e.quaternion.setFromUnitVectors(Bt, xe.normalize()), e.scale.set(i * 0.4, i, i * 0.4);
156
156
  }
157
157
  const Ot = new o.Color("#4b4a63"), Le = new o.Color("#fbbf24"), ye = /* @__PURE__ */ new Map();
158
158
  function Et(e) {
@@ -165,37 +165,37 @@ function Et(e) {
165
165
  }
166
166
  const Ft = new o.TorusGeometry(1.25, 0.05, 8, 64);
167
167
  function _t({ agent: e, onSelect: r }) {
168
- const t = e.inst, n = z(null), s = z(null), a = z(null), i = z(null), p = z(null), h = z(null), m = z(null), M = z(null), S = P(() => [...t.id].reduce((B, x) => (B * 31 + x.charCodeAt(0)) % 9973, 7) / 9973, [t.id]), F = P(() => Et(S), [S]), C = Pe[t.type], g = P(
168
+ const t = e.inst, n = z(null), s = z(null), a = z(null), i = z(null), p = z(null), h = z(null), m = z(null), M = z(null), S = V(() => [...t.id].reduce((B, x) => (B * 31 + x.charCodeAt(0)) % 9973, 7) / 9973, [t.id]), F = V(() => Et(S), [S]), C = Ve[t.type], g = V(
169
169
  () => ({
170
170
  core: se(C),
171
171
  hot: se("#ffffff"),
172
172
  spike: se(C),
173
173
  ring: se(Le),
174
174
  halo: le(C),
175
- syn: Qe(C, Fe(t.type) ? 0.08 : 0.11, 0.8),
175
+ syn: Qe(C, Ee(t.type) ? 0.08 : 0.11, 0.8),
176
176
  arrow: se(C)
177
177
  }),
178
178
  [C, t.type]
179
- ), c = P(() => ({ p0: new o.Vector3(), p1: new o.Vector3(), seedP: new o.Vector3(), p0set: !1, labelK: 1, spik: 0, ringK: 0, parentK: 1, c: new o.Color() }), []);
179
+ ), c = V(() => ({ p0: new o.Vector3(), p1: new o.Vector3(), seedP: new o.Vector3(), p0set: !1, labelK: 1, spik: 0, ringK: 0, parentK: 1, c: new o.Color() }), []);
180
180
  ut(() => (ye.set(t.id, c.p1), () => {
181
181
  ye.get(t.id) === c.p1 && ye.delete(t.id);
182
182
  }), [t.id, c]), re(({ clock: B }) => {
183
183
  var D, ie, Q;
184
- const x = performance.now(), _ = B.elapsedTime, k = fe ? 0 : 0.08 * Ee.spread;
184
+ const x = performance.now(), _ = B.elapsedTime, k = fe ? 0 : 0.08 * Ue.spread;
185
185
  e.live.set(e.pos.x + Math.sin(_ * 0.35 + S * 20) * k, e.pos.y + Math.cos(_ * 0.3 + S * 13) * k, e.pos.z);
186
186
  const G = e.live, f = t.parent ? L.instances.get(t.parent) : void 0, T = t.parent ? ge(t.parent) : void 0;
187
- T ? (c.p0.copy(T), c.p0set = !0) : c.p0set || (c.p0.copy(G), c.p0set = !0), Fe(t.type) || t.subagent ? c.p1.copy(c.p0).addScaledVector(e.run.axis, 1.7 * Ee.spread) : Oe(c.p0, G, 0.6, c.p1);
188
- const W = (x - t.bornAt) / 1e3, I = t.parent ? Ie(W / 0.9) : 1, V = Rt((W - (t.parent ? 0.85 : 0.1)) / 0.7), j = t.exitAt ? (x - t.exitAt) / 1e3 : -1, N = mt(t) / 1e3, w = j >= 0 ? ee(j / (N * 0.92)) : 0, $ = pt(t, x);
187
+ T ? (c.p0.copy(T), c.p0set = !0) : c.p0set || (c.p0.copy(G), c.p0set = !0), Oe(c.p0, G, Ee(t.type) || t.subagent ? 0.25 : 0.6, c.p1);
188
+ const W = (x - t.bornAt) / 1e3, I = t.parent ? ke(W / 0.9) : 1, P = Rt((W - (t.parent ? 0.85 : 0.1)) / 0.7), j = t.exitAt ? (x - t.exitAt) / 1e3 : -1, N = mt(t) / 1e3, w = j >= 0 ? ee(j / (N * 0.92)) : 0, $ = pt(t, x);
189
189
  let X = !1;
190
190
  for (const H of L.mcpPending.values()) H.instance === t.id && (X = !0);
191
191
  const d = j < 0 && (t.status === "thinking" || t.status === "spawning"), b = ft(t, x), O = fe ? 0 : 1, K = 0.5 + 0.5 * Math.sin(_ * 2 + S * 9) * O, Z = 0.5 + 0.5 * Math.sin(_ * 1 + S * 5) * O;
192
192
  c.spik += ((d ? 1 : 0) - c.spik) * 0.06, c.ringK += ((X && j < 0 ? 1 : 0) - c.ringK) * 0.08, n.current && (I < 1 ? n.current.position.copy(ne(c.p0, c.p1, G, I, c.seedP)) : n.current.position.copy(G));
193
- const U = I < 1 ? 0.18 : 0, l = Math.max(U, 0.18 + 0.82 * V) * (1 - w * w * 0.95) * e.scale;
193
+ const U = I < 1 ? 0.18 : 0, l = Math.max(U, 0.18 + 0.82 * P) * (1 - w * w * 0.95) * e.scale;
194
194
  (D = s.current) == null || D.scale.setScalar(Math.max(1e-4, l * (0.55 + b * 0.06 + (d ? K * 0.05 : Z * 0.04)))), (ie = a.current) == null || ie.scale.setScalar(Math.max(1e-4, c.spik * (0.85 + K * 0.15)));
195
195
  const v = d ? 0.75 + K * 0.35 : 0.3 + Z * 0.15;
196
196
  if (c.c.copy(C).multiplyScalar(v + b * 0.35), j >= 0 && c.c.lerp(Ot, w).multiplyScalar(1 - w * 0.75), g.core.color.copy(c.c), g.spike.color.copy(c.c).multiplyScalar(0.9), g.hot.color.setScalar((d ? 0.35 + K * 0.25 : 0.08) * (1 - w) + b * 0.2), i.current && (i.current.visible = c.ringK > 0.02, i.current.rotation.z = _ * 0.9, i.current.rotation.x = 1.1 + Math.sin(_ * 0.5) * 0.2, i.current.scale.setScalar(Math.max(1e-4, l * 0.55 * c.ringK)), g.ring.color.copy(Le).multiplyScalar(0.9 * c.ringK * (0.75 + Z * 0.25))), h.current && (h.current.scale.setScalar(Math.max(1e-4, l * (d ? 2.3 + K * 0.3 : 1.6) + b * 0.35)), g.halo.color.copy(C).multiplyScalar((d ? 0.22 : 0.09) * (1 - w) + b * 0.06)), (Q = M.current) == null || Q.position.set(0, -0.78 * e.scale - 0.25, 0), m.current) {
197
197
  const H = dt(t.id);
198
- c.labelK += ((H ? 1 : 0) - c.labelK) * 0.12, m.current.setOpacity(ee(V) * (1 - w) * 0.95 * c.labelK);
198
+ c.labelK += ((H ? 1 : 0) - c.labelK) * 0.12, m.current.setOpacity(ee(P) * (1 - w) * 0.95 * c.labelK);
199
199
  }
200
200
  const E = !!f && !f.exitAt;
201
201
  c.parentK += ((t.parent && !t.exitAt && E ? 1 : 0) - c.parentK) * (E ? 0.05 : 0.035);
@@ -205,8 +205,8 @@ function _t({ agent: e, onSelect: r }) {
205
205
  if (R.uGrow.value = t.parent ? I * (1 - q) : 0, R.uSpark.value = 0, R.uHead.value = I < 1 ? I : -1, R.uTail.value = 0.1, R.uHeadColor.value.copy(C).multiplyScalar(1.5), R.uOpacity.value = (d ? 1.1 : 0.75) * Math.max(0, Math.min(c.parentK, $ > 0 ? 1 : 0)) + (I < 1 ? 0.4 : 0), R.uTime.value = fe ? 0 : _, R.uFlow.value = I >= 1 ? c.parentK : 0, p.current) {
206
206
  const H = t.parent && I >= 1 && c.parentK > 0.05 && R.uGrow.value > 0.9;
207
207
  if (p.current.visible = !!H, H) {
208
- ne(c.p0, c.p1, G, 0.8, ke), ne(c.p0, c.p1, G, 0.86, qe), p.current.position.copy(ke), Ne.subVectors(qe, ke).normalize(), p.current.quaternion.setFromUnitVectors(kt, Ne);
209
- const ue = (Fe(t.type) ? 0.75 : 1) * Math.min(1.3, Ee.scale);
208
+ ne(c.p0, c.p1, G, 0.8, _e), ne(c.p0, c.p1, G, 0.86, qe), p.current.position.copy(_e), Ne.subVectors(qe, _e).normalize(), p.current.quaternion.setFromUnitVectors(kt, Ne);
209
+ const ue = (Ee(t.type) ? 0.75 : 1) * Math.min(1.3, Ue.scale);
210
210
  p.current.scale.set(0.16 * ue, 0.42 * ue, 0.16 * ue), g.arrow.color.copy(C).multiplyScalar(1.6 * c.parentK);
211
211
  }
212
212
  }
@@ -216,12 +216,12 @@ function _t({ agent: e, onSelect: r }) {
216
216
  }, y = t.id.split(":")[2];
217
217
  return /* @__PURE__ */ Y(de, { children: [
218
218
  /* @__PURE__ */ u("mesh", { geometry: Ze, material: g.syn, frustumCulled: !1 }),
219
- /* @__PURE__ */ u("mesh", { ref: p, geometry: Ke, material: g.arrow, visible: !1 }),
219
+ /* @__PURE__ */ u("mesh", { ref: p, geometry: Ie, material: g.arrow, visible: !1 }),
220
220
  /* @__PURE__ */ Y("group", { ref: n, children: [
221
221
  /* @__PURE__ */ Y("group", { ref: s, scale: 1e-4, children: [
222
222
  /* @__PURE__ */ u("mesh", { geometry: Ge, material: g.core, onClick: A, onPointerOver: () => document.body.style.cursor = "pointer", onPointerOut: () => document.body.style.cursor = "" }),
223
223
  /* @__PURE__ */ u("mesh", { geometry: Ge, material: g.hot, scale: 0.5 }),
224
- /* @__PURE__ */ u("group", { ref: a, scale: 1e-4, children: F.map((B, x) => /* @__PURE__ */ u("mesh", { geometry: Pt, material: g.spike, quaternion: B, scale: [0.2, 1.9, 0.2] }, x)) })
224
+ /* @__PURE__ */ u("group", { ref: a, scale: 1e-4, children: F.map((B, x) => /* @__PURE__ */ u("mesh", { geometry: Vt, material: g.spike, quaternion: B, scale: [0.2, 1.9, 0.2] }, x)) })
225
225
  ] }),
226
226
  /* @__PURE__ */ u("mesh", { ref: i, geometry: Ft, material: g.ring, visible: !1 }),
227
227
  /* @__PURE__ */ u("sprite", { ref: h, material: g.halo }),
@@ -240,9 +240,9 @@ function _t({ agent: e, onSelect: r }) {
240
240
  ] })
241
241
  ] });
242
242
  }
243
- const ke = new o.Vector3(), qe = new o.Vector3(), Ne = new o.Vector3(), kt = new o.Vector3(0, 1, 0);
243
+ const _e = new o.Vector3(), qe = new o.Vector3(), Ne = new o.Vector3(), kt = new o.Vector3(0, 1, 0);
244
244
  function It({ comet: e }) {
245
- const r = z(null), t = L.instances.get(e.from), n = t ? Pe[t.type] : Pe.planner, s = P(() => le(new o.Color(n).multiplyScalar(1.8).addScalar(0.3)), [n]), a = P(() => ({ a: new o.Vector3(), b: new o.Vector3(), c: new o.Vector3(), h: new o.Vector3() }), []);
245
+ const r = z(null), t = L.instances.get(e.from), n = t ? Ve[t.type] : Ve.planner, s = V(() => le(new o.Color(n).multiplyScalar(1.8).addScalar(0.3)), [n]), a = V(() => ({ a: new o.Vector3(), b: new o.Vector3(), c: new o.Vector3(), h: new o.Vector3() }), []);
246
246
  return re(() => {
247
247
  const i = ge(e.from), p = ge(e.to);
248
248
  if (!i || !p || !r.current) {
@@ -314,7 +314,7 @@ void main(){
314
314
  }`
315
315
  );
316
316
  function $t({ galaxy: e }) {
317
- const r = P(() => jt(e), [e]), t = r.nodes.length, { size: n, gl: s, camera: a } = lt(), i = z([]), p = z([]), h = z(Array(Te).fill("")), m = P(() => {
317
+ const r = V(() => jt(e), [e]), t = r.nodes.length, { size: n, gl: s, camera: a } = lt(), i = z([]), p = z([]), h = z(Array(Te).fill("")), m = V(() => {
318
318
  const c = new Float32Array(t * 3), A = [], y = Math.PI * (3 - Math.sqrt(5));
319
319
  for (let d = 0; d < t; d++) {
320
320
  const b = 1 - 2 * (d + 0.5) / t, O = Math.sqrt(1 - b * b), K = new o.Vector3(Math.cos(d * y) * O, b, Math.sin(d * y) * O);
@@ -336,7 +336,7 @@ function $t({ galaxy: e }) {
336
336
  }
337
337
  b > d && (f.push([d, b]), T.push(0)), O > d && (f.push([d, O]), T.push(0));
338
338
  }
339
- const W = new Float32Array(f.length * ce * 2 * 3), I = new Float32Array(f.length * ce * 2 * 3), V = new Int32Array(f.length * ce * 2 * 2), j = new Uint8Array(f.length * ce * 2), N = new o.Quaternion(), w = new o.Vector3();
339
+ const W = new Float32Array(f.length * ce * 2 * 3), I = new Float32Array(f.length * ce * 2 * 3), P = new Int32Array(f.length * ce * 2 * 2), j = new Uint8Array(f.length * ce * 2), N = new o.Quaternion(), w = new o.Vector3();
340
340
  f.forEach(([d, b], O) => {
341
341
  const K = A[d], Z = A[b], U = K.angleTo(Z), l = new o.Vector3().crossVectors(K, Z);
342
342
  l.lengthSq() < 1e-6 && l.set(0, 1, 0), l.normalize();
@@ -345,14 +345,14 @@ function $t({ galaxy: e }) {
345
345
  const R = (v + E) / ce;
346
346
  N.setFromAxisAngle(l, U * R), w.copy(K).applyQuaternion(N).multiplyScalar(oe * (1 + 0.06 * Math.sin(Math.PI * R) * Math.min(1, U)));
347
347
  const q = (O * ce + v) * 2 + E;
348
- W.set([w.x, w.y, w.z], q * 3), V[q * 2] = d, V[q * 2 + 1] = b, j[q] = T[O];
348
+ W.set([w.x, w.y, w.z], q * 3), P[q * 2] = d, P[q * 2 + 1] = b, j[q] = T[O];
349
349
  }
350
350
  });
351
351
  const $ = new o.BufferGeometry();
352
352
  $.setAttribute("position", new o.BufferAttribute(W, 3)), $.setAttribute("color", new o.BufferAttribute(I, 3));
353
353
  const X = new o.BufferGeometry();
354
- return X.setAttribute("position", new o.BufferAttribute(new Float32Array(Re * me * 2 * 3), 3)), X.setAttribute("color", new o.BufferAttribute(new Float32Array(Re * me * 2 * 3), 3)), X.boundingSphere = new o.Sphere(new o.Vector3(), 1e4), { pos: c, unit: A, base: B, ngeo: k, ageo: $, owner: V, kindOf: j, nArcV: f.length * ce * 2, bgeo: X, fire: new Float32Array(t), white: new Float32Array(t), fireC: Array.from({ length: t }, () => new o.Color()) };
355
- }, [r, t]), M = P(
354
+ return X.setAttribute("position", new o.BufferAttribute(new Float32Array(Re * me * 2 * 3), 3)), X.setAttribute("color", new o.BufferAttribute(new Float32Array(Re * me * 2 * 3), 3)), X.boundingSphere = new o.Sphere(new o.Vector3(), 1e4), { pos: c, unit: A, base: B, ngeo: k, ageo: $, owner: P, kindOf: j, nArcV: f.length * ce * 2, bgeo: X, fire: new Float32Array(t), white: new Float32Array(t), fireC: Array.from({ length: t }, () => new o.Color()) };
355
+ }, [r, t]), M = V(
356
356
  () => ({
357
357
  nodes: new o.ShaderMaterial({ uniforms: { uScale: { value: 400 } }, vertexShader: Ht, fragmentShader: Lt, transparent: !0, depthWrite: !1, blending: o.AdditiveBlending }),
358
358
  arcs: new o.LineBasicMaterial({ vertexColors: !0, transparent: !0, blending: o.AdditiveBlending, depthWrite: !1, toneMapped: !1 }),
@@ -375,19 +375,19 @@ function $t({ galaxy: e }) {
375
375
  aura: le(new o.Color("#4c1d95").multiplyScalar(0.28))
376
376
  }),
377
377
  []
378
- ), S = P(() => /* @__PURE__ */ new Map(), []), F = P(() => new ze(Re), []), C = P(() => ({ v: new o.Vector3(), v2: new o.Vector3(), mid: new o.Vector3(), sp: new o.Vector3(), c: new o.Color(), c2: new o.Color() }), []), g = (c) => {
378
+ ), S = V(() => /* @__PURE__ */ new Map(), []), F = V(() => new ze(Re), []), C = V(() => ({ v: new o.Vector3(), v2: new o.Vector3(), mid: new o.Vector3(), sp: new o.Vector3(), c: new o.Color(), c2: new o.Color() }), []), g = (c) => {
379
379
  let A = S.get(c);
380
380
  return A === void 0 && S.set(c, A = bt(r, c)), A;
381
381
  };
382
382
  return re(({ clock: c }) => {
383
383
  const A = performance.now(), { pos: y, base: B, fire: x, white: _, fireC: k, unit: G } = m;
384
384
  M.nodes.uniforms.uScale.value = n.height * s.getPixelRatio() / (2 * Math.tan(a.fov * Math.PI / 360)) * vt.graph.scale, M.orb.uniforms.uTime.value = fe ? 0 : c.elapsedTime, x.fill(0), _.fill(0);
385
- const { v: f, v2: T, mid: W, c: I, c2: V } = C, j = m.bgeo.getAttribute("position"), N = m.bgeo.getAttribute("color"), w = M.orb.uniforms.uRipC.value, $ = M.orb.uniforms.uRipA.value;
385
+ const { v: f, v2: T, mid: W, c: I, c2: P } = C, j = m.bgeo.getAttribute("position"), N = m.bgeo.getAttribute("color"), w = M.orb.uniforms.uRipC.value, $ = M.orb.uniforms.uRipA.value;
386
386
  let X = 0;
387
387
  F.begin();
388
388
  let d = 0;
389
389
  for (const l of L.flares) {
390
- const v = g(l.node), E = (A - l.start) / 1e3, R = L.instances.get(l.instance), q = R ? Pe[R.type] : ve, D = l.op === "write", ie = E < 0.35 ? E / 0.35 : Math.exp(-(E - 0.35) * 1.2);
390
+ const v = g(l.node), E = (A - l.start) / 1e3, R = L.instances.get(l.instance), q = R ? Ve[R.type] : ve, D = l.op === "write", ie = E < 0.35 ? E / 0.35 : Math.exp(-(E - 0.35) * 1.2);
391
391
  ie > x[v] && (x[v] = ie, k[v].copy(D ? ve : q), _[v] = D ? 1 : 0), D && E < 1.8 && d < pe && (w[d].copy(G[v]), $[d] = E / 1.8, d++);
392
392
  const Q = ge(l.instance), H = Q ? wt(Q, C.sp) : void 0;
393
393
  if (H && E < 2.2 && X < Re) {
@@ -397,10 +397,10 @@ function $t({ galaxy: e }) {
397
397
  for (let Ce = 0; Ce < 2; Ce++) {
398
398
  const J = (Se + Ce) / me, ae = 1 - J;
399
399
  T.set(ae * ae * H.x + 2 * ae * J * W.x + J * J * f.x, ae * ae * H.y + 2 * ae * J * W.y + J * J * f.y, ae * ae * H.z + 2 * ae * J * W.z + J * J * f.z);
400
- const Ue = (X * me + Se) * 2 + Ce;
401
- j.setXYZ(Ue, T.x, T.y, T.z);
400
+ const Ke = (X * me + Se) * 2 + Ce;
401
+ j.setXYZ(Ke, T.x, T.y, T.z);
402
402
  const ot = Math.exp(-(((J - tt) / 0.1) ** 2)) * 1.3;
403
- V.copy(D ? ve : q).multiplyScalar(ue * ((D ? 0.5 : 0.2) + ot) * 0.75), N.setXYZ(Ue, V.r, V.g, V.b);
403
+ P.copy(D ? ve : q).multiplyScalar(ue * ((D ? 0.5 : 0.2) + ot) * 0.75), N.setXYZ(Ke, P.r, P.g, P.b);
404
404
  }
405
405
  D ? F.add(H, W, f, 0.9, 1, 0.42, ve, ue * 1.1) : F.add(H, W, f, 0.1, -1, 0.42, q, ue * 1.3), X++;
406
406
  }
@@ -455,10 +455,10 @@ function $t({ galaxy: e }) {
455
455
  ] });
456
456
  }
457
457
  function Xt({ run: e }) {
458
- const r = P(() => new o.Color(e.color), [e.color]), t = P(() => le("#000"), []), n = z(null), s = z(null);
458
+ const r = V(() => new o.Color(e.color), [e.color]), t = V(() => le("#000"), []), n = z(null), s = z(null);
459
459
  return re(({ clock: a }) => {
460
460
  var C;
461
- const i = performance.now(), p = e.run ?? L.runs.get(e.id), h = p ? Ie((i - p.startedAt) / 1200) : 1, m = p != null && p.endedAt ? ee(1 - (i - p.endedAt - (Mt - 2500)) / 2500) : 1, M = 0.9 + 0.1 * Math.sin(a.elapsedTime * 0.6 + e.index);
461
+ const i = performance.now(), p = e.run ?? L.runs.get(e.id), h = p ? ke((i - p.startedAt) / 1200) : 1, m = p != null && p.endedAt ? ee(1 - (i - p.endedAt - (Mt - 2500)) / 2500) : 1, M = 0.9 + 0.1 * Math.sin(a.elapsedTime * 0.6 + e.index);
462
462
  t.color.copy(r).multiplyScalar(0.16 * h * m * M);
463
463
  const S = Math.abs(e.side.x) * e.hu + Math.abs(e.axis.x) * e.hv, F = Math.abs(e.side.y) * e.hu + Math.abs(e.axis.y) * e.hv;
464
464
  n.current && (n.current.position.set(e.origin.x, e.origin.y, -1.5), n.current.scale.set(S * 2.6 + 3, F * 2.6 + 3, 1)), (C = s.current) == null || C.position.set(e.origin.x, e.origin.y + F + 0.6, 0.5);
@@ -510,10 +510,10 @@ function Jt(e) {
510
510
  }
511
511
  }
512
512
  function eo({ mcp: e, backend: r }) {
513
- const t = e.srv, n = r.res, s = P(() => Jt(n.kind), [n.kind]), a = P(() => new o.Color(t.color).lerp(Je, 0.35), [t.color]), i = P(
513
+ const t = e.srv, n = r.res, s = V(() => Jt(n.kind), [n.kind]), a = V(() => new o.Color(t.color).lerp(Je, 0.35), [t.color]), i = V(
514
514
  () => ({ edge: Qe(t.color, 0.035, 1), arrow: se(a), fill: se(a), line: new o.LineBasicMaterial({ color: a, transparent: !0, blending: o.AdditiveBlending, depthWrite: !1, toneMapped: !1 }), halo: le(a) }),
515
515
  [t.color, a]
516
- ), p = z(null), h = z(null), m = z(null), M = z(null), S = P(() => new o.Color(t.color), [t.color]), F = z(null), C = z("");
516
+ ), p = z(null), h = z(null), m = z(null), M = z(null), S = V(() => new o.Color(t.color), [t.color]), F = z(null), C = z("");
517
517
  return re(({ clock: g }) => {
518
518
  var j, N;
519
519
  const c = i.edge.uniforms;
@@ -532,14 +532,14 @@ function eo({ mcp: e, backend: r }) {
532
532
  f.uTime.value = fe ? 0 : g.elapsedTime;
533
533
  let T = null;
534
534
  for (const w of L.mcpCalls) w.server === t.name && w.resource === n.name && (!T || w.start > T.start) && (T = w);
535
- const W = T && T.phase === "result" ? (A - T.start) / T.dur : 9, I = W < 1, V = M.current;
535
+ const W = T && T.phase === "result" ? (A - T.start) / T.dur : 9, I = W < 1, P = M.current;
536
536
  if (I) {
537
537
  const w = Me(W);
538
- f.uRadius.value = 0.06, f.uOpacity.value = 0.9 * (1 - W * 0.6), f.uFlow.value = 0, f.uHead.value = 1 - w, f.uTail.value = 0.2, f.uHeadColor.value.copy(a).multiplyScalar(3), V && (V.visible = !0, He(V, f.uP0.value, f.uP1.value, f.uP2.value, 0.12, -1, 0.55), i.arrow.color.copy(a).multiplyScalar(2 * (1 - W * 0.7)));
539
- } else y ? (f.uRadius.value = 0.03, f.uOpacity.value = 0.45, f.uFlow.value = 1, f.uHead.value = -1, V && (V.visible = !0, He(V, f.uP0.value, f.uP1.value, f.uP2.value, 0.84, 1, 0.42), i.arrow.color.copy(S).multiplyScalar(1.1))) : (f.uRadius.value = 0.03, f.uOpacity.value = 0.15 + B * 0.4, f.uFlow.value = 0, f.uHead.value = -1, V && (V.visible = !1));
538
+ f.uRadius.value = 0.06, f.uOpacity.value = 0.9 * (1 - W * 0.6), f.uFlow.value = 0, f.uHead.value = 1 - w, f.uTail.value = 0.2, f.uHeadColor.value.copy(a).multiplyScalar(3), P && (P.visible = !0, He(P, f.uP0.value, f.uP1.value, f.uP2.value, 0.12, -1, 0.55), i.arrow.color.copy(a).multiplyScalar(2 * (1 - W * 0.7)));
539
+ } else y ? (f.uRadius.value = 0.03, f.uOpacity.value = 0.45, f.uFlow.value = 1, f.uHead.value = -1, P && (P.visible = !0, He(P, f.uP0.value, f.uP1.value, f.uP2.value, 0.84, 1, 0.42), i.arrow.color.copy(S).multiplyScalar(1.1))) : (f.uRadius.value = 0.03, f.uOpacity.value = 0.15 + B * 0.4, f.uFlow.value = 0, f.uHead.value = -1, P && (P.visible = !1));
540
540
  }), /* @__PURE__ */ Y(de, { children: [
541
541
  /* @__PURE__ */ u("mesh", { geometry: Ze, material: i.edge, frustumCulled: !1 }),
542
- /* @__PURE__ */ u("mesh", { ref: M, geometry: Ke, material: i.arrow, visible: !1 }),
542
+ /* @__PURE__ */ u("mesh", { ref: M, geometry: Ie, material: i.arrow, visible: !1 }),
543
543
  /* @__PURE__ */ Y("group", { ref: p, children: [
544
544
  /* @__PURE__ */ u("sprite", { ref: m, material: i.halo }),
545
545
  /* @__PURE__ */ u("group", { ref: h, children: s.map((g, c) => /* @__PURE__ */ Y("group", { position: g.pos, rotation: g.rot, children: [
@@ -551,7 +551,7 @@ function eo({ mcp: e, backend: r }) {
551
551
  ] });
552
552
  }
553
553
  function to({ mcp: e }) {
554
- const r = e.srv, t = P(() => new o.Color(r.color), [r.color]), n = P(
554
+ const r = e.srv, t = V(() => new o.Color(r.color), [r.color]), n = V(
555
555
  () => ({ fill: se(t), line: new o.LineBasicMaterial({ color: t, transparent: !0, blending: o.AdditiveBlending, depthWrite: !1, toneMapped: !1 }), halo: le(t), core: se("#fff") }),
556
556
  [t]
557
557
  ), s = z(null), a = z(null), i = z(null);
@@ -571,7 +571,7 @@ function to({ mcp: e }) {
571
571
  ] });
572
572
  }
573
573
  function oo({ call: e }) {
574
- const r = L.mcpServers.get(e.server), t = P(() => new o.Color((r == null ? void 0 : r.color) ?? "#fff"), [r]), n = P(() => le(t.clone().multiplyScalar(1.8).addScalar(0.3)), [t]), s = z(null), a = P(() => ({ a: new o.Vector3(), b: new o.Vector3(), c: new o.Vector3(), h: new o.Vector3() }), []);
574
+ const r = L.mcpServers.get(e.server), t = V(() => new o.Color((r == null ? void 0 : r.color) ?? "#fff"), [r]), n = V(() => le(t.clone().multiplyScalar(1.8).addScalar(0.3)), [t]), s = z(null), a = V(() => ({ a: new o.Vector3(), b: new o.Vector3(), c: new o.Vector3(), h: new o.Vector3() }), []);
575
575
  return re(() => {
576
576
  const i = ge(e.instance), p = Ye(e.server);
577
577
  if (!s.current) return;
@@ -584,39 +584,39 @@ function oo({ call: e }) {
584
584
  ne(a.a, a.c, a.b, e.phase === "call" ? m : 1 - m, a.h), s.current.visible = h < 1, s.current.position.copy(a.h), s.current.scale.setScalar(1);
585
585
  }), /* @__PURE__ */ u("sprite", { ref: s, material: n, visible: !1 });
586
586
  }
587
- const Ve = 24, he = 40, we = 3;
587
+ const Pe = 24, he = 40, we = 3;
588
588
  function no() {
589
- const e = P(() => {
589
+ const e = V(() => {
590
590
  const s = new o.BufferGeometry();
591
- return s.setAttribute("position", new o.BufferAttribute(new Float32Array(Ve * we * he * 2 * 3), 3)), s.setAttribute("color", new o.BufferAttribute(new Float32Array(Ve * we * he * 2 * 3), 3)), s.boundingSphere = new o.Sphere(new o.Vector3(), 1e4), s;
592
- }, []), r = P(() => new o.LineBasicMaterial({ vertexColors: !0, transparent: !0, blending: o.AdditiveBlending, depthWrite: !1, toneMapped: !1 }), []), t = P(() => new ze(Ve), []), n = P(() => ({ a: new o.Vector3(), b: new o.Vector3(), c: new o.Vector3(), p: new o.Vector3(), col: new o.Color(), k: new o.Color() }), []);
591
+ return s.setAttribute("position", new o.BufferAttribute(new Float32Array(Pe * we * he * 2 * 3), 3)), s.setAttribute("color", new o.BufferAttribute(new Float32Array(Pe * we * he * 2 * 3), 3)), s.boundingSphere = new o.Sphere(new o.Vector3(), 1e4), s;
592
+ }, []), r = V(() => new o.LineBasicMaterial({ vertexColors: !0, transparent: !0, blending: o.AdditiveBlending, depthWrite: !1, toneMapped: !1 }), []), t = V(() => new ze(Pe), []), n = V(() => ({ a: new o.Vector3(), b: new o.Vector3(), c: new o.Vector3(), p: new o.Vector3(), col: new o.Color(), k: new o.Color() }), []);
593
593
  return re(({ clock: s }) => {
594
594
  const a = performance.now(), i = fe ? 0 : s.elapsedTime, p = e.getAttribute("position"), h = e.getAttribute("color");
595
595
  let m = 0;
596
596
  t.begin();
597
597
  const M = (S, F, C, g) => {
598
- if (m >= Ve) return;
598
+ if (m >= Pe) return;
599
599
  const c = ge(S), A = L.mcpServers.get(F), y = Ye(F);
600
600
  if (!c || !A || !y) return;
601
601
  const { a: B, b: x, c: _, p: k, col: G, k: f } = n;
602
602
  B.copy(c), x.copy(y), Oe(B, x, 1, _), G.set(A.color);
603
603
  let T;
604
- C === 0 ? (G.lerp(Yt, ee(g / 1.2)), g > 1.2 && G.lerp(Zt, ee((g - 1.2) / 1)), T = (0.22 + Math.min(0.6, g * 0.25)) * Ie(g / 0.3)) : (f.copy(G).lerp(Je, 0.35), T = 1.3 * (g < 0.75 ? 1 : 1 - (g - 0.75) / 0.25));
604
+ C === 0 ? (G.lerp(Yt, ee(g / 1.2)), g > 1.2 && G.lerp(Zt, ee((g - 1.2) / 1)), T = (0.22 + Math.min(0.6, g * 0.25)) * ke(g / 0.3)) : (f.copy(G).lerp(Je, 0.35), T = 1.3 * (g < 0.75 ? 1 : 1 - (g - 0.75) / 0.25));
605
605
  const W = 1 - Me(g / 0.75), I = C === 0 ? 0.025 : 0.07;
606
- for (let V = 0; V < we; V++) {
607
- const j = (V - 1) * I;
606
+ for (let P = 0; P < we; P++) {
607
+ const j = (P - 1) * I;
608
608
  for (let N = 0; N < he; N++)
609
609
  for (let w = 0; w < 2; w++) {
610
610
  const $ = (N + w) / he;
611
611
  ne(B, _, x, $, k);
612
- const X = ((m * we + V) * he + N) * 2 + w;
612
+ const X = ((m * we + P) * he + N) * 2 + w;
613
613
  p.setXYZ(X, k.x + j, k.y - j, k.z + j * 0.5);
614
614
  let d;
615
615
  if (C === 0) {
616
616
  const O = Math.pow(Math.max(0, Math.sin($ * 20 - i * 2.2)), 8);
617
- d = T * (0.3 + O * 1.5) * (V === 1 ? 1 : 0.25);
617
+ d = T * (0.3 + O * 1.5) * (P === 1 ? 1 : 0.25);
618
618
  } else
619
- d = T * (0.3 + Math.exp(-((($ - W) / 0.07) ** 2)) * 3.2 * (g < 0.8 ? 1 : 0)) * (V === 1 ? 1 : 0.65);
619
+ d = T * (0.3 + Math.exp(-((($ - W) / 0.07) ** 2)) * 3.2 * (g < 0.8 ? 1 : 0)) * (P === 1 ? 1 : 0.65);
620
620
  const b = C === 0 ? G : f;
621
621
  h.setXYZ(X, b.r * d, b.g * d, b.b * d);
622
622
  }
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import "./style.css";
3
- import { A as E, T as s, a as T } from "./chunks/index-Bp54n3io.js";
3
+ import { A as E, T as s, a as T } from "./chunks/index-D_pLQJb9.js";
4
4
  export {
5
5
  E as AgentScene,
6
6
  s as THEMES,
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .scene-root{position:fixed;top:0;right:0;bottom:0;left:0;background:#03050b;color:#e8edf5;font-family:Public Sans,system-ui,sans-serif;overflow:hidden}.scene-root canvas{display:block}.hud{position:absolute;z-index:10;background:#0a0e1a8c;border:1px solid rgba(148,163,255,.16);border-radius:14px;backdrop-filter:blur(14px) saturate(1.3);-webkit-backdrop-filter:blur(14px) saturate(1.3);box-shadow:0 8px 32px #00000059,inset 0 1px #ffffff0a}.hud-topwrap{position:absolute;z-index:10;top:12px;left:12px;max-width:calc(100% - var(--hud-side, 320px) - 36px);display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;pointer-events:none}.hud-topwrap.is-rail{--hud-side: 40px}.hud-topwrap>*{pointer-events:auto}.hud-top{position:relative;padding:6px 8px 6px 12px;min-width:0}.hud-bar{display:flex;align-items:center;gap:4px 8px;flex-wrap:wrap}.hud-bar .hud-run{margin-top:0}.hud-info{all:unset;cursor:pointer;width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font:italic 600 11px/1 Georgia,serif;color:#94a3b8;border:1px solid rgba(148,163,184,.35)}.hud-info:hover,.hud-info.on{color:#e2e8f0;border-color:#818cf8}.hud-theme{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#03050b8c url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M0 0l4 5 4-5z' fill='%2394a3b8'/%3E%3C/svg%3E") no-repeat right 9px center;color:#cbd5e1;border:1px solid rgba(148,163,255,.22);border-radius:999px;font:inherit;font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:4px 24px 4px 10px;cursor:pointer;outline:none}.hud-theme:hover{border-color:#818cf8}.hud-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px;letter-spacing:-.01em;white-space:nowrap}.hud-sub{margin:6px 0 2px;max-width:460px;font-size:12px;line-height:1.45;color:#94a3b8}.hud-dot{width:9px;height:9px;border-radius:50%;background:#22c55e;box-shadow:0 0 10px #22c55e;animation:hud-ping 1.6s ease-out infinite}@keyframes hud-ping{0%{box-shadow:0 0 #22c55eb3}to{box-shadow:0 0 0 10px #22c55e00}}.hud-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;padding:2px 7px;border-radius:999px;background:#94a3b829;color:#cbd5e1}.hud-stats{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.hud-stat{font-size:11px;color:#94a3b8;padding:2px 8px;border-radius:999px;background:#03050b66;white-space:nowrap}.hud-stat b{color:#f1f5f9;font-weight:700;font-variant-numeric:tabular-nums}.hud-dec{--dc: 94, 234, 212;animation:hud-dec-pulse .7s ease-out}.hud-dec.is-deny{--dc: 251, 59, 92}@keyframes hud-dec-pulse{0%{background:rgba(var(--dc),.5);box-shadow:0 0 rgba(var(--dc),.7);color:#fff}35%{background:rgba(var(--dc),.28);box-shadow:0 0 0 5px rgba(var(--dc),0)}to{background:#03050b66;box-shadow:0 0 rgba(var(--dc),0)}}@media(prefers-reduced-motion:reduce){.hud-dec{animation:none}}.hud-dec-hv{display:inline-flex;align-items:center;gap:4px;color:#a7f3d0;background:#5eead41a}.hud-dec-hv.is-deny{color:#fecdd3;background:#fb3b5c24}.hud-spark{color:#5eead4;margin-left:2px}.hud-dec-hv.is-deny .hud-spark{color:#fb7185}.scene-root :focus-visible{outline:2px solid #818cf8;outline-offset:2px}.hud-side{top:12px;right:12px;bottom:12px;width:320px;display:flex;flex-direction:column;padding:8px 10px 10px;font-size:13px;box-sizing:border-box;animation:hs-in .18s ease-out}.hud-side.is-rail{width:40px;padding:6px 0;align-items:center}@keyframes hs-in{0%{opacity:.4}}.hs-head{display:flex;align-items:center;gap:2px;padding-bottom:8px;margin:0 -2px 2px;border-bottom:1px solid rgba(148,163,255,.12)}.hs-head button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8;padding:5px 9px;border-radius:999px}.hs-head button:hover{color:#e2e8f0}.hs-head button.on{color:#f1f5f9;background:#818cf838}.hs-head em,.hs-icon em{font-style:normal;font-size:10px;font-weight:700;font-variant-numeric:tabular-nums;color:#c7d2fe;letter-spacing:0}.hs-head .hs-collapse{margin-left:auto;font-size:14px;padding:2px 8px;letter-spacing:0}.hs-rail{display:flex;flex-direction:column;align-items:center;gap:6px}.hs-rail button{all:unset;cursor:pointer;position:relative;width:30px;height:30px;display:grid;place-items:center;border-radius:9px;color:#94a3b8}.hs-rail button:hover{color:#e2e8f0;background:#94a3ff1a}.hs-rail .hs-collapse{font-size:14px;margin-bottom:4px}.hs-icon em{position:absolute;top:-3px;right:-5px;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;border-radius:999px;display:grid;place-items:center;font-size:9px;background:#4f46e5;color:#eef2ff}.hs-icon em:empty{min-width:8px;width:8px;height:8px;padding:0;top:1px;right:1px;background:#22d3ee;box-shadow:0 0 8px #22d3ee}.hs-body{flex:1;min-height:0;display:flex;flex-direction:column}.hs-body[hidden]{display:none}.hs-empty{margin:14px 4px;font-size:12px;line-height:1.5;color:#64748b}.hs-events{list-style:none;margin:6px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1;font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hs-events li>*{all:unset;box-sizing:border-box;width:100%;display:flex;gap:8px;align-items:baseline;padding:4px 6px;border-radius:7px;color:#cbd5e1;line-height:1.4}.hs-events li>button{cursor:pointer}.hs-events li>button:hover{background:#94a3ff1a;color:#f1f5f9}.hs-events i{flex:0 0 7px;height:7px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);transform:translateY(-1px)}.hs-events span{min-width:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere}.ap-head{display:flex;align-items:center;gap:8px;margin-top:6px}.ap-count{flex:none;color:#64748b;font-size:11px;font-variant-numeric:tabular-nums}.ap-link{all:unset;cursor:pointer;font-size:12px;color:#93c5fd}.ap-link:hover{color:#bfdbfe}.ap-searchrow{display:flex;align-items:center;gap:8px;margin-top:8px}.ap-search{flex:1;min-width:0;width:100%;box-sizing:border-box;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:8px;color:inherit;font:inherit;font-size:12px;padding:6px 9px;outline:none}.ap-search:focus{border-color:#818cf8}.ap-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}.ap-chips button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;padding:3px 7px;border-radius:999px;border:1px solid rgba(148,163,255,.15);color:#cbd5e1}.ap-chips button.on{border-color:var(--c);background:color-mix(in srgb,var(--c) 18%,transparent);color:#f8fafc}.ap-chips i{width:8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-chips em{font-style:normal;color:var(--c);font-weight:700;font-variant-numeric:tabular-nums}.ap-row-filters{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center}.ap-seg{display:flex;border:1px solid rgba(148,163,255,.15);border-radius:8px;overflow:hidden}.ap-seg{flex:none}.ap-seg button{all:unset;cursor:pointer;font-size:11px;padding:3px 6px;color:#94a3b8;text-transform:capitalize}.ap-seg button.on{background:#818cf840;color:#f1f5f9}.ap-row-filters select{flex:1;min-width:64px;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.15);border-radius:8px;font:inherit;font-size:11px;padding:3px 6px}.ap-list{list-style:none;margin:8px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1}.ap-list li button{all:unset;box-sizing:border-box;width:100%;cursor:pointer;display:flex;align-items:center;gap:8px;padding:6px;border-radius:8px}.ap-list li button:hover{background:#94a3ff1a}.ap-list li button.is-done{opacity:.55}.ap-list i{flex:0 0 9px;height:9px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-list i[data-status=thinking]{animation:ap-pulse .9s ease-in-out infinite}.ap-list i[data-status=waiting]{opacity:.5}.ap-list i[data-status=done]{background:transparent;border:1.5px solid var(--c);box-shadow:none}@keyframes ap-pulse{50%{transform:scale(1.5)}}.ap-name{flex:1;min-width:0;display:flex;flex-direction:column;font-size:12px;color:#e2e8f0}.ap-name small{color:#64748b;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-meta{text-align:right;font-size:11px;color:#94a3b8;font-variant-numeric:tabular-nums;display:flex;flex-direction:column}.ap-meta b{color:var(--c);font-weight:600;text-transform:lowercase}.hs-events li.is-skill>*{background:#f5b83d12}.hs-skill{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-title{display:flex;align-items:center;gap:6px;min-width:0}.ap-skill{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-size:9.5px;font-weight:600;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-skill:before{content:"skill:";color:#b8893a;font-weight:500}.hs-skill:before{content:"";display:inline-block;width:6px;height:6px;margin:0 4px 0 -1px;border:1px solid currentColor;border-radius:50%;vertical-align:0;box-shadow:0 0 4px #f5b83d99}.hs-events li.is-dec>*{background:#5eead40d}.hs-events li.is-deny>*{background:#fb3b5c1f}.hs-dec{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:var(--c);padding:0 6px;border-radius:3px;border:1px solid var(--c);background:#ffffff0a}.ap-decisions{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:3px}.ap-decisions li{display:flex;gap:6px;align-items:baseline;font-size:11px;color:#e2e8f0;padding:2px 6px;border-left:2px solid var(--c);background:#ffffff08}.ap-decisions li.is-deny{background:#fb3b5c1f}.ap-decisions li.is-strike span{text-decoration:line-through;color:#94a3b8}.ap-hv{font-size:11.5px;color:#e2e8f0;margin:0 0 4px;font-variant-numeric:tabular-nums}.ap-hv-bar{display:flex;height:6px;border-radius:3px;overflow:hidden;gap:1px;background:#ffffff0d}.ap-hv-bar span{flex-basis:0;min-width:2px}.ap-decisions b{flex:0 0 auto;font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c)}.ap-decisions span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ap-decisions em{flex:0 0 auto;font-style:normal;font-size:10px;color:#94a3b8;font-variant-numeric:tabular-nums}.ap-skills{display:flex;flex-wrap:wrap;gap:4px}.ap-skills span{font-size:11px;color:#e2e8f0;padding:2px 8px;border-radius:999px;border:1px solid rgba(245,184,61,.35);background:#f5b83d0f;display:inline-flex;gap:5px;align-items:baseline}.ap-skills span.on{border-color:#f5b83d;background:#f5b83d2e;color:#fde7b0;box-shadow:0 0 10px #f5b83d40}.ap-skills em{font-style:normal;font-size:10px;color:#b8893a;font-variant-numeric:tabular-nums}.ap-more{padding:6px;color:#64748b;font-size:11px}.ap-detail{overflow-y:auto;min-height:0;margin-top:8px;flex:1}.ap-detail h3{margin:0;display:flex;align-items:center;gap:8px;font-size:15px;color:var(--c)}.ap-detail h3 i{width:11px;height:11px;border-radius:50%;background:var(--c);box-shadow:0 0 10px var(--c)}.ap-detail h3 small{color:#64748b;font-size:11px;font-weight:500}.ap-status{margin-top:3px;font-size:12px;color:#cbd5e1}.ap-status[data-status=thinking]{color:#fde68a}.ap-status[data-status=waiting]{color:#fcd34d}.ap-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(46px,1fr));gap:4px;margin:10px 0 4px}.ap-stats div{background:#03050b73;border-radius:8px;padding:6px;text-align:center}.ap-stats dt{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:#64748b}.ap-stats dd{margin:2px 0 0;font-size:15px;font-weight:700;color:#f1f5f9;font-variant-numeric:tabular-nums}.ap-detail section{margin-top:10px}.ap-detail h4{margin:0 0 4px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#64748b}.ap-detail p{margin:0;font-size:12px;color:#cbd5e1}.ap-steps{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.ap-steps span{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;border-radius:999px;border:1px solid #334155;color:#64748b}.ap-steps span[data-status=running]{border-color:#fbbf24;color:#fde68a}.ap-steps span[data-status=waiting]{border-color:#f59e0b;color:#fcd34d;background:#f59e0b24;animation:ap-wait-pulse 1.8s ease-in-out infinite}.ap-steps span[data-status=done]{border-color:#22c55e;color:#86efac}.ap-steps span[data-status=failed]{border-color:#ef4444;color:#fca5a5}.ap-chip-link{all:unset;cursor:pointer;display:block;font-size:12px;color:#e2e8f0;padding:3px 6px;border-left:2px solid var(--c);margin:2px 0;border-radius:0 6px 6px 0}.ap-chip-link:hover{background:#94a3ff1a}.ap-wait{color:#fbbf24!important;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.ap-nodes{line-height:1.5}.ap-chat{margin:0;padding:0;list-style:none;display:grid;gap:6px;font-size:12px;color:#e2e8f0;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;overflow-y:auto}.ap-chat li[data-role=user]{color:#c7d2fe}.ap-chat li[data-role=agent]{padding-bottom:6px;border-bottom:1px solid rgba(148,163,255,.12)}.ap-chat b{font-weight:650}.ap-events{margin:0;padding-left:14px;display:grid;gap:3px;font-size:11px;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hud-badge--live{background:#22c55e2e;color:#86efac}.hud-badge--denied{background:#f871712e;color:#fca5a5;text-transform:none;letter-spacing:.02em}.hud-chip{text-transform:none;letter-spacing:.02em;font-weight:500;background:#818cf829;color:#c7d2fe;white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis}.hud-chip b{font-weight:650;color:#e0e7ff}.hud-run{display:flex;gap:6px;margin-top:8px;align-items:center;flex-wrap:wrap}.hud-run input{flex:1;min-width:160px;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:999px;color:inherit;font:inherit;font-size:12px;padding:6px 11px;outline:none}.hud-run button{border:0;border-radius:999px;padding:6px 13px;font:inherit;font-size:12px;font-weight:600;background:linear-gradient(135deg,#818cf8,#22d3ee);color:#03050b;cursor:pointer}.hud-run button:disabled{opacity:.5}.hud-run select{max-width:160px;min-width:0;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.2);border-radius:999px;font:inherit;font-size:12px;padding:5px 9px;cursor:pointer}.hud-run span{font-size:11px;color:#86efac}.agentglow-embed{position:relative;overflow:hidden;width:100%;height:100%;min-height:320px;isolation:isolate}.agentglow-embed .scene-root{position:absolute;top:0;right:0;bottom:0;left:0}.lod-cluster-label{all:unset;box-sizing:border-box;display:grid;gap:1px;text-align:center;cursor:pointer;pointer-events:auto;font-size:12px;font-weight:600;color:#f8fafc;padding:4px 11px 5px;border-radius:12px;white-space:nowrap;background:#03050b9e;border:1px solid color-mix(in srgb,var(--c, #818cf8) 60%,transparent);text-shadow:0 0 10px var(--c, #818cf8);box-shadow:0 0 18px color-mix(in srgb,var(--c, #818cf8) 22%,transparent);transition:border-color .2s,background .2s}.lod-cluster-label:hover{background:color-mix(in srgb,var(--c, #818cf8) 22%,rgba(3,5,11,.7));border-color:var(--c, #818cf8)}.lod-cluster-label b{font-weight:700;letter-spacing:-.01em}.lod-cluster-label small{font-size:10px;font-weight:500;color:#94a3b8;text-shadow:none;font-variant-numeric:tabular-nums}.hud-dock{display:flex;align-items:center;gap:8px}.hud-dock:empty{display:none}.hud-dock>.hud{position:static}.hud-lod{padding:6px 8px 6px 12px;display:flex;align-items:center;gap:8px;font-size:12px;color:#cbd5e1;white-space:nowrap}.hud-lod span b{margin:0 1px}.hud-lod b{color:#f1f5f9;font-variant-numeric:tabular-nums}.hud-lod i{width:7px;height:7px;border-radius:50%;background:#a5b4fc;box-shadow:0 0 8px #a5b4fc}.hud-lod button{all:unset;cursor:pointer;font-size:11px;padding:3px 9px;border-radius:999px;border:1px solid rgba(148,163,255,.25);color:#c7d2fe}.hud-lod button:hover{background:#818cf833;color:#f8fafc}.scene-root{container:agscene / size}@container agscene (max-width: 719px){.scene-root .hud-top{padding:5px 7px 5px 10px}.scene-root .hud-title{font-size:13px}.scene-root .hud-theme{padding:3px 20px 3px 8px;font-size:10px;background-position:right 7px center}.scene-root .hud-stat:nth-child(n+3){display:none}.scene-root .hud-side:not(.is-rail){width:min(290px,calc(100% - 64px));padding:6px 8px 8px}.scene-root .hs-head button{padding:4px 6px;letter-spacing:.04em;font-size:10.5px}.scene-root .hs-head .hs-collapse{padding:2px 4px}.scene-root .ap-list li button{padding:4px 6px}.scene-root .hud-topwrap:not(.is-rail){--hud-side: min(290px, calc(100% - 64px) )}}@container agscene (max-height: 520px){.scene-root .hud-sub{max-height:4.5em;overflow:auto}}@keyframes ap-wait-pulse{50%{box-shadow:0 0 10px #f59e0b8c;border-color:#fbbf24}}@media(prefers-reduced-motion:reduce){.ap-steps span[data-status=waiting]{animation:none}}.hud-approve{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-top:8px}.hud-approve button{border:1px solid transparent;border-radius:999px;padding:5px 13px;font:inherit;font-size:12px;font-weight:650;cursor:pointer}.hud-approve .ha-yes{background:linear-gradient(135deg,#34d399,#22d3ee);color:#03050b}.hud-approve .ha-no{background:#fb3b5c24;border-color:#fb718599;color:#fecdd3}.hud-approve .ha-yes:hover{filter:brightness(1.1)}.hud-approve .ha-no:hover{background:#fb3b5c47}.hud-approve span{font-size:11px;color:#94a3b8}.hud-approve[data-verdict=approved] span,.hud-approve[data-verdict=approving] span{color:#86efac}.hud-approve[data-verdict=rejected] span,.hud-approve[data-verdict=rejecting] span,.hud-approve[data-verdict=error] span{color:#fda4af}.hud-approve.is-compact{margin-top:0;flex:none;gap:4px}.hud-approve.is-compact button{padding:3px 9px;font-size:11px}.hud-approvals{left:12px;bottom:12px;z-index:9;width:max-content;max-width:min(460px,calc(100% - 356px));padding:8px 10px;font-size:12px;box-sizing:border-box;border-color:#f59e0b73;box-shadow:0 8px 32px #00000059,0 0 18px #f59e0b1f}.hud-approvals.is-rail{max-width:min(460px,calc(100% - 76px))}.hud-approvals h4{margin:0 0 6px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#fcd34d;display:flex;gap:6px;align-items:baseline}.hud-approvals h4 em{font-style:normal;font-variant-numeric:tabular-nums;color:#fde68a}.hud-approvals ul{list-style:none;margin:0;padding:0;display:grid;gap:4px}.hud-approvals li{display:flex;align-items:center;gap:8px;min-width:0}.hud-approvals .ha-who{all:unset;cursor:pointer;flex:1;min-width:0;display:flex;align-items:baseline;gap:6px;padding:2px 4px;border-radius:6px}.hud-approvals .ha-who:hover{background:#94a3ff1a}.hud-approvals .ha-who i{flex:0 0 8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);align-self:center}.hud-approvals .ha-who b{color:#e2e8f0;font-weight:650;white-space:nowrap}.hud-approvals .ha-who span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fbbf24;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.hud-approvals p{margin:6px 0 0;font-size:11px;color:#64748b}@container agscene (max-width: 719px){.scene-root .hud-approvals{max-width:calc(100% - 76px);padding:6px 8px}.scene-root .hud-approvals .ha-who span{display:none}}.flow-run{display:flex;flex-direction:column;align-items:center;gap:4px;pointer-events:none}.flow-run .scene-label{font-size:11px;max-width:220px;overflow:hidden;text-overflow:ellipsis}.flow-steps{display:flex;gap:3px;font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.06em}.flow-steps span{padding:2px 5px;border-radius:999px;color:#64748b;background:#03050b8c;border:1px solid rgba(100,116,139,.35)}.flow-steps span[data-s=running]{color:#03050b;background:var(--c);border-color:var(--c);box-shadow:0 0 12px var(--c)}.flow-steps span[data-s=done]{color:var(--c);border-color:color-mix(in srgb,var(--c) 60%,transparent)}.flow-steps span[data-s=failed]{color:#fecaca;background:#7f1d1d}.flow-step{font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in srgb,var(--c) 70%,white);text-shadow:0 0 8px var(--c);opacity:.55;pointer-events:none;white-space:nowrap;transition:opacity .3s}.flow-step[data-s=running]{opacity:1}.flow-hint{font-size:10px;padding:1px 7px;opacity:.9}.flow-label-core{font-size:11px;letter-spacing:.04em}
1
+ .scene-root{position:fixed;top:0;right:0;bottom:0;left:0;background:#03050b;color:#e8edf5;font-family:Public Sans,system-ui,sans-serif;overflow:hidden}.scene-root canvas{display:block}.hud{position:absolute;z-index:10;background:#0a0e1a8c;border:1px solid rgba(148,163,255,.16);border-radius:14px;backdrop-filter:blur(14px) saturate(1.3);-webkit-backdrop-filter:blur(14px) saturate(1.3);box-shadow:0 8px 32px #00000059,inset 0 1px #ffffff0a}.hud-topwrap{position:absolute;z-index:10;top:12px;left:12px;max-width:calc(100% - var(--hud-side, 320px) - 36px);display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;pointer-events:none}.hud-topwrap.is-rail{--hud-side: 40px}.hud-topwrap>*{pointer-events:auto}.hud-top{position:relative;padding:6px 8px 6px 12px;min-width:0}.hud-bar{display:flex;align-items:center;gap:4px 8px;flex-wrap:wrap}.hud-bar .hud-run{margin-top:0}.hud-info{all:unset;cursor:pointer;width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font:italic 600 11px/1 Georgia,serif;color:#94a3b8;border:1px solid rgba(148,163,184,.35)}.hud-info:hover,.hud-info.on{color:#e2e8f0;border-color:#818cf8}.hud-theme{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#03050b8c url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M0 0l4 5 4-5z' fill='%2394a3b8'/%3E%3C/svg%3E") no-repeat right 9px center;color:#cbd5e1;border:1px solid rgba(148,163,255,.22);border-radius:999px;font:inherit;font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:4px 24px 4px 10px;cursor:pointer;outline:none}.hud-theme:hover{border-color:#818cf8}.hud-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px;letter-spacing:-.01em;white-space:nowrap}.hud-sub{margin:6px 0 2px;max-width:460px;font-size:12px;line-height:1.45;color:#94a3b8}.hud-dot{width:9px;height:9px;border-radius:50%;background:#22c55e;box-shadow:0 0 10px #22c55e;animation:hud-ping 1.6s ease-out infinite}@keyframes hud-ping{0%{box-shadow:0 0 #22c55eb3}to{box-shadow:0 0 0 10px #22c55e00}}.hud-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;padding:2px 7px;border-radius:999px;background:#94a3b829;color:#cbd5e1}.hud-stats{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.hud-stat{font-size:11px;color:#94a3b8;padding:2px 8px;border-radius:999px;background:#03050b66;white-space:nowrap}.hud-stat b{color:#f1f5f9;font-weight:700;font-variant-numeric:tabular-nums}.hud-dec{--dc: 94, 234, 212;animation:hud-dec-pulse .7s ease-out}.hud-dec.is-deny{--dc: 251, 59, 92}@keyframes hud-dec-pulse{0%{background:rgba(var(--dc),.5);box-shadow:0 0 rgba(var(--dc),.7);color:#fff}35%{background:rgba(var(--dc),.28);box-shadow:0 0 0 5px rgba(var(--dc),0)}to{background:#03050b66;box-shadow:0 0 rgba(var(--dc),0)}}@media(prefers-reduced-motion:reduce){.hud-dec{animation:none}}.hud-dec-hv{display:inline-flex;align-items:center;gap:4px;color:#a7f3d0;background:#5eead41a}.hud-dec-hv.is-deny{color:#fecdd3;background:#fb3b5c24}.hud-spark{color:#5eead4;margin-left:2px}.hud-dec-hv.is-deny .hud-spark{color:#fb7185}.hud-halt{color:#fecdd3;background:#fb3b5c38;box-shadow:inset 0 0 0 1px #fb3b5c8c;animation:hud-halt 1.6s ease-in-out infinite}.hud-halt b{color:#fb3b5c;letter-spacing:.04em}@keyframes hud-halt{50%{background:#fb3b5c57}}@media(prefers-reduced-motion:reduce){.hud-halt{animation:none}}.scene-root :focus-visible{outline:2px solid #818cf8;outline-offset:2px}.hud-side{top:12px;right:12px;bottom:12px;width:320px;display:flex;flex-direction:column;padding:8px 10px 10px;font-size:13px;box-sizing:border-box;animation:hs-in .18s ease-out}.hud-side.is-rail{width:40px;padding:6px 0;align-items:center}@keyframes hs-in{0%{opacity:.4}}.hs-head{display:flex;align-items:center;gap:2px;padding-bottom:8px;margin:0 -2px 2px;border-bottom:1px solid rgba(148,163,255,.12)}.hs-head button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8;padding:5px 9px;border-radius:999px}.hs-head button:hover{color:#e2e8f0}.hs-head button.on{color:#f1f5f9;background:#818cf838}.hs-head em,.hs-icon em{font-style:normal;font-size:10px;font-weight:700;font-variant-numeric:tabular-nums;color:#c7d2fe;letter-spacing:0}.hs-head .hs-collapse{margin-left:auto;font-size:14px;padding:2px 8px;letter-spacing:0}.hs-rail{display:flex;flex-direction:column;align-items:center;gap:6px}.hs-rail button{all:unset;cursor:pointer;position:relative;width:30px;height:30px;display:grid;place-items:center;border-radius:9px;color:#94a3b8}.hs-rail button:hover{color:#e2e8f0;background:#94a3ff1a}.hs-rail .hs-collapse{font-size:14px;margin-bottom:4px}.hs-icon em{position:absolute;top:-3px;right:-5px;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;border-radius:999px;display:grid;place-items:center;font-size:9px;background:#4f46e5;color:#eef2ff}.hs-icon em:empty{min-width:8px;width:8px;height:8px;padding:0;top:1px;right:1px;background:#22d3ee;box-shadow:0 0 8px #22d3ee}.hs-body{flex:1;min-height:0;display:flex;flex-direction:column}.hs-body[hidden]{display:none}.hs-empty{margin:14px 4px;font-size:12px;line-height:1.5;color:#64748b}.hs-events{list-style:none;margin:6px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1;font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hs-events li>*{all:unset;box-sizing:border-box;width:100%;display:flex;gap:8px;align-items:baseline;padding:4px 6px;border-radius:7px;color:#cbd5e1;line-height:1.4}.hs-events li>button{cursor:pointer}.hs-events li>button:hover{background:#94a3ff1a;color:#f1f5f9}.hs-events i{flex:0 0 7px;height:7px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);transform:translateY(-1px)}.hs-events span{min-width:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:anywhere}.ap-head{display:flex;align-items:center;gap:8px;margin-top:6px}.ap-count{flex:none;color:#64748b;font-size:11px;font-variant-numeric:tabular-nums}.ap-link{all:unset;cursor:pointer;font-size:12px;color:#93c5fd}.ap-link:hover{color:#bfdbfe}.ap-searchrow{display:flex;align-items:center;gap:8px;margin-top:8px}.ap-search{flex:1;min-width:0;width:100%;box-sizing:border-box;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:8px;color:inherit;font:inherit;font-size:12px;padding:6px 9px;outline:none}.ap-search:focus{border-color:#818cf8}.ap-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}.ap-chips button{all:unset;cursor:pointer;display:flex;align-items:center;gap:5px;font-size:11px;padding:3px 7px;border-radius:999px;border:1px solid rgba(148,163,255,.15);color:#cbd5e1}.ap-chips button.on{border-color:var(--c);background:color-mix(in srgb,var(--c) 18%,transparent);color:#f8fafc}.ap-chips i{width:8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-chips em{font-style:normal;color:var(--c);font-weight:700;font-variant-numeric:tabular-nums}.ap-row-filters{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center}.ap-seg{display:flex;border:1px solid rgba(148,163,255,.15);border-radius:8px;overflow:hidden}.ap-seg{flex:none}.ap-seg button{all:unset;cursor:pointer;font-size:11px;padding:3px 6px;color:#94a3b8;text-transform:capitalize}.ap-seg button.on{background:#818cf840;color:#f1f5f9}.ap-row-filters select{flex:1;min-width:64px;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.15);border-radius:8px;font:inherit;font-size:11px;padding:3px 6px}.ap-list{list-style:none;margin:8px -4px 0;padding:0;overflow-y:auto;min-height:0;flex:1}.ap-list li button{all:unset;box-sizing:border-box;width:100%;cursor:pointer;display:flex;align-items:center;gap:8px;padding:6px;border-radius:8px}.ap-list li button:hover{background:#94a3ff1a}.ap-list li button.is-done{opacity:.55}.ap-list i{flex:0 0 9px;height:9px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c)}.ap-list i[data-status=thinking]{animation:ap-pulse .9s ease-in-out infinite}.ap-list i[data-status=waiting]{opacity:.5}.ap-list i[data-status=done]{background:transparent;border:1.5px solid var(--c);box-shadow:none}@keyframes ap-pulse{50%{transform:scale(1.5)}}.ap-name{flex:1;min-width:0;display:flex;flex-direction:column;font-size:12px;color:#e2e8f0}.ap-name small{color:#64748b;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-meta{text-align:right;font-size:11px;color:#94a3b8;font-variant-numeric:tabular-nums;display:flex;flex-direction:column}.ap-meta b{color:var(--c);font-weight:600;text-transform:lowercase}.hs-events li.is-skill>*{background:#f5b83d12}.hs-skill{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-title{display:flex;align-items:center;gap:6px;min-width:0}.ap-skill{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-size:9.5px;font-weight:600;color:#fcd581;padding:0 6px;border-radius:999px;border:1px solid rgba(245,184,61,.55);background:#f5b83d1f}.ap-skill:before{content:"skill:";color:#b8893a;font-weight:500}.hs-skill:before{content:"";display:inline-block;width:6px;height:6px;margin:0 4px 0 -1px;border:1px solid currentColor;border-radius:50%;vertical-align:0;box-shadow:0 0 4px #f5b83d99}.hs-events li.is-dec>*{background:#5eead40d}.hs-events li.is-deny>*{background:#fb3b5c1f}.hs-dec{flex:0 0 auto;font-size:9.5px;font-weight:600;line-height:1.5;text-transform:uppercase;letter-spacing:.06em;color:var(--c);padding:0 6px;border-radius:3px;border:1px solid var(--c);background:#ffffff0a}.ap-decisions{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:3px}.ap-decisions li{display:flex;gap:6px;align-items:baseline;font-size:11px;color:#e2e8f0;padding:2px 6px;border-left:2px solid var(--c);background:#ffffff08}.ap-decisions li.is-deny{background:#fb3b5c1f}.ap-decisions li.is-strike span{text-decoration:line-through;color:#94a3b8}.ap-hv{font-size:11.5px;color:#e2e8f0;margin:0 0 4px;font-variant-numeric:tabular-nums}.ap-hv-bar{display:flex;height:6px;border-radius:3px;overflow:hidden;gap:1px;background:#ffffff0d}.ap-hv-bar span{flex-basis:0;min-width:2px}.ap-decisions b{flex:0 0 auto;font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--c)}.ap-decisions span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ap-decisions em{flex:0 0 auto;font-style:normal;font-size:10px;color:#94a3b8;font-variant-numeric:tabular-nums}.ap-skills{display:flex;flex-wrap:wrap;gap:4px}.ap-skills span{font-size:11px;color:#e2e8f0;padding:2px 8px;border-radius:999px;border:1px solid rgba(245,184,61,.35);background:#f5b83d0f;display:inline-flex;gap:5px;align-items:baseline}.ap-skills span.on{border-color:#f5b83d;background:#f5b83d2e;color:#fde7b0;box-shadow:0 0 10px #f5b83d40}.ap-skills em{font-style:normal;font-size:10px;color:#b8893a;font-variant-numeric:tabular-nums}.ap-more{padding:6px;color:#64748b;font-size:11px}.ap-detail{overflow-y:auto;min-height:0;margin-top:8px;flex:1}.ap-detail h3{margin:0;display:flex;align-items:center;gap:8px;font-size:15px;color:var(--c)}.ap-detail h3 i{width:11px;height:11px;border-radius:50%;background:var(--c);box-shadow:0 0 10px var(--c)}.ap-detail h3 small{color:#64748b;font-size:11px;font-weight:500}.ap-status{margin-top:3px;font-size:12px;color:#cbd5e1}.ap-status[data-status=thinking]{color:#fde68a}.ap-status[data-status=waiting]{color:#fcd34d}.ap-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(46px,1fr));gap:4px;margin:10px 0 4px}.ap-stats div{background:#03050b73;border-radius:8px;padding:6px;text-align:center}.ap-stats dt{font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:#64748b}.ap-stats dd{margin:2px 0 0;font-size:15px;font-weight:700;color:#f1f5f9;font-variant-numeric:tabular-nums}.ap-detail section{margin-top:10px}.ap-detail h4{margin:0 0 4px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#64748b}.ap-detail p{margin:0;font-size:12px;color:#cbd5e1}.ap-steps{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.ap-steps span{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;border-radius:999px;border:1px solid #334155;color:#64748b}.ap-steps span[data-status=running]{border-color:#fbbf24;color:#fde68a}.ap-steps span[data-status=waiting]{border-color:#f59e0b;color:#fcd34d;background:#f59e0b24;animation:ap-wait-pulse 1.8s ease-in-out infinite}.ap-steps span[data-status=done]{border-color:#22c55e;color:#86efac}.ap-steps span[data-status=failed]{border-color:#ef4444;color:#fca5a5}.ap-chip-link{all:unset;cursor:pointer;display:block;font-size:12px;color:#e2e8f0;padding:3px 6px;border-left:2px solid var(--c);margin:2px 0;border-radius:0 6px 6px 0}.ap-chip-link:hover{background:#94a3ff1a}.ap-wait{color:#fbbf24!important;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.ap-nodes{line-height:1.5}.ap-chat{margin:0;padding:0;list-style:none;display:grid;gap:6px;font-size:12px;color:#e2e8f0;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;overflow-y:auto}.ap-chat li[data-role=user]{color:#c7d2fe}.ap-chat li[data-role=agent]{padding-bottom:6px;border-bottom:1px solid rgba(148,163,255,.12)}.ap-chat b{font-weight:650}.ap-events{margin:0;padding-left:14px;display:grid;gap:3px;font-size:11px;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.hud-badge--live{background:#22c55e2e;color:#86efac}.hud-badge--denied{background:#f871712e;color:#fca5a5;text-transform:none;letter-spacing:.02em}.hud-chip{text-transform:none;letter-spacing:.02em;font-weight:500;background:#818cf829;color:#c7d2fe;white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis}.hud-chip b{font-weight:650;color:#e0e7ff}.hud-run{display:flex;gap:6px;margin-top:8px;align-items:center;flex-wrap:wrap}.hud-run input{flex:1;min-width:160px;background:#03050b99;border:1px solid rgba(148,163,255,.2);border-radius:999px;color:inherit;font:inherit;font-size:12px;padding:6px 11px;outline:none}.hud-run button{border:0;border-radius:999px;padding:6px 13px;font:inherit;font-size:12px;font-weight:600;background:linear-gradient(135deg,#818cf8,#22d3ee);color:#03050b;cursor:pointer}.hud-run button:disabled{opacity:.5}.hud-run select{max-width:160px;min-width:0;background:#03050b99;color:#cbd5e1;border:1px solid rgba(148,163,255,.2);border-radius:999px;font:inherit;font-size:12px;padding:5px 9px;cursor:pointer}.hud-run span{font-size:11px;color:#86efac}.agentglow-embed{position:relative;overflow:hidden;width:100%;height:100%;min-height:320px;isolation:isolate}.agentglow-embed .scene-root{position:absolute;top:0;right:0;bottom:0;left:0}.lod-cluster-label{all:unset;box-sizing:border-box;display:grid;gap:1px;text-align:center;cursor:pointer;pointer-events:auto;font-size:12px;font-weight:600;color:#f8fafc;padding:4px 11px 5px;border-radius:12px;white-space:nowrap;background:#03050b9e;border:1px solid color-mix(in srgb,var(--c, #818cf8) 60%,transparent);text-shadow:0 0 10px var(--c, #818cf8);box-shadow:0 0 18px color-mix(in srgb,var(--c, #818cf8) 22%,transparent);transition:border-color .2s,background .2s}.lod-cluster-label:hover{background:color-mix(in srgb,var(--c, #818cf8) 22%,rgba(3,5,11,.7));border-color:var(--c, #818cf8)}.lod-cluster-label b{font-weight:700;letter-spacing:-.01em}.lod-cluster-label small{font-size:10px;font-weight:500;color:#94a3b8;text-shadow:none;font-variant-numeric:tabular-nums}.hud-dock{display:flex;align-items:center;gap:8px}.hud-dock:empty{display:none}.hud-dock>.hud{position:static}.hud-lod{padding:6px 8px 6px 12px;display:flex;align-items:center;gap:8px;font-size:12px;color:#cbd5e1;white-space:nowrap}.hud-lod span b{margin:0 1px}.hud-lod b{color:#f1f5f9;font-variant-numeric:tabular-nums}.hud-lod i{width:7px;height:7px;border-radius:50%;background:#a5b4fc;box-shadow:0 0 8px #a5b4fc}.hud-lod button{all:unset;cursor:pointer;font-size:11px;padding:3px 9px;border-radius:999px;border:1px solid rgba(148,163,255,.25);color:#c7d2fe}.hud-lod button:hover{background:#818cf833;color:#f8fafc}.scene-root{container:agscene / size}@container agscene (max-width: 719px){.scene-root .hud-top{padding:5px 7px 5px 10px}.scene-root .hud-title{font-size:13px}.scene-root .hud-theme{padding:3px 20px 3px 8px;font-size:10px;background-position:right 7px center}.scene-root .hud-stat:nth-child(n+3){display:none}.scene-root .hud-side:not(.is-rail){width:min(290px,calc(100% - 64px));padding:6px 8px 8px}.scene-root .hs-head button{padding:4px 6px;letter-spacing:.04em;font-size:10.5px}.scene-root .hs-head .hs-collapse{padding:2px 4px}.scene-root .ap-list li button{padding:4px 6px}.scene-root .hud-topwrap:not(.is-rail){--hud-side: min(290px, calc(100% - 64px) )}}@container agscene (max-height: 520px){.scene-root .hud-sub{max-height:4.5em;overflow:auto}}@keyframes ap-wait-pulse{50%{box-shadow:0 0 10px #f59e0b8c;border-color:#fbbf24}}@media(prefers-reduced-motion:reduce){.ap-steps span[data-status=waiting]{animation:none}}.hud-approve{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-top:8px}.hud-approve button{border:1px solid transparent;border-radius:999px;padding:5px 13px;font:inherit;font-size:12px;font-weight:650;cursor:pointer}.hud-approve .ha-yes{background:linear-gradient(135deg,#34d399,#22d3ee);color:#03050b}.hud-approve .ha-no{background:#fb3b5c24;border-color:#fb718599;color:#fecdd3}.hud-approve .ha-yes:hover{filter:brightness(1.1)}.hud-approve .ha-no:hover{background:#fb3b5c47}.hud-approve span{font-size:11px;color:#94a3b8}.hud-approve[data-verdict=approved] span,.hud-approve[data-verdict=approving] span{color:#86efac}.hud-approve[data-verdict=rejected] span,.hud-approve[data-verdict=rejecting] span,.hud-approve[data-verdict=error] span{color:#fda4af}.hud-approve.is-compact{margin-top:0;flex:none;gap:4px}.hud-approve.is-compact button{padding:3px 9px;font-size:11px}.hud-approvals{left:12px;bottom:12px;z-index:9;width:max-content;max-width:min(460px,calc(100% - 356px));padding:8px 10px;font-size:12px;box-sizing:border-box;border-color:#f59e0b73;box-shadow:0 8px 32px #00000059,0 0 18px #f59e0b1f}.hud-approvals.is-rail{max-width:min(460px,calc(100% - 76px))}.hud-approvals h4{margin:0 0 6px;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#fcd34d;display:flex;gap:6px;align-items:baseline}.hud-approvals h4 em{font-style:normal;font-variant-numeric:tabular-nums;color:#fde68a}.hud-approvals ul{list-style:none;margin:0;padding:0;display:grid;gap:4px}.hud-approvals li{display:flex;align-items:center;gap:8px;min-width:0}.hud-approvals .ha-who{all:unset;cursor:pointer;flex:1;min-width:0;display:flex;align-items:baseline;gap:6px;padding:2px 4px;border-radius:6px}.hud-approvals .ha-who:hover{background:#94a3ff1a}.hud-approvals .ha-who i{flex:0 0 8px;height:8px;border-radius:50%;background:var(--c);box-shadow:0 0 8px var(--c);align-self:center}.hud-approvals .ha-who b{color:#e2e8f0;font-weight:650;white-space:nowrap}.hud-approvals .ha-who span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fbbf24;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.hud-approvals p{margin:6px 0 0;font-size:11px;color:#64748b}@container agscene (max-width: 719px){.scene-root .hud-approvals{max-width:calc(100% - 76px);padding:6px 8px}.scene-root .hud-approvals .ha-who span{display:none}}.flow-run{display:flex;flex-direction:column;align-items:center;gap:4px;pointer-events:none}.flow-run .scene-label{font-size:11px;max-width:220px;overflow:hidden;text-overflow:ellipsis}.flow-steps{display:flex;gap:3px;font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.06em}.flow-steps span{padding:2px 5px;border-radius:999px;color:#64748b;background:#03050b8c;border:1px solid rgba(100,116,139,.35)}.flow-steps span[data-s=running]{color:#03050b;background:var(--c);border-color:var(--c);box-shadow:0 0 12px var(--c)}.flow-steps span[data-s=done]{color:var(--c);border-color:color-mix(in srgb,var(--c) 60%,transparent)}.flow-steps span[data-s=failed]{color:#fecaca;background:#7f1d1d}.flow-step{font:600 9px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in srgb,var(--c) 70%,white);text-shadow:0 0 8px var(--c);opacity:.55;pointer-events:none;white-space:nowrap;transition:opacity .3s}.flow-step[data-s=running]{opacity:1}.flow-hint{font-size:10px;padding:1px 7px;opacity:.9}.flow-label-core{font-size:11px;letter-spacing:.04em}
@@ -105,6 +105,7 @@ export type WorldEvent = {
105
105
  provider: string;
106
106
  purpose?: string;
107
107
  target?: string;
108
+ scope?: string;
108
109
  ms: number;
109
110
  ts: number;
110
111
  hv?: boolean;
@@ -257,6 +258,12 @@ export declare function decisionText(d: {
257
258
  purpose?: string;
258
259
  target?: string;
259
260
  }): string;
261
+ /** friendly decision-kind badge (display only; events and docs keep the raw kind) */
262
+ export declare const kindBadge: (kind: string) => "YES/NO" | "SCORE" | "PICK";
263
+ /** friendly high-volume reason tag (`why`) */
264
+ export declare const whyBadge: (why: string) => string;
265
+ /** provider badge: code guards read as a rule */
266
+ export declare const providerBadge: (p: string) => string;
260
267
  /** `YES 3 @ 42c`, `SELL 10 @ 101.5` (prices below 1 read as cents) */
261
268
  export declare function orderText(o: {
262
269
  side: string;
@@ -563,7 +570,28 @@ export declare const world: {
563
570
  selected: string | null;
564
571
  /** the server answered 401 for this scope/run/token (the HUD shows a notice; no simulator fallback) */
565
572
  unauthorized: boolean;
573
+ /** desk-wide halts (global-scope guard denies, see Halt), keyed by the owning agent */
574
+ halts: Map<string, Halt>;
566
575
  };
576
+ /**
577
+ * A desk-wide halt: a guard decision with `scope: "global"` (docs/SPEC.md "Decisions") said no, e.g. a kill switch.
578
+ * Owned by the topmost agent that reports global guards (a desk), drawn ONCE on it (red, `HALTED · <reason>`) instead
579
+ * of a red X on every agent below it; their own global denies only flash their halos. Ends when every global guard
580
+ * the owner said no to says yes again, or the owner / its run ends.
581
+ */
582
+ export type Halt = {
583
+ id: string;
584
+ run: string;
585
+ reason: string;
586
+ since: number;
587
+ end: number;
588
+ qs: Map<string, boolean>;
589
+ };
590
+ /** the halt shown on agent `id` right now (also while it fades out after the end), if any */
591
+ export declare function haltOn(id: string, now?: number): Halt | undefined;
592
+ export declare const HALT_FADE_MS = 900;
593
+ /** some agent is halted now (HUD chip) */
594
+ export declare function haltedNow(now?: number): Halt | undefined;
567
595
  /** Subscribe a React component to world changes (HUD / DOM). Scenes should read `world` in useFrame instead. */
568
596
  export declare function useWorld(): {
569
597
  runs: Map<string, Run>;
@@ -654,6 +682,8 @@ export declare function useWorld(): {
654
682
  selected: string | null;
655
683
  /** the server answered 401 for this scope/run/token (the HUD shows a notice; no simulator fallback) */
656
684
  unauthorized: boolean;
685
+ /** desk-wide halts (global-scope guard denies, see Halt), keyed by the owning agent */
686
+ halts: Map<string, Halt>;
657
687
  };
658
688
  /** Stable pseudo-random 0..1 from a string (same id → same value, different ids → different values). */
659
689
  export declare const hash01: (id: string, salt?: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentglow",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Live 3D views of agent systems (LangGraph, deepagents, any OpenTelemetry-instrumented agents) as a React component.",
5
5
  "keywords": [
6
6
  "claude-code",