@tangle-network/sandbox-ui 0.134.12 → 0.136.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/globals.css CHANGED
@@ -283,6 +283,9 @@
283
283
  white-space: nowrap;
284
284
  border-width: 0;
285
285
  }
286
+ .\!fixed {
287
+ position: fixed !important;
288
+ }
286
289
  .absolute {
287
290
  position: absolute;
288
291
  }
@@ -298,6 +301,9 @@
298
301
  .sticky {
299
302
  position: sticky;
300
303
  }
304
+ .\!inset-3 {
305
+ inset: calc(var(--spacing) * 3) !important;
306
+ }
301
307
  .inset-0 {
302
308
  inset: 0px;
303
309
  }
@@ -433,6 +439,9 @@
433
439
  .\!z-10 {
434
440
  z-index: 10 !important;
435
441
  }
442
+ .\!z-40 {
443
+ z-index: 40 !important;
444
+ }
436
445
  .z-0 {
437
446
  z-index: 0;
438
447
  }
@@ -712,6 +721,9 @@
712
721
  -webkit-box-orient: vertical;
713
722
  -webkit-line-clamp: 6;
714
723
  }
724
+ .\!hidden {
725
+ display: none !important;
726
+ }
715
727
  .block {
716
728
  display: block;
717
729
  }
@@ -826,6 +838,9 @@
826
838
  .\!h-2\.5 {
827
839
  height: calc(var(--spacing) * 2.5) !important;
828
840
  }
841
+ .\!h-auto {
842
+ height: auto !important;
843
+ }
829
844
  .h-0\.5 {
830
845
  height: calc(var(--spacing) * 0.5);
831
846
  }
@@ -940,6 +955,9 @@
940
955
  .h-\[34rem\] {
941
956
  height: 34rem;
942
957
  }
958
+ .h-\[36rem\] {
959
+ height: 36rem;
960
+ }
943
961
  .h-\[72\%\] {
944
962
  height: 72%;
945
963
  }
@@ -1186,6 +1204,9 @@
1186
1204
  .\!w-2\.5 {
1187
1205
  width: calc(var(--spacing) * 2.5) !important;
1188
1206
  }
1207
+ .\!w-auto {
1208
+ width: auto !important;
1209
+ }
1189
1210
  .w-0 {
1190
1211
  width: 0px;
1191
1212
  }
@@ -1348,6 +1369,9 @@
1348
1369
  .w-\[268px\] {
1349
1370
  width: 268px;
1350
1371
  }
1372
+ .w-\[358px\] {
1373
+ width: 358px;
1374
+ }
1351
1375
  .w-\[360px\] {
1352
1376
  width: 360px;
1353
1377
  }
@@ -1381,6 +1405,9 @@
1381
1405
  .w-\[1000px\] {
1382
1406
  width: 1000px;
1383
1407
  }
1408
+ .w-\[1100px\] {
1409
+ width: 1100px;
1410
+ }
1384
1411
  .w-\[calc\(100vw-32px\)\] {
1385
1412
  width: calc(100vw - 32px);
1386
1413
  }
@@ -2976,6 +3003,12 @@
2976
3003
  background-color: color-mix(in oklab, hsl(var(--primary)) 20%, transparent);
2977
3004
  }
2978
3005
  }
3006
+ .bg-primary\/\[0\.04\] {
3007
+ background-color: hsl(var(--primary));
3008
+ @supports (color: color-mix(in lab, red, red)) {
3009
+ background-color: color-mix(in oklab, hsl(var(--primary)) 4%, transparent);
3010
+ }
3011
+ }
2979
3012
  .bg-red-500 {
2980
3013
  background-color: var(--color-red-500);
2981
3014
  }
@@ -3963,6 +3996,12 @@
3963
3996
  color: color-mix(in oklab, hsl(var(--primary)) 70%, transparent);
3964
3997
  }
3965
3998
  }
3999
+ .text-primary\/80 {
4000
+ color: hsl(var(--primary));
4001
+ @supports (color: color-mix(in lab, red, red)) {
4002
+ color: color-mix(in oklab, hsl(var(--primary)) 80%, transparent);
4003
+ }
4004
+ }
3966
4005
  .text-red-400 {
3967
4006
  color: var(--color-red-400);
3968
4007
  }
