@tangle-network/agent-runtime 0.121.0 → 0.123.1
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-DdIpwQ0k.js → activation-DhWJ3p8N.js} +3 -3
- package/dist/{activation-DdIpwQ0k.js.map → activation-DhWJ3p8N.js.map} +1 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +3 -3
- package/dist/candidate-execution/index.js +4 -4
- package/dist/{candidate-execution-DDkSRPjY.js → candidate-execution-BFpq-Xi6.js} +4 -4
- package/dist/{candidate-execution-DDkSRPjY.js.map → candidate-execution-BFpq-Xi6.js.map} +1 -1
- package/dist/{environment-provider-DChfYm2-.js → environment-provider-DqFS6FSZ.js} +6 -86
- package/dist/environment-provider-DqFS6FSZ.js.map +1 -0
- package/dist/{environment-provider-Bh4nX2qt.d.ts → environment-provider-PM9PeW_J.d.ts} +109 -11
- package/dist/environment-provider.d.ts +1 -1
- package/dist/environment-provider.js +1 -1
- package/dist/{improvement-cycle-zjR-MXwK.js → improvement-cycle-IJgCbKWQ.js} +6 -6
- package/dist/improvement-cycle-IJgCbKWQ.js.map +1 -0
- package/dist/{index-BLsKcxNd.d.ts → index-4NcThsDc.d.ts} +3 -3
- package/dist/{index-I35151Fr.d.ts → index-CQBioeAj.d.ts} +5 -5
- package/dist/{index-CGADWaa_.d.ts → index-xP27vtnt.d.ts} +1213 -849
- package/dist/index.d.ts +6 -6
- package/dist/index.js +12 -12
- package/dist/intelligence.d.ts +1 -1
- package/dist/intelligence.js +6 -6
- package/dist/kernel.d.ts +3 -3
- package/dist/kernel.js +7 -7
- package/dist/{knowledge-B1B3BsQZ.js → knowledge-BOHj6nGh.js} +5 -5
- package/dist/{knowledge-B1B3BsQZ.js.map → knowledge-BOHj6nGh.js.map} +1 -1
- package/dist/knowledge.d.ts +1 -1
- package/dist/knowledge.js +1 -1
- package/dist/{loop-runner-bin-BeG9vTdE.d.ts → loop-runner-bin-DMnNxZHw.d.ts} +3 -3
- package/dist/{loop-runner-bin-CXJWdfJ4.js → loop-runner-bin-DUM37LLw.js} +3 -3
- package/dist/{loop-runner-bin-CXJWdfJ4.js.map → loop-runner-bin-DUM37LLw.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 +2 -2
- package/dist/mcp/index.d.ts +3 -3
- package/dist/mcp/index.js +5 -5
- package/dist/{openai-tools-CVgLNp04.js → openai-tools-Bm1SDJIp.js} +2 -2
- package/dist/{openai-tools-CVgLNp04.js.map → openai-tools-Bm1SDJIp.js.map} +1 -1
- package/dist/{prepare-DpV6np9e.js → prepare--8EvLqCr.js} +2 -2
- package/dist/{prepare-DpV6np9e.js.map → prepare--8EvLqCr.js.map} +1 -1
- package/dist/primeintellect/index.d.ts +1 -1
- package/dist/{protected-model-port-vQLBRoAQ.js → protected-model-port-CXVfOUu_.js} +2 -2
- package/dist/{protected-model-port-vQLBRoAQ.js.map → protected-model-port-CXVfOUu_.js.map} +1 -1
- package/dist/{runtime-Bp3NwC0A.js → runtime-DZblIf3R.js} +468 -56
- package/dist/runtime-DZblIf3R.js.map +1 -0
- package/dist/{spawn-journal-IeXpidO2.js → spawn-journal-DsZKDqeh.js} +5 -3
- package/dist/spawn-journal-DsZKDqeh.js.map +1 -0
- package/dist/{structural-rollout-DQHO3b2Y.js → structural-rollout-zY0oqQzO.js} +3 -3
- package/dist/{structural-rollout-DQHO3b2Y.js.map → structural-rollout-zY0oqQzO.js.map} +1 -1
- package/dist/{supervise-BHHMtwP9.js → supervise-Cx24b3lw.js} +480 -92
- package/dist/supervise-Cx24b3lw.js.map +1 -0
- package/dist/{supervisor-CpT9yAxL.js → supervisor-DpjO0Gmy.js} +231 -29
- package/dist/supervisor-DpjO0Gmy.js.map +1 -0
- package/dist/testing.js +12 -12
- package/dist/{workspace-archive-B4SkNJjw.js → workspace-archive-BQxvkypI.js} +2 -2
- package/dist/{workspace-archive-B4SkNJjw.js.map → workspace-archive-BQxvkypI.js.map} +1 -1
- package/package.json +10 -9
- package/dist/environment-provider-DChfYm2-.js.map +0 -1
- package/dist/improvement-cycle-zjR-MXwK.js.map +0 -1
- package/dist/runtime-Bp3NwC0A.js.map +0 -1
- package/dist/spawn-journal-IeXpidO2.js.map +0 -1
- package/dist/supervise-BHHMtwP9.js.map +0 -1
- package/dist/supervisor-CpT9yAxL.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { c as RuntimeRunStateError, i as ConfigError, o as NotFoundError, t as AgentEvalError$1, u as ValidationError } from "./errors-DEAvWQPy.js";
|
|
2
|
-
import { S as detachedSnapshot, b as workerTraceAnalysisStore, d as writeAllBytes, i as InMemorySpawnJournal, l as parseCommittedJsonLines, n as FileSpawnJournal, r as InMemoryResultBlobStore, t as FileResultBlobStore, u as prepareJsonlAppend, x as contentAddress } from "./spawn-journal-
|
|
2
|
+
import { S as detachedSnapshot, b as workerTraceAnalysisStore, d as writeAllBytes, i as InMemorySpawnJournal, l as parseCommittedJsonLines, n as FileSpawnJournal, r as InMemoryResultBlobStore, t as FileResultBlobStore, u as prepareJsonlAppend, x as contentAddress } from "./spawn-journal-DsZKDqeh.js";
|
|
3
3
|
import { a as randomSuffix, c as stringifySafe, d as withTimeout, f as zeroTokenUsage, i as mapWithConcurrency, l as throwAbort, n as deleteBoxSafe, o as randomUuid, s as sleep, t as addTokenUsage, u as throwIfAborted } from "./util-MVgdwuIS.js";
|
|
4
|
-
import { $ as
|
|
4
|
+
import { $t as concreteProfileModel, At as controlProfileMaterialization, Ct as runWorktreeHarness, Dt as removeWorktree, Et as createWorktree, F as toOtelAttributes, Ft as promptModelProfileMaterialization, J as createActivityLog, Mt as fullProfileMaterialization, Nt as profileMaterializationAxes, O as createOtelExporter, Pt as promptControlProfileMaterialization, Q as freeSlots, Qt as concreteModelId, St as runWorktreeChecks, T as buildLoopSpanNodes, Tt as captureWorktreeDiff, Vt as worktreeCliProfileMaterialization, Xt as assertModelAllowed, Y as describeToolArgs, Zt as assertProfileModelsAllowed, _ as workerTraceEnv, _t as routerChatWithUsage, a as pickBestDelivered, at as assertValidBudget, b as mergeTraceEnv, bt as runBrainLoop, c as driverChild, ct as attestRuntimeOwnedExecutor, d as deriveNodeExecutionIdentity, dt as newExecutionAttemptId, en as isHarnessNativeModel, f as recordScopeOwnerMaterialization, ft as runtimeOwnedExecutorExecutionBinding, h as WORKER_TRACE_PROPAGATION, ht as routerBrain, it as workerTokenFloor, j as generateSpanId, jt as defineProfileMaterializationContract, kt as assertProfileMaterialization, l as withDriverExecutor, lt as attestRuntimeOwnedScopeOwner, mt as runtimeOwnedScopeOwnerRuntime, n as createSupervisor, nt as teardownExecutor, o as runFinalizer, p as scopeOwnerExecutorNodeContext, pt as runtimeOwnedExecutorMaterialization, r as bestDelivered, rt as WORKER_TOKEN_FLOOR, s as runTree, st as spendFromUsageEvents, tn as profileForExecution, tt as DEFAULT_SUCCESSFUL_SHUTDOWN_MS, ut as inheritRuntimeOwnedExecutorAttestation, wt as worktreeProfileExecutionPlan } from "./supervisor-DpjO0Gmy.js";
|
|
5
5
|
import { i as notifyRuntimeHookEvent, t as composeRuntimeHooks } from "./runtime-hooks-C7iJOWm3.js";
|
|
6
6
|
import { a as notifySandboxEventObserver, n as extractLlmCallEvent } from "./sandbox-events-Yhd1GYWl.js";
|
|
7
|
-
import { i as resolveAgentEnvironmentProvider, n as providerAsExecutor, r as providerAsSandboxClient
|
|
7
|
+
import { i as resolveAgentEnvironmentProvider, n as providerAsExecutor, r as providerAsSandboxClient } from "./environment-provider-DqFS6FSZ.js";
|
|
8
8
|
import { t as createStdioToolServer } from "./tool-server-RcWgLIsL.js";
|
|
9
9
|
import { n as UI_LENSES } from "./substrate-B0TYNrXn.js";
|
|
10
10
|
import { argHash, computeFindingId, errorStreakDetector, estimateCost, isModelPriced, makeFinding, observeAll, repeatedActionDetector } from "@tangle-network/agent-eval";
|
|
@@ -141,6 +141,177 @@ function isAsyncIterable$2(v) {
|
|
|
141
141
|
return v != null && typeof v[Symbol.asyncIterator] === "function";
|
|
142
142
|
}
|
|
143
143
|
//#endregion
|
|
144
|
+
//#region src/runtime/supervise/prompt-registry.ts
|
|
145
|
+
/**
|
|
146
|
+
*
|
|
147
|
+
* The kernel prompt registry — versioned prompt text as DATA, addressed by `PromptHandle`.
|
|
148
|
+
*
|
|
149
|
+
* A role expressed as a builder FUNCTION is a role that can never improve: the only optimizable
|
|
150
|
+
* surface it leaves is whatever thin string a caller happens to inject, while the real doctrine
|
|
151
|
+
* sits hardcoded in TypeScript. This registry is the inverse: every standing instruction is a
|
|
152
|
+
* versioned entry (`<surface>` + `v<n>`), so a graph edge, a supervisor front door, or an
|
|
153
|
+
* optimizer names a handle and the TEXT is swappable, sweepable, and diffable without a code
|
|
154
|
+
* change. Graph edges (`runGraph`) carry handles, never inline prose.
|
|
155
|
+
*
|
|
156
|
+
* ONE policy per role, whichever front door builds it: the seeded `supervisor/policy` entry is the
|
|
157
|
+
* single supervisor stance. The package previously shipped two contradictory defaults — the router
|
|
158
|
+
* arm's "do small work YOURSELF" (`defaultSupervisorPrompt`) versus the delegate front door's "you
|
|
159
|
+
* do NOT do the work yourself" (`supervisorInstructions`) — selected by entry point. Both now
|
|
160
|
+
* derive from the one entry here; which door you enter no longer decides the policy.
|
|
161
|
+
*
|
|
162
|
+
* @experimental
|
|
163
|
+
*/
|
|
164
|
+
const HANDLE_PATTERN = /^(.+)\/v(\d+)$/;
|
|
165
|
+
/**
|
|
166
|
+
* Parse `'<surface>/v<n>'` into a {@link PromptHandle}. The shorthand for authoring a graph edge:
|
|
167
|
+
* `directive: promptHandle('delegates/worker-brief/v1')`.
|
|
168
|
+
*/
|
|
169
|
+
function promptHandle(ref) {
|
|
170
|
+
if (typeof ref !== "string" || ref.length === 0) throw new ValidationError("promptHandle: ref must be a non-empty string");
|
|
171
|
+
const match = HANDLE_PATTERN.exec(ref);
|
|
172
|
+
if (!match) throw new ValidationError(`promptHandle: ${JSON.stringify(ref)} is not a versioned prompt reference (<surface>/v<n>)`);
|
|
173
|
+
const version = Number(match[2]);
|
|
174
|
+
if (!Number.isSafeInteger(version) || version < 0) throw new ValidationError(`promptHandle: invalid version in ${JSON.stringify(ref)}`);
|
|
175
|
+
return {
|
|
176
|
+
surface: match[1],
|
|
177
|
+
version
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/** The string form of a handle: `<surface>/v<n>`. */
|
|
181
|
+
function formatPromptHandle(handle) {
|
|
182
|
+
return `${handle.surface}/v${handle.version}`;
|
|
183
|
+
}
|
|
184
|
+
/** Create a registry, optionally seeded. Entries are copied; the registry never aliases caller state. */
|
|
185
|
+
function createPromptRegistry(seed) {
|
|
186
|
+
const entries = /* @__PURE__ */ new Map();
|
|
187
|
+
const keyOf = (surface, version) => `${surface}/v${version}`;
|
|
188
|
+
const register = (entry) => {
|
|
189
|
+
if (typeof entry.surface !== "string" || entry.surface.length === 0) throw new ValidationError("prompt registry: entry.surface must be a non-empty string");
|
|
190
|
+
if (!Number.isSafeInteger(entry.version) || entry.version < 0) throw new ValidationError("prompt registry: entry.version must be a non-negative integer");
|
|
191
|
+
if (typeof entry.text !== "string" || entry.text.length === 0) throw new ValidationError(`prompt registry: entry ${keyOf(entry.surface, entry.version)} has no text — an empty directive is the silent-substitution failure this registry exists to prevent`);
|
|
192
|
+
const key = keyOf(entry.surface, entry.version);
|
|
193
|
+
if (entries.has(key)) throw new ValidationError(`prompt registry: ${key} is already registered — versions are immutable; register a new version instead`);
|
|
194
|
+
entries.set(key, Object.freeze({ ...entry }));
|
|
195
|
+
};
|
|
196
|
+
for (const entry of seed ?? []) register(entry);
|
|
197
|
+
return {
|
|
198
|
+
resolve(handle) {
|
|
199
|
+
const found = entries.get(keyOf(handle.surface, handle.version));
|
|
200
|
+
if (!found) throw new ValidationError(`prompt registry: no entry for ${formatPromptHandle(handle)} — a directive must resolve or fail loud, never fall back silently (registered: ${[...entries.keys()].join(", ") || "none"})`);
|
|
201
|
+
return found;
|
|
202
|
+
},
|
|
203
|
+
register,
|
|
204
|
+
list() {
|
|
205
|
+
return Object.freeze([...entries.values()]);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* THE supervisor policy — one stance, both front doors. The work-vs-delegate rule is conditional
|
|
211
|
+
* on capability (work tools present or not), which is what dissolves the old contradiction: "do
|
|
212
|
+
* small work yourself" was written for a supervisor WITH work tools, "you do not do the work" for
|
|
213
|
+
* one WITHOUT — one policy states both branches explicitly.
|
|
214
|
+
*/
|
|
215
|
+
const supervisorPolicyPrompt = Object.freeze({
|
|
216
|
+
surface: "supervisor/policy",
|
|
217
|
+
version: 1,
|
|
218
|
+
description: "The single supervisor stance: accountability, work-vs-delegate rule, context lifecycle, stop condition.",
|
|
219
|
+
text: [
|
|
220
|
+
"You are a supervisor accountable for DELIVERING the task — not for looking busy. You succeed",
|
|
221
|
+
"only when the deliverable is actually produced and verified, never on a worker reporting \"done\".",
|
|
222
|
+
"",
|
|
223
|
+
"Work-vs-delegate — one rule, conditional on your capability:",
|
|
224
|
+
"- Do small, sequential work YOURSELF only when you hold WORK tools for it (tools beyond the",
|
|
225
|
+
" coordination verbs). Without work tools you cannot do the work — author and delegate it.",
|
|
226
|
+
"- Spawn a worker when a sub-task is large, independent (parallelizable), or needs a clean",
|
|
227
|
+
" context the current one has filled.",
|
|
228
|
+
"- Spawning spends the shared, conserved budget — delegate with intent, not by reflex, and",
|
|
229
|
+
" prefer the FEWEST workers that deliver.",
|
|
230
|
+
"",
|
|
231
|
+
"Manage the context lifecycle on long work: give each spawned worker a BOUNDED brief — the",
|
|
232
|
+
"specific sub-task plus only the interfaces/state it needs — never your whole history. When one",
|
|
233
|
+
"chapter is done, distill what the next chapter needs and spawn fresh, rather than steering one",
|
|
234
|
+
"worker until its context fills and degrades.",
|
|
235
|
+
"",
|
|
236
|
+
"Wait on real signals (await a settle, answer a blocking question), integrate the result, and",
|
|
237
|
+
"stop as soon as the deliverable is met. You cannot declare done by fiat — only a verified",
|
|
238
|
+
"deliverable counts: a delivered (valid:true) worker, or your own submission passing the same",
|
|
239
|
+
"independent check."
|
|
240
|
+
].join("\n")
|
|
241
|
+
});
|
|
242
|
+
/**
|
|
243
|
+
* Default DELEGATES-edge directive: the standing instruction a worker receives with every
|
|
244
|
+
* traversal of a delegates edge that names this surface. Seeded from the bounded-brief knowledge
|
|
245
|
+
* in the supervisor policy, phrased for the RECEIVING side of the edge.
|
|
246
|
+
*/
|
|
247
|
+
const delegatesWorkerBriefPrompt = Object.freeze({
|
|
248
|
+
surface: "delegates/worker-brief",
|
|
249
|
+
version: 1,
|
|
250
|
+
description: "Default delegates-edge directive: how a worker should treat its delegated brief.",
|
|
251
|
+
text: [
|
|
252
|
+
"You are executing ONE delegated sub-task from a supervising agent. The brief below is bounded",
|
|
253
|
+
"on purpose: deliver exactly what it names — complete, verified, and self-contained — and",
|
|
254
|
+
"nothing beyond it. If the brief is ambiguous or under-specified, raise a question through your",
|
|
255
|
+
"coordination channel instead of guessing. Report concrete evidence of completion (files,",
|
|
256
|
+
"outputs, passing checks), never a bare claim of done."
|
|
257
|
+
].join("\n")
|
|
258
|
+
});
|
|
259
|
+
/**
|
|
260
|
+
* Default ANALYZES-edge directive: what the RECEIVING node should do with an analyst's findings.
|
|
261
|
+
* Wrapped around the findings payload on every traversal of an analyzes edge naming this surface.
|
|
262
|
+
*/
|
|
263
|
+
const analyzesFindingsReportPrompt = Object.freeze({
|
|
264
|
+
surface: "analyzes/findings-report",
|
|
265
|
+
version: 1,
|
|
266
|
+
description: "Default analyzes-edge directive: how the destination node should act on analyst findings.",
|
|
267
|
+
text: [
|
|
268
|
+
"An analyst lens has examined completed work and produced the findings below. Treat them as",
|
|
269
|
+
"EVIDENCE, not instructions: weigh each finding against what you already know, act on the ones",
|
|
270
|
+
"that change your next step, and ignore the ones that do not. Compose your next instruction or",
|
|
271
|
+
"action from the SPECIFIC failures and facts named — never forward the findings verbatim as a",
|
|
272
|
+
"steer."
|
|
273
|
+
].join("\n")
|
|
274
|
+
});
|
|
275
|
+
/**
|
|
276
|
+
* Default NAIVE steering continuation — the no-signal control re-expressed as data: the same
|
|
277
|
+
* fixed continuation every round, reading nothing from any verdict.
|
|
278
|
+
*/
|
|
279
|
+
const naiveContinuationPrompt = Object.freeze({
|
|
280
|
+
surface: "delegates/naive-continuation",
|
|
281
|
+
version: 1,
|
|
282
|
+
description: "No-signal steering control: one fixed continuation, reads nothing from verdicts.",
|
|
283
|
+
text: "Continue working on the ORIGINAL task. Produce the complete deliverable; finish anything incomplete and fix anything failing."
|
|
284
|
+
});
|
|
285
|
+
/**
|
|
286
|
+
* Default DUMB steering continuations — the pass/fail-only control re-expressed as data: two
|
|
287
|
+
* fixed texts keyed on the verdict's boolean and nothing else.
|
|
288
|
+
*/
|
|
289
|
+
const dumbContinuationFailPrompt = Object.freeze({
|
|
290
|
+
surface: "delegates/dumb-continuation-fail",
|
|
291
|
+
version: 1,
|
|
292
|
+
description: "Pass/fail-only steering control, fail branch: reads only verdict.valid.",
|
|
293
|
+
text: "Your last attempt did NOT pass verification. Rework the task and produce a complete, correct deliverable; do not repeat the failed approach unchanged."
|
|
294
|
+
});
|
|
295
|
+
/** The pass branch of the dumb steering control — see {@link dumbContinuationFailPrompt}. */
|
|
296
|
+
const dumbContinuationPassPrompt = Object.freeze({
|
|
297
|
+
surface: "delegates/dumb-continuation-pass",
|
|
298
|
+
version: 1,
|
|
299
|
+
description: "Pass/fail-only steering control, pass branch: reads only verdict.valid.",
|
|
300
|
+
text: "Your last attempt passed verification. Finalize your work and stop."
|
|
301
|
+
});
|
|
302
|
+
/** The kernel's seeded registry: every surface the runtime's own builders derive from. A caller
|
|
303
|
+
* may register additional surfaces/versions on the returned registry. */
|
|
304
|
+
function kernelPromptRegistry() {
|
|
305
|
+
return createPromptRegistry([
|
|
306
|
+
supervisorPolicyPrompt,
|
|
307
|
+
delegatesWorkerBriefPrompt,
|
|
308
|
+
analyzesFindingsReportPrompt,
|
|
309
|
+
naiveContinuationPrompt,
|
|
310
|
+
dumbContinuationFailPrompt,
|
|
311
|
+
dumbContinuationPassPrompt
|
|
312
|
+
]);
|
|
313
|
+
}
|
|
314
|
+
//#endregion
|
|
144
315
|
//#region src/runtime/supervise/authoring.ts
|
|
145
316
|
/**
|
|
146
317
|
*
|
|
@@ -204,10 +375,17 @@ function canonicalizeAuthoredProfile(raw) {
|
|
|
204
375
|
return authored;
|
|
205
376
|
}
|
|
206
377
|
/** The supervisor SKILL — the how-to the supervisor reads (its system prompt). THE optimizable
|
|
207
|
-
* surface: editing this changes how the supervisor designs every agent it spawns.
|
|
378
|
+
* surface: editing this changes how the supervisor designs every agent it spawns.
|
|
379
|
+
*
|
|
380
|
+
* The POLICY paragraph is the registry's one `supervisor/policy` entry — the same stance
|
|
381
|
+
* `defaultSupervisorPrompt` carries — so both front doors run the same work-vs-delegate rule;
|
|
382
|
+
* this function ADDS the profile-authoring skill (how to WRITE the workers it spawns), which is
|
|
383
|
+
* additive craft, not a different policy. */
|
|
208
384
|
function supervisorInstructions(opts) {
|
|
209
385
|
return [
|
|
210
|
-
|
|
386
|
+
supervisorPolicyPrompt.text,
|
|
387
|
+
"",
|
|
388
|
+
"Your delegation craft is AUTHORING: a spawned worker is exactly as good as the profile you write.",
|
|
211
389
|
"",
|
|
212
390
|
"For the task you are given:",
|
|
213
391
|
"1. DECOMPOSE it into the smallest set of sub-tasks a single focused worker can each deliver.",
|
|
@@ -220,14 +398,14 @@ function supervisorInstructions(opts) {
|
|
|
220
398
|
" NEVER spawn a worker with an empty profile. The quality of the worker IS the quality of the profile you write.",
|
|
221
399
|
"3. await_event (kinds:['settled']) to collect each worker. Its result says valid:true only if the deployable check passed.",
|
|
222
400
|
"4. If a worker did NOT deliver, AUTHOR A NEW profile whose prompt.systemPrompt names the SPECIFIC failure and how to fix it — never just retry the same profile.",
|
|
223
|
-
"5. Stop (reply with no tool call) once the work is delivered.
|
|
401
|
+
"5. Stop (reply with no tool call) once the work is delivered.",
|
|
224
402
|
...opts?.goal ? ["", `The goal: ${opts.goal}`] : []
|
|
225
403
|
].join("\n");
|
|
226
404
|
}
|
|
227
405
|
/** Build a router-only worker from an authored profile. This helper executes the prompt/model axes;
|
|
228
406
|
* use `workerFromBackend` for full materialization of tools, MCP, resources, hooks, and subagents. */
|
|
229
407
|
function authoredWorker(profile, opts) {
|
|
230
|
-
const model = profile
|
|
408
|
+
const model = concreteProfileModel(profile) ?? opts.cfg.model;
|
|
231
409
|
const executorFactory = (spec, ctx) => {
|
|
232
410
|
let artifact;
|
|
233
411
|
const executionId = ctx.node?.nodeId ?? `authored-router-${profile.name}`;
|
|
@@ -409,25 +587,6 @@ function profileRichnessFinding(richness, opts) {
|
|
|
409
587
|
});
|
|
410
588
|
}
|
|
411
589
|
//#endregion
|
|
412
|
-
//#region src/runtime/supervise/model-policy.ts
|
|
413
|
-
/**
|
|
414
|
-
* Throw a `ConfigError` when `allowed` is set, `model` is defined, and `model` is not a
|
|
415
|
-
* member of `allowed`. No-op when `allowed` is unset (the unrestricted default) or when
|
|
416
|
-
* `model` is undefined (nothing was configured to check).
|
|
417
|
-
*/
|
|
418
|
-
function assertModelAllowed(model, allowed) {
|
|
419
|
-
if (!allowed || model === void 0) return;
|
|
420
|
-
if (!allowed.includes(model)) throw new ConfigError(`model ${JSON.stringify(model)} is not in the allowed set ${JSON.stringify([...allowed])}`);
|
|
421
|
-
}
|
|
422
|
-
/** Check every canonical model-bearing field in a complete profile, including the models a
|
|
423
|
-
* backend may select for cheap work, named subagents, or modes. */
|
|
424
|
-
function assertProfileModelsAllowed(profile, allowed) {
|
|
425
|
-
assertModelAllowed(profile.model?.default, allowed);
|
|
426
|
-
assertModelAllowed(profile.model?.small, allowed);
|
|
427
|
-
for (const subagent of Object.values(profile.subagents ?? {})) assertModelAllowed(subagent.model, allowed);
|
|
428
|
-
for (const mode of Object.values(profile.modes ?? {})) assertModelAllowed(mode.model, allowed);
|
|
429
|
-
}
|
|
430
|
-
//#endregion
|
|
431
590
|
//#region src/runtime/supervise/otel-spans.ts
|
|
432
591
|
/**
|
|
433
592
|
* Supervisor tree → OTLP spans. OPT-IN, off by default.
|
|
@@ -959,6 +1118,71 @@ function isRetryable(err) {
|
|
|
959
1118
|
return /provision failed|edge data plane|not reachable|failed to create sandbox/i.test(msg);
|
|
960
1119
|
}
|
|
961
1120
|
//#endregion
|
|
1121
|
+
//#region src/runtime/sandbox-backend.ts
|
|
1122
|
+
/**
|
|
1123
|
+
* Harnesses the sandbox accepts as a `backend.type`. `gemini` is a
|
|
1124
|
+
* `HarnessType` with no sandbox backend, so it is absent here and a profile
|
|
1125
|
+
* declaring it cannot run through this path.
|
|
1126
|
+
*
|
|
1127
|
+
* The double `satisfies` pins both directions: an entry the sandbox drops stops
|
|
1128
|
+
* compiling, and an entry that is not a harness stops compiling.
|
|
1129
|
+
*/
|
|
1130
|
+
const harnessBackends = [
|
|
1131
|
+
"claude-code",
|
|
1132
|
+
"nanoclaw",
|
|
1133
|
+
"codex",
|
|
1134
|
+
"opencode",
|
|
1135
|
+
"kimi-code",
|
|
1136
|
+
"pi",
|
|
1137
|
+
"hermes",
|
|
1138
|
+
"openclaw",
|
|
1139
|
+
"amp",
|
|
1140
|
+
"factory-droids",
|
|
1141
|
+
"acp",
|
|
1142
|
+
"cli-base"
|
|
1143
|
+
];
|
|
1144
|
+
function harnessAsBackendType(harness) {
|
|
1145
|
+
return harnessBackends.includes(harness) ? harness : void 0;
|
|
1146
|
+
}
|
|
1147
|
+
/**
|
|
1148
|
+
* Resolve the backend `type`: an explicit override wins, then the profile's
|
|
1149
|
+
* `metadata.backendType` hint, then the profile's declared `harness`, else the
|
|
1150
|
+
* SDK's profile-driven default (`'opencode'` on the platform side).
|
|
1151
|
+
*
|
|
1152
|
+
* A declared `harness` the sandbox cannot run throws rather than falling
|
|
1153
|
+
* through: silently running a `gemini` profile on opencode returns a result
|
|
1154
|
+
* that means something other than it appears to, which is worse than no result.
|
|
1155
|
+
*/
|
|
1156
|
+
function resolveBackendType(profile, override) {
|
|
1157
|
+
if (override?.type) return override.type;
|
|
1158
|
+
const explicit = profile.metadata?.backendType;
|
|
1159
|
+
if (typeof explicit === "string") return explicit;
|
|
1160
|
+
const declared = profile.harness;
|
|
1161
|
+
if (declared !== void 0) {
|
|
1162
|
+
const backend = harnessAsBackendType(declared);
|
|
1163
|
+
if (backend === void 0) throw new Error(`buildBackendOptions: profile declares harness "${declared}", which the sandbox has no backend for. Runnable harnesses: ${harnessBackends.join(", ")}. Set metadata.backendType to run it on a different backend deliberately.`);
|
|
1164
|
+
return backend;
|
|
1165
|
+
}
|
|
1166
|
+
return "opencode";
|
|
1167
|
+
}
|
|
1168
|
+
/**
|
|
1169
|
+
* Build `CreateSandboxOptions` for `profile`, merging `overrides` and setting
|
|
1170
|
+
* `backend.profile`. `model`/`server` from an override backend pass through.
|
|
1171
|
+
*/
|
|
1172
|
+
function buildBackendOptions(profile, overrides) {
|
|
1173
|
+
const base = overrides ?? {};
|
|
1174
|
+
const overrideBackend = base.backend;
|
|
1175
|
+
return {
|
|
1176
|
+
...base,
|
|
1177
|
+
backend: {
|
|
1178
|
+
type: resolveBackendType(profile, overrideBackend),
|
|
1179
|
+
profile: profileForExecution(profile),
|
|
1180
|
+
...overrideBackend?.model ? { model: overrideBackend.model } : {},
|
|
1181
|
+
...overrideBackend?.server ? { server: overrideBackend.server } : {}
|
|
1182
|
+
}
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
//#endregion
|
|
962
1186
|
//#region src/runtime/sandbox-capabilities.ts
|
|
963
1187
|
const probeCache = /* @__PURE__ */ new WeakMap();
|
|
964
1188
|
/**
|
|
@@ -2402,10 +2626,11 @@ function readPromptOptions(loopCtx) {
|
|
|
2402
2626
|
* result onto the `Executor` port (artifact + spend) and owns the teardown point. The complete
|
|
2403
2627
|
* profile delivery — direct prompt/model plus materialized file-backed resources — lives there.
|
|
2404
2628
|
*
|
|
2405
|
-
* Token accounting: ordinary harness CLI runs remain `budgetExempt
|
|
2629
|
+
* Token accounting: ordinary harness CLI runs remain `budgetExempt`, and their `Spend` marks
|
|
2630
|
+
* `tokensKnown: false` — the `{0,0}` is a floor, never a measured-free run. Reproducible Codex mode
|
|
2406
2631
|
* parses the CLI's terminal JSONL usage and is metered by default; an absent usage event fails the
|
|
2407
2632
|
* run instead of recording fabricated zero tokens. Codex does not report dollar cost, so that
|
|
2408
|
-
* channel is explicitly marked unknown on the
|
|
2633
|
+
* channel is explicitly marked unknown on the metered path.
|
|
2409
2634
|
*
|
|
2410
2635
|
* @experimental
|
|
2411
2636
|
*/
|
|
@@ -2433,6 +2658,7 @@ function createWorktreeCliExecutor(options) {
|
|
|
2433
2658
|
let run;
|
|
2434
2659
|
let artifact;
|
|
2435
2660
|
const profilePlan = worktreeProfileExecutionPlan(options.profile, options.harness);
|
|
2661
|
+
const profileModel = concreteProfileModel(options.profile);
|
|
2436
2662
|
return attestRuntimeOwnedExecutor({
|
|
2437
2663
|
runtime: "cli",
|
|
2438
2664
|
budgetExempt,
|
|
@@ -2475,6 +2701,7 @@ function createWorktreeCliExecutor(options) {
|
|
|
2475
2701
|
input: 0,
|
|
2476
2702
|
output: 0
|
|
2477
2703
|
},
|
|
2704
|
+
...usage ? {} : { tokensKnown: false },
|
|
2478
2705
|
usd: 0,
|
|
2479
2706
|
...usage ? { usdKnown: false } : {},
|
|
2480
2707
|
ms: Date.now() - started
|
|
@@ -2502,9 +2729,9 @@ function createWorktreeCliExecutor(options) {
|
|
|
2502
2729
|
}, {
|
|
2503
2730
|
effectiveProfile: options.profile,
|
|
2504
2731
|
backend: `cli-worktree:${options.harness}`,
|
|
2505
|
-
model:
|
|
2732
|
+
model: profileModel ? {
|
|
2506
2733
|
status: "known",
|
|
2507
|
-
id:
|
|
2734
|
+
id: profileModel
|
|
2508
2735
|
} : {
|
|
2509
2736
|
status: "unknown",
|
|
2510
2737
|
reason: `${options.harness} selected its configured default model`
|
|
@@ -2533,7 +2760,7 @@ function createWorktreeCliExecutor(options) {
|
|
|
2533
2760
|
repoRoot: options.repoRoot,
|
|
2534
2761
|
runId,
|
|
2535
2762
|
harness: options.harness,
|
|
2536
|
-
model:
|
|
2763
|
+
model: profileModel ?? null,
|
|
2537
2764
|
baseRef: options.baseRef ?? "HEAD"
|
|
2538
2765
|
},
|
|
2539
2766
|
descriptor: {
|
|
@@ -2623,12 +2850,39 @@ function contentRef(prefix, value) {
|
|
|
2623
2850
|
}
|
|
2624
2851
|
return `${prefix}:${(h >>> 0).toString(16).padStart(8, "0")}`;
|
|
2625
2852
|
}
|
|
2626
|
-
|
|
2853
|
+
/**
|
|
2854
|
+
* The spend of work that HAPPENED and reported no usage receipt.
|
|
2855
|
+
*
|
|
2856
|
+
* Not the same value as a plain zero even though both carry `{0,0}` tokens and `$0`. A bare zero
|
|
2857
|
+
* asserts a MEASUREMENT — "this ran and cost nothing" — and every consumer downstream reads it that
|
|
2858
|
+
* way: the pool keeps reporting `readout().tokensKnown === true`, the journal totals stay clean, the
|
|
2859
|
+
* OTEL span records a priced zero, and a caller's token-denominated ceiling can never fire no matter
|
|
2860
|
+
* how much the work really burned. A ceiling that cannot fire is worse than no ceiling, because it
|
|
2861
|
+
* reads as protection.
|
|
2862
|
+
*
|
|
2863
|
+
* `Spend.tokensKnown` is the marker the substrate already threads end to end for exactly this case
|
|
2864
|
+
* (`budget.ts`, `otel-spans.ts`, `spawn-journal.ts`, `supervisor.ts`): the work is recorded, the
|
|
2865
|
+
* zero is labelled a floor rather than a total, and every rollup that touches it reports its balance
|
|
2866
|
+
* as a ceiling rather than a measurement. Use this — never a bare zero — whenever a runtime cannot
|
|
2867
|
+
* see what its worker spent.
|
|
2868
|
+
*
|
|
2869
|
+
* DELIBERATELY NOT `usdKnown: false`, and this is not an oversight. On the dollar channel that flag
|
|
2870
|
+
* is not a marker but a REFUSAL: `budget.ts` treats unknown dollars under a dollar-capped root as a
|
|
2871
|
+
* reconcile violation and fails the child. Applying it here would contradict `budgetExempt`, whose
|
|
2872
|
+
* whole documented contract is that such a worker settles OUT of the conserved pool rather than
|
|
2873
|
+
* against it (`scope.ts`) — a worker the kernel already agreed not to budget would start failing
|
|
2874
|
+
* after its work had burned, which is a policy change about which configurations are allowed, not a
|
|
2875
|
+
* fix to how honestly spend is reported. The token marker taints only token accounting. Under the
|
|
2876
|
+
* current `budgetExempt` policy the surviving `usd: 0` remains dollar-known; callers that require
|
|
2877
|
+
* dollar accounting must use a backend that returns priced usage.
|
|
2878
|
+
*/
|
|
2879
|
+
function unmeteredSpend(ms) {
|
|
2627
2880
|
return {
|
|
2628
2881
|
iterations: 0,
|
|
2629
2882
|
tokens: zeroTokenUsage(),
|
|
2883
|
+
tokensKnown: false,
|
|
2630
2884
|
usd: 0,
|
|
2631
|
-
ms
|
|
2885
|
+
ms
|
|
2632
2886
|
};
|
|
2633
2887
|
}
|
|
2634
2888
|
/**
|
|
@@ -2644,7 +2898,7 @@ function zeroSpend() {
|
|
|
2644
2898
|
*/
|
|
2645
2899
|
const routerInlineExecutor = (spec, ctx) => {
|
|
2646
2900
|
const seam = readSeam(ctx, routerSeamKey, "router/inline");
|
|
2647
|
-
const model = spec.profile
|
|
2901
|
+
const model = concreteProfileModel(spec.profile) ?? concreteModelId(seam.model);
|
|
2648
2902
|
if (!model) throw new ValidationError("routerInlineExecutor: no model — set RouterSeam.model or AgentProfile.model.default");
|
|
2649
2903
|
if (!seam.routerBaseUrl || !seam.routerKey) throw new ValidationError("routerInlineExecutor: RouterSeam.routerBaseUrl + routerKey required");
|
|
2650
2904
|
const controller = new AbortController();
|
|
@@ -2737,7 +2991,7 @@ const routerToolsSeamKey = "router-tools";
|
|
|
2737
2991
|
*/
|
|
2738
2992
|
const routerToolsInlineExecutor = (spec, ctx) => {
|
|
2739
2993
|
const seam = readSeam(ctx, routerToolsSeamKey, "router-tools");
|
|
2740
|
-
const model = spec.profile
|
|
2994
|
+
const model = concreteProfileModel(spec.profile) ?? concreteModelId(seam.model);
|
|
2741
2995
|
if (!model) throw new ValidationError("routerToolsInlineExecutor: no model — set RouterToolsSeam.model or AgentProfile.model.default");
|
|
2742
2996
|
if (!seam.routerBaseUrl || !seam.routerKey) throw new ValidationError("routerToolsInlineExecutor: RouterToolsSeam.routerBaseUrl + routerKey required");
|
|
2743
2997
|
const maxTurns = seam.maxTurns ?? 200;
|
|
@@ -2964,12 +3218,13 @@ const sandboxExecutor = (spec, ctx) => {
|
|
|
2964
3218
|
let artifact;
|
|
2965
3219
|
const executionId = ctx.node?.nodeId ?? `sandbox-run-${randomUUID()}`;
|
|
2966
3220
|
const attemptId = ctx.node?.attemptId ?? newExecutionAttemptId(executionId);
|
|
3221
|
+
const profileModel = concreteProfileModel(spec.profile);
|
|
2967
3222
|
const sandboxMaterialization = {
|
|
2968
3223
|
effectiveProfile: spec.profile,
|
|
2969
3224
|
backend: harness,
|
|
2970
|
-
model:
|
|
3225
|
+
model: profileModel ? {
|
|
2971
3226
|
status: "known",
|
|
2972
|
-
id:
|
|
3227
|
+
id: profileModel
|
|
2973
3228
|
} : {
|
|
2974
3229
|
status: "unknown",
|
|
2975
3230
|
reason: "sandbox harness selected its default model"
|
|
@@ -2991,7 +3246,7 @@ const sandboxExecutor = (spec, ctx) => {
|
|
|
2991
3246
|
binding: {
|
|
2992
3247
|
executionId,
|
|
2993
3248
|
harness,
|
|
2994
|
-
model:
|
|
3249
|
+
model: profileModel ?? null
|
|
2995
3250
|
},
|
|
2996
3251
|
descriptor: {
|
|
2997
3252
|
kind: "sandbox-run",
|
|
@@ -3172,6 +3427,10 @@ function leafVerdict(result) {
|
|
|
3172
3427
|
* `budgetExempt: true`: it remains usable as a direct executor, while budgeted supervision
|
|
3173
3428
|
* refuses it before process execution because the CLI exposes no usage receipt. teardown is SIGTERM → SIGKILL
|
|
3174
3429
|
* with a grace window. Streaming: yields one `iteration` event on clean exit.
|
|
3430
|
+
*
|
|
3431
|
+
* Its terminal spend is `unmeteredSpend`, NOT a zero: an unmetered runtime that reports a plain
|
|
3432
|
+
* `0` is indistinguishable from one that measured zero, and every ceiling downstream then reads
|
|
3433
|
+
* as enforced while enforcing nothing.
|
|
3175
3434
|
*/
|
|
3176
3435
|
const cliExecutor = (_spec, ctx) => {
|
|
3177
3436
|
const seam = readSeam(ctx, cliSeamKey, "cli");
|
|
@@ -3249,14 +3508,11 @@ const cliExecutor = (_spec, ctx) => {
|
|
|
3249
3508
|
});
|
|
3250
3509
|
};
|
|
3251
3510
|
async function* streamCliLeaf(args) {
|
|
3511
|
+
const started = Date.now();
|
|
3252
3512
|
const prompt = taskToPrompt(args.task);
|
|
3253
3513
|
const proc = spawn(args.seam.bin, args.seam.args ?? [], {
|
|
3254
3514
|
...args.seam.cwd ? { cwd: args.seam.cwd } : {},
|
|
3255
|
-
env:
|
|
3256
|
-
...process.env,
|
|
3257
|
-
...args.traceEnv,
|
|
3258
|
-
...args.seam.env ?? {}
|
|
3259
|
-
},
|
|
3515
|
+
env: mergeTraceEnv(process.env, args.traceEnv, args.seam.env),
|
|
3260
3516
|
stdio: [
|
|
3261
3517
|
"pipe",
|
|
3262
3518
|
"pipe",
|
|
@@ -3293,7 +3549,7 @@ async function* streamCliLeaf(args) {
|
|
|
3293
3549
|
args.onArtifact({
|
|
3294
3550
|
outRef: contentRef("cli", out),
|
|
3295
3551
|
out,
|
|
3296
|
-
spent:
|
|
3552
|
+
spent: unmeteredSpend(Date.now() - started)
|
|
3297
3553
|
});
|
|
3298
3554
|
yield { kind: "iteration" };
|
|
3299
3555
|
}
|
|
@@ -3350,7 +3606,7 @@ function killWithGrace(proc, grace) {
|
|
|
3350
3606
|
* IS the caller's declared intent rather than a gap to fill.
|
|
3351
3607
|
*/
|
|
3352
3608
|
function qualifyProviderModel(model) {
|
|
3353
|
-
const id = model?.default;
|
|
3609
|
+
const id = concreteModelId(model?.default);
|
|
3354
3610
|
if (!id) return void 0;
|
|
3355
3611
|
const provider = model?.provider;
|
|
3356
3612
|
if (!provider || id.includes("/")) return id;
|
|
@@ -3360,11 +3616,16 @@ function bridgeCellModel(seamModel, ctx, profile) {
|
|
|
3360
3616
|
const backend = ctx.seams.createOptions?.backend;
|
|
3361
3617
|
const profileHarness = agentHarness(profile.harness);
|
|
3362
3618
|
const harness = backend?.type ?? profileHarness;
|
|
3363
|
-
const
|
|
3364
|
-
|
|
3619
|
+
const backendModel = backend?.model?.model;
|
|
3620
|
+
const hasBackendModel = backendModel !== void 0;
|
|
3621
|
+
if (hasBackendModel && isHarnessNativeModel(backendModel)) return harness ?? concreteModelId(seamModel);
|
|
3622
|
+
const model = hasBackendModel ? concreteModelId(backendModel) : qualifyProviderModel(profile.model);
|
|
3623
|
+
const fallback = concreteModelId(seamModel);
|
|
3624
|
+
if (!harness && !model) return fallback;
|
|
3365
3625
|
if (!harness) return model;
|
|
3366
3626
|
if (model) return model.startsWith(`${harness}/`) ? model : `${harness}/${model}`;
|
|
3367
|
-
|
|
3627
|
+
if (!fallback) return void 0;
|
|
3628
|
+
return fallback.startsWith(`${harness}/`) ? fallback : `${harness}/${fallback}`;
|
|
3368
3629
|
}
|
|
3369
3630
|
const bridgeExecutor = (spec, ctx) => {
|
|
3370
3631
|
const base = readSeam(ctx, bridgeSeamKey, "bridge");
|
|
@@ -4371,12 +4632,13 @@ function snapshotExecutorConfig(config) {
|
|
|
4371
4632
|
});
|
|
4372
4633
|
}
|
|
4373
4634
|
case "provider": {
|
|
4374
|
-
const { provider, registry, taskToTurn, ...decisionData } = config;
|
|
4635
|
+
const { provider, registry, profileForCreate, taskToTurn, ...decisionData } = config;
|
|
4375
4636
|
const snapshot = detachedSnapshot(decisionData, "createExecutor provider config");
|
|
4376
4637
|
const resolvedProvider = resolveAgentEnvironmentProvider(provider, registry);
|
|
4377
4638
|
return Object.freeze({
|
|
4378
4639
|
...snapshot,
|
|
4379
4640
|
provider: resolvedProvider,
|
|
4641
|
+
...profileForCreate === void 0 ? {} : { profileForCreate },
|
|
4380
4642
|
...taskToTurn === void 0 ? {} : { taskToTurn }
|
|
4381
4643
|
});
|
|
4382
4644
|
}
|
|
@@ -4503,7 +4765,11 @@ function createExecutor(config) {
|
|
|
4503
4765
|
runtime: providerSeam.runtime ?? provider.name
|
|
4504
4766
|
};
|
|
4505
4767
|
}
|
|
4506
|
-
|
|
4768
|
+
const profileForCreate = providerSeam.profileForCreate;
|
|
4769
|
+
return providerAsExecutor(provider, {
|
|
4770
|
+
...providerSeam,
|
|
4771
|
+
profileForCreate: (profile) => profileForExecution(profileForCreate?.(profile) ?? profile)
|
|
4772
|
+
})(spec, seamed);
|
|
4507
4773
|
}
|
|
4508
4774
|
case "sandbox": {
|
|
4509
4775
|
const harness = spec.harness ?? captured.harness ?? null;
|
|
@@ -4858,6 +5124,35 @@ function belowFloorHint(harness) {
|
|
|
4858
5124
|
if (floor !== null) return `The ${harness} harness spends a measured minimum of ${floor} input tokens before any work, so this budget's maxTokens can never be satisfied. Raise maxTokens to at least ${floor}; retrying with a smaller budget will fail identically.`;
|
|
4859
5125
|
return "This budget's maxTokens is below the measured minimum a harness child spends before any work, so it can never be satisfied. Raise maxTokens to at least the floor for the child harness — measured floors (input tokens): " + measuredFloors.map(([h, f]) => `${h}=${f}`).join(", ") + " — retrying with a smaller budget will fail identically.";
|
|
4860
5126
|
}
|
|
5127
|
+
/** Producer-side cleanliness for the `finding` event. The findings payload is arbitrary analyst
|
|
5128
|
+
* output, the digest a subscriber computes (RFC 8785) throws on ANY `undefined` value — nested
|
|
5129
|
+
* included — and a throwing subscriber leaves the event invisible to EVERY subscriber. The
|
|
5130
|
+
* producer, not the digest, owns keeping the event canonical: an `undefined` payload is stripped
|
|
5131
|
+
* to key-absence, everything else is JSON round-tripped (nested `undefined` object values drop,
|
|
5132
|
+
* `undefined` array slots become `null`), and a payload JSON cannot represent at all (cycle,
|
|
5133
|
+
* BigInt, bare function) becomes a record OF that fact — degraded findings beat a vanished
|
|
5134
|
+
* event. */
|
|
5135
|
+
function canonicalFindingEvent(finding) {
|
|
5136
|
+
if (finding.findings === void 0) {
|
|
5137
|
+
const { findings: _absent, ...present } = finding;
|
|
5138
|
+
return present;
|
|
5139
|
+
}
|
|
5140
|
+
try {
|
|
5141
|
+
return {
|
|
5142
|
+
...finding,
|
|
5143
|
+
findings: JSON.parse(JSON.stringify(finding.findings))
|
|
5144
|
+
};
|
|
5145
|
+
} catch (error) {
|
|
5146
|
+
return {
|
|
5147
|
+
...finding,
|
|
5148
|
+
findings: { nonCanonicalFindings: error instanceof Error ? error.message : String(error) }
|
|
5149
|
+
};
|
|
5150
|
+
}
|
|
5151
|
+
}
|
|
5152
|
+
/** Normalize the two spellings of an analyst-on-settle entry to the route form. */
|
|
5153
|
+
function normalizeAnalyzeOnSettle(entry) {
|
|
5154
|
+
return typeof entry === "string" ? { kind: entry } : entry;
|
|
5155
|
+
}
|
|
4861
5156
|
/** Default ceiling for a single `await_event` block (ms). Chosen well under any reasonable remote
|
|
4862
5157
|
* MCP client request timeout so the call returns a `pending` liveness snapshot instead of erroring;
|
|
4863
5158
|
* the supervisor re-polls until the worker settles. */
|
|
@@ -5060,6 +5355,7 @@ function createCoordinationTools(opts) {
|
|
|
5060
5355
|
const questionPolicy = opts.questionPolicy ?? "auto";
|
|
5061
5356
|
const completedKeys = /* @__PURE__ */ new Set();
|
|
5062
5357
|
const keyByWorker = /* @__PURE__ */ new Map();
|
|
5358
|
+
const profileNameByWorker = /* @__PURE__ */ new Map();
|
|
5063
5359
|
let unkeyedAssignmentOrdinal = nextUnkeyedAssignmentOrdinal(opts.scope);
|
|
5064
5360
|
for (const [key, prior] of opts.scope.resume?.keys ?? []) if (prior.state === "completed") completedKeys.add(key);
|
|
5065
5361
|
const nodeForWorker = (id) => opts.scope.view.nodes.find((node) => node.id === id) ?? opts.scope.resume?.view.nodes.find((node) => node.id === id);
|
|
@@ -5176,6 +5472,73 @@ function createCoordinationTools(opts) {
|
|
|
5176
5472
|
unwatchWorker(w.id);
|
|
5177
5473
|
};
|
|
5178
5474
|
let pendingSettlement;
|
|
5475
|
+
const workerRouteNames = (workerId) => {
|
|
5476
|
+
const names = /* @__PURE__ */ new Set();
|
|
5477
|
+
const profileName = profileNameByWorker.get(workerId);
|
|
5478
|
+
if (profileName !== void 0) names.add(profileName);
|
|
5479
|
+
const label = nodeForWorker(workerId)?.label;
|
|
5480
|
+
if (label !== void 0) names.add(label);
|
|
5481
|
+
return names;
|
|
5482
|
+
};
|
|
5483
|
+
/** The LIVE worker a route destination names, by profile name first, label second. */
|
|
5484
|
+
const liveWorkerIdNamed = (destination) => {
|
|
5485
|
+
const live = opts.scope.view.nodes.filter((node) => isLive(node.status));
|
|
5486
|
+
return live.find((node) => profileNameByWorker.get(node.id) === destination)?.id ?? live.find((node) => node.label === destination)?.id;
|
|
5487
|
+
};
|
|
5488
|
+
/**
|
|
5489
|
+
* Deliver one routed analyst finding to its destination worker through the SAME authorized
|
|
5490
|
+
* steer machinery a driver steer uses, so the delivery is recorded (`steer` event carrying
|
|
5491
|
+
* `analyst`) and its outcome is a fact. No live destination ⇒ a record-only failed steer —
|
|
5492
|
+
* observable, never a silent drop. A throw here must not kill the settle path: failures are
|
|
5493
|
+
* recorded on the bus (a `steer` with `delivered: false`) before being swallowed, with ONE
|
|
5494
|
+
* narrow exception — a bus that refuses the `delivery-attempt` record itself leaves only the
|
|
5495
|
+
* `instruction` receipt (an attempt with no outcome = explicitly unknown, per
|
|
5496
|
+
* recordDeliveryAttempt's own contract).
|
|
5497
|
+
*/
|
|
5498
|
+
const deliverRoutedFinding = async (route, findings) => {
|
|
5499
|
+
const destination = route.to;
|
|
5500
|
+
const text = route.directive === void 0 || route.directive.length === 0 ? safeJsonText(findings) : `${route.directive}\n\n${safeJsonText(findings)}`;
|
|
5501
|
+
const targetId = liveWorkerIdNamed(destination);
|
|
5502
|
+
if (targetId === void 0) {
|
|
5503
|
+
await bus.publish({
|
|
5504
|
+
type: "steer",
|
|
5505
|
+
down: deepFreezeDetached({
|
|
5506
|
+
receiptId: randomUUID(),
|
|
5507
|
+
toWorker: destination,
|
|
5508
|
+
instruction: text,
|
|
5509
|
+
instructionDigest: canonicalCandidateDigest(text),
|
|
5510
|
+
delivered: false,
|
|
5511
|
+
outcome: "unknown-worker"
|
|
5512
|
+
}),
|
|
5513
|
+
analyst: route.kind
|
|
5514
|
+
}, { queue: false });
|
|
5515
|
+
return;
|
|
5516
|
+
}
|
|
5517
|
+
let instruction;
|
|
5518
|
+
try {
|
|
5519
|
+
instruction = authorizeInstruction("steer", targetId, text, false);
|
|
5520
|
+
await recordInstruction(instruction);
|
|
5521
|
+
} catch (cause) {
|
|
5522
|
+
try {
|
|
5523
|
+
await sendDown("steer", deepFreezeDetached({
|
|
5524
|
+
receiptId: randomUUID(),
|
|
5525
|
+
toWorker: targetId,
|
|
5526
|
+
instruction: text,
|
|
5527
|
+
instructionDigest: canonicalCandidateDigest(text),
|
|
5528
|
+
delivered: false,
|
|
5529
|
+
outcome: "runtime-error",
|
|
5530
|
+
error: cause instanceof Error ? cause.message : String(cause)
|
|
5531
|
+
}), route.kind);
|
|
5532
|
+
} catch {}
|
|
5533
|
+
return;
|
|
5534
|
+
}
|
|
5535
|
+
try {
|
|
5536
|
+
await attemptDelivery(instruction, {
|
|
5537
|
+
steer: instruction.instruction,
|
|
5538
|
+
interrupt: false
|
|
5539
|
+
}, { analyst: route.kind });
|
|
5540
|
+
} catch {}
|
|
5541
|
+
};
|
|
5179
5542
|
const flushPendingSettlement = async () => {
|
|
5180
5543
|
const pending = pendingSettlement;
|
|
5181
5544
|
if (!pending) return false;
|
|
@@ -5183,17 +5546,23 @@ function createCoordinationTools(opts) {
|
|
|
5183
5546
|
commitSettled(pending.settled, pending.worker);
|
|
5184
5547
|
pendingSettlement = void 0;
|
|
5185
5548
|
if (pending.analyze && pending.worker.status === "done" && pending.worker.trace.status === "available" && opts.analysts && opts.analyzeOnSettle?.length) {
|
|
5186
|
-
const
|
|
5187
|
-
|
|
5188
|
-
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5194
|
-
|
|
5195
|
-
|
|
5196
|
-
|
|
5549
|
+
const routes = opts.analyzeOnSettle.map(normalizeAnalyzeOnSettle);
|
|
5550
|
+
const sourceNames = workerRouteNames(pending.worker.id);
|
|
5551
|
+
const applicable = routes.filter((route) => route.over === void 0 || route.over.some((name) => sourceNames.has(name)));
|
|
5552
|
+
if (applicable.length > 0) {
|
|
5553
|
+
const trace = await workerTraceAnalysisStore(pending.worker.trace, opts.blobs);
|
|
5554
|
+
for (const route of applicable) {
|
|
5555
|
+
const findings = await opts.analysts.run(route.kind, trace);
|
|
5556
|
+
await bus.publish({
|
|
5557
|
+
type: "finding",
|
|
5558
|
+
finding: canonicalFindingEvent({
|
|
5559
|
+
fromWorker: pending.worker.id,
|
|
5560
|
+
analyst: route.kind,
|
|
5561
|
+
findings
|
|
5562
|
+
})
|
|
5563
|
+
});
|
|
5564
|
+
if (route.to !== void 0) await deliverRoutedFinding(route, findings);
|
|
5565
|
+
}
|
|
5197
5566
|
}
|
|
5198
5567
|
}
|
|
5199
5568
|
return true;
|
|
@@ -5236,11 +5605,15 @@ function createCoordinationTools(opts) {
|
|
|
5236
5605
|
drained += 1;
|
|
5237
5606
|
}
|
|
5238
5607
|
};
|
|
5239
|
-
async function sendDown(type, down,
|
|
5608
|
+
async function sendDown(type, down, questionIdOrAnalyst) {
|
|
5240
5609
|
await bus.publish(type === "answer" ? {
|
|
5241
5610
|
type,
|
|
5242
5611
|
down,
|
|
5243
|
-
questionId: str(
|
|
5612
|
+
questionId: str(questionIdOrAnalyst, "questionId")
|
|
5613
|
+
} : questionIdOrAnalyst !== void 0 ? {
|
|
5614
|
+
type,
|
|
5615
|
+
down,
|
|
5616
|
+
analyst: questionIdOrAnalyst
|
|
5244
5617
|
} : {
|
|
5245
5618
|
type,
|
|
5246
5619
|
down
|
|
@@ -5306,7 +5679,7 @@ function createCoordinationTools(opts) {
|
|
|
5306
5679
|
if (!isLive(node.status)) return "already-settled";
|
|
5307
5680
|
return "runtime-has-no-inbox";
|
|
5308
5681
|
};
|
|
5309
|
-
const attemptDelivery = async (instruction, message) => {
|
|
5682
|
+
const attemptDelivery = async (instruction, message, origin) => {
|
|
5310
5683
|
await recordDeliveryAttempt(instruction);
|
|
5311
5684
|
let delivered = false;
|
|
5312
5685
|
let outcome;
|
|
@@ -5328,7 +5701,7 @@ function createCoordinationTools(opts) {
|
|
|
5328
5701
|
...error !== void 0 ? { error } : {}
|
|
5329
5702
|
});
|
|
5330
5703
|
if (instruction.kind === "answer") await sendDown("answer", down, str(instruction.questionId, "questionId"));
|
|
5331
|
-
else await sendDown("steer", down);
|
|
5704
|
+
else await sendDown("steer", down, origin?.analyst);
|
|
5332
5705
|
if (error !== void 0) throw new Error(`coordination tools: delivery failed: ${error}`);
|
|
5333
5706
|
return down;
|
|
5334
5707
|
};
|
|
@@ -5496,7 +5869,7 @@ function createCoordinationTools(opts) {
|
|
|
5496
5869
|
raised += 1;
|
|
5497
5870
|
await bus.publish({
|
|
5498
5871
|
type: "finding",
|
|
5499
|
-
finding: {
|
|
5872
|
+
finding: canonicalFindingEvent({
|
|
5500
5873
|
fromWorker: id,
|
|
5501
5874
|
analyst: `online:${signal.detector}`,
|
|
5502
5875
|
findings: {
|
|
@@ -5509,7 +5882,7 @@ function createCoordinationTools(opts) {
|
|
|
5509
5882
|
at: span.endedAt,
|
|
5510
5883
|
progress: readProgress(id)
|
|
5511
5884
|
}
|
|
5512
|
-
}
|
|
5885
|
+
})
|
|
5513
5886
|
});
|
|
5514
5887
|
}
|
|
5515
5888
|
});
|
|
@@ -5637,6 +6010,7 @@ function createCoordinationTools(opts) {
|
|
|
5637
6010
|
if (res.ok) {
|
|
5638
6011
|
watchWorker(res.handle.id);
|
|
5639
6012
|
if (key !== void 0) keyByWorker.set(res.handle.id, key);
|
|
6013
|
+
if (typeof profile.name === "string" && profile.name.length > 0) profileNameByWorker.set(res.handle.id, profile.name);
|
|
5640
6014
|
}
|
|
5641
6015
|
const priorHistory = res.ok && res.prior !== void 0 && res.prior.state !== "completed" ? {
|
|
5642
6016
|
resumed: res.prior.state,
|
|
@@ -6020,7 +6394,7 @@ function createCoordinationTools(opts) {
|
|
|
6020
6394
|
history: () => bus.history(),
|
|
6021
6395
|
raiseFinding: (finding) => bus.publish({
|
|
6022
6396
|
type: "finding",
|
|
6023
|
-
finding
|
|
6397
|
+
finding: canonicalFindingEvent(finding)
|
|
6024
6398
|
}).then(() => void 0),
|
|
6025
6399
|
stats: () => bus.stats(),
|
|
6026
6400
|
isStopped: () => stopped,
|
|
@@ -6050,6 +6424,16 @@ function nextUnkeyedAssignmentOrdinal(scope) {
|
|
|
6050
6424
|
function deepFreezeDetached(value) {
|
|
6051
6425
|
return deepFreeze(structuredClone(value));
|
|
6052
6426
|
}
|
|
6427
|
+
/** Stringify a findings payload for a routed delivery; never throws (a cyclic payload degrades to
|
|
6428
|
+
* its String form rather than killing the settle path). */
|
|
6429
|
+
function safeJsonText(value) {
|
|
6430
|
+
if (typeof value === "string") return value;
|
|
6431
|
+
try {
|
|
6432
|
+
return JSON.stringify(value) ?? String(value);
|
|
6433
|
+
} catch {
|
|
6434
|
+
return String(value);
|
|
6435
|
+
}
|
|
6436
|
+
}
|
|
6053
6437
|
function deepFreeze(value, seen = /* @__PURE__ */ new Set()) {
|
|
6054
6438
|
if (value === null || typeof value !== "object" || seen.has(value)) return value;
|
|
6055
6439
|
seen.add(value);
|
|
@@ -8622,24 +9006,13 @@ async function serveCoordinationMcp(opts) {
|
|
|
8622
9006
|
/** The standing strategy a router-brained supervisor runs with when its profile names no
|
|
8623
9007
|
* `systemPrompt`. The brain's competence IS this prompt: without it the brain has the coordination
|
|
8624
9008
|
* verbs but no policy for WHEN to use them, and either over-spawns or stalls. A profile may override
|
|
8625
|
-
* it for a specific topology.
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
" large, independent (parallelizable), or needs a clean context the current one has filled.",
|
|
8633
|
-
"- Prefer the FEWEST workers that deliver. Over-spawning burns the budget and rarely helps.",
|
|
8634
|
-
"",
|
|
8635
|
-
"Manage the context lifecycle on long work: give each spawned worker a BOUNDED brief — the specific",
|
|
8636
|
-
"sub-task plus only the interfaces/state it needs — never your whole history. When one chapter is",
|
|
8637
|
-
"done, distill what the next chapter needs and spawn fresh, rather than steering one worker until",
|
|
8638
|
-
"its context fills and degrades.",
|
|
8639
|
-
"",
|
|
8640
|
-
"Wait on real signals (await a settle, answer a blocking question), integrate the result, and stop",
|
|
8641
|
-
"as soon as the deliverable is met."
|
|
8642
|
-
].join("\n");
|
|
9009
|
+
* it for a specific topology.
|
|
9010
|
+
*
|
|
9011
|
+
* This is the registry's ONE supervisor policy (`supervisor/policy`), not this module's own text:
|
|
9012
|
+
* the delegate front door (`supervisorInstructions`) derives from the same entry, so which front
|
|
9013
|
+
* door built the supervisor no longer decides its work-vs-delegate policy — the package used to
|
|
9014
|
+
* ship two contradictory defaults selected by entry point. */
|
|
9015
|
+
const defaultSupervisorPrompt = supervisorPolicyPrompt.text;
|
|
8643
9016
|
/** Longest prompt excerpt an error message may carry. A supervisor system prompt is routinely
|
|
8644
9017
|
* thousands of characters; two of them interpolated whole turn a configuration fault into an
|
|
8645
9018
|
* unreadable wall, so a fault reports each prompt's LENGTH plus a leading excerpt instead. */
|
|
@@ -8688,9 +9061,8 @@ function resolveSupervisorSystemPrompt(profile, activePrompt) {
|
|
|
8688
9061
|
* applies, exactly as when `model` is absent.
|
|
8689
9062
|
*/
|
|
8690
9063
|
function resolveSupervisorModelId(profile) {
|
|
8691
|
-
if (typeof profile.model === "string") return profile.model;
|
|
8692
|
-
|
|
8693
|
-
return typeof fromHints === "string" && fromHints.length > 0 ? fromHints : void 0;
|
|
9064
|
+
if (typeof profile.model === "string") return concreteModelId(profile.model);
|
|
9065
|
+
return concreteModelId(profile.model?.default);
|
|
8694
9066
|
}
|
|
8695
9067
|
/**
|
|
8696
9068
|
* Reduce either profile spelling — a hand-written `SupervisorProfile` or a canonical `AgentProfile`
|
|
@@ -8973,6 +9345,20 @@ function externalExecutionId(kind, identity) {
|
|
|
8973
9345
|
}).slice(7)}`;
|
|
8974
9346
|
}
|
|
8975
9347
|
/**
|
|
9348
|
+
* The `trace-unpropagated` declaration for a worker backend, or `undefined` when the backend HAS a
|
|
9349
|
+
* propagation channel. The census (`WORKER_TRACE_PROPAGATION`) says WHETHER a backend propagates;
|
|
9350
|
+
* this maps the non-propagating arms to WHY: `router`/`router-tools`/`provider` have no worker
|
|
9351
|
+
* process to inherit an environment, `bridge`/`cli-worktree` have a worker but no environment
|
|
9352
|
+
* channel through their transport.
|
|
9353
|
+
*/
|
|
9354
|
+
function workerTraceUnpropagatedDeclaration(backend) {
|
|
9355
|
+
if (WORKER_TRACE_PROPAGATION[backend]) return void 0;
|
|
9356
|
+
return {
|
|
9357
|
+
backend,
|
|
9358
|
+
reason: backend === "router" || backend === "router-tools" || backend === "provider" ? "no-worker-process" : "no-env-channel"
|
|
9359
|
+
};
|
|
9360
|
+
}
|
|
9361
|
+
/**
|
|
8976
9362
|
* NOT a harness-name test — `ExecutorConfig.backend` is a discriminated-union TAG naming HOW a
|
|
8977
9363
|
* profile is materialized (bridge / sandbox / cli-worktree / router / cli / provider), which is a
|
|
8978
9364
|
* different axis from WHICH CLI runs. An exhaustive switch on a closed union tag is the correct
|
|
@@ -9519,6 +9905,7 @@ function supervise(profile, task, opts) {
|
|
|
9519
9905
|
assertProfileContract(canonicalProfile, isExternalSupervisor(canonicalProfile) ? driverMaterialization : options.brain ? promptControlProfileMaterialization : routerSupervisorProfileMaterialization, "supervise root");
|
|
9520
9906
|
const now = options.now ?? Date.now;
|
|
9521
9907
|
let spans;
|
|
9908
|
+
const traceUnpropagated = options.backend ? workerTraceUnpropagatedDeclaration(options.backend.backend) : void 0;
|
|
9522
9909
|
let makeWorkerAgent = options.makeWorkerAgent;
|
|
9523
9910
|
if (!makeWorkerAgent) {
|
|
9524
9911
|
if (!options.backend) throw new ValidationError("supervise: provide opts.backend (where workers run) or opts.makeWorkerAgent");
|
|
@@ -9705,7 +10092,8 @@ function supervise(profile, task, opts) {
|
|
|
9705
10092
|
...options.now ? { now: options.now } : {},
|
|
9706
10093
|
...options.signal ? { signal: options.signal } : {},
|
|
9707
10094
|
...hooks ? { hooks } : {},
|
|
9708
|
-
...recorder ? { workerTrace: recorder.workerTrace } : {}
|
|
10095
|
+
...recorder ? { workerTrace: recorder.workerTrace } : {},
|
|
10096
|
+
...recorder && traceUnpropagated ? { workerTraceUnpropagated: traceUnpropagated } : {}
|
|
9709
10097
|
});
|
|
9710
10098
|
if (!recorder) return run;
|
|
9711
10099
|
try {
|
|
@@ -9720,6 +10108,6 @@ function supervise(profile, task, opts) {
|
|
|
9720
10108
|
return start();
|
|
9721
10109
|
}
|
|
9722
10110
|
//#endregion
|
|
9723
|
-
export { allOf as $, DELEGATE_DESCRIPTION as A,
|
|
10111
|
+
export { allOf as $, naiveContinuationPrompt as $t, DELEGATE_DESCRIPTION as A, createSandboxForSpec as At, DELEGATION_TRACE_MAX_SPANS as B, assessAuthoredProfile as Bt, createDelegateUiAuditHandler as C, createWorktreeCliExecutor as Ct, DELEGATE_FEEDBACK_TOOL_NAME as D, decodeToolPart as Dt, DELEGATE_FEEDBACK_INPUT_SCHEMA as E, createPushTraceSource as Et, defaultDelegateBudget as F, probeSandboxCapabilities as Ft, DelegationPersistenceError as G, supervisorInstructions as Gt, capDelegationTrace as H, canonicalizeAuthoredProfile as Ht, delegate as I, acquireSandbox as It, InMemoryDelegationStore as J, delegatesWorkerBriefPrompt as Jt, DelegationStateCorruptError as K, analyzesFindingsReportPrompt as Kt, DelegationTaskQueue as L, FileCoordinationLog as Lt, DELEGATE_TOOL_NAME as M, runAgentRounds as Mt, createDelegateHandler as N, runLoop as Nt, createDelegateFeedbackHandler as O, sandboxSessionTraceSource as Ot, validateDelegateArgs as P, createSandboxLineage as Pt, finalizeBestDelivered as Q, kernelPromptRegistry as Qt, hashIdempotencyInput as R, createSupervisorSpanRecorder as Rt, DELEGATE_UI_AUDIT_TOOL_NAME as S, createExecutorRegistry as St, DELEGATE_FEEDBACK_DESCRIPTION as T, createSteerableSandboxSession as Tt, composeLoopTraceEmitters as U, defaultProfileRichnessThresholds as Ut, buildDelegationTraceSpans as V, authoredWorker as Vt, createDelegationTraceCollector as W, profileRichnessFinding as Wt, eventToSnapshot as X, dumbContinuationPassPrompt as Xt, InMemoryFeedbackStore as Y, dumbContinuationFailPrompt as Yt, driverAgent as Z, formatPromptHandle as Zt, DELEGATION_HISTORY_TOOL_NAME as _, watchTrace as _t, resolveSupervisorProfile as a, sampleFromSettled as at, DELEGATE_UI_AUDIT_DESCRIPTION as b, cliWorktreeExecutor as bt, createInProcessTransport as c, bestSoFar as ct, DELEGATION_STATUS_INPUT_SCHEMA as d, DEFAULT_AWAIT_EVENT_TIMEOUT_MS as dt, promptHandle as en, allWorkersStalled as et, DELEGATION_STATUS_TOOL_NAME as f, canonicalFindingEvent as ft, DELEGATION_HISTORY_INPUT_SCHEMA as g, defaultToolDetectors as gt, DELEGATION_HISTORY_DESCRIPTION as h, createEventBus as ht, assertCoordinationBinding as i, plateau as it, DELEGATE_INPUT_SCHEMA as j, defaultSelectWinner as jt, validateDelegateFeedbackArgs as k, createInbox as kt, createMcpServer as l, plateauLength as lt, validateDelegationStatusArgs as m, normalizeAnalyzeOnSettle as mt, supervise as n, gateOnDeliverable as nn, createProgressTracker as nt, supervisorAgent as o, anytimeReport as ot, createDelegationStatusHandler as p, createCoordinationTools as pt, FileDelegationStore as q, createPromptRegistry as qt, workerFromBackend as r, noProgressFor as rt, serveCoordinationMcp as s, areaUnderCurve as st, DEFAULT_AUTHORED_PROFILE_SECURITY_POLICY as t, supervisorPolicyPrompt as tn, anyOf as tt, DELEGATION_STATUS_DESCRIPTION as u, renderAnytimeTable as ut, createDelegationHistoryHandler as v, createFileRunContext as vt, validateDelegateUiAuditArgs as w, DEFAULT_SANDBOX_STEERING_MAX_TURNS as wt, DELEGATE_UI_AUDIT_INPUT_SCHEMA as x, createExecutor as xt, validateDelegationHistoryArgs as y, createInMemoryRunContext as yt, DELEGATION_TRACE_MAX_BYTES as z, asAuthoredProfile as zt };
|
|
9724
10112
|
|
|
9725
|
-
//# sourceMappingURL=supervise-
|
|
10113
|
+
//# sourceMappingURL=supervise-Cx24b3lw.js.map
|