footprint-explainable-ui 0.3.2 → 0.5.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.
Files changed (161) hide show
  1. package/README.md +42 -3
  2. package/dist/adapters/fromRuntimeSnapshot.d.ts +52 -0
  3. package/dist/adapters/fromRuntimeSnapshot.d.ts.map +1 -0
  4. package/dist/adapters/fromRuntimeSnapshot.js +97 -0
  5. package/dist/adapters/fromRuntimeSnapshot.js.map +1 -0
  6. package/dist/components/ExplainableShell/ExplainableShell.d.ts +26 -0
  7. package/dist/components/ExplainableShell/ExplainableShell.d.ts.map +1 -0
  8. package/dist/components/ExplainableShell/ExplainableShell.js +94 -0
  9. package/dist/components/ExplainableShell/ExplainableShell.js.map +1 -0
  10. package/dist/components/ExplainableShell/index.d.ts +3 -0
  11. package/dist/components/ExplainableShell/index.d.ts.map +1 -0
  12. package/dist/components/ExplainableShell/index.js +2 -0
  13. package/dist/components/ExplainableShell/index.js.map +1 -0
  14. package/dist/components/FlowchartView/FlowchartView.d.ts +20 -0
  15. package/dist/components/FlowchartView/FlowchartView.d.ts.map +1 -0
  16. package/dist/components/FlowchartView/FlowchartView.js +80 -0
  17. package/dist/components/FlowchartView/FlowchartView.js.map +1 -0
  18. package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts +11 -0
  19. package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts.map +1 -0
  20. package/dist/components/FlowchartView/SubflowBreadcrumb.js +49 -0
  21. package/dist/components/FlowchartView/SubflowBreadcrumb.js.map +1 -0
  22. package/dist/components/FlowchartView/SubflowTree.d.ts +36 -0
  23. package/dist/components/FlowchartView/SubflowTree.d.ts.map +1 -0
  24. package/dist/components/FlowchartView/SubflowTree.js +143 -0
  25. package/dist/components/FlowchartView/SubflowTree.js.map +1 -0
  26. package/dist/components/FlowchartView/TracedFlowchartView.d.ts +20 -0
  27. package/dist/components/FlowchartView/TracedFlowchartView.d.ts.map +1 -0
  28. package/dist/components/FlowchartView/TracedFlowchartView.js +101 -0
  29. package/dist/components/FlowchartView/TracedFlowchartView.js.map +1 -0
  30. package/dist/components/FlowchartView/index.d.ts +11 -0
  31. package/dist/components/FlowchartView/index.d.ts.map +1 -0
  32. package/dist/components/FlowchartView/index.js +6 -0
  33. package/dist/components/FlowchartView/index.js.map +1 -0
  34. package/dist/components/FlowchartView/specToReactFlow.d.ts +56 -0
  35. package/dist/components/FlowchartView/specToReactFlow.d.ts.map +1 -0
  36. package/dist/components/FlowchartView/specToReactFlow.js +202 -0
  37. package/dist/components/FlowchartView/specToReactFlow.js.map +1 -0
  38. package/dist/components/FlowchartView/useSubflowNavigation.d.ts +35 -0
  39. package/dist/components/FlowchartView/useSubflowNavigation.d.ts.map +1 -0
  40. package/dist/components/FlowchartView/useSubflowNavigation.js +80 -0
  41. package/dist/components/FlowchartView/useSubflowNavigation.js.map +1 -0
  42. package/dist/components/GanttTimeline/GanttTimeline.d.ts +18 -0
  43. package/dist/components/GanttTimeline/GanttTimeline.d.ts.map +1 -0
  44. package/dist/components/GanttTimeline/GanttTimeline.js +123 -0
  45. package/dist/components/GanttTimeline/GanttTimeline.js.map +1 -0
  46. package/dist/components/GanttTimeline/index.d.ts +3 -0
  47. package/dist/components/GanttTimeline/index.d.ts.map +1 -0
  48. package/dist/components/GanttTimeline/index.js +2 -0
  49. package/dist/components/GanttTimeline/index.js.map +1 -0
  50. package/dist/components/MemoryInspector/MemoryInspector.d.ts +19 -0
  51. package/dist/components/MemoryInspector/MemoryInspector.d.ts.map +1 -0
  52. package/dist/components/MemoryInspector/MemoryInspector.js +95 -0
  53. package/dist/components/MemoryInspector/MemoryInspector.js.map +1 -0
  54. package/dist/components/MemoryInspector/index.d.ts +3 -0
  55. package/dist/components/MemoryInspector/index.d.ts.map +1 -0
  56. package/dist/components/MemoryInspector/index.js +2 -0
  57. package/dist/components/MemoryInspector/index.js.map +1 -0
  58. package/dist/components/NarrativeLog/NarrativeLog.d.ts +15 -0
  59. package/dist/components/NarrativeLog/NarrativeLog.d.ts.map +1 -0
  60. package/dist/components/NarrativeLog/NarrativeLog.js +65 -0
  61. package/dist/components/NarrativeLog/NarrativeLog.js.map +1 -0
  62. package/dist/components/NarrativeLog/index.d.ts +3 -0
  63. package/dist/components/NarrativeLog/index.d.ts.map +1 -0
  64. package/dist/components/NarrativeLog/index.js +2 -0
  65. package/dist/components/NarrativeLog/index.js.map +1 -0
  66. package/dist/components/NarrativeTrace/NarrativeTrace.d.ts +13 -0
  67. package/dist/components/NarrativeTrace/NarrativeTrace.d.ts.map +1 -0
  68. package/dist/components/NarrativeTrace/NarrativeTrace.js +127 -0
  69. package/dist/components/NarrativeTrace/NarrativeTrace.js.map +1 -0
  70. package/dist/components/NarrativeTrace/index.d.ts +3 -0
  71. package/dist/components/NarrativeTrace/index.d.ts.map +1 -0
  72. package/dist/components/NarrativeTrace/index.js +2 -0
  73. package/dist/components/NarrativeTrace/index.js.map +1 -0
  74. package/dist/components/ResultPanel/ResultPanel.d.ts +11 -0
  75. package/dist/components/ResultPanel/ResultPanel.d.ts.map +1 -0
  76. package/dist/components/ResultPanel/ResultPanel.js +54 -0
  77. package/dist/components/ResultPanel/ResultPanel.js.map +1 -0
  78. package/dist/components/ResultPanel/index.d.ts +3 -0
  79. package/dist/components/ResultPanel/index.d.ts.map +1 -0
  80. package/dist/components/ResultPanel/index.js +2 -0
  81. package/dist/components/ResultPanel/index.js.map +1 -0
  82. package/dist/components/ScopeDiff/ScopeDiff.d.ts +17 -0
  83. package/dist/components/ScopeDiff/ScopeDiff.d.ts.map +1 -0
  84. package/dist/components/ScopeDiff/ScopeDiff.js +87 -0
  85. package/dist/components/ScopeDiff/ScopeDiff.js.map +1 -0
  86. package/dist/components/ScopeDiff/index.d.ts +3 -0
  87. package/dist/components/ScopeDiff/index.d.ts.map +1 -0
  88. package/dist/components/ScopeDiff/index.js +2 -0
  89. package/dist/components/ScopeDiff/index.js.map +1 -0
  90. package/dist/components/SnapshotPanel/SnapshotPanel.d.ts +17 -0
  91. package/dist/components/SnapshotPanel/SnapshotPanel.d.ts.map +1 -0
  92. package/dist/components/SnapshotPanel/SnapshotPanel.js +85 -0
  93. package/dist/components/SnapshotPanel/SnapshotPanel.js.map +1 -0
  94. package/dist/components/SnapshotPanel/index.d.ts +3 -0
  95. package/dist/components/SnapshotPanel/index.d.ts.map +1 -0
  96. package/dist/components/SnapshotPanel/index.js +2 -0
  97. package/dist/components/SnapshotPanel/index.js.map +1 -0
  98. package/dist/components/StageNode/StageNode.d.ts +31 -0
  99. package/dist/components/StageNode/StageNode.d.ts.map +1 -0
  100. package/dist/components/StageNode/StageNode.js +134 -0
  101. package/dist/components/StageNode/StageNode.js.map +1 -0
  102. package/dist/components/StageNode/index.d.ts +3 -0
  103. package/dist/components/StageNode/index.d.ts.map +1 -0
  104. package/dist/components/StageNode/index.js +2 -0
  105. package/dist/components/StageNode/index.js.map +1 -0
  106. package/dist/components/TimeTravelControls/TimeTravelControls.d.ts +13 -0
  107. package/dist/components/TimeTravelControls/TimeTravelControls.d.ts.map +1 -0
  108. package/dist/components/TimeTravelControls/TimeTravelControls.js +104 -0
  109. package/dist/components/TimeTravelControls/TimeTravelControls.js.map +1 -0
  110. package/dist/components/TimeTravelControls/index.d.ts +3 -0
  111. package/dist/components/TimeTravelControls/index.d.ts.map +1 -0
  112. package/dist/components/TimeTravelControls/index.js +2 -0
  113. package/dist/components/TimeTravelControls/index.js.map +1 -0
  114. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts +22 -0
  115. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts.map +1 -0
  116. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js +104 -0
  117. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js.map +1 -0
  118. package/dist/components/TimeTravelDebugger/index.d.ts +3 -0
  119. package/dist/components/TimeTravelDebugger/index.d.ts.map +1 -0
  120. package/dist/components/TimeTravelDebugger/index.js +2 -0
  121. package/dist/components/TimeTravelDebugger/index.js.map +1 -0
  122. package/dist/flowchart.cjs +704 -220
  123. package/dist/flowchart.cjs.map +1 -1
  124. package/dist/flowchart.d.cts +55 -1
  125. package/dist/flowchart.d.ts +55 -1
  126. package/dist/flowchart.d.ts.map +1 -0
  127. package/dist/flowchart.js +700 -214
  128. package/dist/flowchart.js.map +1 -1
  129. package/dist/index.cjs +849 -76
  130. package/dist/index.cjs.map +1 -1
  131. package/dist/index.d.cts +95 -3
  132. package/dist/index.d.ts +95 -3
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +851 -80
  135. package/dist/index.js.map +1 -1
  136. package/dist/theme/ThemeProvider.d.ts +13 -0
  137. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  138. package/dist/theme/ThemeProvider.js +16 -0
  139. package/dist/theme/ThemeProvider.js.map +1 -0
  140. package/dist/theme/index.d.ts +7 -0
  141. package/dist/theme/index.d.ts.map +1 -0
  142. package/dist/theme/index.js +5 -0
  143. package/dist/theme/index.js.map +1 -0
  144. package/dist/theme/presets.d.ts +15 -0
  145. package/dist/theme/presets.d.ts.map +1 -0
  146. package/dist/theme/presets.js +70 -0
  147. package/dist/theme/presets.js.map +1 -0
  148. package/dist/theme/styles.d.ts +32 -0
  149. package/dist/theme/styles.d.ts.map +1 -0
  150. package/dist/theme/styles.js +37 -0
  151. package/dist/theme/styles.js.map +1 -0
  152. package/dist/theme/tokens.d.ts +28 -0
  153. package/dist/theme/tokens.d.ts.map +1 -0
  154. package/dist/theme/tokens.js +58 -0
  155. package/dist/theme/tokens.js.map +1 -0
  156. package/dist/tsconfig.tsbuildinfo +1 -0
  157. package/dist/types.d.ts +35 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +2 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +10 -4
