@esankhan3/anvil-agent-core 0.2.0 → 0.4.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 (175) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/fetch-pool.integration.test.d.ts +15 -0
  3. package/dist/__tests__/fetch-pool.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/fetch-pool.integration.test.js +109 -0
  5. package/dist/__tests__/fetch-pool.integration.test.js.map +1 -0
  6. package/dist/__tests__/fetch-pool.test.d.ts +15 -0
  7. package/dist/__tests__/fetch-pool.test.d.ts.map +1 -0
  8. package/dist/__tests__/fetch-pool.test.js +115 -0
  9. package/dist/__tests__/fetch-pool.test.js.map +1 -0
  10. package/dist/__tests__/gemini-adapter-recording.test.d.ts +11 -0
  11. package/dist/__tests__/gemini-adapter-recording.test.d.ts.map +1 -0
  12. package/dist/__tests__/gemini-adapter-recording.test.js +108 -0
  13. package/dist/__tests__/gemini-adapter-recording.test.js.map +1 -0
  14. package/dist/__tests__/legacy-adapter-language-model.test.d.ts +11 -0
  15. package/dist/__tests__/legacy-adapter-language-model.test.d.ts.map +1 -0
  16. package/dist/__tests__/legacy-adapter-language-model.test.js +102 -0
  17. package/dist/__tests__/legacy-adapter-language-model.test.js.map +1 -0
  18. package/dist/__tests__/ollama-adapter-recording.test.d.ts +15 -0
  19. package/dist/__tests__/ollama-adapter-recording.test.d.ts.map +1 -0
  20. package/dist/__tests__/ollama-adapter-recording.test.js +128 -0
  21. package/dist/__tests__/ollama-adapter-recording.test.js.map +1 -0
  22. package/dist/__tests__/openrouter-prefill.integration.test.d.ts +19 -0
  23. package/dist/__tests__/openrouter-prefill.integration.test.d.ts.map +1 -0
  24. package/dist/__tests__/openrouter-prefill.integration.test.js +410 -0
  25. package/dist/__tests__/openrouter-prefill.integration.test.js.map +1 -0
  26. package/dist/__tests__/prefill-truncate.test.d.ts +8 -0
  27. package/dist/__tests__/prefill-truncate.test.d.ts.map +1 -0
  28. package/dist/__tests__/prefill-truncate.test.js +75 -0
  29. package/dist/__tests__/prefill-truncate.test.js.map +1 -0
  30. package/dist/__tests__/router-circuit-breaker.test.js +1 -1
  31. package/dist/__tests__/router-circuit-breaker.test.js.map +1 -1
  32. package/dist/__tests__/router-classify-unified.test.d.ts +12 -0
  33. package/dist/__tests__/router-classify-unified.test.d.ts.map +1 -0
  34. package/dist/__tests__/router-classify-unified.test.js +108 -0
  35. package/dist/__tests__/router-classify-unified.test.js.map +1 -0
  36. package/dist/__tests__/router-fallback.test.js +1 -1
  37. package/dist/__tests__/router-fallback.test.js.map +1 -1
  38. package/dist/__tests__/router-model-registry.test.js +24 -0
  39. package/dist/__tests__/router-model-registry.test.js.map +1 -1
  40. package/dist/__tests__/router-retry.test.js +3 -5
  41. package/dist/__tests__/router-retry.test.js.map +1 -1
  42. package/dist/__tests__/router-runagent.test.d.ts +14 -0
  43. package/dist/__tests__/router-runagent.test.d.ts.map +1 -0
  44. package/dist/__tests__/router-runagent.test.js +95 -0
  45. package/dist/__tests__/router-runagent.test.js.map +1 -0
  46. package/dist/__tests__/router-scaffold.test.js +2 -1
  47. package/dist/__tests__/router-scaffold.test.js.map +1 -1
  48. package/dist/__tests__/router-spend-ledger.test.js +1 -1
  49. package/dist/__tests__/router-spend-ledger.test.js.map +1 -1
  50. package/dist/__tests__/router-stream-fallback.test.d.ts +13 -0
  51. package/dist/__tests__/router-stream-fallback.test.d.ts.map +1 -0
  52. package/dist/__tests__/router-stream-fallback.test.js +129 -0
  53. package/dist/__tests__/router-stream-fallback.test.js.map +1 -0
  54. package/dist/__tests__/router-telemetry.test.js +3 -1
  55. package/dist/__tests__/router-telemetry.test.js.map +1 -1
  56. package/dist/__tests__/util/mock-upstream.d.ts +77 -0
  57. package/dist/__tests__/util/mock-upstream.d.ts.map +1 -0
  58. package/dist/__tests__/util/mock-upstream.js +219 -0
  59. package/dist/__tests__/util/mock-upstream.js.map +1 -0
  60. package/dist/adk-adapter.d.ts.map +1 -1
  61. package/dist/adk-adapter.js +51 -0
  62. package/dist/adk-adapter.js.map +1 -1
  63. package/dist/adk-anthropic-llm.d.ts.map +1 -1
  64. package/dist/adk-anthropic-llm.js +23 -10
  65. package/dist/adk-anthropic-llm.js.map +1 -1
  66. package/dist/agent/session/adapter.d.ts +25 -0
  67. package/dist/agent/session/adapter.d.ts.map +1 -1
  68. package/dist/agent/session/adapter.js +4 -0
  69. package/dist/agent/session/adapter.js.map +1 -1
  70. package/dist/agent/session/index.d.ts +1 -0
  71. package/dist/agent/session/index.d.ts.map +1 -1
  72. package/dist/agent/session/index.js +1 -0
  73. package/dist/agent/session/index.js.map +1 -1
  74. package/dist/agent/session/language-model-bridge.d.ts.map +1 -1
  75. package/dist/agent/session/language-model-bridge.js +30 -2
  76. package/dist/agent/session/language-model-bridge.js.map +1 -1
  77. package/dist/agent/session/legacy-adapter-language-model.d.ts +27 -0
  78. package/dist/agent/session/legacy-adapter-language-model.d.ts.map +1 -0
  79. package/dist/agent/session/legacy-adapter-language-model.js +221 -0
  80. package/dist/agent/session/legacy-adapter-language-model.js.map +1 -0
  81. package/dist/agent/session/types.d.ts +32 -0
  82. package/dist/agent/session/types.d.ts.map +1 -1
  83. package/dist/agent/session/types.js.map +1 -1
  84. package/dist/claude-adapter.d.ts.map +1 -1
  85. package/dist/claude-adapter.js +27 -0
  86. package/dist/claude-adapter.js.map +1 -1
  87. package/dist/fetch-pool.d.ts +47 -0
  88. package/dist/fetch-pool.d.ts.map +1 -0
  89. package/dist/fetch-pool.js +132 -0
  90. package/dist/fetch-pool.js.map +1 -0
  91. package/dist/gemini-adapter.d.ts.map +1 -1
  92. package/dist/gemini-adapter.js +65 -6
  93. package/dist/gemini-adapter.js.map +1 -1
  94. package/dist/index.d.ts +11 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +6 -0
  97. package/dist/index.js.map +1 -1
  98. package/dist/ollama-adapter.d.ts.map +1 -1
  99. package/dist/ollama-adapter.js +145 -15
  100. package/dist/ollama-adapter.js.map +1 -1
  101. package/dist/openrouter-adapter.d.ts.map +1 -1
  102. package/dist/openrouter-adapter.js +296 -15
  103. package/dist/openrouter-adapter.js.map +1 -1
  104. package/dist/prefill/strip.d.ts +49 -0
  105. package/dist/prefill/strip.d.ts.map +1 -0
  106. package/dist/prefill/strip.js +93 -0
  107. package/dist/prefill/strip.js.map +1 -0
  108. package/dist/prefill/translate.d.ts +55 -0
  109. package/dist/prefill/translate.d.ts.map +1 -0
  110. package/dist/prefill/translate.js +162 -0
  111. package/dist/prefill/translate.js.map +1 -0
  112. package/dist/prefill/truncate.d.ts +62 -0
  113. package/dist/prefill/truncate.d.ts.map +1 -0
  114. package/dist/prefill/truncate.js +77 -0
  115. package/dist/prefill/truncate.js.map +1 -0
  116. package/dist/provider-liveness.d.ts.map +1 -1
  117. package/dist/provider-liveness.js +17 -6
  118. package/dist/provider-liveness.js.map +1 -1
  119. package/dist/router/errors.d.ts +24 -7
  120. package/dist/router/errors.d.ts.map +1 -1
  121. package/dist/router/errors.js +71 -14
  122. package/dist/router/errors.js.map +1 -1
  123. package/dist/router/index.d.ts +3 -2
  124. package/dist/router/index.d.ts.map +1 -1
  125. package/dist/router/index.js +2 -1
  126. package/dist/router/index.js.map +1 -1
  127. package/dist/router/local-executor.d.ts.map +1 -1
  128. package/dist/router/local-executor.js +19 -6
  129. package/dist/router/local-executor.js.map +1 -1
  130. package/dist/router/model-registry.d.ts +22 -0
  131. package/dist/router/model-registry.d.ts.map +1 -1
  132. package/dist/router/model-registry.js +64 -1
  133. package/dist/router/model-registry.js.map +1 -1
  134. package/dist/router/provider-registry-resolver.d.ts +25 -0
  135. package/dist/router/provider-registry-resolver.d.ts.map +1 -0
  136. package/dist/router/provider-registry-resolver.js +84 -0
  137. package/dist/router/provider-registry-resolver.js.map +1 -0
  138. package/dist/router/retry.d.ts +3 -0
  139. package/dist/router/retry.d.ts.map +1 -1
  140. package/dist/router/retry.js +4 -1
  141. package/dist/router/retry.js.map +1 -1
  142. package/dist/router/router.d.ts +79 -1
  143. package/dist/router/router.d.ts.map +1 -1
  144. package/dist/router/router.js +256 -2
  145. package/dist/router/router.js.map +1 -1
  146. package/dist/router/types.d.ts +1 -1
  147. package/dist/router/types.d.ts.map +1 -1
  148. package/dist/router/types.js +1 -0
  149. package/dist/router/types.js.map +1 -1
  150. package/dist/single-shot.d.ts.map +1 -1
  151. package/dist/single-shot.js +26 -1
  152. package/dist/single-shot.js.map +1 -1
  153. package/dist/tools/builtin.d.ts +19 -0
  154. package/dist/tools/builtin.d.ts.map +1 -1
  155. package/dist/tools/builtin.js +51 -0
  156. package/dist/tools/builtin.js.map +1 -1
  157. package/dist/turn-recorder/__tests__/turn-recorder.test.d.ts +20 -0
  158. package/dist/turn-recorder/__tests__/turn-recorder.test.d.ts.map +1 -0
  159. package/dist/turn-recorder/__tests__/turn-recorder.test.js +282 -0
  160. package/dist/turn-recorder/__tests__/turn-recorder.test.js.map +1 -0
  161. package/dist/turn-recorder/hash.d.ts +10 -0
  162. package/dist/turn-recorder/hash.d.ts.map +1 -0
  163. package/dist/turn-recorder/hash.js +35 -0
  164. package/dist/turn-recorder/hash.js.map +1 -0
  165. package/dist/turn-recorder/index.d.ts +119 -0
  166. package/dist/turn-recorder/index.d.ts.map +1 -0
  167. package/dist/turn-recorder/index.js +326 -0
  168. package/dist/turn-recorder/index.js.map +1 -0
  169. package/dist/turn-recorder/types.d.ts +227 -0
  170. package/dist/turn-recorder/types.d.ts.map +1 -0
  171. package/dist/turn-recorder/types.js +20 -0
  172. package/dist/turn-recorder/types.js.map +1 -0
  173. package/dist/types.d.ts +35 -2
  174. package/dist/types.d.ts.map +1 -1
  175. package/package.json +4 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-recorder.test.js","sourceRoot":"","sources":["../../../src/turn-recorder/__tests__/turn-recorder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Content hashing for replay idempotency keys.
