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.
- package/README.md +42 -3
- package/dist/adapters/fromRuntimeSnapshot.d.ts +52 -0
- package/dist/adapters/fromRuntimeSnapshot.d.ts.map +1 -0
- package/dist/adapters/fromRuntimeSnapshot.js +97 -0
- package/dist/adapters/fromRuntimeSnapshot.js.map +1 -0
- package/dist/components/ExplainableShell/ExplainableShell.d.ts +26 -0
- package/dist/components/ExplainableShell/ExplainableShell.d.ts.map +1 -0
- package/dist/components/ExplainableShell/ExplainableShell.js +94 -0
- package/dist/components/ExplainableShell/ExplainableShell.js.map +1 -0
- package/dist/components/ExplainableShell/index.d.ts +3 -0
- package/dist/components/ExplainableShell/index.d.ts.map +1 -0
- package/dist/components/ExplainableShell/index.js +2 -0
- package/dist/components/ExplainableShell/index.js.map +1 -0
- package/dist/components/FlowchartView/FlowchartView.d.ts +20 -0
- package/dist/components/FlowchartView/FlowchartView.d.ts.map +1 -0
- package/dist/components/FlowchartView/FlowchartView.js +80 -0
- package/dist/components/FlowchartView/FlowchartView.js.map +1 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts +11 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts.map +1 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.js +49 -0
- package/dist/components/FlowchartView/SubflowBreadcrumb.js.map +1 -0
- package/dist/components/FlowchartView/SubflowTree.d.ts +36 -0
- package/dist/components/FlowchartView/SubflowTree.d.ts.map +1 -0
- package/dist/components/FlowchartView/SubflowTree.js +143 -0
- package/dist/components/FlowchartView/SubflowTree.js.map +1 -0
- package/dist/components/FlowchartView/TracedFlowchartView.d.ts +20 -0
- package/dist/components/FlowchartView/TracedFlowchartView.d.ts.map +1 -0
- package/dist/components/FlowchartView/TracedFlowchartView.js +101 -0
- package/dist/components/FlowchartView/TracedFlowchartView.js.map +1 -0
- package/dist/components/FlowchartView/index.d.ts +11 -0
- package/dist/components/FlowchartView/index.d.ts.map +1 -0
- package/dist/components/FlowchartView/index.js +6 -0
- package/dist/components/FlowchartView/index.js.map +1 -0
- package/dist/components/FlowchartView/specToReactFlow.d.ts +56 -0
- package/dist/components/FlowchartView/specToReactFlow.d.ts.map +1 -0
- package/dist/components/FlowchartView/specToReactFlow.js +202 -0
- package/dist/components/FlowchartView/specToReactFlow.js.map +1 -0
- package/dist/components/FlowchartView/useSubflowNavigation.d.ts +35 -0
- package/dist/components/FlowchartView/useSubflowNavigation.d.ts.map +1 -0
- package/dist/components/FlowchartView/useSubflowNavigation.js +80 -0
- package/dist/components/FlowchartView/useSubflowNavigation.js.map +1 -0
- package/dist/components/GanttTimeline/GanttTimeline.d.ts +18 -0
- package/dist/components/GanttTimeline/GanttTimeline.d.ts.map +1 -0
- package/dist/components/GanttTimeline/GanttTimeline.js +123 -0
- package/dist/components/GanttTimeline/GanttTimeline.js.map +1 -0
- package/dist/components/GanttTimeline/index.d.ts +3 -0
- package/dist/components/GanttTimeline/index.d.ts.map +1 -0
- package/dist/components/GanttTimeline/index.js +2 -0
- package/dist/components/GanttTimeline/index.js.map +1 -0
- package/dist/components/MemoryInspector/MemoryInspector.d.ts +19 -0
- package/dist/components/MemoryInspector/MemoryInspector.d.ts.map +1 -0
- package/dist/components/MemoryInspector/MemoryInspector.js +95 -0
- package/dist/components/MemoryInspector/MemoryInspector.js.map +1 -0
- package/dist/components/MemoryInspector/index.d.ts +3 -0
- package/dist/components/MemoryInspector/index.d.ts.map +1 -0
- package/dist/components/MemoryInspector/index.js +2 -0
- package/dist/components/MemoryInspector/index.js.map +1 -0
- package/dist/components/NarrativeLog/NarrativeLog.d.ts +15 -0
- package/dist/components/NarrativeLog/NarrativeLog.d.ts.map +1 -0
- package/dist/components/NarrativeLog/NarrativeLog.js +65 -0
- package/dist/components/NarrativeLog/NarrativeLog.js.map +1 -0
- package/dist/components/NarrativeLog/index.d.ts +3 -0
- package/dist/components/NarrativeLog/index.d.ts.map +1 -0
- package/dist/components/NarrativeLog/index.js +2 -0
- package/dist/components/NarrativeLog/index.js.map +1 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.d.ts +13 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.d.ts.map +1 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.js +127 -0
- package/dist/components/NarrativeTrace/NarrativeTrace.js.map +1 -0
- package/dist/components/NarrativeTrace/index.d.ts +3 -0
- package/dist/components/NarrativeTrace/index.d.ts.map +1 -0
- package/dist/components/NarrativeTrace/index.js +2 -0
- package/dist/components/NarrativeTrace/index.js.map +1 -0
- package/dist/components/ResultPanel/ResultPanel.d.ts +11 -0
- package/dist/components/ResultPanel/ResultPanel.d.ts.map +1 -0
- package/dist/components/ResultPanel/ResultPanel.js +54 -0
- package/dist/components/ResultPanel/ResultPanel.js.map +1 -0
- package/dist/components/ResultPanel/index.d.ts +3 -0
- package/dist/components/ResultPanel/index.d.ts.map +1 -0
- package/dist/components/ResultPanel/index.js +2 -0
- package/dist/components/ResultPanel/index.js.map +1 -0
- package/dist/components/ScopeDiff/ScopeDiff.d.ts +17 -0
- package/dist/components/ScopeDiff/ScopeDiff.d.ts.map +1 -0
- package/dist/components/ScopeDiff/ScopeDiff.js +87 -0
- package/dist/components/ScopeDiff/ScopeDiff.js.map +1 -0
- package/dist/components/ScopeDiff/index.d.ts +3 -0
- package/dist/components/ScopeDiff/index.d.ts.map +1 -0
- package/dist/components/ScopeDiff/index.js +2 -0
- package/dist/components/ScopeDiff/index.js.map +1 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.d.ts +17 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.d.ts.map +1 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.js +85 -0
- package/dist/components/SnapshotPanel/SnapshotPanel.js.map +1 -0
- package/dist/components/SnapshotPanel/index.d.ts +3 -0
- package/dist/components/SnapshotPanel/index.d.ts.map +1 -0
- package/dist/components/SnapshotPanel/index.js +2 -0
- package/dist/components/SnapshotPanel/index.js.map +1 -0
- package/dist/components/StageNode/StageNode.d.ts +31 -0
- package/dist/components/StageNode/StageNode.d.ts.map +1 -0
- package/dist/components/StageNode/StageNode.js +134 -0
- package/dist/components/StageNode/StageNode.js.map +1 -0
- package/dist/components/StageNode/index.d.ts +3 -0
- package/dist/components/StageNode/index.d.ts.map +1 -0
- package/dist/components/StageNode/index.js +2 -0
- package/dist/components/StageNode/index.js.map +1 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.d.ts +13 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.d.ts.map +1 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.js +104 -0
- package/dist/components/TimeTravelControls/TimeTravelControls.js.map +1 -0
- package/dist/components/TimeTravelControls/index.d.ts +3 -0
- package/dist/components/TimeTravelControls/index.d.ts.map +1 -0
- package/dist/components/TimeTravelControls/index.js +2 -0
- package/dist/components/TimeTravelControls/index.js.map +1 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts +22 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts.map +1 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js +104 -0
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js.map +1 -0
- package/dist/components/TimeTravelDebugger/index.d.ts +3 -0
- package/dist/components/TimeTravelDebugger/index.d.ts.map +1 -0
- package/dist/components/TimeTravelDebugger/index.js +2 -0
- package/dist/components/TimeTravelDebugger/index.js.map +1 -0
- package/dist/flowchart.cjs +704 -220
- package/dist/flowchart.cjs.map +1 -1
- package/dist/flowchart.d.cts +55 -1
- package/dist/flowchart.d.ts +55 -1
- package/dist/flowchart.d.ts.map +1 -0
- package/dist/flowchart.js +700 -214
- package/dist/flowchart.js.map +1 -1
- package/dist/index.cjs +849 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +95 -3
- package/dist/index.d.ts +95 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +851 -80
- package/dist/index.js.map +1 -1
- package/dist/theme/ThemeProvider.d.ts +13 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +16 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/index.d.ts +7 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +5 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/presets.d.ts +15 -0
- package/dist/theme/presets.d.ts.map +1 -0
- package/dist/theme/presets.js +70 -0
- package/dist/theme/presets.js.map +1 -0
- package/dist/theme/styles.d.ts +32 -0
- package/dist/theme/styles.d.ts.map +1 -0
- package/dist/theme/styles.js +37 -0
- package/dist/theme/styles.js.map +1 -0
- package/dist/theme/tokens.d.ts +28 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +58 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +10 -4
package/dist/flowchart.cjs
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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:
|
|
225
|
-
fontWeight:
|
|
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
|
-
|
|
273
|
+
whiteSpace: "nowrap",
|
|
274
|
+
overflow: "hidden",
|
|
275
|
+
textOverflow: "ellipsis",
|
|
276
|
+
maxWidth: 160
|
|
246
277
|
},
|
|
247
|
-
children:
|
|
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/
|
|
402
|
-
var
|
|
403
|
-
var
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
629
|
+
const breadcrumbs = (0, import_react6.useMemo)(() => {
|
|
673
630
|
const root = {
|
|
674
|
-
label: rootSpec?.name || "
|
|
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,
|
|
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,
|
|
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[
|
|
670
|
+
currentSubflowNodeName: stack.length > 0 ? stack[stack.length - 1].label : null
|
|
712
671
|
};
|
|
713
672
|
}
|
|
714
673
|
|
|
715
|
-
// src/components/
|
|
716
|
-
var
|
|
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/
|
|
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,
|
|
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,
|
|
763
|
-
/* @__PURE__ */ (0,
|
|
764
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
806
|
-
entries.length === 0 && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
838
|
-
/* @__PURE__ */ (0,
|
|
839
|
-
showTypes && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
877
|
-
var
|
|
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,
|
|
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,
|
|
902
|
-
/* @__PURE__ */ (0,
|
|
903
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
975
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1010
|
-
var
|
|
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
|
|
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,
|
|
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,
|
|
1038
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1055
|
-
"
|
|
1498
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
1499
|
+
"div",
|
|
1056
1500
|
{
|
|
1057
1501
|
style: {
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
textTransform: "uppercase",
|
|
1062
|
-
letterSpacing: "0.08em"
|
|
1502
|
+
display: "flex",
|
|
1503
|
+
alignItems: "center",
|
|
1504
|
+
justifyContent: "space-between"
|
|
1063
1505
|
},
|
|
1064
|
-
children:
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1176
|
-
size !== "compact" && /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
1227
|
-
/* @__PURE__ */ (0,
|
|
1228
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1336
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1421
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
});
|