agentfootprint 2.14.4 → 3.0.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 (224) hide show
  1. package/dist/cache/CacheDecisionSubflow.js +3 -1
  2. package/dist/cache/CacheDecisionSubflow.js.map +1 -1
  3. package/dist/conventions.js +3 -2
  4. package/dist/conventions.js.map +1 -1
  5. package/dist/core/Agent.js +69 -23
  6. package/dist/core/Agent.js.map +1 -1
  7. package/dist/core/LLMCall.js +44 -5
  8. package/dist/core/LLMCall.js.map +1 -1
  9. package/dist/core/RunnerBase.js +173 -0
  10. package/dist/core/RunnerBase.js.map +1 -1
  11. package/dist/core/agent/buildAgentChart.js +12 -2
  12. package/dist/core/agent/buildAgentChart.js.map +1 -1
  13. package/dist/core/runner.js +4 -3
  14. package/dist/core/runner.js.map +1 -1
  15. package/dist/core/slots/buildMessagesSlot.js +1 -1
  16. package/dist/core/slots/buildMessagesSlot.js.map +1 -1
  17. package/dist/core/slots/buildSystemPromptSlot.js +1 -1
  18. package/dist/core/slots/buildSystemPromptSlot.js.map +1 -1
  19. package/dist/core/slots/buildThinkingSubflow.js +1 -1
  20. package/dist/core/slots/buildThinkingSubflow.js.map +1 -1
  21. package/dist/core/slots/buildToolsSlot.js +3 -1
  22. package/dist/core/slots/buildToolsSlot.js.map +1 -1
  23. package/dist/core/translator.js +32 -0
  24. package/dist/core/translator.js.map +1 -0
  25. package/dist/core-flow/Conditional.js +73 -10
  26. package/dist/core-flow/Conditional.js.map +1 -1
  27. package/dist/core-flow/Loop.js +60 -16
  28. package/dist/core-flow/Loop.js.map +1 -1
  29. package/dist/core-flow/Parallel.js +241 -92
  30. package/dist/core-flow/Parallel.js.map +1 -1
  31. package/dist/core-flow/Sequence.js +51 -8
  32. package/dist/core-flow/Sequence.js.map +1 -1
  33. package/dist/esm/cache/CacheDecisionSubflow.js +3 -1
  34. package/dist/esm/cache/CacheDecisionSubflow.js.map +1 -1
  35. package/dist/esm/conventions.js +3 -2
  36. package/dist/esm/conventions.js.map +1 -1
  37. package/dist/esm/core/Agent.js +69 -23
  38. package/dist/esm/core/Agent.js.map +1 -1
  39. package/dist/esm/core/LLMCall.js +44 -5
  40. package/dist/esm/core/LLMCall.js.map +1 -1
  41. package/dist/esm/core/RunnerBase.js +173 -0
  42. package/dist/esm/core/RunnerBase.js.map +1 -1
  43. package/dist/esm/core/agent/buildAgentChart.js +12 -2
  44. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  45. package/dist/esm/core/runner.js +4 -3
  46. package/dist/esm/core/runner.js.map +1 -1
  47. package/dist/esm/core/slots/buildMessagesSlot.js +1 -1
  48. package/dist/esm/core/slots/buildMessagesSlot.js.map +1 -1
  49. package/dist/esm/core/slots/buildSystemPromptSlot.js +1 -1
  50. package/dist/esm/core/slots/buildSystemPromptSlot.js.map +1 -1
  51. package/dist/esm/core/slots/buildThinkingSubflow.js +1 -1
  52. package/dist/esm/core/slots/buildThinkingSubflow.js.map +1 -1
  53. package/dist/esm/core/slots/buildToolsSlot.js +3 -1
  54. package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
  55. package/dist/esm/core/translator.js +31 -0
  56. package/dist/esm/core/translator.js.map +1 -0
  57. package/dist/esm/core-flow/Conditional.js +73 -10
  58. package/dist/esm/core-flow/Conditional.js.map +1 -1
  59. package/dist/esm/core-flow/Loop.js +60 -16
  60. package/dist/esm/core-flow/Loop.js.map +1 -1
  61. package/dist/esm/core-flow/Parallel.js +242 -93
  62. package/dist/esm/core-flow/Parallel.js.map +1 -1
  63. package/dist/esm/core-flow/Sequence.js +51 -8
  64. package/dist/esm/core-flow/Sequence.js.map +1 -1
  65. package/dist/esm/index.js +1 -0
  66. package/dist/esm/index.js.map +1 -1
  67. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js +1 -1
  68. package/dist/esm/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  69. package/dist/esm/memory/causal/snapshotPipeline.js +6 -2
  70. package/dist/esm/memory/causal/snapshotPipeline.js.map +1 -1
  71. package/dist/esm/memory/pipeline/auto.js +2 -2
  72. package/dist/esm/memory/pipeline/auto.js.map +1 -1
  73. package/dist/esm/memory/pipeline/default.js +4 -2
  74. package/dist/esm/memory/pipeline/default.js.map +1 -1
  75. package/dist/esm/memory/pipeline/ephemeral.js +3 -1
  76. package/dist/esm/memory/pipeline/ephemeral.js.map +1 -1
  77. package/dist/esm/memory/pipeline/fact.js +4 -2
  78. package/dist/esm/memory/pipeline/fact.js.map +1 -1
  79. package/dist/esm/memory/pipeline/narrative.js +4 -2
  80. package/dist/esm/memory/pipeline/narrative.js.map +1 -1
  81. package/dist/esm/memory/pipeline/semantic.js +2 -2
  82. package/dist/esm/memory/pipeline/semantic.js.map +1 -1
  83. package/dist/esm/observe.js +1 -1
  84. package/dist/esm/observe.js.map +1 -1
  85. package/dist/esm/patterns/MapReduce.js +5 -5
  86. package/dist/esm/patterns/MapReduce.js.map +1 -1
  87. package/dist/esm/patterns/Swarm.js +1 -1
  88. package/dist/esm/patterns/Swarm.js.map +1 -1
  89. package/dist/esm/recorders/observability/BoundaryRecorder.js +315 -36
  90. package/dist/esm/recorders/observability/BoundaryRecorder.js.map +1 -1
  91. package/dist/esm/recorders/observability/FlowchartRecorder.js +10 -0
  92. package/dist/esm/recorders/observability/FlowchartRecorder.js.map +1 -1
  93. package/dist/esm/recorders/observability/LiveStateRecorder.js +112 -21
  94. package/dist/esm/recorders/observability/LiveStateRecorder.js.map +1 -1
  95. package/dist/esm/recorders/observability/RunStepRecorder.js +652 -0
  96. package/dist/esm/recorders/observability/RunStepRecorder.js.map +1 -0
  97. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js +3 -4
  98. package/dist/esm/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  99. package/dist/esm/recorders/observability/internal/ActorArrowClassifier.js +34 -0
  100. package/dist/esm/recorders/observability/internal/ActorArrowClassifier.js.map +1 -0
  101. package/dist/esm/recorders/observability/internal/CandidateAnswerBuffer.js +32 -0
  102. package/dist/esm/recorders/observability/internal/CandidateAnswerBuffer.js.map +1 -0
  103. package/dist/esm/recorders/observability/internal/ForkTracker.js +84 -0
  104. package/dist/esm/recorders/observability/internal/ForkTracker.js.map +1 -0
  105. package/dist/esm/recorders/observability/internal/RootInferrer.js +114 -0
  106. package/dist/esm/recorders/observability/internal/RootInferrer.js.map +1 -0
  107. package/dist/esm/recorders/observability/internal/SequenceSiblingTracker.js +31 -0
  108. package/dist/esm/recorders/observability/internal/SequenceSiblingTracker.js.map +1 -0
  109. package/dist/esm/recorders/observability/observeRunId.js +21 -0
  110. package/dist/esm/recorders/observability/observeRunId.js.map +1 -0
  111. package/dist/esm/reliability/buildReliabilityGateChart.js +1 -1
  112. package/dist/esm/reliability/buildReliabilityGateChart.js.map +1 -1
  113. package/dist/index.js +7 -3
  114. package/dist/index.js.map +1 -1
  115. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js +1 -1
  116. package/dist/lib/injection-engine/buildInjectionEngineSubflow.js.map +1 -1
  117. package/dist/memory/causal/snapshotPipeline.js +6 -2
  118. package/dist/memory/causal/snapshotPipeline.js.map +1 -1
  119. package/dist/memory/pipeline/auto.js +2 -2
  120. package/dist/memory/pipeline/auto.js.map +1 -1
  121. package/dist/memory/pipeline/default.js +4 -2
  122. package/dist/memory/pipeline/default.js.map +1 -1
  123. package/dist/memory/pipeline/ephemeral.js +3 -1
  124. package/dist/memory/pipeline/ephemeral.js.map +1 -1
  125. package/dist/memory/pipeline/fact.js +4 -2
  126. package/dist/memory/pipeline/fact.js.map +1 -1
  127. package/dist/memory/pipeline/narrative.js +4 -2
  128. package/dist/memory/pipeline/narrative.js.map +1 -1
  129. package/dist/memory/pipeline/semantic.js +2 -2
  130. package/dist/memory/pipeline/semantic.js.map +1 -1
  131. package/dist/observe.js +1 -1
  132. package/dist/observe.js.map +1 -1
  133. package/dist/patterns/MapReduce.js +5 -5
  134. package/dist/patterns/MapReduce.js.map +1 -1
  135. package/dist/patterns/Swarm.js +1 -1
  136. package/dist/patterns/Swarm.js.map +1 -1
  137. package/dist/recorders/observability/BoundaryRecorder.js +314 -35
  138. package/dist/recorders/observability/BoundaryRecorder.js.map +1 -1
  139. package/dist/recorders/observability/FlowchartRecorder.js +10 -0
  140. package/dist/recorders/observability/FlowchartRecorder.js.map +1 -1
  141. package/dist/recorders/observability/LiveStateRecorder.js +111 -20
  142. package/dist/recorders/observability/LiveStateRecorder.js.map +1 -1
  143. package/dist/recorders/observability/RunStepRecorder.js +658 -0
  144. package/dist/recorders/observability/RunStepRecorder.js.map +1 -0
  145. package/dist/recorders/observability/commentary/commentaryTemplates.js +3 -4
  146. package/dist/recorders/observability/commentary/commentaryTemplates.js.map +1 -1
  147. package/dist/recorders/observability/internal/ActorArrowClassifier.js +38 -0
  148. package/dist/recorders/observability/internal/ActorArrowClassifier.js.map +1 -0
  149. package/dist/recorders/observability/internal/CandidateAnswerBuffer.js +36 -0
  150. package/dist/recorders/observability/internal/CandidateAnswerBuffer.js.map +1 -0
  151. package/dist/recorders/observability/internal/ForkTracker.js +88 -0
  152. package/dist/recorders/observability/internal/ForkTracker.js.map +1 -0
  153. package/dist/recorders/observability/internal/RootInferrer.js +118 -0
  154. package/dist/recorders/observability/internal/RootInferrer.js.map +1 -0
  155. package/dist/recorders/observability/internal/SequenceSiblingTracker.js +35 -0
  156. package/dist/recorders/observability/internal/SequenceSiblingTracker.js.map +1 -0
  157. package/dist/recorders/observability/observeRunId.js +25 -0
  158. package/dist/recorders/observability/observeRunId.js.map +1 -0
  159. package/dist/reliability/buildReliabilityGateChart.js +1 -1
  160. package/dist/reliability/buildReliabilityGateChart.js.map +1 -1
  161. package/dist/types/cache/CacheDecisionSubflow.d.ts.map +1 -1
  162. package/dist/types/conventions.d.ts.map +1 -1
  163. package/dist/types/core/Agent.d.ts +20 -18
  164. package/dist/types/core/Agent.d.ts.map +1 -1
  165. package/dist/types/core/LLMCall.d.ts +28 -2
  166. package/dist/types/core/LLMCall.d.ts.map +1 -1
  167. package/dist/types/core/RunnerBase.d.ts +124 -4
  168. package/dist/types/core/RunnerBase.d.ts.map +1 -1
  169. package/dist/types/core/agent/buildAgentChart.d.ts +7 -1
  170. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  171. package/dist/types/core/agent/types.d.ts +29 -0
  172. package/dist/types/core/agent/types.d.ts.map +1 -1
  173. package/dist/types/core/runner.d.ts +51 -5
  174. package/dist/types/core/runner.d.ts.map +1 -1
  175. package/dist/types/core/slots/buildMessagesSlot.d.ts.map +1 -1
  176. package/dist/types/core/slots/buildSystemPromptSlot.d.ts.map +1 -1
  177. package/dist/types/core/slots/buildThinkingSubflow.d.ts.map +1 -1
  178. package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
  179. package/dist/types/core/translator.d.ts +95 -0
  180. package/dist/types/core/translator.d.ts.map +1 -0
  181. package/dist/types/core-flow/Conditional.d.ts +48 -4
  182. package/dist/types/core-flow/Conditional.d.ts.map +1 -1
  183. package/dist/types/core-flow/Loop.d.ts +42 -3
  184. package/dist/types/core-flow/Loop.d.ts.map +1 -1
  185. package/dist/types/core-flow/Parallel.d.ts +99 -4
  186. package/dist/types/core-flow/Parallel.d.ts.map +1 -1
  187. package/dist/types/core-flow/Sequence.d.ts +49 -3
  188. package/dist/types/core-flow/Sequence.d.ts.map +1 -1
  189. package/dist/types/events/payloads.d.ts +22 -1
  190. package/dist/types/events/payloads.d.ts.map +1 -1
  191. package/dist/types/index.d.ts +4 -2
  192. package/dist/types/index.d.ts.map +1 -1
  193. package/dist/types/lib/injection-engine/buildInjectionEngineSubflow.d.ts.map +1 -1
  194. package/dist/types/memory/causal/snapshotPipeline.d.ts.map +1 -1
  195. package/dist/types/memory/pipeline/auto.d.ts.map +1 -1
  196. package/dist/types/memory/pipeline/default.d.ts.map +1 -1
  197. package/dist/types/memory/pipeline/ephemeral.d.ts.map +1 -1
  198. package/dist/types/memory/pipeline/fact.d.ts.map +1 -1
  199. package/dist/types/memory/pipeline/narrative.d.ts.map +1 -1
  200. package/dist/types/memory/pipeline/semantic.d.ts.map +1 -1
  201. package/dist/types/observe.d.ts +2 -2
  202. package/dist/types/observe.d.ts.map +1 -1
  203. package/dist/types/recorders/observability/BoundaryRecorder.d.ts +160 -6
  204. package/dist/types/recorders/observability/BoundaryRecorder.d.ts.map +1 -1
  205. package/dist/types/recorders/observability/FlowchartRecorder.d.ts.map +1 -1
  206. package/dist/types/recorders/observability/LiveStateRecorder.d.ts +42 -6
  207. package/dist/types/recorders/observability/LiveStateRecorder.d.ts.map +1 -1
  208. package/dist/types/recorders/observability/RunStepRecorder.d.ts +232 -0
  209. package/dist/types/recorders/observability/RunStepRecorder.d.ts.map +1 -0
  210. package/dist/types/recorders/observability/commentary/commentaryTemplates.d.ts.map +1 -1
  211. package/dist/types/recorders/observability/internal/ActorArrowClassifier.d.ts +26 -0
  212. package/dist/types/recorders/observability/internal/ActorArrowClassifier.d.ts.map +1 -0
  213. package/dist/types/recorders/observability/internal/CandidateAnswerBuffer.d.ts +29 -0
  214. package/dist/types/recorders/observability/internal/CandidateAnswerBuffer.d.ts.map +1 -0
  215. package/dist/types/recorders/observability/internal/ForkTracker.d.ts +61 -0
  216. package/dist/types/recorders/observability/internal/ForkTracker.d.ts.map +1 -0
  217. package/dist/types/recorders/observability/internal/RootInferrer.d.ts +52 -0
  218. package/dist/types/recorders/observability/internal/RootInferrer.d.ts.map +1 -0
  219. package/dist/types/recorders/observability/internal/SequenceSiblingTracker.d.ts +25 -0
  220. package/dist/types/recorders/observability/internal/SequenceSiblingTracker.d.ts.map +1 -0
  221. package/dist/types/recorders/observability/observeRunId.d.ts +37 -0
  222. package/dist/types/recorders/observability/observeRunId.d.ts.map +1 -0
  223. package/dist/types/reliability/buildReliabilityGateChart.d.ts.map +1 -1
  224. package/package.json +3 -3
