footprintjs 4.0.5 → 4.2.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 (61) hide show
  1. package/CLAUDE.md +7 -0
  2. package/dist/esm/index.js +6 -1
  3. package/dist/esm/lib/builder/FlowChartBuilder.js +13 -8
  4. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  5. package/dist/esm/lib/engine/handlers/DeciderHandler.js +8 -7
  6. package/dist/esm/lib/engine/handlers/SelectorHandler.js +8 -5
  7. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +28 -246
  8. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +232 -139
  9. package/dist/esm/lib/engine/narrative/index.js +1 -1
  10. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  11. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +64 -22
  12. package/dist/esm/lib/engine/types.js +1 -1
  13. package/dist/esm/lib/memory/StageContext.js +36 -9
  14. package/dist/esm/lib/reactive/createTypedScope.js +9 -6
  15. package/dist/esm/lib/reactive/types.js +1 -1
  16. package/dist/esm/lib/recorder/CompositeRecorder.js +172 -0
  17. package/dist/esm/lib/recorder/index.js +2 -0
  18. package/dist/esm/lib/runner/FlowChartExecutor.js +33 -3
  19. package/dist/esm/lib/scope/ScopeFacade.js +52 -4
  20. package/dist/esm/lib/scope/recorders/DebugRecorder.js +18 -2
  21. package/dist/esm/lib/scope/recorders/MetricRecorder.js +51 -4
  22. package/dist/esm/recorders.js +6 -5
  23. package/dist/index.js +21 -15
  24. package/dist/lib/builder/FlowChartBuilder.js +13 -8
  25. package/dist/lib/engine/graph/StageNode.js +1 -1
  26. package/dist/lib/engine/handlers/DeciderHandler.js +8 -7
  27. package/dist/lib/engine/handlers/SelectorHandler.js +8 -5
  28. package/dist/lib/engine/handlers/SubflowExecutor.js +27 -245
  29. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +232 -139
  30. package/dist/lib/engine/narrative/index.js +1 -1
  31. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  32. package/dist/lib/engine/traversal/FlowchartTraverser.js +64 -22
  33. package/dist/lib/engine/types.js +1 -1
  34. package/dist/lib/memory/StageContext.js +36 -9
  35. package/dist/lib/reactive/createTypedScope.js +9 -6
  36. package/dist/lib/reactive/types.js +1 -1
  37. package/dist/lib/recorder/CompositeRecorder.js +176 -0
  38. package/dist/lib/recorder/index.js +6 -0
  39. package/dist/lib/runner/FlowChartExecutor.js +33 -3
  40. package/dist/lib/scope/ScopeFacade.js +52 -4
  41. package/dist/lib/scope/recorders/DebugRecorder.js +18 -2
  42. package/dist/lib/scope/recorders/MetricRecorder.js +51 -4
  43. package/dist/recorders.js +8 -6
  44. package/dist/types/index.d.ts +4 -0
  45. package/dist/types/lib/engine/graph/StageNode.d.ts +4 -0
  46. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +10 -29
  47. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +18 -1
  48. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  49. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +92 -0
  50. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +20 -8
  51. package/dist/types/lib/engine/types.d.ts +51 -0
  52. package/dist/types/lib/memory/StageContext.d.ts +14 -3
  53. package/dist/types/lib/reactive/types.d.ts +2 -0
  54. package/dist/types/lib/recorder/CompositeRecorder.d.ts +95 -0
  55. package/dist/types/lib/recorder/index.d.ts +2 -0
  56. package/dist/types/lib/runner/FlowChartExecutor.d.ts +27 -1
  57. package/dist/types/lib/scope/ScopeFacade.d.ts +11 -0
  58. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +16 -0
  59. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +47 -2
  60. package/dist/types/recorders.d.ts +9 -4
  61. package/package.json +1 -1
@@ -1,7 +1,33 @@
1
1
  /**
2
- * MetricRecorder — Production-focused recorder for timing and execution counts
2
+ * MetricRecorder — Production-focused recorder for timing and execution counts.
3
3
  *
4
4
  * Tracks read/write/commit counts per stage and measures stage execution duration.
5
+ *
6
+ * Each instance gets a unique auto-increment ID (`metrics-1`, `metrics-2`, ...),
7
+ * so multiple recorders with different configs coexist. Pass an explicit ID to
8
+ * override a specific instance (e.g., a framework-attached recorder).
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Track all stages (default)
13
+ * executor.attachRecorder(new MetricRecorder());
14
+ *
15
+ * // Track only LLM-related stages
16
+ * executor.attachRecorder(new MetricRecorder({
17
+ * stageFilter: (name) => ['CallLLM', 'ParseResponse'].includes(name),
18
+ * }));
19
+ *
20
+ * // Two recorders: one for LLM timing, one for everything else
21
+ * executor.attachRecorder(new MetricRecorder({
22
+ * stageFilter: (name) => name === 'CallLLM',
23
+ * }));
24
+ * executor.attachRecorder(new MetricRecorder({
25
+ * stageFilter: (name) => name !== 'CallLLM',
26
+ * }));
27
+ *
28
+ * // Override a framework-attached recorder by passing its well-known ID
29
+ * executor.attachRecorder(new MetricRecorder({ id: 'metrics' }));
30
+ * ```
5
31
  */
6
32
  import type { CommitEvent, ReadEvent, Recorder, StageEvent, WriteEvent } from '../types.js';
