@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.
- package/README.md +1 -1
- package/dist/__tests__/fetch-pool.integration.test.d.ts +15 -0
- package/dist/__tests__/fetch-pool.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fetch-pool.integration.test.js +109 -0
- package/dist/__tests__/fetch-pool.integration.test.js.map +1 -0
- package/dist/__tests__/fetch-pool.test.d.ts +15 -0
- package/dist/__tests__/fetch-pool.test.d.ts.map +1 -0
- package/dist/__tests__/fetch-pool.test.js +115 -0
- package/dist/__tests__/fetch-pool.test.js.map +1 -0
- package/dist/__tests__/gemini-adapter-recording.test.d.ts +11 -0
- package/dist/__tests__/gemini-adapter-recording.test.d.ts.map +1 -0
- package/dist/__tests__/gemini-adapter-recording.test.js +108 -0
- package/dist/__tests__/gemini-adapter-recording.test.js.map +1 -0
- package/dist/__tests__/legacy-adapter-language-model.test.d.ts +11 -0
- package/dist/__tests__/legacy-adapter-language-model.test.d.ts.map +1 -0
- package/dist/__tests__/legacy-adapter-language-model.test.js +102 -0
- package/dist/__tests__/legacy-adapter-language-model.test.js.map +1 -0
- package/dist/__tests__/ollama-adapter-recording.test.d.ts +15 -0
- package/dist/__tests__/ollama-adapter-recording.test.d.ts.map +1 -0
- package/dist/__tests__/ollama-adapter-recording.test.js +128 -0
- package/dist/__tests__/ollama-adapter-recording.test.js.map +1 -0
- package/dist/__tests__/openrouter-prefill.integration.test.d.ts +19 -0
- package/dist/__tests__/openrouter-prefill.integration.test.d.ts.map +1 -0
- package/dist/__tests__/openrouter-prefill.integration.test.js +410 -0
- package/dist/__tests__/openrouter-prefill.integration.test.js.map +1 -0
- package/dist/__tests__/prefill-truncate.test.d.ts +8 -0
- package/dist/__tests__/prefill-truncate.test.d.ts.map +1 -0
- package/dist/__tests__/prefill-truncate.test.js +75 -0
- package/dist/__tests__/prefill-truncate.test.js.map +1 -0
- package/dist/__tests__/router-circuit-breaker.test.js +1 -1
- package/dist/__tests__/router-circuit-breaker.test.js.map +1 -1
- package/dist/__tests__/router-classify-unified.test.d.ts +12 -0
- package/dist/__tests__/router-classify-unified.test.d.ts.map +1 -0
- package/dist/__tests__/router-classify-unified.test.js +108 -0
- package/dist/__tests__/router-classify-unified.test.js.map +1 -0
- package/dist/__tests__/router-fallback.test.js +1 -1
- package/dist/__tests__/router-fallback.test.js.map +1 -1
- package/dist/__tests__/router-model-registry.test.js +24 -0
- package/dist/__tests__/router-model-registry.test.js.map +1 -1
- package/dist/__tests__/router-retry.test.js +3 -5
- package/dist/__tests__/router-retry.test.js.map +1 -1
- package/dist/__tests__/router-runagent.test.d.ts +14 -0
- package/dist/__tests__/router-runagent.test.d.ts.map +1 -0
- package/dist/__tests__/router-runagent.test.js +95 -0
- package/dist/__tests__/router-runagent.test.js.map +1 -0
- package/dist/__tests__/router-scaffold.test.js +2 -1
- package/dist/__tests__/router-scaffold.test.js.map +1 -1
- package/dist/__tests__/router-spend-ledger.test.js +1 -1
- package/dist/__tests__/router-spend-ledger.test.js.map +1 -1
- package/dist/__tests__/router-stream-fallback.test.d.ts +13 -0
- package/dist/__tests__/router-stream-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/router-stream-fallback.test.js +129 -0
- package/dist/__tests__/router-stream-fallback.test.js.map +1 -0
- package/dist/__tests__/router-telemetry.test.js +3 -1
- package/dist/__tests__/router-telemetry.test.js.map +1 -1
- package/dist/__tests__/util/mock-upstream.d.ts +77 -0
- package/dist/__tests__/util/mock-upstream.d.ts.map +1 -0
- package/dist/__tests__/util/mock-upstream.js +219 -0
- package/dist/__tests__/util/mock-upstream.js.map +1 -0
- package/dist/adk-adapter.d.ts.map +1 -1
- package/dist/adk-adapter.js +51 -0
- package/dist/adk-adapter.js.map +1 -1
- package/dist/adk-anthropic-llm.d.ts.map +1 -1
- package/dist/adk-anthropic-llm.js +23 -10
- package/dist/adk-anthropic-llm.js.map +1 -1
- package/dist/agent/session/adapter.d.ts +25 -0
- package/dist/agent/session/adapter.d.ts.map +1 -1
- package/dist/agent/session/adapter.js +4 -0
- package/dist/agent/session/adapter.js.map +1 -1
- package/dist/agent/session/index.d.ts +1 -0
- package/dist/agent/session/index.d.ts.map +1 -1
- package/dist/agent/session/index.js +1 -0
- package/dist/agent/session/index.js.map +1 -1
- package/dist/agent/session/language-model-bridge.d.ts.map +1 -1
- package/dist/agent/session/language-model-bridge.js +30 -2
- package/dist/agent/session/language-model-bridge.js.map +1 -1
- package/dist/agent/session/legacy-adapter-language-model.d.ts +27 -0
- package/dist/agent/session/legacy-adapter-language-model.d.ts.map +1 -0
- package/dist/agent/session/legacy-adapter-language-model.js +221 -0
- package/dist/agent/session/legacy-adapter-language-model.js.map +1 -0
- package/dist/agent/session/types.d.ts +32 -0
- package/dist/agent/session/types.d.ts.map +1 -1
- package/dist/agent/session/types.js.map +1 -1
- package/dist/claude-adapter.d.ts.map +1 -1
- package/dist/claude-adapter.js +27 -0
- package/dist/claude-adapter.js.map +1 -1
- package/dist/fetch-pool.d.ts +47 -0
- package/dist/fetch-pool.d.ts.map +1 -0
- package/dist/fetch-pool.js +132 -0
- package/dist/fetch-pool.js.map +1 -0
- package/dist/gemini-adapter.d.ts.map +1 -1
- package/dist/gemini-adapter.js +65 -6
- package/dist/gemini-adapter.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/ollama-adapter.d.ts.map +1 -1
- package/dist/ollama-adapter.js +145 -15
- package/dist/ollama-adapter.js.map +1 -1
- package/dist/openrouter-adapter.d.ts.map +1 -1
- package/dist/openrouter-adapter.js +296 -15
- package/dist/openrouter-adapter.js.map +1 -1
- package/dist/prefill/strip.d.ts +49 -0
- package/dist/prefill/strip.d.ts.map +1 -0
- package/dist/prefill/strip.js +93 -0
- package/dist/prefill/strip.js.map +1 -0
- package/dist/prefill/translate.d.ts +55 -0
- package/dist/prefill/translate.d.ts.map +1 -0
- package/dist/prefill/translate.js +162 -0
- package/dist/prefill/translate.js.map +1 -0
- package/dist/prefill/truncate.d.ts +62 -0
- package/dist/prefill/truncate.d.ts.map +1 -0
- package/dist/prefill/truncate.js +77 -0
- package/dist/prefill/truncate.js.map +1 -0
- package/dist/provider-liveness.d.ts.map +1 -1
- package/dist/provider-liveness.js +17 -6
- package/dist/provider-liveness.js.map +1 -1
- package/dist/router/errors.d.ts +24 -7
- package/dist/router/errors.d.ts.map +1 -1
- package/dist/router/errors.js +71 -14
- package/dist/router/errors.js.map +1 -1
- package/dist/router/index.d.ts +3 -2
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +2 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/local-executor.d.ts.map +1 -1
- package/dist/router/local-executor.js +19 -6
- package/dist/router/local-executor.js.map +1 -1
- package/dist/router/model-registry.d.ts +22 -0
- package/dist/router/model-registry.d.ts.map +1 -1
- package/dist/router/model-registry.js +64 -1
- package/dist/router/model-registry.js.map +1 -1
- package/dist/router/provider-registry-resolver.d.ts +25 -0
- package/dist/router/provider-registry-resolver.d.ts.map +1 -0
- package/dist/router/provider-registry-resolver.js +84 -0
- package/dist/router/provider-registry-resolver.js.map +1 -0
- package/dist/router/retry.d.ts +3 -0
- package/dist/router/retry.d.ts.map +1 -1
- package/dist/router/retry.js +4 -1
- package/dist/router/retry.js.map +1 -1
- package/dist/router/router.d.ts +79 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +256 -2
- package/dist/router/router.js.map +1 -1
- package/dist/router/types.d.ts +1 -1
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/types.js +1 -0
- package/dist/router/types.js.map +1 -1
- package/dist/single-shot.d.ts.map +1 -1
- package/dist/single-shot.js +26 -1
- package/dist/single-shot.js.map +1 -1
- package/dist/tools/builtin.d.ts +19 -0
- package/dist/tools/builtin.d.ts.map +1 -1
- package/dist/tools/builtin.js +51 -0
- package/dist/tools/builtin.js.map +1 -1
- package/dist/turn-recorder/__tests__/turn-recorder.test.d.ts +20 -0
- package/dist/turn-recorder/__tests__/turn-recorder.test.d.ts.map +1 -0
- package/dist/turn-recorder/__tests__/turn-recorder.test.js +282 -0
- package/dist/turn-recorder/__tests__/turn-recorder.test.js.map +1 -0
- package/dist/turn-recorder/hash.d.ts +10 -0
- package/dist/turn-recorder/hash.d.ts.map +1 -0
- package/dist/turn-recorder/hash.js +35 -0
- package/dist/turn-recorder/hash.js.map +1 -0
- package/dist/turn-recorder/index.d.ts +119 -0
- package/dist/turn-recorder/index.d.ts.map +1 -0
- package/dist/turn-recorder/index.js +326 -0
- package/dist/turn-recorder/index.js.map +1 -0
- package/dist/turn-recorder/types.d.ts +227 -0
- package/dist/turn-recorder/types.d.ts.map +1 -0
- package/dist/turn-recorder/types.js +20 -0
- package/dist/turn-recorder/types.js.map +1 -0
- package/dist/types.d.ts +35 -2
- package/dist/types.d.ts.map +1 -1
- 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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"}
|