@tangle-network/agent-runtime 0.240.0 → 0.247.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-q224yRQK.js → activation-DYqnl8zq.js} +3 -3
- package/dist/{activation-q224yRQK.js.map → activation-DYqnl8zq.js.map} +1 -1
- package/dist/{activation-CtkpoWet.d.ts → activation-DizpINK3.d.ts} +115 -5
- package/dist/agent.d.ts +2 -2
- package/dist/agent.js +2 -2
- package/dist/candidate-execution/index.js +7 -7
- package/dist/candidate-execution/index.js.map +1 -1
- package/dist/{coordination-driver-CMprWr0k.js → coordination-driver-BV4AAUns.js} +35 -14
- package/dist/coordination-driver-BV4AAUns.js.map +1 -0
- package/dist/{delegate-kwBecu_w.js → delegate-DQAzB5Xv.js} +2 -2
- package/dist/{delegate-kwBecu_w.js.map → delegate-DQAzB5Xv.js.map} +1 -1
- package/dist/{durable-file-D24y9zg7.js → durable-file-DWQA4ooo.js} +2 -2
- package/dist/{durable-file-D24y9zg7.js.map → durable-file-DWQA4ooo.js.map} +1 -1
- package/dist/durable.d.ts +2 -2
- package/dist/durable.js +3 -3
- package/dist/{graph-Bke7I2gs.js → graph-DcBmMLIp.js} +3 -3
- package/dist/{graph-Bke7I2gs.js.map → graph-DcBmMLIp.js.map} +1 -1
- package/dist/{improvement-cycle-BpSVwIJw.js → improvement-cycle-B049YmQ8.js} +458 -60
- package/dist/improvement-cycle-B049YmQ8.js.map +1 -0
- package/dist/{index-CbZaoYbD.d.ts → index-DLzlXwr6.d.ts} +14 -9
- package/dist/index.d.ts +11 -8
- package/dist/index.js +27 -17
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +7 -5
- package/dist/intelligence.js +15 -11
- package/dist/intelligence.js.map +1 -1
- package/dist/kernel.d.ts +3 -3
- package/dist/kernel.js +9 -9
- package/dist/{loop-runner-bin-BUkkPt10.d.ts → loop-runner-bin-HbMECmxT.d.ts} +3 -3
- package/dist/{loop-runner-bin-DU8XqsGN.js → loop-runner-bin-iqq1azfy.js} +3 -3
- package/dist/{loop-runner-bin-DU8XqsGN.js.map → loop-runner-bin-iqq1azfy.js.map} +1 -1
- package/dist/loop-runner-bin.d.ts +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/mcp/bin.js +3 -3
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/index.js +4 -4
- package/dist/{openai-tools-BI1ofIfL.d.ts → openai-tools-DvLk_Ddg.d.ts} +2 -2
- package/dist/{prepare-Dc30WRB0.js → prepare-CibQrhfi.js} +28 -28
- package/dist/prepare-CibQrhfi.js.map +1 -0
- package/dist/profiles.d.ts +2 -2
- package/dist/{protected-model-port-D5gDcnrH.js → protected-model-port-Dhdi5mDl.js} +3 -3
- package/dist/{protected-model-port-D5gDcnrH.js.map → protected-model-port-Dhdi5mDl.js.map} +1 -1
- package/dist/{protected-redaction-wGo44k2K.js → protected-redaction-Fn1ETfJ-.js} +6 -6
- package/dist/protected-redaction-Fn1ETfJ-.js.map +1 -0
- package/dist/{provision-supervisor-DoSrqsM7.js → provision-supervisor-BgQx2Avp.js} +5 -5
- package/dist/{provision-supervisor-DoSrqsM7.js.map → provision-supervisor-BgQx2Avp.js.map} +1 -1
- package/dist/{run-layout-hZREkcfu.js → run-layout-hKAJGF4g.js} +7 -2
- package/dist/run-layout-hKAJGF4g.js.map +1 -0
- package/dist/{runtime-CmuAQsWI.js → runtime-HpTXhB3g.js} +16 -13
- package/dist/{runtime-CmuAQsWI.js.map → runtime-HpTXhB3g.js.map} +1 -1
- package/dist/{server-shkdLqls.js → server-OOE7mXrN.js} +3 -3
- package/dist/{server-shkdLqls.js.map → server-OOE7mXrN.js.map} +1 -1
- package/dist/{stream-agent-turn-DayHmtvw.d.ts → stream-agent-turn-CcumM0Bu.d.ts} +2 -2
- package/dist/{structural-rollout-CW67upUV.js → structural-rollout-z1A0okaB.js} +2 -2
- package/dist/{structural-rollout-CW67upUV.js.map → structural-rollout-z1A0okaB.js.map} +1 -1
- package/dist/{substrate-iQOskmQ_.d.ts → substrate-CQ0hfewn.d.ts} +2 -2
- package/dist/{supervise-DzoCYAe-.js → supervise-DZEOpzRw.js} +148 -35
- package/dist/supervise-DZEOpzRw.js.map +1 -0
- package/dist/{supervisor-CFSPj8rx.js → supervisor-BIBWUFUr.js} +325 -150
- package/dist/supervisor-BIBWUFUr.js.map +1 -0
- package/dist/testing.d.ts +2 -2
- package/dist/testing.js +398 -398
- package/dist/{top-app-CMMd8DgR.js → top-app-d-bmwO7O.js} +2 -2
- package/dist/{top-app-CMMd8DgR.js.map → top-app-d-bmwO7O.js.map} +1 -1
- package/dist/tui/bin.js +1 -1
- package/dist/tui/index.d.ts +1 -1
- package/dist/tui/index.js +2 -2
- package/dist/{types-CEma9LKR.d.ts → types-BUhz284C.d.ts} +25 -11
- package/dist/{workspace-archive-CBX0hwL_.js → workspace-archive-DSRT4Tro.js} +8 -8
- package/dist/workspace-archive-DSRT4Tro.js.map +1 -0
- package/package.json +6 -6
- package/dist/coordination-driver-CMprWr0k.js.map +0 -1
- package/dist/improvement-cycle-BpSVwIJw.js.map +0 -1
- package/dist/prepare-Dc30WRB0.js.map +0 -1
- package/dist/protected-redaction-wGo44k2K.js.map +0 -1
- package/dist/run-layout-hZREkcfu.js.map +0 -1
- package/dist/supervise-DzoCYAe-.js.map +0 -1
- package/dist/supervisor-CFSPj8rx.js.map +0 -1
- package/dist/workspace-archive-CBX0hwL_.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c as RetainedInteractiveAdmissionError, d as RetainedRunDispatchBindingError, f as RuntimeRunStateError, i as ConfigError, l as RetainedInteractiveBindingError, m as ValidationError$1, r as BackendTransportError, t as AgentEvalError$1, u as RetainedRunAdmissionError } from "./errors-DodWX-cb.js";
|
|
2
2
|
import { a as concreteProfileModel, c as profileModelExecutionSettings, d as agentHarness, l as profileProviderModel, o as enforceTokenLimits, s as profileBridgeWireModel, t as assertExecutableAgentProfile, u as resolveRouterRetryPolicy } from "./model-policy-BbSCSak0.js";
|
|
3
3
|
import { i as notifyRuntimeHookEvent } from "./runtime-hooks-tXpAarhW.js";
|
|
4
|
-
import { n as assertNoSymlinkDescendant, r as publishExclusiveDurableFile } from "./durable-file-
|
|
4
|
+
import { n as assertNoSymlinkDescendant, r as publishExclusiveDurableFile } from "./durable-file-DWQA4ooo.js";
|
|
5
5
|
import { AGENT_PROFILE_MATERIALIZATION_AXES, AgentEnvironmentCapabilitiesSchema, AgentExactRunControlRefSchema, AgentInteractiveSessionControlClaimAcknowledgementSchema, AgentInteractiveSessionControlClaimSchema, AgentInteractiveSessionPromptAcknowledgementSchema, AgentInteractiveSessionRefSchema, AgentInteractiveSessionStartSchema, AgentInteractiveSessionStatusSchema, AgentInteractiveSessionStopAcknowledgementSchema, AgentNativeContextContinuationResultSchema, AgentRunCancellationAcknowledgementSchema, AgentRunCancellationRequestSchema, AgentTurnInputSchema, AgentTurnResultSchema, CanonicalStreamEventSchema, ContextTransferRequestSchema, InteractionAcknowledgementSchema, InteractionResponseCommandSchema, NativeContextBoundaryProofSchema, NativeContextContinuationRequestSchema, REASONING_EFFORTS, RuntimeEventEnvelopeSchema, TerminalReplayWindowSchema, TerminalSessionRefSchema, WorkspaceRequestSchema, agentInteractiveSessionControlClaimAcknowledgementMatchesRequest, agentInteractiveSessionControlClaimMatchesRef, agentInteractiveSessionPromptAcknowledgementMatchesCommand, agentInteractiveSessionRefMatchesStart, agentInteractiveSessionRunRef, agentInteractiveSessionStatusMatchesRef, agentInteractiveSessionStopAcknowledgementMatchesCommand, agentNativeContextContinuationResultMatchesRequest, agentProfileSchema, agentRunCancellationAcknowledgementMatchesRequest, agentRunCancellationRequestDigest, canonicalAgentProfileDigest, canonicalCandidateDigest, canonicalWorkspaceCwd, exactAgentInteractiveSessionStart, harnessSystemPromptIntents, harnessTypeSchema, nativeContextContinuationTurnDigest, nativeReasoningControl, profileMaterializationAxes, profileMaterializationAxes as profileMaterializationAxes$1, renderInputPartsAsText, sha256DigestSchema, workspaceCwdPathForBase } from "@tangle-network/agent-interface";
|
|
6
6
|
import { estimateCost, isModelPriced, isToolSpan, toolSpansToTraceAnalysisStore } from "@tangle-network/agent-eval";
|
|
7
7
|
import { createAgentRunOutcomeTracker } from "@tangle-network/sandbox/runtime";
|
|
@@ -2797,6 +2797,57 @@ function isAxisSupported(axis, supported) {
|
|
|
2797
2797
|
return supported.has(axis);
|
|
2798
2798
|
}
|
|
2799
2799
|
//#endregion
|
|
2800
|
+
//#region src/runtime/process-tree.ts
|
|
2801
|
+
const processKillGraceMs = 250;
|
|
2802
|
+
const processGroupExitConfirmMs = 1e3;
|
|
2803
|
+
const processGroupExitPollMs = 10;
|
|
2804
|
+
function signalProcessTree(child, signal) {
|
|
2805
|
+
if (process.platform !== "win32" && typeof child.pid === "number") try {
|
|
2806
|
+
process.kill(-child.pid, signal);
|
|
2807
|
+
return;
|
|
2808
|
+
} catch (err) {
|
|
2809
|
+
if (err.code === "ESRCH") return;
|
|
2810
|
+
}
|
|
2811
|
+
try {
|
|
2812
|
+
child.kill(signal);
|
|
2813
|
+
} catch {}
|
|
2814
|
+
}
|
|
2815
|
+
/** Terminate one owned process group and confirm its disappearance; detached sessions are outside it. */
|
|
2816
|
+
async function terminateProcessTreeAndConfirm(child, leaderClosed, context = "runLocalHarness") {
|
|
2817
|
+
signalProcessTree(child, "SIGTERM");
|
|
2818
|
+
if (process.platform === "win32" || typeof child.pid !== "number") {
|
|
2819
|
+
const graceDeadline = Date.now() + processKillGraceMs;
|
|
2820
|
+
while (!leaderClosed() && Date.now() < graceDeadline) await delayUntilNextProcessCheck(graceDeadline);
|
|
2821
|
+
if (!leaderClosed()) signalProcessTree(child, "SIGKILL");
|
|
2822
|
+
return;
|
|
2823
|
+
}
|
|
2824
|
+
const processGroupId = child.pid;
|
|
2825
|
+
if (await waitForProcessGroupExit(processGroupId, Date.now() + processKillGraceMs)) return;
|
|
2826
|
+
signalProcessTree(child, "SIGKILL");
|
|
2827
|
+
if (await waitForProcessGroupExit(processGroupId, Date.now() + processGroupExitConfirmMs)) return;
|
|
2828
|
+
throw new Error(`${context}: process group ${processGroupId} survived SIGKILL`);
|
|
2829
|
+
}
|
|
2830
|
+
async function waitForProcessGroupExit(processGroupId, deadline) {
|
|
2831
|
+
while (processGroupExists(processGroupId)) {
|
|
2832
|
+
if (Date.now() >= deadline) return false;
|
|
2833
|
+
await delayUntilNextProcessCheck(deadline);
|
|
2834
|
+
}
|
|
2835
|
+
return true;
|
|
2836
|
+
}
|
|
2837
|
+
async function delayUntilNextProcessCheck(deadline) {
|
|
2838
|
+
const delayMs = Math.min(processGroupExitPollMs, Math.max(0, deadline - Date.now()));
|
|
2839
|
+
if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
2840
|
+
}
|
|
2841
|
+
function processGroupExists(processGroupId) {
|
|
2842
|
+
try {
|
|
2843
|
+
process.kill(-processGroupId, 0);
|
|
2844
|
+
return true;
|
|
2845
|
+
} catch (err) {
|
|
2846
|
+
if (err.code === "ESRCH") return false;
|
|
2847
|
+
return true;
|
|
2848
|
+
}
|
|
2849
|
+
}
|
|
2850
|
+
//#endregion
|
|
2800
2851
|
//#region src/mcp/codex-diagnostics.ts
|
|
2801
2852
|
/** Thrown when reproducible Codex exits without one valid terminal usage event. */
|
|
2802
2853
|
var CodexExecutionDiagnosticError = class extends Error {
|
|
@@ -3127,9 +3178,6 @@ function harnessProfileModel(harness, profile) {
|
|
|
3127
3178
|
return model;
|
|
3128
3179
|
}
|
|
3129
3180
|
const DEFAULT_MAX_OUTPUT_BYTES = 64 * 1024 * 1024;
|
|
3130
|
-
const processKillGraceMs = 250;
|
|
3131
|
-
const processGroupExitConfirmMs = 1e3;
|
|
3132
|
-
const processGroupExitPollMs = 10;
|
|
3133
3181
|
var RollingByteCapture = class {
|
|
3134
3182
|
maxBytes;
|
|
3135
3183
|
chunks = [];
|
|
@@ -3979,51 +4027,6 @@ function sha256File(path) {
|
|
|
3979
4027
|
stream.on("end", () => resolveDigest(hash.digest("hex")));
|
|
3980
4028
|
});
|
|
3981
4029
|
}
|
|
3982
|
-
function signalProcessTree(child, signal) {
|
|
3983
|
-
if (process.platform !== "win32" && typeof child.pid === "number") try {
|
|
3984
|
-
process.kill(-child.pid, signal);
|
|
3985
|
-
return;
|
|
3986
|
-
} catch (err) {
|
|
3987
|
-
if (err.code === "ESRCH") return;
|
|
3988
|
-
}
|
|
3989
|
-
try {
|
|
3990
|
-
child.kill(signal);
|
|
3991
|
-
} catch {}
|
|
3992
|
-
}
|
|
3993
|
-
async function terminateProcessTreeAndConfirm(child, leaderClosed, context = "runLocalHarness") {
|
|
3994
|
-
signalProcessTree(child, "SIGTERM");
|
|
3995
|
-
if (process.platform === "win32" || typeof child.pid !== "number") {
|
|
3996
|
-
const graceDeadline = Date.now() + processKillGraceMs;
|
|
3997
|
-
while (!leaderClosed() && Date.now() < graceDeadline) await delayUntilNextProcessCheck(graceDeadline);
|
|
3998
|
-
if (!leaderClosed()) signalProcessTree(child, "SIGKILL");
|
|
3999
|
-
return;
|
|
4000
|
-
}
|
|
4001
|
-
const processGroupId = child.pid;
|
|
4002
|
-
if (await waitForProcessGroupExit(processGroupId, Date.now() + processKillGraceMs)) return;
|
|
4003
|
-
signalProcessTree(child, "SIGKILL");
|
|
4004
|
-
if (await waitForProcessGroupExit(processGroupId, Date.now() + processGroupExitConfirmMs)) return;
|
|
4005
|
-
throw new Error(`${context}: process group ${processGroupId} survived SIGKILL`);
|
|
4006
|
-
}
|
|
4007
|
-
async function waitForProcessGroupExit(processGroupId, deadline) {
|
|
4008
|
-
while (processGroupExists(processGroupId)) {
|
|
4009
|
-
if (Date.now() >= deadline) return false;
|
|
4010
|
-
await delayUntilNextProcessCheck(deadline);
|
|
4011
|
-
}
|
|
4012
|
-
return true;
|
|
4013
|
-
}
|
|
4014
|
-
async function delayUntilNextProcessCheck(deadline) {
|
|
4015
|
-
const delayMs = Math.min(processGroupExitPollMs, Math.max(0, deadline - Date.now()));
|
|
4016
|
-
if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
4017
|
-
}
|
|
4018
|
-
function processGroupExists(processGroupId) {
|
|
4019
|
-
try {
|
|
4020
|
-
process.kill(-processGroupId, 0);
|
|
4021
|
-
return true;
|
|
4022
|
-
} catch (err) {
|
|
4023
|
-
if (err.code === "ESRCH") return false;
|
|
4024
|
-
return true;
|
|
4025
|
-
}
|
|
4026
|
-
}
|
|
4027
4030
|
/**
|
|
4028
4031
|
* Parse and validate the one terminal usage event emitted by `codex exec --json`.
|
|
4029
4032
|
*
|
|
@@ -5622,7 +5625,8 @@ const DEFAULT_INTELLIGENCE_BASE = "https://intelligence.tangle.tools";
|
|
|
5622
5625
|
* Ship self-improvement eval-run events to Tangle Intelligence. Unlike the
|
|
5623
5626
|
* best-effort span exporter, this RESOLVES with the ingest verdict (accepted /
|
|
5624
5627
|
* rejected per event) so a consumer's loop can assert its provenance landed.
|
|
5625
|
-
*
|
|
5628
|
+
* Success requires a complete, valid acknowledgement accepting every event.
|
|
5629
|
+
* Throws on a missing key, network failure, or unreadable/inconsistent acknowledgement.
|
|
5626
5630
|
*/
|
|
5627
5631
|
async function exportEvalRuns(events, config) {
|
|
5628
5632
|
if (events.length === 0) return {
|
|
@@ -5632,8 +5636,9 @@ async function exportEvalRuns(events, config) {
|
|
|
5632
5636
|
rejected: []
|
|
5633
5637
|
};
|
|
5634
5638
|
const apiKey = config?.apiKey ?? (typeof process !== "undefined" ? process.env.TANGLE_API_KEY : void 0);
|
|
5635
|
-
if (!apiKey) throw new Error("exportEvalRuns: apiKey required (pass config.apiKey or set TANGLE_API_KEY)");
|
|
5639
|
+
if (!apiKey?.trim()) throw new Error("exportEvalRuns: apiKey required (pass config.apiKey or set TANGLE_API_KEY)");
|
|
5636
5640
|
const url = `${(config?.base ?? (typeof process !== "undefined" ? process.env.TANGLE_INTELLIGENCE_URL : void 0) ?? DEFAULT_INTELLIGENCE_BASE).replace(/\/+$/, "")}/v1/ingest/eval-runs`;
|
|
5641
|
+
const count = events.length;
|
|
5637
5642
|
const res = await fetch(url, {
|
|
5638
5643
|
method: "POST",
|
|
5639
5644
|
headers: {
|
|
@@ -5647,15 +5652,35 @@ async function exportEvalRuns(events, config) {
|
|
|
5647
5652
|
events
|
|
5648
5653
|
})
|
|
5649
5654
|
});
|
|
5650
|
-
|
|
5655
|
+
const invalid = (reason) => {
|
|
5656
|
+
throw new Error(`exportEvalRuns: ${reason} (HTTP ${res.status})`);
|
|
5657
|
+
};
|
|
5658
|
+
let parsed;
|
|
5651
5659
|
try {
|
|
5652
5660
|
parsed = await res.json();
|
|
5653
|
-
} catch {
|
|
5661
|
+
} catch {
|
|
5662
|
+
return invalid("Unreadable eval-runs acknowledgement");
|
|
5663
|
+
}
|
|
5664
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) return invalid("Invalid eval-runs acknowledgement");
|
|
5665
|
+
const { accepted, rejected } = parsed;
|
|
5666
|
+
if (!Number.isSafeInteger(accepted) || accepted < 0 || accepted > count || !Array.isArray(rejected)) return invalid("Invalid eval-runs acknowledgement counts");
|
|
5667
|
+
const indices = /* @__PURE__ */ new Set();
|
|
5668
|
+
const validated = [];
|
|
5669
|
+
for (const item of rejected) {
|
|
5670
|
+
if (item === null || typeof item !== "object" || Array.isArray(item) || !Number.isSafeInteger(item.index) || item.index < 0 || item.index >= count || indices.has(item.index) || typeof item.reason !== "string" || !item.reason.trim()) return invalid("Invalid eval-runs acknowledgement rejection");
|
|
5671
|
+
indices.add(item.index);
|
|
5672
|
+
validated.push({
|
|
5673
|
+
index: item.index,
|
|
5674
|
+
reason: item.reason
|
|
5675
|
+
});
|
|
5676
|
+
}
|
|
5677
|
+
if (accepted + validated.length !== count) return invalid("Incomplete eval-runs acknowledgement");
|
|
5678
|
+
if (!res.ok && accepted !== 0) return invalid("Failed HTTP response claimed accepted eval-runs");
|
|
5654
5679
|
return {
|
|
5655
|
-
ok: res.ok,
|
|
5680
|
+
ok: res.ok && accepted === count && validated.length === 0,
|
|
5656
5681
|
status: res.status,
|
|
5657
|
-
accepted
|
|
5658
|
-
rejected:
|
|
5682
|
+
accepted,
|
|
5683
|
+
rejected: validated
|
|
5659
5684
|
};
|
|
5660
5685
|
}
|
|
5661
5686
|
//#endregion
|
|
@@ -7264,6 +7289,46 @@ async function runAbortable(act, signal, fallback) {
|
|
|
7264
7289
|
});
|
|
7265
7290
|
}
|
|
7266
7291
|
//#endregion
|
|
7292
|
+
//#region src/runtime/supervise/cost-estimate.ts
|
|
7293
|
+
/**
|
|
7294
|
+
* Pricing for work that arrived without a provider receipt.
|
|
7295
|
+
*
|
|
7296
|
+
* A turn whose provider reported no billed dollars used to reach the dollar channel as a
|
|
7297
|
+
* known `$0`, so a run that certainly spent money reported a dollar total of zero. A catalog
|
|
7298
|
+
* price is not a receipt, so what this module produces is always marked, never promoted.
|
|
7299
|
+
*/
|
|
7300
|
+
/**
|
|
7301
|
+
* Price one unit of work that no provider receipt covered.
|
|
7302
|
+
*
|
|
7303
|
+
* The event always carries `usdKnown: false`: a catalog price approximates what a provider
|
|
7304
|
+
* WOULD bill, never measures what it did. The priced amount is repeated in `usdEstimated` so
|
|
7305
|
+
* a consumer can subtract it from `usd` and recover the dollars a provider actually billed.
|
|
7306
|
+
*
|
|
7307
|
+
* A model with no catalog entry yields `usd: 0` with `usdKnown: false` and no `usdEstimated`.
|
|
7308
|
+
* The turn then reads as unknown dollars, which is true, rather than as a free turn.
|
|
7309
|
+
*/
|
|
7310
|
+
function priceUnreceiptedWork(work) {
|
|
7311
|
+
const unknown = {
|
|
7312
|
+
kind: "cost",
|
|
7313
|
+
usd: 0,
|
|
7314
|
+
usdKnown: false,
|
|
7315
|
+
provenance: "uncaptured"
|
|
7316
|
+
};
|
|
7317
|
+
const { inputTokens, outputTokens, model } = work;
|
|
7318
|
+
if (model === void 0 || !isModelPriced(model)) return unknown;
|
|
7319
|
+
if (!Number.isFinite(inputTokens) || !Number.isFinite(outputTokens)) return unknown;
|
|
7320
|
+
if (inputTokens < 0 || outputTokens < 0) return unknown;
|
|
7321
|
+
const usd = estimateCost(inputTokens, outputTokens, model);
|
|
7322
|
+
if (!Number.isFinite(usd) || usd <= 0) return unknown;
|
|
7323
|
+
return {
|
|
7324
|
+
kind: "cost",
|
|
7325
|
+
usd,
|
|
7326
|
+
usdKnown: false,
|
|
7327
|
+
usdEstimated: usd,
|
|
7328
|
+
provenance: "catalog-estimate"
|
|
7329
|
+
};
|
|
7330
|
+
}
|
|
7331
|
+
//#endregion
|
|
7267
7332
|
//#region src/runtime/supervise/retained-executor.ts
|
|
7268
7333
|
/** Scope owns the durable writer; provider executors only publish sanitized admissions. */
|
|
7269
7334
|
const retainedExecutorSeamKey = "runtime.retainedExecutor";
|
|
@@ -8045,17 +8110,19 @@ async function* streamProviderExecutor(args) {
|
|
|
8045
8110
|
let sawCostEstimate = false;
|
|
8046
8111
|
let pendingUnpricedWork = false;
|
|
8047
8112
|
let pendingEstimate;
|
|
8113
|
+
/** The model id a usage receipt reported, when it reported one. Only a catalog can price a run
|
|
8114
|
+
* the provider never billed, and only a model id can address a catalog. */
|
|
8115
|
+
let observedModel;
|
|
8048
8116
|
let usdEstimated = 0;
|
|
8049
8117
|
let usd = 0;
|
|
8050
8118
|
let text = "";
|
|
8051
8119
|
let terminal = false;
|
|
8052
|
-
let explicitFailure = false;
|
|
8053
8120
|
let settled;
|
|
8054
8121
|
let failure;
|
|
8055
8122
|
let failed = false;
|
|
8056
8123
|
try {
|
|
8057
8124
|
const toolParts = createSandboxToolPartState();
|
|
8058
|
-
const
|
|
8125
|
+
const failures = createProviderFailureLedger();
|
|
8059
8126
|
for await (const event of source.events) {
|
|
8060
8127
|
archive.append(event);
|
|
8061
8128
|
text += textFromEnvironmentEvent(event);
|
|
@@ -8069,11 +8136,7 @@ async function* streamProviderExecutor(args) {
|
|
|
8069
8136
|
args.trace.record(step);
|
|
8070
8137
|
}
|
|
8071
8138
|
}
|
|
8072
|
-
|
|
8073
|
-
if (failureEvent) {
|
|
8074
|
-
explicitFailure = true;
|
|
8075
|
-
outcomeTracker.observe(failureEvent);
|
|
8076
|
-
}
|
|
8139
|
+
failures.observe(event, sandboxEvent);
|
|
8077
8140
|
for (const progress of sandboxProgressEvents(sandboxEvent, toolParts)) yield {
|
|
8078
8141
|
kind: "progress",
|
|
8079
8142
|
progress
|
|
@@ -8085,10 +8148,11 @@ async function* streamProviderExecutor(args) {
|
|
|
8085
8148
|
}
|
|
8086
8149
|
yield* creditUsage(usageLedger.settleTurn(args.profile.name ?? "agent"));
|
|
8087
8150
|
if (pendingUnpricedWork) {
|
|
8088
|
-
const
|
|
8151
|
+
const estimated = pendingEstimate ?? (usd === 0 ? catalogPrice() : void 0);
|
|
8152
|
+
const estimate = estimated ?? 0;
|
|
8089
8153
|
sawUnknownCostReceipt = true;
|
|
8090
8154
|
usd += estimate;
|
|
8091
|
-
if (
|
|
8155
|
+
if (estimated !== void 0) {
|
|
8092
8156
|
sawCostEstimate = true;
|
|
8093
8157
|
usdEstimated += estimate;
|
|
8094
8158
|
}
|
|
@@ -8096,18 +8160,19 @@ async function* streamProviderExecutor(args) {
|
|
|
8096
8160
|
kind: "cost",
|
|
8097
8161
|
usd: estimate,
|
|
8098
8162
|
usdKnown: false,
|
|
8099
|
-
...
|
|
8100
|
-
provenance:
|
|
8163
|
+
...estimated === void 0 ? {} : { usdEstimated: estimate },
|
|
8164
|
+
provenance: estimated === void 0 ? "uncaptured" : "catalog-estimate"
|
|
8101
8165
|
};
|
|
8102
8166
|
}
|
|
8103
8167
|
if ((args.options.requireTerminalEvent ?? true) && !terminal) throw new ValidationError(`providerAsExecutor(${args.provider.name}): stream ended without a terminal result/done/status event`);
|
|
8104
8168
|
yield { kind: "iteration" };
|
|
8105
8169
|
const harnessTranscript = await captureHarnessTranscript(environment, args.profile.harness, linked);
|
|
8106
8170
|
args.onHarnessTranscript(harnessTranscript);
|
|
8171
|
+
const outcome = failures.finish();
|
|
8107
8172
|
const result = {
|
|
8108
8173
|
...resultFromEvents(archive.events(), text),
|
|
8109
8174
|
...archive.superseded > 0 ? { supersededPartUpdates: archive.superseded } : {},
|
|
8110
|
-
...
|
|
8175
|
+
...outcome ? { outcome } : {}
|
|
8111
8176
|
};
|
|
8112
8177
|
const spent = {
|
|
8113
8178
|
iterations: 1,
|
|
@@ -8162,8 +8227,33 @@ async function* streamProviderExecutor(args) {
|
|
|
8162
8227
|
}
|
|
8163
8228
|
}
|
|
8164
8229
|
if (failed) throw failure;
|
|
8230
|
+
/**
|
|
8231
|
+
* The catalog price of this execution's whole token total, under the first model id the catalog
|
|
8232
|
+
* knows. Undefined when none prices, so an unpriced model settles with no estimate at all rather
|
|
8233
|
+
* than a zero one — absence says "nothing could be priced", a zero would say "priced at nothing".
|
|
8234
|
+
*
|
|
8235
|
+
* Candidates run most specific first: the id a usage receipt reported, then the turn's own
|
|
8236
|
+
* model, then the profile's. A provider that selected its own default declares no profile model,
|
|
8237
|
+
* so a reported id is then the only one a catalog can match.
|
|
8238
|
+
*/
|
|
8239
|
+
function catalogPrice() {
|
|
8240
|
+
for (const model of [
|
|
8241
|
+
observedModel,
|
|
8242
|
+
turn.model,
|
|
8243
|
+
concreteProfileModel(args.createProfile)
|
|
8244
|
+
]) {
|
|
8245
|
+
if (model === void 0) continue;
|
|
8246
|
+
const priced = priceUnreceiptedWork({
|
|
8247
|
+
inputTokens: tokens.input,
|
|
8248
|
+
outputTokens: tokens.output,
|
|
8249
|
+
model
|
|
8250
|
+
});
|
|
8251
|
+
if (priced.usdKnown === false && priced.usdEstimated !== void 0) return priced.usdEstimated;
|
|
8252
|
+
}
|
|
8253
|
+
}
|
|
8165
8254
|
function* creditUsage(receipt, event) {
|
|
8166
8255
|
if (receipt === void 0) return;
|
|
8256
|
+
if (receipt.model !== (args.profile.name ?? "agent")) observedModel = receipt.model;
|
|
8167
8257
|
const hasTokens = receipt.tokensIn !== void 0 || receipt.tokensOut !== void 0;
|
|
8168
8258
|
if (hasTokens && receipt.tokensIn !== void 0 && receipt.tokensOut !== void 0 && receipt.tokensKnown !== false) sawCompleteTokenReceipt = true;
|
|
8169
8259
|
else if (hasTokens || receipt.tokensKnown === false || receipt.tokensUnknownReason) sawIncompleteTokenReceipt = true;
|
|
@@ -8550,21 +8640,16 @@ function environmentAsSandboxInstance(environment, options) {
|
|
|
8550
8640
|
let text = "";
|
|
8551
8641
|
let usage;
|
|
8552
8642
|
let terminal = false;
|
|
8553
|
-
const
|
|
8554
|
-
let explicitFailure = false;
|
|
8643
|
+
const failures = createProviderFailureLedger();
|
|
8555
8644
|
for await (const event of environment.stream(turnInputFromPrompt(message, promptOptions))) {
|
|
8556
8645
|
events.push(event);
|
|
8557
8646
|
if (isTerminalEnvironmentEvent(event)) terminal = true;
|
|
8558
|
-
|
|
8559
|
-
if (failureEvent) {
|
|
8560
|
-
explicitFailure = true;
|
|
8561
|
-
outcomeTracker.observe(failureEvent);
|
|
8562
|
-
}
|
|
8647
|
+
failures.observe(event, sandboxEventFromEnvironmentEvent(event));
|
|
8563
8648
|
text += textFromEnvironmentEvent(event);
|
|
8564
8649
|
usage = mergeTokenUsage(usage, event.usage);
|
|
8565
8650
|
}
|
|
8566
8651
|
if (options.requireTerminalEvent && !terminal) throw new ValidationError(`providerAsSandboxClient(${environment.provider}): prompt ended without a terminal result/done/status event`);
|
|
8567
|
-
const outcome =
|
|
8652
|
+
const outcome = failures.finish();
|
|
8568
8653
|
return {
|
|
8569
8654
|
response: resultFromEvents(events, text).content,
|
|
8570
8655
|
success: outcome?.success ?? true,
|
|
@@ -8900,6 +8985,79 @@ function providerFailureEvent(event, sandboxEvent) {
|
|
|
8900
8985
|
}
|
|
8901
8986
|
};
|
|
8902
8987
|
}
|
|
8988
|
+
/** The statuses the sandbox outcome tracker itself reads as success, so a frame that would settle
|
|
8989
|
+
* `success: true` there is the same frame that supersedes a transient error here. */
|
|
8990
|
+
const TERMINAL_SUCCESS_STATUSES = /* @__PURE__ */ new Set([
|
|
8991
|
+
"completed",
|
|
8992
|
+
"done",
|
|
8993
|
+
"ok",
|
|
8994
|
+
"success"
|
|
8995
|
+
]);
|
|
8996
|
+
/**
|
|
8997
|
+
* Whether a frame says, explicitly, that the run succeeded: a raw or normalized
|
|
8998
|
+
* `status: completed` (the same form `isTerminalEnvironmentEvent` reads as terminal), or a
|
|
8999
|
+
* terminal `done`/`result` with `success: true` or a success status on the frame, its outcome,
|
|
9000
|
+
* or its nested result. An empty `done` says nothing and supersedes nothing — the stream that
|
|
9001
|
+
* ends `status: failed` then `done: {}` stays failed.
|
|
9002
|
+
*/
|
|
9003
|
+
function providerTerminalSuccess(event, sandboxEvent) {
|
|
9004
|
+
if (event.type === "status" && event.data.status === "completed") return true;
|
|
9005
|
+
if (event.normalized?.type === "status" && event.normalized.status === "completed") return true;
|
|
9006
|
+
if (sandboxEvent.type !== "done" && sandboxEvent.type !== "result") return false;
|
|
9007
|
+
const data = sandboxEvent.data;
|
|
9008
|
+
if (data.success === true) return true;
|
|
9009
|
+
if (data.success === false) return false;
|
|
9010
|
+
const outcome = recordValue(data.outcome);
|
|
9011
|
+
const result = recordValue(data.result);
|
|
9012
|
+
return [
|
|
9013
|
+
data.status,
|
|
9014
|
+
outcome?.type,
|
|
9015
|
+
outcome?.status,
|
|
9016
|
+
result?.status
|
|
9017
|
+
].some((status) => typeof status === "string" && TERMINAL_SUCCESS_STATUSES.has(status));
|
|
9018
|
+
}
|
|
9019
|
+
/**
|
|
9020
|
+
* Holds a stream's failure frames until it ends, so the terminal frame decides the outcome.
|
|
9021
|
+
*
|
|
9022
|
+
* The sandbox outcome tracker latches the first `error` frame as the run's error and settles
|
|
9023
|
+
* `failed` on it whatever the terminal frame says; and until this ledger existed the runtime
|
|
9024
|
+
* only ever showed the tracker its failure frames, so a terminal `success: true` was never in
|
|
9025
|
+
* evidence at all. A transport error that the harness recovered from — a stream break the
|
|
9026
|
+
* sidecar re-attached, a tool backend that failed once — therefore settled the whole child
|
|
9027
|
+
* `down` with the transient error as its reason, and the artifact the child had banked was
|
|
9028
|
+
* discarded. On the 2026-09-20 fleet corpus, 25 children that finished their work settled that
|
|
9029
|
+
* way.
|
|
9030
|
+
*
|
|
9031
|
+
* The rule: `error` frames are forgiven when the stream reports success and carries no verdict;
|
|
9032
|
+
* a failed status or a failed terminal frame is the provider's own verdict on the run, and once
|
|
9033
|
+
* one exists every failure frame is evidence again, in order, so the tracker names the first
|
|
9034
|
+
* `error` as it always did. The existing contracts hold unchanged: `status: failed` then
|
|
9035
|
+
* `done: {}` is failed, and the retained Claude tail `completed → failed → error → done` is
|
|
9036
|
+
* failed with the error frame's message. The forgiven frames stay in the event archive the trace
|
|
9037
|
+
* reads; only the outcome stops claiming them.
|
|
9038
|
+
*/
|
|
9039
|
+
function createProviderFailureLedger() {
|
|
9040
|
+
const failures = [];
|
|
9041
|
+
let verdicts = 0;
|
|
9042
|
+
let succeeded = false;
|
|
9043
|
+
return {
|
|
9044
|
+
observe(event, sandboxEvent) {
|
|
9045
|
+
const failureEvent = providerFailureEvent(event, sandboxEvent);
|
|
9046
|
+
if (failureEvent) {
|
|
9047
|
+
failures.push(failureEvent);
|
|
9048
|
+
if (failureEvent.type !== "error") verdicts += 1;
|
|
9049
|
+
return;
|
|
9050
|
+
}
|
|
9051
|
+
if (providerTerminalSuccess(event, sandboxEvent)) succeeded = true;
|
|
9052
|
+
},
|
|
9053
|
+
finish() {
|
|
9054
|
+
if (failures.length === 0 || verdicts === 0 && succeeded) return void 0;
|
|
9055
|
+
const tracker = createAgentRunOutcomeTracker();
|
|
9056
|
+
for (const frame of failures) tracker.observe(frame);
|
|
9057
|
+
return tracker.finish();
|
|
9058
|
+
}
|
|
9059
|
+
};
|
|
9060
|
+
}
|
|
8903
9061
|
function recordValue(value) {
|
|
8904
9062
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
8905
9063
|
}
|
|
@@ -9654,7 +9812,11 @@ async function runBrainLoop(opts) {
|
|
|
9654
9812
|
for (let turn = 1; maxTurns === 0 || turn <= maxTurns; turn += 1) {
|
|
9655
9813
|
if (opts.hooks?.stopBefore?.(turn)) break;
|
|
9656
9814
|
await opts.hooks?.beforeTurn?.(turn, messages);
|
|
9657
|
-
if (opts.
|
|
9815
|
+
if (opts.hooks?.stopBefore?.(turn)) break;
|
|
9816
|
+
if (opts.compaction) {
|
|
9817
|
+
await maybeCompact(messages, opts.compaction, turn);
|
|
9818
|
+
if (opts.hooks?.stopBefore?.(turn)) break;
|
|
9819
|
+
}
|
|
9658
9820
|
const r = await opts.chat(messages, opts.tools);
|
|
9659
9821
|
completedTurns = turn;
|
|
9660
9822
|
if (r.usage) {
|
|
@@ -13293,46 +13455,6 @@ function providerDispatchFromErrorBody(body) {
|
|
|
13293
13455
|
return error.provider_dispatch === "not_started" ? "not_started" : void 0;
|
|
13294
13456
|
}
|
|
13295
13457
|
//#endregion
|
|
13296
|
-
//#region src/runtime/supervise/cost-estimate.ts
|
|
13297
|
-
/**
|
|
13298
|
-
* Pricing for work that arrived without a provider receipt.
|
|
13299
|
-
*
|
|
13300
|
-
* A turn whose provider reported no billed dollars used to reach the dollar channel as a
|
|
13301
|
-
* known `$0`, so a run that certainly spent money reported a dollar total of zero. A catalog
|
|
13302
|
-
* price is not a receipt, so what this module produces is always marked, never promoted.
|
|
13303
|
-
*/
|
|
13304
|
-
/**
|
|
13305
|
-
* Price one unit of work that no provider receipt covered.
|
|
13306
|
-
*
|
|
13307
|
-
* The event always carries `usdKnown: false`: a catalog price approximates what a provider
|
|
13308
|
-
* WOULD bill, never measures what it did. The priced amount is repeated in `usdEstimated` so
|
|
13309
|
-
* a consumer can subtract it from `usd` and recover the dollars a provider actually billed.
|
|
13310
|
-
*
|
|
13311
|
-
* A model with no catalog entry yields `usd: 0` with `usdKnown: false` and no `usdEstimated`.
|
|
13312
|
-
* The turn then reads as unknown dollars, which is true, rather than as a free turn.
|
|
13313
|
-
*/
|
|
13314
|
-
function priceUnreceiptedWork(work) {
|
|
13315
|
-
const unknown = {
|
|
13316
|
-
kind: "cost",
|
|
13317
|
-
usd: 0,
|
|
13318
|
-
usdKnown: false,
|
|
13319
|
-
provenance: "uncaptured"
|
|
13320
|
-
};
|
|
13321
|
-
const { inputTokens, outputTokens, model } = work;
|
|
13322
|
-
if (model === void 0 || !isModelPriced(model)) return unknown;
|
|
13323
|
-
if (!Number.isFinite(inputTokens) || !Number.isFinite(outputTokens)) return unknown;
|
|
13324
|
-
if (inputTokens < 0 || outputTokens < 0) return unknown;
|
|
13325
|
-
const usd = estimateCost(inputTokens, outputTokens, model);
|
|
13326
|
-
if (!Number.isFinite(usd) || usd <= 0) return unknown;
|
|
13327
|
-
return {
|
|
13328
|
-
kind: "cost",
|
|
13329
|
-
usd,
|
|
13330
|
-
usdKnown: false,
|
|
13331
|
-
usdEstimated: usd,
|
|
13332
|
-
provenance: "catalog-estimate"
|
|
13333
|
-
};
|
|
13334
|
-
}
|
|
13335
|
-
//#endregion
|
|
13336
13458
|
//#region src/runtime/supervise/executor-outcome.ts
|
|
13337
13459
|
const outcomeSchema = AgentTurnResultSchema.pick({
|
|
13338
13460
|
success: true,
|
|
@@ -13352,6 +13474,62 @@ function executorFailure(result) {
|
|
|
13352
13474
|
function executorFailureReason(result) {
|
|
13353
13475
|
return executorFailure(result)?.error;
|
|
13354
13476
|
}
|
|
13477
|
+
/**
|
|
13478
|
+
* The platform's own failure vocabulary: machine codes and lifecycle messages that the sandbox
|
|
13479
|
+
* runtime, the router, or the egress path put in an executor envelope when the platform, not
|
|
13480
|
+
* the agent's work, ended the execution. Each entry names its evidence: the count is how many
|
|
13481
|
+
* down children carried it on the 2026-09-20 fleet corpus (277 down settlements across 691
|
|
13482
|
+
* runs), every one of them stamped `infra: false` by the hard-coded call site this table
|
|
13483
|
+
* replaced. The table is deliberately the platform's fixed strings, not the agent's prose.
|
|
13484
|
+
*/
|
|
13485
|
+
const PLATFORM_FAILURE_CODES = new Set([
|
|
13486
|
+
"QUOTA_EXCEEDED",
|
|
13487
|
+
"provider_quota_exceeded",
|
|
13488
|
+
"buffer.overflow",
|
|
13489
|
+
"TIMEOUT",
|
|
13490
|
+
"ECONNRESET",
|
|
13491
|
+
"ECONNREFUSED",
|
|
13492
|
+
"ETIMEDOUT",
|
|
13493
|
+
"EPIPE",
|
|
13494
|
+
"EADDRINUSE"
|
|
13495
|
+
].map((code) => code.toLowerCase()));
|
|
13496
|
+
const PLATFORM_FAILURE_MESSAGES = [
|
|
13497
|
+
/^terminated$/u,
|
|
13498
|
+
/Execution exceeded its time limit/u,
|
|
13499
|
+
/Execution interrupted: the agent runtime restarted/u,
|
|
13500
|
+
/Platform key[- ]verification/u,
|
|
13501
|
+
/Platform key delegation failed/u,
|
|
13502
|
+
/Bad Gateway/iu,
|
|
13503
|
+
/Cannot connect to API/u,
|
|
13504
|
+
/Failed to connect to Sandbox API/u,
|
|
13505
|
+
/fetch failed/u,
|
|
13506
|
+
/A sandbox lifecycle operation is already in progress/u,
|
|
13507
|
+
/exceeded its string bound/u,
|
|
13508
|
+
/exceeds its JSON bound/u,
|
|
13509
|
+
/No provider served model/u,
|
|
13510
|
+
/Invalid API key/u,
|
|
13511
|
+
/provider_quota_exceeded|QUOTA_EXCEEDED|rate limit/iu,
|
|
13512
|
+
/is at its box cap/u,
|
|
13513
|
+
/could not materialize the seat credential/u,
|
|
13514
|
+
/OpenCode exited while a model step was still in progress/u,
|
|
13515
|
+
/the agent runtime restarted/u
|
|
13516
|
+
];
|
|
13517
|
+
/**
|
|
13518
|
+
* Whether an executor envelope's failure was the platform's, as far as the envelope can say.
|
|
13519
|
+
*
|
|
13520
|
+
* `true` when the code or the message is in the platform's own vocabulary above. `undefined`
|
|
13521
|
+
* otherwise: the harness reported a failure and nothing in the envelope attributes it, so the
|
|
13522
|
+
* settlement carries no `infra` claim at all rather than a false one. This path never answers
|
|
13523
|
+
* `false`, because an executor envelope cannot prove the agent's work was at fault; the throw
|
|
13524
|
+
* path in `scope.ts` still answers `false` for an ordinary thrown result, where the runtime does
|
|
13525
|
+
* know. Until this function existed both envelope sites stamped `infra: false` unconditionally,
|
|
13526
|
+
* and the flag caught 1 of the 78 platform losses it was checked against on the fleet corpus.
|
|
13527
|
+
*/
|
|
13528
|
+
function executorFailureInfra(failure) {
|
|
13529
|
+
const code = failure.errorCode?.toLowerCase();
|
|
13530
|
+
if (code !== void 0 && PLATFORM_FAILURE_CODES.has(code)) return true;
|
|
13531
|
+
return PLATFORM_FAILURE_MESSAGES.some((pattern) => pattern.test(failure.error)) ? true : void 0;
|
|
13532
|
+
}
|
|
13355
13533
|
/** Preserve deterministic result pointers across built-in executors and replay.
|
|
13356
13534
|
* FNV-1a is an identity convention here, not a cryptographic integrity check. */
|
|
13357
13535
|
function contentRef(prefix, value) {
|
|
@@ -16236,7 +16414,7 @@ async function replaySpawnTree(journal, blobs, root) {
|
|
|
16236
16414
|
handle: handleFor(ev.id, "cancelled"),
|
|
16237
16415
|
reason: ev.reason,
|
|
16238
16416
|
...ev.outRef === void 0 ? {} : { outRef: ev.outRef },
|
|
16239
|
-
infra: ev.infra
|
|
16417
|
+
...ev.infra === void 0 ? {} : { infra: ev.infra },
|
|
16240
16418
|
...ev.providerModel === void 0 ? {} : { providerModel: copyProviderModelEvidence(ev.providerModel) },
|
|
16241
16419
|
...budgetViolationOf(ev),
|
|
16242
16420
|
trace: ev.trace ?? {
|
|
@@ -16259,7 +16437,7 @@ async function replaySpawnTree(journal, blobs, root) {
|
|
|
16259
16437
|
handle: handleFor(ev.id, "failed"),
|
|
16260
16438
|
reason: ev.reason ?? ev.verdict?.notes ?? "child down",
|
|
16261
16439
|
...ev.outRef === void 0 ? {} : { outRef: ev.outRef },
|
|
16262
|
-
infra: ev.infra
|
|
16440
|
+
...ev.infra === void 0 ? {} : { infra: ev.infra },
|
|
16263
16441
|
...ev.providerModel === void 0 ? {} : { providerModel: copyProviderModelEvidence(ev.providerModel) },
|
|
16264
16442
|
...budgetViolationOf(ev),
|
|
16265
16443
|
trace,
|
|
@@ -20031,7 +20209,7 @@ function stableText(value, label) {
|
|
|
20031
20209
|
function settlementFields(subject, settlement) {
|
|
20032
20210
|
return {
|
|
20033
20211
|
spent: subject.spent,
|
|
20034
|
-
infra: settlement.infra,
|
|
20212
|
+
...settlement.infra === void 0 ? {} : { infra: settlement.infra },
|
|
20035
20213
|
reason: settlement.reason,
|
|
20036
20214
|
...settlement.retainedPendingCause === void 0 ? {} : { retainedPendingCause: settlement.retainedPendingCause },
|
|
20037
20215
|
...settlement.outRef ? { outRef: settlement.outRef } : {},
|
|
@@ -20093,7 +20271,7 @@ function releasedChildPayload(subject, settlement, settledAt, releasedAt) {
|
|
|
20093
20271
|
releasedAt,
|
|
20094
20272
|
...settlement.outRef === void 0 ? {} : { outRef: settlement.outRef },
|
|
20095
20273
|
reason: settlement.reason,
|
|
20096
|
-
infra: settlement.infra,
|
|
20274
|
+
...settlement.infra === void 0 ? {} : { infra: settlement.infra },
|
|
20097
20275
|
spent: subject.spent,
|
|
20098
20276
|
...settledNodeEvidence(subject, {
|
|
20099
20277
|
...settlement,
|
|
@@ -20121,8 +20299,9 @@ function journaledEnvironmentId(owned) {
|
|
|
20121
20299
|
*
|
|
20122
20300
|
* The gate is fail-closed, every clause required, because the heal cannot re-ask the executor
|
|
20123
20301
|
* to confirm teardown the way the sweep does:
|
|
20124
|
-
* - the latest `reconciled` record carries `settledSeq`, `reason
|
|
20125
|
-
*
|
|
20302
|
+
* - the latest `reconciled` record carries `settledSeq`, `reason` and `trace` (a record written
|
|
20303
|
+
* before those fields existed names no cursor position and is not healed; `infra` is carried
|
|
20304
|
+
* when present and never required, since an unattributable envelope failure has none);
|
|
20126
20305
|
* - at least one receipt sits after that record and every such receipt reads `destroyed: true`
|
|
20127
20306
|
* (an empty set must not close the slot vacuously, and a receipt from an earlier process
|
|
20128
20307
|
* belongs to an earlier settlement);
|
|
@@ -20148,7 +20327,7 @@ async function healReleasedSlots(opts, signal, now) {
|
|
|
20148
20327
|
if (closed.has(spawned.id) || recorded.has(spawned.id)) continue;
|
|
20149
20328
|
const owned = events.filter((event) => event.id === spawned.id);
|
|
20150
20329
|
const floor = owned.reduce((latest, event) => event.kind === "reconciled" && (latest === void 0 || event.seq > latest.seq) ? event : latest, void 0);
|
|
20151
|
-
if (floor?.settledSeq === void 0 || floor.reason === void 0 || floor.
|
|
20330
|
+
if (floor?.settledSeq === void 0 || floor.reason === void 0 || floor.trace === void 0) continue;
|
|
20152
20331
|
const receipts = owned.slice(owned.indexOf(floor) + 1).filter((event) => event.kind === "environment-teardown");
|
|
20153
20332
|
if (receipts.length === 0 || !receipts.every((receipt) => receipt.destroyed)) continue;
|
|
20154
20333
|
const held = journaledEnvironmentId(owned);
|
|
@@ -20164,7 +20343,7 @@ async function healReleasedSlots(opts, signal, now) {
|
|
|
20164
20343
|
const settlement = {
|
|
20165
20344
|
kind: "down",
|
|
20166
20345
|
reason: floor.reason,
|
|
20167
|
-
infra: floor.infra,
|
|
20346
|
+
...floor.infra === void 0 ? {} : { infra: floor.infra },
|
|
20168
20347
|
trace: floor.trace,
|
|
20169
20348
|
...floor.outRef ? { outRef: floor.outRef } : {},
|
|
20170
20349
|
...floor.providerModel ? { providerModel: floor.providerModel } : {},
|
|
@@ -20271,17 +20450,16 @@ async function prepareInterruptedExecutors(opts, events, signal, now, parentId =
|
|
|
20271
20450
|
let seq = reservedCursorFloor(events) + 1;
|
|
20272
20451
|
for (const { result, fault, budgetViolation } of accepted) {
|
|
20273
20452
|
signal.throwIfAborted();
|
|
20274
|
-
const
|
|
20275
|
-
const reason = fault ??
|
|
20453
|
+
const failure = executorFailure(result);
|
|
20454
|
+
const reason = fault ?? failure?.error;
|
|
20455
|
+
const infra = fault !== void 0 ? true : failure === void 0 ? void 0 : executorFailureInfra(failure);
|
|
20276
20456
|
await opts.journal.appendEvent(opts.runId, {
|
|
20277
20457
|
kind: "settled",
|
|
20278
20458
|
id: result.id,
|
|
20279
20459
|
status: reason === void 0 ? "done" : "down",
|
|
20280
20460
|
outRef: result.outRef,
|
|
20281
|
-
...reason === void 0 ? {} : {
|
|
20282
|
-
|
|
20283
|
-
reason
|
|
20284
|
-
},
|
|
20461
|
+
...reason === void 0 ? {} : { reason },
|
|
20462
|
+
...infra === void 0 ? {} : { infra },
|
|
20285
20463
|
spent: result.spent,
|
|
20286
20464
|
...budgetViolation === void 0 ? {} : { budgetViolation },
|
|
20287
20465
|
...result.verdict ? { verdict: result.verdict } : {},
|
|
@@ -22709,7 +22887,7 @@ async function finalizeSettlement(child, settlement, seq, args, now) {
|
|
|
22709
22887
|
status: "down",
|
|
22710
22888
|
...settlement.outRef === void 0 ? {} : { outRef: settlement.outRef },
|
|
22711
22889
|
reason: settlement.reason,
|
|
22712
|
-
infra: settlement.infra,
|
|
22890
|
+
...settlement.infra === void 0 ? {} : { infra: settlement.infra },
|
|
22713
22891
|
...retainedExecution,
|
|
22714
22892
|
spent: child.spent,
|
|
22715
22893
|
...settledNodeEvidence(child, settlement, settledAt)
|
|
@@ -22719,7 +22897,7 @@ async function finalizeSettlement(child, settlement, seq, args, now) {
|
|
|
22719
22897
|
kind: "down",
|
|
22720
22898
|
handle,
|
|
22721
22899
|
reason: settlement.reason,
|
|
22722
|
-
infra: settlement.infra,
|
|
22900
|
+
...settlement.infra === void 0 ? {} : { infra: settlement.infra },
|
|
22723
22901
|
...retainedExecution,
|
|
22724
22902
|
...settlement.outRef === void 0 ? {} : { outRef: settlement.outRef },
|
|
22725
22903
|
...settlement.providerModel ? { providerModel: settlement.providerModel } : {},
|
|
@@ -22802,7 +22980,7 @@ async function finalizeWait(child, settlement, seq, args, now, handle) {
|
|
|
22802
22980
|
kind: "down",
|
|
22803
22981
|
handle,
|
|
22804
22982
|
reason: settlement.reason,
|
|
22805
|
-
infra: settlement.infra,
|
|
22983
|
+
...settlement.infra === void 0 ? {} : { infra: settlement.infra },
|
|
22806
22984
|
trace: settlement.trace,
|
|
22807
22985
|
settledAt,
|
|
22808
22986
|
seq
|
|
@@ -22986,11 +23164,11 @@ async function runChild(live, executor, childAbort, task, opts, pool, ticket, bl
|
|
|
22986
23164
|
return downRecord("aborted before settle", true, trace, ownMetered, runtimeOwnedExecutorProviderEvidence(executor), retainedOutputRef, childHarnessTranscript);
|
|
22987
23165
|
}
|
|
22988
23166
|
const outRef = artifact.outRef;
|
|
22989
|
-
const
|
|
22990
|
-
if (
|
|
23167
|
+
const failure = executorFailure(artifact);
|
|
23168
|
+
if (failure !== void 0) {
|
|
22991
23169
|
await teardownOnce(opts.shutdown ?? 5e3).catch(() => void 0);
|
|
22992
23170
|
return {
|
|
22993
|
-
...downRecord(
|
|
23171
|
+
...downRecord(failure.error, executorFailureInfra(failure), trace, ownMetered, runtimeOwnedExecutorProviderEvidence(executor), void 0, childHarnessTranscript),
|
|
22994
23172
|
outRef
|
|
22995
23173
|
};
|
|
22996
23174
|
}
|
|
@@ -23020,9 +23198,9 @@ async function runChild(live, executor, childAbort, task, opts, pool, ticket, bl
|
|
|
23020
23198
|
const trace = await captureTraceOnce();
|
|
23021
23199
|
await teardownOnce(opts.shutdown ?? 5e3).catch(() => void 0);
|
|
23022
23200
|
const metered = executor.metered?.();
|
|
23023
|
-
const
|
|
23024
|
-
if (
|
|
23025
|
-
...downRecord(
|
|
23201
|
+
const failure = executorFailure(accepted);
|
|
23202
|
+
if (failure !== void 0) return {
|
|
23203
|
+
...downRecord(failure.error, executorFailureInfra(failure), trace, metered, runtimeOwnedExecutorProviderEvidence(executor), void 0, await persistTranscriptOnce()),
|
|
23026
23204
|
outRef: accepted.outRef
|
|
23027
23205
|
};
|
|
23028
23206
|
return {
|
|
@@ -23329,7 +23507,7 @@ function downRecord(reason, infra, trace, metered, providerModel, outRef, harnes
|
|
|
23329
23507
|
return {
|
|
23330
23508
|
kind: "down",
|
|
23331
23509
|
reason,
|
|
23332
|
-
infra,
|
|
23510
|
+
...infra === void 0 ? {} : { infra },
|
|
23333
23511
|
trace,
|
|
23334
23512
|
...harnessTranscript ? { harnessTranscript } : {},
|
|
23335
23513
|
...providerModel ? { providerModel } : {},
|
|
@@ -24583,7 +24761,6 @@ function createSupervisor() {
|
|
|
24583
24761
|
let teardownSeq = 0;
|
|
24584
24762
|
let executionAborted = controller.signal.aborted;
|
|
24585
24763
|
let allChildrenDownAtSettle = false;
|
|
24586
|
-
let downCountAtSettle = 0;
|
|
24587
24764
|
try {
|
|
24588
24765
|
await startScopeRecoveries(openScope);
|
|
24589
24766
|
actOutcome = {
|
|
@@ -24599,7 +24776,6 @@ function createSupervisor() {
|
|
|
24599
24776
|
closeScopeAdmission(openScope);
|
|
24600
24777
|
executionAborted = controller.signal.aborted;
|
|
24601
24778
|
allChildrenDownAtSettle = allSpawnedChildrenDown(runTree(openScope));
|
|
24602
|
-
downCountAtSettle = breaker.downCount();
|
|
24603
24779
|
if (!controller.signal.aborted && rootDeadlineAtMs > 0 && now() >= rootDeadlineAtMs) deadlineExceeded = true;
|
|
24604
24780
|
clearRootDeadline?.();
|
|
24605
24781
|
const settleGraceMs = !controller.signal.aborted ? boundedSettleGrace(opts.childSettleGraceMs, rootDeadlineAtMs, now) : 0;
|
|
@@ -24676,7 +24852,7 @@ function createSupervisor() {
|
|
|
24676
24852
|
...gaps.length > 0 ? { spendGaps: gaps } : {},
|
|
24677
24853
|
fleetYield
|
|
24678
24854
|
};
|
|
24679
|
-
const lifecycle = classifyNoWinner(executionAborted, pool, opts, breaker, deadlineExceeded, allChildrenDownAtSettle
|
|
24855
|
+
const lifecycle = classifyNoWinner(executionAborted, pool, opts, breaker, deadlineExceeded, allChildrenDownAtSettle);
|
|
24680
24856
|
if (controller.signal.reason instanceof RunCancellationReason) {
|
|
24681
24857
|
const cancellation = controller.signal.reason;
|
|
24682
24858
|
return {
|
|
@@ -24702,7 +24878,7 @@ function createSupervisor() {
|
|
|
24702
24878
|
};
|
|
24703
24879
|
return {
|
|
24704
24880
|
...common,
|
|
24705
|
-
reason: "
|
|
24881
|
+
reason: "no-result-selected"
|
|
24706
24882
|
};
|
|
24707
24883
|
}
|
|
24708
24884
|
} finally {
|
|
@@ -24892,17 +25068,16 @@ async function drainCursor(scope) {
|
|
|
24892
25068
|
* the caller decide between the `driver-failed` arm (a rejection was captured) and the residual
|
|
24893
25069
|
* bucket — and it is why `driver-failed` cannot be produced without an `error` to attach.
|
|
24894
25070
|
*/
|
|
24895
|
-
function classifyNoWinner(abortedAtSettle, pool, opts, breaker, deadlineExceeded, allChildrenDownAtSettle
|
|
25071
|
+
function classifyNoWinner(abortedAtSettle, pool, opts, breaker, deadlineExceeded, allChildrenDownAtSettle) {
|
|
24896
25072
|
if (breaker.tripped()) return "all-children-down";
|
|
24897
25073
|
if (deadlineExceeded) return "budget-exhausted";
|
|
24898
25074
|
if (abortedAtSettle) return "aborted";
|
|
24899
25075
|
if (allChildrenDownAtSettle) return "all-children-down";
|
|
24900
25076
|
if (poolExhausted(pool, opts)) return "budget-exhausted";
|
|
24901
|
-
if (downCountAtSettle > 0) return "all-children-down";
|
|
24902
25077
|
}
|
|
24903
25078
|
function allSpawnedChildrenDown(tree) {
|
|
24904
25079
|
const children = tree.nodes.filter((node) => node.id !== tree.root);
|
|
24905
|
-
return children.length > 0 && children.every((node) => node.status === "failed");
|
|
25080
|
+
return children.length > 0 && children.every((node) => node.status === "failed" || node.settlementPending?.kind === "down");
|
|
24906
25081
|
}
|
|
24907
25082
|
function poolExhausted(pool, opts) {
|
|
24908
25083
|
const r = pool.readout();
|
|
@@ -25047,6 +25222,6 @@ function isNonEmptySpend(s) {
|
|
|
25047
25222
|
return s.iterations > 0 || s.tokens.input > 0 || s.tokens.output > 0 || s.usd > 0 || s.ms > 0 || s.tokensKnown === false || s.usdKnown === false || Object.values(s.resources ?? {}).some((resource) => resource.amount > 0 || !resource.known);
|
|
25048
25223
|
}
|
|
25049
25224
|
//#endregion
|
|
25050
|
-
export { startRetainedInteractiveRun as $,
|
|
25225
|
+
export { startRetainedInteractiveRun as $, withBudgetResources as $i, contentAddress as $n, writeAllBytes as $r, isPeerMailEnvelope as $t, validateWaitSpec as A, mapSandboxEvent as Ai, providerAsSandboxClient as An, localHarnessExecutable as Ar, workerTraceAnalysisStore as At, SPAWN_RESOURCE_PATH_MAX_BYTES as B, hasCompleteCacheBreakdown as Bi, linkAbort as Bn, promptControlProfileMaterialization as Br, workerTraceEnv as Bt, restoreScopeOwnerAcceptedExecution as C, readSandboxOutcome as Ci, routerBrain as Cn, runWorktreeHarness as Cr, materializeTreeView as Ct, isWaitOutcome as D, createSandboxUsageLedger as Di, DEFAULT_SANDBOX_IDLE_TIMEOUT_SECONDS as Dn, DEFAULT_LOCAL_HARNESS as Dr, captureWorkerTraceEvidence as Dt, createWaitProbes as E, createSandboxToolPartState as Ei, observedModelMatchesDeclared as En, removeWorktree as Er, WORKER_TOOL_TRACE_SCHEMA_VERSION as Et, prepareScopeRetainedOwnerTask as F, sumSandboxUsage as Fi, sandboxSessionTraceSource as Fn, assertProfileMaterialization as Fr, newUsageTotals as Ft, readWorkerInteractiveAdmissions as G, stringifySafe as Gi, startRetainedRunInEnvironment as Gn, renderUnsupported as Gr, createActivityLog as Gt, hostDirectoryReader as H, promptCacheTokenClasses as Hi, reconnectRetainedRun as Hn, promptOnlyProfileMaterialization as Hr, workerTraceSeamKey as Ht, scopeRetainedOwnerContext as I, addSpend as Ii, registerRetainedExecutorPreparation as In, controlProfileMaterialization as Ir, spendFromUsageEvents as It, readWorkerInteractiveBinding as J, unmeteredSpend as Ji, defaultRedactorIdentityMaterial as Jn, validateProfileMaterialization as Jr, AUTHORITY_MARKERS as Jt, workerInteractiveAdmissionFile as K, throwAbort as Ki, retainedCreateMaterial as Kn, sandboxActProfileMaterialization as Kr, readWorkerProgress as Kt, scopeRetainedOwnerPriorSpend as L, chargedTokens as Li, retainedExecutorSeamKey as Ln, defineProfileMaterializationContract as Lr, spendFromUsageTotals as Lt, bindScopeRetainedOwnerEnvironmentId as M, notifySandboxEventObserver as Mi, sandboxClientAsProvider as Mn, CodexExecutionDiagnosticError as Mr, assertValidBudget as Mt, bindScopeRetainedOwnerProvider as N, sandboxEventServedBackend as Ni, createPushTraceSource as Nn, terminateProcessTreeAndConfirm as Nr, createBudgetPool as Nt, pollFor as O, extractLlmCallEvent as Oi, createAgentEnvironmentProviderRegistry as On, LOCAL_HARNESSES as Or, isTraceAnalysisStore as Ot, consumeScopeRetainedOwnerResult as P, sandboxProgressEvents as Pi, decodeToolPart as Pn, AGENT_PROFILE_MATERIALIZATION_AXES as Pr, meterUsageEvent as Pt, recoverRetainedInteractiveRun as Q, resourceTelemetry as Qi, persistHarnessTranscript as Qn, readCommittedJsonLines as Qr, createPeerMailbox as Qt, scopeRetainedOwnerResourceReader as R, cloneSpend as Ri, RunCancellationReason as Rn, fullProfileMaterialization as Rr, WORKER_TRACE_PROPAGATION as Rt, recordScopeOwnerMaterialization as S, projectSandboxOutcome as Si, readPromptOptions as Sn, runSettledCommand as Sr, loadSpawnForest as St, settledToIteration as T, canonicalStreamEventFromSandboxEvent as Ti, canonicalObservedModelParts as Tn, createWorktree as Tr, replaySpawnTree as Tt, resolveSpawnResourcePaths as U, randomSuffix as Ui, recoverRetainedRun as Un, promptResourceProfileMaterialization as Ur, taskToPrompt as Ut, environmentReader as V, isAbortError$2 as Vi, runAbortable as Vn, promptModelProfileMaterialization as Vr, workerTraceHeaders as Vt, interactiveAdmissionSeamKey as W, sleep as Wi, startRetainedRun as Wn, renderProfileMaterializationIssues as Wr, DEFAULT_STALL_AFTER_MS as Wt, workerInteractiveBindingsDir as X, zeroSpend as Xi, captureHarnessTranscript as Xn, isNoEntError as Xr, PEER_MAIL_WIRE_KEY as Xt, workerInteractiveBindingFile as Y, withTimeout as Yi, resolveRedactor as Yn, worktreeCliProfileMaterialization as Yr, DEFAULT_PEER_MAIL_LIMITS as Yt, reconnectRetainedInteractiveRun as Z, addResourceSpend as Zi, harnessTranscriptArtifact as Zn, prepareJsonlAppend as Zr, claimsAuthority as Zt, beginScopeOwnerAttempt as _, unknownMaterializationReceipt as _i, runAgentRounds as _n, createRuntimeEventCollector as _r, FileResultBlobStore as _t, pickBestDelivered as a, teardownExecutor as aa, knownExecutionBindingReceipt as ai, bridgeAdmissionRefusal as an, buildLoopOtelSpans as ar, rollingDispatch as at, meterRuntimeOwnedAccounting as b, detachedFrozen as bi, acquireSandbox as bn, sanitizeKnowledgeReadinessReport as br, InMemorySpawnJournal as bt, DriverAttemptsExhaustedError as c, providerMessageText as ca, providerAttemptEvidence as ci, createCodexRolloutStoreReader as cn, createOpenInferenceFileExporter as cr, cliInPlaceExecutor as ct, defaultUnmetContractSteer as d, runtimeOwnedExecutorExecutionBinding as di, bridgeRuntimeAttachmentsKey as dn, flatOtelSpan as dr, createExecutorRegistry as dt, decodeHarnessUsage as ea, attestRuntimeOwnedPendingExecutor as ei, peerMailTools as en, createPropagatingTraceEmitter as er, destroyInteractiveEnvironment as et, runDriverWithRetry as f, runtimeOwnedExecutorMaterialization as fi, bridgeStopSignalKey as fn, generateSpanId as fr, snapshotExecutorConfig as ft, withDriverExecutor as g, unknownExecutionBindingReceipt as gi, isTerminalDecision as gn, toOtelAttributes as gr, createInPlaceCliExecutor as gt, isDriverSpec as h, runtimeOwnedScopeOwnerRuntime as hi, defaultSelectWinner as hn, padTraceId as hr, createSteerableSandboxSession as ht, collectDelivered as i, armDeadlineTimer as ia, inheritRuntimeOwnedExecutorAttestation as ii, executorFailure as in, INTELLIGENCE_WIRE_VERSION as ir, queueOf as it, waitUntil as j, mapSandboxToolEvent as ji, resolveAgentEnvironmentProvider as jn, parseCodexTokenUsage as jr, BudgetReconcileFault as jt, timerAt as k, isSandboxTerminalEvent as ki, providerAsExecutor as kn, harnessSupportsReasoningEffort as kr, parseWorkerToolTraceArtifact as kt, HarnessTurnFailedError as l, recordRuntimeOwnedDriveHarnessProviderEvidence as li, harnessUsageIsEmpty as ln, createOtelExporter as lr, cliWorktreeExecutor as lt, driverExecutorFactory as m, runtimeOwnedPendingExecutorMaterialization as mi, createSandboxForSpec as mn, padSpanId as mr, DEFAULT_SANDBOX_STEERING_MAX_TURNS as mt, createSupervisor as n, awaitAbortable$1 as na, authoredProfileDigest as ni, isLiveNodeStatus as nn, readTraceContextFromEnv as nr, effectiveConcurrency as nt, runFinalizer as o, promptFromAgentTurnInput as oa, knownMaterializationReceipt as oi, bridgeModelRouteRefusal as on, buildLoopSpanNodes as or, bindReusableExecutorExecutionId as ot, driverChild as p, runtimeOwnedExecutorProviderEvidence as pi, TERMINAL_DECISIONS as pn, loopEventToOtelSpan as pr, createWorktreeCliExecutor as pt, attachWorker as q, throwIfAborted as qi, defaultRedactor as qn, unsupportedProfileDimensions as qr, createInbox as qt, bestDelivered as r, DEFAULT_SUCCESSFUL_SHUTDOWN_MS as ra, finalizeRuntimeOwnedPendingExecutor as ri, isTerminalNodeStatus as rn, traceContextToEnv as rr, freeSlots as rt, runTree as s, promptOptionsFromAgentTurnInput as sa, newExecutionAttemptId as si, addHarnessUsage as sn, buildRuntimeEventOtelSpans as sr, captureReusableExecutorConfig as st, createRootHandle as t, abortError$2 as ta, attestRuntimeOwnedScopeOwner as ti, peerMailVerbNames as tn, mergeTraceEnv as tr, errMessage as tt, classifyDriverFailure as u, runtimeOwnedDriveHarnessProviderEvidence as ui, readCodexRolloutSession as un, exportEvalRuns as ur, createExecutor as ut, createScope as v, executableAgentProfileSnapshot as vi, createSandboxLineage as vn, createRuntimeStreamEventCollector as vr, FileSpawnJournal as vt, scopeOwnerExecutorNodeContext as w, assertSandboxServedModel as wi, runBrainLoop as wn, captureWorktreeDiff as wr, pendingWaits as wt, meterRuntimeOwnedProviderAttempt as x, detachedSnapshot as xi, assertBoxlessPromptOptions as xn, sanitizeRuntimeStreamEvent as xr, insideCursorNamespace as xt, deriveNodeExecutionIdentity as y, executableAgentSpecSnapshot as yi, probeSandboxCapabilities as yn, sanitizeAgentRuntimeEvent as yr, InMemoryResultBlobStore as yt, scopeRetainedOwnerResult as z, deleteBoxSafe as zi, abortError as zn, profileMaterializationAxes$1 as zr, readWorkerTraceContext as zt };
|
|
25051
25226
|
|
|
25052
|
-
//# sourceMappingURL=supervisor-
|
|
25227
|
+
//# sourceMappingURL=supervisor-BIBWUFUr.js.map
|