7
33
  export interface StageMetrics {
@@ -19,11 +45,30 @@ export interface AggregatedMetrics {
19
45
  totalCommits: number;
20
46
  stageMetrics: Map<string, StageMetrics>;
21
47
  }
48
+ /** Options for MetricRecorder. All fields are optional. */
49
+ export interface MetricRecorderOptions {
50
+ /** Recorder ID. Defaults to auto-increment (`metrics-1`, `metrics-2`, ...). */
51
+ id?: string;
52
+ /**
53
+ * Filter which stages are recorded. Return `true` to record, `false` to skip.
54
+ * When omitted, all stages are recorded.
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * // Only track stages that start with "Call"
59
+ * stageFilter: (name) => name.startsWith('Call')
60
+ * ```
61
+ */
62
+ stageFilter?: (stageName: string) => boolean;
63
+ }
22
64
  export declare class MetricRecorder implements Recorder {
65
+ private static _counter;
23
66
  readonly id: string;
24
67
  private metrics;
25
68
  private stageStartTimes;
26
- constructor(id?: string);
69
+ private stageFilter?;
70
+ constructor(idOrOptions?: string | MetricRecorderOptions);
71
+ private shouldRecord;
27
72
  onRead(event: ReadEvent): void;
28
73
  onWrite(event: WriteEvent): void;
29
74
  onCommit(event: CommitEvent): void;
@@ -23,8 +23,9 @@
23
23
  * Each factory returns the raw recorder instance with added short convenience methods.
24
24
  * Pass directly to chart.recorder(). No wrapping, no proxying -- just the class + shortcuts.
25
25
  */
26
+ import type { CombinedNarrativeRecorderOptions } from './lib/engine/narrative/CombinedNarrativeRecorder.js';
26
27
  import { CombinedNarrativeRecorder } from './lib/engine/narrative/CombinedNarrativeRecorder.js';
27
- import type { CombinedNarrativeEntry } from './lib/engine/narrative/narrativeTypes.js';
28
+ import type { BreakRenderContext, CombinedNarrativeEntry, DecisionRenderContext, ErrorRenderContext, ForkRenderContext, LoopRenderContext, NarrativeRenderer, OpRenderContext, SelectedRenderContext, StageRenderContext, SubflowRenderContext } from './lib/engine/narrative/narrativeTypes.js';
28
29
  import { AdaptiveNarrativeFlowRecorder } from './lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js';
29
30
  import type { ManifestEntry } from './lib/engine/narrative/recorders/ManifestFlowRecorder.js';
30
31
  import { ManifestFlowRecorder } from './lib/engine/narrative/recorders/ManifestFlowRecorder.js';
@@ -32,13 +33,13 @@ import { MilestoneNarrativeFlowRecorder } from './lib/engine/narrative/recorders
32
33
  import { WindowedNarrativeFlowRecorder } from './lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js';
33
34
  import type { DebugEntry, DebugRecorderOptions } from './lib/scope/recorders/DebugRecorder.js';
34
35
  import { DebugRecorder } from './lib/scope/recorders/DebugRecorder.js';
35
- import type { AggregatedMetrics, StageMetrics } from './lib/scope/recorders/MetricRecorder.js';
36
+ import type { AggregatedMetrics, MetricRecorderOptions, StageMetrics } from './lib/scope/recorders/MetricRecorder.js';
36
37
  import { MetricRecorder } from './lib/scope/recorders/MetricRecorder.js';
37
38
  export type NarrativeInstance = CombinedNarrativeRecorder & {
38
39
  lines(): string[];
39
40
  structured(): CombinedNarrativeEntry[];
40
41
  };
41
- export declare function narrative(): NarrativeInstance;
42
+ export declare function narrative(options?: CombinedNarrativeRecorderOptions): NarrativeInstance;
42
43
  export type MetricsInstance = MetricRecorder & {
43
44
  reads(): number;
44
45
  writes(): number;
@@ -46,7 +47,7 @@ export type MetricsInstance = MetricRecorder & {
46
47
  stage(name: string): StageMetrics | undefined;
47
48
  all(): AggregatedMetrics;
48
49
  };
49
- export declare function metrics(): MetricsInstance;
50
+ export declare function metrics(options?: MetricRecorderOptions): MetricsInstance;
50
51
  export type DebugInstance = DebugRecorder & {
51
52
  logs(): DebugEntry[];
52
53
  };
@@ -58,3 +59,7 @@ export declare function manifest(): ManifestInstance;
58
59
  export declare function adaptive(): AdaptiveNarrativeFlowRecorder;
59
60
  export declare function milestone(): MilestoneNarrativeFlowRecorder;
60
61
  export declare function windowed(maxEntries?: number): WindowedNarrativeFlowRecorder;
62
+ export type { BreakRenderContext, CombinedNarrativeRecorderOptions, DecisionRenderContext, ErrorRenderContext, ForkRenderContext, LoopRenderContext, NarrativeRenderer, OpRenderContext, SelectedRenderContext, StageRenderContext, SubflowRenderContext, };
63
+ export type { AggregatedMetrics, MetricRecorderOptions, StageMetrics };
64
+ export type { CompositeSnapshot } from './lib/recorder/index.js';
65
+ export { CompositeRecorder } from './lib/recorder/index.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "4.0.5",
3
+ "version": "4.2.0",
4
4
  "description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",