@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,227 @@
1
+ /**
2
+ * TurnRecorder types — public shapes consumed by adapters that drive a
3
+ * multi-turn LLM tool loop and want their turns split into sub-effects
4
+ * so chain-fallback can resume mid-stream.
5
+ *
6
+ * Design notes:
7
+ * - agent-core does NOT depend on `@anvil/core-pipeline`. The
8
+ * `EffectRuntimeLike` interface here is the structural shape an
9
+ * adapter needs — core-pipeline's concrete `EffectRuntime` satisfies
10
+ * it, but agent-core never imports the class. This avoids a
11
+ * circular dep direction.
12
+ * - The recorder is constructed per `adapter.run()` call. It holds a
13
+ * monotonic `turn` counter scoped to the (stepId, sessionId) pair.
14
+ * - `flushPartial` is intentionally non-async and not routed through
15
+ * `effect()` — it MUST be safe to fire from a `catch` block that is
16
+ * about to re-throw an `UpstreamError`. The sink may queue the
17
+ * write durably under the hood; the recorder doesn't wait.
18
+ */
19
+ import type { ProviderName } from '../types.js';
20
+ /**
21
+ * Minimal effect-runtime shape the recorder relies on. Mirrors the
22
+ * `effect(name, fn, opts?)` method on core-pipeline's `EffectRuntime`.
23
+ * Anything else on the real class (now/uuid/random/sleep/waitForSignal)
24
+ * is irrelevant to the recorder.
25
+ *
26
+ * Replay semantics: when an effect with `(name, idx)` is already in the
27
+ * durable log, `fn` is NOT invoked — the recorded payload is returned.
28
+ * Recording side effects (`record*` methods) thus become no-ops on
29
+ * replay, which is exactly what we want.
30
+ */
31
+ export interface EffectRuntimeLike {
32
+ effect<T>(name: string, fn: () => Promise<T>, opts?: EffectInvokeOptions): Promise<T>;
33
+ /**
34
+ * H3 replay-skip seam: peek the recorded payload of a COMPLETED effect
35
+ * by name WITHOUT advancing the replay cursor or the per-step idx
36
+ * counter. Returns the recorded `effect:completed` payload if one
37
+ * exists in this step's log, else undefined. Lets `startTurn` detect
38
+ * that a turn was already fully recorded (its `assistant-end` exists)
39
+ * so the adapter can skip the upstream call entirely on crash-resume.
40
+ *
41
+ * Optional: the NullEffectRuntime omits it, so non-durable callers
42
+ * (single-shot / no DurableStore) always run live (peek → undefined →
43
+ * no replay). The concrete core-pipeline `EffectRuntime` implements it
44
+ * as a pure read over the pre-loaded recorded-effect set.
45
+ */
46
+ peekRecorded?<T = unknown>(name: string): T | undefined;
47
+ }
48
+ export interface EffectInvokeOptions {
49
+ /** Stable input hash; mismatches on replay throw a determinism error. */
50
+ idempotencyKey?: string;
51
+ /** Hint that the payload is small enough to inline; runtime may skip blobs. */
52
+ smallResult?: boolean;
53
+ /**
54
+ * Transform applied to the result before it is persisted to the durable
55
+ * log; the live caller still gets the full result. Used to cap large
56
+ * tool-result payloads so a turn doesn't block the loop serialising them.
57
+ * Mirrors `EffectOptions.persistTransform` in core-pipeline.
58
+ */
59
+ persistTransform?: (result: unknown) => unknown;
60
+ }
61
+ export interface RecordedToolUse {
62
+ /** Provider-supplied tool_use id (e.g. OpenAI's `tool_call_id`). */
63
+ id: string;
64
+ name: string;
65
+ /** Parsed JSON arguments. UNPARSED args MUST NOT be recorded (§2.1.1). */
66
+ arguments: Record<string, unknown>;
67
+ /** sha256(name || JSON.stringify(arguments)). */
68
+ idempotencyKey: string;
69
+ }
70
+ export interface NeutralToolResult {
71
+ toolUseId: string;
72
+ toolName: string;
73
+ ok: boolean;
74
+ content: string | unknown;
75
+ durationMs?: number;
76
+ }
77
+ export interface ProvenanceSegment {
78
+ model: string;
79
+ provider: ProviderName;
80
+ range: [number, number];
81
+ source: 'live' | 'prefill';
82
+ }
83
+ export interface Provenance {
84
+ segments: ProvenanceSegment[];
85
+ }
86
+ export interface TurnTokenUsage {
87
+ inputTokens: number;
88
+ outputTokens: number;
89
+ cacheReadTokens?: number;
90
+ cacheWriteTokens?: number;
91
+ /** Subset of inputTokens carved out for §2.6 prefill-reinjection. */
92
+ prefilledInputTokens?: number;
93
+ }
94
+ export interface PrefillToolUse {
95
+ id: string;
96
+ name: string;
97
+ input: unknown;
98
+ result: NeutralToolResult;
99
+ producedBy: ProviderName;
100
+ }
101
+ export interface Prefill {
102
+ turnUuid: string;
103
+ text: string;
104
+ toolUses: PrefillToolUse[];
105
+ sourceProvider: ProviderName;
106
+ /** Model id that authored the partial — drives §2.7 provenance
107
+ * segment[0].model on the resuming turn. Optional: omitted by
108
+ * pre-H3 callers / when the source model is unknown. */
109
+ sourceModel?: string;
110
+ /** Tokens (as billed by sourceProvider) for `text`; H3 cost accounting. */
111
+ sourceTokens: number;
112
+ }
113
+ /**
114
+ * §Tier 2 — one COMPLETED prior turn of a stateful session, reconstructed
115
+ * from the durable log so a cross-model (or merely non-claude) resume can
116
+ * re-present the full conversation in the target provider's wire format.
117
+ * Unlike `Prefill` (the in-progress burned turn), these are finished turns.
118
+ *
119
+ * `userPrompt` is present on the FIRST turn of each phase (the new user
120
+ * message that opened that phase); it's undefined on tool-loop continuation
121
+ * turns within a phase, and on pre-Tier-2 logs that never recorded it.
122
+ */
123
+ export interface PrefillTurn {
124
+ userPrompt?: string;
125
+ text: string;
126
+ toolUses: PrefillToolUse[];
127
+ /**
128
+ * Authoring provider of this completed turn — informational / provenance.
129
+ * `materializePriorTurns` flattens all turns to the resuming target's wire
130
+ * format and does NOT run per-turn `stripForTarget`: completed turns are
131
+ * rebuilt from neutral fields (text + `NeutralToolResult`) that carry no
132
+ * vendor keys (no `reasoning_details` / `cache_control` / `prompt_cache_key`),
133
+ * so there is nothing to strip. (Contrast the `prefill` path, which does
134
+ * `stripForTarget` because it can re-present source-shaped messages.)
135
+ */
136
+ producedBy: ProviderName;
137
+ }
138
+ export type PartialReason = 'upstream' | 'abort' | 'timeout';
139
+ export interface AssistantPartial {
140
+ runId: string;
141
+ stepId: string;
142
+ turnUuid: string;
143
+ turn: number;
144
+ text: string;
145
+ /** Count of FULLY-PARSED tool_use blocks emitted before the throw. */
146
+ toolUsesEmitted: number;
147
+ reason: PartialReason;
148
+ recordedAt: string;
149
+ }
150
+ export type PartialSink = (partial: AssistantPartial) => void;
151
+ export interface AssistantStartRequest {
152
+ model: string;
153
+ provider: ProviderName;
154
+ system?: string;
155
+ /** Raw conversation messages sent to the upstream. Recorded for provenance. */
156
+ messages: unknown;
157
+ prefill?: Prefill;
158
+ /**
159
+ * §Tier 2 — the new user message that opened this phase. Recorded in the
160
+ * assistant-start payload so `reconstructSessionHistory` can re-present
161
+ * prior turns with their prompts on a stateful (non-claude) session resume.
162
+ */
163
+ userPrompt?: string;
164
+ }
165
+ export interface AssistantTurn {
166
+ turnUuid: string;
167
+ turn: number;
168
+ text: string;
169
+ stopReason: string;
170
+ usage: TurnTokenUsage;
171
+ provenance: Provenance;
172
+ toolUses: RecordedToolUse[];
173
+ toolResults: NeutralToolResult[];
174
+ /**
175
+ * H3 replay determinism: the EXACT provider-native messages the
176
+ * adapter appended to its conversation history during this turn
177
+ * (assistant message + tool-result messages), as opaque objects. On
178
+ * crash-resume the adapter re-appends these verbatim instead of
179
+ * reconstructing them from the neutral `toolUses`/`text` — raw vs
180
+ * canonical `tool_calls` arguments and vendor `reasoning_details` echoes
181
+ * would otherwise drift, leaving the FIRST live turn past the replay
182
+ * frontier with a malformed upstream request (e.g. unpaired tool_calls,
183
+ * or "reasoning_content is missing"). Empty for a terminal (no-tool)
184
+ * turn that appended nothing before breaking.
185
+ */
186
+ historyDelta: unknown[];
187
+ }
188
+ export interface TurnRecorderDeps {
189
+ /** EffectRuntime to record sub-effects against. */
190
+ runtime: EffectRuntimeLike;
191
+ /** Fire-and-forget partial sink; called from adapter catch blocks. */
192
+ partialSink: PartialSink;
193
+ /** Stable runId — propagated into AssistantPartial rows. */
194
+ runId: string;
195
+ /** Stable stepId — scopes the recorder to one pipeline Step. */
196
+ stepId: string;
197
+ /** v4 uuid factory — overridable for tests. Defaults to crypto.randomUUID. */
198
+ uuid?: () => string;
199
+ /** Wall-clock helper — overridable for tests. Defaults to () => new Date().toISOString(). */
200
+ nowIso?: () => string;
201
+ /**
202
+ * Effect-name prefix (v2 ADR §2.4 per-repo scoping). When a step fans
203
+ * out across repos in parallel, every repo's recorder writes effects
204
+ * under the SAME durable step id, so a bare `turn:0:assistant-start`
205
+ * from two repos would collide. The caller passes a per-repo prefix
206
+ * (e.g. `service-a:`) so the recorded keys become
207
+ * `service-a:turn:0:assistant-start` — unique per repo AND matched by
208
+ * the durable engine's per-repo effect filter (which keys on delimited
209
+ * scope tokens). Empty ('') for single-stage paths. Applied uniformly
210
+ * to every effect name AND to the `peekRecorded` replay lookup.
211
+ */
212
+ effectPrefix?: string;
213
+ /**
214
+ * Seed for the per-recorder turn counter (v2 ADR §2.5.1). When an
215
+ * `AgentProcess.sendInput()` resume spawns a NEW adapter (hence a new
216
+ * recorder) for a session whose prior adapter already recorded turns
217
+ * 0..N, the new recorder MUST continue at N+1 so `(stepId, turnUuid)`
218
+ * stays globally unique and replay's effect-idx matching doesn't
219
+ * collide. The recorder itself cannot read the durable log (it only
220
+ * holds a structural `EffectRuntimeLike`), so the CALLER computes the
221
+ * highest completed turn for (runId, stepId) and passes it here; the
222
+ * recorder seeds `turnCounter = initialTurn`. Defaults to 0 (fresh
223
+ * session / no prior turns).
224
+ */
225
+ initialTurn?: number;
226
+ }
227
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/turn-recorder/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TurnRecorder types — public shapes consumed by adapters that drive a
3
+ * multi-turn LLM tool loop and want their turns split into sub-effects
4
+ * so chain-fallback can resume mid-stream.
5
+ *
6
+ * Design notes:
7
+ * - agent-core does NOT depend on `@anvil/core-pipeline`. The
8
+ * `EffectRuntimeLike` interface here is the structural shape an
9
+ * adapter needs — core-pipeline's concrete `EffectRuntime` satisfies
10
+ * it, but agent-core never imports the class. This avoids a
11
+ * circular dep direction.
12
+ * - The recorder is constructed per `adapter.run()` call. It holds a
13
+ * monotonic `turn` counter scoped to the (stepId, sessionId) pair.
14
+ * - `flushPartial` is intentionally non-async and not routed through
15
+ * `effect()` — it MUST be safe to fire from a `catch` block that is
16
+ * about to re-throw an `UpstreamError`. The sink may queue the
17
+ * write durably under the hood; the recorder doesn't wait.
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/turn-recorder/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
package/dist/types.d.ts CHANGED
@@ -129,8 +129,13 @@ export interface LanguageModel {
129
129
  version?: string;
130
130
  error?: string;
131
131
  }>;
