footprint-explainable-ui 0.18.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/adapters/fromRuntimeSnapshot.d.ts +33 -4
  2. package/dist/adapters/fromRuntimeSnapshot.d.ts.map +1 -1
  3. package/dist/adapters/fromRuntimeSnapshot.js +162 -33
  4. package/dist/adapters/fromRuntimeSnapshot.js.map +1 -1
  5. package/dist/components/ExplainableShell/ExplainableShell.d.ts +157 -14
  6. package/dist/components/ExplainableShell/ExplainableShell.d.ts.map +1 -1
  7. package/dist/components/ExplainableShell/ExplainableShell.js +676 -68
  8. package/dist/components/ExplainableShell/ExplainableShell.js.map +1 -1
  9. package/dist/components/ExplainableShell/index.d.ts +1 -1
  10. package/dist/components/ExplainableShell/index.d.ts.map +1 -1
  11. package/dist/components/FlowchartView/SubflowTree.d.ts +7 -14
  12. package/dist/components/FlowchartView/SubflowTree.d.ts.map +1 -1
  13. package/dist/components/FlowchartView/SubflowTree.js +56 -46
  14. package/dist/components/FlowchartView/SubflowTree.js.map +1 -1
  15. package/dist/components/FlowchartView/index.d.ts +32 -4
  16. package/dist/components/FlowchartView/index.d.ts.map +1 -1
  17. package/dist/components/FlowchartView/index.js +22 -2
  18. package/dist/components/FlowchartView/index.js.map +1 -1
  19. package/dist/components/FlowchartView/useSubflowNavigation.d.ts +41 -16
  20. package/dist/components/FlowchartView/useSubflowNavigation.d.ts.map +1 -1
  21. package/dist/components/FlowchartView/useSubflowNavigation.js +69 -50
  22. package/dist/components/FlowchartView/useSubflowNavigation.js.map +1 -1
  23. package/dist/components/GanttTimeline/GanttTimeline.d.ts.map +1 -1
  24. package/dist/components/GanttTimeline/GanttTimeline.js +5 -5
  25. package/dist/components/GanttTimeline/GanttTimeline.js.map +1 -1
  26. package/dist/components/MemoryInspector/MemoryInspector.d.ts.map +1 -1
  27. package/dist/components/MemoryInspector/MemoryInspector.js +36 -13
  28. package/dist/components/MemoryInspector/MemoryInspector.js.map +1 -1
  29. package/dist/components/NarrativeTrace/NarrativeTrace.d.ts.map +1 -1
  30. package/dist/components/NarrativeTrace/NarrativeTrace.js +24 -17
  31. package/dist/components/NarrativeTrace/NarrativeTrace.js.map +1 -1
  32. package/dist/components/ScopeDiff/ScopeDiff.js +3 -3
  33. package/dist/components/ScopeDiff/ScopeDiff.js.map +1 -1
  34. package/dist/components/StageNode/StageNode.d.ts +21 -0
  35. package/dist/components/StageNode/StageNode.d.ts.map +1 -1
  36. package/dist/components/StageNode/StageNode.js +189 -9
  37. package/dist/components/StageNode/StageNode.js.map +1 -1
  38. package/dist/components/TimeTravelControls/TimeTravelControls.d.ts.map +1 -1
  39. package/dist/components/TimeTravelControls/TimeTravelControls.js +19 -3
  40. package/dist/components/TimeTravelControls/TimeTravelControls.js.map +1 -1
  41. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts +19 -8
  42. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.d.ts.map +1 -1
  43. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js +23 -8
  44. package/dist/components/TimeTravelDebugger/TimeTravelDebugger.js.map +1 -1
  45. package/dist/flowchart.cjs +3485 -1340
  46. package/dist/flowchart.cjs.map +1 -1
  47. package/dist/flowchart.d.cts +1616 -177
  48. package/dist/flowchart.d.ts +1616 -177
  49. package/dist/flowchart.d.ts.map +1 -1
  50. package/dist/flowchart.js +3507 -1384
  51. package/dist/flowchart.js.map +1 -1
  52. package/dist/index.cjs +741 -556
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +262 -29
  55. package/dist/index.d.ts +262 -29
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +734 -546
  58. package/dist/index.js.map +1 -1
  59. package/dist/theme/ThemeProvider.d.ts +14 -0
  60. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  61. package/dist/theme/ThemeProvider.js +15 -1
  62. package/dist/theme/ThemeProvider.js.map +1 -1
  63. package/dist/theme/index.d.ts +4 -2
  64. package/dist/theme/index.d.ts.map +1 -1
  65. package/dist/theme/index.js +3 -2
  66. package/dist/theme/index.js.map +1 -1
  67. package/dist/theme/presets.d.ts +3 -0
  68. package/dist/theme/presets.d.ts.map +1 -1
  69. package/dist/theme/presets.js +22 -0
  70. package/dist/theme/presets.js.map +1 -1
  71. package/dist/theme/tokens.d.ts +22 -1
  72. package/dist/theme/tokens.d.ts.map +1 -1
  73. package/dist/theme/tokens.js +23 -2
  74. package/dist/theme/tokens.js.map +1 -1
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/dist/types.d.ts +25 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/package.json +4 -4
  79. package/dist/components/FlowchartView/FlowchartView.d.ts +0 -20
  80. package/dist/components/FlowchartView/FlowchartView.d.ts.map +0 -1
  81. package/dist/components/FlowchartView/FlowchartView.js +0 -80
  82. package/dist/components/FlowchartView/FlowchartView.js.map +0 -1
  83. package/dist/components/FlowchartView/TracedFlowchartView.d.ts +0 -20
  84. package/dist/components/FlowchartView/TracedFlowchartView.d.ts.map +0 -1
  85. package/dist/components/FlowchartView/TracedFlowchartView.js +0 -101
  86. package/dist/components/FlowchartView/TracedFlowchartView.js.map +0 -1
  87. package/dist/components/FlowchartView/specToReactFlow.d.ts +0 -56
  88. package/dist/components/FlowchartView/specToReactFlow.d.ts.map +0 -1
  89. package/dist/components/FlowchartView/specToReactFlow.js +0 -202
  90. package/dist/components/FlowchartView/specToReactFlow.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import type { StageSnapshot } from "../types";
