@tangle-network/sandbox-ui 1.1.2 → 1.1.4

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.
@@ -2618,7 +2618,7 @@ function retryImport(factory, retries = 2, delayMs = 350) {
2618
2618
  });
2619
2619
  }
2620
2620
  function lazyWorkflowGraph() {
2621
- return lazy(() => retryImport(() => import("./WorkflowGraph-DYsP_Kcg.js").then((m) => ({ default: m.WorkflowGraph }))));
2621
+ return lazy(() => retryImport(() => import("./WorkflowGraph-DZ3xejKE.js").then((m) => ({ default: m.WorkflowGraph }))));
2622
2622
  }
2623
2623
  var GraphErrorBoundary = class extends Component {
2624
2624
  state = { hasError: false };
@@ -2678,7 +2678,7 @@ function WorkflowGraph(props) {
2678
2678
  * taking the pane down.
2679
2679
  */
2680
2680
  function lazyCanvas() {
2681
- return lazy(() => retryImport(() => import("./AgentGraphCanvas-D7jjAE6i.js").then((m) => ({ default: m.AgentGraphCanvas }))));
2681
+ return lazy(() => retryImport(() => import("./AgentGraphCanvas-CMdOlSlh.js").then((m) => ({ default: m.AgentGraphCanvas }))));
2682
2682
  }
2683
2683
  /** The agents as a list, for when the canvas cannot load. */
2684
2684
  function AgentListFallback({ nodes, selectedId, onSelect, className, onRetry }) {
@@ -1,5 +1,5 @@
1
1
  import { t as MOTION_CONTROL } from "./motion-Bn7ESHrj.js";
2
- import { T as statusBorder, U as fmtTokenTotal, V as fmtCost, a as useColorMode, c as NodeMark, d as RESTING_BORDER, f as RESTING_SHADOW, i as motionAllowed, o as KIND_ACCENT, p as STATUS_COLOR, r as SELECTION_OUTLINE, y as edgeColor } from "./AgentGraph-CWW3Zx1N.js";
2
+ import { T as statusBorder, U as fmtTokenTotal, V as fmtCost, a as useColorMode, c as NodeMark, d as RESTING_BORDER, f as RESTING_SHADOW, i as motionAllowed, o as KIND_ACCENT, p as STATUS_COLOR, r as SELECTION_OUTLINE, y as edgeColor } from "./AgentGraph-DJEQrKTs.js";
3
3
  import { t as loadElk } from "./elk-loader-Dl9S7jQk.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -596,11 +596,7 @@ function AgentMessageEdgeView({ id, source, target, data, markerEnd }) {
596
596
  }) })] });
597
597
  }
598
598
  // src/workflows/agent-live-card.tsx