@@ -4065,6 +4104,10 @@
4065
4104
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
4066
4105
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4067
4106
  }
4107
+ .shadow-2xl {
4108
+ --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
4109
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4110
+ }
4068
4111
  .shadow-\[0_1px_2px_rgba\(0\,0\,0\,0\.2\)\] {
4069
4112
  --tw-shadow: 0 1px 2px var(--tw-shadow-color, rgba(0,0,0,0.2));
4070
4113
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -5572,6 +5615,9 @@
5572
5615
  -webkit-box-orient: vertical;
5573
5616
  -webkit-line-clamp: 3;
5574
5617
  }
5618
+ .sm\:\!block {
5619
+ display: block !important;
5620
+ }
5575
5621
  .sm\:flex {
5576
5622
  display: flex;
5577
5623
  }
@@ -767,10 +767,56 @@ function withConfig(base, cfg) {
767
767
  * neither — dropping the envelope would leave the two indistinguishable in the
768
768
  * detail view, which is the one place that promises every field.
769
769
  */
770
+ /**
771
+ * Title a step by the id its author gave it, when that names it better than
772
+ * its kind does. A graph of a real workflow is mostly the same few kinds — a
773
+ * factory is nine "GitHub" steps and a handful of decisions whose own titles
774
+ * are run-time templates — so titling by kind makes every node look like its
775
+ * neighbour. The author's id ("open-pr", "ship-gate", "monitor-note") is the
776
+ * one name that says what each is FOR.
777
+ *
778
+ * An agent keeps its profile's role ("Factory reviewer"), which already says
779
+ * that; it takes the id only when it has no readable role. A decision keeps a
780
+ * title its author wrote as plain text, and takes the id when that title is a
781
+ * template the graph would show with its `${...}` unresolved. Every other
782
+ * kind takes the id, and what the kind does moves to the subtitle, where the
783
+ * provider's logo still marks it.
784
+ */
785
+ /** An id the editor minted rather than an author chose: the kind's own slug
786
+ * (`agent-run`, `integration-invoke-2`) or a positional `step-N`. Titling by
787
+ * one would only restate the kind, worse. */
788
+ function isMachineStepId(id, kind) {
789
+ if (/^step-\d+$/.test(id)) return true;
790
+ if (!kind) return false;
791
+ const slug = kind.toLowerCase().replace(/[^a-z0-9]+/g, "-");
792
+ return id === slug || new RegExp(`^${slug}-\\d+$`).test(id);
793
+ }
794
+ function titledByStep(base, rec) {
795
+ const id = str(rec.id);
796
+ if (!id || isMachineStepId(id, base.kind)) return base;
797
+ const role = humanizeIdentifier(id);
798
+ if (base.kind === "agent.run") return base.title === "AI Agent" ? {
799
+ ...base,
800
+ title: role
801
+ } : base;
802
+ if (base.kind === "decision") {
803
+ const authored = str(asRecord(rec.decision).title);
804
+ return authored && !authored.includes("${") ? base : {
805
+ ...base,
806
+ title: role
807
+ };
808
+ }
809
+ const what = [base.title, base.subtitle].filter(Boolean).join(" · ");
810
+ return {
811
+ ...base,
812
+ title: role,
813
+ ...what ? { subtitle: what } : {}
814
+ };
815
+ }
770
816
  function describeAction(action) {
771
817
  const rec = asRecord(action);
772
818
  const kind = actionKind(rec);
773
- const base = describeActionBase(action);
819
+ const base = titledByStep(describeActionBase(action), rec);
774
820
  const config = toJsonSafe(asRecord(kind ? rec[kind] : {}));
775
821
  for (const key of CONTROL_FLOW_KEYS) if (rec[key] !== void 0) config[key] = toJsonSafe(rec[key]);
776
822
  return Object.keys(config).length > 0 ? {
@@ -1199,13 +1245,18 @@ function buildWorkflowGraph(yaml, options) {
1199
1245
  addNode(id, data, rank, reserveRunState);
1200
1246
  if (!declared) for (const from of prevExits) addEdge(from, id, branchLeafIds.has(from) ? "join" : "spine");
1201
1247
  const rec = asRecord(action);
1202
- const children = "parallel" in rec ? Array.isArray(asRecord(rec.parallel).branches) ? asRecord(rec.parallel).branches : [] : "foreach" in rec ? [asRecord(rec.foreach).do].filter(Boolean) : [];
1248
+ const children = "parallel" in rec ? Array.isArray(asRecord(rec.parallel).branches) ? asRecord(rec.parallel).branches : [] : "foreach" in rec ? Array.from({ length: asRecord(rec.foreach).do ? Math.max(1, options?.itemCounts?.[i] ?? 1) : 0 }, () => asRecord(rec.foreach).do) : [];
1203
1249
  if (children.length > 0) {
1204
1250
  const branchRank = rank + 1;
1205
1251
  const branchIds = [];
1252
+ const items = "foreach" in rec && children.length > 1;
1206
1253
  children.forEach((child, j) => {
1207
1254
  const cid = branchNodeId(i, j);
1208
- addNode(cid, describeAction(child), branchRank, reserveRunState);
1255
+ const data = describeAction(child);
1256
+ addNode(cid, items ? {
1257
+ ...data,
1258
+ subtitle: `Item ${j + 1} of ${children.length}`
1259
+ } : data, branchRank, reserveRunState);
1209
1260
  addEdge(id, cid, "fork");
1210
1261
  branchIds.push(cid);
1211
1262
  branchLeafIds.add(cid);
@@ -1228,7 +1279,8 @@ function buildWorkflowGraph(yaml, options) {
1228
1279
  };
1229
1280
  addEdge(spec.from, spec.to, "spine", spec.whenLabel);
1230
1281
  }
1231
- const rootward = new Set(edges.map((e) => e.target));
1282
+ const loopBack = classifyBackEdges(logical.map((n) => n.id), edges);
1283
+ const rootward = new Set(edges.filter((e) => !loopBack.has(e.id)).map((e) => e.target));
1232
1284
  for (const n of logical) {
1233
1285
  if (triggerNodeIndex(n.id) !== null) continue;
1234
1286
  if (rootward.has(n.id)) continue;
@@ -1252,7 +1304,11 @@ function buildWorkflowGraph(yaml, options) {
1252
1304
  return {
1253
1305
  nodes: (options?.wrap && direction === "LR" && !labelled ? layoutSerpentine(logical, edges, rankSep, geo.crossSep) : null) ?? layoutLayers(logical, direction, rankSep, geo.crossSep),
1254
1306
  edges,
1255
- error: null
1307
+ error: null,
1308
+ spacing: {
1309
+ rank: rankSep,
1310
+ cross: geo.crossSep
1311
+ }
1256
1312
  };
1257
1313
  }
1258
1314
  //#endregion
@@ -1328,7 +1384,8 @@ const STATUS_COLOR = {
1328
1384
  running: STATUS_RUNNING,
1329
1385
  waiting: STATUS_WAITING,
1330
1386
  succeeded: STATUS_DONE,
1331
- failed: STATUS_FAILED
1387
+ failed: STATUS_FAILED,
1388
+ skipped: STATUS_QUEUED
1332
1389
  };
1333
1390
  /** An edge reads by the status of the node it points AT — with the 2026-10-09
1334
1391
  * fix: SETTLED edges go quiet. A succeeded run used to paint every edge green
@@ -1346,7 +1403,8 @@ const STATUS_LABEL = {
1346
1403
  running: "Running",
1347
1404
  waiting: "Waiting on you",
1348
1405
  succeeded: "Done",
1349
- failed: "Failed"
1406
+ failed: "Failed",
1407
+ skipped: "Not taken"
1350
1408
  };
1351
1409
  /** @deprecated `StatusPill` now renders ui's StatusPill from `STATUS_TONE`;
1352
1410
  * kept for consumers that styled their own pill from it.
@@ -1378,6 +1436,11 @@ const STATUS_PILL = {
1378
1436
  background: "var(--surface-danger-bg)",
1379
1437
  color: "var(--surface-danger-text)",
1380
1438
  borderColor: "var(--surface-danger-border)"
1439
+ },
1440
+ skipped: {
1441
+ background: "transparent",
1442
+ color: "hsl(var(--muted-foreground))",
1443
+ borderColor: "color-mix(in srgb, hsl(var(--muted-foreground)) 28%, transparent)"
1381
1444
  }
1382
1445
  };
1383
1446
  /** The card's border + ring once a node has live run state. The emphasis
@@ -1403,6 +1466,11 @@ function statusBorder(status) {
1403
1466
  };
1404
1467
  }
1405
1468
  case "queued": return { borderColor: "hsl(var(--border))" };
1469
+ case "skipped": return {
1470
+ borderColor: "hsl(var(--muted-foreground) / 0.45)",
1471
+ borderStyle: "dashed",
1472
+ opacity: .5
1473
+ };
1406
1474
  case "succeeded": return {
1407
1475
  borderColor: RESTING_BORDER,
1408
1476
  boxShadow: RESTING_SHADOW
@@ -1560,7 +1628,8 @@ const STATUS_TONE = {
1560
1628
  running: "running",
1561
1629
  waiting: "warning",
1562
1630
  succeeded: "neutral",
1563
- failed: "danger"
1631
+ failed: "danger",
1632
+ skipped: "neutral"
1564
1633
  };
1565
1634
  /** The status pill in a card's header — the one place the run state is spelled
1566
1635
  * out in words. ui's `StatusPill`, so a node's state carries the same glyph,
@@ -1642,6 +1711,7 @@ function emptySlotLabel(status) {
1642
1711
  case "queued": return "Not run yet";
1643
1712
  case "succeeded": return "No output";
1644
1713
  case "failed": return "No error reported";
1714
+ case "skipped": return "Not taken this run";
1645
1715
  default: return;
1646
1716
  }
1647
1717
  }
package/dist/styles.css CHANGED
@@ -283,6 +283,9 @@
283
283
  white-space: nowrap;
284
284
  border-width: 0;
285
285
  }
286
+ .\!fixed {
287
+ position: fixed !important;
288
+ }
286
289
  .absolute {
287
290
  position: absolute;
288
291
  }
@@ -298,6 +301,9 @@
298
301
  .sticky {
299
302
  position: sticky;
300
303
  }
304
+ .\!inset-3 {
305
+ inset: calc(var(--spacing) * 3) !important;
306
+ }
301
307
  .inset-0 {
302
308
  inset: 0px;
303
309
  }
@@ -433,6 +439,9 @@
433
439
  .\!z-10 {
434
440
  z-index: 10 !important;
435
441
  }
442
+ .\!z-40 {
443
+ z-index: 40 !important;
444
+ }
436
445
  .z-0 {
437
446
  z-index: 0;
438
447
  }
@@ -712,6 +721,9 @@
712
721
  -webkit-box-orient: vertical;
713
722
  -webkit-line-clamp: 6;
714
723
  }
724
+ .\!hidden {
725
+ display: none !important;
726
+ }
715
727
  .block {
716
728
  display: block;
717
729
  }
@@ -826,6 +838,9 @@
826
838
  .\!h-2\.5 {
827
839
  height: calc(var(--spacing) * 2.5) !important;
828
840
  }
841
+ .\!h-auto {
842
+ height: auto !important;
843
+ }
829
844
  .h-0\.5 {
830
845
  height: calc(var(--spacing) * 0.5);
831
846
  }
@@ -940,6 +955,9 @@
940
955
  .h-\[34rem\] {
941
956
  height: 34rem;
942
957
  }
958
+ .h-\[36rem\] {
959
+ height: 36rem;
960
+ }
943
961
  .h-\[72\%\] {
944
962
  height: 72%;
945
963
  }
@@ -1186,6 +1204,9 @@
1186
1204
  .\!w-2\.5 {
1187
1205
  width: calc(var(--spacing) * 2.5) !important;
1188
1206
  }
1207
+ .\!w-auto {
1208
+ width: auto !important;
1209
+ }
1189
1210
  .w-0 {
1190
1211
  width: 0px;
1191
1212
  }
@@ -1348,6 +1369,9 @@
1348
1369
  .w-\[268px\] {
1349
1370
  width: 268px;
1350
1371
  }
1372
+ .w-\[358px\] {
1373
+ width: 358px;
1374
+ }
1351
1375
  .w-\[360px\] {
1352
1376
  width: 360px;
1353
1377
  }
@@ -1381,6 +1405,9 @@
1381
1405
  .w-\[1000px\] {
1382
1406
  width: 1000px;
1383
1407
  }
1408
+ .w-\[1100px\] {
1409
+ width: 1100px;
1410
+ }
1384
1411
  .w-\[calc\(100vw-32px\)\] {
1385
1412
  width: calc(100vw - 32px);
1386
1413
  }
@@ -2976,6 +3003,12 @@
2976
3003
  background-color: color-mix(in oklab, hsl(var(--primary)) 20%, transparent);
2977
3004
  }
2978
3005
  }
3006
+ .bg-primary\/\[0\.04\] {
3007
+ background-color: hsl(var(--primary));
3008
+ @supports (color: color-mix(in lab, red, red)) {
3009
+ background-color: color-mix(in oklab, hsl(var(--primary)) 4%, transparent);
3010
+ }
3011
+ }
2979
3012
  .bg-red-500 {
2980
3013
  background-color: var(--color-red-500);
2981
3014
  }
@@ -3963,6 +3996,12 @@
3963
3996
  color: color-mix(in oklab, hsl(var(--primary)) 70%, transparent);
3964
3997
  }
3965
3998
  }
3999
+ .text-primary\/80 {
4000
+ color: hsl(var(--primary));
4001
+ @supports (color: color-mix(in lab, red, red)) {
4002
+ color: color-mix(in oklab, hsl(var(--primary)) 80%, transparent);
4003
+ }
4004
+ }
3966
4005
  .text-red-400 {
3967
4006
  color: var(--color-red-400);
3968
4007
  }
@@ -4065,6 +4104,10 @@
4065
4104
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
4066
4105
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4067
4106
  }
4107
+ .shadow-2xl {
4108
+ --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
4109
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4110
+ }
4068
4111
  .shadow-\[0_1px_2px_rgba\(0\,0\,0\,0\.2\)\] {
4069
4112
  --tw-shadow: 0 1px 2px var(--tw-shadow-color, rgba(0,0,0,0.2));
4070
4113
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -5572,6 +5615,9 @@
5572
5615
  -webkit-box-orient: vertical;
5573
5616
  -webkit-line-clamp: 3;
5574
5617
  }
5618
+ .sm\:\!block {
5619
+ display: block !important;
5620
+ }
5575
5621
  .sm\:flex {
5576
5622
  display: flex;
5577
5623
  }
@@ -24,7 +24,11 @@ type WfNodeTone = "trigger" | "structural" | "action";
24
24
  * working when in fact it is blocked on THEM — so it gets its own colour, its own
25
25
  * label, and a progress bar that does not move.
26
26
  */
27
- type WfNodeStatus = "queued" | "running" | "waiting" | "succeeded" | "failed";
27
+ type WfNodeStatus = "queued" | "running" | "waiting" | "succeeded" | "failed" |
28
+ /** The run went another way: a guard or `when` left this step out. Drawn
29
+ * dimmed and dashed, so the path the run took stands out from the one it
30
+ * did not, and never confused with a step that is still to come. */
31
+ "skipped";
28
32
  /**
29
33
  * Live RUN state for one node, supplied by the host (keyed by node id) and
30
34
  * merged onto {@link WfNodeData.state} at render time. Absent ⇒ the graph shows
@@ -256,6 +260,15 @@ interface WfGraph {
256
260
  edges: WfEdge[];
257
261
  /** Set when the YAML couldn't be parsed into a renderable graph. */
258
262
  error: string | null;
263
+ /** The separators this layout pitched its layers and lanes at, so a second
264
+ * layouter (see `elk-layout.ts`) keeps the same density. Absent on an error. */
265
+ spacing?: WfSpacing;
266
+ }
267
+ /** Gaps between layers (`rank`, along the flow) and between nodes stacked in
268
+ * one layer (`cross`). */
269
+ interface WfSpacing {
270
+ rank: number;
271
+ cross: number;
259
272
  }
260
273
  /** Main-axis flow direction: "LR" (left-to-right, default) suits the wide/short
261
274
  * run-detail panel; "TB" (top-to-bottom) suits a narrow column. */
@@ -307,6 +320,13 @@ interface BuildWorkflowGraphOptions {
307
320
  * measured afterwards. Defaults to `false`.
308
321
  */
309
322
  reserveEdgeInsert?: boolean;
323
+ /**
324
+ * How many items a settled `foreach` ran, by its action index. A foreach
325
+ * is one template step until it has run; then each item is a node of its
326
+ * own, so a fan-out over fourteen issues reads as fourteen lanes with their
327
+ * own status and cost rather than one tile with a count.
328
+ */
329
+ itemCounts?: Readonly<Record<number, number>>;
310
330
  }
311
331
  /** Build a positioned graph from a workflow YAML string. Never throws —
312
332
  * malformed YAML or an empty definition returns an `error` the UI can fall
@@ -322,8 +342,9 @@ interface WorkflowGraphProps {
322
342
  yaml: string;
323
343
  /** "full" = interactive (pan/zoom/drag + controls); "preview" = static fit. */
324
344
  variant?: "full" | "preview";
325
- /** Flow direction: "LR" (default) reads left-to-right — best for the wide/short
326
- * run-detail panel; "TB" is a vertical column. */
345
+ /** Flow direction: "LR" reads left-to-right — best for the wide/short
346
+ * run-detail panel; "TB" is a vertical column. Unset, it follows the
347
+ * canvas: "LR" in a panel, "TB" in a portrait canvas such as a phone's. */
327
348
  direction?: WfDirection;
328
349
  /**
329
350
  * Start collapsed (compact icon tiles) rather than expanded.
package/dist/workflows.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { i as modelBrandFor, t as ModelBrandStack } from "./model-brand-BSr9on8C.js";
2
- import { A as triggerNodeIndex, D as buildWorkflowGraph, E as branchNodeId, F as parseActionPath, I as shortModel, N as actionPathLabel, P as humanizeIdentifier, T as actionNodeId, a as NodeMark, d as STATUS_LABEL, f as STATUS_PILL, h as StatusPill, i as KIND_ICON, k as triggerNodeId, n as classifyOutput, p as STATUS_TONE, r as condenseText, t as NodeOutputBody, u as STATUS_COLOR, w as TRIGGER_NODE_ID } from "./node-output-CHlf3tni.js";
2
+ import { A as triggerNodeIndex, D as buildWorkflowGraph, E as branchNodeId, F as parseActionPath, I as shortModel, N as actionPathLabel, P as humanizeIdentifier, T as actionNodeId, a as NodeMark, d as STATUS_LABEL, f as STATUS_PILL, h as StatusPill, i as KIND_ICON, k as triggerNodeId, n as classifyOutput, p as STATUS_TONE, r as condenseText, t as NodeOutputBody, u as STATUS_COLOR, w as TRIGGER_NODE_ID } from "./node-output-fuk0NV0V.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Component, Suspense, lazy, useMemo, useState } from "react";
5
5
  //#region src/workflows/WorkflowGraphLazy.tsx
@@ -30,7 +30,7 @@ function retryImport(factory, retries = 2, delayMs = 350) {
30
30
  });
31
31
  }
32
32
  function lazyWorkflowGraph() {
33
- return lazy(() => retryImport(() => import("./WorkflowGraph-Dz6aA2Mp.js").then((m) => ({ default: m.WorkflowGraph }))));
33
+ return lazy(() => retryImport(() => import("./WorkflowGraph-Cfm0Ub4F.js").then((m) => ({ default: m.WorkflowGraph }))));
34
34
  }
35
35
  var GraphErrorBoundary = class extends Component {
36
36
  state = { hasError: false };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.134.12",
3
+ "version": "0.136.0",
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": {
@@ -146,6 +146,7 @@
146
146
  "@xterm/addon-webgl": "^0.19.0",
147
147
  "@xterm/xterm": "^6.0.0",
148
148
  "@xyflow/react": "^12.0.0",
149
+ "elkjs": "^0.12.0",
149
150
  "pdfjs-dist": ">=6.0.0 <7.0.0",
150
151
  "react": "^18 || ^19",
151
152
  "react-dom": "^18 || ^19",
@@ -191,6 +192,9 @@
191
192
  "@xyflow/react": {
192
193
  "optional": true
193
194
  },
195
+ "elkjs": {
196
+ "optional": true
197
+ },
194
198
  "pdfjs-dist": {
195
199
  "optional": true
196
200
  },
@@ -244,6 +248,7 @@
244
248
  "@xterm/addon-webgl": "^0.19.0",
245
249
  "@xterm/xterm": "^6.0.0",
246
250
  "@xyflow/react": "^12.12.0",
251
+ "elkjs": "0.12.0",
247
252
  "jsdom": "^30.1.1",
248
253
  "pdfjs-dist": "^6.4.299",
249
254
  "playwright": "^1.63.0",