@@ -23,7 +23,9 @@ __export(flowchart_exports, {
23
23
  FlowchartView: () => FlowchartView,
24
24
  StageNode: () => StageNode,
25
25
  SubflowBreadcrumb: () => SubflowBreadcrumb,
26
+ SubflowTree: () => SubflowTree,
26
27
  TimeTravelDebugger: () => TimeTravelDebugger,
28
+ TracedFlowchartView: () => TracedFlowchartView,
27
29
  specToReactFlow: () => specToReactFlow,
28
30
  useSubflowNavigation: () => useSubflowNavigation
29
31
  });
@@ -102,7 +104,7 @@ var import_jsx_runtime2 = require("react/jsx-runtime");
102
104
  var StageNode = (0, import_react2.memo)(function StageNode2({
103
105
  data
104
106
  }) {
105
- const { label, active, done, error, linked, stepNumbers, dimmed, isSubflow } = data;
107
+ const { label, active, done, error, linked, stepNumbers, dimmed, isSubflow, description } = data;
106
108
  const isOnPath = active || done;
107
109
  const bg = active ? theme.primary : done ? theme.success : error ? theme.error : theme.bgSecondary;
108
110
  const borderColor = active ? theme.primary : done ? theme.success : error ? theme.error : theme.border;
@@ -191,10 +193,11 @@ var StageNode = (0, import_react2.memo)(function StageNode2({
191
193
  background: bg,
192
194
  border: `2px solid ${borderColor}`,
193
195
  borderRadius: theme.radius,
194
- padding: "10px 20px",
196
+ padding: description ? "8px 16px" : "10px 20px",
195
197
  display: "flex",
198
+ flexDirection: "column",
196
199
  alignItems: "center",
197
- gap: 6,
200
+ gap: description ? 2 : 0,
198
201
  boxShadow: shadow,
199
202
  transition: "all 0.3s ease",
200
203
  fontFamily: theme.fontSans,
@@ -202,59 +205,77 @@ var StageNode = (0, import_react2.memo)(function StageNode2({
202
205
  justifyContent: "center"
203
206
  },
204
207
  children: [
205
- done && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 10, color: textColor }, children: "\u2713" }),
206
- active && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
207
- "span",
208
- {
209
- style: {
210
- width: 8,
211
- height: 8,
212
- borderRadius: "50%",
213
- background: "#fff",
214
- animation: "fp-blink 1s ease-in-out infinite",
215
- flexShrink: 0
208
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
209
+ done && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 10, color: textColor }, children: "\u2713" }),
210
+ active && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
211
+ "span",
212
+ {
213
+ style: {
214
+ width: 8,
215
+ height: 8,
216
+ borderRadius: "50%",
217
+ background: "#fff",
218
+ animation: "fp-blink 1s ease-in-out infinite",
219
+ flexShrink: 0
220
+ }
216
221
  }
217
- }
218
- ),
219
- error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 10, color: textColor }, children: "\u2717" }),
220
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
222
+ ),
223
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 10, color: textColor }, children: "\u2717" }),
224
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
225
+ "span",
226
+ {
227
+ style: {
228
+ fontSize: 13,
229
+ fontWeight: 500,
230
+ color: textColor,
231
+ whiteSpace: "nowrap"
232
+ },
233
+ children: label
234
+ }
235
+ ),
236
+ isSubflow && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
237
+ "span",
238
+ {
239
+ style: {
240
+ display: "inline-flex",
241
+ alignItems: "center",
242
+ justifyContent: "center",
243
+ width: 16,
244
+ height: 16,
245
+ borderRadius: 3,
246
+ border: `1.5px solid ${textColor}`,
247
+ position: "relative",
248
+ opacity: 0.7,
249
+ flexShrink: 0
250
+ },
251
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
252
+ "span",
253
+ {
254
+ style: {
255
+ width: 8,
256
+ height: 8,
257
+ borderRadius: 2,
258
+ border: `1px solid ${textColor}`
259
+ }
260
+ }
261
+ )
262
+ }
263
+ )
264
+ ] }),
265
+ description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
221
266
  "span",
222
267
  {
223
268
  style: {
224
- fontSize: 13,
225
- fontWeight: 500,
269
+ fontSize: 10,
270
+ fontWeight: 400,
226
271
  color: textColor,
227
- whiteSpace: "nowrap"
228
- },
229
- children: label
230
- }
231
- ),
232
- isSubflow && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
233
- "span",
234
- {
235
- style: {
236
- display: "inline-flex",
237
- alignItems: "center",
238
- justifyContent: "center",
239
- width: 16,
240
- height: 16,
241
- borderRadius: 3,
242
- border: `1.5px solid ${textColor}`,
243
- position: "relative",
244
272
  opacity: 0.7,
245
- flexShrink: 0
273
+ whiteSpace: "nowrap",
274
+ overflow: "hidden",
275
+ textOverflow: "ellipsis",
276
+ maxWidth: 160
246
277
  },
247
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
248
- "span",
249
- {
250
- style: {
251
- width: 8,
252
- height: 8,
253
- borderRadius: 2,
254
- border: `1px solid ${textColor}`
255
- }
256
- }
257
- )
278
+ children: description
258
279
  }
