@tangle-network/charts 2.0.17 → 2.0.18

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,5 +1,5 @@
1
1
  import { D as statusMeta, O as createLucideIcon, T as RunStatusIcon } from "./flow-waterfall-model-DvrgPLGS.js";
2
- import { a as LIVE_AGENT_CARD, c as AgentMark, d as Wrench, n as AGENT_CARD, o as buildAgentTopology, s as layoutAgents, t as LatestEvents } from "./latest-events-iiWwpIck.js";
2
+ import { a as LIVE_AGENT_CARD, c as AgentMark, d as Wrench, n as AGENT_CARD, o as buildAgentTopology, s as layoutAgents, t as LatestEvents } from "./latest-events-CmbyqEIe.js";
3
3
  import { C as fmtCost, E as fmtTokenTotal, T as fmtEventTime, _ as syncAmbient, b as useMotionAllowed, g as ambientStyle, h as agentQuietActivity, i as SELECTION_OUTLINE, n as RESTING_SHADOW, o as useColorMode, r as edgeColor, t as RESTING_BORDER, u as shortModel, v as tokenMilliseconds, x as useRunNow, y as useAttention } from "./graph-style-fealnLLn.js";
4
4
  import { t as MOTION_CONTROL } from "./motion-DILryczn.js";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -116,13 +116,10 @@ function AgentCardView({ agent, selected, direction, now: fixed, onOpen, parentL
116
116
  /* @__PURE__ */ jsxs("div", {
117
117
  className: "flex min-w-0 items-center gap-2",
118
118
  children: [
119
- /* @__PURE__ */ jsx("span", {
120
- className: "grayscale hover:grayscale-0",
121
- children: /* @__PURE__ */ jsx(AgentMark, {
122
- agent,
123
- layout: "tree",
124
- size: 18
125
- })
119
+ /* @__PURE__ */ jsx(AgentMark, {
120
+ agent,
121
+ layout: "tree",
122
+ size: 24
126
123
  }),
127
124
  /* @__PURE__ */ jsxs("span", {
128
125
  className: "min-w-0 flex-1 truncate text-sm font-semibold leading-[18px]",
@@ -132,35 +129,50 @@ function AgentCardView({ agent, selected, direction, now: fixed, onOpen, parentL
132
129
  }), agent.label]
133
130
  }),
134
131
  /* @__PURE__ */ jsx("span", {
135
- className: "text-xs text-muted-foreground tabular-nums",
132
+ className: "text-[13px] text-muted-foreground tabular-nums",
136
133
  title: agent.costUsd == null ? "Cost not reported" : "Cost",
137
134
  children: fmtCost(agent.costUsd ?? void 0) ?? "—"
138
135
  })
139
136
  ]
140
137
  }),
141
138
  /* @__PURE__ */ jsx("p", {
142
- className: "m-0 line-clamp-2 min-h-4 text-xs text-foreground leading-4",
143
- children: (agent.status === "failed" ? agent.result ?? agent.turn : agent.turn) || "—"
139
+ "data-agent-identity": "",
140
+ className: "m-0 truncate text-[13px] leading-[18px] text-muted-foreground",
141
+ title: [agent.harness, agent.model].filter(Boolean).join(" · "),
142
+ children: [agent.harness, agent.model ? shortModel(agent.model) : null].filter(Boolean).join(" · ") || "Identity not recorded"
143
+ }),
144
+ agent.status === "failed" && /* @__PURE__ */ jsx("p", {
145
+ className: "m-0 line-clamp-2 text-[13px] leading-4",
146
+ children: agent.result ?? agent.turn ?? "Failure cause not recorded"
144
147
  }),
145
148
  /* @__PURE__ */ jsxs("div", {
146
- className: "mt-auto flex items-center justify-between gap-1 text-xs",
149
+ className: "mt-auto flex items-center justify-between gap-1 text-[13px]",
147
150
  style: { color: quiet ? "var(--surface-warning-text)" : s.color },
148
- children: [/* @__PURE__ */ jsxs("span", {
149
- className: "flex items-center gap-1",
150
- children: [/* @__PURE__ */ jsx(StatusGlyph, {
151
- status: agent.status,
152
- size: 16
153
- }), quiet?.label ?? s.label]
154
- }), agent.status === "needs-you" && /* @__PURE__ */ jsx("button", {
155
- type: "button",
156
- className: "ag-live-respond nodrag nopan",
157
- disabled: !onOpen,
158
- onClick: (event) => {
159
- event.stopPropagation();
160
- onOpen?.();
161
- },
162
- children: "Respond"
163
- })]
151
+ children: [
152
+ /* @__PURE__ */ jsxs("span", {
153
+ className: "flex items-center gap-1",
154
+ children: [/* @__PURE__ */ jsx(StatusGlyph, {
155
+ status: agent.status,
156
+ size: 16
157
+ }), quiet?.label ?? s.label]
158
+ }),
159
+ /* @__PURE__ */ jsx("span", {
160
+ "data-agent-tokens": "",
161
+ title: agent.tokens == null ? "Tokens not recorded" : "Tokens",
162
+ className: "text-muted-foreground tabular-nums whitespace-nowrap",
163
+ children: fmtTokenTotal(agent.tokens) ?? "—"
164
+ }),
165
+ agent.status === "needs-you" && /* @__PURE__ */ jsx("button", {
166
+ type: "button",
167
+ className: "ag-live-respond nodrag nopan",
168
+ disabled: !onOpen,
169
+ onClick: (event) => {
170
+ event.stopPropagation();
171
+ onOpen?.();
172
+ },
173
+ children: "Respond"
174
+ })
175
+ ]
164
176
  })
165
177
  ]
166
178
  });