1
+ import type { StageSnapshot, NarrativeEntry } from "../types";
2
2
  /**
3
3
  * Shape of FootPrint's RuntimeSnapshot (from FlowChartExecutor.getSnapshot()).
4
4
  * We define it here instead of importing to avoid a hard dependency on footprintjs.
@@ -8,6 +8,8 @@ interface RuntimeStageSnapshot {
8
8
  name?: string;
9
9
  isDecider?: boolean;
10
10
  isFork?: boolean;
11
+ /** User-level writes made by this stage (pre-namespace keys → values). */
12
+ stageWrites?: Record<string, unknown>;
11
13
  logs: Record<string, unknown>;
12
14
  errors: Record<string, unknown>;
13
15
  metrics: Record<string, unknown>;
@@ -18,23 +20,51 @@ interface RuntimeStageSnapshot {
18
20
  next?: RuntimeStageSnapshot;
19
21
  children?: RuntimeStageSnapshot[];
20
22
  }
23
+ interface RecorderSnapshot {
24
+ id: string;
25
+ name: string;
26
+ data: unknown;
27
+ }
21
28
  interface RuntimeSnapshot {
22
29
  sharedState: Record<string, unknown>;
23
30
  executionTree: RuntimeStageSnapshot;
24
31
  commitLog: unknown[];
32
+ /** Per-subflow execution results (keyed by subflowId). */
33
+ subflowResults?: Record<string, unknown>;
34
+ /** Snapshots from recorders that implement toSnapshot() (e.g. MetricRecorder). */
35
+ recorders?: RecorderSnapshot[];
25
36
  }
37
+ export type { NarrativeEntry } from '../types';
26
38
  /**
27
39
  * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots
28
40
  * suitable for visualization components.
29
41
  *
42
+ * The `narrativeEntries` parameter (from `executor.getNarrativeEntries()`)
43
+ * distributes the library's rich combined narrative per-stage.
44
+ * When narrative is not enabled, stages get "Narrative not available" —
45
+ * this adapter reflects what the library produces, nothing more.
46
+ *
30
47
  * Usage:
31
48
  * ```ts
32
49
  * const executor = new FlowChartExecutor(chart);
33
50
  * await executor.run();
34
- * const snapshots = toVisualizationSnapshots(executor.getSnapshot());
51
+ * const snapshots = toVisualizationSnapshots(
52
+ * executor.getSnapshot(),
53
+ * executor.getNarrativeEntries(),
54
+ * );
35
55
  * ```
36
56
  */