@@ -0,0 +1,232 @@
1
+ /**
2
+ * RunStepRecorder — slider-ready ordered list of RunSteps, BUILT
3
+ * INCREMENTALLY during traversal. Real-time recorder, not a walker.
4
+ *
5
+ * Pattern: extends `SequenceRecorder<RunStep>` (shared storage shelf)
6
+ * and implements `CombinedRecorder` (FlowRecorder hooks).
7
+ * Subscribes to the agentfootprint typed-event dispatcher
8
+ * for actor-arrow events. Each event handler decides whether
9
+ * to emit a step; state lives on the instance and persists
10
+ * across the run.
11
+ * Role: The single source of truth for "what slider positions
12
+ * exist in this run, and what transitions does each light
13
+ * up." Lens consumers attach the recorder once and read
14
+ * `getSteps()` — no per-render re-derivation.
15
+ *
16
+ * Why this matters: the older `buildRunSteps(events)` walker violated
17
+ * footprintjs's core principle ("collect during traversal, never
18
+ * post-process"). Each call walked the full event log multiple times;
19
+ * the playground triggered a full walk on every flowchart update,
20
+ * yielding O(N²) total work for a streaming run. The recorder pattern
21
+ * is O(N) — one handler call per event — and matches BoundaryRecorder /
22
+ * FlowchartRecorder / KeyedRecorder idioms throughout the library.
23
+ *
24
+ * The `buildRunSteps(...)` function is RETAINED as a thin compatibility
25
+ * shim that constructs a fresh recorder, replays events through it,
26
+ * and returns the resulting entries. Useful for snapshot-from-saved-
27
+ * events use cases (replay, testing, post-hoc analysis). Live consumers
28
+ * should attach the recorder directly via `runner.attach(rec)`.
29
+ */
30
+ import type { CombinedRecorder, FlowDecisionEvent, FlowForkEvent, FlowLoopEvent, FlowSubflowEvent, TraversalContext } from 'footprintjs';
31
+ interface FlowRunEvent {
32
+ readonly payload?: unknown;
33
+ readonly traversalContext?: TraversalContext;
34
+ }
35
+ import type { AgentfootprintEvent } from '../../events/registry.js';
36
+ import type { EventDispatcher, Unsubscribe } from '../../events/dispatcher.js';
37
+ import type { BoundaryRecorder, DomainEvent } from './BoundaryRecorder.js';
38
+ /**
39
+ * One slider position. The smallest scrubable unit of the run.
40
+ *
41
+ * `transitions` is 1+ — fan-out / merge steps light up multiple
42
+ * transitions at once; sequential / decide / react steps light up
43
+ * exactly one. Renderers iterate `transitions` to highlight edges;
44
+ * details panels read `anchor.runtimeStageId`.
45
+ */
46
+ export interface RunStep {
47
+ /** 0-based slider index (matches array position in `getSteps()`). */
48
+ readonly seq: number;
49
+ readonly kind: RunStepKind;
50
+ readonly transitions: readonly RunStepTransition[];
51
+ /**
52
+ * Per-step key — required by `SequenceRecorder<T>` for time-travel
53
+ * utilities (`getEntriesForStep`, `getEntryRanges`). Mirrors
54
+ * `anchor.runtimeStageId`; both fields point at the same value.
55
+ * Top-level placement satisfies the recorder's storage contract.
56
+ */
57
+ readonly runtimeStageId: string;
58
+ /** Anchor for commentary highlight + details pane lookup. */
59
+ readonly anchor: {
60
+ readonly runtimeStageId: string;
61
+ readonly subflowPath: readonly string[];
62
+ };
63
+ /** Human label — short, kind-specific. */
64
+ readonly label: string;
65
+ /** Wall-clock ms at which this step occurred. */
66
+ readonly tsMs: number;
67
+ /** Kind-specific decoration. Discriminate on `kind`. */
68
+ readonly meta?: RunStepMeta;
69
+ }
70
+ export type RunStepKind = 'sequential' | 'fork' | 'merge' | 'decide' | 'iteration' | 'iteration-exit' | 'react';
71
+ export interface RunStepTransition {
72
+ readonly from: string;
73
+ readonly to: string;
74
+ readonly via: 'next' | 'fork-branch' | 'decision-branch' | 'loop-iteration' | 'actor-arrow';
75
+ readonly label?: string;
76
+ }
77
+ export type RunStepMeta = {
78
+ readonly kind: 'decide';
79
+ readonly chosen: string;
80
+ readonly rationale?: string;
81
+ } | {
82
+ readonly kind: 'iteration';
83
+ readonly index: number;
84
+ readonly target: string;
85
+ } | {
86
+ readonly kind: 'iteration-exit';
87
+ readonly index: number;
88
+ readonly reason?: string;
89
+ } | {
90
+ readonly kind: 'fork';
91
+ readonly parentSubflowId: string;
92
+ } | {
93
+ readonly kind: 'merge';
94
+ readonly mergedCount: number;
95
+ } | {
96
+ readonly kind: 'react';
97
+ readonly actorArrow: 'user→llm' | 'tool→llm' | 'llm→tool' | 'llm→user';
98
+ };
99
+ export interface RunStepRecorderOptions {
100
+ readonly id?: string;
101
+ }
102
+ /** Factory — matches the `boundaryRecorder()` / `topologyRecorder()` style. */
103
+ export declare function runStepRecorder(options?: RunStepRecorderOptions): RunStepRecorder;
104
+ /**
105
+ * Real-time slider-step recorder. Emits a `RunStep` whenever an event
106
+ * marks a meaningful slider transition. State persists on the instance
107
+ * so successive events update bookkeeping in O(1).
108
+ *
109
+ * Attach via `runner.attach(rec)` for FlowRecorder events; call
110
+ * `rec.subscribe(runner.dispatcher)` for actor-arrow events. The
111
+ * `getSteps(drillPath?)` method returns the already-built list (no
112
+ * walking) with optional drill-scope filtering.
113
+ */
114
+ export declare class RunStepRecorder implements CombinedRecorder {
115
+ readonly id: string;
116
+ /** Composition: storage shelf for the slider-step sequence. */
117
+ private readonly store;
118
+ /** Run-boundary observer — fires this.clear() when traversalContext.runId
119
+ * changes between events. THIS IS THE FIX for the Parallel multi-run
120
+ * aliasing bug — without it `forkKey = ${parent}@${rid}` collides
121
+ * because rid resets to `seed#0` on each run. */
122
+ private readonly runIdGuard;
123
+ /** Stack of currently-open boundaries. The recorder owns this
124
+ * directly because it's a simple stack and frames are recorder-
125
+ * shaped. */
126
+ private boundaryStack;
127
+ /** Fork-emission coalescing + branch-exit tally. */
128
+ private readonly forks;
129
+ /** Tracks the most-recent leaf exit per depth → "forwards" handoff. */
130
+ private readonly siblings;
131
+ /** Buffers a "this MIGHT be the answer" leaf until onRunEnd. */
132
+ private readonly answerBuffer;
133
+ /** Run-root inference state machine (leaf vs composition). */
134
+ private readonly rootInferrer;
135
+ /** llm.start / llm.end actor-arrow classifier. */
136
+ private readonly actorArrows;
137
+ /** Has the first `asks` step fired? */
138
+ private asksEmitted;
139
+ constructor(options?: RunStepRecorderOptions);
140
+ /**
141
+ * Emit a RunStep, auto-mirroring `anchor.runtimeStageId` to the
142
+ * top-level `runtimeStageId` field that the keyed index uses. Single
143
+ * source of truth (the anchor) — never inconsistent with the storage
144
+ * key.
145
+ */
146
+ private push;
147
+ /** Internal seq-numbering helper — mirrors the store size so each
148
+ * RunStep gets a unique 0-based index in emit order. */
149
+ private get entryCount();
150
+ clear(): void;
151
+ /** Internal — wipe all per-run state WITHOUT resetting the runIdGuard
152
+ * itself. Called by `clear()` (which then resets the guard) AND by
153
+ * the runIdGuard's onNewRun callback (where the guard is mid-update
154
+ * and must NOT be reset, only the recorder's data should be).
155
+ *
156
+ * Note: each sub-tracker owns its OWN clear; the orchestrator just
157
+ * fans out. Adding new state to a sub-tracker requires no edit here. */
158
+ private resetForNewRun;
159
+ private observeRunId;
160
+ onRunStart(event: FlowRunEvent): void;
161
+ onRunEnd(event: FlowRunEvent): void;
162
+ onSubflowEntry(event: FlowSubflowEvent): void;
163
+ onSubflowExit(event: FlowSubflowEvent): void;
164
+ onFork(event: FlowForkEvent): void;
165
+ onDecision(event: FlowDecisionEvent): void;
166
+ onLoop(event: FlowLoopEvent): void;
167
+ /**
168
+ * Subscribe to the runner's typed-event dispatcher and emit a
169
+ * `react` RunStep on every `llm.start` / `llm.end`. The recorder
170
+ * classifies `actorArrow` locally (mirrors BoundaryRecorder's
171
+ * pattern) so consumers don't have to depend on BoundaryRecorder's
172
+ * own subscription order.
173
+ */
174
+ subscribe(dispatcher: EventDispatcher): Unsubscribe;
175
+ /** Internal — also called by `ingestDomainEvent` for shim replay.
176
+ *
177
+ * NOTE: deliberately does NOT call observeRunId(event.meta.runId).
178
+ * The agentfootprint dispatcher's runId is a DIFFERENT generator
179
+ * than footprintjs's traversalContext.runId — mixing them would
180
+ * toggle lastRunId on every event and trigger a false reset.
181
+ * Run-boundary detection happens reliably on the FlowRecorder side
182
+ * (onRunStart fires FIRST in any new run before any typed event). */
183
+ protected ingestTypedEvent(event: AgentfootprintEvent): void;
184
+ /**
185
+ * Feed a single recorded `DomainEvent` (from BoundaryRecorder) into
186
+ * this recorder as if it had fired live. Used by `buildRunSteps`
187
+ * for snapshot replay; tests use it for fixture-driven projection.
188
+ *
189
+ * Live consumers should use `runner.attach(rec)` +
190
+ * `rec.subscribe(dispatcher)` instead — the recorder's hooks fire
191
+ * naturally during traversal.
192
+ */
193
+ ingestDomainEvent(e: DomainEvent): void;
194
+ /**
195
+ * Read-only query — returns the already-built step list filtered to
196
+ * `drillPath` scope. O(1) per call when scope is empty; O(N) filter
197
+ * otherwise. Composition-vs-leaf root filter is applied so the
198
+ * slider semantics match the user's mental model:
199
+ *
200
+ * - **Leaf root** (single Agent / LLMCall): show `react` steps only.
201
+ * - **Composition root** (Sequence / Parallel / Conditional / Loop):
202
+ * show composition steps; hide intra-leaf `react` steps.
203
+ *
204
+ * Drill-down filters by `anchor.subflowPath` prefix and re-applies
205
+ * the leaf-vs-composition rule for the drilled scope.
206
+ */
207
+ getSteps(drillPath?: readonly string[]): readonly RunStep[];
208
+ /** Flush any deferred answer-candidate from the buffer. Called by
209
+ * `onRunEnd` so a single `answers` step appears for runs that end
210
+ * on a leaf exit (no further leaf entries followed). */
211
+ private flushCandidateAnswer;
212
+ }
213
+ export interface RunStepGraph {
214
+ readonly steps: readonly RunStep[];
215
+ }
216
+ export interface BuildRunStepsOptions {
217
+ readonly drillPath?: readonly string[];
218
+ }
219
+ /**
220
+ * Compatibility shim for snapshot-from-events use cases (replay,
221
+ * post-hoc analysis, tests). For LIVE use, prefer attaching a
222
+ * `RunStepRecorder` directly via `runner.attach(rec)` —
223
+ * `buildRunSteps(events)` constructs a fresh recorder, replays the
224
+ * events through its handlers, and returns the resulting entries.
225
+ *
226
+ * @deprecated Prefer `runStepRecorder()` + `runner.attach(rec)` for
227
+ * live consumers. This shim remains for offline / testing
228
+ * scenarios where only a recorded event list is available.
229
+ */
230
+ export declare function buildRunSteps(source: BoundaryRecorder | readonly DomainEvent[], options?: BuildRunStepsOptions): RunStep[];
231
+ export {};
232
+ //# sourceMappingURL=RunStepRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunStepRecorder.d.ts","sourceRoot":"","sources":["../../../../src/recorders/observability/RunStepRecorder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"commentaryTemplates.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/commentary/commentaryTemplates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;2EAG2E;AAC3E,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBA+ExC,CAAC;AAEF;;6CAE6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC;6EACyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;2EAGuE;IACvE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACxE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CA6FzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,iBAAiB,EACtB,SAAS,GAAE,mBAAgD,GAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDxB;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAS3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEvF"}
1
+ {"version":3,"file":"commentaryTemplates.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/commentary/commentaryTemplates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;2EAG2E;AAC3E,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBA+ExC,CAAC;AAEF;;6CAE6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC;6EACyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;2EAGuE;IACvE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACxE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CA6FzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,iBAAiB,EACtB,SAAS,GAAE,mBAAgD,GAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmDxB;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAS3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEvF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @internal — not part of the public agentfootprint API. Imported only
3
+ * by RunStepRecorder. Subject to change without notice.
4
+ *
5
+ * ActorArrowClassifier — classifies the next `llm.start` as
6
+ * `'user→llm'` (no pending tool result) vs `'tool→llm'` (after a
7
+ * tool result), and the next `llm.end` as `'llm→tool'` vs `'llm→user'`
8
+ * based on the call's `toolCallCount`.
9
+ *
10
+ * Extracted from RunStepRecorder per Convention 1. Keeps a single
11
+ * boolean of state — `prevLLMEndHadTools` — and consumes-then-resets
12
+ * it on each `llm.start`.
13
+ */
14
+ export type StartArrow = 'user→llm' | 'tool→llm';
15
+ export type EndArrow = 'llm→tool' | 'llm→user';
16
+ export declare class ActorArrowClassifier {
17
+ private prevLLMEndHadTools;
18
+ /** Classify the next `llm.start`. Consumes + resets the pending
19
+ * flag after returning. */
20
+ classifyStart(): StartArrow;
21
+ /** Classify an `llm.end` based on its tool-call count, and update
22
+ * the pending flag for the NEXT llm.start. */
23
+ classifyEnd(toolCallCount: number): EndArrow;
24
+ clear(): void;
25
+ }
26
+ //# sourceMappingURL=ActorArrowClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActorArrowClassifier.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/internal/ActorArrowClassifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACjD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IAEnC;gCAC4B;IAC5B,aAAa,IAAI,UAAU;IAM3B;mDAC+C;IAC/C,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ;IAM5C,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @internal — not part of the public agentfootprint API. Imported only
3
+ * by RunStepRecorder. Subject to change without notice.
4
+ *
5
+ * CandidateAnswerBuffer — buffers a "this leaf MIGHT be the run's
6
+ * answer" candidate that's only confirmed on `onRunEnd`. Replaced
7
+ * by every later leaf exit at run scope; the last one wins.
8
+ *
9
+ * Extracted from RunStepRecorder per Convention 1.
10
+ *
11
+ * Use:
12
+ * - On leaf EXIT at run scope: `set(frame, ts, runtimeStageId)`.
13
+ * - On `onRunEnd`: `flush()` returns the buffered candidate (or
14
+ * undefined if none), and clears the buffer.
15
+ */
16
+ export interface CandidateAnswer<TFrame> {
17
+ readonly frame: TFrame;
18
+ readonly tsMs: number;
19
+ readonly runtimeStageId: string;
20
+ }
21
+ export declare class CandidateAnswerBuffer<TFrame> {
22
+ private candidate;
23
+ /** Buffer a new candidate, replacing any prior one. */
24
+ set(frame: TFrame, tsMs: number, runtimeStageId: string): void;
25
+ /** Return + clear the buffered candidate (or undefined if empty). */
26
+ flush(): CandidateAnswer<TFrame> | undefined;
27
+ clear(): void;
28
+ }
29
+ //# sourceMappingURL=CandidateAnswerBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CandidateAnswerBuffer.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/internal/CandidateAnswerBuffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,eAAe,CAAC,MAAM;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,qBAAqB,CAAC,MAAM;IACvC,OAAO,CAAC,SAAS,CAAsC;IAEvD,uDAAuD;IACvD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAI9D,qEAAqE;IACrE,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS;IAM5C,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @internal — not part of the public agentfootprint API. Imported only
3
+ * by RunStepRecorder. Subject to change without notice; do not import
4
+ * via deep paths.
5
+ *
6
+ * ForkTracker — owns the bookkeeping for parallel-fork emission and
7
+ * merge-step detection. Extracted from RunStepRecorder per Convention 1
8
+ * (one purpose per recorder/state machine).
9
+ *
10
+ * Responsibilities (and ONLY these):
11
+ * 1. Coalesce repeated `onFork` events for the same parent (race-safe
12
+ * via parent+runtimeStageId key).
13
+ * 2. Track which child branches belong to which parent fork.
14
+ * 3. Track which branches have exited; signal "merge ready" when ALL
15
+ * branches of a fork have exited.
16
+ *
17
+ * What it does NOT own:
18
+ * - Storage (the recorder writes RunSteps to its SequenceStore).
19
+ * - Run-boundary detection (the recorder's runIdGuard wipes this
20
+ * tracker via `clear()`).
21
+ * - Any other state machine.
22
+ */
23
+ export interface ForkRegistration {
24
+ /** True if this is a NEW fork; false if the same fork was already seen
25
+ * (caller should suppress duplicate emission). */
26
+ readonly fresh: boolean;
27
+ }
28
+ export interface MergeReady {
29
+ /** All branch IDs of the now-fully-exited fork, in the order they
30
+ * were originally registered. */
31
+ readonly branches: readonly string[];
32
+ }
33
+ export declare class ForkTracker {
34
+ /** Per-parent: the ordered list of child branch IDs registered. */
35
+ private readonly branches;
36
+ /** Per-parent: the set of child branch IDs that have exited so far. */
37
+ private readonly exited;
38
+ /** Reverse index: child branch ID → its parent fork. */
39
+ private readonly childToParent;
40
+ /** Set of `${parent}@${runtimeStageId}` keys already registered, to
41
+ * coalesce repeated onFork events. */
42
+ private readonly emittedKeys;
43
+ /**
44
+ * Register a new fork. If the same fork (by parent+runtimeStageId)
45
+ * was already registered, returns `{ fresh: false }` and the caller
46
+ * should suppress emission. Otherwise registers all child branches
47
+ * and returns `{ fresh: true }`.
48
+ */
49
+ registerFork(parent: string, runtimeStageId: string, children: readonly string[]): ForkRegistration;
50
+ /** True if this child belongs to a tracked fork (used to suppress
51
+ * sequential-emission for fork-branch entry events). */
52
+ isForkChild(childSubflowId: string): boolean;
53
+ /**
54
+ * Record a fork-branch exit. If this completes the fork (all branches
55
+ * have exited), returns `{ branches }` so the caller can emit a merge
56
+ * step. Returns `undefined` if not yet complete or not a fork branch.
57
+ */
58
+ recordChildExit(childSubflowId: string): MergeReady | undefined;
59
+ clear(): void;
60
+ }
61
+ //# sourceMappingURL=ForkTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForkTracker.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/internal/ForkTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B;uDACmD;IACnD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB;sCACkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,qBAAa,WAAW;IACtB,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D;2CACuC;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD;;;;;OAKG;IACH,YAAY,CACV,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,gBAAgB;IAYnB;6DACyD;IACzD,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAI5C;;;;OAIG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAgB/D,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @internal — not part of the public agentfootprint API. Imported only
3
+ * by RunStepRecorder. Subject to change without notice.
4
+ *
5
+ * RootInferrer — small state machine deciding whether a run's root is
6
+ * a single leaf primitive (Agent / LLMCall) or a composition (Sequence
7
+ * / Parallel / Conditional / Loop).
8
+ *
9
+ * Extracted from RunStepRecorder per Convention 1.
10
+ *
11
+ * Inputs: subflow entries (with their depth + parsed primitiveKind),
12
+ * fork events (depth 0 → Parallel root), decision events (depth 0 →
13
+ * Conditional root), loop events (depth 0 → Loop root).
14
+ *
15
+ * Output: query `kind()` for the inferred root. Returns `undefined`
16
+ * until a signal arrives.
17
+ *
18
+ * Inference rules:
19
+ * - Decisive composition signals (fork / decide / loop AT DEPTH 0)
20
+ * lock the root and are never overridden.
21
+ * - Shallowest primitive boundary IS a composition kind → root is
22
+ * that composition.
23
+ * - Two+ leaf siblings at the shallowest depth → implicit Sequence
24
+ * root (Sequence-as-runner case where the Sequence itself doesn't
25
+ * fire its own subflow.entry).
26
+ * - Single leaf at the shallowest depth → root is "leaf".
27
+ */
28
+ export type InferredRoot = 'leaf' | 'sequence' | 'parallel' | 'conditional' | 'loop' | undefined;
29
+ export declare class RootInferrer {
30
+ private inferred;
31
+ private shallowestDepth;
32
+ private shallowestSiblings;
33
+ /** Currently-inferred root kind, or undefined if no signal yet. */
34
+ kind(): InferredRoot;
35
+ /** True when the root is a single leaf primitive (or unknown,
36
+ * which should be treated as leaf for kind-filter purposes). */
37
+ isLeafRoot(): boolean;
38
+ /** Observe a subflow entry. */
39
+ observeSubflowEntry(depth: number, primitiveKind: string | undefined): void;
40
+ /** Observe a fork event. Locks root to Parallel if at depth 0 and
41
+ * no decisive root has been inferred yet. */
42
+ observeFork(depth: number): void;
43
+ /** Observe a decision event. Locks root to Conditional if at depth 0
44
+ * and no decisive root has been inferred yet. */
45
+ observeDecision(depth: number): void;
46
+ /** Observe a loop event. Locks root to Loop if at depth 0 and no
47
+ * decisive root has been inferred yet. */
48
+ observeLoop(depth: number): void;
49
+ clear(): void;
50
+ private tryInfer;
51
+ }
52
+ //# sourceMappingURL=RootInferrer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RootInferrer.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/internal/RootInferrer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAaH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjG,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,kBAAkB,CAAK;IAE/B,mEAAmE;IACnE,IAAI,IAAI,YAAY;IAIpB;qEACiE;IACjE,UAAU,IAAI,OAAO;IAIrB,+BAA+B;IAC/B,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAY3E;kDAC8C;IAC9C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC;sDACkD;IAClD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMpC;+CAC2C;IAC3C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,QAAQ;CA0BjB"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @internal — not part of the public agentfootprint API. Imported only
3
+ * by RunStepRecorder. Subject to change without notice.
4
+ *
5
+ * SequenceSiblingTracker — tracks the most-recent leaf exit at each
6
+ * depth so the recorder knows when a new leaf entry at the same depth
7
+ * should emit a "sequential handoff" step ("forwards" semantics).
8
+ *
9
+ * Extracted from RunStepRecorder per Convention 1.
10
+ *
11
+ * Use:
12
+ * - On leaf EXIT: `recordExit(depth, subflowId)`.
13
+ * - On leaf ENTRY: `peekPrevSibling(depth)` returns the previous
14
+ * leaf's subflowId at this depth, or undefined for the first leaf.
15
+ */
16
+ export declare class SequenceSiblingTracker {
17
+ private readonly prevExitedAtDepth;
18
+ /** Returns the subflow id of the most-recently-exited leaf at this
19
+ * depth, or undefined if this is the first leaf entry at the depth. */
20
+ peekPrevSibling(depth: number): string | undefined;
21
+ /** Record that a leaf at this depth just exited. */
22
+ recordExit(depth: number, subflowId: string): void;
23
+ clear(): void;
24
+ }
25
+ //# sourceMappingURL=SequenceSiblingTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SequenceSiblingTracker.d.ts","sourceRoot":"","sources":["../../../../../src/recorders/observability/internal/SequenceSiblingTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAE/D;4EACwE;IACxE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIlD,oDAAoD;IACpD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIlD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * observeRunId — shared run-boundary detection helper for recorders.
3
+ *
4
+ * Why this exists: 5 places in observability/* duplicated the same
5
+ * 10-line pattern (lastRunId field + 3-line check + reset). Extract
6
+ * once so the contract stays consistent under maintenance.
7
+ *
8
+ * The pattern: hold a `lastRunId | undefined`. On every observed event:
9
+ * - If runId is missing/undefined → no-op (defensive, allows callers
10
+ * to pass `event.meta?.runId` without checking).
11
+ * - First observation (lastRunId === undefined) → record, no reset.
12
+ * - Same runId → no-op (steady state).
13
+ * - Different runId → call onNewRun() then record the new id.
14
+ *
15
+ * Returned helper is mutable closure state — callers store it as a
16
+ * private field and call `.observe(runId)` from event hooks.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * class MyRecorder implements ScopeRecorder {
21
+ * private readonly runIdGuard = createRunIdObserver(() => this.reset());
22
+ * onWrite(e) {
23
+ * this.runIdGuard.observe(e.runId);
24
+ * // ... handle event
25
+ * }
26
+ * private reset() { this.store.clear(); }
27
+ * }
28
+ * ```
29
+ */
30
+ export interface RunIdObserver {
31
+ /** Process an event's runId; fires onNewRun callback when it changes. */
32
+ observe(runId: string | undefined): void;
33
+ /** Clear state so the next observation initializes fresh. */
34
+ reset(): void;
35
+ }
36
+ export declare function createRunIdObserver(onNewRun: () => void): RunIdObserver;
37
+ //# sourceMappingURL=observeRunId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observeRunId.d.ts","sourceRoot":"","sources":["../../../../src/recorders/observability/observeRunId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,6DAA6D;IAC7D,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,aAAa,CAkBvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildReliabilityGateChart.d.ts","sourceRoot":"","sources":["../../../src/reliability/buildReliabilityGateChart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;AAWzD,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,YAAY,CAAC;AAkFvF;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAkT9E"}
1
+ {"version":3,"file":"buildReliabilityGateChart.d.ts","sourceRoot":"","sources":["../../../src/reliability/buildReliabilityGateChart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;AAWzD,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,YAAY,CAAC;AAkFvF;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAiT9E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentfootprint",
3
- "version": "2.14.4",
3
+ "version": "3.0.0",
4
4
  "description": "The explainable agent framework — build AI agents you can explain, audit, and trust. Built on footprintjs.",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",
@@ -184,7 +184,7 @@
184
184
  "@aws-sdk/client-xray": "*",
185
185
  "@modelcontextprotocol/sdk": "*",
186
186
  "@opentelemetry/api": "*",
187
- "footprintjs": ">=4.17.2",
187
+ "footprintjs": "^6.0.0",
188
188
  "ioredis": "*",
189
189
  "openai": "*",
190
190
  "zod": "*"
@@ -228,7 +228,7 @@
228
228
  "@vitest/coverage-v8": "^4.1.5",
229
229
  "eslint": "^8.44.0",
230
230
  "eslint-config-prettier": "^6.15.0",
231
- "footprintjs": "^4.17.2",
231
+ "footprintjs": "^6.0.0",
232
232
  "prettier": "^2.8.1",
233
233
  "typedoc": "^0.28.19",
234
234
  "typedoc-plugin-markdown": "^4.11.0",