132
- /** Streaming surface — yields events as the provider produces them. */
133
- invokeStream(opts: LanguageModelInvokeOptions): AsyncIterable<StreamEvent>;
132
+ /**
133
+ * Streaming surface — yields events as the provider produces them and
134
+ * RETURNS the assembled `InvokeResult` (cost/usage/finish) on completion,
135
+ * so a streaming consumer (the router's chain walk) gets the same outcome
136
+ * data a single-shot `invoke()` would, without re-running the call.
137
+ */
138
+ invokeStream(opts: LanguageModelInvokeOptions): AsyncGenerator<StreamEvent, InvokeResult>;
134
139
  /** Single-shot surface — drains the stream and returns the final block. */
135
140
  invoke(opts: LanguageModelInvokeOptions): Promise<InvokeResult>;
136
141
  }
@@ -189,6 +194,34 @@ export interface ModelAdapterConfig {
189
194
  * ADR §C5.
190
195
  */
191
196
  mcpConfigPath?: string;
197
+ /**
198
+ * Turn-level durable recorder (v2 ADR §2.5). When supplied by the
199
+ * caller, the adapter splits its LLM invocation into per-turn
200
+ * sub-effects (`assistant-start` / `tool_use:N` / `tool_result:N` /
201
+ * `assistant-end`) recorded against the caller's `EffectRuntime`.
202
+ * When absent, adapters construct a `NullTurnRecorder` internally —
203
+ * structural calls still happen so the code path is the same, but
204
+ * nothing is persisted. Recording is implemented for every adapter
205
+ * except `gemini-cli` (a CLI subprocess with no token-level stream),
206
+ * which always no-ops the recorder.
207
+ */
208
+ turnRecorder?: import('./turn-recorder/index.js').TurnRecorder;
209
+ /**
210
+ * Prefill from a prior model that burned mid-stream (v2 ADR §2.3).
211
+ * When present, the adapter materializes the trailing-assistant +
212
+ * recorded tool-result history into its provider's wire format and
213
+ * continues from the exact character where the prior model stopped.
214
+ */
215
+ prefill?: import('./turn-recorder/index.js').Prefill;
216
+ /**
217
+ * §Tier 2 — COMPLETED prior turns of a stateful session, reconstructed
218
+ * from the durable log. Spliced (materialized into this provider's wire
219
+ * format) BEFORE the new user message so a non-claude session resume
220
+ * re-presents the full conversation instead of starting fresh. Claude
221
+ * uses native `--resume` and is gated out at the bridge. Empty/undefined
222
+ * → unchanged single-turn behavior.
223
+ */
224
+ priorMessages?: import('./turn-recorder/index.js').PrefillTurn[];
192
225
  }