259
280
  )
260
281
  ]
@@ -398,75 +419,9 @@ function FlowchartView({
398
419
  );
399
420
  }
400
421
 
401
- // src/components/FlowchartView/SubflowBreadcrumb.tsx
402
- var import_react6 = require("react");
403
- var import_jsx_runtime4 = require("react/jsx-runtime");
404
- var SubflowBreadcrumb = (0, import_react6.memo)(function SubflowBreadcrumb2({
405
- breadcrumbs,
406
- onNavigate
407
- }) {
408
- if (breadcrumbs.length <= 1) return null;
409
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
410
- "div",
411
- {
412
- style: {
413
- display: "flex",
414
- alignItems: "center",
415
- gap: 4,
416
- padding: "6px 12px",
417
- background: theme.bgSecondary,
418
- borderBottom: `1px solid ${theme.border}`,
419
- fontSize: 12,
420
- fontFamily: theme.fontSans,
421
- flexShrink: 0,
422
- overflowX: "auto"
423
- },
424
- children: breadcrumbs.map((crumb, i) => {
425
- const isLast = i === breadcrumbs.length - 1;
426
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
427
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { color: theme.textMuted, fontSize: 10 }, children: "\u203A" }),
428
- isLast ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
429
- "span",
430
- {
431
- style: {
432
- color: theme.primary,
433
- fontWeight: 600
434
- },
435
- children: crumb.label
436
- }
437
- ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
438
- "button",
439
- {
440
- onClick: () => onNavigate(i),
441
- style: {
442
- background: "none",
443
- border: "none",
444
- color: theme.textSecondary,
445
- cursor: "pointer",
446
- padding: "2px 4px",
447
- borderRadius: 4,
448
- fontSize: 12,
449
- fontFamily: "inherit",
450
- fontWeight: 500,
451
- transition: "color 0.15s"
452
- },
453
- onMouseEnter: (e) => {
454
- e.currentTarget.style.color = `${theme.primary}`;
455
- },
456
- onMouseLeave: (e) => {
457
- e.currentTarget.style.color = `${theme.textSecondary}`;
458
- },
459
- children: crumb.label
460
- }
461
- )
462
- ] }, i);
463
- })
464
- }
465
- );
466
- });
467
-
468
- // src/components/FlowchartView/useSubflowNavigation.ts
469
- var import_react7 = require("react");
422
+ // src/components/FlowchartView/TracedFlowchartView.tsx
423
+ var import_react9 = require("react");
424
+ var import_react10 = require("@xyflow/react");
470
425
 
471
426
  // src/components/FlowchartView/specToReactFlow.ts