3
+ *
4
+ * Stable JSON-stringify with sorted object keys → sha256 hex. Mirrors
5
+ * core-pipeline's `effect-helpers.ts:contentHash` semantics so an
6
+ * idempotency key computed inside agent-core round-trips against the
7
+ * durable engine's own checks.
8
+ */
9
+ export declare function contentHashFromArgs(value: unknown): string;
10
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/turn-recorder/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Content hashing for replay idempotency keys.
3
+ *
4
+ * Stable JSON-stringify with sorted object keys → sha256 hex. Mirrors
5
+ * core-pipeline's `effect-helpers.ts:contentHash` semantics so an
6
+ * idempotency key computed inside agent-core round-trips against the
7
+ * durable engine's own checks.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ export function contentHashFromArgs(value) {
11
+ return createHash('sha256').update(stableStringify(value)).digest('hex');
12
+ }
13
+ function stableStringify(value) {
14
+ if (value === null)
15
+ return 'null';
16
+ if (value === undefined)
17
+ return 'undefined';
18
+ if (typeof value === 'number')
19
+ return Number.isFinite(value) ? String(value) : 'null';
20
+ if (typeof value === 'boolean')
21
+ return value ? 'true' : 'false';
22
+ if (typeof value === 'string')
23
+ return JSON.stringify(value);
24
+ if (Array.isArray(value)) {
25
+ return `[${value.map(stableStringify).join(',')}]`;
26
+ }
27
+ if (typeof value === 'object') {
28
+ const keys = Object.keys(value).sort();
29
+ const entries = keys.map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`);
30
+ return `{${entries.join(',')}}`;
31
+ }
32
+ // Symbols, functions, bigints fall through as their string form.
33
+ return JSON.stringify(String(value));
34
+ }
35
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/turn-recorder/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtF,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClC,CAAC;IACD,iEAAiE;IACjE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * TurnRecorder — splits one LLM invocation into per-turn sub-effects so
3
+ * the durable engine can replay tool results and resume mid-stream after
4
+ * a chain-fallback model swap.
5
+ *
6
+ * Effect-name vocabulary (per the v2 ADR §2.1):
7
+ * - `turn:<N>:assistant-start` — request payload (recorded, NOT input-hash-guarded: see startTurn)
8
+ * - `turn:<N>:tool_use:<M>` — intent (name + parsed args)
9
+ * - `turn:<N>:tool_result:<M>` — neutral result; replay short-circuits the executor
10
+ * - `turn:<N>:assistant-end` — completed assistant text + provenance
11
+ *
12
+ * Surface note vs ADR §2.5: the ADR sketches recordToolUse / recordToolResult
13
+ * as two separate calls. That split has no clean replay-vs-execute boundary
14
+ * through the `effect(name, fn)` interface — once the runtime accepts a fn
15
+ * for `tool_result:N`, fn already either ran (live) or didn't (replay), and
16
+ * the caller can't tell from outside. So the implementation collapses to a
17
+ * single `runTool(turn, name, args, key, exec)` that owns the
18
+ * intent-record → execute-or-replay → result-record sequence atomically.
19
+ * Same on-disk shape; cleaner adapter code; ADR §2.5 to be amended in
20
+ * follow-up.
21
+ *
22
+ * NullTurnRecorder factory: pass a `createNullRuntime()`-built runtime to
23
+ * make every call a no-op pass-through with live execution. Adapters that
24
+ * haven't been ported through their own H-phase use this default, so the
25
+ * recorder calls compile and run today without behavior change.
26
+ */
27
+ import type { AssistantStartRequest, AssistantTurn, EffectRuntimeLike, NeutralToolResult, PartialReason, PartialSink, Provenance, TurnRecorderDeps, TurnTokenUsage } from './types.js';
28
+ export declare class TurnRecorder {
29
+ private readonly deps;
30
+ /** Monotonic turn counter, scoped to this recorder (one per adapter.run).
31
+ * Seeded from deps.initialTurn so a sendInput-resume recorder continues
32
+ * past the prior adapter's turns (§2.5.1). */
33
+ private turnCounter;
34
+ /** Per-turn tool_use index counter — bumped serially per call. */
35
+ private readonly toolIdxByTurn;
36
+ /** Per-turn uuid stash so flushPartial can echo the right one. */
37
+ private readonly turnUuids;
38
+ /** Per-turn (model, provider) stash from startTurn so endTurn can
39
+ * stamp the assistant-end payload — the H3 cost rollup prices each
40
+ * turn by its authoring model. */
41
+ private readonly turnMeta;
42
+ /** Per-repo effect-name scope (e.g. `service-a:`); '' for single-stage. */
43
+ private readonly prefix;
44
+ constructor(deps: TurnRecorderDeps);
45
+ /** Scoped effect name for a turn sub-effect. */
46
+ private key;
47
+ /**
48
+ * Open a new assistant turn. Records the request payload as an
49
+ * `assistant-start` effect; on replay, returns the recorded turn's
50
+ * full transcript so the adapter can skip the upstream call entirely.
51
+ */
52
+ startTurn(req: AssistantStartRequest): Promise<{
53
+ turn: number;
54
+ turnUuid: string;
55
+ /** Present iff the matching `assistant-end` is already in the log. */
56
+ replayed?: AssistantTurn;
57
+ }>;
58
+ /**
59
+ * Peek the durable log for a fully-recorded turn N. Returns the
60
+ * reconstructed `AssistantTurn` iff `turn:N:assistant-end` exists;
61
+ * undefined on the live path (peek unsupported, or end not yet
62
+ * recorded). Pure reads only — no effect cursor is advanced here.
63
+ */
64
+ private tryReconstructTurn;
65
+ /**
66
+ * Record a tool intent + execute (or replay) the tool. Combines what
67
+ * the ADR drafted as two calls into one atomic sequence. The
68
+ * `idempotencyKey` is hashed by the caller (or fed in pre-computed)
69
+ * and guards against args drift on replay.
70
+ *
71
+ * Replay behavior: the inner `tool_result:M` effect is replayed
72
+ * verbatim — `exec()` is NOT invoked. Side effects (file writes, bash
73
+ * runs) stay as the prior model left them.
74
+ */
75
+ runTool(turn: number, name: string, args: Record<string, unknown>, idempotencyKey: string, exec: () => Promise<NeutralToolResult>): Promise<NeutralToolResult>;
76
+ /**
77
+ * Close an assistant turn with the completed text, stop reason, usage,
78
+ * and provenance. Records `assistant-end`; on replay this is a no-op.
79
+ */
80
+ endTurn(turn: number, text: string, stopReason: string, usage: TurnTokenUsage, provenance: Provenance,
81
+ /**
82
+ * Provider-native messages appended to history this turn (assistant
83
+ * + tool-result messages). Recorded so crash-resume re-appends them
84
+ * byte-for-byte (§ AssistantTurn.historyDelta). Default [] for the
85
+ * terminal no-tool turn (nothing appended). Opaque to the recorder.
86
+ */
87
+ historyDelta?: unknown[]): Promise<void>;
88
+ /**
89
+ * Flush an in-progress assistant text to the partial sink. Called from
90
+ * an adapter's catch block BEFORE re-throwing UpstreamError. Does NOT
91
+ * go through `effect()` — partial events are not subject to the
92
+ * (name, idx) counter; they're durable signals scoped by turnUuid.
93
+ *
94
+ * Safe to call when text is empty (sink decides whether to bother).
95
+ * Safe to call multiple times for the same turn — the sink handles
96
+ * dedup via turnUuid + recordedAt.
97
+ */
98
+ flushPartial(turn: number, text: string, toolUsesEmitted: number, reason: PartialReason): void;
99
+ private bumpToolIdx;
100
+ private uuid;
101
+ private nowIso;
102
+ }
103
+ export declare function createNullEffectRuntime(): EffectRuntimeLike;
104
+ export declare function createNullPartialSink(): PartialSink;
105
+ /**
106
+ * Convenience factory: a TurnRecorder that does the right structural
107
+ * thing (records → executes → emits) but persists nothing. Adapters use
108
+ * this when their caller hasn't supplied a real runtime + sink. Identical
109
+ * observable behavior to today's adapters; opens the door for the H2+
110
+ * wiring to inject the real instances without touching adapter code
111
+ * again.
112
+ */
113
+ export declare function createNullTurnRecorder(opts?: {
114
+ runId?: string;
115
+ stepId?: string;
116
+ }): TurnRecorder;
117
+ export type { TurnRecorderDeps } from './types.js';
118
+ export * from './types.js';
119
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turn-recorder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAEV,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,UAAU,EAEV,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAsDpB,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC;;mDAE+C;IAC/C,OAAO,CAAC,WAAW,CAAS;IAC5B,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD;;uCAEmC;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgE;IAEzF,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,IAAI,EAAE,gBAAgB;IAMlC,gDAAgD;IAChD,OAAO,CAAC,GAAG;IAIX;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC;QACnD,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,sEAAsE;QACtE,QAAQ,CAAC,EAAE,aAAa,CAAC;KAC1B,CAAC;IAoDF;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;;;;;;;;OASG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,iBAAiB,CAAC;IA2B7B;;;OAGG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,UAAU;IACtB;;;;;OAKG;IACH,YAAY,GAAE,OAAO,EAAO,GAC3B,OAAO,CAAC,IAAI,CAAC;IAmBhB;;;;;;;;;OASG;IACH,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,aAAa,GACpB,IAAI;IA4BP,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,MAAM;CAGf;AAUD,wBAAgB,uBAAuB,IAAI,iBAAiB,CAM3D;AAED,wBAAgB,qBAAqB,IAAI,WAAW,CAEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,YAAY,CAOf;AAED,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,cAAc,YAAY,CAAC"}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * TurnRecorder — splits one LLM invocation into per-turn sub-effects so
3
+ * the durable engine can replay tool results and resume mid-stream after
4
+ * a chain-fallback model swap.
5
+ *
6
+ * Effect-name vocabulary (per the v2 ADR §2.1):
7
+ * - `turn:<N>:assistant-start` — request payload (recorded, NOT input-hash-guarded: see startTurn)
8
+ * - `turn:<N>:tool_use:<M>` — intent (name + parsed args)
9
+ * - `turn:<N>:tool_result:<M>` — neutral result; replay short-circuits the executor
10
+ * - `turn:<N>:assistant-end` — completed assistant text + provenance
11
+ *
12
+ * Surface note vs ADR §2.5: the ADR sketches recordToolUse / recordToolResult
13
+ * as two separate calls. That split has no clean replay-vs-execute boundary
14
+ * through the `effect(name, fn)` interface — once the runtime accepts a fn
15
+ * for `tool_result:N`, fn already either ran (live) or didn't (replay), and
16
+ * the caller can't tell from outside. So the implementation collapses to a
17
+ * single `runTool(turn, name, args, key, exec)` that owns the
18
+ * intent-record → execute-or-replay → result-record sequence atomically.
19
+ * Same on-disk shape; cleaner adapter code; ADR §2.5 to be amended in
20
+ * follow-up.
21
+ *
22
+ * NullTurnRecorder factory: pass a `createNullRuntime()`-built runtime to
23
+ * make every call a no-op pass-through with live execution. Adapters that
24
+ * haven't been ported through their own H-phase use this default, so the
25
+ * recorder calls compile and run today without behavior change.
26
+ */
27
+ const DEFAULT_TOOL_RESULT_CAP_BYTES = 65_536;
28
+ /**
29
+ * Resolve the persisted-tool-result cap. `ANVIL_DURABLE_MAX_TOOL_RESULT_BYTES`
30
+ * overrides the 64 KiB default; `0` disables the cap (persist the full result).
31
+ */
32
+ function toolResultPersistCapBytes() {
33
+ const raw = process.env.ANVIL_DURABLE_MAX_TOOL_RESULT_BYTES;
34
+ if (raw === undefined)
35
+ return DEFAULT_TOOL_RESULT_CAP_BYTES;
36
+ const n = Number(raw);
37
+ if (n === 0)
38
+ return Infinity; // explicit opt-out — persist full payloads
39
+ return Number.isFinite(n) && n > 0 ? n : DEFAULT_TOOL_RESULT_CAP_BYTES;
40
+ }
41
+ /**
42
+ * Cap the `content` of a NeutralToolResult for durable storage. Only string
43
+ * content past the cap is truncated (with a marker); the result keeps a valid
44
+ * NeutralToolResult shape so resume's message reconstruction still works. The
45
+ * live caller is unaffected — this runs only on the persisted copy via
46
+ * `EffectOptions.persistTransform`.
47
+ */
48
+ function capToolResultForPersist(result) {
49
+ const cap = toolResultPersistCapBytes();
50
+ if (cap === Infinity || !result || typeof result !== 'object')
51
+ return result;
52
+ const r = result;
53
+ if (typeof r.content === 'string' && r.content.length > cap) {
54
+ const omitted = r.content.length - cap;
55
+ return {
56
+ ...r,
57
+ content: r.content.slice(0, cap) +
58
+ `\n…[${omitted} bytes truncated for durable storage; full output was sent to the model live]`,
59
+ };
60
+ }
61
+ return result;
62
+ }
63
+ const DEFAULT_UUID = () => (globalThis.crypto?.randomUUID?.() ?? fallbackUuid());
64
+ function fallbackUuid() {
65
+ // Minimal v4 fallback for runtimes without globalThis.crypto.
66
+ const hex = (n) => n.toString(16).padStart(2, '0');
67
+ const bytes = new Uint8Array(16);
68
+ for (let i = 0; i < 16; i++)
69
+ bytes[i] = Math.floor(Math.random() * 256);
70
+ bytes[6] = (bytes[6] & 0x0f) | 0x40;
71
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
72
+ const h = Array.from(bytes, hex);
73
+ return `${h.slice(0, 4).join('')}-${h.slice(4, 6).join('')}-${h.slice(6, 8).join('')}-${h.slice(8, 10).join('')}-${h.slice(10, 16).join('')}`;
74
+ }
75
+ export class TurnRecorder {
76
+ deps;
77
+ /** Monotonic turn counter, scoped to this recorder (one per adapter.run).
78
+ * Seeded from deps.initialTurn so a sendInput-resume recorder continues
79
+ * past the prior adapter's turns (§2.5.1). */
80
+ turnCounter;
81
+ /** Per-turn tool_use index counter — bumped serially per call. */
82
+ toolIdxByTurn = new Map();
83
+ /** Per-turn uuid stash so flushPartial can echo the right one. */
84
+ turnUuids = new Map();
85
+ /** Per-turn (model, provider) stash from startTurn so endTurn can
86
+ * stamp the assistant-end payload — the H3 cost rollup prices each
87
+ * turn by its authoring model. */
88
+ turnMeta = new Map();
89
+ /** Per-repo effect-name scope (e.g. `service-a:`); '' for single-stage. */
90
+ prefix;
91
+ constructor(deps) {
92
+ this.deps = deps;
93
+ this.turnCounter = deps.initialTurn ?? 0;
94
+ this.prefix = deps.effectPrefix ?? '';
95
+ }
96
+ /** Scoped effect name for a turn sub-effect. */
97
+ key(name) {
98
+ return `${this.prefix}${name}`;
99
+ }
100
+ /**
101
+ * Open a new assistant turn. Records the request payload as an
102
+ * `assistant-start` effect; on replay, returns the recorded turn's
103
+ * full transcript so the adapter can skip the upstream call entirely.
104
+ */
105
+ async startTurn(req) {
106
+ const turn = this.turnCounter++;
107
+ const turnUuid = this.uuid();
108
+ this.turnUuids.set(turn, turnUuid);
109
+ this.toolIdxByTurn.set(turn, 0);
110
+ this.turnMeta.set(turn, { model: req.model, provider: req.provider });
111
+ // Record the start. On replay this is a no-op that returns the
112
+ // recorded payload — we don't use the return value here because
113
+ // the meaningful replay signal is whether `assistant-end` exists.
114
+ //
115
+ // Deliberately NO `idempotencyKey` (input-hash) guard on this effect.
116
+ // The turn's input (system prompt + messages) embeds live-queried,
117
+ // process-local context: the Knowledge Base graph and memory block are
118
+ // re-queried in a fresh process on resume (the "stable" prompt getters
119
+ // only memoise WITHIN one run, not across a restart), and a cross-vendor
120
+ // continuation legitimately swaps the model/prefill. So the input is NOT
121
+ // byte-stable across resume — and it doesn't need to be: when
122
+ // `assistant-end` exists the recorded transcript is replayed verbatim
123
+ // (the upstream call is skipped, so the rebuilt prompt is never sent);
124
+ // when it doesn't, the turn re-runs live (the whole point of resume).
125
+ // Hashing the input into a FATAL determinism guard turned that benign
126
+ // drift into a `DeterminismViolationError` and broke resume entirely.
127
+ // The effect-SEQUENCE guard (name + idx) still catches genuine step-logic
128
+ // divergence; `runTool` still pins tool args via its own idempotencyKey.
129
+ await this.deps.runtime.effect(this.key(`turn:${turn}:assistant-start`), async () => ({
130
+ turnUuid,
131
+ model: req.model,
132
+ provider: req.provider,
133
+ prefillTurnUuid: req.prefill?.turnUuid ?? null,
134
+ // §Tier 2: persist the phase's user prompt so a stateful resume can
135
+ // reconstruct prior turns WITH their prompts. Additive only — never
136
+ // re-read by replay-skip (which reads assistant-end).
137
+ userPrompt: req.userPrompt ?? null,
138
+ }), { smallResult: true });
139
+ // H3 replay-skip: if this turn's `assistant-end` is already in the
140
+ // durable log, the whole turn ran on a prior process. Reconstruct
141
+ // it so the adapter skips the upstream call and re-appends the
142
+ // recorded native history verbatim. `peekRecorded` is a pure read
143
+ // (no cursor/idx mutation) — the adapter still calls runTool/endTurn
144
+ // in order to advance the replay cursor over the recorded sub-effects.
145
+ const replayed = this.tryReconstructTurn(turn, turnUuid);
146
+ if (replayed)
147
+ return { turn, turnUuid, replayed };
148
+ return { turn, turnUuid };
149
+ }
150
+ /**
151
+ * Peek the durable log for a fully-recorded turn N. Returns the
152
+ * reconstructed `AssistantTurn` iff `turn:N:assistant-end` exists;
153
+ * undefined on the live path (peek unsupported, or end not yet
154
+ * recorded). Pure reads only — no effect cursor is advanced here.
155
+ */
156
+ tryReconstructTurn(turn, turnUuid) {
157
+ const peek = this.deps.runtime.peekRecorded?.bind(this.deps.runtime);
158
+ if (!peek)
159
+ return undefined;
160
+ const end = peek(this.key(`turn:${turn}:assistant-end`));
161
+ if (!end)
162
+ return undefined;
163
+ const toolUses = [];
164
+ const toolResults = [];
165
+ for (let m = 0;; m += 1) {
166
+ const tu = peek(this.key(`turn:${turn}:tool_use:${m}`));
167
+ if (!tu)
168
+ break;
169
+ const tr = peek(this.key(`turn:${turn}:tool_result:${m}`));
170
+ toolUses.push({
171
+ // `id` isn't in the tool_use payload; the matching tool_result
172
+ // carries `toolUseId` (the provider id). Used only for cosmetic
173
+ // re-emit on replay — runTool keys off (name, idx, idempotencyKey).
174
+ id: tr?.toolUseId ?? '',
175
+ name: tu.name ?? '',
176
+ arguments: tu.arguments ?? {},
177
+ idempotencyKey: tu.idempotencyKey ?? '',
178
+ });
179
+ if (tr)
180
+ toolResults.push(tr);
181
+ }
182
+ return {
183
+ turnUuid,
184
+ turn,
185
+ text: end.text ?? '',
186
+ stopReason: end.stopReason ?? 'end_turn',
187
+ usage: end.usage ?? { inputTokens: 0, outputTokens: 0 },
188
+ provenance: end.provenance ?? { segments: [] },
189
+ toolUses,
190
+ toolResults,
191
+ historyDelta: end.historyDelta ?? [],
192
+ };
193
+ }
194
+ /**
195
+ * Record a tool intent + execute (or replay) the tool. Combines what
196
+ * the ADR drafted as two calls into one atomic sequence. The
197
+ * `idempotencyKey` is hashed by the caller (or fed in pre-computed)
198
+ * and guards against args drift on replay.
199
+ *
200
+ * Replay behavior: the inner `tool_result:M` effect is replayed
201
+ * verbatim — `exec()` is NOT invoked. Side effects (file writes, bash
202
+ * runs) stay as the prior model left them.
203
+ */
204
+ async runTool(turn, name, args, idempotencyKey, exec) {
205
+ const idx = this.bumpToolIdx(turn);
206
+ await this.deps.runtime.effect(this.key(`turn:${turn}:tool_use:${idx}`), async () => ({ name, arguments: args, idempotencyKey }), { idempotencyKey, smallResult: true });
207
+ const result = await this.deps.runtime.effect(this.key(`turn:${turn}:tool_result:${idx}`), exec, {
208
+ // Cap the PERSISTED copy of large tool results (file dumps, bash
209
+ // stdout). A single agentic turn can fire many tool calls; persisting
210
+ // multi-MB payloads synchronously into SQLite blocks the event loop
211
+ // and is the dominant "LLM feels slow" cost. The live model still
212
+ // receives the full result — only the durable copy (replayed on
213
+ // resume) is truncated. Default cap 64 KiB; set
214
+ // ANVIL_DURABLE_MAX_TOOL_RESULT_BYTES=0 to disable.
215
+ persistTransform: (r) => capToolResultForPersist(r),
216
+ });
217
+ return result;
218
+ }
219
+ /**
220
+ * Close an assistant turn with the completed text, stop reason, usage,
221
+ * and provenance. Records `assistant-end`; on replay this is a no-op.
222
+ */
223
+ async endTurn(turn, text, stopReason, usage, provenance,
224
+ /**
225
+ * Provider-native messages appended to history this turn (assistant
226
+ * + tool-result messages). Recorded so crash-resume re-appends them
227
+ * byte-for-byte (§ AssistantTurn.historyDelta). Default [] for the
228
+ * terminal no-tool turn (nothing appended). Opaque to the recorder.
229
+ */
230
+ historyDelta = []) {
231
+ const meta = this.turnMeta.get(turn);
232
+ await this.deps.runtime.effect(this.key(`turn:${turn}:assistant-end`), async () => ({
233
+ text,
234
+ stopReason,
235
+ usage,
236
+ provenance,
237
+ historyDelta,
238
+ // model + provider stamp lets the H3 per-model cost rollup price
239
+ // this turn's tokens by its authoring model.
240
+ model: meta?.model,
241
+ provider: meta?.provider,
242
+ }), { smallResult: text.length < 4_000 });
243
+ }
244
+ /**
245
+ * Flush an in-progress assistant text to the partial sink. Called from
246
+ * an adapter's catch block BEFORE re-throwing UpstreamError. Does NOT
247
+ * go through `effect()` — partial events are not subject to the
248
+ * (name, idx) counter; they're durable signals scoped by turnUuid.
249
+ *
250
+ * Safe to call when text is empty (sink decides whether to bother).
251
+ * Safe to call multiple times for the same turn — the sink handles
252
+ * dedup via turnUuid + recordedAt.
253
+ */
254
+ flushPartial(turn, text, toolUsesEmitted, reason) {
255
+ const turnUuid = this.turnUuids.get(turn);
256
+ if (!turnUuid)
257
+ return; // startTurn was never called — nothing to flush.
258
+ const partial = {
259
+ runId: this.deps.runId,
260
+ stepId: this.deps.stepId,
261
+ turnUuid,
262
+ turn,
263
+ text,
264
+ toolUsesEmitted,
265
+ reason,
266
+ recordedAt: this.nowIso(),
267
+ };
268
+ try {
269
+ this.deps.partialSink(partial);
270
+ }
271
+ catch (err) {
272
+ // Sink should be a fire-and-forget; if it throws we still re-throw
273
+ // the upstream error — log to stderr so the failure is visible.
274
+ process.stderr.write(`[turn-recorder] partialSink threw: ${err instanceof Error ? err.message : String(err)}\n`);
275
+ }
276
+ }
277
+ // ─────────────────────────────────────────────────────────────────
278
+ // Internals
279
+ // ─────────────────────────────────────────────────────────────────
280
+ bumpToolIdx(turn) {
281
+ const next = this.toolIdxByTurn.get(turn) ?? 0;
282
+ this.toolIdxByTurn.set(turn, next + 1);
283
+ return next;
284
+ }
285
+ uuid() {
286
+ return this.deps.uuid?.() ?? DEFAULT_UUID();
287
+ }
288
+ nowIso() {
289
+ return this.deps.nowIso?.() ?? new Date().toISOString();
290
+ }
291
+ }
292
+ // ─────────────────────────────────────────────────────────────────────
293
+ // Null runtime — for adapters that haven't yet been wired to a real
294
+ // EffectRuntime. Calls execute live; nothing is recorded; replay is a
295
+ // no-op (since nothing is on disk). Lets us land the H1 recorder calls
296
+ // without forcing every adapter or every call-site to thread a real
297
+ // EffectRuntime through agent-core's bridge today.
298
+ // ─────────────────────────────────────────────────────────────────────
299
+ export function createNullEffectRuntime() {
300
+ return {
301
+ async effect(_name, fn) {
302
+ return await fn();
303
+ },
304
+ };
305
+ }
306
+ export function createNullPartialSink() {
307
+ return () => { };
308
+ }
309
+ /**
310
+ * Convenience factory: a TurnRecorder that does the right structural
311
+ * thing (records → executes → emits) but persists nothing. Adapters use
312
+ * this when their caller hasn't supplied a real runtime + sink. Identical
313
+ * observable behavior to today's adapters; opens the door for the H2+
314
+ * wiring to inject the real instances without touching adapter code
315
+ * again.
316
+ */
317
+ export function createNullTurnRecorder(opts) {
318
+ return new TurnRecorder({
319
+ runtime: createNullEffectRuntime(),
320
+ partialSink: createNullPartialSink(),
321
+ runId: opts?.runId ?? 'null-run',
322
+ stepId: opts?.stepId ?? 'null-step',
323
+ });
324
+ }
325
+ export * from './types.js';
326
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/turn-recorder/index.ts"],"names":[],"mappings":"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"}