@@ -174,14 +186,14 @@ function AgentCard({ data }) {
174
186
  function AgentFrameBox({ data }) {
175
187
  const { frame, direction } = data;
176
188
  return /* @__PURE__ */ jsxs("div", {
177
- className: "relative h-full w-full rounded-2xl border",
189
+ className: "ag-team-frame relative h-full w-full rounded-2xl border",
178
190
  style: {
179
191
  background: "color-mix(in srgb, hsl(var(--muted-foreground)) 7%, transparent)",
180
192
  borderColor: "hsl(var(--foreground) / 0.08)"
181
193
  },
182
194
  children: [/* @__PURE__ */ jsx(Handles, { direction }), /* @__PURE__ */ jsxs("button", {
183
195
  type: "button",
184
- className: "nodrag nopan absolute right-3 top-2 flex h-16 w-8 flex-col items-center justify-center gap-1 rounded text-sm text-muted-foreground hover:bg-muted focus-visible:outline",
196
+ className: `nodrag nopan absolute top-2 flex h-16 items-center justify-center gap-2 rounded text-sm text-muted-foreground hover:bg-muted focus-visible:outline ${data.groupParents ? "right-3 w-8 flex-col" : "left-3 right-3 justify-start"}`,
185
197
  "aria-label": `${frame.collapsed ? "Expand" : "Collapse"} ${data.label} team`,
186
198
  "aria-expanded": !frame.collapsed,
187
199
  title: `${data.label} · ${frame.group.memberIds.length} agents`,
@@ -189,10 +201,14 @@ function AgentFrameBox({ data }) {
189
201
  event.stopPropagation();
190
202
  data.onToggle();
191
203
  },
192
- children: [/* @__PURE__ */ jsx(ChevronDown, {
193
- size: 16,
194
- className: frame.collapsed ? "-rotate-90" : void 0
195
- }), /* @__PURE__ */ jsx("span", { children: frame.group.memberIds.length })]
204
+ children: [
205
+ /* @__PURE__ */ jsx(ChevronDown, {
206
+ size: 16,
207
+ className: frame.collapsed ? "-rotate-90" : void 0
208
+ }),
209
+ !data.groupParents && /* @__PURE__ */ jsxs("strong", { children: [data.label, " team"] }),
210
+ /* @__PURE__ */ jsx("span", { children: frame.group.memberIds.length })
211
+ ]
196
212
  })]
197
213
  });
198
214
  }
@@ -528,7 +544,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
528
544
  const columnRef = useRef(null);
529
545
  if (canvas && !narrow && columnRef.current?.key !== columnKey) columnRef.current = {
530
546
  key: columnKey,
531
- columns: Math.max(1, Math.min(6, Math.floor((canvas.width - 32) / (card.width + 10))))
547
+ columns: Math.max(1, Math.min(6, Math.floor((canvas.width - 32 - (!live && direction === "LR" ? card.width + 70 : 0)) / (card.width + 10))))
532
548
  };
533
549
  const columns = columnRef.current?.columns ?? 1;
534
550
  const layoutKey = JSON.stringify([
@@ -542,7 +558,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
542
558
  useEffect(() => {
543
559
  if (narrow) return;
544
560
  let active = true;
545
- layoutAgents(topology, direction, columns, card, collapsed).then((layout) => {
561
+ layoutAgents(topology, direction, columns, card, collapsed, live).then((layout) => {
546
562
  if (active) setPlaced({
547
563
  key: layoutKey,
548
564
  layout
@@ -583,6 +599,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
583
599
  data: {
584
600
  frame,
585
601
  direction,
602
+ groupParents: live,
586
603
  label: byId.get(frame.group.parentId)?.label ?? "Agent",
587
604
  onToggle: () => {
588
605
  if (!frame.collapsed && selectedId && frame.group.memberIds.includes(selectedId)) onSelect?.(frame.group.parentId);
@@ -599,7 +616,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
599
616
  const agent = byId.get(id);
600
617
  const position = layout.positions.get(id);
601
618
  if (!agent || !position) continue;
602
- const selected = selectedId === id, owned = layout.frames.find((frame) => frame.group.parentId === id);
619
+ const selected = selectedId === id, owned = live && layout.frames.find((frame) => frame.group.parentId === id);
603
620
  const width = owned ? owned.width - 64 : card.width, height = owned ? 64 : card.height;
604
621
  const measured = rfRef.current?.getInternalNode(id)?.measured;
605
622
  cards.push({
@@ -646,7 +663,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
646
663
  const out = [];
647
664
  const seen = /* @__PURE__ */ new Set();
648
665
  for (const s of topology.spawns) {
649
- const source = topology.groups.find((group) => group.parentId === s.from)?.id ?? s.from, target = topology.groupOf.get(s.to) ?? s.to;
666
+ const source = live && topology.groups.find((group) => group.parentId === s.from)?.id || s.from, target = topology.groupOf.get(s.to) ?? s.to;
650
667
  if (source === target) continue;
651
668
  const id = `spawn:${source}:${target}`;
652
669
  if (seen.has(id)) continue;
@@ -720,7 +737,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
720
737
  }, [narrow]);
721
738
  const layoutIdentity = layout ? `${layoutKey}:${layout.columns}` : null;
722
739
  const cameraKey = `${direction}:${topology.key}`;
723
- const minZoom = layout && canvas ? Math.max(.02, Math.min(.2, (canvas.width - 32) / layout.width, (canvas.height - 32) / layout.height)) : .2;
740
+ const minZoom = !live ? 1 : layout && canvas ? Math.max(.02, Math.min(.2, (canvas.width - 32) / layout.width, (canvas.height - 32) / layout.height)) : .2;
724
741
  useEffect(() => {
725
742
  const inst = rfRef.current;
726
743
  if (!ready || !inst || !layoutIdentity || !canvas) return;
@@ -888,7 +905,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
888
905
  wrapperRef.current = el;
889
906
  measureCanvas(el);
890
907
  },
891
- className: `agent-graph ag-live relative flex flex-col ${className ?? ""}`,
908
+ className: `agent-graph ag-live${live ? "" : " ag-topology"} relative flex flex-col ${className ?? ""}`,
892
909
  tabIndex: -1,
893
910
  onKeyDownCapture: (event) => {
894
911
  if (event.target instanceof HTMLElement && event.target.closest("[data-agent-metrics]")) return;
@@ -949,7 +966,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
949
966
  select(agent.id);
950
967
  }
951
968
  },
952
- children: live || agent.status === "succeeded" || agent.status === "stopped" ? /* @__PURE__ */ jsx(LiveAgentCardView, {
969
+ children: live ? /* @__PURE__ */ jsx(LiveAgentCardView, {
953
970
  agent,
954
971
  parentLabel: byId.get(parentOf.get(agent.id) ?? "")?.label,
955
972
  selected: selectedId === agent.id,
@@ -1060,7 +1077,9 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1060
1077
  position: "bottom-right",
1061
1078
  fitViewOptions: {
1062
1079
  padding: `${FIT_PADDING}px`,
1063
- maxZoom: 1
1080
+ minZoom,
1081
+ maxZoom: 1,
1082
+ nodes: live ? void 0 : topology.agentIds.slice(0, 2).map((id) => ({ id }))
1064
1083
  }
1065
1084
  })
1066
1085
  ]
@@ -67,8 +67,8 @@ interface AgentGraphEdge {
67
67
  type AgentGraphDirection = "TB" | "LR";
68
68
  /** Every agent card's size. Fixed, so a status or turn update never moves a card. */
69
69
  declare const AGENT_CARD: {
70
- readonly width: 240;
71
- readonly height: 88;
70
+ readonly width: 232;
71
+ readonly height: 120;
72
72
  };
73
73
  /** A live card: room for the header, a two-line thinking line and the last three events. Fixed for the same reason. */
74
74
  declare const LIVE_AGENT_CARD: {
@@ -125,7 +125,7 @@ interface AgentLayout {
125
125
  height: number;
126
126
  }
127
127
  /** Lay the run out with every grid `columns` wide. */
128
- declare function layoutAgents(topology: AgentTopology, direction: AgentGraphDirection, columns: number, card?: CardSize, collapsed?: ReadonlySet<string>): Promise<AgentLayout>;
128
+ declare function layoutAgents(topology: AgentTopology, direction: AgentGraphDirection, columns: number, card?: CardSize, collapsed?: ReadonlySet<string>, groupParents?: boolean): Promise<AgentLayout>;
129
129
  //#endregion
130
130
  //#region src/react/agent-graph/format.d.ts
131
131
  /**
@@ -85,8 +85,8 @@ function ToolMark({ tool, label, size }) {
85
85
  //#region src/react/agent-graph/agent-graph-layout.ts
86
86
  /** Every agent card's size. Fixed, so a status or turn update never moves a card. */
87
87
  const AGENT_CARD = {
88
- width: 240,
89
- height: 88
88
+ width: 232,
89
+ height: 120
90
90
  };
91
91
  /** A live card: room for the header, a two-line thinking line and the last three events. Fixed for the same reason. */
92
92
  const LIVE_AGENT_CARD = {
@@ -160,35 +160,29 @@ function gridSize(members, columns, card, collapsed = false) {
160
160
  };
161
161
  }
162
162
  /** The boxes the layouter places: each ungrouped agent, and each grid as one block. */
163
- function layoutUnits(topology, columns, card, collapsed) {
164
- const units = [];
165
- const ownerGroup = new Map(topology.groups.map((group) => [group.parentId, group.id]));
166
- for (const id of topology.agentIds) if (!topology.groupOf.has(id) && !ownerGroup.has(id)) units.push({
163
+ function layoutUnits(topology, columns, card, collapsed, groupParents) {
164
+ const ownerGroup = new Map(groupParents ? topology.groups.map((group) => [group.parentId, group.id]) : []);
165
+ const units = topology.agentIds.filter((id) => !topology.groupOf.has(id) && !ownerGroup.has(id)).map((id) => ({
167
166
  id,
168
- width: card.width,
169
- height: card.height
170
- });
171
- for (const g of topology.groups) units.push({
172
- id: g.id,
173
- ...gridSize(g.memberIds.length, columns, card, collapsed.has(g.id))
174
- });
167
+ ...card
168
+ }));
169
+ units.push(...topology.groups.map((group) => ({
170
+ id: group.id,
171
+ ...gridSize(group.memberIds.length, columns, card, collapsed.has(group.id))
172
+ })));
175
173
  const unitOf = (id) => topology.groupOf.get(id) ?? ownerGroup.get(id) ?? id;
176
174
  const seen = /* @__PURE__ */ new Set();
177
- const links = [];
178
- for (const s of topology.spawns) {
179
- const from = unitOf(s.from);
180
- const to = unitOf(s.to);
181
- const key = `${from}\u0000${to}`;
182
- if (from === to || seen.has(key)) continue;
183
- seen.add(key);
184
- links.push({
185
- from,
186
- to
187
- });
188
- }
189
175
  return {
190
176
  units,
191
- links
177
+ links: topology.spawns.flatMap((spawn) => {
178
+ const from = unitOf(spawn.from), to = unitOf(spawn.to), key = `${from}\u0000${to}`;
179
+ if (from === to || seen.has(key)) return [];
180
+ seen.add(key);
181
+ return [{
182
+ from,
183
+ to
184
+ }];
185
+ })
192
186
  };
193
187
  }
194
188
  async function placeWithElk(units, links, direction) {
@@ -271,8 +265,8 @@ function placeByDepth(units, links, direction) {
271
265
  return at;
272
266
  }
273
267
  /** Lay the run out with every grid `columns` wide. */
274
- async function layoutAgents(topology, direction, columns, card = AGENT_CARD, collapsed = /* @__PURE__ */ new Set()) {
275
- const { units, links } = layoutUnits(topology, columns, card, collapsed);
268
+ async function layoutAgents(topology, direction, columns, card = AGENT_CARD, collapsed = /* @__PURE__ */ new Set(), groupParents = true) {
269
+ const { units, links } = layoutUnits(topology, columns, card, collapsed, groupParents);
276
270
  const placed = await placeWithElk(units, links, direction) ?? placeByDepth(units, links, direction);
277
271
  const positions = /* @__PURE__ */ new Map();
278
272
  const frames = [];
@@ -301,9 +295,12 @@ async function layoutAgents(topology, direction, columns, card = AGENT_CARD, col
301
295
  ...size,
302
296
  collapsed: closed
303
297
  });
304
- positions.set(g.parentId, {
298
+ positions.set(g.parentId, groupParents ? {
305
299
  x: origin.x + FRAME_PAD,
306
300
  y: origin.y + 8
301
+ } : {
302
+ ...positions.get(g.parentId),
303
+ y: origin.y
307
304
  });
308
305
  if (closed) continue;
309
306
  const cols = Math.max(1, Math.min(columns, g.memberIds.length));
@@ -1,4 +1,4 @@
1
- import { A as AGENT_CARD, B as AgentLeafGroup, C as shortModel, D as fmtEventTime, E as fmtDuration, F as AgentGraphEdgeKind, G as LIVE_AGENT_CARD, H as CardSize, I as AgentGraphEvent, K as buildAgentTopology, L as AgentGraphNode, M as AgentGraphActivity, N as AgentGraphDirection, O as fmtTokenTotal, P as AgentGraphEdge, R as AgentGraphStatus, S as parseActionPath, T as fmtCost, U as FRAME_CAPTION, V as AgentTopology, W as GRID_MIN_LEAVES, _ as useRunNow, a as RESTING_SHADOW, b as actionPathLabel, c as motionAllowed, d as agentQuietActivity, f as ambientStyle, g as useMotionAllowed, h as useAttention, i as RESTING_BORDER, j as AgentFrame, k as fmtTokens, l as useColorMode, m as tokenMilliseconds, n as GraphErrorBoundary, o as edgeColor, p as syncAmbient, q as layoutAgents, r as retryImport, s as SELECTION_OUTLINE, t as loadElk, u as activityTiming, v as ActionPathParts, w as clampPreview, x as humanizeIdentifier, y as LeadCase, z as AgentLayout } from "../../elk-loader-CrLO557o.js";
1
+ import { A as AGENT_CARD, B as AgentLeafGroup, C as shortModel, D as fmtEventTime, E as fmtDuration, F as AgentGraphEdgeKind, G as LIVE_AGENT_CARD, H as CardSize, I as AgentGraphEvent, K as buildAgentTopology, L as AgentGraphNode, M as AgentGraphActivity, N as AgentGraphDirection, O as fmtTokenTotal, P as AgentGraphEdge, R as AgentGraphStatus, S as parseActionPath, T as fmtCost, U as FRAME_CAPTION, V as AgentTopology, W as GRID_MIN_LEAVES, _ as useRunNow, a as RESTING_SHADOW, b as actionPathLabel, c as motionAllowed, d as agentQuietActivity, f as ambientStyle, g as useMotionAllowed, h as useAttention, i as RESTING_BORDER, j as AgentFrame, k as fmtTokens, l as useColorMode, m as tokenMilliseconds, n as GraphErrorBoundary, o as edgeColor, p as syncAmbient, q as layoutAgents, r as retryImport, s as SELECTION_OUTLINE, t as loadElk, u as activityTiming, v as ActionPathParts, w as clampPreview, x as humanizeIdentifier, y as LeadCase, z as AgentLayout } from "../../elk-loader-uOcDmUG_.js";
2
2
  import { ReactNode } from "react";
3
3
  //#region src/react/agent-graph/agent-hub-layout.d.ts
4
4
  /** A tool or service an agent calls: drawn as an outer node with its brand mark. */
@@ -1,5 +1,5 @@
1
1
  import { D as statusMeta, E as runStatus, O as createLucideIcon, T as RunStatusIcon } from "../../flow-waterfall-model-DvrgPLGS.js";
2
- import { a as LIVE_AGENT_CARD, c as AgentMark, i as GRID_MIN_LEAVES, l as GraphMarksProvider, n as AGENT_CARD, o as buildAgentTopology, r as FRAME_CAPTION, s as layoutAgents, t as LatestEvents, u as ToolMark } from "../../latest-events-iiWwpIck.js";
2
+ import { a as LIVE_AGENT_CARD, c as AgentMark, i as GRID_MIN_LEAVES, l as GraphMarksProvider, n as AGENT_CARD, o as buildAgentTopology, r as FRAME_CAPTION, s as layoutAgents, t as LatestEvents, u as ToolMark } from "../../latest-events-CmbyqEIe.js";
3
3
  import { C as fmtCost, D as fmtTokens, E as fmtTokenTotal, S as clampPreview, T as fmtEventTime, _ as syncAmbient, a as motionAllowed, b as useMotionAllowed, c as humanizeIdentifier, d as loadElk, f as GraphErrorBoundary, g as ambientStyle, h as agentQuietActivity, i as SELECTION_OUTLINE, l as parseActionPath, m as activityTiming, n as RESTING_SHADOW, o as useColorMode, p as retryImport, r as edgeColor, s as actionPathLabel, t as RESTING_BORDER, u as shortModel, v as tokenMilliseconds, w as fmtDuration, x as useRunNow, y as useAttention } from "../../graph-style-fealnLLn.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Suspense, lazy, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -1122,7 +1122,7 @@ function AgentHubCanvas(props) {
1122
1122
  * taking the pane down.
1123
1123
  */
1124
1124
  function lazyCanvas() {
1125
- return lazy(() => retryImport(() => import("../../AgentGraphCanvas-B74GN1o6.js").then((m) => ({ default: m.AgentGraphCanvas }))));
1125
+ return lazy(() => retryImport(() => import("../../AgentGraphCanvas-C5Ee8Z6q.js").then((m) => ({ default: m.AgentGraphCanvas }))));
1126
1126
  }
1127
1127
  /** The agents as a list, for when the canvas cannot load. */
1128
1128
  function AgentListFallback({ nodes, selectedId, onSelect, className, onRetry }) {
@@ -1131,12 +1131,12 @@ function AgentListFallback({ nodes, selectedId, onSelect, className, onRetry })
1131
1131
  children: [/* @__PURE__ */ jsxs("div", {
1132
1132
  className: "mb-1 flex items-center justify-between gap-2",
1133
1133
  children: [/* @__PURE__ */ jsx("p", {
1134
- className: "text-muted-foreground text-xs",
1134
+ className: "text-muted-foreground text-[13px]",
1135
1135
  children: "Couldn't draw the graph — showing the agents."
1136
1136
  }), /* @__PURE__ */ jsx("button", {
1137
1137
  type: "button",
1138
1138
  onClick: onRetry,
1139
- className: "shrink-0 rounded border border-border px-1.5 py-0.5 text-muted-foreground text-xs transition hover:text-foreground",
1139
+ className: "shrink-0 rounded border border-border px-1.5 py-0.5 text-muted-foreground text-[13px] transition hover:text-foreground",
1140
1140
  children: "Retry"
1141
1141
  })]
1142
1142
  }), /* @__PURE__ */ jsx("ul", {
@@ -1145,7 +1145,7 @@ function AgentListFallback({ nodes, selectedId, onSelect, className, onRetry })
1145
1145
  type: "button",
1146
1146
  "aria-pressed": selectedId === n.id,
1147
1147
  onClick: () => onSelect?.(n.id),
1148
- className: "flex w-full items-center justify-between gap-2 rounded px-2 py-1 text-left text-foreground text-xs hover:bg-muted aria-pressed:bg-muted",
1148
+ className: "flex w-full items-center justify-between gap-2 rounded px-2 py-1 text-left text-foreground text-[13px] hover:bg-muted aria-pressed:bg-muted",
1149
1149
  children: [/* @__PURE__ */ jsx("span", {
1150
1150
  className: "truncate",
1151
1151
  children: n.label
@@ -1174,7 +1174,7 @@ function AgentGraphTree(props) {
1174
1174
  }),
1175
1175
  children: /* @__PURE__ */ jsx(Suspense, {
1176
1176
  fallback: /* @__PURE__ */ jsx("div", {
1177
- className: `agent-graph flex items-center justify-center rounded-lg border border-border border-dashed text-muted-foreground text-xs ${props.className ?? ""}`,
1177
+ className: `agent-graph flex items-center justify-center rounded-lg border border-border border-dashed text-muted-foreground text-[13px] ${props.className ?? ""}`,
1178
1178
  children: "Loading graph…"
1179
1179
  }),
1180
1180
  children: /* @__PURE__ */ jsx(Canvas, { ...props })
@@ -1,4 +1,4 @@
1
- import { C as shortModel, D as fmtEventTime, E as fmtDuration, O as fmtTokenTotal, S as parseActionPath, T as fmtCost, _ as useRunNow, a as RESTING_SHADOW, b as actionPathLabel, c as motionAllowed, d as agentQuietActivity, f as ambientStyle, g as useMotionAllowed, h as useAttention, i as RESTING_BORDER, k as fmtTokens, l as useColorMode, m as tokenMilliseconds, n as GraphErrorBoundary, o as edgeColor, p as syncAmbient, r as retryImport, s as SELECTION_OUTLINE, t as loadElk, u as activityTiming, v as ActionPathParts, w as clampPreview, x as humanizeIdentifier, y as LeadCase } from "../../elk-loader-CrLO557o.js";
1
+ import { C as shortModel, D as fmtEventTime, E as fmtDuration, O as fmtTokenTotal, S as parseActionPath, T as fmtCost, _ as useRunNow, a as RESTING_SHADOW, b as actionPathLabel, c as motionAllowed, d as agentQuietActivity, f as ambientStyle, g as useMotionAllowed, h as useAttention, i as RESTING_BORDER, k as fmtTokens, l as useColorMode, m as tokenMilliseconds, n as GraphErrorBoundary, o as edgeColor, p as syncAmbient, r as retryImport, s as SELECTION_OUTLINE, t as loadElk, u as activityTiming, v as ActionPathParts, w as clampPreview, x as humanizeIdentifier, y as LeadCase } from "../../elk-loader-uOcDmUG_.js";
2
2
  //#region src/react/agent-graph/motion.d.ts
3
3
  /** Brand owns complete duration/easing roles. Keep properties explicit. */
4
4
  export declare const MOTION_CONTROL = "[transition:color_var(--motion-control),background-color_var(--motion-control),border-color_var(--motion-control),box-shadow_var(--motion-control),transform_var(--motion-control),scale_var(--motion-control),opacity_var(--motion-control)] motion-reduce:transition-none";
@@ -23,7 +23,7 @@
23
23
  --radius-full: 999px;
24
24
  }
25
25
  }
26
- @layer base {
26
+ @layer utilities.agent-graph-base {
27
27
  @scope (.agent-graph, .ag-root, .ag-latest, [data-agent-metrics]) {
28
28
  *, :scope:is(*), ::after, :scope:is(::after), ::before, :scope:is(::before), ::backdrop, :scope:is(::backdrop), ::file-selector-button, :scope:is(::file-selector-button) {
29
29
  box-sizing: border-box;
@@ -173,7 +173,7 @@
173
173
  }
174
174
  }
175
175
  }
176
- @layer utilities {
176
+ @layer utilities.agent-graph-utilities {
177
177
  @scope (.agent-graph, .ag-root, .ag-latest, [data-agent-metrics]) {
178
178
  .pointer-events-auto, :scope:is(.pointer-events-auto) {
179
179
  pointer-events: auto;
@@ -210,6 +210,9 @@
210
210
  .right-3, :scope:is(.right-3) {
211
211
  right: calc(var(--spacing) * 3);
212
212
  }
213
+ .left-3, :scope:is(.left-3) {
214
+ left: calc(var(--spacing) * 3);
215
+ }
213
216
  .container, :scope:is(.container) {
214
217
  width: 100%;
215
218
  @media (width >= 40rem) {
@@ -279,9 +282,6 @@
279
282
  .min-h-0, :scope:is(.min-h-0) {
280
283
  min-height: 0px;
281
284
  }
282
- .min-h-4, :scope:is(.min-h-4) {
283
- min-height: calc(var(--spacing) * 4);
284
- }
285
285
  .min-h-10, :scope:is(.min-h-10) {
286
286
  min-height: calc(var(--spacing) * 10);
287
287
  }
@@ -336,6 +336,9 @@
336
336
  .justify-center, :scope:is(.justify-center) {
337
337
  justify-content: center;
338
338
  }
339
+ .justify-start, :scope:is(.justify-start) {
340
+ justify-content: flex-start;
341
+ }
339
342
  .gap-0\.5, :scope:is(.gap-0\.5) {
340
343
  gap: calc(var(--spacing) * 0.5);
341
344
  }
@@ -466,6 +469,9 @@
466
469
  .text-\[10px\], :scope:is(.text-\[10px\]) {
467
470
  font-size: 10px;
468
471
  }
472
+ .text-\[13px\], :scope:is(.text-\[13px\]) {
473
+ font-size: 13px;
474
+ }
469
475
  .leading-4, :scope:is(.leading-4) {
470
476
  --tw-leading: calc(var(--spacing) * 4);
471
477
  line-height: calc(var(--spacing) * 4);
@@ -1568,6 +1574,26 @@ svg.react-flow__connectionline {
1568
1574
  min-width: 44px;
1569
1575
  }
1570
1576
  }
1577
+ .ag-topology {
1578
+ --ag-surface: hsl(var(--hsl-raised));
1579
+ --font-size-xs: 13px;
1580
+ --text-xs: 13px;
1581
+ }
1582
+ .ag-topology :is(.text-xs, .ag-parent-label) {
1583
+ font-size: 13px;
1584
+ }
1585
+ .ag-topology .ag-team-frame {
1586
+ background: hsl(var(--hsl-card)) !important;
1587
+ }
1588
+ .ag-topology .ag-agent-card {
1589
+ background: var(--ag-surface);
1590
+ }
1591
+ .ag-topology .ag-agent-card[data-selected] {
1592
+ background: hsl(var(--hsl-raised-2));
1593
+ }
1594
+ .ag-topology .react-flow__node-agentFrame .react-flow__handle-left {
1595
+ top: 40px;
1596
+ }
1571
1597
  @property --tw-rotate-x {
1572
1598
  syntax: "*";
1573
1599
  inherits: false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/charts",
3
- "version": "2.0.17",
3
+ "version": "2.0.18",
4
4
  "description": "Static SVG and HTML figures for benchmarks and operational timing. Draws from producer data and refuses what it cannot draw honestly.",
5
5
  "type": "module",
6
6
  "license": "MIT",