472
427
  var DEFAULT_COLORS = {
@@ -594,6 +549,7 @@ function walk(node, state, x, y) {
594
549
  isDecider,
595
550
  isFork,
596
551
  description: node.description,
552
+ subflowId: node.subflowId,
597
553
  dimmed,
598
554
  stepNumbers,
599
555
  isSubflow: !!node.isSubflowRoot
@@ -648,14 +604,15 @@ function specToReactFlow(spec, overlay, colors) {
648
604
  }
649
605
 
650
606
  // src/components/FlowchartView/useSubflowNavigation.ts
607
+ var import_react6 = require("react");
651
608
  function useSubflowNavigation(rootSpec, overlay, colors) {
652
- const [stack, setStack] = (0, import_react7.useState)([]);
609
+ const [stack, setStack] = (0, import_react6.useState)([]);
653
610
  const currentSpec = stack.length > 0 ? stack[stack.length - 1].spec : rootSpec;
654
- const { nodes, edges } = (0, import_react7.useMemo)(() => {
611
+ const { nodes, edges } = (0, import_react6.useMemo)(() => {
655
612
  if (!currentSpec) return { nodes: [], edges: [] };
656
613
  return specToReactFlow(currentSpec, overlay, colors);
657
614
  }, [currentSpec, overlay, colors]);
658
- const subflowMap = (0, import_react7.useMemo)(() => {
615
+ const subflowMap = (0, import_react6.useMemo)(() => {
659
616
  const map = /* @__PURE__ */ new Map();
660
617
  if (!currentSpec) return map;
661
618
  function collectSubflows(node) {
@@ -669,14 +626,15 @@ function useSubflowNavigation(rootSpec, overlay, colors) {
669
626
  collectSubflows(currentSpec);
670
627
  return map;
671
628
  }, [currentSpec]);
672
- const breadcrumbs = (0, import_react7.useMemo)(() => {
629
+ const breadcrumbs = (0, import_react6.useMemo)(() => {
673
630
  const root = {
674
- label: rootSpec?.name || "Pipeline",
675
- spec: rootSpec
631
+ label: rootSpec?.name || "Flowchart",
632
+ spec: rootSpec,
633
+ description: rootSpec?.description
676
634
  };
677
635
  return [root, ...stack];
678
636
  }, [rootSpec, stack]);
679
- const handleNodeClick = (0, import_react7.useCallback)(
637
+ const handleNodeClick = (0, import_react6.useCallback)(
680
638
  (nodeId) => {
681
639
  const subflowNode = subflowMap.get(nodeId);
682
640
  if (!subflowNode?.subflowStructure) return false;
@@ -684,14 +642,15 @@ function useSubflowNavigation(rootSpec, overlay, colors) {
684
642
  ...prev,
685
643
  {
686
644
  label: subflowNode.subflowName || subflowNode.name,
687
- spec: subflowNode.subflowStructure
645
+ spec: subflowNode.subflowStructure,
646
+ description: subflowNode.description
688
647
  }
689
648
  ]);
690
649
  return true;
691
650
  },
692
651
  [subflowMap]
693
652
  );
694
- const navigateTo = (0, import_react7.useCallback)(
653
+ const navigateTo = (0, import_react6.useCallback)(
695
654
  (level) => {
696
655
  if (level === 0) {
697
656
  setStack([]);
@@ -708,16 +667,486 @@ function useSubflowNavigation(rootSpec, overlay, colors) {
708
667
  handleNodeClick,
709
668
  navigateTo,
710
669
  isInSubflow: stack.length > 0,
711
- currentSubflowNodeName: stack.length > 0 ? stack[0].label : null
670
+ currentSubflowNodeName: stack.length > 0 ? stack[stack.length - 1].label : null
712
671
  };
713
672
  }
714
673
 
715
- // src/components/TimeTravelDebugger/TimeTravelDebugger.tsx
716
- var import_react11 = require("react");
674
+ // src/components/FlowchartView/SubflowBreadcrumb.tsx
675
+ var import_react7 = require("react");
676
+ var import_jsx_runtime4 = require("react/jsx-runtime");
677
+ var SubflowBreadcrumb = (0, import_react7.memo)(function SubflowBreadcrumb2({
678
+ breadcrumbs,
679
+ onNavigate
680
+ }) {
681
+ if (breadcrumbs.length <= 1) return null;
682
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
683
+ "div",
684
+ {
685
+ style: {
686
+ display: "flex",
687
+ alignItems: "center",
688
+ gap: 4,
689
+ padding: "6px 12px",
690
+ background: theme.bgSecondary,
691
+ borderBottom: `1px solid ${theme.border}`,
692
+ fontSize: 12,
693
+ fontFamily: theme.fontSans,
694
+ flexShrink: 0,
695
+ overflowX: "auto"
696
+ },
697
+ children: breadcrumbs.map((crumb, i) => {
698
+ const isLast = i === breadcrumbs.length - 1;
699
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
700
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { color: theme.textMuted, fontSize: 10 }, children: "\u203A" }),
701
+ isLast ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
702
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
703
+ "span",
704
+ {
705
+ style: {
706
+ color: theme.primary,
707
+ fontWeight: 600
708
+ },
709
+ children: crumb.label
710
+ }
711
+ ),
712
+ crumb.description && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
713
+ "span",
714
+ {
715
+ style: {
716
+ color: theme.textMuted,
717
+ fontWeight: 400,
718
+ fontSize: 11
719
+ },
720
+ children: [
721
+ "\u2014 ",
722
+ crumb.description
723
+ ]
724
+ }
725
+ )
726
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
727
+ "button",
728
+ {
729
+ onClick: () => onNavigate(i),
730
+ style: {
731
+ background: "none",
732
+ border: "none",
733
+ color: theme.textSecondary,
734
+ cursor: "pointer",
735
+ padding: "2px 4px",
736
+ borderRadius: 4,
737
+ fontSize: 12,
738
+ fontFamily: "inherit",
739
+ fontWeight: 500,
740
+ transition: "color 0.15s"
741
+ },
742
+ onMouseEnter: (e) => {
743
+ e.currentTarget.style.color = `${theme.primary}`;
744
+ },
745
+ onMouseLeave: (e) => {
746
+ e.currentTarget.style.color = `${theme.textSecondary}`;
747
+ },
748
+ children: crumb.label
749
+ }
750
+ )
751
+ ] }, `${crumb.label}-${i}`);
752
+ })
753
+ }
754
+ );
755
+ });
717
756
 
718
- // src/components/MemoryInspector/MemoryInspector.tsx
757
+ // src/components/FlowchartView/SubflowTree.tsx
719
758
  var import_react8 = require("react");
720
759
  var import_jsx_runtime5 = require("react/jsx-runtime");
760
+ function specToTree(node) {
761
+ const entries = [];
762
+ const seen = /* @__PURE__ */ new Set();
763
+ function walk2(n) {
764
+ const id = n.name || n.id || "";
765
+ if (seen.has(id)) return;
766
+ seen.add(id);
767
+ const entry = {
768
+ name: n.name,
769
+ description: n.description,
770
+ subflowId: n.subflowId,
771
+ isSubflow: !!n.isSubflowRoot
772
+ };
773
+ if (n.isSubflowRoot && n.subflowStructure) {
774
+ entry.children = specToTree(n.subflowStructure);
775
+ }
776
+ entries.push(entry);
777
+ if (n.children) {
778
+ for (const child of n.children) {
779
+ walk2(child);
780
+ }
781
+ }
782
+ if (n.next) {
783
+ walk2(n.next);
784
+ }
785
+ }
786
+ walk2(node);
787
+ return entries;
788
+ }
789
+ var TreeNode = (0, import_react8.memo)(function TreeNode2({
790
+ entry,
791
+ depth,
792
+ activeStage,
793
+ doneStages,
794
+ onNodeSelect
795
+ }) {
796
+ const [expanded, setExpanded] = (0, import_react8.useState)(true);
797
+ const hasChildren = entry.children && entry.children.length > 0;
798
+ const isActive = activeStage === entry.name;
799
+ const isDone = doneStages?.has(entry.name);
800
+ const handleClick = (0, import_react8.useCallback)(() => {
801
+ if (hasChildren) {
802
+ setExpanded((prev) => !prev);
803
+ }
804
+ onNodeSelect?.(entry.name, !!entry.isSubflow);
805
+ }, [hasChildren, onNodeSelect, entry.name, entry.isSubflow]);
806
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
807
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
808
+ "button",
809
+ {
810
+ onClick: handleClick,
811
+ "data-fp": "subflow-tree-node",
812
+ style: {
813
+ display: "flex",
814
+ alignItems: "center",
815
+ gap: 6,
816
+ width: "100%",
817
+ border: "none",
818
+ background: isActive ? `color-mix(in srgb, ${theme.primary} 15%, transparent)` : "transparent",
819
+ cursor: "pointer",
820
+ padding: `4px 8px 4px ${8 + depth * 16}px`,
821
+ fontFamily: theme.fontSans,
822
+ fontSize: 12,
823
+ textAlign: "left",
824
+ borderRadius: 4,
825
+ transition: "background 0.15s"
826
+ },
827
+ onMouseEnter: (e) => {
828
+ if (!isActive) {
829
+ e.currentTarget.style.background = `color-mix(in srgb, ${theme.textMuted} 10%, transparent)`;
830
+ }
831
+ },
832
+ onMouseLeave: (e) => {
833
+ if (!isActive) {
834
+ e.currentTarget.style.background = "transparent";
835
+ }
836
+ },
837
+ children: [
838
+ hasChildren ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
839
+ "span",
840
+ {
841
+ style: {
842
+ fontSize: 10,
843
+ color: theme.textMuted,
844
+ width: 12,
845
+ textAlign: "center",
846
+ flexShrink: 0,
847
+ transition: "transform 0.15s",
848
+ transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
849
+ display: "inline-block"
850
+ },
851
+ children: "\u25B6"
852
+ }
853
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { width: 12, flexShrink: 0 } }),
854
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
855
+ "span",
856
+ {
857
+ style: {
858
+ width: 6,
859
+ height: 6,
860
+ borderRadius: "50%",
861
+ flexShrink: 0,
862
+ background: isActive ? theme.primary : isDone ? theme.success : theme.border
863
+ }
864
+ }
865
+ ),
866
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: { display: "flex", flexDirection: "column", minWidth: 0 }, children: [
867
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
868
+ "span",
869
+ {
870
+ style: {
871
+ color: isActive ? theme.primary : isDone ? theme.textPrimary : theme.textSecondary,
872
+ fontWeight: isActive ? 600 : entry.isSubflow ? 500 : 400,
873
+ whiteSpace: "nowrap",
874
+ overflow: "hidden",
875
+ textOverflow: "ellipsis"
876
+ },
877
+ children: [
878
+ entry.name,
879
+ entry.isSubflow && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { opacity: 0.5, marginLeft: 4, fontSize: 10 }, children: "\u229E" })
880
+ ]
881
+ }
882
+ ),
883
+ entry.description && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
884
+ "span",
885
+ {
886
+ style: {
887
+ color: theme.textMuted,
888
+ fontSize: 10,
889
+ whiteSpace: "nowrap",
890
+ overflow: "hidden",
891
+ textOverflow: "ellipsis"
892
+ },
893
+ children: entry.description
894
+ }
895
+ )
896
+ ] })
897
+ ]
898
+ }
899
+ ),
900
+ hasChildren && expanded && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { children: entry.children.map((child, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
901
+ TreeNode2,
902
+ {
903
+ entry: child,
904
+ depth: depth + 1,
905
+ activeStage,
906
+ doneStages,
907
+ onNodeSelect
908
+ },
909
+ `${child.name}-${i}`
910
+ )) })
911
+ ] });
912
+ });
913
+ var SectionLabel = (0, import_react8.memo)(function SectionLabel2({ children }) {
914
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
915
+ "div",
916
+ {
917
+ style: {
918
+ padding: "4px 12px 8px",
919
+ fontSize: 10,
920
+ fontWeight: 600,
921
+ textTransform: "uppercase",
922
+ letterSpacing: "0.05em",
923
+ color: theme.textMuted
924
+ },
925
+ children
926
+ }
927
+ );
928
+ });
929
+ var SubflowTree = (0, import_react8.memo)(function SubflowTree2({
930
+ spec,
931
+ activeStage,
932
+ doneStages,
933
+ onNodeSelect,
934
+ unstyled = false,
935
+ className,
936
+ style
937
+ }) {
938
+ const tree = (0, import_react8.useMemo)(() => specToTree(spec), [spec]);
939
+ const mainStages = (0, import_react8.useMemo)(() => tree.filter((e) => !e.isSubflow), [tree]);
940
+ const subflowStages = (0, import_react8.useMemo)(() => tree.filter((e) => e.isSubflow), [tree]);
941
+ const renderEntries = (entries) => entries.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
942
+ TreeNode,
943
+ {
944
+ entry,
945
+ depth: 0,
946
+ activeStage,
947
+ doneStages,
948
+ onNodeSelect
949
+ },
950
+ `${entry.name}-${i}`
951
+ ));
952
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
953
+ "div",
954
+ {
955
+ className,
956
+ "data-fp": "subflow-tree",
957
+ style: {
958
+ ...unstyled ? {} : {
959
+ fontFamily: theme.fontSans,
960
+ fontSize: 12,
961
+ background: theme.bgPrimary,
962
+ borderRight: `1px solid ${theme.border}`,
963
+ overflowY: "auto",
964
+ overflowX: "hidden",
965
+ padding: "8px 0"
966
+ },
967
+ ...style
968
+ },
969
+ children: [
970
+ !unstyled && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionLabel, { children: "Flowchart" }),
971
+ renderEntries(mainStages),
972
+ subflowStages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
973
+ !unstyled && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { height: 1, background: theme.border, margin: "8px 12px" } }),
974
+ !unstyled && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionLabel, { children: "Subflows" }),
975
+ renderEntries(subflowStages)
976
+ ] })
977
+ ]
978
+ }
979
+ );
980
+ });
981
+
982
+ // src/components/FlowchartView/TracedFlowchartView.tsx
983
+ var import_jsx_runtime6 = require("react/jsx-runtime");
984
+ var nodeTypes2 = { stage: StageNode };
985
+ function TracedFlowchartView({
986
+ spec,
987
+ snapshots,
988
+ snapshotIndex = 0,
989
+ onNodeClick,
990
+ onSubflowChange,
991
+ showTree = false,
992
+ treeWidth = 200,
993
+ unstyled = false,
994
+ className,
995
+ style
996
+ }) {
997
+ const [treeVisible, setTreeVisible] = (0, import_react9.useState)(showTree);
998
+ const subflowNav = useSubflowNavigation(spec);
999
+ const currentSpec = subflowNav.breadcrumbs.length > 0 ? subflowNav.breadcrumbs[subflowNav.breadcrumbs.length - 1].spec : null;
1000
+ const overlay = (0, import_react9.useMemo)(() => {
1001
+ if (!snapshots || snapshots.length === 0) return void 0;
1002
+ const executionOrder = snapshots.slice(0, snapshotIndex + 1).map((s) => s.stageLabel);
1003
+ const doneStages = new Set(
1004
+ snapshots.slice(0, snapshotIndex).map((s) => s.stageLabel)
1005
+ );
1006
+ const activeStage = snapshots[snapshotIndex]?.stageLabel ?? null;
1007
+ const executedStages = /* @__PURE__ */ new Set([...doneStages]);
1008
+ if (activeStage) executedStages.add(activeStage);
1009
+ return { doneStages, activeStage, executedStages, executionOrder };
1010
+ }, [snapshots, snapshotIndex]);
1011
+ const { nodes, edges } = (0, import_react9.useMemo)(() => {
1012
+ if (!currentSpec) return { nodes: [], edges: [] };
1013
+ return specToReactFlow(currentSpec, overlay);
1014
+ }, [currentSpec, overlay]);
1015
+ const handleNodeClick = (0, import_react9.useCallback)(
1016
+ (_, node) => {
1017
+ if (subflowNav.handleNodeClick(node.id)) {
1018
+ onSubflowChange?.(true, node.id);
1019
+ return;
1020
+ }
1021
+ if (onNodeClick && snapshots) {
1022
+ const idx = snapshots.findIndex((s) => s.stageLabel === node.id);
1023
+ if (idx >= 0) onNodeClick(idx);
1024
+ } else if (onNodeClick) {
1025
+ onNodeClick(node.id);
1026
+ }
1027
+ },
1028
+ [subflowNav, onNodeClick, onSubflowChange, snapshots]
1029
+ );
1030
+ const handleBreadcrumbNavigate = (0, import_react9.useCallback)(
1031
+ (level) => {
1032
+ subflowNav.navigateTo(level);
1033
+ onSubflowChange?.(level > 0, null);
1034
+ },
1035
+ [subflowNav, onSubflowChange]
1036
+ );
1037
+ const handleTreeNodeSelect = (0, import_react9.useCallback)(
1038
+ (name, isSubflow) => {
1039
+ if (isSubflow) {
1040
+ if (subflowNav.handleNodeClick(name)) {
1041
+ onSubflowChange?.(true, name);
1042
+ }
1043
+ } else if (onNodeClick && snapshots) {
1044
+ const idx = snapshots.findIndex((s) => s.stageLabel === name);
1045
+ if (idx >= 0) onNodeClick(idx);
1046
+ }
1047
+ },
1048
+ [subflowNav, onNodeClick, onSubflowChange, snapshots]
1049
+ );
1050
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1051
+ "div",
1052
+ {
1053
+ className,
1054
+ style: { width: "100%", height: "100%", display: "flex", flexDirection: "row", ...style },
1055
+ "data-fp": "traced-flowchart",
1056
+ children: [
1057
+ showTree && treeVisible && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1058
+ SubflowTree,
1059
+ {
1060
+ spec,
1061
+ activeStage: overlay?.activeStage,
1062
+ doneStages: overlay?.doneStages,
1063
+ onNodeSelect: handleTreeNodeSelect,
1064
+ unstyled,
1065
+ style: { width: treeWidth, flexShrink: 0, height: "100%" }
1066
+ }
1067
+ ),
1068
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { flex: 1, display: "flex", flexDirection: "column", minWidth: 0, height: "100%" }, children: [
1069
+ (subflowNav.isInSubflow || showTree && !treeVisible) && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", alignItems: "stretch", flexShrink: 0 }, children: [
1070
+ showTree && !treeVisible && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1071
+ "button",
1072
+ {
1073
+ onClick: () => setTreeVisible(true),
1074
+ "data-fp": "tree-toggle",
1075
+ style: unstyled ? {} : {
1076
+ background: "transparent",
1077
+ border: "none",
1078
+ cursor: "pointer",
1079
+ padding: "6px 8px",
1080
+ fontSize: 10,
1081
+ flexShrink: 0
1082
+ },
1083
+ children: "\u25B6"
1084
+ }
1085
+ ),
1086
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1087
+ SubflowBreadcrumb,
1088
+ {
1089
+ breadcrumbs: subflowNav.breadcrumbs,
1090
+ onNavigate: handleBreadcrumbNavigate
1091
+ }
1092
+ ) })
1093
+ ] }),
1094
+ showTree && treeVisible && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", alignItems: "stretch", flexShrink: 0 }, children: [
1095
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1096
+ "button",
1097
+ {
1098
+ onClick: () => setTreeVisible(false),
1099
+ "data-fp": "tree-toggle",
1100
+ style: unstyled ? {} : {
1101
+ background: "transparent",
1102
+ border: "none",
1103
+ cursor: "pointer",
1104
+ padding: "6px 8px",
1105
+ fontSize: 10,
1106
+ flexShrink: 0
1107
+ },
1108
+ children: "\u25C0"
1109
+ }
1110
+ ),
1111
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { flex: 1 }, children: subflowNav.isInSubflow && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1112
+ SubflowBreadcrumb,
1113
+ {
1114
+ breadcrumbs: subflowNav.breadcrumbs,
1115
+ onNavigate: handleBreadcrumbNavigate
1116
+ }
1117
+ ) })
1118
+ ] }),
1119
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1120
+ import_react10.ReactFlow,
1121
+ {
1122
+ nodes,
1123
+ edges,
1124
+ onNodeClick: handleNodeClick,
1125
+ nodeTypes: nodeTypes2,
1126
+ fitView: true,
1127
+ panOnDrag: false,
1128
+ zoomOnScroll: false,
1129
+ zoomOnPinch: false,
1130
+ zoomOnDoubleClick: false,
1131
+ preventScrolling: false,
1132
+ nodesDraggable: false,
1133
+ nodesConnectable: false,
1134
+ elementsSelectable: !!onNodeClick,
1135
+ children: !unstyled && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react10.Background, { variant: import_react10.BackgroundVariant.Dots, gap: 16, size: 1 })
1136
+ }
1137
+ ) })
1138
+ ] })
1139
+ ]
1140
+ }
1141
+ );
1142
+ }
1143
+
1144
+ // src/components/TimeTravelDebugger/TimeTravelDebugger.tsx
1145
+ var import_react14 = require("react");
1146
+
1147
+ // src/components/MemoryInspector/MemoryInspector.tsx
1148
+ var import_react11 = require("react");
1149
+ var import_jsx_runtime7 = require("react/jsx-runtime");
721
1150
  function MemoryInspector({
722
1151
  data,
723
1152
  snapshots,
@@ -729,7 +1158,7 @@ function MemoryInspector({
729
1158
  className,
730
1159
  style
731
1160
  }) {
732
- const { memory, newKeys } = (0, import_react8.useMemo)(() => {
1161
+ const { memory, newKeys } = (0, import_react11.useMemo)(() => {
733
1162
  if (data) {
734
1163
  return { memory: data, newKeys: /* @__PURE__ */ new Set() };
735
1164
  }
@@ -759,12 +1188,12 @@ function MemoryInspector({
759
1188
  const fs = fontSize[size];
760
1189
  const pad = padding[size];
761
1190
  if (unstyled) {
762
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className, style, "data-fp": "memory-inspector", children: [
763
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { "data-fp": "memory-label", children: "Memory State" }),
764
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("pre", { "data-fp": "memory-json", children: JSON.stringify(memory, null, 2) })
1191
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className, style, "data-fp": "memory-inspector", children: [
1192
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { "data-fp": "memory-label", children: "Memory State" }),
1193
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("pre", { "data-fp": "memory-json", children: JSON.stringify(memory, null, 2) })
765
1194
  ] });
766
1195
  }
767
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1196
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
768
1197
  "div",
769
1198
  {
770
1199
  className,
@@ -775,7 +1204,7 @@ function MemoryInspector({
775
1204
  },
776
1205
  "data-fp": "memory-inspector",
777
1206
  children: [
778
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1207
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
779
1208
  "span",
780
1209
  {
781
1210
  style: {
@@ -788,7 +1217,7 @@ function MemoryInspector({
788
1217
  children: "Memory State"
789
1218
  }
790
1219
  ),
791
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1220
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
792
1221
  "div",
793
1222
  {
794
1223
  style: {
@@ -802,8 +1231,8 @@ function MemoryInspector({
802
1231
  lineHeight: 1.8
803
1232
  },
804
1233
  children: [
805
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: theme.textMuted }, children: "{" }),
806
- entries.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1234
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { color: theme.textMuted }, children: "{" }),
1235
+ entries.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
807
1236
  "div",
808
1237
  {
809
1238
  style: {
@@ -817,7 +1246,7 @@ function MemoryInspector({
817
1246
  entries.map(([key, value], i) => {
818
1247
  const isNew = newKeys.has(key);
819
1248
  const isLast = i === entries.length - 1;
820
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1249
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
821
1250
  "div",
822
1251
  {
823
1252
  style: {
@@ -829,14 +1258,14 @@ function MemoryInspector({
829
1258
  paddingRight: 4
830
1259
  },
831
1260
  children: [
832
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: { color: theme.primary }, children: [
1261
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: { color: theme.primary }, children: [
833
1262
  '"',
834
1263
  key,
835
1264
  '"'
836
1265
  ] }),
837
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: theme.textMuted }, children: ": " }),
838
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: theme.success }, children: formatValue(value) }),
839
- showTypes && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1266
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { color: theme.textMuted }, children: ": " }),
1267
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { color: theme.success }, children: formatValue(value) }),
1268
+ showTypes && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
840
1269
  "span",
841
1270
  {
842
1271
  style: {
@@ -852,13 +1281,13 @@ function MemoryInspector({
852
1281
  ]
853
1282
  }
854
1283
  ),
855
- !isLast && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: theme.textMuted }, children: "," })
1284
+ !isLast && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { color: theme.textMuted }, children: "," })
856
1285
  ]
857
1286
  },
858
1287
  key
859
1288
  );
860
1289
  }),
