@tangle-network/agent-runtime 0.47.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +79 -15
  2. package/dist/agent.js +1 -1
  3. package/dist/chunk-GHX7XOJ2.js +433 -0
  4. package/dist/chunk-GHX7XOJ2.js.map +1 -0
  5. package/dist/{chunk-T4OQQEE3.js → chunk-IQS4HI3F.js} +14 -5
  6. package/dist/chunk-IQS4HI3F.js.map +1 -0
  7. package/dist/{chunk-72JQCHOZ.js → chunk-PXUTIMGJ.js} +2318 -237
  8. package/dist/chunk-PXUTIMGJ.js.map +1 -0
  9. package/dist/{chunk-MGFEUYOH.js → chunk-U2VEWKKK.js} +3 -3
  10. package/dist/{chunk-JNPK46YH.js → chunk-VIEDXELL.js} +408 -6
  11. package/dist/chunk-VIEDXELL.js.map +1 -0
  12. package/dist/{chunk-VR4JIC5H.js → chunk-XTEZ3YJ4.js} +2 -2
  13. package/dist/index.d.ts +29 -4
  14. package/dist/index.js +109 -21
  15. package/dist/index.js.map +1 -1
  16. package/dist/kb-gate-CsXpNRk7.d.ts +1145 -0
  17. package/dist/{loop-runner-bin-DEm4roYF.d.ts → loop-runner-bin-Cgn0A-NW.d.ts} +1 -1
  18. package/dist/loop-runner-bin.d.ts +2 -2
  19. package/dist/loop-runner-bin.js +3 -3
  20. package/dist/loops.d.ts +3 -3
  21. package/dist/loops.js +57 -1
  22. package/dist/mcp/bin.js +187 -24
  23. package/dist/mcp/bin.js.map +1 -1
  24. package/dist/mcp/index.d.ts +28 -125
  25. package/dist/mcp/index.js +28 -6
  26. package/dist/mcp/index.js.map +1 -1
  27. package/dist/platform.js +2 -2
  28. package/dist/platform.js.map +1 -1
  29. package/dist/runtime.d.ts +1100 -62
  30. package/dist/runtime.js +57 -1
  31. package/dist/{types-Cbx3dNK5.d.ts → types-BpDfCPUp.d.ts} +1 -1
  32. package/dist/workflow.js +1 -1
  33. package/package.json +7 -6
  34. package/dist/chunk-5YDS7BLC.js +0 -218
  35. package/dist/chunk-5YDS7BLC.js.map +0 -1
  36. package/dist/chunk-72JQCHOZ.js.map +0 -1
  37. package/dist/chunk-JNPK46YH.js.map +0 -1
  38. package/dist/chunk-T4OQQEE3.js.map +0 -1
  39. package/dist/kb-gate-51BlLlVM.d.ts +0 -529
  40. /package/dist/{chunk-MGFEUYOH.js.map → chunk-U2VEWKKK.js.map} +0 -0
  41. /package/dist/{chunk-VR4JIC5H.js.map → chunk-XTEZ3YJ4.js.map} +0 -0