193
226
  export interface ToolExecutorLike {
194
227
  listSchemas(): ToolSchema[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esankhan3/anvil-agent-core",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Shared LLM stack — unified LanguageModel interface, provider adapters, agent subprocess machinery, and cost calculation for cli + knowledge-core + headless runners.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -22,10 +22,11 @@
22
22
  "scripts": {
23
23
  "build": "tsc -b && mkdir -p dist/data && cp src/data/model-prices.json dist/data/",
24
24
  "dev": "tsc -b --watch",
25
- "test": "tsc -b && mkdir -p dist/data && cp src/data/model-prices.json dist/data/ && node --test dist/__tests__/*.test.js dist/agent/session/__tests__/*.test.js dist/checkpoint/__tests__/*.test.js",
25
+ "test": "tsc -b && mkdir -p dist/data && cp src/data/model-prices.json dist/data/ && node --test dist/__tests__/*.test.js dist/agent/session/__tests__/*.test.js dist/checkpoint/__tests__/*.test.js dist/turn-recorder/__tests__/*.test.js",
26
26
  "refresh-cost-table": "node scripts/refresh-cost-table.mjs"
27
27
  },
28
28
  "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.29.0",
29
30
  "@opentelemetry/api": "^1.9.0",
30
31
  "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
31
32
  "@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
@@ -34,8 +35,8 @@
34
35
  "@opentelemetry/sdk-trace-base": "^2.0.0",
35
36
  "@opentelemetry/sdk-trace-node": "^2.0.0",
36
37
  "@opentelemetry/semantic-conventions": "^1.30.0",
37
- "@modelcontextprotocol/sdk": "^1.29.0",
38
38
  "better-sqlite3": "^11.7.0",
39
+ "undici": "^7.25.0",
39
40
  "yaml": "^2.8.3"
40
41
  },
41
42
  "optionalDependencies": {