@tangle-network/sandbox-ui 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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-CbIFufIK.js").then((m) => ({ default: m.WorkflowGraph }))));
2621
+ return lazy(() => retryImport(() => import("./WorkflowGraph-DYsP_Kcg.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-BHihTTsl.js").then((m) => ({ default: m.AgentGraphCanvas }))));
2681
+ return lazy(() => retryImport(() => import("./AgentGraphCanvas-D7jjAE6i.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 }) {
@@ -36,7 +36,7 @@ interface AgentGraphNode {
36
36
  turn?: string | null;
37
37
  costUsd?: number | null;
38
38
  tokens?: number | null;
39
- /** Live cards: what it is doing now, from its real state; loops the card's figure. */
39
+ /** Live cards: what it is doing now, from its real state; the card carries it as `data-activity` for hosts to style. */
40
40
  activity?: AgentGraphActivity | null;
41
41
  /** Live cards: its latest tool calls or events, oldest first; the card shows the last three. */
42
42
  events?: readonly AgentGraphEvent[] | null;
@@ -122,8 +122,8 @@ interface AgentGraphProps {
122
122
  /** Hub layout: the header title. Default "Agent graph". */
123
123
  title?: ReactNode;
124
124
  /**
125
- * Tree layout: live cards for a running run. Each card loops a small figure of the agent's `activity`, shows its
126
- * thinking line (`turn`) and last three `events` as they arrive, its model, effort, time alive and commits; a settled
125
+ * Tree layout: live cards for a running run. Each card shows a status pill that breathes while it runs, its thinking
126
+ * line (`turn`) and last three `events` streaming in with how long ago each ran (`at`), its model, effort, time alive and commits; a settled
127
127
  * agent shrinks to a chip with its `result`, and a new spawn grows in. Cards keep a fixed size, so updates never move one.
128
128
  */
129
129
  live?: boolean;
@@ -1,9 +1,9 @@
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-Beld8p6x.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";
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";
6
- import { CircleCheck, CirclePause, CircleQuestionMark, CircleStop, CircleX, Hand, Hourglass, LoaderCircle, Users } from "lucide-react";
6
+ import { CircleCheck, CirclePause, CircleQuestionMark, CircleStop, CircleX, FileText, GitBranch, Globe, Hand, Hourglass, LoaderCircle, Pencil, Search, Sparkles, Terminal, Users } from "lucide-react";
7
7
  import { Background, BaseEdge, Controls, EdgeLabelRenderer, Handle, MarkerType, MiniMap, Position, ReactFlow, useInternalNode } from "@xyflow/react";
8
8
  import "@xyflow/react/dist/style.css";
9
9
  // src/workflows/agent-graph-layout.ts
@@ -12,9 +12,9 @@ const AGENT_CARD = {
12
12
  width: 200,
13
13
  height: 78
14
14
  };
15
- /** A live card: room for the figure, the thinking line and the last three events. Fixed for the same reason. */
15
+ /** A live card: room for the header, a two-line thinking line and the last three events. Fixed for the same reason. */
16
16
  const LIVE_AGENT_CARD = {
17
- width: 272,
17
+ width: 304,
18
18
  height: 152
19
19
  };
20
20
  const GRID_GAP = 10;
@@ -336,7 +336,10 @@ function StatusGlyph({ status, size }) {
336
336
  style: { color: s.color }
337
337
  });
338
338
  }
339
+ /** Only states that ask for a reader colour a card's border; running and done cards stay on the resting hairline and
340
+ * say their state by glyph and word, so a busy run never reads as a wall of glowing outlines. */
339
341
  function cardBorder(status) {
342
+ if (status === "running" || status === "succeeded") return { borderColor: RESTING_BORDER };
340
343
  if (status === "unknown") return {
341
344
  borderColor: "hsl(var(--muted-foreground) / 0.45)",
342
345
  borderStyle: "dashed"
@@ -598,181 +601,23 @@ const SETTLED = /* @__PURE__ */ new Set([
598
601
  "failed",
599
602
  "stopped"
600
603
  ]);
601
- const FIGURES = {
602
- thinking: [
603
- [
604
- " o ",
605
- " /|\\ ",
606
- " / \\ "
607
- ],
608
- [
609
- " o . ",
610
- " /|\\ ",
611
- " / \\ "
612
- ],
613
- [
614
- " o .. ",
615
- " /|\\ ",
616
- " / \\ "
617
- ],
618
- [
619
- " o ...",
620
- " /|\\ ",
621
- " / \\ "
622
- ]
623
- ],
624
- reading: [
625
- [
626
- " o ",
627
- " /|\\[-]",
628
- " / \\ "
629
- ],
630
- [
631
- " o ",
632
- " /|\\[=]",
633
- " / \\ "
634
- ],
635
- [
636
- " o ",
637
- " /|\\[#]",
638
- " / \\ "
639
- ],
640
- [
641
- " o ",
642
- " /|\\[=]",
643
- " / \\ "
644
- ]
645
- ],
646
- building: [
647
- [
648
- " o T ",
649
- " /|\\/ ",
650
- " / \\## "
651
- ],
652
- [
653
- " o ",
654
- " /|\\-T ",
655
- " / \\## "
656
- ],
657
- [
658
- " o T ",
659
- " /|\\/ ",
660
- " / \\###"
661
- ],
662
- [
663
- " o ",
664
- " /|\\-T ",
665
- " / \\###"
666
- ]
667
- ],
668
- proving: [
669
- [
670
- " o |- ",
671
- " /|\\ ",
672
- " / \\ "
673
- ],
674
- [
675
- " o |= ",
676
- " /|\\ ",
677
- " / \\ "
678
- ],
679
- [
680
- " o |=-",
681
- " /|\\ ",
682
- " / \\ "
683
- ],
684
- [
685
- " o QED",
686
- " /|\\ ",
687
- " / \\ "
688
- ]
689
- ],
690
- writing: [
691
- [
692
- " o ",
693
- " /|\\_/ ",
694
- " / \\. "
695
- ],
696
- [
697
- " o ",
698
- " /|\\_/ ",
699
- " / \\.. "
700
- ],
701
- [
702
- " o ",
703
- " /|\\_/ ",
704
- " / \\..."
705
- ],
706
- [
707
- " o ",
708
- " /|\\_/ ",
709
- " / \\ "
710
- ]
711
- ],
712
- waiting: [
713
- [
714
- " o z ",
715
- " /|\\ ",
716
- " / \\ "
717
- ],
718
- [
719
- " o zZ",
720
- " /|\\ ",
721
- " / \\ "
722
- ],
723
- [
724
- " o zZz",
725
- " /|\\ ",
726
- " / \\ "
727
- ],
728
- [
729
- " o ",
730
- " /|\\ ",
731
- " / \\ "
732
- ]
733
- ],
734
- restarting: [
735
- [
736
- " o | ",
737
- " /|\\ ",
738
- " / \\ "
739
- ],
740
- [
741
- " o / ",
742
- " /|\\ ",
743
- " / \\ "
744
- ],
745
- [
746
- " o - ",
747
- " /|\\ ",
748
- " / \\ "
749
- ],
750
- [
751
- " o \\ ",
752
- " /|\\ ",
753
- " / \\ "
754
- ]
755
- ]
756
- };
757
- /** The activity a status implies when the host sends none. */
758
- function activityOf(agent) {
759
- if (agent.activity && FIGURES[agent.activity]) return agent.activity;
760
- if (agent.status === "waiting" || agent.status === "needs-you" || agent.status === "idle") return "waiting";
761
- return "thinking";
762
- }
763
- /** Every frame is stacked in one block and a stepped animation slides it: no timer per card, and reduced motion keeps
764
- * the first frame. */
765
- function Figure({ activity }) {
766
- const frames = FIGURES[activity];
767
- return /* @__PURE__ */ jsx("div", {
768
- className: "ag-live-figure",
769
- "aria-hidden": true,
770
- "data-activity": activity,
771
- children: /* @__PURE__ */ jsx("pre", {
772
- style: { ["--ag-frames"]: frames.length },
773
- children: frames.map((frame) => frame.join("\n")).join("\n")
774
- })
775
- });
604
+ const EVENT_GLYPHS = [
605
+ [/^(bash|sh|run|exec|cargo|npm|pnpm|make)\b/, Terminal],
606
+ [/^(edit|write|patch|apply)\b/, Pencil],
607
+ [/^(read|cat|open|view|ls|glob)\b/, FileText],
608
+ [/^(grep|search|find|rg)\b/, Search],
609
+ [/^(web|fetch|http|browse)\b/, Globe],
610
+ [/^(spawn|steer|release|merge|commit|git)\b/, GitBranch],
611
+ [/^(wait|sleep|queue)\b/, Hourglass]
612
+ ];
613
+ const eventGlyph = (label) => EVENT_GLYPHS.find(([match]) => match.test(label.toLowerCase()))?.[1] ?? Sparkles;
614
+ function ago(at, now) {
615
+ if (at == null || !Number.isFinite(at)) return void 0;
616
+ const s = Math.max(0, Math.round((now - at) / 1e3));
617
+ if (s < 5) return "now";
618
+ if (s < 60) return `${s}s`;
619
+ const m = Math.floor(s / 60);
620
+ return m < 60 ? `${m}m` : `${Math.floor(m / 60)}h`;
776
621
  }
777
622
  function aliveFor(startedAt, now) {
778
623
  if (startedAt == null || !Number.isFinite(startedAt)) return void 0;
@@ -822,17 +667,19 @@ function LiveAgentCard({ data }) {
822
667
  ]
823
668
  })]
824
669
  });
825
- const meta = [agent.model, agent.effort].filter(Boolean).join(" · ");
670
+ const meta = [agent.model?.replace(/^[\w-]+\//, ""), agent.effort].filter(Boolean).join(" · ");
826
671
  const events = (agent.events ?? []).slice(-3);
827
672
  return /* @__PURE__ */ jsxs("div", {
828
673
  className: "ag-live-card",
829
674
  "data-status": agent.status,
675
+ "data-activity": agent.activity ?? void 0,
830
676
  "data-selected": selected || void 0,
831
677
  title: agentSummary(agent),
832
678
  style: {
833
679
  boxShadow: RESTING_SHADOW,
834
680
  ...cardBorder(agent.status),
835
- ...selected ? SELECTION_OUTLINE : {}
681
+ ...selected ? SELECTION_OUTLINE : {},
682
+ ["--ag-status"]: s.color
836
683
  },
837
684
  children: [
838
685
  /* @__PURE__ */ jsx(Handles, { direction }),
@@ -843,7 +690,7 @@ function LiveAgentCard({ data }) {
843
690
  kind: "agent.run",
844
691
  model: agent.model ?? void 0,
845
692
  accent: KIND_ACCENT["agent.run"],
846
- tile: 24
693
+ tile: 28
847
694
  }),
848
695
  /* @__PURE__ */ jsxs("div", {
849
696
  className: "ag-live-names",
@@ -857,36 +704,56 @@ function LiveAgentCard({ data }) {
857
704
  }),
858
705
  /* @__PURE__ */ jsxs("div", {
859
706
  className: "ag-live-stats",
860
- children: [alive && /* @__PURE__ */ jsx("span", {
707
+ children: [/* @__PURE__ */ jsxs("span", {
708
+ className: "ag-live-pill",
709
+ children: [/* @__PURE__ */ jsx("span", {
710
+ className: "ag-live-dot",
711
+ "aria-hidden": true
712
+ }), s.label]
713
+ }), /* @__PURE__ */ jsxs("span", { children: [alive && /* @__PURE__ */ jsx("span", {
861
714
  title: "Time alive",
862
715
  children: alive
863
716
  }), agent.commits != null && /* @__PURE__ */ jsxs("span", {
864
717
  title: "Commits shipped",
865
718
  children: [
719
+ alive ? " · " : "",
866
720
  agent.commits,
867
721
  " ",
868
722
  agent.commits === 1 ? "commit" : "commits"
869
723
  ]
870
- })]
724
+ })] })]
871
725
  })
872
726
  ]
873
727
  }),
874
- /* @__PURE__ */ jsxs("div", {
875
- className: "ag-live-body",
876
- children: [/* @__PURE__ */ jsx(Figure, { activity: activityOf(agent) }), /* @__PURE__ */ jsxs("div", {
877
- className: "ag-live-text",
878
- children: [/* @__PURE__ */ jsx("p", {
879
- className: "ag-live-thinking",
880
- children: agent.turn || /* @__PURE__ */ jsx("span", {
881
- className: "ag-live-quiet",
882
- children: s.label
728
+ /* @__PURE__ */ jsx("p", {
729
+ className: "ag-live-thinking",
730
+ children: agent.turn || /* @__PURE__ */ jsx("span", {
731
+ className: "ag-live-quiet",
732
+ children: s.label
733
+ })
734
+ }, agent.turn ?? ""),
735
+ /* @__PURE__ */ jsx("ol", {
736
+ className: "ag-live-events",
737
+ "aria-label": "Latest events",
738
+ children: events.map((event) => {
739
+ const Glyph = eventGlyph(event.label);
740
+ const when = ago(event.at, now);
741
+ return /* @__PURE__ */ jsxs("li", { children: [
742
+ /* @__PURE__ */ jsx(Glyph, {
743
+ "aria-hidden": true,
744
+ size: 12,
745
+ strokeWidth: 2
746
+ }),
747
+ /* @__PURE__ */ jsx("span", {
748
+ className: "ag-live-event-label",
749
+ children: event.label
750
+ }),
751
+ when && /* @__PURE__ */ jsx("time", {
752
+ className: "ag-live-event-at",
753
+ children: when
883
754
  })
884
- }, agent.turn ?? ""), /* @__PURE__ */ jsx("ol", {
885
- className: "ag-live-events",
886
- "aria-label": "Latest events",
887
- children: events.map((event) => /* @__PURE__ */ jsx("li", { children: event.label }, event.id))
888
- })]
889
- })]
755
+ ] }, event.id);
756
+ })
890
757
  })
891
758
  ]
892
759
  });
@@ -1092,6 +959,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1092
959
  const readerMoved = useRef(false);
1093
960
  const framed = useRef(null);
1094
961
  const layoutIdentity = layout ? `${layoutKey}:${layout.columns}` : null;
962
+ const minZoom = layout && canvas ? Math.max(.02, Math.min(.2, (canvas.width - 32) / layout.width, (canvas.height - 32) / layout.height)) : .2;
1095
963
  useEffect(() => {
1096
964
  const inst = rfRef.current;
1097
965
  if (!ready || !inst || !layoutIdentity || !canvas) return;
@@ -1104,7 +972,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1104
972
  inst.fitView({
1105
973
  padding: `${FIT_PADDING}px`,
1106
974
  maxZoom: 1,
1107
- minZoom: .2,
975
+ minZoom,
1108
976
  duration: animate ? 220 : 0
1109
977
  });
1110
978
  setShown(true);
@@ -1113,7 +981,8 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1113
981
  }, [
1114
982
  ready,
1115
983
  layoutIdentity,
1116
- canvas
984
+ canvas,
985
+ minZoom
1117
986
  ]);
1118
987
  const select = useCallback((id) => {
1119
988
  if (byId.has(id)) onSelect?.(id);
@@ -1141,7 +1010,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1141
1010
  className: `agent-graph${live ? " ag-live" : ""} relative transition-opacity duration-150 ease-out motion-reduce:transition-none ${layout && shown ? "opacity-100" : "opacity-0"} ${className ?? ""}`,
1142
1011
  "data-layout": layout && shown ? "ready" : "pending",
1143
1012
  "data-columns": layout?.columns,
1144
- 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: 12px; background: var(--ag-surface); color: var(--ag-fg); cursor: pointer; overflow: hidden; animation: ag-live-grow 360ms cubic-bezier(.2,.8,.2,1) both; transform-origin: 50% 0; }\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: 13px; line-height: 16px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.ag-live .ag-live-meta, .ag-live .ag-live-stats { font-size: 11px; line-height: 16px; 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; font-variant-numeric: tabular-nums; flex: none; }\n.ag-live .ag-live-body { display: flex; gap: 8px; min-height: 0; flex: 1; }\n.ag-live .ag-live-figure { flex: none; width: 60px; height: 48px; overflow: hidden; border-radius: 8px; background: color-mix(in oklab, var(--ag-fg) 5%, transparent); }\n.ag-live .ag-live-figure pre { margin: 0; padding: 0 4px; font: 11px/16px var(--font-mono, ui-monospace, monospace); color: var(--ag-fg); white-space: pre;\n animation: ag-live-frames calc(var(--ag-frames) * 280ms) steps(var(--ag-frames)) infinite; }\n.ag-live .ag-live-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; flex: 1; }\n.ag-live .ag-live-thinking { margin: 0; font-size: 12px; line-height: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; animation: ag-live-in 220ms ease-out both; }\n.ag-live .ag-live-quiet { color: var(--ag-muted); }\n.ag-live .ag-live-events { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 0; }\n.ag-live .ag-live-events li { font: 11px/16px var(--font-mono, ui-monospace, monospace); color: var(--ag-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; animation: ag-live-in 220ms ease-out both; }\n.ag-live .ag-live-events li:last-child { color: var(--ag-fg); }\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-frames { to { transform: translateY(calc(var(--ag-frames) * -48px)); } }\n@keyframes ag-live-grow { from { opacity: 0; transform: scale(.7) translateY(-12px); } }\n@keyframes ag-live-in { from { opacity: 0; transform: translateY(4px); } }\n@keyframes ag-live-settle { from { opacity: 1; transform: scale(1.12); } }\n@media (prefers-reduced-motion: reduce) { .ag-live * { animation: none !important; } }\n" }), /* @__PURE__ */ jsxs(ReactFlow, {
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, {
1145
1014
  nodes: flowNodes,
1146
1015
  edges: flowEdges,
1147
1016
  nodeTypes: NODE_TYPES,
@@ -1168,7 +1037,7 @@ function AgentGraphCanvas({ nodes, edges, selectedId, onSelect, direction = "TB"
1168
1037
  zoomOnPinch: true,
1169
1038
  zoomOnDoubleClick: false,
1170
1039
  panOnDrag: true,
1171
- minZoom: .2,
1040
+ minZoom,
1172
1041
  maxZoom: 1.75,
1173
1042
  "aria-label": "Agent topology",
1174
1043
  children: [
@@ -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-Beld8p6x.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-CWW3Zx1N.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,6 +78,7 @@
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);
81
82
  --animate-spin: spin 1s linear infinite;
82
83
  --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
83
84
  --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
@@ -4489,6 +4490,10 @@
4489
4490
  --tw-duration: var(--transition-fast);
4490
4491
  transition-duration: var(--transition-fast);
4491
4492
  }
4493
+ .ease-in-out {
4494
+ --tw-ease: var(--ease-in-out);
4495
+ transition-timing-function: var(--ease-in-out);
4496
+ }
4492
4497
  .ease-out {
4493
4498
  --tw-ease: var(--ease-out);
4494
4499
  transition-timing-function: var(--ease-out);
@@ -1,4 +1,4 @@
1
- import { d as AgentGraphNode } from "./AgentGraph-DL-QLjkw.js";
1
+ import { d as AgentGraphNode } from "./AgentGraph-DxAeQQch.js";
2
2
  import { ReactNode } from "react";
3
3
  import { ApprovalCard, ApprovalCardProps, ApprovalDiffFile, ApprovalDiffSummary, ApprovalPlanStep, ExpandedToolDetail, ExpandedToolDetailProps, FeedSegment, InlineThinkingItem as InlineThinkingItem$1, InlineThinkingItemProps, InlineToolItem, InlineToolItemProps, LiveDuration, RunGroup, RunGroupProps, RunPhase, RunPhaseList, RunRowShell, RunRowShellProps, RunRowStatus, RunRowStatusDot, TaskList, TaskListItem, TaskListProps, TaskStatus, ToolCallData, ToolCallData as ToolCallData$1, ToolCallFeed, ToolCallFeedProps, ToolCallStatus, ToolCallType, parseToolEvent, showsTaskPriority, taskProgress, taskStatus } from "@tangle-network/ui/run";
4
4
  import { FlowWaterfallProps } from "@tangle-network/charts/react";
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@ import { C as ChangedFile, D as SandboxArtifactTerminal, E as SandboxArtifactPan
16
16
  import { n as DiffViewProps, t as DiffView } from "./diff-view-DDHWtR6X.js";
17
17
  import { a as PreviewReadiness, i as PreviewAccess, n as EmbeddedAppView, r as EmbeddedAppViewProps, t as EmbeddedApp } from "./embedded-app-view-Ta5GI4hx.js";
18
18
  import { OPENUI_NODE_JSON_SCHEMA, OPENUI_NODE_TYPES, OpenUIAction, OpenUIActionsNode, OpenUIArtifactRenderer, OpenUIArtifactRendererProps, OpenUIBadgeNode, OpenUICardNode, OpenUICodeNode, OpenUIComponentNode, OpenUIGridNode, OpenUIHeadingNode, OpenUIKeyValueNode, OpenUIMarkdownNode, OpenUIPrimitive, OpenUISchemaIssue, OpenUISchemaValidation, OpenUISeparatorNode, OpenUIStackNode, OpenUIStatNode, OpenUITableNode, OpenUITextNode, findUnsupportedOpenUINode, validateOpenUIJsonArtifact, validateOpenUIJsonNode } from "./openui.js";
19
- import { A as ToolCallType, B as TraceEvent, C as TaskListItem, D as ToolCallFeed, E as ToolCallData, F as AgentStreamRow, G as traceSpanMark, H as TraceWorkspaceProps, I as AgentStreamState, L as AgentTranscriptEntry, M as showsTaskPriority, N as taskProgress, O as ToolCallFeedProps, P as taskStatus, R as foldAgentRows, S as TaskList, T as TaskStatus, U as TraceWaterfall, V as TraceWorkspace, W as TraceWaterfallProps, _ as RunPhaseList, a as ApprovalPlanStep, b as RunRowStatus, c as FeedSegment, d as InlineToolItem, f as InlineToolItemProps, g as RunPhase, h as RunGroupProps, i as ApprovalDiffSummary, j as parseToolEvent, k as ToolCallStatus, l as InlineThinkingItem, m as RunGroup, n as ApprovalCardProps, o as ExpandedToolDetail, p as LiveDuration, r as ApprovalDiffFile, s as ExpandedToolDetailProps, t as ApprovalCard, u as InlineThinkingItemProps, v as RunRowShell, w as TaskListProps, x as RunRowStatusDot, y as RunRowShellProps, z as useAgentStream } from "./index-D6gtWRHq.js";
19
+ import { A as ToolCallType, B as TraceEvent, C as TaskListItem, D as ToolCallFeed, E as ToolCallData, F as AgentStreamRow, G as traceSpanMark, H as TraceWorkspaceProps, I as AgentStreamState, L as AgentTranscriptEntry, M as showsTaskPriority, N as taskProgress, O as ToolCallFeedProps, P as taskStatus, R as foldAgentRows, S as TaskList, T as TaskStatus, U as TraceWaterfall, V as TraceWorkspace, W as TraceWaterfallProps, _ as RunPhaseList, a as ApprovalPlanStep, b as RunRowStatus, c as FeedSegment, d as InlineToolItem, f as InlineToolItemProps, g as RunPhase, h as RunGroupProps, i as ApprovalDiffSummary, j as parseToolEvent, k as ToolCallStatus, l as InlineThinkingItem, m as RunGroup, n as ApprovalCardProps, o as ExpandedToolDetail, p as LiveDuration, r as ApprovalDiffFile, s as ExpandedToolDetailProps, t as ApprovalCard, u as InlineThinkingItemProps, v as RunRowShell, w as TaskListProps, x as RunRowStatusDot, y as RunRowShellProps, z as useAgentStream } from "./index-UCV03IrH.js";
20
20
  import { n as filterFileNodes, t as fileTreeFromPaths } from "./index-CrN4d8gd.js";
21
21
  import { ActiveProjectActivity, ActiveSessionActivityOptions, ActiveSessionConnectionOptions, ActiveSessionConnectionState, ActiveSessionReconnectState, ActiveSessionRecord, ActiveSessionStatus, ActiveSessionTransportMode, ActiveSessionsState, ChatSession, RegisterActiveSessionOptions, SessionProjectKey, activeSessionsAtom, addMessage, addParts, bumpActiveSessionActivity, clearChat, connectSession, disconnectSession, getActiveSession, getAllActiveSessions, getAllProjectActivity, getSessionsByActivity, getSessionsForNavbar, getSessionsForProject, getTotalRunningSessionCount, hasBackgroundRunningSessions, isStreamingAtom, messagesAtom, partMapAtom, registerActiveSession, resetActiveSessions, sessionAtom, setActiveSessionAttention, setActiveSessionConnection, setActiveSessionError, setActiveSessionRunning, setForegroundActiveSession, unregisterActiveSession, updateActiveSessionMeta, updatePart, useActiveSession, useActiveSessions, useActiveSessionsState, useHasBackgroundRunningSessions, useNavbarSessions, useProjectActivity, useProjectSessions, useSessionsByActivity, useTotalRunningSessions } from "./stores.js";
22
22
  import { AgentBranding, CustomToolRenderer, DisplayVariant, FinalTextPart, GroupedMessage, MessageRun, MessageUser, ReasoningPart, Run, RunStats, SessionMessage, SessionPart, TextPart, ToolCategory, ToolDisplayMetadata, ToolPart, ToolState, ToolStatus, ToolTime } from "./types.js";
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-CC-DESx8.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";
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-Beld8p6x.js";
4
+ import { t as AgentGraph } from "./AgentGraph-CWW3Zx1N.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";
@@ -225,8 +225,11 @@ function agentOf(span, byId) {
225
225
  function agentGraphAt(spans, byId, at, epoch, cards) {
226
226
  const nodes = [];
227
227
  const edges = [];
228
+ const seen = /* @__PURE__ */ new Set();
228
229
  for (const span of spans) {
229
230
  if (span.kind !== "pipeline" || !span.id || at !== null && span.startMs > at) continue;
231
+ if (seen.has(span.id)) continue;
232
+ seen.add(span.id);
230
233
  const running = at === null ? span.status === "running" : span.endMs > at || span.status === "running";
231
234
  nodes.push({
232
235
  id: span.id,
@@ -379,10 +382,10 @@ function TraceWorkspace({ trace, streamUrl, events, onTimeChange, files, scorebo
379
382
  }
380
383
  })
381
384
  }),
382
- /* @__PURE__ */ jsx("section", {
385
+ files && /* @__PURE__ */ jsx("section", {
383
386
  "aria-label": "Code at the cursor",
384
387
  className: "flex min-h-[70vh] flex-col overflow-hidden rounded-xl border border-border bg-card",
385
- children: files ?? /* @__PURE__ */ jsx(NotTimeIndexed, { label: "Files" })
388
+ children: files
386
389
  }),
387
390
  scoreboard && /* @__PURE__ */ jsx("section", {
388
391
  "aria-label": "Scoreboard at the cursor",
package/dist/run.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as ToolCallType, B as TraceEvent, C as TaskListItem, D as ToolCallFeed, E as ToolCallData, F as AgentStreamRow, G as traceSpanMark, H as TraceWorkspaceProps, I as AgentStreamState, L as AgentTranscriptEntry, M as showsTaskPriority, N as taskProgress, O as ToolCallFeedProps, P as taskStatus, R as foldAgentRows, S as TaskList, T as TaskStatus, U as TraceWaterfall, V as TraceWorkspace, W as TraceWaterfallProps, _ as RunPhaseList, a as ApprovalPlanStep, b as RunRowStatus, c as FeedSegment, d as InlineToolItem, f as InlineToolItemProps, g as RunPhase, h as RunGroupProps, i as ApprovalDiffSummary, j as parseToolEvent, k as ToolCallStatus, l as InlineThinkingItem, m as RunGroup, n as ApprovalCardProps, o as ExpandedToolDetail, p as LiveDuration, r as ApprovalDiffFile, s as ExpandedToolDetailProps, t as ApprovalCard, u as InlineThinkingItemProps, v as RunRowShell, w as TaskListProps, x as RunRowStatusDot, y as RunRowShellProps, z as useAgentStream } from "./index-D6gtWRHq.js";
1
+ import { A as ToolCallType, B as TraceEvent, C as TaskListItem, D as ToolCallFeed, E as ToolCallData, F as AgentStreamRow, G as traceSpanMark, H as TraceWorkspaceProps, I as AgentStreamState, L as AgentTranscriptEntry, M as showsTaskPriority, N as taskProgress, O as ToolCallFeedProps, P as taskStatus, R as foldAgentRows, S as TaskList, T as TaskStatus, U as TraceWaterfall, V as TraceWorkspace, W as TraceWaterfallProps, _ as RunPhaseList, a as ApprovalPlanStep, b as RunRowStatus, c as FeedSegment, d as InlineToolItem, f as InlineToolItemProps, g as RunPhase, h as RunGroupProps, i as ApprovalDiffSummary, j as parseToolEvent, k as ToolCallStatus, l as InlineThinkingItem, m as RunGroup, n as ApprovalCardProps, o as ExpandedToolDetail, p as LiveDuration, r as ApprovalDiffFile, s as ExpandedToolDetailProps, t as ApprovalCard, u as InlineThinkingItemProps, v as RunRowShell, w as TaskListProps, x as RunRowStatusDot, y as RunRowShellProps, z as useAgentStream } from "./index-UCV03IrH.js";
2
2
  export { type AgentStreamRow, type AgentStreamState, type AgentTranscriptEntry, ApprovalCard, type ApprovalCardProps, type ApprovalDiffFile, ApprovalDiffSummary, type ApprovalPlanStep, ExpandedToolDetail, type ExpandedToolDetailProps, type FeedSegment, InlineThinkingItem, type InlineThinkingItemProps, InlineToolItem, type InlineToolItemProps, LiveDuration, RunGroup, type RunGroupProps, type RunPhase, RunPhaseList, RunRowShell, type RunRowShellProps, type RunRowStatus, RunRowStatusDot, TaskList, type TaskListItem, type TaskListProps, type TaskStatus, type ToolCallData, ToolCallFeed, type ToolCallFeedProps, type ToolCallStatus, type ToolCallType, type TraceEvent, TraceWaterfall, type TraceWaterfallProps, TraceWorkspace, type TraceWorkspaceProps, foldAgentRows, parseToolEvent, showsTaskPriority, taskProgress, taskStatus, traceSpanMark, useAgentStream };
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-CC-DESx8.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-C91XKDrv.js";
package/dist/styles.css CHANGED
@@ -78,6 +78,7 @@
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);
81
82
  --animate-spin: spin 1s linear infinite;
82
83
  --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
83
84
  --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
@@ -4489,6 +4490,10 @@
4489
4490
  --tw-duration: var(--transition-fast);
4490
4491
  transition-duration: var(--transition-fast);
4491
4492
  }
4493
+ .ease-in-out {
4494
+ --tw-ease: var(--ease-in-out);
4495
+ transition-timing-function: var(--ease-in-out);
4496
+ }
4492
4497
  .ease-out {
4493
4498
  --tw-ease: var(--ease-out);
4494
4499
  transition-timing-function: var(--ease-out);
@@ -1,5 +1,5 @@
1
1
  import { n as ModelBrandStack, o as modelBrandFor, t as ModelBrandIdentity } from "./model-brand-ZwVS49Fq.js";
2
- import { a as AgentGraphTool, c as AgentGraphEdge, d as AgentGraphNode, f as AgentGraphStatus, i as AgentGraphCallKind, l as AgentGraphEdgeKind, n as AgentGraphProps, o as AgentGraphActivity, r as AgentGraphCall, s as AgentGraphDirection, t as AgentGraph, u as AgentGraphEvent } from "./AgentGraph-DL-QLjkw.js";
2
+ import { a as AgentGraphTool, c as AgentGraphEdge, d as AgentGraphNode, f as AgentGraphStatus, i as AgentGraphCallKind, l as AgentGraphEdgeKind, n as AgentGraphProps, o as AgentGraphActivity, r as AgentGraphCall, s as AgentGraphDirection, t as AgentGraph, u as AgentGraphEvent } from "./AgentGraph-DxAeQQch.js";
3
3
  import { StatusTone } from "@tangle-network/ui/primitives";
4
4
  import { Component, ReactElement, ReactNode } from "react";
5
5
  import { LucideIcon } from "lucide-react";
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-Beld8p6x.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";
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.0",
3
+ "version": "1.1.2",
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": {