37
- export declare function toVisualizationSnapshots(runtime: RuntimeSnapshot): StageSnapshot[];
57
+ export declare function toVisualizationSnapshots(runtime: RuntimeSnapshot, narrativeEntries?: NarrativeEntry[]): StageSnapshot[];
58
+ /**
59
+ * Converts a footprintjs SubflowResult (stored on StageSnapshot.subflowResult)
60
+ * into visualization snapshots for drill-down views.
61
+ *
62
+ * SubflowResult shape (from footprintjs):
63
+ * { subflowId, subflowName, treeContext: { globalContext, stageContexts, history }, parentStageId }
64
+ *
65
+ * Returns empty array if the input is not a valid SubflowResult.
66
+ */
67
+ export declare function subflowResultToSnapshots(subflowResult: unknown, narrativeEntries?: NarrativeEntry[]): StageSnapshot[];
38
68
  /**
39
69
  * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).
40
70
  * Useful for testing or custom data sources.
@@ -48,5 +78,4 @@ export declare function createSnapshots(stages: Array<{
48
78
  description?: string;
49
79
  subflowId?: string;
50
80
  }>): StageSnapshot[];
51
- export {};
52
81
  //# sourceMappingURL=fromRuntimeSnapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fromRuntimeSnapshot.d.ts","sourceRoot":"","sources":["../../src/adapters/fromRuntimeSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;;GAGG;AACH,UAAU,oBAAoB;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,EAAE,oBAAoB,CAAC;IACpC,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,eAAe,GACvB,aAAa,EAAE,CAIjB;AAkFD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GACD,aAAa,EAAE,CAkBjB"}
1
+ {"version":3,"file":"fromRuntimeSnapshot.d.ts","sourceRoot":"","sources":["../../src/adapters/fromRuntimeSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9D;;;GAGG;AACH,UAAU,oBAAoB;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,EAAE,oBAAoB,CAAC;IACpC,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,kFAAkF;IAClF,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAID,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,eAAe,EACxB,gBAAgB,CAAC,EAAE,cAAc,EAAE,GAClC,aAAa,EAAE,CAWjB;AAgKD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,OAAO,EACtB,gBAAgB,CAAC,EAAE,cAAc,EAAE,GAClC,aAAa,EAAE,CAoCjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GACD,aAAa,EAAE,CAkBjB"}
@@ -2,34 +2,142 @@
2
2
  * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots
3
3
  * suitable for visualization components.
4
4
  *
5
+ * The `narrativeEntries` parameter (from `executor.getNarrativeEntries()`)
6
+ * distributes the library's rich combined narrative per-stage.
7
+ * When narrative is not enabled, stages get "Narrative not available" —
8
+ * this adapter reflects what the library produces, nothing more.
9
+ *
5
10
  * Usage:
6
11
  * ```ts
7
12
  * const executor = new FlowChartExecutor(chart);
8
13
  * await executor.run();
9
- * const snapshots = toVisualizationSnapshots(executor.getSnapshot());
14
+ * const snapshots = toVisualizationSnapshots(
15
+ * executor.getSnapshot(),
16
+ * executor.getNarrativeEntries(),
17
+ * );
10
18
  * ```
11
19
  */