package/dist/runtime.js CHANGED
@@ -6,7 +6,13 @@ import {
6
6
  InMemoryResultBlobStore,
7
7
  InMemorySpawnJournal,
8
8
  acquireSandbox,
9
+ adaptiveRefine,
10
+ anytimeReport,
11
+ assertStrategyContract,
9
12
  assertTraceDerivedFindings,
13
+ auditIntent,
14
+ authorStrategy,
15
+ breadthDriver,
10
16
  buildSteerContext,
11
17
  builtinShapes,
12
18
  completionAuthorizes,
@@ -15,6 +21,7 @@ import {
15
21
  createDriver,
16
22
  createExecutor,
17
23
  createExecutorRegistry,
24
+ createMcpEnvironment,
18
25
  createRootHandle,
19
26
  createSandboxForSpec,
20
27
  createSandboxLineage,
@@ -22,14 +29,23 @@ import {
22
29
  createScopeAnalyst,
23
30
  createShapeRegistry,
24
31
  createSupervisor,
32
+ createVerifierEnvironment,
33
+ createWaterfallCollector,
34
+ defaultAnalystInstruction,
35
+ defaultAuditorInstruction,
25
36
  defaultSelectWinner,
26
37
  definePersona,
38
+ defineStrategy,
39
+ depthDriver,
27
40
  deterministicCompletion,
41
+ discriminatingMeans,
28
42
  equalKOnCost,
29
43
  fanout,
30
44
  flatWidenGate,
31
45
  gitWorkspace,
46
+ harvestCorpus,
32
47
  inlineSandboxClient,
48
+ jjWorkspace,
33
49
  localShell,
34
50
  loopDispatch,
35
51
  loopUntil,
@@ -37,24 +53,36 @@ import {
37
53
  observe,
38
54
  openSandboxRun,
39
55
  panel,
56
+ pickChampion,
40
57
  pipeline,
58
+ printBenchmarkReport,
41
59
  probeSandboxCapabilities,
60
+ promotionGate,
61
+ refine,
42
62
  registerShape,
43
63
  renderAnalyses,
64
+ renderAnytimeTable,
44
65
  renderCorpusToInstructions,
45
66
  renderReport,
46
67
  replaySpawnTree,
47
68
  reportLoopUsage,
69
+ runAgentic,
70
+ runBenchmark,
48
71
  runLoop,
49
72
  runPersonified,
73
+ runStrategyEvolution,
74
+ sample,
75
+ sampleThenRefine,
76
+ selectChampion,
50
77
  sentinelCompletion,
51
78
  settledToIteration,
52
79
  spendFromUsageEvents,
53
80
  stopSentinel,
81
+ strategyAuthorContract,
54
82
  trajectoryReport,
55
83
  verify,
56
84
  widen
57
- } from "./chunk-72JQCHOZ.js";
85
+ } from "./chunk-PXUTIMGJ.js";
58
86
  import {
59
87
  extractLlmCallEvent,
60
88
  mapSandboxEvent
@@ -68,7 +96,13 @@ export {
68
96
  InMemoryResultBlobStore,
69
97
  InMemorySpawnJournal,
70
98
  acquireSandbox,
99
+ adaptiveRefine,
100
+ anytimeReport,
101
+ assertStrategyContract,
71
102
  assertTraceDerivedFindings,
103
+ auditIntent,
104
+ authorStrategy,
105
+ breadthDriver,
72
106
  buildSteerContext,
73
107
  builtinShapes,
74
108
  completionAuthorizes,
@@ -77,6 +111,7 @@ export {
77
111
  createDriver,
78
112
  createExecutor,
79
113
  createExecutorRegistry,
114
+ createMcpEnvironment,
80
115
  createRootHandle,
81
116
  createSandboxForSpec,
82
117
  createSandboxLineage,
@@ -84,15 +119,24 @@ export {
84
119
  createScopeAnalyst,
85
120
  createShapeRegistry,
86
121
  createSupervisor,
122
+ createVerifierEnvironment,
123
+ createWaterfallCollector,
124
+ defaultAnalystInstruction,
125
+ defaultAuditorInstruction,
87
126
  defaultSelectWinner,
88
127
  definePersona,
128
+ defineStrategy,
129
+ depthDriver,
89
130
  deterministicCompletion,
131
+ discriminatingMeans,
90
132
  equalKOnCost,
91
133
  extractLlmCallEvent,
92
134
  fanout,
93
135
  flatWidenGate,
94
136
  gitWorkspace,
137
+ harvestCorpus,
95
138
  inlineSandboxClient,
139
+ jjWorkspace,
96
140
  localShell,
97
141
  loopDispatch,
98
142
  loopUntil,
@@ -101,20 +145,32 @@ export {
101
145
  observe,
102
146
  openSandboxRun,
103
147
  panel,
148
+ pickChampion,
104
149
  pipeline,
150
+ printBenchmarkReport,
105
151
  probeSandboxCapabilities,
152
+ promotionGate,
153
+ refine,
106
154
  registerShape,
107
155
  renderAnalyses,
156
+ renderAnytimeTable,
108
157
  renderCorpusToInstructions,
109
158
  renderReport,
110
159
  replaySpawnTree,
111
160
  reportLoopUsage,
161
+ runAgentic,
162
+ runBenchmark,
112
163
  runLoop,
113
164
  runPersonified,
165
+ runStrategyEvolution,
166
+ sample,
167
+ sampleThenRefine,
168
+ selectChampion,
114
169
  sentinelCompletion,
115
170
  settledToIteration,
116
171
  spendFromUsageEvents,
117
172
  stopSentinel,
173
+ strategyAuthorContract,
118
174
  trajectoryReport,
119
175
  verify,
120
176
  widen
@@ -435,4 +435,4 @@ interface WidenGate<Out> {
435
435
  readonly judgeExempt?: boolean;
436
436
  }
437
437
 
438
- export type { Agent as A, Budget as B, ExecutorFactory as E, Handle as H, NodeId as N, ResultBlobStore as R, Scope as S, TreeView as T, UsageEvent as U, WidenGate as W, SpawnJournal as a, SpawnEvent as b, Settled as c, AgentSpec as d, ExecutorRegistry as e, RootHandle as f, SupervisedResult as g, Spend as h, Supervisor as i, Executor as j, ExecutorContext as k, ExecutorResult as l, NodeSnapshot as m, NodeStatus as n, Restart as o, RootSignal as p, Runtime as q, SpawnOpts as r, SupervisorOpts as s };
438
+ export type { Agent as A, Budget as B, ExecutorRegistry as E, Handle as H, NodeId as N, ResultBlobStore as R, Scope as S, TreeView as T, UsageEvent as U, WidenGate as W, SpawnJournal as a, SpawnEvent as b, Settled as c, AgentSpec as d, RootHandle as e, SupervisedResult as f, Spend as g, ExecutorFactory as h, Supervisor as i, Executor as j, ExecutorContext as k, ExecutorResult as l, NodeSnapshot as m, NodeStatus as n, Restart as o, RootSignal as p, Runtime as q, SpawnOpts as r, SupervisorOpts as s };
package/dist/workflow.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  createSandboxForSpec,
3
3
  describeSandboxPlacement,
4
4
  runLoop
5
- } from "./chunk-72JQCHOZ.js";
5
+ } from "./chunk-PXUTIMGJ.js";
6
6
  import {
7
7
  ValidationError,
8
8
  extractLlmCallEvent
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-runtime",
3
- "version": "0.47.0",
3
+ "version": "0.49.0",
4
4
  "description": "Shared task-lifecycle skeleton for agents: a recursive loop kernel for chat turns, one-shot tasks, and multi-attempt loops, with trace capture and eval-gated self-improvement. Domain behavior lives in adapters; scoring and ship-gates in @tangle-network/agent-eval.",
5
5
  "homepage": "https://github.com/tangle-network/agent-runtime#readme",
6
6
  "repository": {
@@ -95,14 +95,14 @@
95
95
  "test:watch": "vitest",
96
96
  "lint": "biome check src tests examples",
97
97
  "lint:fix": "biome check --write src tests examples",
98
- "typecheck": "tsc --noEmit",
98
+ "typecheck": "tsc --noEmit && pnpm run typecheck:examples",
99
99
  "typecheck:examples": "tsc --noEmit -p tsconfig.examples.json",
100
100
  "verify:package": "node scripts/verify-package-exports.mjs"
101
101
  },
102
102
  "devDependencies": {
103
103
  "@biomejs/biome": "^2.4.0",
104
- "@tangle-network/agent-eval": "^0.83.0",
105
- "@tangle-network/sandbox": "^0.4.0",
104
+ "@tangle-network/agent-eval": "^0.89.0",
105
+ "@tangle-network/sandbox": "^0.6.0",
106
106
  "@types/node": "^25.6.0",
107
107
  "playwright": "^1.40.0",
108
108
  "tsup": "^8.0.0",
@@ -112,7 +112,8 @@
112
112
  "pnpm": {
113
113
  "minimumReleaseAge": 4320,
114
114
  "minimumReleaseAgeExclude": [
115
- "@tangle-network/agent-eval"
115
+ "@tangle-network/agent-eval",
116
+ "@tangle-network/sandbox"
116
117
  ],
117
118
  "onlyBuiltDependencies": [
118
119
  "esbuild"
@@ -126,7 +127,7 @@
126
127
  "peerDependencies": {
127
128
  "@tangle-network/agent-eval": ">=0.83.0 <1.0.0",
128
129
  "@tangle-network/agent-knowledge": ">=1.3.0 <2.0.0",
129
- "@tangle-network/sandbox": ">=0.1.2 <0.5.0",
130
+ "@tangle-network/sandbox": ">=0.1.2 <0.7.0",
130
131
  "playwright": "^1.40.0"
131
132
  },
132
133
  "peerDependenciesMeta": {
@@ -1,218 +0,0 @@
1
- import {
2
- coderProfile,
3
- multiHarnessCoderFanout
4
- } from "./chunk-KADIJAD4.js";
5
- import {
6
- runLoop
7
- } from "./chunk-72JQCHOZ.js";
8
-
9
- // src/mcp/executor.ts
10
- function createSiblingSandboxExecutor(options) {
11
- const underlying = options.client;
12
- const client = {
13
- create(opts) {
14
- return underlying.create(opts);
15
- },
16
- describePlacement(box) {
17
- return { kind: "sibling", sandboxId: readId(box) };
18
- }
19
- };
20
- return {
21
- client,
22
- describe() {
23
- return "sibling-sandbox (each delegation = fresh sandbox via client.create)";
24
- }
25
- };
26
- }
27
- function createFleetWorkspaceExecutor(options) {
28
- const fleet = options.fleet;
29
- const exclude = new Set(options.excludeMachineIds ?? []);
30
- let callIndex = 0;
31
- const placementBySandboxId = /* @__PURE__ */ new Map();
32
- const client = {
33
- async create() {
34
- const ids = fleet.ids.filter((id) => !exclude.has(id));
35
- if (ids.length === 0) {
36
- throw new Error(
37
- `agent-runtime: fleet ${fleet.fleetId} has no eligible worker machines (ids=[${fleet.ids.join(",")}], excluded=[${[...exclude].join(",")}])`
38
- );
39
- }
40
- const selector = options.selectMachine;
41
- const machineId = selector ? selector({ callIndex, ids }) : ids[callIndex % ids.length];
42
- callIndex += 1;
43
- if (typeof machineId !== "string" || machineId.length === 0) {
44
- throw new Error("agent-runtime: fleet executor selectMachine returned an empty machine id");
45
- }
46
- const box = await fleet.sandbox(machineId);
47
- const sandboxId = readId(box);
48
- if (sandboxId) placementBySandboxId.set(sandboxId, { machineId });
49
- return box;
50
- },
51
- describePlacement(box) {
52
- const sandboxId = readId(box);
53
- const recorded = sandboxId ? placementBySandboxId.get(sandboxId) : void 0;
54
- return {
55
- kind: "fleet",
56
- sandboxId,
57
- fleetId: fleet.fleetId,
58
- machineId: recorded?.machineId
59
- };
60
- }
61
- };
62
- return {
63
- client,
64
- describe() {
65
- const excluded = exclude.size > 0 ? ` (excluded=[${[...exclude].join(",")}])` : "";
66
- return `fleet-workspace (fleetId=${fleet.fleetId}, machines=[${fleet.ids.join(",")}]${excluded})`;
67
- }
68
- };
69
- }
70
- function readId(box) {
71
- const raw = box.id;
72
- return typeof raw === "string" && raw.length > 0 ? raw : void 0;
73
- }
74
-
75
- // src/mcp/delegates.ts
76
- function createDefaultCoderDelegate(options) {
77
- const executor = resolveExecutor(options);
78
- const sandboxClient = executor.client;
79
- const fanoutHarnesses = options.fanoutHarnesses;
80
- const maxConcurrency = options.maxConcurrency ?? 4;
81
- const traceEmitter = options.traceEmitter;
82
- return async (args, ctx) => {
83
- const task = {
84
- goal: buildCoderGoal(args),
85
- repoRoot: args.repoRoot,
86
- testCmd: args.config?.testCmd,
87
- typecheckCmd: args.config?.typecheckCmd,
88
- forbiddenPaths: args.config?.forbiddenPaths,
89
- maxDiffLines: args.config?.maxDiffLines
90
- };
91
- const variants = Math.max(1, Math.trunc(args.variants ?? 1));
92
- ctx.report({ iteration: 0, phase: "starting" });
93
- if (variants <= 1) {
94
- const { agentRunSpec, output, validator } = coderProfile({
95
- task,
96
- ...options.harness ? { harness: options.harness } : {},
97
- ...options.model ? { model: options.model } : {}
98
- });
99
- const result2 = await runLoop({
100
- driver: singleShotDriver,
101
- agentRun: agentRunSpec,
102
- output,
103
- validator,
104
- task,
105
- ctx: { sandboxClient, signal: ctx.signal, ...traceEmitter ? { traceEmitter } : {} },
106
- maxIterations: 1,
107
- maxConcurrency
108
- });
109
- const chosen2 = await pickCoderWinner({
110
- iterations: result2.iterations,
111
- reviewer: options.reviewer,
112
- selection: options.winnerSelection ?? "highest-score",
113
- task,
114
- signal: ctx.signal
115
- });
116
- if (!chosen2) throw new Error(noWinnerMessage(options.reviewer));
117
- ctx.report({ iteration: 1, phase: "completed" });
118
- return chosen2;
119
- }
120
- const fanout = multiHarnessCoderFanout({
121
- ...fanoutHarnesses && fanoutHarnesses.length > 0 ? { harnesses: fanoutHarnesses.slice(0, variants) } : {},
122
- ...options.fanoutModels ? { models: options.fanoutModels.slice(0, variants) } : {}
123
- });
124
- const agentRuns = fanout.agentRuns.slice(0, variants);
125
- const result = await runLoop({
126
- driver: fanout.driver,
127
- agentRuns,
128
- output: fanout.output,
129
- validator: fanout.validator,
130
- task,
131
- ctx: { sandboxClient, signal: ctx.signal, ...traceEmitter ? { traceEmitter } : {} },
132
- maxIterations: variants,
133
- maxConcurrency: Math.min(maxConcurrency, variants)
134
- });
135
- const chosen = await pickCoderWinner({
136
- iterations: result.iterations,
137
- reviewer: options.reviewer,
138
- selection: options.winnerSelection ?? "highest-score",
139
- task,
140
- signal: ctx.signal
141
- });
142
- if (!chosen) throw new Error(noWinnerMessage(options.reviewer));
143
- ctx.report({ iteration: agentRuns.length, phase: "completed" });
144
- return chosen;
145
- };
146
- }
147
- async function pickCoderWinner(args) {
148
- const valid = [];
149
- for (const iter of args.iterations) {
150
- if (iter.output === void 0 || iter.error || iter.verdict?.valid !== true) continue;
151
- valid.push({
152
- index: iter.index,
153
- output: iter.output,
154
- score: iter.verdict.score ?? 0,
155
- readiness: iter.verdict.score ?? 0
156
- });
157
- }
158
- if (valid.length === 0) return void 0;
159
- let eligible = valid;
160
- if (args.reviewer) {
161
- eligible = [];
162
- for (const c of valid) {
163
- const review = await args.reviewer(c.output, args.task, { signal: args.signal });
164
- if (review.approved) eligible.push({ ...c, readiness: review.readiness });
165
- }
166
- if (eligible.length === 0) return void 0;
167
- }
168
- return selectCoderCandidate(eligible, args.selection).output;
169
- }
170
- function selectCoderCandidate(candidates, selection) {
171
- const diffLines = (c) => c.output.diffStats.insertions + c.output.diffStats.deletions;
172
- const sorted = [...candidates].sort((a, b) => {
173
- switch (selection) {
174
- case "smallest-diff":
175
- return diffLines(a) - diffLines(b) || a.index - b.index;
176
- case "highest-readiness":
177
- return b.readiness - a.readiness || a.index - b.index;
178
- case "first-approved":
179
- return a.index - b.index;
180
- default:
181
- return b.score - a.score || a.index - b.index;
182
- }
183
- });
184
- return sorted[0];
185
- }
186
- function noWinnerMessage(reviewer) {
187
- return reviewer ? "coder delegate: no candidate passed validation + review" : "coder delegate: no candidate passed validation";
188
- }
189
- function buildCoderGoal(args) {
190
- if (!args.contextHint) return args.goal;
191
- return [args.goal, "", "## Context", args.contextHint].join("\n");
192
- }
193
- function resolveExecutor(options) {
194
- if (options.executor && options.sandboxClient) {
195
- throw new Error("createDefaultCoderDelegate: pass exactly one of `executor` or `sandboxClient`");
196
- }
197
- if (options.executor) return options.executor;
198
- if (options.sandboxClient) {
199
- return createSiblingSandboxExecutor({ client: options.sandboxClient });
200
- }
201
- throw new Error("createDefaultCoderDelegate: `executor` or `sandboxClient` is required");
202
- }
203
- var singleShotDriver = {
204
- name: "mcp-single-shot",
205
- async plan(task, history) {
206
- return history.length === 0 ? [task] : [];
207
- },
208
- decide(history) {
209
- return history.length > 0 ? "pick-winner" : "fail";
210
- }
211
- };
212
-
213
- export {
214
- createSiblingSandboxExecutor,
215
- createFleetWorkspaceExecutor,
216
- createDefaultCoderDelegate
217
- };
218
- //# sourceMappingURL=chunk-5YDS7BLC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mcp/executor.ts","../src/mcp/delegates.ts"],"sourcesContent":["/**\n * @experimental\n *\n * Delegation executors — the layer between MCP delegates and the sandbox\n * substrate. Each executor exposes a {@link SandboxClient} the kernel\n * consumes plus a placement tag so the trace pipeline can correlate workers\n * with their physical placement.\n *\n * Two implementations ship in-box:\n *\n * - {@link createSiblingSandboxExecutor} — every delegation spawns a fresh\n * sandbox sibling to the caller. Default when the MCP server runs as a\n * standalone CLI mounted outside a fleet.\n *\n * - {@link createFleetWorkspaceExecutor} — delegations dispatch onto machines\n * in the caller's existing fleet so worker diffs land directly on the\n * caller's filesystem (the fleet's shared workspace). Selected when the\n * parent sandbox passes `TANGLE_FLEET_ID` into the MCP server's env.\n */\n\nimport type { CreateSandboxOptions, SandboxInstance } from '@tangle-network/sandbox'\nimport type { LoopSandboxPlacement, SandboxClient } from '../runtime'\n\n/** @experimental */\nexport interface DelegationExecutor {\n /** Sandbox client the kernel calls. Returned with `describePlacement` set. */\n readonly client: SandboxClient\n /** Best-effort one-liner used in stderr boot logs and diagnostics. */\n describe(): string\n}\n\n/** @experimental */\nexport interface SiblingSandboxExecutorOptions {\n client: SandboxClient\n}\n\n/**\n * Wrap a raw sandbox SDK client so the kernel emits\n * `loop.iteration.dispatch` events with `{ placement: 'sibling', sandboxId }`.\n *\n * The returned client `.create()` delegates to the underlying client; the\n * only added behavior is a `describePlacement` tag the kernel reads.\n *\n * @experimental\n */\nexport function createSiblingSandboxExecutor(\n options: SiblingSandboxExecutorOptions,\n): DelegationExecutor {\n const underlying = options.client\n const client: SandboxClient = {\n create(opts?: CreateSandboxOptions): Promise<SandboxInstance> {\n return underlying.create(opts)\n },\n describePlacement(box: SandboxInstance): LoopSandboxPlacement {\n return { kind: 'sibling', sandboxId: readId(box) }\n },\n }\n return {\n client,\n describe(): string {\n return 'sibling-sandbox (each delegation = fresh sandbox via client.create)'\n },\n }\n}\n\n/**\n * Minimal `SandboxFleet` surface the fleet executor calls. Declared\n * structurally so tests can pass an in-memory stub without instantiating the\n * sandbox SDK.\n *\n * @experimental\n */\nexport interface FleetHandle {\n readonly fleetId: string\n /** Machine ids in dispatch-eligible order. The executor round-robins. */\n readonly ids: ReadonlyArray<string>\n /** Resolve a machine id to its `SandboxInstance` — that machine is mounted\n * on the fleet's shared workspace, so any diff the worker writes lands on\n * every other fleet machine's filesystem too. */\n sandbox(machineId: string): Promise<SandboxInstance>\n}\n\n/** @experimental */\nexport interface FleetWorkspaceExecutorOptions {\n fleet: FleetHandle\n /**\n * Override the machine-selection policy. Default = round-robin across\n * `fleet.ids`, skipping the optional `excludeMachineIds` set (typically the\n * coordinator machine the MCP server is running on).\n */\n selectMachine?: (call: { callIndex: number; ids: ReadonlyArray<string> }) => string\n /**\n * Machine ids to skip during default round-robin. Set to the caller's own\n * machineId so workers don't compete with the orchestrator on the same VM.\n */\n excludeMachineIds?: ReadonlyArray<string>\n}\n\n/**\n * Build an executor that resolves each delegated iteration to an existing\n * machine in `fleet`. The fleet's shared-workspace policy means the worker\n * machine sees the caller's filesystem — diffs land in-place with no\n * cross-sandbox copy step.\n *\n * @experimental\n */\nexport function createFleetWorkspaceExecutor(\n options: FleetWorkspaceExecutorOptions,\n): DelegationExecutor {\n const fleet = options.fleet\n const exclude = new Set(options.excludeMachineIds ?? [])\n let callIndex = 0\n // machineId-by-sandboxId, populated as we resolve machines so\n // `describePlacement` can recover the assignment from the SandboxInstance\n // the kernel hands back.\n const placementBySandboxId = new Map<string, { machineId: string }>()\n\n const client: SandboxClient = {\n async create(): Promise<SandboxInstance> {\n const ids = fleet.ids.filter((id) => !exclude.has(id))\n if (ids.length === 0) {\n throw new Error(\n `agent-runtime: fleet ${fleet.fleetId} has no eligible worker machines (ids=[${fleet.ids.join(',')}], excluded=[${[...exclude].join(',')}])`,\n )\n }\n const selector = options.selectMachine\n const machineId = selector ? selector({ callIndex, ids }) : ids[callIndex % ids.length]\n callIndex += 1\n if (typeof machineId !== 'string' || machineId.length === 0) {\n throw new Error('agent-runtime: fleet executor selectMachine returned an empty machine id')\n }\n const box = await fleet.sandbox(machineId)\n const sandboxId = readId(box)\n if (sandboxId) placementBySandboxId.set(sandboxId, { machineId })\n return box\n },\n describePlacement(box: SandboxInstance): LoopSandboxPlacement {\n const sandboxId = readId(box)\n const recorded = sandboxId ? placementBySandboxId.get(sandboxId) : undefined\n return {\n kind: 'fleet',\n sandboxId,\n fleetId: fleet.fleetId,\n machineId: recorded?.machineId,\n }\n },\n }\n\n return {\n client,\n describe(): string {\n const excluded = exclude.size > 0 ? ` (excluded=[${[...exclude].join(',')}])` : ''\n return `fleet-workspace (fleetId=${fleet.fleetId}, machines=[${fleet.ids.join(',')}]${excluded})`\n },\n }\n}\n\nfunction readId(box: SandboxInstance): string | undefined {\n const raw = (box as unknown as { id?: unknown }).id\n return typeof raw === 'string' && raw.length > 0 ? raw : undefined\n}\n","/**\n * @experimental\n *\n * Delegate factories — the layer between MCP tool handlers and the\n * underlying `runLoop` runners.\n *\n * The MCP server is profile-agnostic: it owns the task queue + feedback\n * store + transport. Each `*Delegate` is the closure that the queue\n * invokes when a task runs. Consumers can override either delegate to\n * inject custom drivers, mocks, fleet-aware dispatchers, etc.\n *\n * The default coder delegate is wired here because we own\n * `coderProfile` / `multiHarnessCoderFanout`. The default researcher\n * delegate is **not** wired in this file — `agent-knowledge` cannot be\n * imported from `agent-runtime` without inducing a cycle. Consumers\n * pass `researcherDelegate` explicitly when constructing the server.\n */\n\nimport { type CoderOutput, coderProfile, multiHarnessCoderFanout } from '../profiles/coder'\nimport type { Iteration, LoopTraceEmitter, SandboxClient } from '../runtime'\nimport { runLoop } from '../runtime'\nimport { createSiblingSandboxExecutor, type DelegationExecutor } from './executor'\nimport type {\n CoderTask,\n DelegateCodeArgs,\n DelegateResearchArgs,\n DelegateUiAuditArgs,\n DelegationProgress,\n ResearchOutputShape,\n UiAuditorDelegationOutput,\n} from './types'\n\n/** @experimental */\nexport interface DelegateRunCtx {\n signal: AbortSignal\n report(progress: DelegationProgress): void\n}\n\n/** @experimental */\nexport type CoderDelegate = (\n args: DelegateCodeArgs,\n ctx: DelegateRunCtx,\n) => Promise<import('../profiles/coder').CoderOutput>\n\n/** @experimental */\nexport type ResearcherDelegate = (\n args: DelegateResearchArgs,\n ctx: DelegateRunCtx,\n) => Promise<ResearchOutputShape>\n\n/**\n * UI-auditor delegate — fully consumer-injected. agent-runtime ships no\n * default factory because the inputs are workspace path + judge function\n * + (optionally) a `SandboxClient`, and the judge is the consumer's\n * model seam. See `createInProcessUiAuditClient` + `uiAuditorProfile` in\n * `@tangle-network/agent-runtime/profiles` for the canonical wiring.\n *\n * @experimental\n */\nexport type UiAuditorDelegate = (\n args: DelegateUiAuditArgs,\n ctx: DelegateRunCtx,\n) => Promise<UiAuditorDelegationOutput>\n\n/** @experimental Structured review verdict over a coder candidate. */\nexport interface CoderReview {\n /** Gate: only approved candidates are eligible to win. */\n approved: boolean\n /** Reviewer's recommendation — surfaced in traces. */\n recommendation: 'ship' | 'approve-with-nits' | 'changes-requested' | 'reject'\n /** Readiness 0..1, used by the `highest-readiness` winner-selection strategy. */\n readiness: number\n notes?: string\n}\n\n/**\n * @experimental\n *\n * Optional adversarial reviewer over a coder candidate that already passed\n * mechanical validation (tests/typecheck/forbidden/diff/no-op/secrets). Folded\n * from the ai-trading-blueprint delegation MCP: a candidate is only eligible to\n * win if the reviewer approves it. The reviewer is the consumer's seam — an LLM\n * judge, a `pnpm review` command, anything returning a `CoderReview`.\n */\nexport type CoderReviewer = (\n output: import('../profiles/coder').CoderOutput,\n task: CoderTask,\n ctx: { signal: AbortSignal },\n) => Promise<CoderReview> | CoderReview\n\n/**\n * @experimental Winner-selection strategy among validated (+ reviewed)\n * candidates. `highest-readiness` requires a `reviewer`. Default `highest-score`\n * (the kernel's behavior — preserves backward compatibility).\n */\nexport type CoderWinnerSelection =\n | 'highest-score'\n | 'smallest-diff'\n | 'highest-readiness'\n | 'first-approved'\n\n/** @experimental */\nexport interface CreateDefaultCoderDelegateOptions {\n /**\n * Execution placement. Pass a {@link DelegationExecutor} (sibling or fleet)\n * to control where worker iterations land. `sandboxClient` is a\n * convenience shorthand that wraps the client in a sibling executor — pass\n * one or the other, not both.\n */\n executor?: DelegationExecutor\n /**\n * Convenience shorthand for sibling placement. Equivalent to\n * `executor: createSiblingSandboxExecutor({ client: sandboxClient })`.\n */\n sandboxClient?: SandboxClient\n /** Backend harness for the single-coder path. Default comes from `coderProfile`. */\n harness?: string\n /** Model override for the single-coder path. */\n model?: string\n /** Default `['claude-code', 'codex', 'opencode/zai-coding-plan/glm-5.1']` when variants > 1. */\n fanoutHarnesses?: string[]\n /** Optional per-harness model override for `variants > 1`. */\n fanoutModels?: (string | undefined)[]\n /** Hard cap on the kernel's per-batch concurrency. Default 4. */\n maxConcurrency?: number\n /**\n * Optional adversarial reviewer. When set, a candidate must pass mechanical\n * validation AND `reviewer.approved` to be eligible to win — empty/secret/\n * test-failing patches are already gone; this catches the \"compiles + passes\n * but wrong/unsafe\" class the deterministic validator can't see.\n */\n reviewer?: CoderReviewer\n /** Winner-selection strategy among eligible candidates. Default `highest-score`. */\n winnerSelection?: CoderWinnerSelection\n /**\n * Loop trace emitter forwarded into every delegated `runLoop`. Wire\n * `createPropagatingTraceEmitter(readTraceContextFromEnv())` here (the bin\n * does) so delegated build-loops export their topology spans to the OTLP /\n * Tangle Intelligence sink when `OTEL_EXPORTER_OTLP_ENDPOINT` is set — and\n * are a cheap no-op when it isn't. Configurable by construction.\n */\n traceEmitter?: LoopTraceEmitter\n}\n\n/**\n * Build a coder delegate that drives `runLoop` against the project's\n * sandbox client + coder profile. When `args.variants > 1` it switches\n * to the multi-harness fanout topology.\n *\n * @experimental\n */\nexport function createDefaultCoderDelegate(\n options: CreateDefaultCoderDelegateOptions,\n): CoderDelegate {\n const executor = resolveExecutor(options)\n const sandboxClient = executor.client\n const fanoutHarnesses = options.fanoutHarnesses\n const maxConcurrency = options.maxConcurrency ?? 4\n const traceEmitter = options.traceEmitter\n return async (args, ctx) => {\n const task: CoderTask = {\n goal: buildCoderGoal(args),\n repoRoot: args.repoRoot,\n testCmd: args.config?.testCmd,\n typecheckCmd: args.config?.typecheckCmd,\n forbiddenPaths: args.config?.forbiddenPaths,\n maxDiffLines: args.config?.maxDiffLines,\n }\n const variants = Math.max(1, Math.trunc(args.variants ?? 1))\n ctx.report({ iteration: 0, phase: 'starting' })\n if (variants <= 1) {\n const { agentRunSpec, output, validator } = coderProfile({\n task,\n ...(options.harness ? { harness: options.harness } : {}),\n ...(options.model ? { model: options.model } : {}),\n })\n const result = await runLoop({\n driver: singleShotDriver,\n agentRun: agentRunSpec,\n output,\n validator,\n task,\n ctx: { sandboxClient, signal: ctx.signal, ...(traceEmitter ? { traceEmitter } : {}) },\n maxIterations: 1,\n maxConcurrency,\n })\n const chosen = await pickCoderWinner({\n iterations: result.iterations,\n reviewer: options.reviewer,\n selection: options.winnerSelection ?? 'highest-score',\n task,\n signal: ctx.signal,\n })\n if (!chosen) throw new Error(noWinnerMessage(options.reviewer))\n ctx.report({ iteration: 1, phase: 'completed' })\n return chosen\n }\n const fanout = multiHarnessCoderFanout({\n ...(fanoutHarnesses && fanoutHarnesses.length > 0\n ? { harnesses: fanoutHarnesses.slice(0, variants) }\n : {}),\n ...(options.fanoutModels ? { models: options.fanoutModels.slice(0, variants) } : {}),\n })\n const agentRuns = fanout.agentRuns.slice(0, variants)\n const result = await runLoop({\n driver: fanout.driver,\n agentRuns,\n output: fanout.output,\n validator: fanout.validator,\n task,\n ctx: { sandboxClient, signal: ctx.signal, ...(traceEmitter ? { traceEmitter } : {}) },\n maxIterations: variants,\n maxConcurrency: Math.min(maxConcurrency, variants),\n })\n const chosen = await pickCoderWinner({\n iterations: result.iterations,\n reviewer: options.reviewer,\n selection: options.winnerSelection ?? 'highest-score',\n task,\n signal: ctx.signal,\n })\n if (!chosen) throw new Error(noWinnerMessage(options.reviewer))\n ctx.report({ iteration: agentRuns.length, phase: 'completed' })\n return chosen\n }\n}\n\ninterface PickCoderWinnerArgs {\n iterations: ReadonlyArray<Iteration<CoderTask, CoderOutput>>\n reviewer: CoderReviewer | undefined\n selection: CoderWinnerSelection\n task: CoderTask\n signal: AbortSignal\n}\n\ninterface CoderCandidate {\n index: number\n output: CoderOutput\n score: number\n readiness: number\n}\n\n/**\n * Pick the winning coder candidate from a finished loop's iterations:\n * 1. keep only mechanically-VALID candidates (the validator already gated\n * tests/typecheck/forbidden/diff/no-op/secrets),\n * 2. if a `reviewer` is wired, keep only those it APPROVES,\n * 3. select among survivors by the chosen strategy.\n * Returns `undefined` when nothing survives — the delegate fails loud.\n */\nasync function pickCoderWinner(args: PickCoderWinnerArgs): Promise<CoderOutput | undefined> {\n const valid: CoderCandidate[] = []\n for (const iter of args.iterations) {\n if (iter.output === undefined || iter.error || iter.verdict?.valid !== true) continue\n valid.push({\n index: iter.index,\n output: iter.output,\n score: iter.verdict.score ?? 0,\n readiness: iter.verdict.score ?? 0,\n })\n }\n if (valid.length === 0) return undefined\n\n let eligible = valid\n if (args.reviewer) {\n eligible = []\n for (const c of valid) {\n const review = await args.reviewer(c.output, args.task, { signal: args.signal })\n if (review.approved) eligible.push({ ...c, readiness: review.readiness })\n }\n if (eligible.length === 0) return undefined\n }\n\n return selectCoderCandidate(eligible, args.selection).output\n}\n\n/** Apply the winner-selection strategy; ties broken by earliest iteration. */\nfunction selectCoderCandidate(\n candidates: CoderCandidate[],\n selection: CoderWinnerSelection,\n): CoderCandidate {\n const diffLines = (c: CoderCandidate) =>\n c.output.diffStats.insertions + c.output.diffStats.deletions\n const sorted = [...candidates].sort((a, b) => {\n switch (selection) {\n case 'smallest-diff':\n return diffLines(a) - diffLines(b) || a.index - b.index\n case 'highest-readiness':\n return b.readiness - a.readiness || a.index - b.index\n case 'first-approved':\n return a.index - b.index\n default:\n return b.score - a.score || a.index - b.index\n }\n })\n return sorted[0]!\n}\n\nfunction noWinnerMessage(reviewer: CoderReviewer | undefined): string {\n return reviewer\n ? 'coder delegate: no candidate passed validation + review'\n : 'coder delegate: no candidate passed validation'\n}\n\nfunction buildCoderGoal(args: DelegateCodeArgs): string {\n if (!args.contextHint) return args.goal\n return [args.goal, '', '## Context', args.contextHint].join('\\n')\n}\n\nfunction resolveExecutor(options: CreateDefaultCoderDelegateOptions): DelegationExecutor {\n if (options.executor && options.sandboxClient) {\n throw new Error('createDefaultCoderDelegate: pass exactly one of `executor` or `sandboxClient`')\n }\n if (options.executor) return options.executor\n if (options.sandboxClient) {\n return createSiblingSandboxExecutor({ client: options.sandboxClient })\n }\n throw new Error('createDefaultCoderDelegate: `executor` or `sandboxClient` is required')\n}\n\n/**\n * Single-shot driver — plan one task on iteration 0, stop after one\n * iteration. Used by the coder delegate when `variants <= 1`. Keeps the\n * runLoop kernel-level accounting (timing, cost, trace emission) while\n * skipping fanout/refine topology overhead.\n */\nconst singleShotDriver = {\n name: 'mcp-single-shot',\n async plan<Task>(task: Task, history: ReadonlyArray<unknown>): Promise<Task[]> {\n return history.length === 0 ? [task] : []\n },\n decide(history: ReadonlyArray<unknown>): 'pick-winner' | 'fail' {\n return history.length > 0 ? 'pick-winner' : 'fail'\n },\n}\n"],"mappings":"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","names":["result","chosen"]}