footprint-explainable-ui 0.20.0 → 0.22.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 +1 -0
- package/dist/flowchart.cjs +1366 -343
- package/dist/flowchart.cjs.map +1 -1
- package/dist/flowchart.d.cts +513 -6
- package/dist/flowchart.d.ts +513 -6
- package/dist/flowchart.js +1257 -262
- package/dist/flowchart.js.map +1 -1
- package/dist/index.cjs +941 -436
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +852 -352
- package/dist/index.js.map +1 -1
- package/package.json +10 -3
- package/dist/adapters/fromRuntimeSnapshot.d.ts +0 -81
- package/dist/adapters/fromRuntimeSnapshot.d.ts.map +0 -1
- package/dist/adapters/fromRuntimeSnapshot.js +0 -226
- package/dist/adapters/fromRuntimeSnapshot.js.map +0 -1
- package/dist/components/ExplainableShell/ExplainableShell.d.ts +0 -169
- package/dist/components/ExplainableShell/ExplainableShell.d.ts.map +0 -1
- package/dist/components/ExplainableShell/ExplainableShell.js +0 -702
- package/dist/components/ExplainableShell/ExplainableShell.js.map +0 -1
- package/dist/components/ExplainableShell/index.d.ts +0 -3
- package/dist/components/ExplainableShell/index.d.ts.map +0 -1
- package/dist/components/ExplainableShell/index.js +0 -2
- package/dist/components/ExplainableShell/index.js.map +0 -1
- package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts +0 -11
- package/dist/components/FlowchartView/SubflowBreadcrumb.d.ts.map +0 -1
- package/dist/components/FlowchartView/SubflowBreadcrumb.js +0 -49
- package/dist/components/FlowchartView/SubflowBreadcrumb.js.map +0 -1
- package/dist/components/FlowchartView/SubflowTree.d.ts +0 -29
- package/dist/components/FlowchartView/SubflowTree.d.ts.map +0 -1
- package/dist/components/FlowchartView/SubflowTree.js +0 -153
- package/dist/components/FlowchartView/SubflowTree.js.map +0 -1
- package/dist/components/FlowchartView/index.d.ts +0 -39
- package/dist/components/FlowchartView/index.d.ts.map +0 -1
- package/dist/components/FlowchartView/index.js +0 -26
- package/dist/components/FlowchartView/index.js.map +0 -1
- package/dist/components/FlowchartView/useSubflowNavigation.d.ts +0 -60
- package/dist/components/FlowchartView/useSubflowNavigation.d.ts.map +0 -1
- package/dist/components/FlowchartView/useSubflowNavigation.js +0 -99
- package/dist/components/FlowchartView/useSubflowNavigation.js.map +0 -1
- package/dist/components/GanttTimeline/GanttTimeline.d.ts +0 -18
- package/dist/components/GanttTimeline/GanttTimeline.d.ts.map +0 -1
- package/dist/components/GanttTimeline/GanttTimeline.js +0 -123
- package/dist/components/GanttTimeline/GanttTimeline.js.map +0 -1
- package/dist/components/GanttTimeline/index.d.ts +0 -3
- package/dist/components/GanttTimeline/index.d.ts.map +0 -1
- package/dist/components/GanttTimeline/index.js +0 -2
- package/dist/components/GanttTimeline/index.js.map +0 -1
- package/dist/components/MemoryInspector/MemoryInspector.d.ts +0 -19
- package/dist/components/MemoryInspector/MemoryInspector.d.ts.map +0 -1
- package/dist/components/MemoryInspector/MemoryInspector.js +0 -118
- package/dist/components/MemoryInspector/MemoryInspector.js.map +0 -1
- package/dist/components/MemoryInspector/index.d.ts +0 -3
- package/dist/components/MemoryInspector/index.d.ts.map +0 -1
- package/dist/components/MemoryInspector/index.js +0 -2
- package/dist/components/MemoryInspector/index.js.map +0 -1
- package/dist/components/NarrativeLog/NarrativeLog.d.ts +0 -15
- package/dist/components/NarrativeLog/NarrativeLog.d.ts.map +0 -1
- package/dist/components/NarrativeLog/NarrativeLog.js +0 -65
- package/dist/components/NarrativeLog/NarrativeLog.js.map +0 -1
- package/dist/components/NarrativeLog/index.d.ts +0 -3
- package/dist/components/NarrativeLog/index.d.ts.map +0 -1
- package/dist/components/NarrativeLog/index.js +0 -2
- package/dist/components/NarrativeLog/index.js.map +0 -1
- package/dist/components/NarrativeTrace/NarrativeTrace.d.ts +0 -13
- package/dist/components/NarrativeTrace/NarrativeTrace.d.ts.map +0 -1
- package/dist/components/NarrativeTrace/NarrativeTrace.js +0 -134
- package/dist/components/NarrativeTrace/NarrativeTrace.js.map +0 -1
- package/dist/components/NarrativeTrace/index.d.ts +0 -3
- package/dist/components/NarrativeTrace/index.d.ts.map +0 -1
- package/dist/components/NarrativeTrace/index.js +0 -2
- package/dist/components/NarrativeTrace/index.js.map +0 -1
- package/dist/components/ResultPanel/ResultPanel.d.ts +0 -11
- package/dist/components/ResultPanel/ResultPanel.d.ts.map +0 -1
- package/dist/components/ResultPanel/ResultPanel.js +0 -54
- package/dist/components/ResultPanel/ResultPanel.js.map +0 -1
- package/dist/components/ResultPanel/index.d.ts +0 -3
- package/dist/components/ResultPanel/index.d.ts.map +0 -1
- package/dist/components/ResultPanel/index.js +0 -2
- package/dist/components/ResultPanel/index.js.map +0 -1
- package/dist/components/ScopeDiff/ScopeDiff.d.ts +0 -17
- package/dist/components/ScopeDiff/ScopeDiff.d.ts.map +0 -1
- package/dist/components/ScopeDiff/ScopeDiff.js +0 -87
- package/dist/components/ScopeDiff/ScopeDiff.js.map +0 -1
- package/dist/components/ScopeDiff/index.d.ts +0 -3
- package/dist/components/ScopeDiff/index.d.ts.map +0 -1
- package/dist/components/ScopeDiff/index.js +0 -2
- package/dist/components/ScopeDiff/index.js.map +0 -1
- package/dist/components/SnapshotPanel/SnapshotPanel.d.ts +0 -17
- package/dist/components/SnapshotPanel/SnapshotPanel.d.ts.map +0 -1
- package/dist/components/SnapshotPanel/SnapshotPanel.js +0 -85
- package/dist/components/SnapshotPanel/SnapshotPanel.js.map +0 -1
- package/dist/components/SnapshotPanel/index.d.ts +0 -3
- package/dist/components/SnapshotPanel/index.d.ts.map +0 -1
- package/dist/components/SnapshotPanel/index.js +0 -2
- package/dist/components/SnapshotPanel/index.js.map +0 -1
- package/dist/components/StageNode/StageNode.d.ts +0 -52
- package/dist/components/StageNode/StageNode.d.ts.map +0 -1
- package/dist/components/StageNode/StageNode.js +0 -314
- package/dist/components/StageNode/StageNode.js.map +0 -1
- package/dist/components/StageNode/index.d.ts +0 -3
- package/dist/components/StageNode/index.d.ts.map +0 -1
- package/dist/components/StageNode/index.js +0 -2
- package/dist/components/StageNode/index.js.map +0 -1
- package/dist/components/TimeTravelControls/TimeTravelControls.d.ts +0 -13
- package/dist/components/TimeTravelControls/TimeTravelControls.d.ts.map +0 -1
- package/dist/components/TimeTravelControls/TimeTravelControls.js +0 -120
- package/dist/components/TimeTravelControls/TimeTravelControls.js.map +0 -1
- package/dist/components/TimeTravelControls/index.d.ts +0 -3
- package/dist/components/TimeTravelControls/index.d.ts.map +0 -1
- package/dist/components/TimeTravelControls/index.js +0 -2
- package/dist/components/TimeTravelControls/index.js.map +0 -1
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts +0 -33
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts.map +0 -1
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js +0 -119
- package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js.map +0 -1
- package/dist/components/TimeTravelDebugger/index.d.ts +0 -3
- package/dist/components/TimeTravelDebugger/index.d.ts.map +0 -1
- package/dist/components/TimeTravelDebugger/index.js +0 -2
- package/dist/components/TimeTravelDebugger/index.js.map +0 -1
- package/dist/flowchart.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/theme/ThemeProvider.d.ts +0 -27
- package/dist/theme/ThemeProvider.d.ts.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -30
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/index.d.ts +0 -9
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js +0 -6
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/presets.d.ts +0 -18
- package/dist/theme/presets.d.ts.map +0 -1
- package/dist/theme/presets.js +0 -92
- package/dist/theme/presets.js.map +0 -1
- package/dist/theme/styles.d.ts +0 -32
- package/dist/theme/styles.d.ts.map +0 -1
- package/dist/theme/styles.js +0 -37
- package/dist/theme/styles.js.map +0 -1
- package/dist/theme/tokens.d.ts +0 -49
- package/dist/theme/tokens.d.ts.map +0 -1
- package/dist/theme/tokens.js +0 -79
- package/dist/theme/tokens.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types.d.ts +0 -60
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
package/dist/flowchart.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import * as _xyflow_react from '@xyflow/react';
|
|
3
|
-
import { Node, Edge, NodeTypes, EdgeTypes } from '@xyflow/react';
|
|
3
|
+
import { Node, Edge, NodeTypes, EdgeTypes, NodeProps, EdgeProps } from '@xyflow/react';
|
|
4
4
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
interface StageNodeData {
|
|
@@ -40,6 +40,22 @@ interface StageNodeData {
|
|
|
40
40
|
* ExplainableShell.
|
|
41
41
|
*/
|
|
42
42
|
showStageId?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Visual emphasis hint — generic, so the renderer stays domain-agnostic.
|
|
45
|
+
* `hero` = a stage the viewer cares about (accent border + tint + bold);
|
|
46
|
+
* `muted` = mechanism/plumbing (recedes — faded + thin border). The
|
|
47
|
+
* consumer's graph builder sets this from its own semantics (e.g. the
|
|
48
|
+
* agentfootprint lens maps `stageRole` → emphasis). Layers UNDER run status:
|
|
49
|
+
* active/done/error colours still override during a run.
|
|
50
|
+
*/
|
|
51
|
+
emphasis?: "hero" | "muted";
|
|
52
|
+
/**
|
|
53
|
+
* Size tier — scales the card's text + padding to match the footprint the
|
|
54
|
+
* layout allocated (the layout's node-size resolver must scale in lockstep,
|
|
55
|
+
* else the card and its laid-out box disagree). `lg` = a focal stage,
|
|
56
|
+
* `sm` = a minor/plumbing stage, default `md`. Generic — no domain meaning.
|
|
57
|
+
*/
|
|
58
|
+
size?: "sm" | "md" | "lg";
|
|
43
59
|
[key: string]: unknown;
|
|
44
60
|
}
|
|
45
61
|
/**
|
|
@@ -319,6 +335,12 @@ interface TraceNodeData extends Record<string, unknown> {
|
|
|
319
335
|
subflowId?: string;
|
|
320
336
|
isLazy?: boolean;
|
|
321
337
|
isPausable?: boolean;
|
|
338
|
+
/** Visual emphasis hint — `hero` (prominent) / `muted` (recedes). Set by
|
|
339
|
+
* the consumer's graph builder from its own semantics; the renderer styles
|
|
340
|
+
* off it without any domain knowledge. */
|
|
341
|
+
emphasis?: "hero" | "muted";
|
|
342
|
+
/** Size tier — scales the card; must match the layout's node-size resolver. */
|
|
343
|
+
size?: "sm" | "md" | "lg";
|
|
322
344
|
/** Set later by `onDeciderComplete` when the decider's branch list is
|
|
323
345
|
* sealed. Useful for renderers that want to render decider with a
|
|
324
346
|
* branch-count badge. */
|
|
@@ -625,7 +647,7 @@ declare function TimeTravelDebugger({ snapshots, graph, runtimeOverlay, showGant
|
|
|
625
647
|
* `<TraceFlow graph={currentGraph} />` per level.
|
|
626
648
|
*/
|
|
627
649
|
|
|
628
|
-
interface BreadcrumbEntry {
|
|
650
|
+
interface BreadcrumbEntry$1 {
|
|
629
651
|
/** Display name for this level */
|
|
630
652
|
label: string;
|
|
631
653
|
/** The subflow id that was drilled into to reach this level
|
|
@@ -636,7 +658,7 @@ interface BreadcrumbEntry {
|
|
|
636
658
|
}
|
|
637
659
|
interface SubflowNavigation {
|
|
638
660
|
/** Current breadcrumb path (root → ... → current) */
|
|
639
|
-
breadcrumbs: BreadcrumbEntry[];
|
|
661
|
+
breadcrumbs: BreadcrumbEntry$1[];
|
|
640
662
|
/** Current graph — today identical to the root graph (see file-level
|
|
641
663
|
* TODO). Consumers should still treat this as the source of truth so
|
|
642
664
|
* they remain forward-compatible once per-subflow graphs are wired in. */
|
|
@@ -663,7 +685,7 @@ interface SubflowNavigation {
|
|
|
663
685
|
declare function useSubflowNavigation(rootGraph: TraceGraph | null): SubflowNavigation;
|
|
664
686
|
|
|
665
687
|
interface SubflowBreadcrumbProps {
|
|
666
|
-
breadcrumbs: BreadcrumbEntry[];
|
|
688
|
+
breadcrumbs: BreadcrumbEntry$1[];
|
|
667
689
|
onNavigate: (level: number) => void;
|
|
668
690
|
}
|
|
669
691
|
/**
|
|
@@ -672,6 +694,48 @@ interface SubflowBreadcrumbProps {
|
|
|
672
694
|
*/
|
|
673
695
|
declare const SubflowBreadcrumb: react.NamedExoticComponent<SubflowBreadcrumbProps>;
|
|
674
696
|
|
|
697
|
+
/**
|
|
698
|
+
* Pure helpers for subflow drill-down on a `TraceGraph`.
|
|
699
|
+
*
|
|
700
|
+
* Filtering and breadcrumb computation are derived from the
|
|
701
|
+
* `TraceNodeData.subflowOf` field that the structure recorder sets
|
|
702
|
+
* at `onSubflowMounted` time. Both functions are pure (no I/O, no
|
|
703
|
+
* React) so they can be unit-tested in isolation and reused by any
|
|
704
|
+
* renderer.
|
|
705
|
+
*/
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Filter the trace graph by drill-down scope.
|
|
709
|
+
*
|
|
710
|
+
* - `currentSubflowId === null` → show top-level (nodes with no
|
|
711
|
+
* `subflowOf`). Subflow internals are hidden; their mount node
|
|
712
|
+
* stays visible as a single clickable card.
|
|
713
|
+
* - `currentSubflowId === 'X'` → show only nodes where
|
|
714
|
+
* `subflowOf === 'X'` (the drilled-in subflow's internals).
|
|
715
|
+
*
|
|
716
|
+
* Edges follow the same filter — only edges where both endpoints
|
|
717
|
+
* are in the visible set survive. When nothing would be filtered
|
|
718
|
+
* out, returns the original graph reference (preserves upstream
|
|
719
|
+
* memoization).
|
|
720
|
+
*/
|
|
721
|
+
declare function filterGraphForDrill(graph: TraceGraph, currentSubflowId: string | null): TraceGraph;
|
|
722
|
+
/** Entry in the breadcrumb path. `subflowId === null` is the root. */
|
|
723
|
+
interface BreadcrumbEntry {
|
|
724
|
+
subflowId: string | null;
|
|
725
|
+
label: string;
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Build the breadcrumb path for the current drill level.
|
|
729
|
+
*
|
|
730
|
+
* Always starts with the root `{ subflowId: null, label: 'Chart' }`.
|
|
731
|
+
* When drilled into a subflow, appends one entry with the mount
|
|
732
|
+
* node's display label (falling back to the subflow id). Multi-level
|
|
733
|
+
* drill chains are NOT supported by the current chart UX (drill is
|
|
734
|
+
* always from root or sibling — clicking a deeper subflow's mount
|
|
735
|
+
* replaces the current scope), so the path has at most 2 entries.
|
|
736
|
+
*/
|
|
737
|
+
declare function buildSubflowBreadcrumb(graph: TraceGraph, currentSubflowId: string | null): BreadcrumbEntry[];
|
|
738
|
+
|
|
675
739
|
interface SubflowTreeEntry {
|
|
676
740
|
/** Node name / identifier */
|
|
677
741
|
name: string;
|
|
@@ -826,6 +890,13 @@ interface TracedFlowProps extends BaseComponentProps {
|
|
|
826
890
|
* the default for that node type. Pass `{ stageNode: MyNode }` to
|
|
827
891
|
* replace the default stage renderer entirely, or add new keys
|
|
828
892
|
* for custom node components you push into the graph.
|
|
893
|
+
*
|
|
894
|
+
* v0.20+ — overlay state is injected into custom nodes' `data`
|
|
895
|
+
* fields too (`active`, `done`, `error`, `errorMessage`, `dimmed`,
|
|
896
|
+
* `stepNumbers`), so consumer renderers can style themselves with
|
|
897
|
+
* the same scrub-driven done/active/error semantics the bundled
|
|
898
|
+
* `<StageNode>` uses — without re-implementing the overlay slice
|
|
899
|
+
* derivation. Consumer `data` fields pass through untouched alongside.
|
|
829
900
|
*/
|
|
830
901
|
nodeTypes?: NodeTypes;
|
|
831
902
|
/**
|
|
@@ -834,6 +905,33 @@ interface TracedFlowProps extends BaseComponentProps {
|
|
|
834
905
|
* components for edges you push into the graph with `type: 'myEdge'`.
|
|
835
906
|
*/
|
|
836
907
|
edgeTypes?: EdgeTypes;
|
|
908
|
+
/**
|
|
909
|
+
* Extra chart node ids to mark `active` SIMULTANEOUSLY at the current scrub
|
|
910
|
+
* position, on top of the overlay's single active node. Lets a consumer light
|
|
911
|
+
* a whole parallel cohort at one cursor (e.g. the lens lighting every branch
|
|
912
|
+
* of a fork together). Works for BOTH stage and custom nodes. Defaults to
|
|
913
|
+
* none — single-active behaviour is unchanged.
|
|
914
|
+
*/
|
|
915
|
+
coActiveStageIds?: ReadonlySet<string>;
|
|
916
|
+
/**
|
|
917
|
+
* Subflow ids to render as GROUP CONTAINER boxes — the subflow's member
|
|
918
|
+
* stages render NESTED inside the box (xyflow `parentId` + `extent`),
|
|
919
|
+
* instead of behind a click-to-zoom DRILL card. Per-subflow choice: any
|
|
920
|
+
* subflow id NOT listed keeps drilling. Default (unset): all drill —
|
|
921
|
+
* existing behavior, nothing changes.
|
|
922
|
+
*/
|
|
923
|
+
groupedSubflows?: readonly string[];
|
|
924
|
+
/**
|
|
925
|
+
* Wrap the ENTIRE chart in ONE main-chart container box (the Lens model:
|
|
926
|
+
* the primitive you're viewing is always one box; subflows inside stay
|
|
927
|
+
* drill cards). Pass a config object to enable + label it; omit for no
|
|
928
|
+
* outer box. Composes AFTER drill-filtering, so when you drill into a
|
|
929
|
+
* subflow the box reframes to that subflow's contents.
|
|
930
|
+
*/
|
|
931
|
+
mainChartBox?: {
|
|
932
|
+
label?: string;
|
|
933
|
+
kind?: string;
|
|
934
|
+
};
|
|
837
935
|
/**
|
|
838
936
|
* Children rendered INSIDE the `<ReactFlow>` element, after the
|
|
839
937
|
* built-in `<Background>`. Use this slot to mount xyflow
|
|
@@ -842,7 +940,416 @@ interface TracedFlowProps extends BaseComponentProps {
|
|
|
842
940
|
*/
|
|
843
941
|
children?: react.ReactNode;
|
|
844
942
|
}
|
|
845
|
-
declare function TracedFlow({ graph, overlay, scrubIndex, layout: layoutProp, colors: colorOverrides, onNodeClick, onSubflowChange, nodeTypes: userNodeTypes, edgeTypes: userEdgeTypes, children, className, style, }: TracedFlowProps): react_jsx_runtime.JSX.Element;
|
|
943
|
+
declare function TracedFlow({ graph, overlay, scrubIndex, layout: layoutProp, colors: colorOverrides, onNodeClick, onSubflowChange, groupedSubflows, mainChartBox, nodeTypes: userNodeTypes, edgeTypes: userEdgeTypes, coActiveStageIds, children, className, style, }: TracedFlowProps): react_jsx_runtime.JSX.Element;
|
|
944
|
+
|
|
945
|
+
interface GroupContainerNodeData {
|
|
946
|
+
label: string;
|
|
947
|
+
isGroupContainer?: boolean;
|
|
948
|
+
active?: boolean;
|
|
949
|
+
done?: boolean;
|
|
950
|
+
error?: boolean;
|
|
951
|
+
dimmed?: boolean;
|
|
952
|
+
description?: string;
|
|
953
|
+
icon?: string;
|
|
954
|
+
[key: string]: unknown;
|
|
955
|
+
}
|
|
956
|
+
declare function GroupContainerNode({ data }: NodeProps): react_jsx_runtime.JSX.Element;
|
|
957
|
+
|
|
958
|
+
interface SlotPillNodeData {
|
|
959
|
+
label: string;
|
|
960
|
+
/** Lit when the selector PICKED this slot this turn (overlay or consumer). */
|
|
961
|
+
active?: boolean;
|
|
962
|
+
selected?: boolean;
|
|
963
|
+
done?: boolean;
|
|
964
|
+
/** Faded when other slots ran but this one didn't (the "unlit" signal). */
|
|
965
|
+
dimmed?: boolean;
|
|
966
|
+
/** Semantic kind hint for the dot color (e.g. 'system-prompt'|'messages'|'tools'). */
|
|
967
|
+
slotKind?: string;
|
|
968
|
+
icon?: string;
|
|
969
|
+
[key: string]: unknown;
|
|
970
|
+
}
|
|
971
|
+
declare function SlotPillNode({ data }: NodeProps): react_jsx_runtime.JSX.Element;
|
|
972
|
+
|
|
973
|
+
declare function LoopBackEdge({ id, source, target, markerEnd, style }: EdgeProps): react_jsx_runtime.JSX.Element | null;
|
|
974
|
+
|
|
975
|
+
declare function SmartStepEdge({ id, source, target, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, markerEnd, style, }: EdgeProps): react_jsx_runtime.JSX.Element;
|
|
976
|
+
|
|
977
|
+
/**
|
|
978
|
+
* groupLayout — xyflow NATIVE container boxes for the trace chart.
|
|
979
|
+
*
|
|
980
|
+
* Two box mechanisms live here, plus the existing drill (elsewhere):
|
|
981
|
+
*
|
|
982
|
+
* - **Drill** (`subflowDrill.ts` + `useSubflowDrill`): a subflow shows as
|
|
983
|
+
* ONE mount card; clicking it zooms in. The DEFAULT for every subflow.
|
|
984
|
+
* - **Main-chart box** (`wrapInMainChartBox`): wrap the WHOLE chart in ONE
|
|
985
|
+
* container box. This is the Lens model — the primitive you're viewing
|
|
986
|
+
* (LLMCall / Agent) is always one box; every subflow inside it stays a
|
|
987
|
+
* drill card. A `nodeTypes` registry then styles each inner card
|
|
988
|
+
* (system-prompt / messages / tools / LLM). USE THIS for Lens.
|
|
989
|
+
* - **Per-subflow group** (`applyGroupLayout`): box individual subflows
|
|
990
|
+
* (mount → container, members nested inside). A more granular tool kept
|
|
991
|
+
* for consumers that want specific subflows inlined as boxes rather than
|
|
992
|
+
* drilled. NOT what the Lens main-chart model uses.
|
|
993
|
+
*
|
|
994
|
+
* All are pure `(graph, opts) => graph` (no React, no I/O) and compose with
|
|
995
|
+
* `<TracedFlow>` before nodes reach `<ReactFlow>`. explainable-ui stays
|
|
996
|
+
* policy-free: it offers the mechanisms; the consumer (Lens) picks.
|
|
997
|
+
*
|
|
998
|
+
* Pure: `(graph, opts) => graph`. No React, no I/O. Composed by `<TracedFlow>`
|
|
999
|
+
* before the nodes reach `<ReactFlow>`.
|
|
1000
|
+
*
|
|
1001
|
+
* What it does, given `groupedSubflowIds`:
|
|
1002
|
+
* 1. For each grouped subflow that is actually present (a mount node whose
|
|
1003
|
+
* `subflowId` is listed AND has ≥1 member where `subflowOf === id`):
|
|
1004
|
+
* - lay the OUTER graph out with `baseLayout` (members excluded; the
|
|
1005
|
+
* mount stays as the box anchor);
|
|
1006
|
+
* - lay the subflow's MEMBERS out with `baseLayout` in isolation, then
|
|
1007
|
+
* normalise them to the box's local coordinate space;
|
|
1008
|
+
* - size the container box to fit the members (+ header + padding);
|
|
1009
|
+
* - convert the mount node to `type: 'groupContainer'` with a `style`
|
|
1010
|
+
* width/height, and nest each member via `parentId` + `extent`.
|
|
1011
|
+
* 2. Subflows NOT listed are left untouched (they continue to drill).
|
|
1012
|
+
*
|
|
1013
|
+
* Node ORDER invariant (xyflow requirement): a parent node MUST appear
|
|
1014
|
+
* before its children in the array. We emit all outer nodes (containers
|
|
1015
|
+
* included) first, then all nested members — so every container precedes
|
|
1016
|
+
* its members.
|
|
1017
|
+
*/
|
|
1018
|
+
|
|
1019
|
+
/** xyflow node type used for the container box. Consumers register a
|
|
1020
|
+
* renderer for this key (explainable-ui ships a default `GroupContainerNode`). */
|
|
1021
|
+
declare const GROUP_CONTAINER_NODE_TYPE = "groupContainer";
|
|
1022
|
+
interface GroupLayoutOptions {
|
|
1023
|
+
/** Subflow ids (the mount's `subflowId`) to render as group boxes. */
|
|
1024
|
+
readonly groupedSubflowIds: readonly string[];
|
|
1025
|
+
/** Layout for both the outer graph and each subflow's interior. */
|
|
1026
|
+
readonly baseLayout: TraceFlowLayout;
|
|
1027
|
+
/** Inner padding inside the container box, in px. Default 16. */
|
|
1028
|
+
readonly padding?: number;
|
|
1029
|
+
/** Header strip height (room for the box title), in px. Default 44. */
|
|
1030
|
+
readonly headerHeight?: number;
|
|
1031
|
+
/** Assumed node footprint for box sizing (the layout sets positions, not
|
|
1032
|
+
* sizes). Defaults match the bundled `StageNode` footprint. */
|
|
1033
|
+
readonly nodeWidth?: number;
|
|
1034
|
+
readonly nodeHeight?: number;
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* Apply group-container nesting to a positioned-or-unpositioned graph.
|
|
1038
|
+
* Returns a NEW graph (input is not mutated). Edges pass through unchanged
|
|
1039
|
+
* — xyflow resolves them by node id regardless of nesting, so an edge that
|
|
1040
|
+
* pointed at a now-container mount still connects to the box, and
|
|
1041
|
+
* member↔member edges render inside it.
|
|
1042
|
+
*/
|
|
1043
|
+
declare function applyGroupLayout(graph: TraceGraph, opts: GroupLayoutOptions): TraceGraph;
|
|
1044
|
+
/**
|
|
1045
|
+
* Convenience: wrap a base layout into a `TraceFlowLayout` that applies
|
|
1046
|
+
* group containers. Pass to `<TraceFlow layout={...}>` / `<TracedFlow>`.
|
|
1047
|
+
*/
|
|
1048
|
+
declare function createGroupedLayout(opts: GroupLayoutOptions): TraceFlowLayout;
|
|
1049
|
+
/** Default id for the synthesised main-chart container node. */
|
|
1050
|
+
declare const MAIN_CHART_BOX_ID = "__main_chart__";
|
|
1051
|
+
interface MainChartBoxOptions {
|
|
1052
|
+
/** Layout applied to the chart's contents before wrapping. */
|
|
1053
|
+
readonly baseLayout: TraceFlowLayout;
|
|
1054
|
+
/** Container node id. Default `__main_chart__`. */
|
|
1055
|
+
readonly id?: string;
|
|
1056
|
+
/** Box title (rendered in the container header). */
|
|
1057
|
+
readonly label?: string;
|
|
1058
|
+
/** Optional taxonomy hint surfaced on `data` (e.g. 'LLMCall' | 'Agent'). */
|
|
1059
|
+
readonly kind?: string;
|
|
1060
|
+
readonly padding?: number;
|
|
1061
|
+
readonly headerHeight?: number;
|
|
1062
|
+
readonly nodeWidth?: number;
|
|
1063
|
+
readonly nodeHeight?: number;
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* Wrap an entire graph in a single main-chart container box. Pure
|
|
1067
|
+
* `(graph, opts) => graph`; input not mutated. Empty graph → returned
|
|
1068
|
+
* unchanged (nothing to wrap).
|
|
1069
|
+
*/
|
|
1070
|
+
declare function wrapInMainChartBox(graph: TraceGraph, opts: MainChartBoxOptions): TraceGraph;
|
|
1071
|
+
/**
|
|
1072
|
+
* Convenience: a `TraceFlowLayout` that wraps the whole chart in one
|
|
1073
|
+
* main-chart box. Pass to `<TraceFlow layout={...}>` / `<TracedFlow>`.
|
|
1074
|
+
*/
|
|
1075
|
+
declare function createMainChartBoxLayout(opts: MainChartBoxOptions): TraceFlowLayout;
|
|
1076
|
+
|
|
1077
|
+
/**
|
|
1078
|
+
* dagreTraceLayout — professor-grade `TraceFlowLayout` backed by dagre.
|
|
1079
|
+
*
|
|
1080
|
+
* Replaces the hand-rolled BFS `defaultTraceFlowLayout` (which used FIXED
|
|
1081
|
+
* spacing constants — Y_STEP / X_SPREAD — and documented "first-wins"
|
|
1082
|
+
* convergence + no overlap detection). Dagre instead derives every
|
|
1083
|
+
* position from the STRUCTURE RELATIONS:
|
|
1084
|
+
*
|
|
1085
|
+
* - **next** (sequential): y-delta = rank depth (longest path), so a
|
|
1086
|
+
* convergence node lands at `max(incoming ranks) + 1` — not
|
|
1087
|
+
* "deepest-branch-so-far".
|
|
1088
|
+
* - **fork / selector** (N branches): x-delta = the measured SUBTREE
|
|
1089
|
+
* WIDTH of each branch (a wide branch pushes its siblings further; a
|
|
1090
|
+
* thin one barely shifts them) — scales cleanly for any N, no collisions.
|
|
1091
|
+
* - **merge** (join): centered under the average of its real parents.
|
|
1092
|
+
*
|
|
1093
|
+
* Compound nesting: dagre is given `parentId` as a compound-parent link,
|
|
1094
|
+
* so group-container children (from `applyGroupLayout` / `wrapInMainChartBox`)
|
|
1095
|
+
* stay inside their box. Coordinates are returned parent-RELATIVE (xyflow
|
|
1096
|
+
* convention), matching what the box transforms expect.
|
|
1097
|
+
*
|
|
1098
|
+
* Ported from agentfootprint-lens's proven `dagreLayout` (same dagre core),
|
|
1099
|
+
* re-shaped to the `TraceFlowLayout` contract: `(TraceGraph) => TraceGraph`.
|
|
1100
|
+
* Pure — same graph in, same positions out; no React, no I/O.
|
|
1101
|
+
*/
|
|
1102
|
+
|
|
1103
|
+
/** Explicit node footprint (px). */
|
|
1104
|
+
interface NodeFootprint {
|
|
1105
|
+
readonly width: number;
|
|
1106
|
+
readonly height: number;
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* Consumer-supplied per-node size resolver. Receives the WHOLE node (all
|
|
1110
|
+
* recorder semantics: `data.isSubflow`, `data.icon`, `data.subflowId`,
|
|
1111
|
+
* `id`, …) and returns a footprint, or `undefined` to leave the node alone
|
|
1112
|
+
* (→ falls back to `style.width/height`, then the default footprint).
|
|
1113
|
+
*
|
|
1114
|
+
* The library imposes NO sizing rules — the consumer decides per node by
|
|
1115
|
+
* whatever criteria THEY choose. E.g. make one specific slot a slim bar
|
|
1116
|
+
* while another stays a full card; make the LLM-call node large; etc.
|
|
1117
|
+
*/
|
|
1118
|
+
type NodeSizeResolver = (node: TraceNode) => NodeFootprint | undefined;
|
|
1119
|
+
/** Consumer-supplied per-edge layout-weight resolver. Higher weight pulls
|
|
1120
|
+
* the two endpoints into a tighter, straighter column (dagre `weight`).
|
|
1121
|
+
* Return `undefined` for the default (1). */
|
|
1122
|
+
type EdgeWeightResolver = (edge: Edge<TraceEdgeData>) => number | undefined;
|
|
1123
|
+
/** Consumer-supplied per-edge minimum rank-span resolver. `>1` STRETCHES an
|
|
1124
|
+
* edge (pushes its target that many ranks down). Note dagre cannot make an
|
|
1125
|
+
* edge SHORTER than one rank — `minlen` only increases. Return `undefined`
|
|
1126
|
+
* for the default (1). */
|
|
1127
|
+
type EdgeMinLenResolver = (edge: Edge<TraceEdgeData>) => number | undefined;
|
|
1128
|
+
/**
|
|
1129
|
+
* Consumer-supplied left-to-right ORDER for a node's fork/decider children.
|
|
1130
|
+
* Receives the source node id + its child target ids (in spec/edge-insertion
|
|
1131
|
+
* order); returns the SAME ids reordered left-to-right (index 0 = leftmost).
|
|
1132
|
+
* Ids omitted from the result keep their original relative order after the
|
|
1133
|
+
* listed ones. Return the input unchanged (or `undefined` from the resolver)
|
|
1134
|
+
* to leave a node alone.
|
|
1135
|
+
*
|
|
1136
|
+
* Use to place a specific branch on a chosen side — e.g. the looping branch on
|
|
1137
|
+
* the right margin where the loop-back curve lives, so the "iterate" path reads
|
|
1138
|
+
* as one side of the fork. This is a pure VISUAL/LAYOUT decision (it changes
|
|
1139
|
+
* which side a branch draws on, never the chart's behavior), so it belongs in
|
|
1140
|
+
* the renderer, not the chart spec.
|
|
1141
|
+
*
|
|
1142
|
+
* Mechanism: dagre seeds its sibling order from edge-insertion order and keeps
|
|
1143
|
+
* it as the tie-break for equal-barycenter siblings. We insert each source's
|
|
1144
|
+
* edges in the resolved order, so for the common symmetric N-branch decider the
|
|
1145
|
+
* result is deterministic. (For graphs where one ordering strictly reduces edge
|
|
1146
|
+
* crossings, dagre's crossing-minimizer may still override — best-effort, as
|
|
1147
|
+
* documented for any dagre ordering hint.)
|
|
1148
|
+
*/
|
|
1149
|
+
type SiblingOrderResolver = (sourceId: string, childIds: readonly string[]) => readonly string[];
|
|
1150
|
+
interface DagreTraceLayoutOptions {
|
|
1151
|
+
/** Layout direction. `'TB'` (top-to-bottom) is the default — matches the
|
|
1152
|
+
* "Seed → … → answer" reading order. */
|
|
1153
|
+
readonly direction?: "TB" | "BT" | "LR" | "RL";
|
|
1154
|
+
/** Vertical spacing between rank layers (px). Surfaced as a knob — the
|
|
1155
|
+
* rank-gap delta. Default 80. */
|
|
1156
|
+
readonly rankSep?: number;
|
|
1157
|
+
/** Horizontal spacing between siblings within a rank (px). The
|
|
1158
|
+
* sibling-gap delta dagre adds ON TOP of measured subtree widths.
|
|
1159
|
+
* Default 60. */
|
|
1160
|
+
readonly nodeSep?: number;
|
|
1161
|
+
/** Spacing between edges (px). Default 20. */
|
|
1162
|
+
readonly edgeSep?: number;
|
|
1163
|
+
/** Fallback node footprint when a node carries no explicit size. dagre
|
|
1164
|
+
* needs real dimensions or arrows collapse to a point. */
|
|
1165
|
+
readonly nodeWidth?: number;
|
|
1166
|
+
readonly nodeHeight?: number;
|
|
1167
|
+
/** Per-node size resolver — consumer decides each node's footprint. See
|
|
1168
|
+
* `NodeSizeResolver`. Resolution order: resolver → `node.style` → default. */
|
|
1169
|
+
readonly nodeSize?: NodeSizeResolver;
|
|
1170
|
+
/** Per-edge pull (dagre `weight`). See `EdgeWeightResolver`. */
|
|
1171
|
+
readonly edgeWeight?: EdgeWeightResolver;
|
|
1172
|
+
/** Per-edge stretch (dagre `minlen`). See `EdgeMinLenResolver`. */
|
|
1173
|
+
readonly edgeMinLen?: EdgeMinLenResolver;
|
|
1174
|
+
/** Per-node fork/decider child ordering. See `SiblingOrderResolver`. */
|
|
1175
|
+
readonly siblingOrder?: SiblingOrderResolver;
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* Lay out a `TraceGraph` with dagre. Returns a NEW graph with each node's
|
|
1179
|
+
* `position` set (top-left, parent-relative for nested nodes). Edges pass
|
|
1180
|
+
* through unchanged — xyflow routes them once nodes are placed.
|
|
1181
|
+
*
|
|
1182
|
+
* Loop back-edges (`kind: 'loop'`) are EXCLUDED from the dagre graph: they
|
|
1183
|
+
* are visual annotations only (invariant I1) and would otherwise create
|
|
1184
|
+
* cycles that distort ranking.
|
|
1185
|
+
*/
|
|
1186
|
+
declare function dagreTraceLayout(graph: TraceGraph, options?: DagreTraceLayoutOptions): TraceGraph;
|
|
1187
|
+
/**
|
|
1188
|
+
* Build a `TraceFlowLayout` from dagre options. Pass to
|
|
1189
|
+
* `<TraceFlow layout={...}>` / `<TracedFlow layout={...}>`, or use it as a
|
|
1190
|
+
* `baseLayout` for the group/main-box transforms.
|
|
1191
|
+
*/
|
|
1192
|
+
declare function createDagreTraceLayout(options?: DagreTraceLayoutOptions): TraceFlowLayout;
|
|
1193
|
+
|
|
1194
|
+
/**
|
|
1195
|
+
* snapLinearSuccessors — pure post-dagre alignment pass for the chart SPINE.
|
|
1196
|
+
*
|
|
1197
|
+
* THE PROBLEM IT FIXES
|
|
1198
|
+
* --------------------
|
|
1199
|
+
* On a chart like `Context(selector) → [slot, slot] → messageAPI(merge) →
|
|
1200
|
+
* callLLM(linear)`, dagre's default balanced x-assignment (Brandes–Köpf
|
|
1201
|
+
* `balance()` = median of 4 extreme alignments) drifts a pure linear
|
|
1202
|
+
* successor a few px off the spine on an ASYMMETRIC graph (a wide callLLM
|
|
1203
|
+
* node + the fork above unbalance the alignment passes). Measured centers:
|
|
1204
|
+
* context 915, messageAPI 917, callLLM 921 — callLLM is ~6px off even though
|
|
1205
|
+
* it is a single-in / single-out continuation of messageAPI.
|
|
1206
|
+
*
|
|
1207
|
+
* THE FIX
|
|
1208
|
+
* -------
|
|
1209
|
+
* A pure `(graph) => graph` pass applied AFTER `dagreTraceLayout`. A node with
|
|
1210
|
+
* EXACTLY ONE forward (non-loop) predecessor, whose predecessor has EXACTLY
|
|
1211
|
+
* ONE forward (non-loop) successor, and which shares the same `parentId`
|
|
1212
|
+
* coordinate space, snaps its CENTER-x onto that predecessor's center-x. The
|
|
1213
|
+
* top-left `position.x` is recomputed from the new center using the node's OWN
|
|
1214
|
+
* width. `y` is never touched.
|
|
1215
|
+
*
|
|
1216
|
+
* WHAT IT NEVER MOVES (by construction of the predicate)
|
|
1217
|
+
* ------------------------------------------------------
|
|
1218
|
+
* - the ROOT — 0 predecessors → predicate (1) fails
|
|
1219
|
+
* - a MERGE (messageAPI) — >1 predecessor → predicate (1) fails
|
|
1220
|
+
* - FORK / DECISION children — predecessor out-deg>1 → predicate (2) fails
|
|
1221
|
+
* - cross-compound hops — differing parentId → predicate (3) fails
|
|
1222
|
+
* A fork/merge NODE itself is still snapped onto ITS upstream predecessor when
|
|
1223
|
+
* that predecessor is a pure linear hop — correct, it is a continuation of
|
|
1224
|
+
* whatever feeds it. Only its CHILDREN are protected.
|
|
1225
|
+
*
|
|
1226
|
+
* PROPERTIES
|
|
1227
|
+
* ----------
|
|
1228
|
+
* - PURE: never mutates the input graph; returns a new nodes array (edges by
|
|
1229
|
+
* reference, mirroring dagre's own pass-through).
|
|
1230
|
+
* - IDEMPOTENT: re-running finds centers already equal → zero-delta writes.
|
|
1231
|
+
* - CHAIN-PROPAGATING: nodes are processed in rank (y-asc) order, so a
|
|
1232
|
+
* snapped predecessor's corrected x flows down a `a→b→c` chain in one pass.
|
|
1233
|
+
* - GEOMETRY-EXACT: widths come from the SAME resolver→style→default order
|
|
1234
|
+
* dagre used (`sizeOf`), so reconstructed centers match dagre's placement.
|
|
1235
|
+
*
|
|
1236
|
+
* Compose it with dagre via `createSnappedDagreLayout`, or call it directly on
|
|
1237
|
+
* a `dagreTraceLayout(...)` result. Kept SEPARATE from `dagreTraceLayout` so
|
|
1238
|
+
* the base layout's output stays byte-identical for consumers that don't opt
|
|
1239
|
+
* in.
|
|
1240
|
+
*/
|
|
1241
|
+
|
|
1242
|
+
/**
|
|
1243
|
+
* Options for the snap pass. These MUST mirror the size-relevant options
|
|
1244
|
+
* passed to the `dagreTraceLayout` run that produced the graph, so the pass
|
|
1245
|
+
* reconstructs each node's center from the identical width.
|
|
1246
|
+
*/
|
|
1247
|
+
interface SnapLinearSuccessorsOptions {
|
|
1248
|
+
/** Per-node size resolver — same one passed to dagre. Resolution order:
|
|
1249
|
+
* resolver → `node.style` → default. */
|
|
1250
|
+
readonly nodeSize?: NodeSizeResolver;
|
|
1251
|
+
/** Fallback width when a node carries no resolver/style size. Must match
|
|
1252
|
+
* the dagre run's `nodeWidth`. Default 200. */
|
|
1253
|
+
readonly nodeWidth?: number;
|
|
1254
|
+
/** Fallback height. Must match the dagre run's `nodeHeight`. Default 80.
|
|
1255
|
+
* (Height is unused for x-snapping but kept so `sizeOf` resolves the same
|
|
1256
|
+
* footprint the resolver may key on.) */
|
|
1257
|
+
readonly nodeHeight?: number;
|
|
1258
|
+
}
|
|
1259
|
+
/**
|
|
1260
|
+
* Snap pure single-in/single-out linear successors onto their predecessor's
|
|
1261
|
+
* center-x. See the file header for the full contract. Pure + idempotent.
|
|
1262
|
+
*/
|
|
1263
|
+
declare function snapLinearSuccessors(graph: TraceGraph, options?: SnapLinearSuccessorsOptions): TraceGraph;
|
|
1264
|
+
/**
|
|
1265
|
+
* Convenience: run a base `TraceFlowLayout` (typically `createDagreTraceLayout`)
|
|
1266
|
+
* then the snap pass, as one composed layout.
|
|
1267
|
+
*
|
|
1268
|
+
* @example
|
|
1269
|
+
* const layout = createSnappedDagreLayout(
|
|
1270
|
+
* createDagreTraceLayout({ nodeSize }),
|
|
1271
|
+
* { nodeSize }, // SAME size opts so widths match
|
|
1272
|
+
* );
|
|
1273
|
+
*/
|
|
1274
|
+
declare function createSnappedDagreLayout(base: TraceFlowLayout, options?: SnapLinearSuccessorsOptions): TraceFlowLayout;
|
|
1275
|
+
|
|
1276
|
+
/**
|
|
1277
|
+
* traceGroupLayout — a group-based layout for footprint trace charts, designed
|
|
1278
|
+
* the way a layout engineer reasons about structured flowcharts: NOT by tuning
|
|
1279
|
+
* a generic Sugiyama/dagre pass, but by ranking nodes into bands and centering
|
|
1280
|
+
* each MERGE under the SPAN of its inputs, so the layout's correctness falls out
|
|
1281
|
+
* BY CONSTRUCTION.
|
|
1282
|
+
*
|
|
1283
|
+
* The mental model (groups):
|
|
1284
|
+
* - A SEQUENCE is a single-in/single-out chain → stacked vertically, each node
|
|
1285
|
+
* inheriting its predecessor's x (a straight spine; the downstream
|
|
1286
|
+
* `snapLinearSuccessors` pass keeps it pixel-exact).
|
|
1287
|
+
* - A FORK (a node with ≥2 branch children) → its children spread across the
|
|
1288
|
+
* next band; the children ARE the parallel group.
|
|
1289
|
+
* - A MERGE (a node with ≥2 incoming edges) → centered under the combined
|
|
1290
|
+
* visual SPAN of its inputs. This handles STAGGERED merges with zero
|
|
1291
|
+
* special-casing: longest-path ranking puts a merge one band below its
|
|
1292
|
+
* deepest input, and span-centering places it symmetrically under inputs
|
|
1293
|
+
* that may sit at different bands and have very different widths.
|
|
1294
|
+
*
|
|
1295
|
+
* For the agent merge-tree this yields: messageAPI centered under
|
|
1296
|
+
* {system-prompt, messages}; call-llm centered under the span of
|
|
1297
|
+
* {messageAPI, tools} (tools bypasses messageAPI's band — a staggered merge);
|
|
1298
|
+
* route + its branches symmetric below; the loop excluded from layout (drawn as
|
|
1299
|
+
* a right-margin back-edge by `LoopBackEdge`).
|
|
1300
|
+
*
|
|
1301
|
+
* Contract: pure `(TraceGraph) => TraceGraph`, sets `position` (top-left) on
|
|
1302
|
+
* every node, parent-relative for `parentId` nodes — same as `dagreTraceLayout`.
|
|
1303
|
+
* Reuses `sizeOf` / `NodeSizeResolver` / size defaults from `dagreTraceLayout`
|
|
1304
|
+
* (so the group-container "style-wins" exception + any consumer sizing behave
|
|
1305
|
+
* identically), and composes with the existing `createSnappedDagreLayout` +
|
|
1306
|
+
* `wrapInMainChartBox` passes — no duplication.
|
|
1307
|
+
*/
|
|
1308
|
+
|
|
1309
|
+
interface TraceGroupLayoutOptions {
|
|
1310
|
+
/** Vertical gap between rank bands (px). Default 80. */
|
|
1311
|
+
readonly rankSep?: number;
|
|
1312
|
+
/** Horizontal gap between siblings within a band (px). Default 60. */
|
|
1313
|
+
readonly nodeSep?: number;
|
|
1314
|
+
/** Fallback node footprint when a node carries no explicit size. */
|
|
1315
|
+
readonly nodeWidth?: number;
|
|
1316
|
+
readonly nodeHeight?: number;
|
|
1317
|
+
/** Per-node size resolver (see `NodeSizeResolver`). Resolution order matches
|
|
1318
|
+
* `dagreTraceLayout.sizeOf`. */
|
|
1319
|
+
readonly nodeSize?: NodeSizeResolver;
|
|
1320
|
+
/** Left-to-right order for a fork's children within their band (see
|
|
1321
|
+
* `SiblingOrderResolver`). Default = edge-insertion order. */
|
|
1322
|
+
readonly siblingOrder?: SiblingOrderResolver;
|
|
1323
|
+
/** Bottom-up merge re-centering pass. Default true; off = pass-1 only (debug). */
|
|
1324
|
+
readonly enableMergeCentering?: boolean;
|
|
1325
|
+
/**
|
|
1326
|
+
* How a MERGE (join) node is horizontally placed relative to its inputs:
|
|
1327
|
+
* - `"span"` (default) — centered under the combined visual SPAN of its
|
|
1328
|
+
* inputs. Faithful "this node's data comes from those boxes", but when a
|
|
1329
|
+
* join's inputs are the splayed children of a fork, the join lands under
|
|
1330
|
+
* the splay (off the trunk) and the main path ZIG-ZAGS.
|
|
1331
|
+
* - `"fork-origin"` — aligned with the FORK the inputs re-converge from
|
|
1332
|
+
* (their lowest common ancestor). A join returns to its fork's axis, so
|
|
1333
|
+
* the trunk (root → joins → tail) renders as ONE STRAIGHT centered column
|
|
1334
|
+
* with the branches splaying symmetrically around it. Nested forks return
|
|
1335
|
+
* to their INNER fork. Use for "read it as a sequence with side-inputs"
|
|
1336
|
+
* charts.
|
|
1337
|
+
* Default `"span"` (unchanged behavior for existing consumers).
|
|
1338
|
+
*/
|
|
1339
|
+
readonly mergeAlign?: "span" | "fork-origin";
|
|
1340
|
+
}
|
|
1341
|
+
/**
|
|
1342
|
+
* Lay out a `TraceGraph` by rank bands + span-centered merges. Returns a NEW
|
|
1343
|
+
* graph with each node's `position` set. Edges pass through by reference.
|
|
1344
|
+
*/
|
|
1345
|
+
declare function traceGroupLayout(graph: TraceGraph, options?: TraceGroupLayoutOptions): TraceGraph;
|
|
1346
|
+
/**
|
|
1347
|
+
* Build a `TraceFlowLayout` from group-layout options. Pass to
|
|
1348
|
+
* `<TraceFlow layout={...}>` / `<TracedFlow layout={...}>`, or wrap with the
|
|
1349
|
+
* existing `createSnappedDagreLayout(base, opts)` (it is layout-engine-agnostic)
|
|
1350
|
+
* and/or `wrapInMainChartBox`.
|
|
1351
|
+
*/
|
|
1352
|
+
declare function createTraceGroupLayout(options?: TraceGroupLayoutOptions): TraceFlowLayout;
|
|
846
1353
|
|
|
847
1354
|
/**
|
|
848
1355
|
* createNodeViewRecorder — per-stage summary translator.
|
|
@@ -1800,4 +2307,4 @@ interface RunSliderProps extends BaseComponentProps {
|
|
|
1800
2307
|
}
|
|
1801
2308
|
declare function RunSlider({ index, cursorRuntimeStageId, onCursorChange, renderLabel, className, style, }: RunSliderProps): react_jsx_runtime.JSX.Element;
|
|
1802
2309
|
|
|
1803
|
-
export { type BreadcrumbEntry, type ChainSlotProps, type ChainTreeOptions, type CommitChain, type CommitChainLeaf, CommitChainView, type CommitChainViewProps, type CommitFlowIndex, type CommitFlowRecorderHandle, CommitInspector, type CommitInspectorProps, type CommitInspectorSlotProps, type CommitView, type CreateCommitFlowRecorderOptions, type CreateNodeViewRecorderOptions, type CreateTraceBundleOptions, type CreateTraceRuntimeOverlayOptions, type CreateTraceStructureRecorderOptions, type DataDependency, type ExecutionRecord, type MinimalCommitFlowRecorder, type MinimalFlowRecorder, type MinimalNodeViewRecorder, type MinimalStructureRecorder, NodeInspector, type NodeInspectorProps, type NodeInspectorSlotProps, type NodeView, type NodeViewIndex, type NodeViewRecorderHandle, RunSlider, type RunSliderProps, type RuntimeExecutionStep, type RuntimeOverlay, type RuntimeOverlaySlice, type RuntimeStageId, type SliderSlotProps, type StageId, StageNode, type StageNodeData, type StructureChain, type StructureChainLeaf, SubflowBreadcrumb, type SubflowBreadcrumbProps, type SubflowNavigation, SubflowTree, type SubflowTreeEntry, type SubflowTreeProps, TimeTravelDebugger, type TimeTravelDebuggerProps, type TraceBundle, type TraceEdge, type TraceEdgeData, TraceExplorerShell, type TraceExplorerShellProps, type TraceExplorerSlots, TraceFlow, type TraceFlowEdgeColors, type TraceFlowLayout, type TraceFlowProps, type TraceGraph, type TraceNode, type TraceNodeData, type TraceRuntimeOverlayHandle, type TraceStructureRecorderHandle, TracedFlow, type TracedFlowColors, type TracedFlowProps, type TranslatorHandleLike, type WalkOptions, asRuntimeStageId, asStageId, backtraceDataFlow, backtraceStructural, buildCommitChainTree, createCommitFlowRecorder, createNodeViewRecorder, createTraceBundle, createTraceRuntimeOverlay, createTraceStructureRecorder, defaultTraceFlowLayout, forwardtraceStructural, sliceOverlay, structureAsChainTree, useSubflowNavigation, useTranslator, walkBackward, walkForward };
|
|
2310
|
+
export { type BreadcrumbEntry$1 as BreadcrumbEntry, type ChainSlotProps, type ChainTreeOptions, type CommitChain, type CommitChainLeaf, CommitChainView, type CommitChainViewProps, type CommitFlowIndex, type CommitFlowRecorderHandle, CommitInspector, type CommitInspectorProps, type CommitInspectorSlotProps, type CommitView, type CreateCommitFlowRecorderOptions, type CreateNodeViewRecorderOptions, type CreateTraceBundleOptions, type CreateTraceRuntimeOverlayOptions, type CreateTraceStructureRecorderOptions, type DagreTraceLayoutOptions, type DataDependency, type EdgeMinLenResolver, type EdgeWeightResolver, type ExecutionRecord, GROUP_CONTAINER_NODE_TYPE, GroupContainerNode, type GroupContainerNodeData, type GroupLayoutOptions, LoopBackEdge, MAIN_CHART_BOX_ID, type MainChartBoxOptions, type MinimalCommitFlowRecorder, type MinimalFlowRecorder, type MinimalNodeViewRecorder, type MinimalStructureRecorder, type NodeFootprint, NodeInspector, type NodeInspectorProps, type NodeInspectorSlotProps, type NodeSizeResolver, type NodeView, type NodeViewIndex, type NodeViewRecorderHandle, RunSlider, type RunSliderProps, type RuntimeExecutionStep, type RuntimeOverlay, type RuntimeOverlaySlice, type RuntimeStageId, type SiblingOrderResolver, type SliderSlotProps, SlotPillNode, type SlotPillNodeData, SmartStepEdge, type SnapLinearSuccessorsOptions, type StageId, StageNode, type StageNodeData, type StructureChain, type StructureChainLeaf, SubflowBreadcrumb, type SubflowBreadcrumbProps, type SubflowNavigation, SubflowTree, type SubflowTreeEntry, type SubflowTreeProps, TimeTravelDebugger, type TimeTravelDebuggerProps, type TraceBundle, type TraceEdge, type TraceEdgeData, TraceExplorerShell, type TraceExplorerShellProps, type TraceExplorerSlots, TraceFlow, type TraceFlowEdgeColors, type TraceFlowLayout, type TraceFlowProps, type TraceGraph, type TraceGroupLayoutOptions, type TraceNode, type TraceNodeData, type TraceRuntimeOverlayHandle, type TraceStructureRecorderHandle, TracedFlow, type TracedFlowColors, type TracedFlowProps, type TranslatorHandleLike, type WalkOptions, applyGroupLayout, asRuntimeStageId, asStageId, backtraceDataFlow, backtraceStructural, buildCommitChainTree, buildSubflowBreadcrumb, createCommitFlowRecorder, createDagreTraceLayout, createGroupedLayout, createMainChartBoxLayout, createNodeViewRecorder, createSnappedDagreLayout, createTraceBundle, createTraceGroupLayout, createTraceRuntimeOverlay, createTraceStructureRecorder, dagreTraceLayout, defaultTraceFlowLayout, filterGraphForDrill, forwardtraceStructural, sliceOverlay, snapLinearSuccessors, structureAsChainTree, traceGroupLayout, useSubflowNavigation, useTranslator, walkBackward, walkForward, wrapInMainChartBox };
|