12
- export function toVisualizationSnapshots(runtime) {
20
+ export function toVisualizationSnapshots(runtime, narrativeEntries) {
21
+ const stageNarrativeMap = narrativeEntries?.length
22
+ ? buildStageNarrativeMap(narrativeEntries)
23
+ : new Map();
24
+ // Extract per-stage timings from MetricRecorder if present in snapshot.recorders.
25
+ const stageTimings = extractStageTimings(runtime.recorders);
13
26
  const snapshots = [];
14
- flattenTree(runtime.executionTree, snapshots, runtime.sharedState);
27
+ flattenTree(runtime.executionTree, snapshots, runtime.sharedState, 0, runtime.subflowResults, {}, stageNarrativeMap, stageTimings);
15
28
  return snapshots;
16
29
  }
17
- function flattenTree(node, out, sharedState, accumulatedMs = 0) {
18
- // Estimate duration from metrics if available
19
- const durationMs = typeof node.metrics?.durationMs === "number"
20
- ? node.metrics.durationMs
21
- : 1;
30
+ /**
31
+ * Extracts per-stage duration data from recorder snapshots.
32
+ *
33
+ * Post-KeyedRecorder MetricRecorder serializes as
34
+ * { name: 'Metrics', data: { steps: { [runtimeStageId]: { stageName, duration, ... } } } }
35
+ *
36
+ * Older versions emitted `data.stages[stageName].totalDuration` directly;
37
+ * we still accept that shape for back-compat when loading old snapshots.
38
+ *
39
+ * Stages that ran multiple times (e.g. CallLLM inside a loop) have one
40
+ * entry per invocation keyed by runtimeStageId — sum their durations by
41
+ * stageName so the GanttTimeline shows cumulative wall time per stage.
42
+ */
43
+ function extractStageTimings(recorders) {
44
+ const timings = new Map();
45
+ if (!recorders)
46
+ return timings;
47
+ for (const rec of recorders) {
48
+ if (rec.name !== 'Metrics' || !rec.data || typeof rec.data !== 'object')
49
+ continue;
50
+ const data = rec.data;
51
+ // New shape: data.steps[runtimeStageId] = { stageName, duration, ... }
52
+ if (data.steps) {
53
+ for (const step of Object.values(data.steps)) {
54
+ const name = step?.stageName;
55
+ const d = step?.duration;
56
+ if (!name || typeof d !== 'number' || d <= 0)
57
+ continue;
58
+ timings.set(name, Math.round((timings.get(name) ?? 0) + d));
59
+ }
60
+ }
61
+ // Legacy shape: data.stages[stageName].totalDuration
62
+ if (data.stages) {
63
+ for (const [stageName, metrics] of Object.entries(data.stages)) {
64
+ if (typeof metrics.totalDuration === 'number' && metrics.totalDuration > 0) {
65
+ timings.set(stageName, Math.round(metrics.totalDuration));
66
+ }
67
+ }
68
+ }
69
+ }
70
+ return timings;
71
+ }
72
+ /**
73
+ * Groups narrative entries by stage name, preserving non-stage entries
74
+ * (conditions, forks) attached to the preceding stage.
75
+ */
76
+ function buildStageNarrativeMap(entries) {
77
+ const map = new Map();
78
+ let currentStageName;
79
+ for (const entry of entries) {
80
+ if (entry.stageName) {
81
+ currentStageName = entry.stageName;
82
+ }
83
+ if (currentStageName) {
84
+ if (!map.has(currentStageName)) {
85
+ map.set(currentStageName, []);
86
+ }
87
+ const indent = ' '.repeat(entry.depth);
88
+ map.get(currentStageName).push(`${indent}${entry.text}`);
89
+ }
90
+ }
91
+ return map;
92
+ }
93
+ function flattenTree(node, out, sharedState, accumulatedMs = 0, subflowResults, cumulativeMemory = {}, stageNarrativeMap = new Map(), stageTimings = new Map()) {
94
+ // Prefer MetricRecorder timing (real wall-clock), then scope.$metric('durationMs'), then 0.
95
+ const stageName = node.name ?? node.id;
96
+ const durationMs = (stageName ? stageTimings.get(stageName) : undefined) ??
97
+ (typeof node.metrics?.durationMs === "number" ? node.metrics.durationMs : 0);
22
98
  const startMs = accumulatedMs;
23
- // Build narrative from logs
24
- const narrative = buildNarrative(node);
25
- // Build memory from logs (key-value pairs written during this stage)
26
- const memory = {};
27
- if (node.logs) {
28
- Object.assign(memory, node.logs);
99
+ // Use id for matching (stable, matches spec node ids).
100
+ // name may carry display prefixes like "[service-name] STAGE".
101
+ const stageId = node.id || node.name || 'unknown';
102
+ const displayName = node.name || node.id || 'unknown';
103
+ // Narrative comes from the library. When not available (e.g. subflow internals
104
+ // where the root recorder only captures enter/exit markers), build a basic
105
+ // narrative from the stage name, description, and data operations.
106
+ // Try id first, then name — narrative entries use node.name (may be prefixed)
107
+ // while snapshot uses node.id (stable). Both need to match for subflows.
108
+ const stageLines = stageNarrativeMap.get(stageId) ?? stageNarrativeMap.get(displayName);
109
+ let narrative;
110
+ if (stageLines) {
111
+ narrative = stageLines.join('\n');
112
+ }
113
+ else {
114
+ const parts = [`${displayName} executed.`];
115
+ if (node.description)
116
+ parts.push(node.description);
117
+ if (node.stageWrites) {
118
+ const keys = Object.keys(node.stageWrites);
119
+ if (keys.length > 0)
120
+ parts.push(`Wrote: ${keys.join(', ')}`);
121
+ }
122
+ narrative = parts.join('\n');
29
123
  }
124
+ // Build cumulative memory from stageWrites (actual setValue/updateValue calls)
125
+ const memory = { ...cumulativeMemory };
126
+ if (node.stageWrites) {
127
+ for (const [key, value] of Object.entries(node.stageWrites)) {
128
+ if (value === undefined) {
129
+ delete memory[key];
130
+ }
131
+ else {
132
+ memory[key] = value;
133
+ }
134
+ }
135
+ }
136
+ const sfResult = subflowResults?.[node.subflowId ?? stageId];
30
137
  out.push({
31
- stageName: node.name || node.id,
32
- stageLabel: node.name || node.id,
138
+ stageName: displayName,
139
+ stageLabel: stageId,
140
+ runtimeStageId: node.runtimeStageId ?? undefined,
33
141
  memory,
34
142
  narrative,
35
143
  startMs,
@@ -37,39 +145,60 @@ function flattenTree(node, out, sharedState, accumulatedMs = 0) {
37
145
  status: "done",
38
146
  ...(node.description ? { description: node.description } : undefined),
39
147
  ...(node.subflowId ? { subflowId: node.subflowId } : undefined),
148
+ ...(sfResult ? { subflowResult: sfResult } : undefined),
40
149
  });
41
150
  let nextMs = startMs + durationMs;
42
151
  // Handle parallel children (fork)
43
152
  if (node.children && node.children.length > 0) {
44
153
  let maxChildEnd = nextMs;
45
154
  for (const child of node.children) {
46
- const childEnd = flattenTree(child, out, sharedState, nextMs);
155
+ const childEnd = flattenTree(child, out, sharedState, nextMs, subflowResults, memory, stageNarrativeMap, stageTimings);
47
156
  maxChildEnd = Math.max(maxChildEnd, childEnd);
48
157
  }
49
158
  nextMs = maxChildEnd;
50
159
  }
51
160
  // Handle linear continuation
52
161
  if (node.next) {
53
- nextMs = flattenTree(node.next, out, sharedState, nextMs);
162
+ nextMs = flattenTree(node.next, out, sharedState, nextMs, subflowResults, memory, stageNarrativeMap, stageTimings);
54
163
  }
55
164
  return nextMs;
56
165
  }
57
- function buildNarrative(node) {
58
- const parts = [];
59
- if (node.name) {
60
- parts.push(`Stage "${node.name}" executed.`);
61
- }
62
- if (node.logs && Object.keys(node.logs).length > 0) {
63
- const keys = Object.keys(node.logs);
64
- parts.push(`Wrote ${keys.length} key(s): ${keys.join(", ")}.`);
65
- }
66
- if (node.errors && Object.keys(node.errors).length > 0) {
67
- parts.push(`Errors: ${JSON.stringify(node.errors)}`);
68
- }
69
- if (node.isFork) {
70
- parts.push(`Forked into ${node.children?.length ?? 0} parallel branch(es).`);
166
+ /**
167
+ * Converts a footprintjs SubflowResult (stored on StageSnapshot.subflowResult)
168
+ * into visualization snapshots for drill-down views.
169
+ *
170
+ * SubflowResult shape (from footprintjs):
171
+ * { subflowId, subflowName, treeContext: { globalContext, stageContexts, history }, parentStageId }
172
+ *
173
+ * Returns empty array if the input is not a valid SubflowResult.
174
+ */
175
+ export function subflowResultToSnapshots(subflowResult, narrativeEntries) {
176
+ if (!subflowResult || typeof subflowResult !== 'object')
177
+ return [];
178
+ const sf = subflowResult;
179
+ if (!sf.treeContext?.stageContexts)
180
+ return [];
181
+ const runtime = {
182
+ sharedState: sf.treeContext.globalContext ?? {},
183
+ executionTree: sf.treeContext.stageContexts,
184
+ commitLog: sf.treeContext.history ?? [],
185
+ };
186
+ const snapshots = toVisualizationSnapshots(runtime, narrativeEntries);
187
+ // Strip subflow prefix from stage names so they match the spec node names.
188
+ // Runtime names are prefixed (e.g., "analyze/SeedScope") but spec nodes
189
+ // use unprefixed names (e.g., "SeedScope").
190
+ const prefix = sf.subflowId ? `${sf.subflowId}/` : '';
191
+ if (prefix) {
192
+ for (const snap of snapshots) {
193
+ if (snap.stageName.startsWith(prefix)) {
194
+ snap.stageName = snap.stageName.slice(prefix.length);
195
+ }
196
+ if (snap.stageLabel.startsWith(prefix)) {
197
+ snap.stageLabel = snap.stageLabel.slice(prefix.length);
198
+ }
199
+ }
71
200
  }
72
- return parts.join(" ") || `Stage ${node.id} completed.`;
201
+ return snapshots;
73
202
  }
74
203
  /**
75
204
  * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).
@@ -1 +1 @@
1
- {"version":3,"file":"fromRuntimeSnapshot.js","sourceRoot":"","sources":["../../src/adapters/fromRuntimeSnapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fromRuntimeSnapshot.js","sourceRoot":"","sources":["../../src/adapters/fromRuntimeSnapshot.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,169 @@
1
- import type { StageSnapshot, BaseComponentProps } from "../../types";
2
- export type ShellTab = "result" | "explainable" | "ai-compatible";
1
+ import type { StageSnapshot, BaseComponentProps, NarrativeEntry } from "../../types";
2
+ /**
3
+ * Minimal subflow-walking spec shape. Used INTERNALLY by drill-down
4
+ * resolution (which navigates `subflowStructure` to find a child chart
5
+ * inside the parent's serialized structure). No longer used for chart
6
+ * rendering — that happens via `traceGraph` + `<TracedFlow>` exclusively.
7
+ *
8
+ * Kept as a local type so the file no longer depends on any legacy
9
+ * spec-walk module.
10
+ */
11
+ export interface SpecNode {
12
+ name: string;
13
+ id?: string;
14
+ description?: string;
15
+ children?: SpecNode[];
16
+ next?: SpecNode;
17
+ isSubflowRoot?: boolean;
18
+ subflowId?: string;
19
+ subflowName?: string;
20
+ subflowStructure?: SpecNode;
21
+ }
22
+ /** Tab ID — "result", "memory", "narrative", or any custom recorder view ID. */
23
+ export type ShellTab = string;
24
+ export interface PanelLabels {
25
+ /** Left panel pill label (subflow tree). Default: "Topology" */
26
+ topology?: string;
27
+ /** Right panel pill label (memory/narrative). Default: "Details" */
28
+ details?: string;
29
+ /** Bottom panel pill label (timeline). Default: "Timeline" */
30
+ timeline?: string;
31
+ }
32
+ /** Which panels start expanded. Default: `{ details: true }` (flowchart + memory). */
33
+ export interface DefaultExpanded {
34
+ topology?: boolean;
35
+ details?: boolean;
36
+ timeline?: boolean;
37
+ }
38
+ /**
39
+ * Raw runtime snapshot from FlowChartExecutor.getSnapshot().
40
+ * When provided, ExplainableShell converts it internally — zero boilerplate.
41
+ */
42
+ export interface RuntimeSnapshotInput {
43
+ sharedState: Record<string, unknown>;
44
+ executionTree: unknown;
45
+ commitLog: unknown[];
46
+ subflowResults?: Record<string, unknown>;
47
+ /** Recorder snapshots from toSnapshot() — auto-generates detail tabs. */
48
+ recorders?: Array<{
49
+ id: string;
50
+ name: string;
51
+ description?: string;
52
+ preferredOperation?: 'translate' | 'accumulate' | 'aggregate';
53
+ data: unknown;
54
+ }>;
55
+ }
56
+ /**
57
+ * A recorder view that appears as a tab in the details panel.
58
+ * Each recorder provides its own per-stage rendering.
59
+ * Memory and Narrative are built-in defaults — add more via this prop.
60
+ */
61
+ export interface RecorderView {
62
+ /** Unique key for this view tab */
63
+ id: string;
64
+ /** Display label on the tab */
65
+ name: string;
66
+ /** Short description shown as tooltip and header for auto-detected views.
67
+ * e.g., "Per-step timing and I/O counts (KeyedRecorder)" */
68
+ description?: string;
69
+ /**
70
+ * Render function — receives the current snapshot index and all snapshots.
71
+ * Return a React node to display in the details panel.
72
+ */
73
+ render: (props: {
74
+ snapshots: StageSnapshot[];
75
+ selectedIndex: number;
76
+ }) => React.ReactNode;
77
+ }
3
78
  export interface ExplainableShellProps extends BaseComponentProps {
4
- /** Stage snapshots for time-travel visualization */
5
- snapshots: StageSnapshot[];
6
- /** Final pipeline result data */
79
+ /**
80
+ * Pre-converted visualization snapshots. Use when you've already called
81
+ * toVisualizationSnapshots() yourself.
82
+ */
83
+ snapshots?: StageSnapshot[];
84
+ /**
85
+ * Raw runtime snapshot from executor.getSnapshot(). The shell converts it
86
+ * internally via toVisualizationSnapshots(). When provided, `snapshots`
87
+ * and `resultData` are derived automatically. Pair with
88
+ * `narrativeEntries` for rich per-stage narrative.
89
+ *
90
+ * Usage: `<ExplainableShell runtimeSnapshot={executor.getSnapshot()} narrativeEntries={executor.getNarrativeEntries()} spec={spec} />`
91
+ */
92
+ runtimeSnapshot?: RuntimeSnapshotInput | null;
93
+ spec?: SpecNode | null;
94
+ /**
95
+ * Build-time graph captured live via `createTraceStructureRecorder`.
96
+ * REQUIRED for chart rendering (v6+) — the legacy `spec` →
97
+ * legacy spec-walk post-walk path was removed in favor of this
98
+ * recorder-driven graph.
99
+ *
100
+ * Pair with `runtimeOverlay` for the full time-travel trace UI.
101
+ * When `traceGraph` is set but `runtimeOverlay` is absent, the
102
+ * chart renders without runtime coloring (build-time-only view).
103
+ *
104
+ * The `spec` prop, when also provided, is used INTERNALLY for
105
+ * subflow drill-down resolution (navigating `subflowStructure` to
106
+ * find a child chart inside the parent's serialized structure) —
107
+ * NOT for rendering.
108
+ */
109
+ traceGraph?: import("../FlowchartView/traceStructureRecorder").TraceGraph | null;
110
+ /**
111
+ * Runtime overlay captured live via `createTraceRuntimeOverlay`.
112
+ * Pair with `traceGraph` to drive `<TracedFlow>` for the full
113
+ * time-travel trace UI.
114
+ */
115
+ runtimeOverlay?: import("../FlowchartView/createTraceRuntimeOverlay").RuntimeOverlay | null;
116
+ title?: string;
7
117
  resultData?: Record<string, unknown> | null;
8
- /** Console log lines */
9
118
  logs?: string[];
10
- /** Combined narrative lines */
11
- narrative?: string[];
12
- /** Which tabs to show (default: all three) */
119
+ /** Structured narrative entries from `executor.getNarrativeEntries()`.
120
+ * This is the only narrative input — the flat-string form was
121
+ * removed; call `.map(e => e.text)` if you need it. */
122
+ narrativeEntries?: NarrativeEntry[];
13
123
  tabs?: ShellTab[];
14
- /** Initially active tab */
15
124
  defaultTab?: ShellTab;
16
- /** Hide console in result tab */
17
125
  hideConsole?: boolean;
18
- /** Custom content to render in each tab slot */
126
+ /** Hide specific detail tabs (e.g., ['result', 'memory']). */
127
+ hideTabs?: string[];
128
+ /** Customize the labels on collapsible panel pills */
129
+ panelLabels?: PanelLabels;
130
+ /** Which panels start expanded. Default: `{ details: true }` */
131
+ defaultExpanded?: DefaultExpanded;
132
+ /**
133
+ * Recorder views — each becomes a tab in the details panel.
134
+ * Default: Memory + Narrative. Pass additional recorder views
135
+ * to show tokens, cost, tools, permissions, or custom data.
136
+ *
137
+ * Usage:
138
+ * recorderViews={[
139
+ * { id: 'tokens', name: 'Tokens', render: ({ selectedIndex }) => <div>...</div> },
140
+ * ]}
141
+ */
142
+ recorderViews?: RecorderView[];
143
+ /**
144
+ * Custom flowchart renderer. When omitted, ExplainableShell renders
145
+ * via `<TracedFlow graph={traceGraph} overlay={runtimeOverlay} />` —
146
+ * the recorder-driven path. Override to plug a custom chart UI; the
147
+ * `spec` parameter is forwarded only for backward-compatible
148
+ * signatures (it's the same SpecNode used for drill-down) and may
149
+ * be `null` once consumers stop threading it in.
150
+ */
19
151
  renderFlowchart?: (props: {
152
+ spec: SpecNode | null;
20
153
  snapshots: StageSnapshot[];
21
154
  selectedIndex: number;
22
- onNodeClick?: (index: number) => void;
155
+ onNodeClick?: (indexOrId: number | string) => void;
156
+ showStageId?: boolean;
23
157
  }) => React.ReactNode;
158
+ /**
159
+ * When true, render each node's stable `stageId` as a small monospace
160
+ * caption beneath the label in the default flowchart renderer.
161
+ * Teaching aid: it reveals the key recorders use
162
+ * (`runtimeStageId = [subflowPath/]stageId#executionIndex`) so a
163
+ * consumer can map any recorder's per-stage data back to a node.
164
+ * Default false.
165
+ */
166
+ showStageId?: boolean;
24
167
  }
25
- export declare function ExplainableShell({ snapshots, resultData, logs, narrative, tabs, defaultTab, hideConsole, renderFlowchart, size, unstyled, className, style, }: ExplainableShellProps): import("react/jsx-runtime").JSX.Element;
168
+ export declare function ExplainableShell({ snapshots: snapshotsProp, runtimeSnapshot, spec, title, resultData: resultDataProp, logs, narrativeEntries, tabs, defaultTab, hideConsole, hideTabs: hideTabsProp, panelLabels, defaultExpanded, recorderViews, renderFlowchart, showStageId, traceGraph, runtimeOverlay, size, unstyled, className, style, }: ExplainableShellProps): import("react/jsx-runtime").JSX.Element;
26
169
  //# sourceMappingURL=ExplainableShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExplainableShell.d.ts","sourceRoot":"","sources":["../../../src/components/ExplainableShell/ExplainableShell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAarE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAC;AAElE,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,oDAAoD;IACpD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,SAAS,EAAE,aAAa,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACvC,KAAK,KAAK,CAAC,SAAS,CAAC;CACvB;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,UAAU,EACV,IAAS,EACT,SAAc,EACd,IAAiD,EACjD,UAAU,EACV,WAAmB,EACnB,eAAe,EACf,IAAgB,EAChB,QAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,qBAAqB,2CAoQvB"}
1
+ {"version":3,"file":"ExplainableShell.d.ts","sourceRoot":"","sources":["../../../src/components/ExplainableShell/ExplainableShell.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAarF;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;CAC7B;AASD,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAc9B,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,yEAAyE;IACzE,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;QAC9D,IAAI,EAAE,OAAO,CAAC;KACf,CAAC,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb;iEAC6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,aAAa,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;CAC3F;AAED,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;;OAGG;IACH,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC9C,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,EAAE,OAAO,yCAAyC,EAAE,UAAU,GAAG,IAAI,CAAC;IACjF;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,4CAA4C,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;4DAEwD;IACxD,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gEAAgE;IAChE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;QACtB,SAAS,EAAE,aAAa,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;QACnD,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,KAAK,KAAK,CAAC,SAAS,CAAC;IACtB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA+nBD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EAAE,aAAa,EACxB,eAAe,EACf,IAAI,EACJ,KAAK,EACL,UAAU,EAAE,cAAc,EAC1B,IAAS,EACT,gBAAgB,EAChB,IAAgC,EAChC,UAAU,EACV,WAAmB,EACnB,QAAQ,EAAE,YAAY,EACtB,WAAW,EACX,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAmB,EACnB,UAAU,EACV,cAAc,EACd,IAAgB,EAChB,QAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,qBAAqB,2CAshBvB"}