@tangle-network/sandbox-ui 0.134.12 → 0.135.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/{WorkflowGraph-Dz6aA2Mp.js → WorkflowGraph-WgonmxDh.js} +809 -58
- package/dist/globals.css +46 -0
- package/dist/{node-output-CHlf3tni.js → node-output-Bs51H68g.js} +71 -6
- package/dist/styles.css +46 -0
- package/dist/workflows.d.ts +17 -3
- package/dist/workflows.js +2 -2
- package/package.json +6 -1
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 ? {
|
|
@@ -1228,7 +1274,8 @@ function buildWorkflowGraph(yaml, options) {
|
|
|
1228
1274
|
};
|
|
1229
1275
|
addEdge(spec.from, spec.to, "spine", spec.whenLabel);
|
|
1230
1276
|
}
|
|
1231
|
-
const
|
|
1277
|
+
const loopBack = classifyBackEdges(logical.map((n) => n.id), edges);
|
|
1278
|
+
const rootward = new Set(edges.filter((e) => !loopBack.has(e.id)).map((e) => e.target));
|
|
1232
1279
|
for (const n of logical) {
|
|
1233
1280
|
if (triggerNodeIndex(n.id) !== null) continue;
|
|
1234
1281
|
if (rootward.has(n.id)) continue;
|
|
@@ -1252,7 +1299,11 @@ function buildWorkflowGraph(yaml, options) {
|
|
|
1252
1299
|
return {
|
|
1253
1300
|
nodes: (options?.wrap && direction === "LR" && !labelled ? layoutSerpentine(logical, edges, rankSep, geo.crossSep) : null) ?? layoutLayers(logical, direction, rankSep, geo.crossSep),
|
|
1254
1301
|
edges,
|
|
1255
|
-
error: null
|
|
1302
|
+
error: null,
|
|
1303
|
+
spacing: {
|
|
1304
|
+
rank: rankSep,
|
|
1305
|
+
cross: geo.crossSep
|
|
1306
|
+
}
|
|
1256
1307
|
};
|
|
1257
1308
|
}
|
|
1258
1309
|
//#endregion
|
|
@@ -1328,7 +1379,8 @@ const STATUS_COLOR = {
|
|
|
1328
1379
|
running: STATUS_RUNNING,
|
|
1329
1380
|
waiting: STATUS_WAITING,
|
|
1330
1381
|
succeeded: STATUS_DONE,
|
|
1331
|
-
failed: STATUS_FAILED
|
|
1382
|
+
failed: STATUS_FAILED,
|
|
1383
|
+
skipped: STATUS_QUEUED
|
|
1332
1384
|
};
|
|
1333
1385
|
/** An edge reads by the status of the node it points AT — with the 2026-10-09
|
|
1334
1386
|
* fix: SETTLED edges go quiet. A succeeded run used to paint every edge green
|
|
@@ -1346,7 +1398,8 @@ const STATUS_LABEL = {
|
|
|
1346
1398
|
running: "Running",
|
|
1347
1399
|
waiting: "Waiting on you",
|
|
1348
1400
|
succeeded: "Done",
|
|
1349
|
-
failed: "Failed"
|
|
1401
|
+
failed: "Failed",
|
|
1402
|
+
skipped: "Not taken"
|
|
1350
1403
|
};
|
|
1351
1404
|
/** @deprecated `StatusPill` now renders ui's StatusPill from `STATUS_TONE`;
|
|
1352
1405
|
* kept for consumers that styled their own pill from it.
|
|
@@ -1378,6 +1431,11 @@ const STATUS_PILL = {
|
|
|
1378
1431
|
background: "var(--surface-danger-bg)",
|
|
1379
1432
|
color: "var(--surface-danger-text)",
|
|
1380
1433
|
borderColor: "var(--surface-danger-border)"
|
|
1434
|
+
},
|
|
1435
|
+
skipped: {
|
|
1436
|
+
background: "transparent",
|
|
1437
|
+
color: "hsl(var(--muted-foreground))",
|
|
1438
|
+
borderColor: "color-mix(in srgb, hsl(var(--muted-foreground)) 28%, transparent)"
|
|
1381
1439
|
}
|
|
1382
1440
|
};
|
|
1383
1441
|
/** The card's border + ring once a node has live run state. The emphasis
|
|
@@ -1403,6 +1461,11 @@ function statusBorder(status) {
|
|
|
1403
1461
|
};
|
|
1404
1462
|
}
|
|
1405
1463
|
case "queued": return { borderColor: "hsl(var(--border))" };
|
|
1464
|
+
case "skipped": return {
|
|
1465
|
+
borderColor: "hsl(var(--muted-foreground) / 0.45)",
|
|
1466
|
+
borderStyle: "dashed",
|
|
1467
|
+
opacity: .5
|
|
1468
|
+
};
|
|
1406
1469
|
case "succeeded": return {
|
|
1407
1470
|
borderColor: RESTING_BORDER,
|
|
1408
1471
|
boxShadow: RESTING_SHADOW
|
|
@@ -1560,7 +1623,8 @@ const STATUS_TONE = {
|
|
|
1560
1623
|
running: "running",
|
|
1561
1624
|
waiting: "warning",
|
|
1562
1625
|
succeeded: "neutral",
|
|
1563
|
-
failed: "danger"
|
|
1626
|
+
failed: "danger",
|
|
1627
|
+
skipped: "neutral"
|
|
1564
1628
|
};
|
|
1565
1629
|
/** The status pill in a card's header — the one place the run state is spelled
|
|
1566
1630
|
* out in words. ui's `StatusPill`, so a node's state carries the same glyph,
|
|
@@ -1642,6 +1706,7 @@ function emptySlotLabel(status) {
|
|
|
1642
1706
|
case "queued": return "Not run yet";
|
|
1643
1707
|
case "succeeded": return "No output";
|
|
1644
1708
|
case "failed": return "No error reported";
|
|
1709
|
+
case "skipped": return "Not taken this run";
|
|
1645
1710
|
default: return;
|
|
1646
1711
|
}
|
|
1647
1712
|
}
|
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
|
}
|
package/dist/workflows.d.ts
CHANGED
|
@@ -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. */
|
|
@@ -322,8 +335,9 @@ interface WorkflowGraphProps {
|
|
|
322
335
|
yaml: string;
|
|
323
336
|
/** "full" = interactive (pan/zoom/drag + controls); "preview" = static fit. */
|
|
324
337
|
variant?: "full" | "preview";
|
|
325
|
-
/** Flow direction: "LR"
|
|
326
|
-
* run-detail panel; "TB" is a vertical column.
|
|
338
|
+
/** Flow direction: "LR" reads left-to-right — best for the wide/short
|
|
339
|
+
* run-detail panel; "TB" is a vertical column. Unset, it follows the
|
|
340
|
+
* canvas: "LR" in a panel, "TB" in a portrait canvas such as a phone's. */
|
|
327
341
|
direction?: WfDirection;
|
|
328
342
|
/**
|
|
329
343
|
* 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-
|
|
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-Bs51H68g.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-
|
|
33
|
+
return lazy(() => retryImport(() => import("./WorkflowGraph-WgonmxDh.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.
|
|
3
|
+
"version": "0.135.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",
|