footprint-explainable-ui 0.19.0 → 0.20.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/flowchart.js CHANGED
@@ -1138,7 +1138,7 @@ import {
1138
1138
  BackgroundVariant,
1139
1139
  MarkerType
1140
1140
  } from "@xyflow/react";
1141
- import { jsx as jsx6 } from "react/jsx-runtime";
1141
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1142
1142
  var Y_STEP = 100;
1143
1143
  var X_SPREAD = 200;
1144
1144
  var defaultTraceFlowLayout = (graph) => {
@@ -1237,8 +1237,11 @@ function styleEdge(edge, colors) {
1237
1237
  }
1238
1238
  return styled;
1239
1239
  }
1240
- var nodeTypes = { stageNode: StageNode };
1240
+ var DEFAULT_NODE_TYPES = { stageNode: StageNode };
1241
1241
  function toStageNode(node) {
1242
+ if (node.type !== void 0 && node.type !== "stage") {
1243
+ return node;
1244
+ }
1242
1245
  const data = node.data;
1243
1246
  const stageData = {
1244
1247
  label: data.label,
@@ -1320,6 +1323,11 @@ function TraceFlow(props) {
1320
1323
  },
1321
1324
  [onNodeClickRef]
1322
1325
  );
1326
+ const { nodeTypes: userNodeTypes, edgeTypes: userEdgeTypes } = props;
1327
+ const mergedNodeTypes = useMemo4(
1328
+ () => userNodeTypes ? { ...DEFAULT_NODE_TYPES, ...userNodeTypes } : DEFAULT_NODE_TYPES,
1329
+ [userNodeTypes]
1330
+ );
1323
1331
  return /* @__PURE__ */ jsx6(
1324
1332
  "div",
1325
1333
  {
@@ -1330,16 +1338,20 @@ function TraceFlow(props) {
1330
1338
  minHeight: 300,
1331
1339
  ...props.style
1332
1340
  },
1333
- children: /* @__PURE__ */ jsx6(
1341
+ children: /* @__PURE__ */ jsxs5(
1334
1342
  ReactFlow,
1335
1343
  {
1336
1344
  nodes: reactFlowNodes,
1337
1345
  edges: reactFlowEdges,
1338
- nodeTypes,
1346
+ nodeTypes: mergedNodeTypes,
1347
+ ...userEdgeTypes && { edgeTypes: userEdgeTypes },
1339
1348
  onNodeClick: handleNodeClick,
1340
1349
  fitView: true,
1341
1350
  proOptions: { hideAttribution: true },
1342
- children: /* @__PURE__ */ jsx6(Background, { variant: BackgroundVariant.Dots, gap: 20, size: 1 })
1351
+ children: [
1352
+ /* @__PURE__ */ jsx6(Background, { variant: BackgroundVariant.Dots, gap: 20, size: 1 }),
1353
+ props.children
1354
+ ]
1343
1355
  }
1344
1356
  )
1345
1357
  }
@@ -1621,7 +1633,7 @@ function useChartAutoRefit(wrapperRef, rfInstance, options = {}) {
1621
1633
  }
1622
1634
 
1623
1635
  // src/components/FlowchartView/SubflowBreadcrumbBar.tsx
1624
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
1636
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1625
1637
  function SubflowBreadcrumbBar({ entries, onNavigate }) {
1626
1638
  return /* @__PURE__ */ jsx7(
1627
1639
  "div",
@@ -1639,7 +1651,7 @@ function SubflowBreadcrumbBar({ entries, onNavigate }) {
1639
1651
  "aria-label": "Subflow breadcrumb",
1640
1652
  children: entries.map((entry, i) => {
1641
1653
  const isLast = i === entries.length - 1;
1642
- return /* @__PURE__ */ jsxs5(
1654
+ return /* @__PURE__ */ jsxs6(
1643
1655
  "span",
1644
1656
  {
1645
1657
  style: { display: "inline-flex", alignItems: "center", gap: 6 },
@@ -1675,7 +1687,7 @@ function SubflowBreadcrumbBar({ entries, onNavigate }) {
1675
1687
  }
1676
1688
 
1677
1689
  // src/components/FlowchartView/TracedFlow.tsx
1678
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
1690
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
1679
1691
  var DEFAULT_COLORS = {
1680
1692
  default: rawDefaults.colors.textMuted,
1681
1693
  done: rawDefaults.colors.success,
@@ -1684,6 +1696,9 @@ var DEFAULT_COLORS = {
1684
1696
  loop: rawDefaults.colors.warning
1685
1697
  };
1686
1698
  function toStageNodeWithOverlay(node, doneStageIds, activeStageId, errorMessage, executedOrderIds) {
1699
+ if (node.type !== void 0 && node.type !== "stage") {
1700
+ return node;
1701
+ }
1687
1702
  const isDone = doneStageIds.has(node.id);
1688
1703
  const isActive = activeStageId === node.id;
1689
1704
  const wasExecuted = isDone || isActive;
@@ -1748,7 +1763,7 @@ function styleEdgeWithOverlay(edge, doneStageIds, activeStageId, colors) {
1748
1763
  }
1749
1764
  return styled;
1750
1765
  }
1751
- var nodeTypes2 = { stageNode: StageNode };
1766
+ var DEFAULT_NODE_TYPES2 = { stageNode: StageNode };
1752
1767
  function TracedFlow({
1753
1768
  graph,
1754
1769
  overlay,
@@ -1757,6 +1772,9 @@ function TracedFlow({
1757
1772
  colors: colorOverrides,
1758
1773
  onNodeClick,
1759
1774
  onSubflowChange,
1775
+ nodeTypes: userNodeTypes,
1776
+ edgeTypes: userEdgeTypes,
1777
+ children,
1760
1778
  className,
1761
1779
  style
1762
1780
  }) {
@@ -1765,6 +1783,10 @@ function TracedFlow({
1765
1783
  () => ({ ...DEFAULT_COLORS, ...colorOverrides ?? {} }),
1766
1784
  [colorOverrides]
1767
1785
  );
1786
+ const mergedNodeTypes = useMemo5(
1787
+ () => userNodeTypes ? { ...DEFAULT_NODE_TYPES2, ...userNodeTypes } : DEFAULT_NODE_TYPES2,
1788
+ [userNodeTypes]
1789
+ );
1768
1790
  const drill = useSubflowDrill(graph, onSubflowChange);
1769
1791
  const filteredGraph = useMemo5(
1770
1792
  () => filterGraphForDrill(graph, drill.currentSubflowId),
@@ -1822,7 +1844,7 @@ function TracedFlow({
1822
1844
  const wrapperRef = useRef5(null);
1823
1845
  const [rfInstance, setRfInstance] = useState4(null);
1824
1846
  useChartAutoRefit(wrapperRef, rfInstance);
1825
- return /* @__PURE__ */ jsxs6(
1847
+ return /* @__PURE__ */ jsxs7(
1826
1848
  "div",
1827
1849
  {
1828
1850
  ref: wrapperRef,
@@ -1843,17 +1865,21 @@ function TracedFlow({
1843
1865
  onNavigate: drill.setCurrentSubflowId
1844
1866
  }
1845
1867
  ),
1846
- /* @__PURE__ */ jsx8("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ jsx8(
1868
+ /* @__PURE__ */ jsx8("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ jsxs7(
1847
1869
  ReactFlow2,
1848
1870
  {
1849
1871
  nodes: reactFlowNodes,
1850
1872
  edges: reactFlowEdges,
1851
- nodeTypes: nodeTypes2,
1873
+ nodeTypes: mergedNodeTypes,
1874
+ ...userEdgeTypes && { edgeTypes: userEdgeTypes },
1852
1875
  onNodeClick: handleNodeClick,
1853
1876
  onInit: setRfInstance,
1854
1877
  fitView: true,
1855
1878
  proOptions: { hideAttribution: true },
1856
- children: /* @__PURE__ */ jsx8(Background2, { variant: BackgroundVariant2.Dots, gap: 20, size: 1 })
1879
+ children: [
1880
+ /* @__PURE__ */ jsx8(Background2, { variant: BackgroundVariant2.Dots, gap: 20, size: 1 }),
1881
+ children
1882
+ ]
1857
1883
  }
1858
1884
  ) })
1859
1885
  ]
@@ -1862,7 +1888,7 @@ function TracedFlow({
1862
1888
  }
1863
1889
 
1864
1890
  // src/components/TimeTravelDebugger/TimeTravelDebugger.tsx
1865
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
1891
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
1866
1892
  function TimeTravelDebugger({
1867
1893
  snapshots,
1868
1894
  graph,
@@ -1910,7 +1936,7 @@ function TimeTravelDebugger({
1910
1936
  }
1911
1937
  ) : /* @__PURE__ */ jsx9(TraceFlow, { graph, onNodeClick: handleNodeClick });
1912
1938
  if (unstyled) {
1913
- return /* @__PURE__ */ jsxs7("div", { className, style, "data-fp": "time-travel-debugger", children: [
1939
+ return /* @__PURE__ */ jsxs8("div", { className, style, "data-fp": "time-travel-debugger", children: [
1914
1940
  /* @__PURE__ */ jsx9("h3", { children: title }),
1915
1941
  /* @__PURE__ */ jsx9(
1916
1942
  "input",
@@ -1950,7 +1976,7 @@ function TimeTravelDebugger({
1950
1976
  )
1951
1977
  ] });
1952
1978
  }
1953
- return /* @__PURE__ */ jsxs7(
1979
+ return /* @__PURE__ */ jsxs8(
1954
1980
  "div",
1955
1981
  {
1956
1982
  className,
@@ -1965,7 +1991,7 @@ function TimeTravelDebugger({
1965
1991
  },
1966
1992
  "data-fp": "time-travel-debugger",
1967
1993
  children: [
1968
- /* @__PURE__ */ jsxs7(
1994
+ /* @__PURE__ */ jsxs8(
1969
1995
  "div",
1970
1996
  {
1971
1997
  style: {
@@ -1975,7 +2001,7 @@ function TimeTravelDebugger({
1975
2001
  flexShrink: 0
1976
2002
  },
1977
2003
  children: [
1978
- /* @__PURE__ */ jsxs7(
2004
+ /* @__PURE__ */ jsxs8(
1979
2005
  "div",
1980
2006
  {
1981
2007
  style: {
@@ -2009,7 +2035,7 @@ function TimeTravelDebugger({
2009
2035
  ]
2010
2036
  }
2011
2037
  ),
2012
- /* @__PURE__ */ jsxs7("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
2038
+ /* @__PURE__ */ jsxs8("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
2013
2039
  /* @__PURE__ */ jsx9(
2014
2040
  ScrubButton,
2015
2041
  {
@@ -2042,7 +2068,7 @@ function TimeTravelDebugger({
2042
2068
  onClick: () => setSelectedIndex((i) => Math.min(snapshots.length - 1, i + 1))
2043
2069
  }
2044
2070
  ),
2045
- /* @__PURE__ */ jsxs7(
2071
+ /* @__PURE__ */ jsxs8(
2046
2072
  "span",
2047
2073
  {
2048
2074
  style: {
@@ -2062,7 +2088,7 @@ function TimeTravelDebugger({
2062
2088
  ]
2063
2089
  }
2064
2090
  ),
2065
- /* @__PURE__ */ jsxs7(
2091
+ /* @__PURE__ */ jsxs8(
2066
2092
  "div",
2067
2093
  {
2068
2094
  style: {
@@ -2084,7 +2110,7 @@ function TimeTravelDebugger({
2084
2110
  children: chart
2085
2111
  }
2086
2112
  ),
2087
- /* @__PURE__ */ jsxs7("div", { style: { flex: 1, overflow: "auto" }, children: [
2113
+ /* @__PURE__ */ jsxs8("div", { style: { flex: 1, overflow: "auto" }, children: [
2088
2114
  /* @__PURE__ */ jsx9(
2089
2115
  MemoryInspector,
2090
2116
  {
@@ -2170,7 +2196,7 @@ function ScrubButton({
2170
2196
 
2171
2197
  // src/components/FlowchartView/SubflowBreadcrumb.tsx
2172
2198
  import { memo as memo2 } from "react";
2173
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
2199
+ import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
2174
2200
  var SubflowBreadcrumb = memo2(function SubflowBreadcrumb2({
2175
2201
  breadcrumbs,
2176
2202
  onNavigate
@@ -2193,9 +2219,9 @@ var SubflowBreadcrumb = memo2(function SubflowBreadcrumb2({
2193
2219
  },
2194
2220
  children: breadcrumbs.map((crumb, i) => {
2195
2221
  const isLast = i === breadcrumbs.length - 1;
2196
- return /* @__PURE__ */ jsxs8("span", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
2222
+ return /* @__PURE__ */ jsxs9("span", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
2197
2223
  i > 0 && /* @__PURE__ */ jsx10("span", { style: { color: theme.textMuted, fontSize: 10 }, children: "\u203A" }),
2198
- isLast ? /* @__PURE__ */ jsxs8("span", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
2224
+ isLast ? /* @__PURE__ */ jsxs9("span", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
2199
2225
  /* @__PURE__ */ jsx10(
2200
2226
  "span",
2201
2227
  {
@@ -2206,7 +2232,7 @@ var SubflowBreadcrumb = memo2(function SubflowBreadcrumb2({
2206
2232
  children: crumb.label
2207
2233
  }
2208
2234
  ),
2209
- crumb.description && /* @__PURE__ */ jsxs8(
2235
+ crumb.description && /* @__PURE__ */ jsxs9(
2210
2236
  "span",
2211
2237
  {
2212
2238
  style: {
@@ -2319,7 +2345,7 @@ function useSubflowNavigation(rootGraph) {
2319
2345
 
2320
2346
  // src/components/FlowchartView/SubflowTree.tsx
2321
2347
  import { memo as memo3, useState as useState7, useCallback as useCallback5, useMemo as useMemo7 } from "react";
2322
- import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
2348
+ import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
2323
2349
  function graphToSubflowEntries(graph) {
2324
2350
  if (!graph?.nodes?.length) return [];
2325
2351
  const entries = [];
@@ -2352,8 +2378,8 @@ var TreeNode = memo3(function TreeNode2({
2352
2378
  }
2353
2379
  onNodeSelect?.(entry.name, !!entry.isSubflow);
2354
2380
  }, [hasChildren, onNodeSelect, entry.name, entry.isSubflow]);
2355
- return /* @__PURE__ */ jsxs9(Fragment2, { children: [
2356
- /* @__PURE__ */ jsxs9(
2381
+ return /* @__PURE__ */ jsxs10(Fragment2, { children: [
2382
+ /* @__PURE__ */ jsxs10(
2357
2383
  "button",
2358
2384
  {
2359
2385
  onClick: handleClick,
@@ -2412,8 +2438,8 @@ var TreeNode = memo3(function TreeNode2({
2412
2438
  }
2413
2439
  }
2414
2440
  ),
2415
- /* @__PURE__ */ jsxs9("span", { style: { display: "flex", flexDirection: "column", minWidth: 0 }, children: [
2416
- /* @__PURE__ */ jsxs9(
2441
+ /* @__PURE__ */ jsxs10("span", { style: { display: "flex", flexDirection: "column", minWidth: 0 }, children: [
2442
+ /* @__PURE__ */ jsxs10(
2417
2443
  "span",
2418
2444
  {
2419
2445
  style: {
@@ -2486,7 +2512,7 @@ var SubflowTree = memo3(function SubflowTree2({
2486
2512
  }) {
2487
2513
  const subflowStages = useMemo7(() => graphToSubflowEntries(graph), [graph]);
2488
2514
  if (subflowStages.length === 0) return null;
2489
- return /* @__PURE__ */ jsxs9(
2515
+ return /* @__PURE__ */ jsxs10(
2490
2516
  "div",
2491
2517
  {
2492
2518
  className,
@@ -3310,7 +3336,7 @@ function bfsWalk(index, startId, neighborsOf, options) {
3310
3336
 
3311
3337
  // src/components/FlowchartView/NodeInspector.tsx
3312
3338
  import { useMemo as useMemo9 } from "react";
3313
- import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
3339
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3314
3340
  function NodeInspector({
3315
3341
  index,
3316
3342
  selectedId,
@@ -3343,7 +3369,7 @@ function NodeInspector({
3343
3369
  }
3344
3370
  );
3345
3371
  }
3346
- return /* @__PURE__ */ jsxs10(
3372
+ return /* @__PURE__ */ jsxs11(
3347
3373
  "div",
3348
3374
  {
3349
3375
  className,
@@ -3355,9 +3381,9 @@ function NodeInspector({
3355
3381
  ...style
3356
3382
  },
3357
3383
  children: [
3358
- /* @__PURE__ */ jsxs10("div", { style: { marginBottom: 16 }, children: [
3384
+ /* @__PURE__ */ jsxs11("div", { style: { marginBottom: 16 }, children: [
3359
3385
  /* @__PURE__ */ jsx12("div", { style: { fontSize: 16, fontWeight: 700, color: theme.textPrimary }, children: view.label }),
3360
- /* @__PURE__ */ jsxs10("div", { style: { fontSize: 11, fontFamily: "monospace", color: theme.textMuted, marginTop: 2 }, children: [
3386
+ /* @__PURE__ */ jsxs11("div", { style: { fontSize: 11, fontFamily: "monospace", color: theme.textMuted, marginTop: 2 }, children: [
3361
3387
  view.stageId,
3362
3388
  " \xB7 ",
3363
3389
  view.type,
@@ -3369,9 +3395,9 @@ function NodeInspector({
3369
3395
  ] }),
3370
3396
  view.description && /* @__PURE__ */ jsx12("div", { style: { fontSize: 12, color: theme.textSecondary, marginTop: 6 }, children: view.description })
3371
3397
  ] }),
3372
- /* @__PURE__ */ jsxs10(Section, { title: "Runtime", children: [
3398
+ /* @__PURE__ */ jsxs11(Section, { title: "Runtime", children: [
3373
3399
  /* @__PURE__ */ jsx12(Row, { label: "Visited", value: view.visitedInRun ? "yes" : "no" }),
3374
- view.visitedInRun && /* @__PURE__ */ jsxs10(Fragment3, { children: [
3400
+ view.visitedInRun && /* @__PURE__ */ jsxs11(Fragment3, { children: [
3375
3401
  /* @__PURE__ */ jsx12(Row, { label: "Executions", value: String(view.executionCount) }),
3376
3402
  view.firstExecutedAt !== null && /* @__PURE__ */ jsx12(Row, { label: "First at", value: `${view.firstExecutedAt.toFixed(1)}ms` }),
3377
3403
  view.lastExecutedAt !== null && /* @__PURE__ */ jsx12(Row, { label: "Last at", value: `${view.lastExecutedAt.toFixed(1)}ms` }),
@@ -3401,7 +3427,7 @@ function NodeInspector({
3401
3427
  );
3402
3428
  }
3403
3429
  function Section({ title, children }) {
3404
- return /* @__PURE__ */ jsxs10("div", { style: { marginBottom: 14 }, children: [
3430
+ return /* @__PURE__ */ jsxs11("div", { style: { marginBottom: 14 }, children: [
3405
3431
  /* @__PURE__ */ jsx12(
3406
3432
  "div",
3407
3433
  {
@@ -3420,14 +3446,14 @@ function Section({ title, children }) {
3420
3446
  ] });
3421
3447
  }
3422
3448
  function Row({ label, value, valueColor }) {
3423
- return /* @__PURE__ */ jsxs10("div", { style: { display: "flex", justifyContent: "space-between", fontSize: 12, padding: "2px 0" }, children: [
3449
+ return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", justifyContent: "space-between", fontSize: 12, padding: "2px 0" }, children: [
3424
3450
  /* @__PURE__ */ jsx12("span", { style: { color: theme.textMuted }, children: label }),
3425
3451
  /* @__PURE__ */ jsx12("span", { style: { color: valueColor ?? theme.textSecondary, fontFamily: "monospace" }, children: value })
3426
3452
  ] });
3427
3453
  }
3428
3454
  function Crumbs({ nodes, onClick }) {
3429
3455
  if (nodes.length === 0) return null;
3430
- return /* @__PURE__ */ jsx12("div", { style: { display: "flex", flexWrap: "wrap", gap: 6 }, children: nodes.map((n, i) => /* @__PURE__ */ jsxs10("span", { style: { display: "inline-flex", alignItems: "center", gap: 4 }, children: [
3456
+ return /* @__PURE__ */ jsx12("div", { style: { display: "flex", flexWrap: "wrap", gap: 6 }, children: nodes.map((n, i) => /* @__PURE__ */ jsxs11("span", { style: { display: "inline-flex", alignItems: "center", gap: 4 }, children: [
3431
3457
  /* @__PURE__ */ jsx12(
3432
3458
  "button",
3433
3459
  {
@@ -3451,7 +3477,7 @@ function Crumbs({ nodes, onClick }) {
3451
3477
 
3452
3478
  // src/components/FlowchartView/CommitInspector.tsx
3453
3479
  import { useMemo as useMemo10 } from "react";
3454
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
3480
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
3455
3481
  function CommitInspector({
3456
3482
  index,
3457
3483
  selectedRuntimeStageId,
@@ -3479,7 +3505,7 @@ function CommitInspector({
3479
3505
  }
3480
3506
  );
3481
3507
  }
3482
- return /* @__PURE__ */ jsxs11(
3508
+ return /* @__PURE__ */ jsxs12(
3483
3509
  "div",
3484
3510
  {
3485
3511
  className,
@@ -3491,9 +3517,9 @@ function CommitInspector({
3491
3517
  ...style
3492
3518
  },
3493
3519
  children: [
3494
- /* @__PURE__ */ jsxs11("div", { style: { marginBottom: 16 }, children: [
3520
+ /* @__PURE__ */ jsxs12("div", { style: { marginBottom: 16 }, children: [
3495
3521
  /* @__PURE__ */ jsx13("div", { style: { fontSize: 16, fontWeight: 700, color: theme.textPrimary }, children: view.stageId }),
3496
- /* @__PURE__ */ jsxs11(
3522
+ /* @__PURE__ */ jsxs12(
3497
3523
  "div",
3498
3524
  {
3499
3525
  style: {
@@ -3516,9 +3542,9 @@ function CommitInspector({
3516
3542
  view.runtimeNextIds.length > 0 && /* @__PURE__ */ jsx13(Section2, { title: "Runtime next (this execution)", children: /* @__PURE__ */ jsx13(RuntimeRefs, { refs: view.runtimeNextIds, onClick: onNavigate }) }),
3517
3543
  Object.keys(view.updates).length > 0 && /* @__PURE__ */ jsx13(Section2, { title: `Updates (${Object.keys(view.updates).length})`, children: /* @__PURE__ */ jsx13(KeyValueGrid, { entries: Object.entries(view.updates) }) }),
3518
3544
  view.reads.length > 0 && /* @__PURE__ */ jsx13(Section2, { title: `Reads (${view.reads.length})`, children: /* @__PURE__ */ jsx13(PlainTags, { labels: view.reads }) }),
3519
- view.dataDependencies.length > 0 && /* @__PURE__ */ jsx13(Section2, { title: `Data dependencies (${view.dataDependencies.length})`, children: /* @__PURE__ */ jsx13("table", { style: { fontSize: 11, fontFamily: "monospace", width: "100%", borderCollapse: "collapse" }, children: /* @__PURE__ */ jsx13("tbody", { children: view.dataDependencies.map((dep) => /* @__PURE__ */ jsxs11("tr", { children: [
3545
+ view.dataDependencies.length > 0 && /* @__PURE__ */ jsx13(Section2, { title: `Data dependencies (${view.dataDependencies.length})`, children: /* @__PURE__ */ jsx13("table", { style: { fontSize: 11, fontFamily: "monospace", width: "100%", borderCollapse: "collapse" }, children: /* @__PURE__ */ jsx13("tbody", { children: view.dataDependencies.map((dep) => /* @__PURE__ */ jsxs12("tr", { children: [
3520
3546
  /* @__PURE__ */ jsx13("td", { style: { color: theme.textSecondary, padding: "2px 8px 2px 0" }, children: dep.key }),
3521
- /* @__PURE__ */ jsx13("td", { style: { color: dep.sourceRuntimeStageId ? theme.textPrimary : theme.textMuted }, children: dep.sourceRuntimeStageId ? /* @__PURE__ */ jsxs11(
3547
+ /* @__PURE__ */ jsx13("td", { style: { color: dep.sourceRuntimeStageId ? theme.textPrimary : theme.textMuted }, children: dep.sourceRuntimeStageId ? /* @__PURE__ */ jsxs12(
3522
3548
  "button",
3523
3549
  {
3524
3550
  onClick: onNavigate ? () => onNavigate(dep.sourceRuntimeStageId) : void 0,
@@ -3530,7 +3556,7 @@ function CommitInspector({
3530
3556
  }
3531
3557
  ) : /* @__PURE__ */ jsx13("em", { children: "(no prior writer \u2014 default or external)" }) })
3532
3558
  ] }, dep.key)) }) }) }),
3533
- lineage.length > 1 && /* @__PURE__ */ jsx13(Section2, { title: `Lineage chain (${lineage.length - 1} ancestor commits)`, children: /* @__PURE__ */ jsx13("div", { style: { display: "flex", flexWrap: "wrap", gap: 6 }, children: lineage.slice(0, -1).map((c, i) => /* @__PURE__ */ jsxs11("span", { style: { display: "inline-flex", alignItems: "center", gap: 4 }, children: [
3559
+ lineage.length > 1 && /* @__PURE__ */ jsx13(Section2, { title: `Lineage chain (${lineage.length - 1} ancestor commits)`, children: /* @__PURE__ */ jsx13("div", { style: { display: "flex", flexWrap: "wrap", gap: 6 }, children: lineage.slice(0, -1).map((c, i) => /* @__PURE__ */ jsxs12("span", { style: { display: "inline-flex", alignItems: "center", gap: 4 }, children: [
3534
3560
  /* @__PURE__ */ jsx13(
3535
3561
  "button",
3536
3562
  {
@@ -3546,7 +3572,7 @@ function CommitInspector({
3546
3572
  );
3547
3573
  }
3548
3574
  function Section2({ title, children }) {
3549
- return /* @__PURE__ */ jsxs11("div", { style: { marginBottom: 14 }, children: [
3575
+ return /* @__PURE__ */ jsxs12("div", { style: { marginBottom: 14 }, children: [
3550
3576
  /* @__PURE__ */ jsx13(
3551
3577
  "div",
3552
3578
  {
@@ -3596,7 +3622,7 @@ function RuntimeRefs({
3596
3622
  )) });
3597
3623
  }
3598
3624
  function KeyValueGrid({ entries }) {
3599
- return /* @__PURE__ */ jsx13("table", { style: { fontSize: 11, fontFamily: "monospace", width: "100%", borderCollapse: "collapse" }, children: /* @__PURE__ */ jsx13("tbody", { children: entries.map(([k, v2]) => /* @__PURE__ */ jsxs11("tr", { children: [
3625
+ return /* @__PURE__ */ jsx13("table", { style: { fontSize: 11, fontFamily: "monospace", width: "100%", borderCollapse: "collapse" }, children: /* @__PURE__ */ jsx13("tbody", { children: entries.map(([k, v2]) => /* @__PURE__ */ jsxs12("tr", { children: [
3600
3626
  /* @__PURE__ */ jsx13("td", { style: { color: theme.textSecondary, padding: "2px 8px 2px 0", verticalAlign: "top" }, children: k }),
3601
3627
  /* @__PURE__ */ jsx13("td", { style: { color: theme.textPrimary, wordBreak: "break-word" }, children: typeof v2 === "object" ? JSON.stringify(v2) : String(v2) })
3602
3628
  ] }, k)) }) });
@@ -3765,7 +3791,7 @@ function decorate(node, commitsByStageId) {
3765
3791
  }
3766
3792
 
3767
3793
  // src/components/FlowchartView/CommitChainView.tsx
3768
- import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
3794
+ import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
3769
3795
  function CommitChainView({
3770
3796
  chain,
3771
3797
  selectedRuntimeStageId = null,
@@ -3834,7 +3860,7 @@ function ChainShell({ node, renderLeaf }) {
3834
3860
  alignItems: "center",
3835
3861
  gap: 0
3836
3862
  },
3837
- children: node.items.map((child, i) => /* @__PURE__ */ jsxs12(
3863
+ children: node.items.map((child, i) => /* @__PURE__ */ jsxs13(
3838
3864
  "div",
3839
3865
  {
3840
3866
  style: { display: "flex", flexDirection: "column", alignItems: "center" },
@@ -3848,7 +3874,7 @@ function ChainShell({ node, renderLeaf }) {
3848
3874
  }
3849
3875
  );
3850
3876
  }
3851
- return /* @__PURE__ */ jsxs12(
3877
+ return /* @__PURE__ */ jsxs13(
3852
3878
  "div",
3853
3879
  {
3854
3880
  style: {
@@ -3922,7 +3948,7 @@ function Leaf({
3922
3948
  const label = resolveLabel ? resolveLabel(leaf.stageId) : leaf.stageId;
3923
3949
  const commits = "commits" in leaf ? leaf.commits : [];
3924
3950
  if (commits.length === 0) {
3925
- return /* @__PURE__ */ jsxs12(
3951
+ return /* @__PURE__ */ jsxs13(
3926
3952
  "div",
3927
3953
  {
3928
3954
  style: {
@@ -3943,7 +3969,7 @@ function Leaf({
3943
3969
  const isSelected = c.runtimeStageId === selectedRuntimeStageId;
3944
3970
  const clickable = onSelectCommit !== void 0;
3945
3971
  const isRevealed = revealedThroughCommitIdx === null || c.commitIdx <= revealedThroughCommitIdx;
3946
- return /* @__PURE__ */ jsxs12(
3972
+ return /* @__PURE__ */ jsxs13(
3947
3973
  "button",
3948
3974
  {
3949
3975
  type: "button",
@@ -3964,16 +3990,16 @@ function Leaf({
3964
3990
  "aria-current": isSelected ? "true" : void 0,
3965
3991
  title: c.runtimeStageId,
3966
3992
  children: [
3967
- /* @__PURE__ */ jsxs12("div", { style: { fontWeight: 600 }, children: [
3993
+ /* @__PURE__ */ jsxs13("div", { style: { fontWeight: 600 }, children: [
3968
3994
  label,
3969
- commits.length > 1 && /* @__PURE__ */ jsxs12("span", { style: { color: theme.textMuted, fontWeight: 400, marginLeft: 6 }, children: [
3995
+ commits.length > 1 && /* @__PURE__ */ jsxs13("span", { style: { color: theme.textMuted, fontWeight: 400, marginLeft: 6 }, children: [
3970
3996
  "iter ",
3971
3997
  i + 1,
3972
3998
  "/",
3973
3999
  commits.length
3974
4000
  ] })
3975
4001
  ] }),
3976
- /* @__PURE__ */ jsxs12(
4002
+ /* @__PURE__ */ jsxs13(
3977
4003
  "div",
3978
4004
  {
3979
4005
  style: {
@@ -4050,7 +4076,7 @@ import { useMemo as useMemo12, useState as useState8, useCallback as useCallback
4050
4076
 
4051
4077
  // src/components/FlowchartView/RunSlider.tsx
4052
4078
  import { useCallback as useCallback6, useMemo as useMemo11 } from "react";
4053
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
4079
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
4054
4080
  function RunSlider({
4055
4081
  index,
4056
4082
  cursorRuntimeStageId,
@@ -4085,7 +4111,7 @@ function RunSlider({
4085
4111
  index
4086
4112
  });
4087
4113
  if (total === 0) return /* @__PURE__ */ jsx15("span", { style: { color: theme.textMuted }, children: "No commits yet" });
4088
- return /* @__PURE__ */ jsxs13("span", { style: { fontFamily: "monospace", fontSize: 11, color: theme.textSecondary }, children: [
4114
+ return /* @__PURE__ */ jsxs14("span", { style: { fontFamily: "monospace", fontSize: 11, color: theme.textSecondary }, children: [
4089
4115
  "#",
4090
4116
  cursorCommitIdx + 1,
4091
4117
  " / ",
@@ -4095,7 +4121,7 @@ function RunSlider({
4095
4121
  ] });
4096
4122
  }, [renderLabel, cursorCommitIdx, total, index, cursorRuntimeStageId]);
4097
4123
  const disabled = total < 2;
4098
- return /* @__PURE__ */ jsxs13(
4124
+ return /* @__PURE__ */ jsxs14(
4099
4125
  "div",
4100
4126
  {
4101
4127
  className,
@@ -4148,7 +4174,7 @@ function RunSlider({
4148
4174
  }
4149
4175
 
4150
4176
  // src/components/FlowchartView/TraceExplorerShell.tsx
4151
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
4177
+ import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
4152
4178
  function TraceExplorerShell({
4153
4179
  bundle,
4154
4180
  selectedRuntimeStageId: controlledSel,
@@ -4221,7 +4247,7 @@ function TraceExplorerShell({
4221
4247
  () => SliderPane ? SHELL_STYLE_WITH_SLIDER : SHELL_STYLE_NO_SLIDER,
4222
4248
  [SliderPane]
4223
4249
  );
4224
- return /* @__PURE__ */ jsxs14("div", { className, style: { ...layoutStyle, ...style }, children: [
4250
+ return /* @__PURE__ */ jsxs15("div", { className, style: { ...layoutStyle, ...style }, children: [
4225
4251
  SliderPane && /* @__PURE__ */ jsx16(Pane, { area: "slider", children: /* @__PURE__ */ jsx16(
4226
4252
  SliderPane,
4227
4253
  {