@tangle-network/agent-runtime 0.138.0 → 0.139.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/dist/{activation-BHoMDzMv.js → activation-eLJ6uRlP.js} +3 -3
- package/dist/{activation-BHoMDzMv.js.map → activation-eLJ6uRlP.js.map} +1 -1
- package/dist/agent.d.ts +4 -4
- package/dist/agent.js +3 -3
- package/dist/{analyst-loop-Dk6_xfhI.js → analyst-loop-DtOEXGzR.js} +3 -3
- package/dist/{analyst-loop-Dk6_xfhI.js.map → analyst-loop-DtOEXGzR.js.map} +1 -1
- package/dist/analyst-loop.d.ts +1 -1
- package/dist/analyst-loop.js +1 -1
- package/dist/{authoring-rEOOEWn6.js → authoring-J93uFAwd.js} +3 -3
- package/dist/{authoring-rEOOEWn6.js.map → authoring-J93uFAwd.js.map} +1 -1
- package/dist/candidate-execution/index.d.ts +3 -3
- package/dist/candidate-execution/index.js +4 -4
- package/dist/{candidate-execution-CyCLYLfK.js → candidate-execution-uuUeFSc6.js} +5 -5
- package/dist/{candidate-execution-CyCLYLfK.js.map → candidate-execution-uuUeFSc6.js.map} +1 -1
- package/dist/{conversation-DIUtiLkC.js → conversation-C3eZCvLd.js} +8 -6
- package/dist/conversation-C3eZCvLd.js.map +1 -0
- package/dist/conversation.d.ts +1 -1
- package/dist/conversation.js +1 -1
- package/dist/durable.d.ts +34 -1
- package/dist/durable.js +82 -1
- package/dist/durable.js.map +1 -1
- package/dist/{environment-provider-CLNVqp6H.js → environment-provider-BAO8wt1_.js} +147 -48
- package/dist/environment-provider-BAO8wt1_.js.map +1 -0
- package/dist/{environment-provider-DA8LqBV-.d.ts → environment-provider-Bu3S3v78.d.ts} +3 -3
- package/dist/environment-provider.d.ts +1 -1
- package/dist/environment-provider.js +1 -1
- package/dist/{errors-CVIDr7GQ.js → errors-CDZ8XsVj.js} +34 -9
- package/dist/errors-CDZ8XsVj.js.map +1 -0
- package/dist/{graph-yaEG0ZiR.js → graph-BbMjq7-x.js} +5 -5
- package/dist/{graph-yaEG0ZiR.js.map → graph-BbMjq7-x.js.map} +1 -1
- package/dist/{improvement-cycle-BeVj-EGJ.js → improvement-cycle-D6rhMJR0.js} +67 -66
- package/dist/improvement-cycle-D6rhMJR0.js.map +1 -0
- package/dist/{index-Bdgpx2Dx.d.ts → index-C6yfz0QN.d.ts} +5 -5
- package/dist/{index-BOgzou1U.d.ts → index-COnuT0h7.d.ts} +263 -82
- package/dist/{index-CETQJlqT.d.ts → index-CTz17pH6.d.ts} +11 -11
- package/dist/{index-DQxQgKDs.d.ts → index-DQv7iCeE.d.ts} +6 -6
- package/dist/index.d.ts +85 -15
- package/dist/index.js +109 -18
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +736 -681
- package/dist/intelligence.js +113 -8
- package/dist/intelligence.js.map +1 -1
- package/dist/jsonl-file-DtxhdAkZ.js +57 -0
- package/dist/jsonl-file-DtxhdAkZ.js.map +1 -0
- package/dist/kernel.d.ts +7 -7
- package/dist/kernel.js +12 -12
- package/dist/{knowledge-C1TcOBf6.js → knowledge-CD-_FbJT.js} +7 -7
- package/dist/{knowledge-C1TcOBf6.js.map → knowledge-CD-_FbJT.js.map} +1 -1
- package/dist/knowledge.d.ts +1 -1
- package/dist/knowledge.js +1 -1
- package/dist/{loop-runner-bin-DhUWzpNp.js → loop-runner-bin-BBz_ACfQ.js} +5 -5
- package/dist/{loop-runner-bin-DhUWzpNp.js.map → loop-runner-bin-BBz_ACfQ.js.map} +1 -1
- package/dist/{loop-runner-bin-OH61zEVw.d.ts → loop-runner-bin-DUNxyuaG.d.ts} +3 -3
- package/dist/loop-runner-bin.d.ts +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/{materialization-BP5zspr2.js → materialization-CrdcfWXp.js} +4 -4
- package/dist/{materialization-BP5zspr2.js.map → materialization-CrdcfWXp.js.map} +1 -1
- package/dist/mcp/bin.js +4 -4
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/index.js +8 -8
- package/dist/mcp/memory-bin.js +1 -1
- package/dist/{memory-server-Cdpy7Uu8.js → memory-server-DsKOhzGf.js} +3 -3
- package/dist/{memory-server-Cdpy7Uu8.js.map → memory-server-DsKOhzGf.js.map} +1 -1
- package/dist/{model-policy-UTTc9Z-A.js → model-policy-DgRJIJse.js} +2 -2
- package/dist/{model-policy-UTTc9Z-A.js.map → model-policy-DgRJIJse.js.map} +1 -1
- package/dist/{openai-tools-K38wcStR.js → openai-tools-DIKr72_l.js} +2 -2
- package/dist/{openai-tools-K38wcStR.js.map → openai-tools-DIKr72_l.js.map} +1 -1
- package/dist/{openai-tools-DU3TZvFY.d.ts → openai-tools-yoRRzAUW.d.ts} +2 -2
- package/dist/{prepare-Czki1LBy.js → prepare-DK1qnk7-.js} +3 -3
- package/dist/{prepare-Czki1LBy.js.map → prepare-DK1qnk7-.js.map} +1 -1
- package/dist/primeintellect/index.d.ts +1 -1
- package/dist/profiles.d.ts +1 -1
- package/dist/profiles.js +1 -1
- package/dist/{protected-model-port-DEsTWOFs.d.ts → protected-model-port-B8ssMyUg.d.ts} +7 -7
- package/dist/{protected-model-port-OhS0l_6m.js → protected-model-port-DHeCm_UF.js} +2 -2
- package/dist/{protected-model-port-OhS0l_6m.js.map → protected-model-port-DHeCm_UF.js.map} +1 -1
- package/dist/{redact-BwEdhuVH.d.ts → redact-CLw2B7Qj.d.ts} +9 -9
- package/dist/{researcher-DBfKdnAz.js → researcher-CiSY6Wzb.js} +3 -3
- package/dist/{researcher-DBfKdnAz.js.map → researcher-CiSY6Wzb.js.map} +1 -1
- package/dist/retained-run-binding-Dp2e8xne.js +268 -0
- package/dist/retained-run-binding-Dp2e8xne.js.map +1 -0
- package/dist/{runtime-DhPCNvuH.d.ts → runtime-CVNWEw16.d.ts} +4 -4
- package/dist/{runtime-yCuqlhou.js → runtime-tTA2iCZQ.js} +650 -222
- package/dist/runtime-tTA2iCZQ.js.map +1 -0
- package/dist/{sandbox-events-CA2amHoA.js → sandbox-events-DPmXlcKw.js} +24 -2
- package/dist/sandbox-events-DPmXlcKw.js.map +1 -0
- package/dist/{snapshot-BOIprwBk.js → snapshot-cK9K420n.js} +2 -2
- package/dist/{snapshot-BOIprwBk.js.map → snapshot-cK9K420n.js.map} +1 -1
- package/dist/{spawn-journal-ZKEKel8N.js → spawn-journal-DGXei3xG.js} +5 -58
- package/dist/spawn-journal-DGXei3xG.js.map +1 -0
- package/dist/{stream-agent-turn-Q5ellSUu.js → stream-agent-turn-4kUH8Nnn.js} +77 -34
- package/dist/stream-agent-turn-4kUH8Nnn.js.map +1 -0
- package/dist/{stream-agent-turn-DhPlvHwp.d.ts → stream-agent-turn-RjrKGk6S.d.ts} +5 -8
- package/dist/{structural-rollout-2Z6J5ttt.js → structural-rollout-7LP9Ex0F.js} +9 -9
- package/dist/structural-rollout-7LP9Ex0F.js.map +1 -0
- package/dist/{supervise-to2ynnCG.js → supervise-Cx1QY_hj.js} +10 -9
- package/dist/{supervise-to2ynnCG.js.map → supervise-Cx1QY_hj.js.map} +1 -1
- package/dist/{supervisor-BfJNS2Z3.js → supervisor-BV72aDmP.js} +13 -9
- package/dist/supervisor-BV72aDmP.js.map +1 -0
- package/dist/testing.d.ts +2 -2
- package/dist/testing.js +12 -12
- package/dist/{tool-server-Dh-NcbHr.js → tool-server-DEmLr9YY.js} +2 -2
- package/dist/{tool-server-Dh-NcbHr.js.map → tool-server-DEmLr9YY.js.map} +1 -1
- package/dist/{types-CxU37Uzr.d.ts → types-19ZOddS3.d.ts} +2 -2
- package/dist/{types-BBwGSiAj.d.ts → types-C244Huc9.d.ts} +16 -7
- package/dist/{types-BCkweg3w.d.ts → types-D4arYjUl.d.ts} +6 -6
- package/dist/{workspace-archive-B_JDld25.js → workspace-archive-HYlsPhfm.js} +2 -2
- package/dist/{workspace-archive-B_JDld25.js.map → workspace-archive-HYlsPhfm.js.map} +1 -1
- package/package.json +4 -4
- package/dist/conversation-DIUtiLkC.js.map +0 -1
- package/dist/environment-provider-CLNVqp6H.js.map +0 -1
- package/dist/errors-CVIDr7GQ.js.map +0 -1
- package/dist/improvement-cycle-BeVj-EGJ.js.map +0 -1
- package/dist/runtime-yCuqlhou.js.map +0 -1
- package/dist/sandbox-events-CA2amHoA.js.map +0 -1
- package/dist/spawn-journal-ZKEKel8N.js.map +0 -1
- package/dist/stream-agent-turn-Q5ellSUu.js.map +0 -1
- package/dist/structural-rollout-2Z6J5ttt.js.map +0 -1
- package/dist/supervisor-BfJNS2Z3.js.map +0 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { D as providerMessageText, E as promptOptionsFromAgentTurnInput, T as promptFromAgentTurnInput, d as awaitAbortable } from "./retained-run-binding-Dp2e8xne.js";
|
|
2
|
+
import { m as ValidationError, p as SessionMismatchError, r as BackendTransportError } from "./errors-CDZ8XsVj.js";
|
|
3
|
+
import { a as mapSandboxToolEvent, i as mapSandboxEvent, n as createSandboxToolPartState, t as canonicalStreamEventFromSandboxEvent } from "./sandbox-events-DPmXlcKw.js";
|
|
4
|
+
import { c as profileProviderModel, i as concreteModelId, o as profileBridgeWireModel } from "./model-policy-DgRJIJse.js";
|
|
5
|
+
import { C as unknownExecutionBindingReceipt, T as executableAgentProfileSnapshot, a as authoredProfileDigest, c as knownExecutionBindingReceipt, l as knownMaterializationReceipt, v as runtimeOwnedExecutorExecutionBinding, w as unknownMaterializationReceipt, x as runtimeOwnedPendingExecutorMaterialization, y as runtimeOwnedExecutorMaterialization } from "./materialization-CrdcfWXp.js";
|
|
6
|
+
import { canonicalCandidateDigest, renderInputPartsAsText } from "@tangle-network/agent-interface";
|
|
5
7
|
import { scoreKnowledgeReadiness } from "@tangle-network/agent-eval";
|
|
6
|
-
import { canonicalCandidateDigest } from "@tangle-network/agent-interface";
|
|
7
8
|
//#region src/sessions.ts
|
|
8
9
|
/**
|
|
9
10
|
*
|
|
@@ -126,7 +127,7 @@ function createSandboxPromptBackend(options) {
|
|
|
126
127
|
},
|
|
127
128
|
async *stream(input, context) {
|
|
128
129
|
const box = await options.getBox(input, context);
|
|
129
|
-
const message = input.message ?? input.messages?.at(-1)?.content ?? context.task.intent;
|
|
130
|
+
const message = input.message ?? input.messages?.at(-1)?.content ?? providerMessageText(input.providerOptions) ?? context.task.intent;
|
|
130
131
|
for await (const event of options.streamPrompt(box, message, context)) {
|
|
131
132
|
const mapped = options.mapEvent?.(event, context) ?? mapCommonBackendEvent(event, context);
|
|
132
133
|
if (mapped) yield mapped;
|
|
@@ -285,21 +286,17 @@ function stringValue(value) {
|
|
|
285
286
|
* @stable
|
|
286
287
|
*/
|
|
287
288
|
function turnIntent(input) {
|
|
288
|
-
if (
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if (message?.role === "user" && typeof message.content === "string") return message.content;
|
|
292
|
-
}
|
|
293
|
-
return "structured agent turn";
|
|
289
|
+
if (input.prompt !== void 0) return input.prompt;
|
|
290
|
+
if (input.parts !== void 0) return renderInputPartsAsText(input.parts);
|
|
291
|
+
return providerMessageText(input.providerOptions) ?? "structured agent turn";
|
|
294
292
|
}
|
|
295
293
|
function turnBackendInput(task, input) {
|
|
296
|
-
if (typeof input === "string") return {
|
|
297
|
-
task,
|
|
298
|
-
message: input
|
|
299
|
-
};
|
|
300
294
|
return {
|
|
301
295
|
task,
|
|
302
|
-
|
|
296
|
+
...input.prompt === void 0 ? {} : { message: input.prompt },
|
|
297
|
+
...input.parts === void 0 ? {} : { parts: structuredClone(input.parts) },
|
|
298
|
+
...input.interactions === void 0 ? {} : { interactions: input.interactions },
|
|
299
|
+
...input.providerOptions === void 0 ? {} : { providerOptions: structuredClone(input.providerOptions) }
|
|
303
300
|
};
|
|
304
301
|
}
|
|
305
302
|
function executorEvidence(executor, profile, attemptId) {
|
|
@@ -486,11 +483,12 @@ async function* streamAgentTurnInternal(backend, input, opts) {
|
|
|
486
483
|
});
|
|
487
484
|
executionBinding = unknownExecutionBindingReceipt(materialization, attemptId, "executor-did-not-report");
|
|
488
485
|
}
|
|
489
|
-
|
|
486
|
+
const startedSession = await awaitAbortable(Promise.resolve().then(() => startTurnSession(backend, task, input, deadline.signal, label)), deadline.signal);
|
|
487
|
+
session = startedSession;
|
|
490
488
|
yield {
|
|
491
489
|
type: "backend_start",
|
|
492
490
|
task,
|
|
493
|
-
session,
|
|
491
|
+
session: startedSession,
|
|
494
492
|
backend: executor?.runtime ?? label,
|
|
495
493
|
metadata: {
|
|
496
494
|
...profileDigest ? { identity: {
|
|
@@ -505,15 +503,16 @@ async function* streamAgentTurnInternal(backend, input, opts) {
|
|
|
505
503
|
},
|
|
506
504
|
timestamp: nowIso()
|
|
507
505
|
};
|
|
508
|
-
const inner = backend.kind === "chat" ? driveChatTurn(backend.backend, task,
|
|
506
|
+
const inner = backend.kind === "chat" ? driveChatTurn(backend.backend, task, startedSession, input, deadline.signal, acc) : backend.kind === "executor" ? driveExecutorTurn(executor, task, startedSession, input, deadline.signal, acc, materializedModel(materialization, profile)) : driveBoxTurn(backend.box, input, deadline.signal, backend.agentRunName ?? "agent", acc, {
|
|
509
507
|
...backend.options ? { options: backend.options } : {},
|
|
510
508
|
preserveToolParts: opts.preserveToolParts === true,
|
|
511
509
|
...opts.onRawEvent ? { onRawEvent: opts.onRawEvent } : {}
|
|
512
510
|
});
|
|
513
|
-
for await (const event of inner) {
|
|
511
|
+
for await (const event of abortableValues(inner, deadline.signal)) {
|
|
514
512
|
yield event;
|
|
515
513
|
throwIfAborted(deadline.signal);
|
|
516
514
|
}
|
|
515
|
+
throwIfAborted(deadline.signal);
|
|
517
516
|
if (backend.kind === "executor") {
|
|
518
517
|
({materialization, executionBinding} = executorEvidence(executor, profile, attemptId));
|
|
519
518
|
assertExactExecutorEvidence(materialization, executionBinding);
|
|
@@ -560,7 +559,7 @@ async function* streamAgentTurnInternal(backend, input, opts) {
|
|
|
560
559
|
error
|
|
561
560
|
}, turnProvenance(startedAt, opts.timeoutMs, profileDigest, taskDigest, materialization, executionBinding, correlation));
|
|
562
561
|
} finally {
|
|
563
|
-
await executor
|
|
562
|
+
if (executor) await awaitAbortable(Promise.resolve().then(() => executor.teardown("brutalKill")), deadline.signal).catch(() => void 0);
|
|
564
563
|
deadline.dispose();
|
|
565
564
|
}
|
|
566
565
|
}
|
|
@@ -635,22 +634,32 @@ async function startTurnSession(backend, task, input, signal, label) {
|
|
|
635
634
|
* `result`/`done`/`final` payload over concatenated deltas, because the
|
|
636
635
|
* sandbox `message.part.updated` fallback may carry running accumulations.
|
|
637
636
|
*/
|
|
638
|
-
async function* driveBoxTurn(box,
|
|
637
|
+
async function* driveBoxTurn(box, input, signal, agentRunName, acc, cfg) {
|
|
639
638
|
const callOptions = {
|
|
640
639
|
...cfg.options ?? {},
|
|
641
640
|
signal
|
|
642
641
|
};
|
|
643
|
-
const stream = box.streamPrompt(
|
|
642
|
+
const stream = box.streamPrompt(promptFromAgentTurnInput(input), {
|
|
643
|
+
...callOptions,
|
|
644
|
+
...promptOptionsFromAgentTurnInput(input),
|
|
645
|
+
signal
|
|
646
|
+
});
|
|
644
647
|
const toolParts = cfg.preserveToolParts ? createSandboxToolPartState() : void 0;
|
|
645
|
-
for await (const event of stream) {
|
|
646
|
-
if (cfg.onRawEvent) await cfg.onRawEvent(event);
|
|
648
|
+
for await (const event of abortableValues(stream, signal)) {
|
|
649
|
+
if (cfg.onRawEvent) await awaitAbortable(Promise.resolve().then(() => cfg.onRawEvent(event)), signal);
|
|
647
650
|
const terminalText = terminalTextFromSandboxEvent(event);
|
|
648
651
|
if (terminalText !== void 0) acc.terminalText = terminalText;
|
|
652
|
+
const canonical = canonicalStreamEventFromSandboxEvent(event);
|
|
653
|
+
if (canonical) {
|
|
654
|
+
yield canonical;
|
|
655
|
+
continue;
|
|
656
|
+
}
|
|
649
657
|
if (toolParts) for (const toolEvent of mapSandboxToolEvent(event, toolParts)) yield toolEvent;
|
|
650
658
|
const mapped = mapSandboxEvent(event, { agentRunName });
|
|
651
|
-
if (
|
|
652
|
-
|
|
653
|
-
|
|
659
|
+
if (mapped) {
|
|
660
|
+
foldEvent(mapped, acc, agentRunName);
|
|
661
|
+
yield mapped;
|
|
662
|
+
}
|
|
654
663
|
}
|
|
655
664
|
}
|
|
656
665
|
/** One turn over an in-process backend: its own `stream()` surface, projected
|
|
@@ -663,20 +672,20 @@ async function* driveChatTurn(backend, task, session, input, signal, acc) {
|
|
|
663
672
|
session,
|
|
664
673
|
signal
|
|
665
674
|
};
|
|
666
|
-
for await (const raw of backend.stream(backendInput, context)) {
|
|
675
|
+
for await (const raw of abortableValues(backend.stream(backendInput, context), signal)) {
|
|
667
676
|
const event = normalizeBackendStreamEvent(raw, task, session);
|
|
668
677
|
foldEvent(event, acc);
|
|
669
678
|
yield event;
|
|
670
679
|
}
|
|
671
680
|
}
|
|
672
681
|
async function* driveExecutorTurn(executor, task, session, input, signal, acc, declaredModel) {
|
|
673
|
-
const taskValue =
|
|
682
|
+
const taskValue = executorTaskValue(input);
|
|
674
683
|
const run = executor.execute(taskValue, signal);
|
|
675
684
|
let result;
|
|
676
685
|
if (isAsyncIterable(run)) {
|
|
677
|
-
for await (const _usage of run) throwIfAborted(signal);
|
|
686
|
+
for await (const _usage of abortableValues(run, signal)) throwIfAborted(signal);
|
|
678
687
|
result = executor.resultArtifact();
|
|
679
|
-
} else result = await run;
|
|
688
|
+
} else result = await awaitAbortable(run, signal);
|
|
680
689
|
acc.result = result;
|
|
681
690
|
acc.terminalText = executorResultText(result.out);
|
|
682
691
|
acc.input = result.spent.tokens.input;
|
|
@@ -736,9 +745,43 @@ async function* driveExecutorTurn(executor, task, session, input, signal, acc, d
|
|
|
736
745
|
timestamp: nowIso()
|
|
737
746
|
};
|
|
738
747
|
}
|
|
748
|
+
function executorTaskValue(input) {
|
|
749
|
+
const messages = input.providerOptions?.messages;
|
|
750
|
+
if (Array.isArray(messages)) return { messages: structuredClone(messages) };
|
|
751
|
+
return {
|
|
752
|
+
...input.prompt === void 0 ? {} : { prompt: input.prompt },
|
|
753
|
+
...input.parts === void 0 ? {} : { parts: structuredClone(input.parts) },
|
|
754
|
+
...input.interactions === void 0 ? {} : { interactions: input.interactions }
|
|
755
|
+
};
|
|
756
|
+
}
|
|
739
757
|
function isAsyncIterable(value) {
|
|
740
758
|
return typeof value === "object" && value !== null && Symbol.asyncIterator in value;
|
|
741
759
|
}
|
|
760
|
+
/**
|
|
761
|
+
* Pull one provider iterator under Runtime's deadline.
|
|
762
|
+
*
|
|
763
|
+
* Providers still receive the signal for native cancellation, but correctness
|
|
764
|
+
* does not depend on them observing it. A losing iterator is asked to close;
|
|
765
|
+
* its late rejection is observed and cannot delay the terminal Runtime event.
|
|
766
|
+
*/
|
|
767
|
+
async function* abortableValues(source, signal) {
|
|
768
|
+
const iterator = source[Symbol.asyncIterator]();
|
|
769
|
+
let completed = false;
|
|
770
|
+
try {
|
|
771
|
+
for (;;) {
|
|
772
|
+
const next = await awaitAbortable(Promise.resolve().then(() => iterator.next()), signal);
|
|
773
|
+
if (next.done) {
|
|
774
|
+
completed = true;
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
yield next.value;
|
|
778
|
+
}
|
|
779
|
+
} finally {
|
|
780
|
+
if (!completed) try {
|
|
781
|
+
Promise.resolve(iterator.return?.()).catch(() => void 0);
|
|
782
|
+
} catch {}
|
|
783
|
+
}
|
|
784
|
+
}
|
|
742
785
|
function executorResultText(value) {
|
|
743
786
|
if (typeof value === "string") return value;
|
|
744
787
|
if (!value || typeof value !== "object") return "";
|
|
@@ -916,4 +959,4 @@ function deriveTurnSignal(callerSignal, timeoutMs) {
|
|
|
916
959
|
//#endregion
|
|
917
960
|
export { normalizeBackendStreamEvent as a, nowIso as c, createSandboxPromptBackend as i, startOrResumeRuntimeSession as l, streamAgentTurn as n, InMemoryRuntimeSessionStore as o, createIterableBackend as r, newRuntimeSession as s, collectAgentTurn as t, touchSession as u };
|
|
918
961
|
|
|
919
|
-
//# sourceMappingURL=stream-agent-turn-
|
|
962
|
+
//# sourceMappingURL=stream-agent-turn-4kUH8Nnn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-agent-turn-4kUH8Nnn.js","names":["taskInput"],"sources":["../src/sessions.ts","../src/backends.ts","../src/runtime/stream-agent-turn.ts"],"sourcesContent":["/**\n *\n * Session helpers + an in-memory `RuntimeSessionStore` implementation suitable\n * for tests, scratch processes, and per-request scratch storage in serverless\n * runtimes. Durable stores (D1, postgres, Durable Objects) implement the same\n * interface from `./types`.\n *\n * @stable\n */\n\nimport { SessionMismatchError } from './errors'\nimport type {\n AgentBackendContext,\n AgentBackendInput,\n AgentExecutionBackend,\n RuntimeSession,\n RuntimeSessionStore,\n RuntimeStreamEvent,\n} from './types'\n\n/** @internal */\nexport function newRuntimeSession(\n backend: string,\n requestedId?: string,\n metadata?: Record<string, unknown>,\n): RuntimeSession {\n const now = nowIso()\n return {\n id: requestedId || crypto.randomUUID(),\n backend,\n status: 'active',\n createdAt: now,\n updatedAt: now,\n metadata,\n }\n}\n\n/** @internal */\nexport function touchSession(session: RuntimeSession): RuntimeSession {\n return { ...session, updatedAt: nowIso() }\n}\n\n/** @internal */\nexport function nowIso(): string {\n return new Date().toISOString()\n}\n\ninterface StartOrResumeRuntimeSessionOptions<TInput extends AgentBackendInput> {\n backend: AgentExecutionBackend<TInput>\n input: TInput | (() => TInput)\n /** Smaller input used only when the backend can continue its native session. */\n continuationInput?: TInput | (() => TInput)\n context: Omit<AgentBackendContext, 'session'>\n store?: RuntimeSessionStore\n sessionId?: string\n resume?: boolean\n validateSession?: (session: RuntimeSession) => void\n}\n\ninterface RuntimeSessionCall<TInput extends AgentBackendInput> {\n session: RuntimeSession\n input: TInput\n resumed: boolean\n}\n\n/** Start or resume one backend session and persist its current identity. @internal */\nexport async function startOrResumeRuntimeSession<TInput extends AgentBackendInput>(\n options: StartOrResumeRuntimeSessionOptions<TInput>,\n): Promise<RuntimeSessionCall<TInput>> {\n const existing =\n options.resume && options.sessionId ? await options.store?.get(options.sessionId) : undefined\n if (!existing) {\n const input = resolveSessionInput(options.input)\n const session = options.backend.start\n ? await options.backend.start(input, {\n ...options.context,\n requestedSessionId: options.sessionId,\n })\n : newRuntimeSession(options.backend.kind, options.sessionId)\n assertSessionBackend(session, options.backend.kind)\n options.validateSession?.(session)\n await options.store?.put(session)\n return { session, input, resumed: false }\n }\n\n assertSessionBackend(existing, options.backend.kind)\n const continued = options.backend.resume !== undefined\n const input = resolveSessionInput(\n continued ? (options.continuationInput ?? options.input) : options.input,\n )\n const session = options.backend.resume\n ? await options.backend.resume(existing, input, options.context)\n : touchSession({ ...existing, status: 'active' })\n assertSessionBackend(session, options.backend.kind)\n options.validateSession?.(session)\n await options.store?.put(session)\n return { session, input, resumed: true }\n}\n\nfunction resolveSessionInput<TInput extends AgentBackendInput>(\n input: TInput | (() => TInput),\n): TInput {\n return typeof input === 'function' ? input() : input\n}\n\nfunction assertSessionBackend(session: RuntimeSession, backend: string): void {\n if (session.backend !== backend) throw new SessionMismatchError(session.backend, backend)\n}\n\n/** In-memory `RuntimeSessionStore` for single-process use and tests. @stable */\nexport class InMemoryRuntimeSessionStore implements RuntimeSessionStore {\n private readonly sessions = new Map<string, RuntimeSession>()\n private readonly events = new Map<string, RuntimeStreamEvent[]>()\n\n get(sessionId: string): RuntimeSession | undefined {\n return this.sessions.get(sessionId)\n }\n\n put(session: RuntimeSession): void {\n this.sessions.set(session.id, session)\n }\n\n appendEvent(sessionId: string, event: RuntimeStreamEvent): void {\n const existing = this.events.get(sessionId) ?? []\n existing.push(event)\n this.events.set(sessionId, existing)\n }\n\n listEvents(sessionId: string): RuntimeStreamEvent[] {\n return [...(this.events.get(sessionId) ?? [])]\n }\n}\n","/**\n * Provider-neutral backend adapters for `runAgentTaskStream`.\n *\n * Model inference is deliberately absent. Paid model work enters the Runtime executor with an\n * exact `AgentProfile`; these adapters only normalize a caller-owned iterable or sandbox stream.\n *\n * @stable\n */\n\nimport { providerMessageText } from './runtime/turn-input'\nimport { newRuntimeSession, nowIso, touchSession } from './sessions'\nimport type {\n AgentBackendContext,\n AgentBackendInput,\n AgentExecutionBackend,\n RuntimeSession,\n RuntimeStreamEvent,\n} from './types'\n\n/** Wrap any custom async-iterable stream into a typed `AgentExecutionBackend`. @stable */\nexport function createIterableBackend<TInput extends AgentBackendInput>(options: {\n kind: string\n start?: AgentExecutionBackend<TInput>['start']\n resume?: AgentExecutionBackend<TInput>['resume']\n stream: AgentExecutionBackend<TInput>['stream']\n stop?: AgentExecutionBackend<TInput>['stop']\n}): AgentExecutionBackend<TInput> {\n return options\n}\n\n/** Build an `AgentExecutionBackend` backed by a sandbox/sidecar `streamPrompt` call. @stable */\nexport function createSandboxPromptBackend<\n TBox,\n TInput extends AgentBackendInput = AgentBackendInput,\n>(options: {\n kind?: string\n getBox(input: TInput, context: Omit<AgentBackendContext, 'session'>): Promise<TBox> | TBox\n streamPrompt(box: TBox, message: string, context: AgentBackendContext): AsyncIterable<unknown>\n mapEvent?: (event: unknown, context: AgentBackendContext) => RuntimeStreamEvent | undefined\n getSessionId?: (box: TBox, input: TInput) => string | undefined\n}): AgentExecutionBackend<TInput> {\n const kind = options.kind ?? 'sandbox'\n return {\n kind,\n async start(input, context) {\n const box = await options.getBox(input, context)\n return newRuntimeSession(\n kind,\n options.getSessionId?.(box, input) ?? context.requestedSessionId,\n { resumable: true },\n )\n },\n resume(session) {\n return touchSession({ ...session, status: 'active' })\n },\n async *stream(input, context) {\n const box = await options.getBox(input, context)\n const message =\n input.message ??\n input.messages?.at(-1)?.content ??\n providerMessageText(input.providerOptions) ??\n context.task.intent\n for await (const event of options.streamPrompt(box, message, context)) {\n const mapped = options.mapEvent?.(event, context) ?? mapCommonBackendEvent(event, context)\n if (mapped) yield mapped\n }\n },\n }\n}\n\n/** @internal */\nexport function normalizeBackendStreamEvent(\n event: RuntimeStreamEvent,\n task: AgentBackendContext['task'],\n session: RuntimeSession,\n): RuntimeStreamEvent {\n if (\n 'task' in event &&\n event.task &&\n 'session' in event &&\n event.session &&\n 'timestamp' in event &&\n event.timestamp\n ) {\n return event\n }\n return {\n ...event,\n task: 'task' in event && event.task ? event.task : task,\n session: 'session' in event && event.session ? event.session : session,\n timestamp: 'timestamp' in event && event.timestamp ? event.timestamp : nowIso(),\n } as RuntimeStreamEvent\n}\n\nfunction mapCommonBackendEvent(\n event: unknown,\n context: AgentBackendContext,\n): RuntimeStreamEvent | undefined {\n if (!event || typeof event !== 'object') return undefined\n const record = event as Record<string, unknown>\n const type = String(record.type ?? '')\n const data =\n record.data && typeof record.data === 'object'\n ? (record.data as Record<string, unknown>)\n : record\n if (type === 'message.part.updated' || type === 'text_delta' || type === 'delta') {\n const part = data.part as Record<string, unknown> | undefined\n const partText =\n part !== undefined &&\n typeof part === 'object' &&\n (part.type === 'text' || part.type === undefined)\n ? stringValue(part.text)\n : undefined\n const text =\n stringValue(data.text) ?? stringValue(data.delta) ?? stringValue(record.text) ?? partText\n return text\n ? {\n type: 'text_delta',\n task: context.task,\n session: context.session,\n text,\n timestamp: nowIso(),\n }\n : undefined\n }\n if (type === 'reasoning_delta') {\n const text = stringValue(data.text) ?? stringValue(record.text)\n return text\n ? {\n type: 'reasoning_delta',\n task: context.task,\n session: context.session,\n text,\n timestamp: nowIso(),\n }\n : undefined\n }\n if (type === 'tool_call') {\n return {\n type: 'tool_call',\n task: context.task,\n session: context.session,\n toolName: stringValue(data.name) ?? stringValue(record.toolName) ?? 'tool',\n toolCallId: stringValue(data.id) ?? stringValue(record.toolCallId),\n args: data.args ?? data.input ?? record.args,\n timestamp: nowIso(),\n }\n }\n if (type === 'tool_result') {\n return {\n type: 'tool_result',\n task: context.task,\n session: context.session,\n toolName: stringValue(data.name) ?? stringValue(record.toolName) ?? 'tool',\n toolCallId: stringValue(data.id) ?? stringValue(record.toolCallId),\n result: data.result ?? data.output ?? record.result,\n timestamp: nowIso(),\n }\n }\n if (type === 'artifact') {\n const artifactId =\n stringValue(data.artifactId) ?? stringValue(data.id) ?? stringValue(record.artifactId)\n if (!artifactId) return undefined\n return {\n type: 'artifact',\n task: context.task,\n session: context.session,\n artifactId,\n name: stringValue(data.name) ?? stringValue(record.name),\n mimeType: stringValue(data.mimeType) ?? stringValue(record.mimeType),\n uri: stringValue(data.uri) ?? stringValue(record.uri),\n content: stringValue(data.content) ?? stringValue(data.body) ?? stringValue(record.content),\n metadata:\n data.metadata && typeof data.metadata === 'object'\n ? (data.metadata as Record<string, unknown>)\n : undefined,\n timestamp: nowIso(),\n }\n }\n if (type === 'proposal_created' || type === 'proposal' || type === 'filing') {\n const proposalId =\n stringValue(data.proposalId) ?? stringValue(data.id) ?? stringValue(record.proposalId)\n if (!proposalId) return undefined\n const status = stringValue(data.status) ?? stringValue(record.status)\n return {\n type: 'proposal_created',\n task: context.task,\n session: context.session,\n proposalId,\n title: stringValue(data.title) ?? stringValue(record.title) ?? proposalId,\n status:\n status === 'pending' || status === 'approved' || status === 'rejected' ? status : undefined,\n content: stringValue(data.content) ?? stringValue(data.body) ?? stringValue(record.content),\n timestamp: nowIso(),\n }\n }\n if (type === 'result' || type === 'final') {\n const text = stringValue(data.finalText) ?? stringValue(data.text) ?? stringValue(record.text)\n return text\n ? {\n type: 'text_delta',\n task: context.task,\n session: context.session,\n text,\n timestamp: nowIso(),\n }\n : undefined\n }\n return undefined\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n","/**\n * `streamAgentTurn` — the ONE run-a-turn event-stream contract over every\n * execution substrate: a sandbox box (`SandboxInstance.streamPrompt`), a\n * one-shot Runtime-owned `Executor` (cli-bridge / router / sandbox, via\n * `ExecutorFactory`), and an in-process `AgentExecutionBackend`.\n *\n * One function, one vocabulary: every backend kind yields the existing\n * `RuntimeStreamEvent` union incrementally and ALWAYS terminates with a\n * `final` event whose `text` is the turn's final text and whose\n * `metadata.tokenUsage` / `metadata.costUsd` / `metadata.model` carry the\n * turn's metered usage. `collectAgentTurn` drains a stream into that terminal\n * summary plus the full event list.\n *\n * This is a UNIFICATION seam, not a new stream parser — each kind is a thin\n * adapter over code that already exists and is already hardened:\n * - `box` — `mapSandboxEvent` + `extractLlmCallEvent` (sandbox-events.ts)\n * project the sandbox event stream; its requested profile is\n * explicitly recorded as unverified because the box already exists.\n * - `executor` — Runtime materializes the exact `AgentProfile`, records its\n * identity receipts, drives the executor once, and tears it\n * down after capturing the terminal artifact.\n * - `chat` — the backend's own `stream()` surface, normalized by\n * `normalizeBackendStreamEvent`; its requested profile is likewise\n * unverified because an arbitrary backend cannot attest its setup.\n *\n * Distinct from `openSandboxRun` (box-only, session resume over one persistent\n * artifact, raw `SandboxEvent` deliverables) and from `runAgentTaskStream`\n * (full task lifecycle: knowledge preflight, session store, resume). This is\n * the minimal turn primitive underneath both worlds: prompt in, one normalized\n * event stream out, terminal result+usage guaranteed on every non-thrown path.\n *\n * Stream envelope: `backend_start` → incremental events → (`backend_error` on\n * failure) → `final`. A caller-initiated abort terminates with\n * `final.status: 'aborted'`; an expired `timeoutMs` deadline with\n * `final.status: 'failed'` — so cancellation stays distinguishable from a\n * blown deadline.\n *\n * Mid-stream lifecycle work needs NO extra API: the generator is pull-based,\n * so the producer is suspended between yields and resumes only when the caller\n * pulls again. A consumer can therefore run arbitrary async work between\n * events — sync state on each `tool_result`, decide a no-op retry after\n * draining, run a pre-`done` flush when it receives `final` and BEFORE it\n * forwards its own terminal event downstream. The interleaving is guaranteed\n * (and locked by test): nothing is produced past the event the caller is\n * holding.\n *\n * @stable\n */\n\nimport { scoreKnowledgeReadiness } from '@tangle-network/agent-eval'\nimport {\n type AgentProfile,\n canonicalCandidateDigest,\n renderInputPartsAsText,\n} from '@tangle-network/agent-interface'\nimport type { AgentTurnInput } from '@tangle-network/agent-interface/environment-provider'\nimport type { PromptOptions, SandboxEvent, SandboxInstance } from '@tangle-network/sandbox'\nimport { normalizeBackendStreamEvent } from '../backends'\nimport { BackendTransportError, ValidationError } from '../errors'\nimport { newRuntimeSession, nowIso } from '../sessions'\nimport type {\n AgentBackendInput,\n AgentExecutionBackend,\n AgentTaskSpec,\n AgentTaskStatus,\n BackendErrorDetail,\n RuntimeSession,\n RuntimeStreamEvent,\n} from '../types'\nimport { awaitAbortable } from './retained-run-binding'\nimport {\n canonicalStreamEventFromSandboxEvent,\n createSandboxToolPartState,\n mapSandboxEvent,\n mapSandboxToolEvent,\n} from './sandbox-events'\nimport { executableAgentProfileSnapshot } from './supervise/executable-spec'\nimport {\n authoredProfileDigest,\n knownExecutionBindingReceipt,\n knownMaterializationReceipt,\n runtimeOwnedExecutorExecutionBinding,\n runtimeOwnedExecutorMaterialization,\n runtimeOwnedPendingExecutorMaterialization,\n unknownExecutionBindingReceipt,\n unknownMaterializationReceipt,\n} from './supervise/materialization'\nimport {\n concreteModelId,\n profileBridgeWireModel,\n profileProviderModel,\n} from './supervise/model-policy'\nimport type {\n ExecutionBindingReceipt,\n Executor,\n ExecutorFactory,\n ExecutorResult,\n NodeExecutionIdentity,\n ProfileMaterializationReceipt,\n UsageEvent,\n} from './supervise/types'\nimport {\n promptFromAgentTurnInput,\n promptOptionsFromAgentTurnInput,\n providerMessageText,\n} from './turn-input'\n\n/**\n * The execution substrate one turn runs on — a closed discriminated union over\n * the three stream surfaces the runtime already owns.\n *\n * @stable\n */\nexport type AgentTurnBackend = {\n /** A Runtime-owned executor factory materialized from this exact canonical profile. */\n kind: 'executor'\n factory: ExecutorFactory<unknown>\n /** Exact canonical identity materialized by the executor. */\n profile: AgentProfile\n /** Model label stamped on cost-only `llm_call` events. Default `'agent'`. */\n agentRunName?: string\n}\n\n/** Lower-level observation adapters. They normalize an already-created execution surface but do\n * not bind an AgentProfile to it, so they are deliberately absent from the public kernel export. */\ntype ObservedAgentTurnBackend =\n | {\n /** A live sandbox box: the turn is one `box.streamPrompt(prompt)` call. */\n kind: 'box'\n box: SandboxInstance\n /**\n * Per-turn `PromptOptions` forwarded verbatim to `streamPrompt`\n * (`sessionId`, `turnId`, `model`, `backend` profile, `timeoutMs`, …).\n * The turn's derived abort signal (caller `signal` + `timeoutMs`\n * deadline) is always installed as `signal` — pass cancellation through\n * `StreamAgentTurnOptions`, not here.\n */\n options?: Omit<PromptOptions, 'signal'>\n /** Model label stamped on cost-only `llm_call` events. Default `'agent'`. */\n agentRunName?: string\n }\n | {\n /**\n * A caller-supplied in-process `AgentExecutionBackend`: the turn is one\n * `backend.stream()` call.\n */\n kind: 'chat'\n backend: AgentExecutionBackend\n }\n\nexport type { AgentTurnInput } from '@tangle-network/agent-interface/environment-provider'\n\n/** @stable */\nexport interface StreamAgentTurnOptions {\n /** Caller-initiated cancellation. Terminates the stream with `final.status: 'aborted'`. */\n signal?: AbortSignal\n /**\n * Wall-clock deadline for the whole turn in ms. An expired deadline aborts\n * the backend and terminates the stream with `final.status: 'failed'`\n * (a blown deadline is a turn failure, not a caller cancellation).\n */\n timeoutMs?: number\n /** Stable logical paid-call id, forwarded as the provider idempotency key and retained in evidence. */\n callId?: string\n /** Caller trace tag retained in evidence and forwarded when the transport supports it. */\n correlationId?: string\n /**\n * Opt-in tool-part projection for box and executor backends: sandbox tool\n * parts additionally surface in-stream as\n * `tool_call` / `tool_result` events (`mapSandboxToolEvent`), so a consumer\n * rendering tool activity needs no bespoke sandbox-event parser. Default\n * off — the stream vocabulary existing consumers see is unchanged. No-op\n * for the `chat` kind (its backend emits `RuntimeStreamEvent`s directly,\n * tool events included when the backend produces them).\n */\n preserveToolParts?: boolean\n /**\n * Raw-event tap for box-kind backends: called (and awaited) with every\n * unmapped `SandboxEvent` BEFORE it is projected, so a consumer can read\n * parts the chat-UX projection drops (part ids, step markers, custom\n * backend events) without forking the mapper. Purely observational — it\n * cannot alter the mapped stream. Never called for the `chat` kind, which\n * has no sandbox events.\n */\n onRawEvent?: (event: SandboxEvent) => void | Promise<void>\n}\n\nfunction turnIntent(input: AgentTurnInput): string {\n if (input.prompt !== undefined) return input.prompt\n if (input.parts !== undefined) return renderInputPartsAsText(input.parts)\n return providerMessageText(input.providerOptions) ?? 'structured agent turn'\n}\n\nfunction turnBackendInput(task: AgentTaskSpec, input: AgentTurnInput): AgentBackendInput {\n return {\n task,\n ...(input.prompt === undefined ? {} : { message: input.prompt }),\n ...(input.parts === undefined ? {} : { parts: structuredClone(input.parts) }),\n ...(input.interactions === undefined ? {} : { interactions: input.interactions }),\n ...(input.providerOptions === undefined\n ? {}\n : { providerOptions: structuredClone(input.providerOptions) }),\n }\n}\n\nfunction executorEvidence(\n executor: Executor<unknown>,\n profile: AgentProfile,\n attemptId: string,\n): {\n materialization: ProfileMaterializationReceipt\n executionBinding: ExecutionBindingReceipt\n} {\n const profileDigest = authoredProfileDigest(profile)\n const declaration = runtimeOwnedExecutorMaterialization(executor)\n if (!profileDigest || !declaration) {\n const materialization = unknownMaterializationReceipt({\n ...(profileDigest ? { authoredProfileDigest: profileDigest } : {}),\n runtime: executor.runtime,\n reason: declaration ? 'invalid-executor-report' : 'executor-did-not-report',\n })\n return {\n materialization,\n executionBinding: unknownExecutionBindingReceipt(\n materialization,\n attemptId,\n declaration ? 'invalid-executor-report' : 'executor-did-not-report',\n ),\n }\n }\n try {\n const materialization = knownMaterializationReceipt({\n authoredProfileDigest: profileDigest,\n runtime: executor.runtime,\n declaration,\n })\n const binding = runtimeOwnedExecutorExecutionBinding(executor)\n if (!binding || binding.attemptId !== attemptId) throw new Error('executor attempt id mismatch')\n return {\n materialization,\n executionBinding: knownExecutionBindingReceipt(materialization, binding),\n }\n } catch {\n const materialization = unknownMaterializationReceipt({\n authoredProfileDigest: profileDigest,\n runtime: executor.runtime,\n reason: 'invalid-executor-report',\n })\n return {\n materialization,\n executionBinding: unknownExecutionBindingReceipt(\n materialization,\n attemptId,\n 'invalid-executor-report',\n ),\n }\n }\n}\n\n/** Exact turns require the model-bearing profile to be the sole behavioral authority. Runtime\n * checks the trusted declaration before execution so a seam fallback cannot hide behind the same\n * profile digest. */\nfunction assertExactExecutorDeclaration(executor: Executor<unknown>, profile: AgentProfile): void {\n const profileModel = profileProviderModel(profile)\n if (!profileModel) {\n throw new ValidationError(\n 'streamAgentTurn: exact AgentProfile.model.default must name the concrete model',\n )\n }\n const declaration =\n runtimeOwnedExecutorMaterialization(executor) ??\n runtimeOwnedPendingExecutorMaterialization(executor)?.declaration\n if (!declaration) return\n if (declaration.model.status !== 'known') {\n throw new ValidationError(\n 'streamAgentTurn: exact executor did not materialize a known model identity',\n )\n }\n if (declaration.backend === 'router' || declaration.backend === 'router-tools') {\n const plan = declaration.plan as {\n configuredModel?: unknown\n configuredReasoningEffort?: unknown\n reasoningEffort?: unknown\n }\n if (declaration.model.id !== profileModel) {\n throw new ValidationError(\n 'streamAgentTurn: Router executor model differs from AgentProfile.model.default',\n )\n }\n if (\n plan.configuredModel !== null &&\n plan.configuredModel !== undefined &&\n concreteModelId(String(plan.configuredModel)) !== profileModel\n ) {\n throw new ValidationError(\n 'streamAgentTurn: configured Router model conflicts with AgentProfile.model.default',\n )\n }\n const expectedEffort = profile.model?.reasoningEffort ?? null\n if (\n plan.configuredReasoningEffort !== null &&\n plan.configuredReasoningEffort !== undefined &&\n plan.configuredReasoningEffort !== expectedEffort\n ) {\n throw new ValidationError(\n 'streamAgentTurn: configured Router reasoning conflicts with AgentProfile.model.reasoningEffort',\n )\n }\n if ((plan.reasoningEffort ?? null) !== expectedEffort) {\n throw new ValidationError(\n 'streamAgentTurn: Router reasoning effort must come from AgentProfile.model.reasoningEffort',\n )\n }\n }\n if (declaration.backend === 'bridge' || declaration.backend === 'bridge-worktree') {\n const expectedWireModel = profileBridgeWireModel(profile)\n if (!expectedWireModel || declaration.model.id !== expectedWireModel) {\n throw new ValidationError(\n 'streamAgentTurn: bridge executor model differs from the AgentProfile harness/provider/model wire id',\n )\n }\n const plan = declaration.plan as { configuredModel?: unknown }\n if (\n plan.configuredModel !== null &&\n plan.configuredModel !== undefined &&\n concreteModelId(String(plan.configuredModel)) !== expectedWireModel\n ) {\n throw new ValidationError(\n 'streamAgentTurn: configured bridge model conflicts with the AgentProfile harness/provider/model wire id',\n )\n }\n }\n}\n\nfunction turnProvenance(\n startedAt: number,\n timeoutMs: number | undefined,\n profileDigest: string | undefined,\n taskDigest: string,\n materialization: ProfileMaterializationReceipt | undefined,\n executionBinding: ExecutionBindingReceipt | undefined,\n correlation: Readonly<Record<string, string>>,\n): Record<string, unknown> {\n const endedAt = Date.now()\n return {\n ...(profileDigest\n ? {\n identity: {\n profileDigest,\n taskDigest,\n ...(Object.keys(correlation).length > 0 ? { correlation } : {}),\n },\n }\n : { taskDigest }),\n ...(materialization ? { materialization } : {}),\n ...(executionBinding ? { executionBindings: [executionBinding] } : {}),\n budget: { timeoutMs: timeoutMs ?? null },\n timing: {\n startedAt: new Date(startedAt).toISOString(),\n endedAt: new Date(endedAt).toISOString(),\n durationMs: endedAt - startedAt,\n },\n }\n}\n\n/**\n * Metered usage of one turn, summed over every cost-bearing event the backend\n * emitted. `input`/`output` are token counts and are accompanied by\n * `tokensKnown: false` when the backend did not report them. `costUsd`/`model`\n * are present only when the backend actually reported them.\n *\n * @stable\n */\nexport interface AgentTurnUsage {\n input: number\n output: number\n /** Present when a real turn ran but the provider did not report token usage. */\n tokensKnown?: false\n costUsd?: number\n /** Present when Runtime could not prove the full dollar amount. */\n usdKnown?: false\n /** Separately-labelled local/catalog estimate; never billed spend. */\n estimatedCostUsd?: number\n /** Provider-reported prompt-cache fields; absent fields remain unknown. */\n promptCache?: Readonly<Record<string, number | string>>\n /** Provider-reported reasoning-token subset of output, when available. */\n reasoningTokens?: number\n model?: string\n}\n\n/**\n * A drained turn: the terminal summary plus every event the stream yielded.\n * `status`/`error` mirror the terminal `final` event so a failed or aborted\n * turn stays inspectable without re-scanning `events`.\n *\n * @stable\n */\nexport interface CollectedAgentTurn {\n finalText: string\n /** Exact terminal artifact output from a Runtime-owned executor. */\n output?: unknown\n usage: AgentTurnUsage\n /** Exact underlying transport calls when the Runtime-owned executor reports them. */\n transportAttempts?: number\n toolCalls: Array<{ id?: string; name: string; arguments: string }>\n events: RuntimeStreamEvent[]\n status: AgentTaskStatus\n error?: BackendErrorDetail\n}\n\n/** Mutable per-turn accumulator threaded through the backend adapters. */\ninterface TurnAccumulator {\n /** Concatenated incremental text (`text_delta` events). */\n deltaText: string\n /** Final text read off a terminal `result`/`done`/`final` event, when the\n * backend emitted one. Preferred over `deltaText` for box streams, whose\n * `message.part.updated` fallback carries running accumulations. */\n terminalText?: string\n input: number\n output: number\n costUsd: number\n estimatedCostUsd: number\n sawEstimatedCost: boolean\n promptCache: Record<string, number | string>\n reasoningTokens?: number\n tokensKnown: boolean\n usdKnown: boolean\n sawLlmCall: boolean\n model?: string\n stopReason?: string\n transportAttempts?: number\n result?: ExecutorResult<unknown>\n}\n\n/**\n * Run ONE agent turn on any backend kind and stream its events. Yields the\n * `RuntimeStreamEvent` vocabulary incrementally and always ends with a `final`\n * event carrying the turn's text and usage (`metadata.tokenUsage`,\n * `metadata.costUsd?`, `metadata.model?`) — on success, failure, abort, and\n * timeout alike. The generator never throws; failures surface in-band as\n * `backend_error` + `final` with a typed `error` detail.\n *\n * @stable\n */\nexport async function* streamAgentTurn(\n backend: AgentTurnBackend,\n input: AgentTurnInput,\n opts: StreamAgentTurnOptions = {},\n): AsyncGenerator<RuntimeStreamEvent> {\n assertTurnTimeout(opts.timeoutMs)\n if ((backend as { kind?: unknown }).kind !== 'executor') {\n throw new ValidationError(\n \"streamAgentTurn: exact execution accepts only kind 'executor'; use Runtime-owned creation\",\n )\n }\n yield* streamAgentTurnInternal(backend, input, opts)\n}\n\n/** @internal Normalize a pre-created box/chat stream without asserting an AgentProfile identity. */\nexport async function* streamObservedAgentTurn(\n backend: ObservedAgentTurnBackend,\n input: AgentTurnInput,\n opts: StreamAgentTurnOptions = {},\n): AsyncGenerator<RuntimeStreamEvent> {\n assertTurnTimeout(opts.timeoutMs)\n yield* streamAgentTurnInternal(backend, input, opts)\n}\n\nfunction assertTurnTimeout(timeoutMs: number | undefined): void {\n if (timeoutMs === undefined) return\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 2_147_483_647) {\n throw new ValidationError('streamAgentTurn: timeoutMs must be an integer from 1 to 2147483647')\n }\n}\n\nfunction assertTurnIdentity(value: string | undefined, field: string): void {\n if (value !== undefined && (typeof value !== 'string' || value.trim().length === 0)) {\n throw new ValidationError(`streamAgentTurn: ${field} must be a non-empty string`)\n }\n}\n\nasync function* streamAgentTurnInternal(\n backend: AgentTurnBackend | ObservedAgentTurnBackend,\n input: AgentTurnInput,\n opts: StreamAgentTurnOptions,\n): AsyncGenerator<RuntimeStreamEvent> {\n const label = backend.kind === 'chat' ? backend.backend.kind : backend.kind\n const profile =\n backend.kind === 'executor'\n ? executableAgentProfileSnapshot(backend.profile, 'streamAgentTurn')\n : undefined\n const profileDigest = profile ? authoredProfileDigest(profile) : undefined\n assertTurnIdentity(opts.callId, 'callId')\n assertTurnIdentity(opts.correlationId, 'correlationId')\n const correlation = {\n ...(opts.callId ? { callId: opts.callId } : {}),\n ...(opts.correlationId ? { correlationId: opts.correlationId } : {}),\n }\n const taskInput = input\n const taskDigest = canonicalCandidateDigest(taskInput)\n const task: AgentTaskSpec = {\n id: `turn-${crypto.randomUUID()}`,\n intent: turnIntent(input),\n ...(profileDigest\n ? {\n metadata: {\n identity: {\n profileDigest,\n taskDigest,\n ...(Object.keys(correlation).length > 0 ? { correlation } : {}),\n } satisfies NodeExecutionIdentity,\n },\n }\n : {}),\n }\n const acc: TurnAccumulator = {\n deltaText: '',\n input: 0,\n output: 0,\n costUsd: 0,\n estimatedCostUsd: 0,\n sawEstimatedCost: false,\n promptCache: {},\n tokensKnown: false,\n usdKnown: false,\n sawLlmCall: false,\n }\n const deadline = deriveTurnSignal(opts.signal, opts.timeoutMs ?? 0)\n const startedAt = Date.now()\n\n let session: RuntimeSession | undefined\n let executor: Executor<unknown> | undefined\n let materialization: ProfileMaterializationReceipt | undefined\n let executionBinding: ExecutionBindingReceipt | undefined\n try {\n const nodeId = task.id\n const attemptId = `${nodeId}:attempt:${crypto.randomUUID()}`\n if (backend.kind === 'executor') {\n executor = backend.factory(\n { profile: profile!, harness: null },\n {\n signal: deadline.signal,\n seams: {},\n node: {\n rootId: nodeId,\n parentId: nodeId,\n nodeId,\n attemptId,\n identity: {\n profileDigest: profileDigest!,\n taskDigest,\n ...(Object.keys(correlation).length > 0 ? { correlation } : {}),\n },\n },\n },\n )\n assertExactExecutorDeclaration(executor, profile!)\n const pending = runtimeOwnedPendingExecutorMaterialization(executor)\n if (pending !== undefined) {\n if (pending.runtime !== executor.runtime || pending.binding.attemptId !== attemptId) {\n throw new ValidationError(\n 'streamAgentTurn: pending executor did not bind the kernel-minted attempt',\n )\n }\n if (authoredProfileDigest(pending.declaration.effectiveProfile) !== profileDigest) {\n throw new ValidationError(\n 'streamAgentTurn: pending executor changed the authored AgentProfile before execution',\n )\n }\n materialization = unknownMaterializationReceipt({\n authoredProfileDigest: profileDigest!,\n runtime: executor.runtime,\n reason: 'executor-receipt-pending',\n })\n executionBinding = unknownExecutionBindingReceipt(\n materialization,\n attemptId,\n 'executor-receipt-pending',\n )\n } else {\n ;({ materialization, executionBinding } = executorEvidence(executor, profile!, attemptId))\n assertExactExecutorEvidence(materialization, executionBinding)\n }\n } else {\n materialization = unknownMaterializationReceipt({\n runtime: backend.kind === 'box' ? 'sandbox' : label,\n reason: 'executor-did-not-report',\n })\n executionBinding = unknownExecutionBindingReceipt(\n materialization,\n attemptId,\n 'executor-did-not-report',\n )\n }\n const startedSession = await awaitAbortable(\n Promise.resolve().then(() => startTurnSession(backend, task, input, deadline.signal, label)),\n deadline.signal,\n )\n session = startedSession\n yield {\n type: 'backend_start',\n task,\n session: startedSession,\n backend: executor?.runtime ?? label,\n metadata: {\n ...(profileDigest\n ? {\n identity: {\n profileDigest,\n taskDigest,\n ...(Object.keys(correlation).length > 0 ? { correlation } : {}),\n },\n }\n : { taskDigest }),\n ...(materialization ? { materialization } : {}),\n ...(executionBinding ? { executionBindings: [executionBinding] } : {}),\n budget: { timeoutMs: opts.timeoutMs ?? null },\n timing: { startedAt: new Date(startedAt).toISOString() },\n },\n timestamp: nowIso(),\n }\n\n const inner =\n backend.kind === 'chat'\n ? driveChatTurn(backend.backend, task, startedSession, input, deadline.signal, acc)\n : backend.kind === 'executor'\n ? driveExecutorTurn(\n executor!,\n task,\n startedSession,\n input,\n deadline.signal,\n acc,\n materializedModel(materialization, profile!),\n )\n : driveBoxTurn(\n backend.box,\n input,\n deadline.signal,\n backend.agentRunName ?? 'agent',\n acc,\n {\n ...(backend.options ? { options: backend.options } : {}),\n preserveToolParts: opts.preserveToolParts === true,\n ...(opts.onRawEvent ? { onRawEvent: opts.onRawEvent } : {}),\n },\n )\n for await (const event of abortableValues(inner, deadline.signal)) {\n yield event\n throwIfAborted(deadline.signal)\n }\n // Some providers close their iterator instead of throwing after an abort\n // or deadline. Never turn that silent close into a successful completion.\n throwIfAborted(deadline.signal)\n\n if (backend.kind === 'executor') {\n ;({ materialization, executionBinding } = executorEvidence(executor!, profile!, attemptId))\n assertExactExecutorEvidence(materialization, executionBinding)\n }\n\n yield buildFinalEvent(\n task,\n session,\n acc,\n { status: 'completed', reason: 'turn completed' },\n turnProvenance(\n startedAt,\n opts.timeoutMs,\n profileDigest,\n taskDigest,\n materialization,\n executionBinding,\n correlation,\n ),\n )\n } catch (err) {\n // The turn is over, so a pending receipt cannot still resolve. `backend_start` already\n // carried the pending value, where it was true; the final event must name the terminal\n // outcome instead of a wait that has ended.\n if (\n materialization?.status === 'unknown' &&\n materialization.reason === 'executor-receipt-pending' &&\n executionBinding?.status === 'unknown'\n ) {\n const terminal = unknownMaterializationReceipt({\n ...(materialization.authoredProfileDigest === undefined\n ? {}\n : { authoredProfileDigest: materialization.authoredProfileDigest }),\n runtime: materialization.runtime,\n reason: 'executor-failed-before-receipt',\n })\n executionBinding = unknownExecutionBindingReceipt(\n terminal,\n executionBinding.attemptId,\n 'executor-failed-before-receipt',\n )\n materialization = terminal\n }\n const callerAborted = opts.signal?.aborted === true\n const status: AgentTaskStatus = callerAborted ? 'aborted' : 'failed'\n const message = err instanceof Error ? err.message : String(err)\n const error: BackendErrorDetail =\n err instanceof BackendTransportError\n ? { kind: 'transport', message, status: err.status, body: err.body }\n : { kind: 'backend', message }\n yield {\n type: 'backend_error',\n task,\n ...(session ? { session } : {}),\n backend: label,\n message,\n recoverable: !callerAborted,\n error,\n timestamp: nowIso(),\n }\n yield buildFinalEvent(\n task,\n session,\n acc,\n { status, reason: message, error },\n turnProvenance(\n startedAt,\n opts.timeoutMs,\n profileDigest,\n taskDigest,\n materialization,\n executionBinding,\n correlation,\n ),\n )\n } finally {\n if (executor) {\n await awaitAbortable(\n Promise.resolve().then(() => executor!.teardown('brutalKill')),\n deadline.signal,\n ).catch(() => undefined)\n }\n deadline.dispose()\n }\n}\n\nfunction assertExactExecutorEvidence(\n materialization: ProfileMaterializationReceipt,\n executionBinding: ExecutionBindingReceipt,\n): void {\n if (materialization.status !== 'known' || executionBinding.status !== 'known') {\n throw new ValidationError(\n 'streamAgentTurn: exact profile execution requires terminally validated Runtime materialization and execution binding evidence',\n )\n }\n if (materialization.effectiveProfileDigest !== materialization.authoredProfileDigest) {\n throw new ValidationError(\n 'streamAgentTurn: executor changed the authored AgentProfile; exact turn execution refuses profile overlays',\n )\n }\n}\n\n/**\n * Drain a `streamAgentTurn` stream (or any `RuntimeStreamEvent` stream that\n * honors its terminal contract) into the turn summary plus the full event\n * list. Fail-loud: throws when the stream ends without a terminal `final`\n * event — a stream that violates the contract must not read as an empty turn.\n *\n * @stable\n */\nexport async function collectAgentTurn(\n stream: AsyncIterable<RuntimeStreamEvent>,\n): Promise<CollectedAgentTurn> {\n const events: RuntimeStreamEvent[] = []\n for await (const event of stream) events.push(event)\n const final = events.at(-1)\n if (final?.type !== 'final') {\n throw new Error(\n `collectAgentTurn: stream ended without a terminal 'final' event (last: ${final ? final.type : 'none'})`,\n )\n }\n const metadata = final.metadata ?? {}\n const resultMetadata =\n metadata.result && typeof metadata.result === 'object'\n ? (metadata.result as Record<string, unknown>)\n : undefined\n const tokenUsage =\n metadata.tokenUsage && typeof metadata.tokenUsage === 'object'\n ? (metadata.tokenUsage as Record<string, unknown>)\n : {}\n const usage: AgentTurnUsage = {\n input: finiteNumber(tokenUsage.input) ?? 0,\n output: finiteNumber(tokenUsage.output) ?? 0,\n ...(metadata.tokensKnown === false ? { tokensKnown: false as const } : {}),\n }\n const costUsd = finiteNumber(metadata.costUsd)\n if (costUsd !== undefined) usage.costUsd = costUsd\n if (metadata.usdKnown === false) usage.usdKnown = false\n const estimatedCostUsd = finiteNumber(metadata.estimatedCostUsd)\n if (estimatedCostUsd !== undefined) usage.estimatedCostUsd = estimatedCostUsd\n if (metadata.promptCache && typeof metadata.promptCache === 'object') {\n usage.promptCache = metadata.promptCache as Record<string, number | string>\n }\n const reasoningTokens = finiteNumber(metadata.reasoningTokens)\n if (reasoningTokens !== undefined) usage.reasoningTokens = reasoningTokens\n if (typeof metadata.model === 'string' && metadata.model.length > 0) {\n usage.model = metadata.model\n }\n const transportAttempts = finiteNumber(metadata.transportAttempts)\n const toolCalls = events\n .filter((event) => event.type === 'tool_call')\n .map((event) => ({\n ...(event.toolCallId ? { id: event.toolCallId } : {}),\n name: event.toolName,\n arguments: typeof event.args === 'string' ? event.args : JSON.stringify(event.args ?? {}),\n }))\n return {\n finalText: final.text ?? '',\n ...(resultMetadata && 'output' in resultMetadata ? { output: resultMetadata.output } : {}),\n usage,\n ...(transportAttempts !== undefined ? { transportAttempts } : {}),\n toolCalls,\n events,\n status: final.status,\n ...(final.error ? { error: final.error } : {}),\n }\n}\n\n/** Start the backend's session when it owns one (`chat` kind); mint a local\n * correlation session otherwise. Box/executor turns carry no server session\n * here — resume lives in `openSandboxRun`/`SandboxLineage`, not this primitive. */\nasync function startTurnSession(\n backend: AgentTurnBackend | ObservedAgentTurnBackend,\n task: AgentTaskSpec,\n input: AgentTurnInput,\n signal: AbortSignal,\n label: string,\n): Promise<RuntimeSession> {\n if (backend.kind === 'chat' && backend.backend.start) {\n return backend.backend.start(turnBackendInput(task, input), {\n task,\n knowledge: emptyReadiness(task),\n signal,\n })\n }\n return newRuntimeSession(label)\n}\n\n/** Box-drive configuration derived from the backend kind + turn options. */\ninterface BoxTurnConfig {\n /** Caller `PromptOptions` forwarded to `streamPrompt`; the turn's derived\n * signal is installed over any caller value. */\n options?: Omit<PromptOptions, 'signal'>\n /** Project tool parts to `tool_call`/`tool_result` (see `mapSandboxToolEvent`). */\n preserveToolParts: boolean\n /** Awaited raw-event tap, before projection. */\n onRawEvent?: (event: SandboxEvent) => void | Promise<void>\n}\n\n/**\n * One turn over a box: `box.streamPrompt` projected through the existing\n * `mapSandboxEvent` (text/reasoning deltas +\n * cost-bearing `llm_call`s), plus the opt-in `mapSandboxToolEvent` tool-part\n * projection. Usage accumulates off the mapped `llm_call` events — the same\n * fold `sumSandboxUsage` applies. Final text prefers the terminal\n * `result`/`done`/`final` payload over concatenated deltas, because the\n * sandbox `message.part.updated` fallback may carry running accumulations.\n */\nasync function* driveBoxTurn(\n box: SandboxInstance,\n input: AgentTurnInput,\n signal: AbortSignal,\n agentRunName: string,\n acc: TurnAccumulator,\n cfg: BoxTurnConfig,\n): AsyncGenerator<RuntimeStreamEvent> {\n const callOptions: PromptOptions = { ...(cfg.options ?? {}), signal }\n const stream = box.streamPrompt(promptFromAgentTurnInput(input), {\n ...callOptions,\n ...promptOptionsFromAgentTurnInput(input),\n signal,\n })\n const toolParts = cfg.preserveToolParts ? createSandboxToolPartState() : undefined\n for await (const event of abortableValues(stream, signal)) {\n if (cfg.onRawEvent) {\n await awaitAbortable(\n Promise.resolve().then(() => cfg.onRawEvent!(event)),\n signal,\n )\n }\n const terminalText = terminalTextFromSandboxEvent(event)\n if (terminalText !== undefined) acc.terminalText = terminalText\n const canonical = canonicalStreamEventFromSandboxEvent(event)\n if (canonical) {\n yield canonical\n continue\n }\n\n if (toolParts) {\n for (const toolEvent of mapSandboxToolEvent(event, toolParts)) {\n yield toolEvent\n }\n }\n const mapped = mapSandboxEvent(event, { agentRunName })\n if (mapped) {\n // `mapSandboxEvent` stamps `agentRunName` as the model label when the\n // event carried none — a run label, not a reported model. Exclude it from\n // the terminal usage so `usage.model` is never a fabricated value.\n foldEvent(mapped, acc, agentRunName)\n yield mapped\n }\n\n // Unknown provider events stay available through onRawEvent. Do not copy\n // arbitrary provider payloads into the public stream.\n }\n}\n\n/** One turn over an in-process backend: its own `stream()` surface, projected\n * through the same `normalizeBackendStreamEvent` the task lifecycle applies. */\nasync function* driveChatTurn(\n backend: AgentExecutionBackend,\n task: AgentTaskSpec,\n session: RuntimeSession,\n input: AgentTurnInput,\n signal: AbortSignal,\n acc: TurnAccumulator,\n): AsyncGenerator<RuntimeStreamEvent> {\n const backendInput = turnBackendInput(task, input)\n const context = { task, knowledge: emptyReadiness(task), session, signal }\n for await (const raw of abortableValues(backend.stream(backendInput, context), signal)) {\n const event = normalizeBackendStreamEvent(raw, task, session)\n foldEvent(event, acc)\n yield event\n }\n}\n\nasync function* driveExecutorTurn(\n executor: Executor<unknown>,\n task: AgentTaskSpec,\n session: RuntimeSession,\n input: AgentTurnInput,\n signal: AbortSignal,\n acc: TurnAccumulator,\n declaredModel: string | undefined,\n): AsyncGenerator<RuntimeStreamEvent> {\n const taskValue = executorTaskValue(input)\n const run = executor.execute(taskValue, signal)\n let result: ExecutorResult<unknown>\n if (isAsyncIterable(run)) {\n for await (const _usage of abortableValues(run, signal)) {\n throwIfAborted(signal)\n }\n result = executor.resultArtifact()\n } else {\n result = await awaitAbortable(run, signal)\n }\n acc.result = result\n acc.terminalText = executorResultText(result.out)\n acc.input = result.spent.tokens.input\n acc.output = result.spent.tokens.output\n acc.costUsd = result.spent.usd\n const estimatedCostUsd = executorResultEstimatedCost(result.out)\n if (estimatedCostUsd !== undefined) {\n acc.estimatedCostUsd = estimatedCostUsd\n acc.sawEstimatedCost = true\n }\n Object.assign(acc.promptCache, executorResultPromptCache(result.out))\n acc.reasoningTokens = executorResultReasoningTokens(result.out)\n acc.tokensKnown = result.spent.tokensKnown !== false\n acc.usdKnown = result.spent.usdKnown !== false\n acc.sawLlmCall = true\n\n // Usage model identity is observational: the executor must report what answered. The profile's\n // declared model remains available in materialization evidence, but it is not fabricated into\n // `usage.model` when the provider/transport omitted an actual response model.\n const model = executorResultModel(result.out)\n if (model) acc.model = model\n acc.stopReason = executorResultStopReason(result.out)\n acc.transportAttempts = executorResultTransportAttempts(result.out)\n const latencyMs = result.spent.ms\n yield {\n type: 'llm_call',\n task,\n session,\n model: model ?? declaredModel ?? executor.runtime,\n ...(acc.tokensKnown ? { tokensIn: acc.input, tokensOut: acc.output } : {}),\n ...(acc.usdKnown ? { costUsd: acc.costUsd } : {}),\n ...(acc.tokensKnown ? {} : { tokensKnown: false }),\n ...(acc.usdKnown ? {} : { usdKnown: false }),\n ...(acc.sawEstimatedCost ? { estimatedCostUsd: acc.estimatedCostUsd } : {}),\n ...(Object.keys(acc.promptCache).length > 0 ? { promptCache: acc.promptCache } : {}),\n latencyMs,\n timestamp: nowIso(),\n }\n for (const call of executorResultToolCalls(result.out)) {\n yield {\n type: 'tool_call',\n task,\n session,\n toolName: call.name,\n ...(call.id ? { toolCallId: call.id } : {}),\n args: call.arguments,\n timestamp: nowIso(),\n }\n }\n yield {\n type: 'artifact',\n task,\n session,\n artifactId: result.outRef,\n name: 'agent-turn-result',\n metadata: {\n spend: result.spent,\n ...(result.verdict ? { verdict: result.verdict } : {}),\n },\n timestamp: nowIso(),\n }\n}\n\nfunction executorTaskValue(input: AgentTurnInput): unknown {\n const messages = input.providerOptions?.messages\n if (Array.isArray(messages)) {\n return { messages: structuredClone(messages) }\n }\n return {\n ...(input.prompt === undefined ? {} : { prompt: input.prompt }),\n ...(input.parts === undefined ? {} : { parts: structuredClone(input.parts) }),\n ...(input.interactions === undefined ? {} : { interactions: input.interactions }),\n }\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<UsageEvent> {\n return typeof value === 'object' && value !== null && Symbol.asyncIterator in value\n}\n\n/**\n * Pull one provider iterator under Runtime's deadline.\n *\n * Providers still receive the signal for native cancellation, but correctness\n * does not depend on them observing it. A losing iterator is asked to close;\n * its late rejection is observed and cannot delay the terminal Runtime event.\n */\nasync function* abortableValues<T>(\n source: AsyncIterable<T>,\n signal: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]()\n let completed = false\n try {\n for (;;) {\n const next = await awaitAbortable(\n Promise.resolve().then(() => iterator.next()),\n signal,\n )\n if (next.done) {\n completed = true\n return\n }\n yield next.value\n }\n } finally {\n if (!completed) {\n try {\n void Promise.resolve(iterator.return?.()).catch(() => undefined)\n } catch {\n // The Runtime deadline already owns the observable terminal result.\n }\n }\n }\n}\n\nfunction executorResultText(value: unknown): string {\n if (typeof value === 'string') return value\n if (!value || typeof value !== 'object') return ''\n const content = (value as Record<string, unknown>).content\n return typeof content === 'string' ? content : ''\n}\n\nfunction executorResultModel(value: unknown): string | undefined {\n if (!value || typeof value !== 'object') return undefined\n const model = (value as Record<string, unknown>).model\n return typeof model === 'string' && model.length > 0 ? model : undefined\n}\n\nfunction executorResultStopReason(value: unknown): string | undefined {\n if (!value || typeof value !== 'object') return undefined\n const reason = (value as Record<string, unknown>).finishReason\n return typeof reason === 'string' && reason.length > 0 ? reason : undefined\n}\n\nfunction executorResultTransportAttempts(value: unknown): number | undefined {\n if (!value || typeof value !== 'object') return undefined\n const attempts = (value as Record<string, unknown>).transportAttempts\n return typeof attempts === 'number' && Number.isSafeInteger(attempts) && attempts > 0\n ? attempts\n : undefined\n}\n\nfunction executorResultEstimatedCost(value: unknown): number | undefined {\n if (!value || typeof value !== 'object') return undefined\n return finiteNumber((value as Record<string, unknown>).estimatedCostUsd)\n}\n\nfunction executorResultPromptCache(value: unknown): Record<string, number | string> {\n if (!value || typeof value !== 'object') return {}\n const raw = (value as Record<string, unknown>).promptCache\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {}\n const cache: Record<string, number | string> = {}\n for (const [key, entry] of Object.entries(raw)) {\n if ((typeof entry === 'number' && Number.isFinite(entry)) || typeof entry === 'string') {\n cache[key] = entry\n }\n }\n return cache\n}\n\nfunction executorResultReasoningTokens(value: unknown): number | undefined {\n if (!value || typeof value !== 'object') return undefined\n const count = (value as Record<string, unknown>).reasoningTokens\n return Number.isSafeInteger(count) && (count as number) >= 0 ? (count as number) : undefined\n}\n\nfunction executorResultToolCalls(\n value: unknown,\n): Array<{ id?: string; name: string; arguments: string }> {\n if (!value || typeof value !== 'object') return []\n const raw = (value as Record<string, unknown>).toolCalls\n if (!Array.isArray(raw)) return []\n return raw.flatMap((entry) => {\n if (!entry || typeof entry !== 'object') return []\n const call = entry as Record<string, unknown>\n if (typeof call.name !== 'string') return []\n return [\n {\n ...(typeof call.id === 'string' ? { id: call.id } : {}),\n name: call.name,\n arguments:\n typeof call.arguments === 'string'\n ? call.arguments\n : JSON.stringify(call.arguments ?? {}),\n },\n ]\n })\n}\n\n/** Fold one normalized event into the turn accumulator (text + usage).\n * `fallbackModelLabel` — a mapper-stamped run label to exclude from\n * `usage.model` (it is not a backend-reported model). */\nfunction foldEvent(\n event: RuntimeStreamEvent,\n acc: TurnAccumulator,\n fallbackModelLabel?: string,\n): void {\n if (event.type === 'text_delta') {\n acc.deltaText += event.text\n return\n }\n if (event.type === 'llm_call') {\n const tokensReported =\n event.tokensKnown !== false && event.tokensIn !== undefined && event.tokensOut !== undefined\n const usdReported = event.usdKnown !== false && event.costUsd !== undefined\n if (!acc.sawLlmCall) {\n acc.tokensKnown = tokensReported\n acc.usdKnown = usdReported\n acc.sawLlmCall = true\n } else {\n acc.tokensKnown &&= tokensReported\n acc.usdKnown &&= usdReported\n }\n acc.input += event.tokensIn ?? 0\n acc.output += event.tokensOut ?? 0\n acc.costUsd += event.costUsd ?? 0\n if (event.estimatedCostUsd !== undefined) {\n acc.estimatedCostUsd += event.estimatedCostUsd\n acc.sawEstimatedCost = true\n }\n if (event.promptCache) Object.assign(acc.promptCache, event.promptCache)\n if (event.model && event.model !== fallbackModelLabel) acc.model = event.model\n }\n}\n\n/** Read the final text off a terminal sandbox event, when present. */\nfunction terminalTextFromSandboxEvent(event: SandboxEvent): string | undefined {\n if (!event || typeof event !== 'object') return undefined\n const type = String(event.type ?? '')\n if (type !== 'result' && type !== 'done' && type !== 'final') return undefined\n const data =\n event.data && typeof event.data === 'object'\n ? (event.data as Record<string, unknown>)\n : ({} as Record<string, unknown>)\n for (const key of ['finalText', 'text', 'response', 'content']) {\n const value = data[key]\n if (typeof value === 'string') return value\n }\n return undefined\n}\n\nfunction buildFinalEvent(\n task: AgentTaskSpec,\n session: RuntimeSession | undefined,\n acc: TurnAccumulator,\n outcome: { status: AgentTaskStatus; reason: string; error?: BackendErrorDetail },\n provenance: Record<string, unknown>,\n): RuntimeStreamEvent {\n const finalText = acc.terminalText ?? acc.deltaText\n return {\n type: 'final',\n task,\n ...(session ? { session } : {}),\n status: outcome.status,\n reason: outcome.status === 'completed' ? (acc.stopReason ?? outcome.reason) : outcome.reason,\n ...(finalText ? { text: finalText } : {}),\n metadata: {\n tokenUsage: { input: acc.input, output: acc.output },\n ...(acc.tokensKnown ? {} : { tokensKnown: false }),\n ...(acc.usdKnown ? { costUsd: acc.costUsd } : { usdKnown: false }),\n ...(acc.sawEstimatedCost ? { estimatedCostUsd: acc.estimatedCostUsd } : {}),\n ...(Object.keys(acc.promptCache).length > 0 ? { promptCache: acc.promptCache } : {}),\n ...(acc.reasoningTokens !== undefined ? { reasoningTokens: acc.reasoningTokens } : {}),\n ...(acc.model ? { model: acc.model } : {}),\n ...(acc.stopReason ? { stopReason: acc.stopReason } : {}),\n ...(acc.transportAttempts !== undefined ? { transportAttempts: acc.transportAttempts } : {}),\n ...(acc.result\n ? {\n result: {\n outRef: acc.result.outRef,\n output: acc.result.out,\n ...(acc.result.verdict ? { verdict: acc.result.verdict } : {}),\n spent: acc.result.spent,\n },\n }\n : {}),\n ...provenance,\n },\n ...(outcome.error ? { error: outcome.error } : {}),\n timestamp: nowIso(),\n }\n}\n\nfunction materializedModel(\n receipt: ProfileMaterializationReceipt | undefined,\n profile: AgentProfile,\n): string | undefined {\n if (receipt?.status === 'known' && receipt.model.status === 'known') return receipt.model.id\n const fallback = profile.model?.default\n return typeof fallback === 'string' && fallback.length > 0 ? fallback : undefined\n}\n\n/** Minimal ready-by-construction readiness report for a requirement-free turn. */\nfunction emptyReadiness(task: AgentTaskSpec) {\n return scoreKnowledgeReadiness({ taskId: task.id, requirements: [] })\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return\n throw signal.reason instanceof Error ? signal.reason : new Error(String(signal.reason))\n}\n\n/**\n * Derive the turn's effective abort signal: fires when EITHER the caller's\n * signal aborts OR the `timeoutMs` deadline elapses. `dispose()` clears the\n * timer so a finished turn never leaks a pending timeout. `timeoutMs <= 0`\n * disables the deadline. Node-portable (no `AbortSignal.any`, which needs\n * >=20.3 — the package floor is >=20).\n */\nfunction deriveTurnSignal(\n callerSignal: AbortSignal | undefined,\n timeoutMs: number,\n): { signal: AbortSignal; dispose: () => void } {\n const controller = new AbortController()\n const timer =\n timeoutMs > 0\n ? setTimeout(\n () => controller.abort(new Error(`agent turn timed out after ${timeoutMs}ms`)),\n timeoutMs,\n )\n : undefined\n if (timer && typeof (timer as { unref?: () => void }).unref === 'function') {\n ;(timer as { unref: () => void }).unref()\n }\n const onCallerAbort = () =>\n controller.abort(callerSignal?.reason ?? new Error('agent turn aborted'))\n if (callerSignal) {\n if (callerSignal.aborted) onCallerAbort()\n else callerSignal.addEventListener('abort', onCallerAbort, { once: true })\n }\n return {\n signal: controller.signal,\n dispose: () => {\n if (timer) clearTimeout(timer)\n callerSignal?.removeEventListener('abort', onCallerAbort)\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { J as AgentTaskStatus, Y as BackendErrorDetail,
|
|
2
|
-
import { d as ExecutorFactory } from "./types-
|
|
1
|
+
import { J as AgentTaskStatus, Y as BackendErrorDetail, at as RuntimeStreamEvent } from "./types-C244Huc9.js";
|
|
2
|
+
import { d as ExecutorFactory } from "./types-D4arYjUl.js";
|
|
3
3
|
import { AgentProfile } from "@tangle-network/agent-interface";
|
|
4
4
|
import { PromptOptions, SandboxEvent, SandboxInstance } from "@tangle-network/sandbox";
|
|
5
|
+
import { AgentTurnInput, AgentTurnInput as AgentTurnInput$1 } from "@tangle-network/agent-interface/environment-provider";
|
|
5
6
|
//#region src/runtime/stream-agent-turn.d.ts
|
|
6
7
|
/**
|
|
7
8
|
* The execution substrate one turn runs on — a closed discriminated union over
|
|
@@ -18,10 +19,6 @@ type AgentTurnBackend = {
|
|
|
18
19
|
/** Model label stamped on cost-only `llm_call` events. Default `'agent'`. */
|
|
19
20
|
agentRunName?: string;
|
|
20
21
|
};
|
|
21
|
-
/** One prompt or an exact OpenAI-compatible conversation carried as the turn input. */
|
|
22
|
-
type AgentTurnInput = string | {
|
|
23
|
-
readonly messages: ReadonlyArray<Readonly<Record<string, unknown>>>;
|
|
24
|
-
};
|
|
25
22
|
/** @stable */
|
|
26
23
|
interface StreamAgentTurnOptions {
|
|
27
24
|
/** Caller-initiated cancellation. Terminates the stream with `final.status: 'aborted'`. */
|
|
@@ -124,5 +121,5 @@ declare function streamAgentTurn(backend: AgentTurnBackend, input: AgentTurnInpu
|
|
|
124
121
|
*/
|
|
125
122
|
declare function collectAgentTurn(stream: AsyncIterable<RuntimeStreamEvent>): Promise<CollectedAgentTurn>;
|
|
126
123
|
//#endregion
|
|
127
|
-
export { StreamAgentTurnOptions as a, CollectedAgentTurn as i, AgentTurnInput as n, collectAgentTurn as o, AgentTurnUsage as r, streamAgentTurn as s, AgentTurnBackend as t };
|
|
128
|
-
//# sourceMappingURL=stream-agent-turn-
|
|
124
|
+
export { StreamAgentTurnOptions as a, CollectedAgentTurn as i, AgentTurnInput$1 as n, collectAgentTurn as o, AgentTurnUsage as r, streamAgentTurn as s, AgentTurnBackend as t };
|
|
125
|
+
//# sourceMappingURL=stream-agent-turn-RjrKGk6S.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as streamAgentTurn, t as collectAgentTurn } from "./stream-agent-turn-
|
|
2
|
-
import { i as InMemorySpawnJournal, r as InMemoryResultBlobStore } from "./spawn-journal-
|
|
3
|
-
import { i as concreteModelId, s as profileModelExecutionSettings, t as assertExecutableAgentProfile } from "./model-policy-
|
|
4
|
-
import { T as executableAgentProfileSnapshot } from "./materialization-
|
|
5
|
-
import { I as createExecutor, P as captureReusableExecutorConfig, l as withDriverExecutor, n as createSupervisor, yt as observedModelMatchesDeclared } from "./supervisor-
|
|
6
|
-
import { costForTokenPricing, makeProposalFinding } from "@tangle-network/agent-eval";
|
|
1
|
+
import { n as streamAgentTurn, t as collectAgentTurn } from "./stream-agent-turn-4kUH8Nnn.js";
|
|
2
|
+
import { i as InMemorySpawnJournal, r as InMemoryResultBlobStore } from "./spawn-journal-DGXei3xG.js";
|
|
3
|
+
import { i as concreteModelId, s as profileModelExecutionSettings, t as assertExecutableAgentProfile } from "./model-policy-DgRJIJse.js";
|
|
4
|
+
import { T as executableAgentProfileSnapshot } from "./materialization-CrdcfWXp.js";
|
|
5
|
+
import { I as createExecutor, P as captureReusableExecutorConfig, l as withDriverExecutor, n as createSupervisor, yt as observedModelMatchesDeclared } from "./supervisor-BV72aDmP.js";
|
|
7
6
|
import { agentProfileSchema, canonicalAgentProfileDigest, canonicalCandidateDigest } from "@tangle-network/agent-interface";
|
|
7
|
+
import { costForTokenPricing, makeProposalFinding } from "@tangle-network/agent-eval";
|
|
8
8
|
import { randomBytes } from "node:crypto";
|
|
9
9
|
import { assertProposalFindings } from "@tangle-network/agent-eval/analyst";
|
|
10
10
|
//#region src/improvement/optimizer-prompt.ts
|
|
@@ -189,7 +189,7 @@ async function runBoundProfileChat(binding, req, callOpts) {
|
|
|
189
189
|
kind: "executor",
|
|
190
190
|
profile: turnProfile,
|
|
191
191
|
factory: createExecutor(binding.executor)
|
|
192
|
-
}, { messages: req.messages }, {
|
|
192
|
+
}, { providerOptions: { messages: req.messages } }, {
|
|
193
193
|
...req.timeoutMs !== void 0 ? { timeoutMs: req.timeoutMs } : {},
|
|
194
194
|
...callOpts?.signal ? { signal: callOpts.signal } : {},
|
|
195
195
|
...callOpts?.idempotencyKey ? { callId: callOpts.idempotencyKey } : {},
|
|
@@ -603,7 +603,7 @@ async function runShot(surface, _task, handle, tools, messages, opts, profileOve
|
|
|
603
603
|
executeToolCall: execute,
|
|
604
604
|
...opts.complete ? { complete: opts.complete } : {}
|
|
605
605
|
})
|
|
606
|
-
}, { messages }));
|
|
606
|
+
}, { providerOptions: { messages } }));
|
|
607
607
|
if (turn.status !== "completed") throw new Error(`agentic shot failed: ${turn.error?.message ?? turn.status}`);
|
|
608
608
|
const out = turn.output;
|
|
609
609
|
return {
|
|
@@ -1673,4 +1673,4 @@ function structuralRollout(config = {}) {
|
|
|
1673
1673
|
//#endregion
|
|
1674
1674
|
export { observe as C, optimizerMethod as D, profileOptimizerModelCall as E, strategyAuthorMethod as O, defaultAnalystInstruction as S, profileChatClient as T, depthStrategy as _, defaultStructuralRolloutPolicy as a, sample as b, officialChecksFromMeta as c, selectBestIndex as d, structuralRollout as f, defineStrategy as g, breadthStrategy as h, defaultExtractCandidate as i, resolveEntrySymbol as l, adaptiveRefine as m, compareCheckOutcomes as n, filterAuthoredAsserts as o, visibleCheckScore as p, composeCheckSources as r, modelAuthoredChecks as s, canDisplace as t, sandboxCheckRunner as u, refine as v, renderReport as w, sampleThenRefine as x, runAgentic as y };
|
|
1675
1675
|
|
|
1676
|
-
//# sourceMappingURL=structural-rollout-
|
|
1676
|
+
//# sourceMappingURL=structural-rollout-7LP9Ex0F.js.map
|