861
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: theme.textMuted }, children: "}" })
1290
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { color: theme.textMuted }, children: "}" })
862
1291
  ]
863
1292
  }
864
1293
  )
@@ -873,8 +1302,8 @@ function formatValue(value) {
873
1302
  }
874
1303
 
875
1304
  // src/components/NarrativeLog/NarrativeLog.tsx
876
- var import_react9 = require("react");
877
- var import_jsx_runtime6 = require("react/jsx-runtime");
1305
+ var import_react12 = require("react");
1306
+ var import_jsx_runtime8 = require("react/jsx-runtime");
878
1307
  function NarrativeLog({
879
1308
  snapshots,
880
1309
  selectedIndex,
@@ -884,7 +1313,7 @@ function NarrativeLog({
884
1313
  className,
885
1314
  style
886
1315
  }) {
887
- const entries = (0, import_react9.useMemo)(() => {
1316
+ const entries = (0, import_react12.useMemo)(() => {
888
1317
  if (narrative) {
889
1318
  return [{ label: "Output", text: narrative, isCurrent: true }];
890
1319
  }
@@ -898,19 +1327,19 @@ function NarrativeLog({
898
1327
  const fs = fontSize[size];
899
1328
  const pad = padding[size];
900
1329
  if (unstyled) {
901
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className, style, "data-fp": "narrative-log", children: entries.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { "data-fp": "narrative-entry", "data-current": entry.isCurrent, children: [
902
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: entry.label }),
903
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { children: entry.text })
1330
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className, style, "data-fp": "narrative-log", children: entries.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { "data-fp": "narrative-entry", "data-current": entry.isCurrent, children: [
1331
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: entry.label }),
1332
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { children: entry.text })
904
1333
  ] }, i)) });
905
1334
  }
906
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1335
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
907
1336
  "div",
908
1337
  {
909
1338
  className,
910
1339
  style: { padding: pad, fontFamily: theme.fontSans, ...style },
911
1340
  "data-fp": "narrative-log",
912
1341
  children: [
913
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1342
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
914
1343
  "span",
915
1344
  {
916
1345
  style: {
@@ -923,7 +1352,7 @@ function NarrativeLog({
923
1352
  children: "Execution Log"
924
1353
  }
925
1354
  ),
926
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { marginTop: 8, display: "flex", flexDirection: "column" }, children: entries.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1355
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { marginTop: 8, display: "flex", flexDirection: "column" }, children: entries.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
927
1356
  "div",
928
1357
  {
929
1358
  style: {
@@ -933,7 +1362,7 @@ function NarrativeLog({
933
1362
  borderBottom: i < entries.length - 1 ? `1px solid ${theme.border}` : "none"
934
1363
  },
935
1364
  children: [
936
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1365
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
937
1366
  "div",
938
1367
  {
939
1368
  style: {
@@ -945,7 +1374,7 @@ function NarrativeLog({
945
1374
  paddingTop: 5
946
1375
  },
947
1376
  children: [
948
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1377
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
949
1378
  "div",
950
1379
  {
951
1380
  style: {
@@ -957,7 +1386,7 @@ function NarrativeLog({
957
1386
  }
958
1387
  }
959
1388
  ),
960
- i < entries.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1389
+ i < entries.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
961
1390
  "div",
962
1391
  {
963
1392
  style: {
@@ -971,8 +1400,8 @@ function NarrativeLog({
971
1400
  ]
972
1401
  }
973
1402
  ),
974
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
975
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1403
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1404
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
976
1405
  "span",
977
1406
  {
978
1407
  style: {
@@ -983,7 +1412,7 @@ function NarrativeLog({
983
1412
  children: entry.label
984
1413
  }
985
1414
  ),
986
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1415
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
987
1416
  "div",
988
1417
  {
989
1418
  style: {
@@ -1006,8 +1435,8 @@ function NarrativeLog({
1006
1435
  }
1007
1436
 
1008
1437
  // src/components/GanttTimeline/GanttTimeline.tsx
1009
- var import_react10 = require("react");
1010
- var import_jsx_runtime7 = require("react/jsx-runtime");
1438
+ var import_react13 = require("react");
1439
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1011
1440
  function GanttTimeline({
1012
1441
  snapshots,
1013
1442
  selectedIndex = 0,
@@ -1015,9 +1444,13 @@ function GanttTimeline({
1015
1444
  size = "default",
1016
1445
  unstyled = false,
1017
1446
  className,
1018
- style
1447
+ style,
1448
+ maxVisibleRows = 5
1019
1449
  }) {
1020
- const totalWallTime = (0, import_react10.useMemo)(
1450
+ const [expanded, setExpanded] = (0, import_react13.useState)(false);
1451
+ const activeRowRef = (0, import_react13.useRef)(null);
1452
+ const scrollContainerRef = (0, import_react13.useRef)(null);
1453
+ const totalWallTime = (0, import_react13.useMemo)(
1021
1454
  () => Math.max(...snapshots.map((s) => s.startMs + s.durationMs), 1),
1022
1455
  [snapshots]
1023
1456
  );
@@ -1025,8 +1458,19 @@ function GanttTimeline({
1025
1458
  const pad = padding[size];
1026
1459
  const labelWidth = size === "compact" ? 50 : size === "detailed" ? 100 : 80;
1027
1460
  const msWidth = size === "compact" ? 28 : 36;
1461
+ const rowHeight = size === "compact" ? 18 : 22;
1462
+ const collapsible = maxVisibleRows > 0 && snapshots.length > maxVisibleRows;
1463
+ const showAll = expanded || !collapsible;
1464
+ (0, import_react13.useEffect)(() => {
1465
+ if (!showAll && activeRowRef.current && scrollContainerRef.current) {
1466
+ activeRowRef.current.scrollIntoView({
1467
+ block: "nearest",
1468
+ behavior: "smooth"
1469
+ });
1470
+ }
1471
+ }, [selectedIndex, showAll]);
1028
1472
  if (unstyled) {
1029
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className, style, "data-fp": "gantt-timeline", children: snapshots.map((snap, idx) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1473
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className, style, "data-fp": "gantt-timeline", children: snapshots.map((snap, idx) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1030
1474
  "div",
1031
1475
  {
1032
1476
  "data-fp": "gantt-bar",
@@ -1034,8 +1478,8 @@ function GanttTimeline({
1034
1478
  "data-visible": idx <= selectedIndex,
1035
1479
  onClick: () => onSelect?.(idx),
1036
1480
  children: [
1037
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { "data-fp": "gantt-label", children: snap.stageLabel }),
1038
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { "data-fp": "gantt-duration", children: [
1481
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { "data-fp": "gantt-label", children: snap.stageLabel }),
1482
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { "data-fp": "gantt-duration", children: [
1039
1483
  snap.durationMs,
1040
1484
  "ms"
1041
1485
  ] })
@@ -1044,43 +1488,79 @@ function GanttTimeline({
1044
1488
  snap.stageName
1045
1489
  )) });
1046
1490
  }
1047
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1491
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1048
1492
  "div",
1049
1493
  {
1050
1494
  className,
1051
1495
  style: { padding: pad, fontFamily: theme.fontSans, ...style },
1052
1496
  "data-fp": "gantt-timeline",
1053
1497
  children: [
1054
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1055
- "span",
1498
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1499
+ "div",
1056
1500
  {
1057
1501
  style: {
1058
- fontSize: fs.label,
1059
- fontWeight: 600,
1060
- color: theme.textMuted,
1061
- textTransform: "uppercase",
1062
- letterSpacing: "0.08em"
1502
+ display: "flex",
1503
+ alignItems: "center",
1504
+ justifyContent: "space-between"
1063
1505
  },
1064
- children: size === "compact" ? "Timeline" : "Execution Timeline"
1506
+ children: [
1507
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1508
+ "span",
1509
+ {
1510
+ style: {
1511
+ fontSize: fs.label,
1512
+ fontWeight: 600,
1513
+ color: theme.textMuted,
1514
+ textTransform: "uppercase",
1515
+ letterSpacing: "0.08em"
1516
+ },
1517
+ children: size === "compact" ? "Timeline" : "Execution Timeline"
1518
+ }
1519
+ ),
1520
+ collapsible && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1521
+ "button",
1522
+ {
1523
+ onClick: () => setExpanded((e) => !e),
1524
+ style: {
1525
+ background: "none",
1526
+ border: `1px solid ${theme.border}`,
1527
+ borderRadius: 4,
1528
+ color: theme.textSecondary,
1529
+ fontSize: fs.small,
1530
+ padding: "2px 8px",
1531
+ cursor: "pointer",
1532
+ fontFamily: theme.fontSans
1533
+ },
1534
+ children: expanded ? "Collapse" : `${snapshots.length - maxVisibleRows} more...`
1535
+ }
1536
+ )
1537
+ ]
1065
1538
  }
1066
1539
  ),
1067
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1540
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1068
1541
  "div",
1069
1542
  {
1543
+ ref: scrollContainerRef,
1070
1544
  style: {
1071
1545
  marginTop: 8,
1072
1546
  display: "flex",
1073
1547
  flexDirection: "column",
1074
- gap: 4
1548
+ gap: 4,
1549
+ ...showAll ? {} : {
1550
+ maxHeight: maxVisibleRows * (rowHeight + 4),
1551
+ overflowY: "auto",
1552
+ scrollbarWidth: "thin"
1553
+ }
1075
1554
  },
1076
1555
  children: snapshots.map((snap, idx) => {
1077
1556
  const leftPct = snap.startMs / totalWallTime * 100;
1078
1557
  const widthPct = Math.max(snap.durationMs / totalWallTime * 100, 1);
1079
1558
  const isSelected = idx === selectedIndex;
1080
1559
  const isVisible = idx <= selectedIndex;
1081
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1560
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1082
1561
  "div",
1083
1562
  {
1563
+ ref: isSelected ? activeRowRef : void 0,
1084
1564
  onClick: () => onSelect?.(idx),
1085
1565
  style: {
1086
1566
  display: "flex",
@@ -1088,10 +1568,12 @@ function GanttTimeline({
1088
1568
  gap: size === "compact" ? 4 : 8,
1089
1569
  cursor: onSelect ? "pointer" : "default",
1090
1570
  opacity: isVisible ? 1 : 0.3,
1091
- transition: "opacity 0.3s ease"
1571
+ transition: "opacity 0.3s ease",
1572
+ height: rowHeight,
1573
+ flexShrink: 0
1092
1574
  },
1093
1575
  children: [
1094
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1576
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1095
1577
  "span",
1096
1578
  {
1097
1579
  style: {
@@ -1108,7 +1590,7 @@ function GanttTimeline({
1108
1590
  children: snap.stageLabel
1109
1591
  }
1110
1592
  ),
1111
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1593
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1112
1594
  "div",
1113
1595
  {
1114
1596
  style: {
@@ -1118,7 +1600,7 @@ function GanttTimeline({
1118
1600
  background: theme.bgTertiary,
1119
1601
  borderRadius: 3
1120
1602
  },
1121
- children: isVisible && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1603
+ children: isVisible && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1122
1604
  "div",
1123
1605
  {
1124
1606
  style: {
@@ -1135,7 +1617,7 @@ function GanttTimeline({
1135
1617
  )
1136
1618
  }
1137
1619
  ),
1138
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1620
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1139
1621
  "span",
1140
1622
  {
1141
1623
  style: {
@@ -1158,7 +1640,7 @@ function GanttTimeline({
1158
1640
  })
1159
1641
  }
1160
1642
  ),
1161
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1643
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1162
1644
  "div",
1163
1645
  {
1164
1646
  style: {
@@ -1172,12 +1654,12 @@ function GanttTimeline({
1172
1654
  fontFamily: theme.fontMono
1173
1655
  },
1174
1656
  children: [
1175
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: "0ms" }),
1176
- size !== "compact" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
1657
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "0ms" }),
1658
+ size !== "compact" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
1177
1659
  (totalWallTime / 2).toFixed(1),
1178
1660
  "ms"
1179
1661
  ] }),
1180
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
1662
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
1181
1663
  totalWallTime.toFixed(1),
1182
1664
  "ms"
1183
1665
  ] })
@@ -1190,7 +1672,7 @@ function GanttTimeline({
1190
1672
  }
1191
1673
 
1192
1674
  // src/components/TimeTravelDebugger/TimeTravelDebugger.tsx
1193
- var import_jsx_runtime8 = require("react/jsx-runtime");
1675
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1194
1676
  function TimeTravelDebugger({
1195
1677
  snapshots,
1196
1678
  nodes,
@@ -1203,11 +1685,11 @@ function TimeTravelDebugger({
1203
1685
  className,
1204
1686
  style
1205
1687
  }) {
1206
- const [selectedIndex, setSelectedIndex] = (0, import_react11.useState)(0);
1688
+ const [selectedIndex, setSelectedIndex] = (0, import_react14.useState)(0);
1207
1689
  const fs = fontSize[size];
1208
1690
  const pad = padding[size];
1209
1691
  if (snapshots.length === 0) {
1210
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1692
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1211
1693
  "div",
1212
1694
  {
1213
1695
  className,
@@ -1223,9 +1705,9 @@ function TimeTravelDebugger({
1223
1705
  }
1224
1706
  const isHorizontal = layout === "horizontal";
1225
1707
  if (unstyled) {
1226
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className, style, "data-fp": "time-travel-debugger", children: [
1227
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { children: title }),
1228
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1708
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className, style, "data-fp": "time-travel-debugger", children: [
1709
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: title }),
1710
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1229
1711
  "input",
1230
1712
  {
1231
1713
  type: "range",
@@ -1235,7 +1717,7 @@ function TimeTravelDebugger({
1235
1717
  onChange: (e) => setSelectedIndex(parseInt(e.target.value))
1236
1718
  }
1237
1719
  ),
1238
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1720
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1239
1721
  FlowchartView,
1240
1722
  {
1241
1723
  nodes,
@@ -1246,7 +1728,7 @@ function TimeTravelDebugger({
1246
1728
  unstyled: true
1247
1729
  }
1248
1730
  ),
1249
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1731
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1250
1732
  MemoryInspector,
1251
1733
  {
1252
1734
  snapshots,
@@ -1254,7 +1736,7 @@ function TimeTravelDebugger({
1254
1736
  unstyled: true
1255
1737
  }
1256
1738
  ),
1257
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1739
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1258
1740
  NarrativeLog,
1259
1741
  {
1260
1742
  snapshots,
@@ -1262,7 +1744,7 @@ function TimeTravelDebugger({
1262
1744
  unstyled: true
1263
1745
  }
1264
1746
  ),
1265
- showGantt && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1747
+ showGantt && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1266
1748
  GanttTimeline,
1267
1749
  {
1268
1750
  snapshots,
@@ -1273,7 +1755,7 @@ function TimeTravelDebugger({
1273
1755
  )
1274
1756
  ] });
1275
1757
  }
1276
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1758
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1277
1759
  "div",
1278
1760
  {
1279
1761
  className,
@@ -1288,7 +1770,7 @@ function TimeTravelDebugger({
1288
1770
  },
1289
1771
  "data-fp": "time-travel-debugger",
1290
1772
  children: [
1291
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1773
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1292
1774
  "div",
1293
1775
  {
1294
1776
  style: {
@@ -1298,7 +1780,7 @@ function TimeTravelDebugger({
1298
1780
  flexShrink: 0
1299
1781
  },
1300
1782
  children: [
1301
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1783
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1302
1784
  "div",
1303
1785
  {
1304
1786
  style: {
@@ -1308,7 +1790,7 @@ function TimeTravelDebugger({
1308
1790
  marginBottom: 8
1309
1791
  },
1310
1792
  children: [
1311
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1793
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1312
1794
  "span",
1313
1795
  {
1314
1796
  style: {
@@ -1319,7 +1801,7 @@ function TimeTravelDebugger({
1319
1801
  children: title
1320
1802
  }
1321
1803
  ),
1322
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1804
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1323
1805
  "span",
1324
1806
  {
1325
1807
  style: {
@@ -1332,8 +1814,8 @@ function TimeTravelDebugger({
1332
1814
  ]
1333
1815
  }
1334
1816
  ),
1335
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1336
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1817
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1818
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1337
1819
  ScrubButton,
1338
1820
  {
1339
1821
  label: "\\u25C0",
@@ -1341,7 +1823,7 @@ function TimeTravelDebugger({
1341
1823
  onClick: () => setSelectedIndex((i) => Math.max(0, i - 1))
1342
1824
  }
1343
1825
  ),
1344
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1826
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1345
1827
  "input",
1346
1828
  {
1347
1829
  type: "range",
@@ -1357,7 +1839,7 @@ function TimeTravelDebugger({
1357
1839
  }
1358
1840
  }
1359
1841
  ),
1360
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1842
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1361
1843
  ScrubButton,
1362
1844
  {
1363
1845
  label: "\\u25B6",
@@ -1365,7 +1847,7 @@ function TimeTravelDebugger({
1365
1847
  onClick: () => setSelectedIndex((i) => Math.min(snapshots.length - 1, i + 1))
1366
1848
  }
1367
1849
  ),
1368
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1850
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1369
1851
  "span",
1370
1852
  {
1371
1853
  style: {
@@ -1385,7 +1867,7 @@ function TimeTravelDebugger({
1385
1867
  ]
1386
1868
  }
1387
1869
  ),
1388
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1870
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1389
1871
  "div",
1390
1872
  {
1391
1873
  style: {
@@ -1395,7 +1877,7 @@ function TimeTravelDebugger({
1395
1877
  overflow: "hidden"
1396
1878
  },
1397
1879
  children: [
1398
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1880
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1399
1881
  "div",
1400
1882
  {
1401
1883
  style: {
@@ -1404,7 +1886,7 @@ function TimeTravelDebugger({
1404
1886
  borderRight: isHorizontal ? `1px solid ${theme.border}` : "none",
1405
1887
  borderBottom: !isHorizontal ? `1px solid ${theme.border}` : "none"
1406
1888
  },
1407
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1889
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1408
1890
  FlowchartView,
1409
1891
  {
1410
1892
  nodes,
@@ -1417,8 +1899,8 @@ function TimeTravelDebugger({
1417
1899
  )
1418
1900
  }
1419
1901
  ),
1420
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { flex: 1, overflow: "auto" }, children: [
1421
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1902
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { flex: 1, overflow: "auto" }, children: [
1903
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1422
1904
  MemoryInspector,
1423
1905
  {
1424
1906
  snapshots,
@@ -1426,7 +1908,7 @@ function TimeTravelDebugger({
1426
1908
  size
1427
1909
  }
1428
1910
  ),
1429
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1911
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1430
1912
  "div",
1431
1913
  {
1432
1914
  style: {
@@ -1436,7 +1918,7 @@ function TimeTravelDebugger({
1436
1918
  }
1437
1919
  }
1438
1920
  ),
1439
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1921
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1440
1922
  NarrativeLog,
1441
1923
  {
1442
1924
  snapshots,
@@ -1448,7 +1930,7 @@ function TimeTravelDebugger({
1448
1930
  ]
1449
1931
  }
1450
1932
  ),
1451
- showGantt && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1933
+ showGantt && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1452
1934
  "div",
1453
1935
  {
1454
1936
  style: {
@@ -1456,7 +1938,7 @@ function TimeTravelDebugger({
1456
1938
  background: theme.bgSecondary,
1457
1939
  flexShrink: 0
1458
1940
  },
1459
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1941
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1460
1942
  GanttTimeline,
1461
1943
  {
1462
1944
  snapshots,
@@ -1476,7 +1958,7 @@ function ScrubButton({
1476
1958
  disabled,
1477
1959
  onClick
1478
1960
  }) {
1479
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1961
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1480
1962
  "button",
1481
1963
  {
1482
1964
  onClick,
@@ -1505,7 +1987,9 @@ function ScrubButton({
1505
1987
  FlowchartView,
1506
1988
  StageNode,
1507
1989
  SubflowBreadcrumb,
1990
+ SubflowTree,
1508
1991
  TimeTravelDebugger,
1992
+ TracedFlowchartView,
1509
1993
  specToReactFlow,
1510
1994
  useSubflowNavigation
1511
1995
  });