footprintjs 4.1.0 → 4.3.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/CLAUDE.md +49 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +53 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +14 -1
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +7 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +7 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +13 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +8 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +39 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +31 -1
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +10 -1
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +3 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +8 -1
- package/dist/esm/lib/engine/types.js +2 -1
- package/dist/esm/lib/pause/index.js +2 -0
- package/dist/esm/lib/pause/types.js +58 -0
- package/dist/esm/lib/reactive/types.js +2 -1
- package/dist/esm/lib/recorder/CompositeRecorder.js +172 -0
- package/dist/esm/lib/recorder/index.js +2 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +11 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +260 -8
- package/dist/esm/lib/scope/ScopeFacade.js +23 -1
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +36 -2
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +60 -4
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/recorders.js +4 -3
- package/dist/index.js +21 -15
- package/dist/lib/builder/FlowChartBuilder.js +53 -1
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +14 -1
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +7 -1
- package/dist/lib/engine/handlers/StageRunner.js +17 -5
- package/dist/lib/engine/handlers/SubflowExecutor.js +8 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +39 -1
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +31 -1
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +10 -1
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +3 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -1
- package/dist/lib/engine/types.js +6 -2
- package/dist/lib/pause/index.js +8 -0
- package/dist/lib/pause/types.js +64 -0
- package/dist/lib/reactive/types.js +2 -1
- package/dist/lib/recorder/CompositeRecorder.js +176 -0
- package/dist/lib/recorder/index.js +6 -0
- package/dist/lib/runner/ExecutionRuntime.js +11 -2
- package/dist/lib/runner/FlowChartExecutor.js +260 -8
- package/dist/lib/scope/ScopeFacade.js +23 -1
- package/dist/lib/scope/recorders/DebugRecorder.js +36 -2
- package/dist/lib/scope/recorders/MetricRecorder.js +60 -4
- package/dist/lib/scope/types.js +1 -1
- package/dist/recorders.js +6 -4
- package/dist/types/index.d.ts +8 -1
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +22 -0
- package/dist/types/lib/builder/types.d.ts +3 -1
- package/dist/types/lib/engine/graph/StageNode.d.ts +9 -0
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +9 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -0
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +3 -1
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +2 -0
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +24 -0
- package/dist/types/lib/engine/types.d.ts +23 -0
- package/dist/types/lib/pause/index.d.ts +2 -0
- package/dist/types/lib/pause/types.d.ts +175 -0
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +95 -0
- package/dist/types/lib/recorder/index.d.ts +2 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +78 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +4 -0
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +20 -2
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +51 -3
- package/dist/types/lib/scope/types.d.ts +10 -0
- package/dist/types/recorders.d.ts +5 -2
- package/package.json +1 -1
|
@@ -62,6 +62,10 @@ export declare class ScopeFacade {
|
|
|
62
62
|
/** @internal */
|
|
63
63
|
notifyStageEnd(duration?: number): void;
|
|
64
64
|
/** @internal */
|
|
65
|
+
notifyPause(stageId: string, pauseData?: unknown): void;
|
|
66
|
+
/** @internal */
|
|
67
|
+
notifyResume(stageId: string, hasInput: boolean): void;
|
|
68
|
+
/** @internal */
|
|
65
69
|
notifyCommit(mutations: CommitEvent['mutations']): void;
|
|
66
70
|
/** Called by StageContext.commit() observer. Converts tracked writes to CommitEvent format.
|
|
67
71
|
* Errors are caught to prevent recorder issues from aborting the traversal. */
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Captures errors (always), mutations and reads (in verbose mode),
|
|
5
5
|
* and stage lifecycle events for troubleshooting.
|
|
6
6
|
*/
|
|
7
|
-
import type { ErrorEvent, ReadEvent, Recorder, StageEvent, WriteEvent } from '../types.js';
|
|
7
|
+
import type { ErrorEvent, PauseEvent, ReadEvent, Recorder, ResumeEvent, StageEvent, WriteEvent } from '../types.js';
|
|
8
8
|
export type DebugVerbosity = 'minimal' | 'verbose';
|
|
9
9
|
export interface DebugEntry {
|
|
10
|
-
type: 'read' | 'write' | 'error' | 'stageStart' | 'stageEnd';
|
|
10
|
+
type: 'read' | 'write' | 'error' | 'stageStart' | 'stageEnd' | 'pause' | 'resume';
|
|
11
11
|
stageName: string;
|
|
12
12
|
timestamp: number;
|
|
13
13
|
data: unknown;
|
|
@@ -16,7 +16,23 @@ export interface DebugRecorderOptions {
|
|
|
16
16
|
id?: string;
|
|
17
17
|
verbosity?: DebugVerbosity;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Each instance gets a unique auto-increment ID (`debug-1`, `debug-2`, ...),
|
|
21
|
+
* so multiple recorders with different verbosity coexist.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Verbose debug for development
|
|
26
|
+
* executor.attachRecorder(new DebugRecorder({ verbosity: 'verbose' }));
|
|
27
|
+
*
|
|
28
|
+
* // Minimal debug for production (errors only)
|
|
29
|
+
* executor.attachRecorder(new DebugRecorder({ verbosity: 'minimal' }));
|
|
30
|
+
*
|
|
31
|
+
* // Both coexist — different auto IDs
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
19
34
|
export declare class DebugRecorder implements Recorder {
|
|
35
|
+
private static _counter;
|
|
20
36
|
readonly id: string;
|
|
21
37
|
private entries;
|
|
22
38
|
private verbosity;
|
|
@@ -26,6 +42,8 @@ export declare class DebugRecorder implements Recorder {
|
|
|
26
42
|
onError(event: ErrorEvent): void;
|
|
27
43
|
onStageStart(event: StageEvent): void;
|
|
28
44
|
onStageEnd(event: StageEvent): void;
|
|
45
|
+
onPause(event: PauseEvent): void;
|
|
46
|
+
onResume(event: ResumeEvent): void;
|
|
29
47
|
getEntries(): DebugEntry[];
|
|
30
48
|
getErrors(): DebugEntry[];
|
|
31
49
|
getEntriesForStage(stageName: string): DebugEntry[];
|
|
@@ -1,14 +1,41 @@
|
|
|
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
|
-
import type { CommitEvent, ReadEvent, Recorder, StageEvent, WriteEvent } from '../types.js';
|
|
32
|
+
import type { CommitEvent, PauseEvent, ReadEvent, Recorder, StageEvent, WriteEvent } from '../types.js';
|
|
7
33
|
export interface StageMetrics {
|
|
8
34
|
stageName: string;
|
|
9
35
|
readCount: number;
|
|
10
36
|
writeCount: number;
|
|
11
37
|
commitCount: number;
|
|
38
|
+
pauseCount: number;
|
|
12
39
|
totalDuration: number;
|
|
13
40
|
invocationCount: number;
|
|
14
41
|
}
|
|
@@ -17,16 +44,37 @@ export interface AggregatedMetrics {
|
|
|
17
44
|
totalReads: number;
|
|
18
45
|
totalWrites: number;
|
|
19
46
|
totalCommits: number;
|
|
47
|
+
totalPauses: number;
|
|
20
48
|
stageMetrics: Map<string, StageMetrics>;
|
|
21
49
|
}
|
|
50
|
+
/** Options for MetricRecorder. All fields are optional. */
|
|
51
|
+
export interface MetricRecorderOptions {
|
|
52
|
+
/** Recorder ID. Defaults to auto-increment (`metrics-1`, `metrics-2`, ...). */
|
|
53
|
+
id?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Filter which stages are recorded. Return `true` to record, `false` to skip.
|
|
56
|
+
* When omitted, all stages are recorded.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* // Only track stages that start with "Call"
|
|
61
|
+
* stageFilter: (name) => name.startsWith('Call')
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
stageFilter?: (stageName: string) => boolean;
|
|
65
|
+
}
|
|
22
66
|
export declare class MetricRecorder implements Recorder {
|
|
67
|
+
private static _counter;
|
|
23
68
|
readonly id: string;
|
|
24
69
|
private metrics;
|
|
25
70
|
private stageStartTimes;
|
|
26
|
-
|
|
71
|
+
private stageFilter?;
|
|
72
|
+
constructor(idOrOptions?: string | MetricRecorderOptions);
|
|
73
|
+
private shouldRecord;
|
|
27
74
|
onRead(event: ReadEvent): void;
|
|
28
75
|
onWrite(event: WriteEvent): void;
|
|
29
76
|
onCommit(event: CommitEvent): void;
|
|
77
|
+
onPause(event: PauseEvent): void;
|
|
30
78
|
onStageStart(event: StageEvent): void;
|
|
31
79
|
onStageEnd(event: StageEvent): void;
|
|
32
80
|
getMetrics(): AggregatedMetrics;
|
|
@@ -38,6 +38,14 @@ export interface ErrorEvent extends RecorderContext {
|
|
|
38
38
|
export interface StageEvent extends RecorderContext {
|
|
39
39
|
duration?: number;
|
|
40
40
|
}
|
|
41
|
+
export interface PauseEvent extends RecorderContext {
|
|
42
|
+
stageId: string;
|
|
43
|
+
pauseData?: unknown;
|
|
44
|
+
}
|
|
45
|
+
export interface ResumeEvent extends RecorderContext {
|
|
46
|
+
stageId: string;
|
|
47
|
+
hasInput: boolean;
|
|
48
|
+
}
|
|
41
49
|
/**
|
|
42
50
|
* Declarative redaction configuration — define once, applied everywhere.
|
|
43
51
|
*
|
|
@@ -86,6 +94,8 @@ export interface Recorder {
|
|
|
86
94
|
onError?(event: ErrorEvent): void;
|
|
87
95
|
onStageStart?(event: StageEvent): void;
|
|
88
96
|
onStageEnd?(event: StageEvent): void;
|
|
97
|
+
onPause?(event: PauseEvent): void;
|
|
98
|
+
onResume?(event: ResumeEvent): void;
|
|
89
99
|
/** Reset state before each executor.run() — prevents cross-run accumulation. */
|
|
90
100
|
clear?(): void;
|
|
91
101
|
/** Expose collected data for inclusion in executor.getSnapshot().recorders. */
|
|
@@ -33,7 +33,7 @@ import { MilestoneNarrativeFlowRecorder } from './lib/engine/narrative/recorders
|
|
|
33
33
|
import { WindowedNarrativeFlowRecorder } from './lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js';
|
|
34
34
|
import type { DebugEntry, DebugRecorderOptions } from './lib/scope/recorders/DebugRecorder.js';
|
|
35
35
|
import { DebugRecorder } from './lib/scope/recorders/DebugRecorder.js';
|
|
36
|
-
import type { AggregatedMetrics, StageMetrics } from './lib/scope/recorders/MetricRecorder.js';
|
|
36
|
+
import type { AggregatedMetrics, MetricRecorderOptions, StageMetrics } from './lib/scope/recorders/MetricRecorder.js';
|
|
37
37
|
import { MetricRecorder } from './lib/scope/recorders/MetricRecorder.js';
|
|
38
38
|
export type NarrativeInstance = CombinedNarrativeRecorder & {
|
|
39
39
|
lines(): string[];
|
|
@@ -47,7 +47,7 @@ export type MetricsInstance = MetricRecorder & {
|
|
|
47
47
|
stage(name: string): StageMetrics | undefined;
|
|
48
48
|
all(): AggregatedMetrics;
|
|
49
49
|
};
|
|
50
|
-
export declare function metrics(): MetricsInstance;
|
|
50
|
+
export declare function metrics(options?: MetricRecorderOptions): MetricsInstance;
|
|
51
51
|
export type DebugInstance = DebugRecorder & {
|
|
52
52
|
logs(): DebugEntry[];
|
|
53
53
|
};
|
|
@@ -60,3 +60,6 @@ export declare function adaptive(): AdaptiveNarrativeFlowRecorder;
|
|
|
60
60
|
export declare function milestone(): MilestoneNarrativeFlowRecorder;
|
|
61
61
|
export declare function windowed(maxEntries?: number): WindowedNarrativeFlowRecorder;
|
|
62
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