599
- const SETTLED = /* @__PURE__ */ new Set([
600
- "succeeded",
601
- "failed",
602
- "stopped"
603
- ]);
599
+ const SETTLED = /* @__PURE__ */ new Set(["succeeded", "stopped"]);
604
600
  const EVENT_GLYPHS = [
605
601
  [/^(bash|sh|run|exec|cargo|npm|pnpm|make)\b/, Terminal],
606
602
  [/^(edit|write|patch|apply)\b/, Pencil],
@@ -611,6 +607,13 @@ const EVENT_GLYPHS = [
611
607
  [/^(wait|sleep|queue)\b/, Hourglass]
612
608
  ];
613
609
  const eventGlyph = (label) => EVENT_GLYPHS.find(([match]) => match.test(label.toLowerCase()))?.[1] ?? Sparkles;
610
+ function clockTime(at) {
611
+ return at == null || !Number.isFinite(at) ? void 0 : new Date(at).toLocaleTimeString([], {
612
+ hour: "2-digit",
613
+ minute: "2-digit",
614
+ hourCycle: "h23"
615
+ });
616
+ }
614
617
  function ago(at, now) {
615
618
  if (at == null || !Number.isFinite(at)) return void 0;
616
619
  const s = Math.max(0, Math.round((now - at) / 1e3));
@@ -640,7 +643,8 @@ function useNow(fixed, live) {
640
643
  function LiveAgentCard({ data }) {
641
644
  const { agent, selected, direction } = data;
642
645
  const settled = SETTLED.has(agent.status);
643
- const now = useNow(data.now, !settled);
646
+ const failed = agent.status === "failed";
647
+ const now = useNow(data.now, !settled && !failed);
644
648
  const s = agentStatus(agent.status);
645
649
  const alive = aliveFor(agent.startedAt, now);
646
650
  if (settled) return /* @__PURE__ */ jsxs("div", {
@@ -725,7 +729,10 @@ function LiveAgentCard({ data }) {
725
729
  })
726
730
  ]
727
731
  }),
728
- /* @__PURE__ */ jsx("p", {
732
+ failed ? /* @__PURE__ */ jsx("p", {
733
+ className: "ag-live-thinking ag-live-failure",
734
+ children: agent.result ?? events.at(-1)?.label ?? s.label
735
+ }) : /* @__PURE__ */ jsx("p", {
729
736
  className: "ag-live-thinking",
730
737
  children: agent.turn || /* @__PURE__ */ jsx("span", {
731
738
  className: "ag-live-quiet",
@@ -737,7 +744,7 @@ function LiveAgentCard({ data }) {
737
744
  "aria-label": "Latest events",
738
745
  children: events.map((event) => {
739
746
  const Glyph = eventGlyph(event.label);
740
- const when = ago(event.at, now);
747
+ const when = failed ? clockTime(event.at) : ago(event.at, now);
741
748
  return /* @__PURE__ */ jsxs("li", { children: [
742
749
  /* @__PURE__ */ jsx(Glyph, {
743
750
  "aria-hidden": true,
@@ -1002,7 +1009,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1002
1009
  className: `flex items-center justify-center rounded-lg border border-border border-dashed p-4 text-center text-muted-foreground text-xs ${className ?? ""}`,
1003
1010
  children: emptyState ?? "No agents yet"
1004
1011
  });
1005
- return /* @__PURE__ */ jsxs("div", {
1012
+ return /* @__PURE__ */ jsx("div", {
1006
1013
  ref: (el) => {
1007
1014
  wrapperRef.current = el;
1008
1015
  measureCanvas(el);
@@ -1010,7 +1017,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1010
1017
  className: `agent-graph${live ? " ag-live" : ""} relative transition-opacity duration-150 ease-out motion-reduce:transition-none ${layout && shown ? "opacity-100" : "opacity-0"} ${className ?? ""}`,
1011
1018
  "data-layout": layout && shown ? "ready" : "pending",
1012
1019
  "data-columns": layout?.columns,
1013
- children: [live && /* @__PURE__ */ jsx("style", { children: "\n.ag-live { --ag-fg: hsl(var(--foreground)); --ag-muted: hsl(var(--muted-foreground)); --ag-surface: hsl(var(--card)); --ag-border: hsl(var(--border)); }\n.ag-live .ag-live-card { position: relative; display: flex; flex-direction: column; gap: 8px; width: 100%; height: 100%; padding: 12px; border: 1px solid var(--ag-border);\n border-radius: 14px; background: var(--ag-surface); color: var(--ag-fg); cursor: pointer; overflow: hidden; animation: ag-live-grow 420ms cubic-bezier(.2,.8,.2,1) both; transform-origin: 50% 0;\n transition: border-color 200ms ease, box-shadow 200ms ease, transform 200ms cubic-bezier(.2,.8,.2,1); }\n.ag-live .ag-live-card:hover { transform: translateY(-1px); }\n/* A running agent's card carries a thin travelling sheen along its top edge: work in progress without a glowing border. */\n.ag-live .ag-live-card[data-status=\"running\"]::before { content: \"\"; position: absolute; inset: 0 0 auto; height: 2px;\n background: linear-gradient(90deg, transparent, var(--ag-status), transparent); background-size: 40% 100%; background-repeat: no-repeat; animation: ag-live-sheen 2.4s ease-in-out infinite; }\n.ag-live .ag-live-head { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.ag-live .ag-live-names { display: flex; flex-direction: column; min-width: 0; flex: 1; }\n.ag-live .ag-live-name { font-size: 14px; line-height: 18px; font-weight: 600; letter-spacing: -.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.ag-live .ag-live-meta, .ag-live .ag-live-stats { font-size: 11px; line-height: 14px; color: var(--ag-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.ag-live .ag-live-stats { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; font-variant-numeric: tabular-nums; flex: none; }\n.ag-live .ag-live-pill { display: inline-flex; align-items: center; gap: 4px; height: 16px; padding: 0 6px; border-radius: 8px; font-weight: 600; color: var(--ag-status);\n background: color-mix(in oklab, var(--ag-status) 14%, transparent); }\n.ag-live .ag-live-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--ag-status); }\n.ag-live [data-status=\"running\"] .ag-live-dot { animation: ag-live-breathe 1.6s ease-in-out infinite; }\n.ag-live .ag-live-thinking { flex: none; margin: 0; font-size: 13px; line-height: 17px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; animation: ag-live-in 260ms ease-out both; }\n.ag-live .ag-live-quiet { color: var(--ag-muted); }\n.ag-live .ag-live-events { margin: auto 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; }\n.ag-live .ag-live-events li { display: flex; align-items: center; gap: 6px; height: 16px; font: 11px/16px var(--font-mono, ui-monospace, monospace); color: var(--ag-muted);\n animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both; }\n.ag-live .ag-live-events li svg { flex: none; opacity: .8; }\n/* Older lines fade back so the newest reads first, as a log tail does. */\n.ag-live .ag-live-events li:nth-last-child(3) { opacity: .55; }\n.ag-live .ag-live-events li:nth-last-child(2) { opacity: .8; }\n.ag-live .ag-live-events li:last-child { color: var(--ag-fg); animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both, ag-live-flash 1.2s ease-out both; }\n.ag-live .ag-live-event-label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.ag-live .ag-live-event-at { flex: none; font-family: inherit; color: var(--ag-muted); font-variant-numeric: tabular-nums; }\n.ag-live .ag-live-slot { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; }\n.ag-live .ag-live-chip { display: inline-flex; align-items: center; gap: 8px; max-width: 100%; height: 32px; padding: 0 12px; border: 1px solid var(--ag-border); border-radius: 16px;\n background: var(--ag-surface); color: var(--ag-muted); font-size: 12px; opacity: .72; cursor: pointer; animation: ag-live-settle 320ms cubic-bezier(.2,.8,.2,1) both; }\n.ag-live .ag-live-chip-name { color: var(--ag-fg); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.ag-live .ag-live-chip-result { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n@keyframes ag-live-sheen { from { background-position: -40% 0; } to { background-position: 140% 0; } }\n@keyframes ag-live-breathe { 50% { opacity: .35; transform: scale(.8); } }\n@keyframes ag-live-flash { from { background: color-mix(in oklab, var(--ag-status) 16%, transparent); } to { background: transparent; } }\n@keyframes ag-live-grow { from { opacity: 0; transform: scale(.92) translateY(-8px); } }\n@keyframes ag-live-in { from { opacity: 0; transform: translateY(6px); } }\n@keyframes ag-live-settle { from { opacity: 1; transform: scale(1.08); } }\n@media (prefers-reduced-motion: reduce) { .ag-live *, .ag-live *::before { animation: none !important; } .ag-live .ag-live-card:hover { transform: none; } }\n" }), /* @__PURE__ */ jsxs(ReactFlow, {
1020
+ children: /* @__PURE__ */ jsxs(ReactFlow, {
1014
1021
  nodes: flowNodes,
1015
1022
  edges: flowEdges,
1016
1023
  nodeTypes: NODE_TYPES,
@@ -1066,7 +1073,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1066
1073
  }
1067
1074
  })
1068
1075
  ]
1069
- })]
1076
+ })
1070
1077
  });
1071
1078
  }
1072
1079
  export { AgentGraphCanvas };
@@ -1,4 +1,4 @@
1
- import { A as buildWorkflowGraph, B as clampPreview, C as problemSurface, E as COMPACT_NODE_SIZE, F as worstSeverity, H as fmtDuration, N as triggerNodeIndex, P as wfEdgeId, S as problemBorder, T as statusBorder, V as fmtCost, W as fmtTokens, _ as StatusFooter, a as useColorMode, b as emptySlotLabel, c as NodeMark, d as RESTING_BORDER, f as RESTING_SHADOW, i as motionAllowed, j as isStructuralKind, l as ProblemMarker, m as STATUS_LABEL, p as STATUS_COLOR, r as SELECTION_OUTLINE, u as ProblemMessages, v as StatusPill, w as problemTitle, x as kindAccent, y as edgeColor, z as shortModel } from "./AgentGraph-CWW3Zx1N.js";
1
+ import { A as buildWorkflowGraph, B as clampPreview, C as problemSurface, E as COMPACT_NODE_SIZE, F as worstSeverity, H as fmtDuration, N as triggerNodeIndex, P as wfEdgeId, S as problemBorder, T as statusBorder, V as fmtCost, W as fmtTokens, _ as StatusFooter, a as useColorMode, b as emptySlotLabel, c as NodeMark, d as RESTING_BORDER, f as RESTING_SHADOW, i as motionAllowed, j as isStructuralKind, l as ProblemMarker, m as STATUS_LABEL, p as STATUS_COLOR, r as SELECTION_OUTLINE, u as ProblemMessages, v as StatusPill, w as problemTitle, x as kindAccent, y as edgeColor, z as shortModel } from "./AgentGraph-DJEQrKTs.js";
2
2
  import { n as classifyOutput, t as NodeOutputBody } from "./node-output-DlySTwxr.js";
3
3
  import { t as loadElk } from "./elk-loader-Dl9S7jQk.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
package/dist/globals.css CHANGED
@@ -78,7 +78,6 @@
78
78
  --radius-xl: 12px;
79
79
  --radius-2xl: 1rem;
80
80
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
81
- --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
82
81
  --animate-spin: spin 1s linear infinite;
83
82
  --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
84
83
  --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
@@ -4490,10 +4489,6 @@
4490
4489
  --tw-duration: var(--transition-fast);
4491
4490
  transition-duration: var(--transition-fast);
4492
4491
  }
4493
- .ease-in-out {
4494
- --tw-ease: var(--ease-in-out);
4495
- transition-timing-function: var(--ease-in-out);
4496
- }
4497
4492
  .ease-out {
4498
4493
  --tw-ease: var(--ease-out);
4499
4494
  transition-timing-function: var(--ease-out);
@@ -8701,6 +8696,248 @@
8701
8696
  .tangle-prose th:not(:first-child), .tangle-prose td:not(:first-child) {
8702
8697
  border-left: 1px solid var(--border-subtle);
8703
8698
  }
8699
+ .ag-live {
8700
+ --ag-fg: hsl(var(--foreground));
8701
+ --ag-muted: hsl(var(--muted-foreground));
8702
+ --ag-surface: hsl(var(--card));
8703
+ --ag-border: hsl(var(--border));
8704
+ }
8705
+ .ag-live .ag-live-card {
8706
+ position: relative;
8707
+ display: flex;
8708
+ flex-direction: column;
8709
+ gap: 8px;
8710
+ width: 100%;
8711
+ height: 100%;
8712
+ padding: 12px;
8713
+ border: 1px solid var(--ag-border);
8714
+ border-radius: 14px;
8715
+ background: var(--ag-surface);
8716
+ color: var(--ag-fg);
8717
+ cursor: pointer;
8718
+ overflow: hidden;
8719
+ animation: ag-live-grow 420ms cubic-bezier(.2,.8,.2,1) both;
8720
+ transform-origin: 50% 0;
8721
+ transition: border-color 200ms ease, box-shadow 200ms ease, transform 200ms cubic-bezier(.2,.8,.2,1);
8722
+ }
8723
+ .ag-live .ag-live-card:hover {
8724
+ transform: translateY(-1px);
8725
+ }
8726
+ .ag-live .ag-live-card[data-status="running"]::before {
8727
+ content: "";
8728
+ position: absolute;
8729
+ inset: 0 0 auto;
8730
+ height: 2px;
8731
+ background: linear-gradient(90deg, transparent, var(--ag-status), transparent);
8732
+ background-size: 40% 100%;
8733
+ background-repeat: no-repeat;
8734
+ animation: ag-live-sheen 2.4s ease-in-out infinite;
8735
+ }
8736
+ .ag-live .ag-live-head {
8737
+ display: flex;
8738
+ align-items: center;
8739
+ gap: 8px;
8740
+ min-width: 0;
8741
+ }
8742
+ .ag-live .ag-live-names {
8743
+ display: flex;
8744
+ flex-direction: column;
8745
+ min-width: 0;
8746
+ flex: 1;
8747
+ }
8748
+ .ag-live .ag-live-name {
8749
+ font-size: 14px;
8750
+ line-height: 18px;
8751
+ font-weight: 600;
8752
+ letter-spacing: -.01em;
8753
+ white-space: nowrap;
8754
+ overflow: hidden;
8755
+ text-overflow: ellipsis;
8756
+ }
8757
+ .ag-live .ag-live-meta, .ag-live .ag-live-stats {
8758
+ font-size: 11px;
8759
+ line-height: 14px;
8760
+ color: var(--ag-muted);
8761
+ white-space: nowrap;
8762
+ overflow: hidden;
8763
+ text-overflow: ellipsis;
8764
+ }
8765
+ .ag-live .ag-live-stats {
8766
+ display: flex;
8767
+ flex-direction: column;
8768
+ align-items: flex-end;
8769
+ gap: 2px;
8770
+ font-variant-numeric: tabular-nums;
8771
+ flex: none;
8772
+ }
8773
+ .ag-live .ag-live-pill {
8774
+ display: inline-flex;
8775
+ align-items: center;
8776
+ gap: 4px;
8777
+ height: 16px;
8778
+ padding: 0 6px;
8779
+ border-radius: 8px;
8780
+ font-weight: 600;
8781
+ color: var(--ag-status);
8782
+ background: var(--ag-status);
8783
+ @supports (color: color-mix(in lab, red, red)) {
8784
+ background: color-mix(in oklab, var(--ag-status) 14%, transparent);
8785
+ }
8786
+ }
8787
+ .ag-live .ag-live-dot {
8788
+ width: 6px;
8789
+ height: 6px;
8790
+ border-radius: 50%;
8791
+ background: var(--ag-status);
8792
+ }
8793
+ .ag-live [data-status="running"] .ag-live-dot {
8794
+ animation: ag-live-breathe 1.6s ease-in-out infinite;
8795
+ }
8796
+ .ag-live .ag-live-thinking {
8797
+ flex: none;
8798
+ margin: 0;
8799
+ font-size: 13px;
8800
+ line-height: 17px;
8801
+ display: -webkit-box;
8802
+ -webkit-line-clamp: 2;
8803
+ -webkit-box-orient: vertical;
8804
+ overflow: hidden;
8805
+ animation: ag-live-in 260ms ease-out both;
8806
+ }
8807
+ .ag-live .ag-live-quiet {
8808
+ color: var(--ag-muted);
8809
+ }
8810
+ .ag-live .ag-live-failure {
8811
+ color: var(--ag-status);
8812
+ }
8813
+ .ag-live .ag-live-events {
8814
+ margin: auto 0 0;
8815
+ padding: 0;
8816
+ list-style: none;
8817
+ display: flex;
8818
+ flex-direction: column;
8819
+ }
8820
+ .ag-live .ag-live-events li {
8821
+ display: flex;
8822
+ align-items: center;
8823
+ gap: 6px;
8824
+ height: 16px;
8825
+ font: 11px/16px var(--font-mono, ui-monospace, monospace);
8826
+ color: var(--ag-muted);
8827
+ animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both;
8828
+ }
8829
+ .ag-live .ag-live-events li svg {
8830
+ flex: none;
8831
+ opacity: .8;
8832
+ }
8833
+ .ag-live .ag-live-events li:nth-last-child(3) {
8834
+ opacity: .55;
8835
+ }
8836
+ .ag-live .ag-live-events li:nth-last-child(2) {
8837
+ opacity: .8;
8838
+ }
8839
+ .ag-live .ag-live-events li:last-child {
8840
+ color: var(--ag-fg);
8841
+ animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both, ag-live-flash 1.2s ease-out both;
8842
+ }
8843
+ .ag-live .ag-live-event-label {
8844
+ flex: 1;
8845
+ min-width: 0;
8846
+ white-space: nowrap;
8847
+ overflow: hidden;
8848
+ text-overflow: ellipsis;
8849
+ }
8850
+ .ag-live .ag-live-event-at {
8851
+ flex: none;
8852
+ font-family: inherit;
8853
+ color: var(--ag-muted);
8854
+ font-variant-numeric: tabular-nums;
8855
+ }
8856
+ .ag-live .ag-live-slot {
8857
+ display: flex;
8858
+ align-items: center;
8859
+ justify-content: center;
8860
+ width: 100%;
8861
+ height: 100%;
8862
+ }
8863
+ .ag-live .ag-live-chip {
8864
+ display: inline-flex;
8865
+ align-items: center;
8866
+ gap: 8px;
8867
+ max-width: 100%;
8868
+ height: 32px;
8869
+ padding: 0 12px;
8870
+ border: 1px solid var(--ag-border);
8871
+ border-radius: 16px;
8872
+ background: var(--ag-surface);
8873
+ color: var(--ag-muted);
8874
+ font-size: 12px;
8875
+ cursor: pointer;
8876
+ animation: ag-live-settle 320ms cubic-bezier(.2,.8,.2,1) both;
8877
+ }
8878
+ .ag-live .ag-live-chip-name {
8879
+ color: var(--ag-fg);
8880
+ font-weight: 600;
8881
+ white-space: nowrap;
8882
+ overflow: hidden;
8883
+ text-overflow: ellipsis;
8884
+ }
8885
+ .ag-live .ag-live-chip-result {
8886
+ color: var(--ag-fg);
8887
+ font-weight: 500;
8888
+ line-height: 16px;
8889
+ white-space: nowrap;
8890
+ overflow: hidden;
8891
+ text-overflow: ellipsis;
8892
+ }
8893
+ @keyframes ag-live-sheen {
8894
+ from {
8895
+ background-position: -40% 0;
8896
+ }
8897
+ to {
8898
+ background-position: 140% 0;
8899
+ }
8900
+ }
8901
+ @keyframes ag-live-breathe {
8902
+ 50% {
8903
+ opacity: .35;
8904
+ transform: scale(.8);
8905
+ }
8906
+ }
8907
+ @keyframes ag-live-flash {
8908
+ from {
8909
+ background: color-mix(in oklab, var(--ag-status) 16%, transparent);
8910
+ }
8911
+ to {
8912
+ background: transparent;
8913
+ }
8914
+ }
8915
+ @keyframes ag-live-grow {
8916
+ from {
8917
+ opacity: 0;
8918
+ transform: scale(.92) translateY(-8px);
8919
+ }
8920
+ }
8921
+ @keyframes ag-live-in {
8922
+ from {
8923
+ opacity: 0;
8924
+ transform: translateY(6px);
8925
+ }
8926
+ }
8927
+ @keyframes ag-live-settle {
8928
+ from {
8929
+ opacity: 1;
8930
+ transform: scale(1.08);
8931
+ }
8932
+ }
8933
+ @media (prefers-reduced-motion: reduce) {
8934
+ .ag-live *, .ag-live *::before {
8935
+ animation: none !important;
8936
+ }
8937
+ .ag-live .ag-live-card:hover {
8938
+ transform: none;
8939
+ }
8940
+ }
8704
8941
  @property --tw-translate-x {
8705
8942
  syntax: "*";
8706
8943
  inherits: false;
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import { a as CodeSurface, i as CODE_THEME, n as buildUnifiedPatch, r as compute
13
13
  import { n as PreviewView, t as EmbeddedAppView } from "./embedded-app-view-DXsoPale.js";
14
14
  import { OPENUI_NODE_JSON_SCHEMA, OPENUI_NODE_TYPES, OpenUIArtifactRenderer, findUnsupportedOpenUINode, validateOpenUIJsonArtifact, validateOpenUIJsonNode } from "./openui.js";
15
15
  import { a as MessageList, c as UserMessage, d as modelProvider, f as snapHarnessToModel, g as ReasoningLevelPicker, h as HARNESS_REASONING_OPTIONS, i as MessageAuthor, l as isViewerMessage, m as DEFAULT_REASONING_LEVEL_OPTIONS, n as ChatContainer, o as TRANSCRIPT_TEXT, p as AgentProfilePicker, r as ChatMessage, s as ThinkingIndicator, t as AgentTimeline, u as ArtifactAgentDock } from "./chat-4OZD23RA.js";
16
- import { _ as TraceWorkspace, a as InlineToolItem, b as TraceWaterfall, c as RunPhaseList, d as TaskList, f as ToolCallFeed, g as taskStatus, h as taskProgress, i as InlineThinkingItem, l as RunRowShell, m as showsTaskPriority, n as ApprovalDiffSummary, o as LiveDuration, p as parseToolEvent, r as ExpandedToolDetail, s as RunGroup, t as ApprovalCard, u as RunRowStatusDot, v as foldAgentRows, x as traceSpanMark, y as useAgentStream } from "./run-C91XKDrv.js";
16
+ import { _ as TraceWorkspace, a as InlineToolItem, b as TraceWaterfall, c as RunPhaseList, d as TaskList, f as ToolCallFeed, g as taskStatus, h as taskProgress, i as InlineThinkingItem, l as RunRowShell, m as showsTaskPriority, n as ApprovalDiffSummary, o as LiveDuration, p as parseToolEvent, r as ExpandedToolDetail, s as RunGroup, t as ApprovalCard, u as RunRowStatusDot, v as foldAgentRows, x as traceSpanMark, y as useAgentStream } from "./run-2128n_Cm.js";
17
17
  import "./vault-tree.js";
18
18
  import { a as TangleLoginButton, i as UserMenu, n as GitHubLoginButton, r as LoginLayout, t as AuthHeader } from "./auth-BDpoZ_2f.js";
19
19
  import { t as AgentMessagingConnection } from "./connections-DymjzHe_.js";
@@ -1,7 +1,7 @@
1
1
  import { t as cn } from "./utils-BER_bdgE.js";
2
2
  import { i as modelBrandFor, t as ModelBrandStack } from "./model-brand-bTcMjQtB.js";
3
3
  import { t as ProviderIcon } from "./provider-logo-CPKRPHcS.js";
4
- import { t as AgentGraph } from "./AgentGraph-CWW3Zx1N.js";
4
+ import { t as AgentGraph } from "./AgentGraph-DJEQrKTs.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
7
7
  import { X } from "lucide-react";
package/dist/run.js CHANGED
@@ -1 +1 @@
1
- export { t as ApprovalCard, n as ApprovalDiffSummary, r as ExpandedToolDetail, i as InlineThinkingItem, a as InlineToolItem, o as LiveDuration, s as RunGroup, c as RunPhaseList, l as RunRowShell, u as RunRowStatusDot, d as TaskList, f as ToolCallFeed, b as TraceWaterfall, _ as TraceWorkspace, v as foldAgentRows, p as parseToolEvent, m as showsTaskPriority, h as taskProgress, g as taskStatus, x as traceSpanMark, y as useAgentStream } from "./run-C91XKDrv.js";
1
+ export { t as ApprovalCard, n as ApprovalDiffSummary, r as ExpandedToolDetail, i as InlineThinkingItem, a as InlineToolItem, o as LiveDuration, s as RunGroup, c as RunPhaseList, l as RunRowShell, u as RunRowStatusDot, d as TaskList, f as ToolCallFeed, b as TraceWaterfall, _ as TraceWorkspace, v as foldAgentRows, p as parseToolEvent, m as showsTaskPriority, h as taskProgress, g as taskStatus, x as traceSpanMark, y as useAgentStream } from "./run-2128n_Cm.js";
package/dist/styles.css CHANGED
@@ -78,7 +78,6 @@
78
78
  --radius-xl: 12px;
79
79
  --radius-2xl: 1rem;
80
80
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
81
- --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
82
81
  --animate-spin: spin 1s linear infinite;
83
82
  --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
84
83
  --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
@@ -4490,10 +4489,6 @@
4490
4489
  --tw-duration: var(--transition-fast);
4491
4490
  transition-duration: var(--transition-fast);
4492
4491
  }
4493
- .ease-in-out {
4494
- --tw-ease: var(--ease-in-out);
4495
- transition-timing-function: var(--ease-in-out);
4496
- }
4497
4492
  .ease-out {
4498
4493
  --tw-ease: var(--ease-out);
4499
4494
  transition-timing-function: var(--ease-out);
@@ -8701,6 +8696,248 @@
8701
8696
  .tangle-prose th:not(:first-child), .tangle-prose td:not(:first-child) {
8702
8697
  border-left: 1px solid var(--border-subtle);
8703
8698
  }
8699
+ .ag-live {
8700
+ --ag-fg: hsl(var(--foreground));
8701
+ --ag-muted: hsl(var(--muted-foreground));
8702
+ --ag-surface: hsl(var(--card));
8703
+ --ag-border: hsl(var(--border));
8704
+ }
8705
+ .ag-live .ag-live-card {
8706
+ position: relative;
8707
+ display: flex;
8708
+ flex-direction: column;
8709
+ gap: 8px;
8710
+ width: 100%;
8711
+ height: 100%;
8712
+ padding: 12px;
8713
+ border: 1px solid var(--ag-border);
8714
+ border-radius: 14px;
8715
+ background: var(--ag-surface);
8716
+ color: var(--ag-fg);
8717
+ cursor: pointer;
8718
+ overflow: hidden;
8719
+ animation: ag-live-grow 420ms cubic-bezier(.2,.8,.2,1) both;
8720
+ transform-origin: 50% 0;
8721
+ transition: border-color 200ms ease, box-shadow 200ms ease, transform 200ms cubic-bezier(.2,.8,.2,1);
8722
+ }
8723
+ .ag-live .ag-live-card:hover {
8724
+ transform: translateY(-1px);
8725
+ }
8726
+ .ag-live .ag-live-card[data-status="running"]::before {
8727
+ content: "";
8728
+ position: absolute;
8729
+ inset: 0 0 auto;
8730
+ height: 2px;
8731
+ background: linear-gradient(90deg, transparent, var(--ag-status), transparent);
8732
+ background-size: 40% 100%;
8733
+ background-repeat: no-repeat;
8734
+ animation: ag-live-sheen 2.4s ease-in-out infinite;
8735
+ }
8736
+ .ag-live .ag-live-head {
8737
+ display: flex;
8738
+ align-items: center;
8739
+ gap: 8px;
8740
+ min-width: 0;
8741
+ }
8742
+ .ag-live .ag-live-names {
8743
+ display: flex;
8744
+ flex-direction: column;
8745
+ min-width: 0;
8746
+ flex: 1;
8747
+ }
8748
+ .ag-live .ag-live-name {
8749
+ font-size: 14px;
8750
+ line-height: 18px;
8751
+ font-weight: 600;
8752
+ letter-spacing: -.01em;
8753
+ white-space: nowrap;
8754
+ overflow: hidden;
8755
+ text-overflow: ellipsis;
8756
+ }
8757
+ .ag-live .ag-live-meta, .ag-live .ag-live-stats {
8758
+ font-size: 11px;
8759
+ line-height: 14px;
8760
+ color: var(--ag-muted);
8761
+ white-space: nowrap;
8762
+ overflow: hidden;
8763
+ text-overflow: ellipsis;
8764
+ }
8765
+ .ag-live .ag-live-stats {
8766
+ display: flex;
8767
+ flex-direction: column;
8768
+ align-items: flex-end;
8769
+ gap: 2px;
8770
+ font-variant-numeric: tabular-nums;
8771
+ flex: none;
8772
+ }
8773
+ .ag-live .ag-live-pill {
8774
+ display: inline-flex;
8775
+ align-items: center;
8776
+ gap: 4px;
8777
+ height: 16px;
8778
+ padding: 0 6px;
8779
+ border-radius: 8px;
8780
+ font-weight: 600;
8781
+ color: var(--ag-status);
8782
+ background: var(--ag-status);
8783
+ @supports (color: color-mix(in lab, red, red)) {
8784
+ background: color-mix(in oklab, var(--ag-status) 14%, transparent);
8785
+ }
8786
+ }
8787
+ .ag-live .ag-live-dot {
8788
+ width: 6px;
8789
+ height: 6px;
8790
+ border-radius: 50%;
8791
+ background: var(--ag-status);
8792
+ }
8793
+ .ag-live [data-status="running"] .ag-live-dot {
8794
+ animation: ag-live-breathe 1.6s ease-in-out infinite;
8795
+ }
8796
+ .ag-live .ag-live-thinking {
8797
+ flex: none;
8798
+ margin: 0;
8799
+ font-size: 13px;
8800
+ line-height: 17px;
8801
+ display: -webkit-box;
8802
+ -webkit-line-clamp: 2;
8803
+ -webkit-box-orient: vertical;
8804
+ overflow: hidden;
8805
+ animation: ag-live-in 260ms ease-out both;
8806
+ }
8807
+ .ag-live .ag-live-quiet {
8808
+ color: var(--ag-muted);
8809
+ }
8810
+ .ag-live .ag-live-failure {
8811
+ color: var(--ag-status);
8812
+ }
8813
+ .ag-live .ag-live-events {
8814
+ margin: auto 0 0;
8815
+ padding: 0;
8816
+ list-style: none;
8817
+ display: flex;
8818
+ flex-direction: column;
8819
+ }
8820
+ .ag-live .ag-live-events li {
8821
+ display: flex;
8822
+ align-items: center;
8823
+ gap: 6px;
8824
+ height: 16px;
8825
+ font: 11px/16px var(--font-mono, ui-monospace, monospace);
8826
+ color: var(--ag-muted);
8827
+ animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both;
8828
+ }
8829
+ .ag-live .ag-live-events li svg {
8830
+ flex: none;
8831
+ opacity: .8;
8832
+ }
8833
+ .ag-live .ag-live-events li:nth-last-child(3) {
8834
+ opacity: .55;
8835
+ }
8836
+ .ag-live .ag-live-events li:nth-last-child(2) {
8837
+ opacity: .8;
8838
+ }
8839
+ .ag-live .ag-live-events li:last-child {
8840
+ color: var(--ag-fg);
8841
+ animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both, ag-live-flash 1.2s ease-out both;
8842
+ }
8843
+ .ag-live .ag-live-event-label {
8844
+ flex: 1;
8845
+ min-width: 0;
8846
+ white-space: nowrap;
8847
+ overflow: hidden;
8848
+ text-overflow: ellipsis;
8849
+ }
8850
+ .ag-live .ag-live-event-at {
8851
+ flex: none;
8852
+ font-family: inherit;
8853
+ color: var(--ag-muted);
8854
+ font-variant-numeric: tabular-nums;
8855
+ }
8856
+ .ag-live .ag-live-slot {
8857
+ display: flex;
8858
+ align-items: center;
8859
+ justify-content: center;
8860
+ width: 100%;
8861
+ height: 100%;
8862
+ }
8863
+ .ag-live .ag-live-chip {
8864
+ display: inline-flex;
8865
+ align-items: center;
8866
+ gap: 8px;
8867
+ max-width: 100%;
8868
+ height: 32px;
8869
+ padding: 0 12px;
8870
+ border: 1px solid var(--ag-border);
8871
+ border-radius: 16px;
8872
+ background: var(--ag-surface);
8873
+ color: var(--ag-muted);
8874
+ font-size: 12px;
8875
+ cursor: pointer;
8876
+ animation: ag-live-settle 320ms cubic-bezier(.2,.8,.2,1) both;
8877
+ }
8878
+ .ag-live .ag-live-chip-name {
8879
+ color: var(--ag-fg);
8880
+ font-weight: 600;
8881
+ white-space: nowrap;
8882
+ overflow: hidden;
8883
+ text-overflow: ellipsis;
8884
+ }
8885
+ .ag-live .ag-live-chip-result {
8886
+ color: var(--ag-fg);
8887
+ font-weight: 500;
8888
+ line-height: 16px;
8889
+ white-space: nowrap;
8890
+ overflow: hidden;
8891
+ text-overflow: ellipsis;
8892
+ }
8893
+ @keyframes ag-live-sheen {
8894
+ from {
8895
+ background-position: -40% 0;
8896
+ }
8897
+ to {
8898
+ background-position: 140% 0;
8899
+ }
8900
+ }
8901
+ @keyframes ag-live-breathe {
8902
+ 50% {
8903
+ opacity: .35;
8904
+ transform: scale(.8);
8905
+ }
8906
+ }
8907
+ @keyframes ag-live-flash {
8908
+ from {
8909
+ background: color-mix(in oklab, var(--ag-status) 16%, transparent);
8910
+ }
8911
+ to {
8912
+ background: transparent;
8913
+ }
8914
+ }
8915
+ @keyframes ag-live-grow {
8916
+ from {
8917
+ opacity: 0;
8918
+ transform: scale(.92) translateY(-8px);
8919
+ }
8920
+ }
8921
+ @keyframes ag-live-in {
8922
+ from {
8923
+ opacity: 0;
8924
+ transform: translateY(6px);
8925
+ }
8926
+ }
8927
+ @keyframes ag-live-settle {
8928
+ from {
8929
+ opacity: 1;
8930
+ transform: scale(1.08);
8931
+ }
8932
+ }
8933
+ @media (prefers-reduced-motion: reduce) {
8934
+ .ag-live *, .ag-live *::before {
8935
+ animation: none !important;
8936
+ }
8937
+ .ag-live .ag-live-card:hover {
8938
+ transform: none;
8939
+ }
8940
+ }
8704
8941
  @property --tw-translate-x {
8705
8942
  syntax: "*";
8706
8943
  inherits: false;
package/dist/tailwind.css CHANGED
@@ -893,6 +893,50 @@
893
893
  border-left: 1px solid var(--border-subtle);
894
894
  }
895
895
 
896
+ /* AgentGraph live cards, scoped under `.ag-live` on the package theme tokens. Type 11/12/13/14 px, 4 px grid. */
897
+ .ag-live { --ag-fg: hsl(var(--foreground)); --ag-muted: hsl(var(--muted-foreground)); --ag-surface: hsl(var(--card)); --ag-border: hsl(var(--border)); }
898
+ .ag-live .ag-live-card { position: relative; display: flex; flex-direction: column; gap: 8px; width: 100%; height: 100%; padding: 12px; border: 1px solid var(--ag-border);
899
+ border-radius: 14px; background: var(--ag-surface); color: var(--ag-fg); cursor: pointer; overflow: hidden; animation: ag-live-grow 420ms cubic-bezier(.2,.8,.2,1) both; transform-origin: 50% 0;
900
+ transition: border-color 200ms ease, box-shadow 200ms ease, transform 200ms cubic-bezier(.2,.8,.2,1); }
901
+ .ag-live .ag-live-card:hover { transform: translateY(-1px); }
902
+ /* A running agent's card carries a thin travelling sheen along its top edge: work in progress without a glowing border. */
903
+ .ag-live .ag-live-card[data-status="running"]::before { content: ""; position: absolute; inset: 0 0 auto; height: 2px;
904
+ background: linear-gradient(90deg, transparent, var(--ag-status), transparent); background-size: 40% 100%; background-repeat: no-repeat; animation: ag-live-sheen 2.4s ease-in-out infinite; }
905
+ .ag-live .ag-live-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
906
+ .ag-live .ag-live-names { display: flex; flex-direction: column; min-width: 0; flex: 1; }
907
+ .ag-live .ag-live-name { font-size: 14px; line-height: 18px; font-weight: 600; letter-spacing: -.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
908
+ .ag-live .ag-live-meta, .ag-live .ag-live-stats { font-size: 11px; line-height: 14px; color: var(--ag-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
909
+ .ag-live .ag-live-stats { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; font-variant-numeric: tabular-nums; flex: none; }
910
+ .ag-live .ag-live-pill { display: inline-flex; align-items: center; gap: 4px; height: 16px; padding: 0 6px; border-radius: 8px; font-weight: 600; color: var(--ag-status);
911
+ background: color-mix(in oklab, var(--ag-status) 14%, transparent); }
912
+ .ag-live .ag-live-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--ag-status); }
913
+ .ag-live [data-status="running"] .ag-live-dot { animation: ag-live-breathe 1.6s ease-in-out infinite; }
914
+ .ag-live .ag-live-thinking { flex: none; margin: 0; font-size: 13px; line-height: 17px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; animation: ag-live-in 260ms ease-out both; }
915
+ .ag-live .ag-live-quiet { color: var(--ag-muted); }
916
+ .ag-live .ag-live-failure { color: var(--ag-status); }
917
+ .ag-live .ag-live-events { margin: auto 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; }
918
+ .ag-live .ag-live-events li { display: flex; align-items: center; gap: 6px; height: 16px; font: 11px/16px var(--font-mono, ui-monospace, monospace); color: var(--ag-muted);
919
+ animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both; }
920
+ .ag-live .ag-live-events li svg { flex: none; opacity: .8; }
921
+ /* Older lines fade back so the newest reads first, as a log tail does. */
922
+ .ag-live .ag-live-events li:nth-last-child(3) { opacity: .55; }
923
+ .ag-live .ag-live-events li:nth-last-child(2) { opacity: .8; }
924
+ .ag-live .ag-live-events li:last-child { color: var(--ag-fg); animation: ag-live-in 260ms cubic-bezier(.2,.8,.2,1) both, ag-live-flash 1.2s ease-out both; }
925
+ .ag-live .ag-live-event-label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
926
+ .ag-live .ag-live-event-at { flex: none; font-family: inherit; color: var(--ag-muted); font-variant-numeric: tabular-nums; }
927
+ .ag-live .ag-live-slot { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; }
928
+ .ag-live .ag-live-chip { display: inline-flex; align-items: center; gap: 8px; max-width: 100%; height: 32px; padding: 0 12px; border: 1px solid var(--ag-border); border-radius: 16px;
929
+ background: var(--ag-surface); color: var(--ag-muted); font-size: 12px; cursor: pointer; animation: ag-live-settle 320ms cubic-bezier(.2,.8,.2,1) both; }
930
+ .ag-live .ag-live-chip-name { color: var(--ag-fg); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
931
+ .ag-live .ag-live-chip-result { color: var(--ag-fg); font-weight: 500; line-height: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
932
+ @keyframes ag-live-sheen { from { background-position: -40% 0; } to { background-position: 140% 0; } }
933
+ @keyframes ag-live-breathe { 50% { opacity: .35; transform: scale(.8); } }
934
+ @keyframes ag-live-flash { from { background: color-mix(in oklab, var(--ag-status) 16%, transparent); } to { background: transparent; } }
935
+ @keyframes ag-live-grow { from { opacity: 0; transform: scale(.92) translateY(-8px); } }
936
+ @keyframes ag-live-in { from { opacity: 0; transform: translateY(6px); } }
937
+ @keyframes ag-live-settle { from { opacity: 1; transform: scale(1.08); } }
938
+ @media (prefers-reduced-motion: reduce) { .ag-live *, .ag-live *::before { animation: none !important; } .ag-live .ag-live-card:hover { transform: none; } }
939
+
896
940
  /* Published sources: this package's dist and its @tangle-network/ui peer. */
897
941
  @source "./**/*.js";
898
942
  @source "../../ui/dist/**/*.js";
package/dist/workflows.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { i as modelBrandFor, t as ModelBrandStack } from "./model-brand-bTcMjQtB.js";
2
- import { A as buildWorkflowGraph, D as TRIGGER_NODE_ID, I as actionPathLabel, L as humanizeIdentifier, M as triggerNodeId, N as triggerNodeIndex, O as actionNodeId, R as parseActionPath, c as NodeMark, g as STATUS_TONE, h as STATUS_PILL, k as branchNodeId, m as STATUS_LABEL, n as WorkflowGraph, p as STATUS_COLOR, s as KIND_ICON, t as AgentGraph, v as StatusPill, z as shortModel } from "./AgentGraph-CWW3Zx1N.js";
2
+ import { A as buildWorkflowGraph, D as TRIGGER_NODE_ID, I as actionPathLabel, L as humanizeIdentifier, M as triggerNodeId, N as triggerNodeIndex, O as actionNodeId, R as parseActionPath, c as NodeMark, g as STATUS_TONE, h as STATUS_PILL, k as branchNodeId, m as STATUS_LABEL, n as WorkflowGraph, p as STATUS_COLOR, s as KIND_ICON, t as AgentGraph, v as StatusPill, z as shortModel } from "./AgentGraph-DJEQrKTs.js";
3
3
  import { n as classifyOutput, r as condenseText, t as NodeOutputBody } from "./node-output-DlySTwxr.js";
4
4
  export { AgentGraph, KIND_ICON, ModelBrandStack, NodeMark, NodeOutputBody, StatusPill as NodeStatusPill, STATUS_COLOR, STATUS_LABEL, STATUS_PILL, STATUS_TONE, TRIGGER_NODE_ID, WorkflowGraph as WorkflowGraphLazy, actionNodeId, actionPathLabel, branchNodeId, buildWorkflowGraph, classifyOutput, condenseText, humanizeIdentifier, modelBrandFor, parseActionPath, shortModel, triggerNodeId, triggerNodeIndex };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "license": "MIT",
5
5
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
6
6
  "repository": {
@@ -138,7 +138,7 @@
138
138
  "@nanostores/react": ">=0.8.4 <2.0.0",
139
139
  "@tangle-network/agent-interface": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^5.2.0",
140
140
  "@tangle-network/brand": "^1.29.0",
141
- "@tangle-network/charts": "^0.21.4",
141
+ "@tangle-network/charts": "^0.21.20",
142
142
  "@tangle-network/ui": "^11.45.0",
143
143
  "@tanstack/react-query": "^5.0.0",
144
144
  "@tiptap/core": ">=3.20.4 <4.0.0",
@@ -237,7 +237,7 @@
237
237
  "@tailwindcss/postcss": "^4.3.3",
238
238
  "@tangle-network/agent-interface": "5.7.1",
239
239
  "@tangle-network/brand": "1.29.0",
240
- "@tangle-network/charts": "^0.21.4",
240
+ "@tangle-network/charts": "^0.21.20",
241
241
  "@tanstack/react-query": "^5.104.5",
242
242
  "@testing-library/dom": "^10.4.2",
243
243
  "@testing-library/jest-dom": "^7.0.1",