@tangle-network/agent-runtime 0.49.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/analyst-loop.d.ts +1 -1
- package/dist/{chunk-U2VEWKKK.js → chunk-BKAIVNFA.js} +3 -3
- package/dist/{chunk-PXUTIMGJ.js → chunk-CM2IK7VS.js} +148 -25
- package/dist/chunk-CM2IK7VS.js.map +1 -0
- package/dist/{chunk-XTEZ3YJ4.js → chunk-ML4IXGTV.js} +2 -2
- package/dist/{chunk-IQS4HI3F.js → chunk-NDM5VXZW.js} +8 -6
- package/dist/{chunk-IQS4HI3F.js.map → chunk-NDM5VXZW.js.map} +1 -1
- package/dist/chunk-OM3YNZIW.js +978 -0
- package/dist/chunk-OM3YNZIW.js.map +1 -0
- package/dist/{chunk-VIEDXELL.js → chunk-RHW75JW5.js} +94 -348
- package/dist/chunk-RHW75JW5.js.map +1 -0
- package/dist/{coder-CVZNGbyg.d.ts → coder-_YCf3BAK.d.ts} +2 -2
- package/dist/{driver-DYU2sgHr.d.ts → driver-DLI1io57.d.ts} +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +13 -11
- package/dist/index.js.map +1 -1
- package/dist/{kb-gate-CsXpNRk7.d.ts → kb-gate-CHAyt4aI.d.ts} +436 -10
- package/dist/{loop-runner-bin-Cgn0A-NW.d.ts → loop-runner-bin-DFUNgpeK.d.ts} +4 -4
- package/dist/loop-runner-bin.d.ts +5 -5
- package/dist/loop-runner-bin.js +3 -3
- package/dist/loops.d.ts +5 -5
- package/dist/loops.js +7 -1
- package/dist/mcp/bin.js +28 -14
- package/dist/mcp/bin.js.map +1 -1
- package/dist/mcp/index.d.ts +17 -56
- package/dist/mcp/index.js +17 -5
- package/dist/mcp/index.js.map +1 -1
- package/dist/openai-tools-D4HLDWgw.d.ts +45 -0
- package/dist/profiles.d.ts +2 -2
- package/dist/{run-loop-DvD4aGiE.d.ts → run-loop-BIineL1T.d.ts} +1 -1
- package/dist/runtime.d.ts +119 -17
- package/dist/runtime.js +7 -1
- package/dist/{types-BpDfCPUp.d.ts → types-5MGt5KTY.d.ts} +1 -1
- package/dist/{types-nBMuollC.d.ts → types-BEQsBhOE.d.ts} +1 -1
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-GHX7XOJ2.js +0 -433
- package/dist/chunk-GHX7XOJ2.js.map +0 -1
- package/dist/chunk-PXUTIMGJ.js.map +0 -1
- package/dist/chunk-VIEDXELL.js.map +0 -1
- package/dist/otel-export-EzfsVUhh.d.ts +0 -191
- /package/dist/{chunk-U2VEWKKK.js.map → chunk-BKAIVNFA.js.map} +0 -0
- /package/dist/{chunk-XTEZ3YJ4.js.map → chunk-ML4IXGTV.js.map} +0 -0
package/dist/loops.js
CHANGED
|
@@ -66,6 +66,9 @@ import {
|
|
|
66
66
|
renderReport,
|
|
67
67
|
replaySpawnTree,
|
|
68
68
|
reportLoopUsage,
|
|
69
|
+
routerChatWithTools,
|
|
70
|
+
routerChatWithUsage,
|
|
71
|
+
routerToolLoop,
|
|
69
72
|
runAgentic,
|
|
70
73
|
runBenchmark,
|
|
71
74
|
runLoop,
|
|
@@ -82,7 +85,7 @@ import {
|
|
|
82
85
|
trajectoryReport,
|
|
83
86
|
verify,
|
|
84
87
|
widen
|
|
85
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-CM2IK7VS.js";
|
|
86
89
|
import {
|
|
87
90
|
extractLlmCallEvent,
|
|
88
91
|
mapSandboxEvent
|
|
@@ -158,6 +161,9 @@ export {
|
|
|
158
161
|
renderReport,
|
|
159
162
|
replaySpawnTree,
|
|
160
163
|
reportLoopUsage,
|
|
164
|
+
routerChatWithTools,
|
|
165
|
+
routerChatWithUsage,
|
|
166
|
+
routerToolLoop,
|
|
161
167
|
runAgentic,
|
|
162
168
|
runBenchmark,
|
|
163
169
|
runLoop,
|
package/dist/mcp/bin.js
CHANGED
|
@@ -4,14 +4,15 @@ import {
|
|
|
4
4
|
createPropagatingTraceEmitter,
|
|
5
5
|
detectExecutor,
|
|
6
6
|
readTraceContextFromEnv
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-NDM5VXZW.js";
|
|
8
8
|
import "../chunk-WIR4HOOJ.js";
|
|
9
9
|
import {
|
|
10
10
|
DelegationTaskQueue,
|
|
11
11
|
FileDelegationStore
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-RHW75JW5.js";
|
|
13
13
|
import {
|
|
14
14
|
coderTaskFromArgs,
|
|
15
|
+
composeLoopTraceEmitters,
|
|
15
16
|
createDefaultCoderDelegate,
|
|
16
17
|
createDriveTurnResumeDriver,
|
|
17
18
|
detachedTurnEvents,
|
|
@@ -19,14 +20,14 @@ import {
|
|
|
19
20
|
parseDetachedSessionRef,
|
|
20
21
|
runDetachedTurn,
|
|
21
22
|
settleDetachedCoderTurn
|
|
22
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-OM3YNZIW.js";
|
|
23
24
|
import {
|
|
24
25
|
coderProfile
|
|
25
26
|
} from "../chunk-KADIJAD4.js";
|
|
26
27
|
import "../chunk-GLR25NG7.js";
|
|
27
28
|
import {
|
|
28
29
|
runLoop
|
|
29
|
-
} from "../chunk-
|
|
30
|
+
} from "../chunk-CM2IK7VS.js";
|
|
30
31
|
import "../chunk-GSUO5QS6.js";
|
|
31
32
|
import "../chunk-DGUM43GV.js";
|
|
32
33
|
|
|
@@ -63,9 +64,8 @@ async function main() {
|
|
|
63
64
|
process.stderr.write(`agent-runtime-mcp: delegation placement \u2192 ${executor.describe()}
|
|
64
65
|
`);
|
|
65
66
|
}
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
);
|
|
67
|
+
const traceContext = readTraceContextFromEnv();
|
|
68
|
+
const { emitter: traceEmitter, exporter: traceExporter } = createPropagatingTraceEmitter(traceContext);
|
|
69
69
|
if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
|
|
70
70
|
process.stderr.write(
|
|
71
71
|
`agent-runtime-mcp: exporting loop topology \u2192 ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}
|
|
@@ -78,7 +78,7 @@ async function main() {
|
|
|
78
78
|
maxConcurrency,
|
|
79
79
|
traceEmitter
|
|
80
80
|
}) : void 0;
|
|
81
|
-
const researcherSupport = wantResearcher && executor ? await loadResearcherSupport(executor
|
|
81
|
+
const researcherSupport = wantResearcher && executor ? await loadResearcherSupport(executor, maxConcurrency, traceEmitter) : void 0;
|
|
82
82
|
const detachedDispatch = Boolean(process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()) && process.env.AGENT_RUNTIME_DELEGATION_DETACHED !== "0" && Boolean(process.env.TANGLE_API_KEY) && (executor?.placement === "sibling" || executor?.placement === "fleet");
|
|
83
83
|
if (detachedDispatch) {
|
|
84
84
|
process.stderr.write(
|
|
@@ -86,11 +86,12 @@ async function main() {
|
|
|
86
86
|
);
|
|
87
87
|
}
|
|
88
88
|
const resumeDriver = detachedDispatch && sandboxClient ? buildResumeDriver({ sandboxClient, researcherResume: researcherSupport?.resume }) : void 0;
|
|
89
|
-
const durableQueue = await buildDurableQueueFromEnv(resumeDriver);
|
|
89
|
+
const durableQueue = await buildDurableQueueFromEnv(resumeDriver, traceContext);
|
|
90
90
|
const server = createMcpServer({
|
|
91
91
|
coderDelegate,
|
|
92
92
|
researcherDelegate: researcherSupport?.delegate,
|
|
93
93
|
detachedDispatch,
|
|
94
|
+
traceContext,
|
|
94
95
|
...durableQueue ? { queue: durableQueue } : {}
|
|
95
96
|
});
|
|
96
97
|
const shutdown = () => {
|
|
@@ -109,7 +110,7 @@ async function main() {
|
|
|
109
110
|
process.on("SIGTERM", shutdown);
|
|
110
111
|
await server.serve();
|
|
111
112
|
}
|
|
112
|
-
async function buildDurableQueueFromEnv(resumeDriver) {
|
|
113
|
+
async function buildDurableQueueFromEnv(resumeDriver, traceContext) {
|
|
113
114
|
const stateFile = process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim();
|
|
114
115
|
if (!stateFile) return void 0;
|
|
115
116
|
const store = new FileDelegationStore({
|
|
@@ -119,6 +120,7 @@ async function buildDurableQueueFromEnv(resumeDriver) {
|
|
|
119
120
|
const maxTerminalRecords = parseRetention(process.env.AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL);
|
|
120
121
|
const queue = await DelegationTaskQueue.restore({
|
|
121
122
|
store,
|
|
123
|
+
traceContext,
|
|
122
124
|
...resumeDriver ? { resumeDelegate: resumeDriver } : {},
|
|
123
125
|
...maxTerminalRecords !== void 0 ? { maxTerminalRecords } : {},
|
|
124
126
|
onPersistError: (error) => {
|
|
@@ -224,7 +226,8 @@ async function loadSandboxClient(apiKey) {
|
|
|
224
226
|
...baseUrl ? { baseUrl } : {}
|
|
225
227
|
});
|
|
226
228
|
}
|
|
227
|
-
async function loadResearcherSupport(
|
|
229
|
+
async function loadResearcherSupport(executor, maxConcurrency, traceEmitter) {
|
|
230
|
+
const sandboxClient = executor.client;
|
|
228
231
|
const profilesSpecifier = "@tangle-network/agent-knowledge/profiles";
|
|
229
232
|
const mod = await import(profilesSpecifier).catch(() => void 0);
|
|
230
233
|
if (!mod) return void 0;
|
|
@@ -247,6 +250,7 @@ async function loadResearcherSupport(sandboxClient, maxConcurrency, traceEmitter
|
|
|
247
250
|
const delegate = async (args, ctx) => {
|
|
248
251
|
const task = buildResearchTask(args);
|
|
249
252
|
const variants = Math.max(1, Math.trunc(args.variants ?? 1));
|
|
253
|
+
const loopEmitter = composeLoopTraceEmitters(traceEmitter, ctx.traceEmitter);
|
|
250
254
|
ctx.report({ iteration: 0, phase: "starting" });
|
|
251
255
|
if (variants <= 1) {
|
|
252
256
|
const preset = singleFactory({ task });
|
|
@@ -261,7 +265,9 @@ async function loadResearcherSupport(sandboxClient, maxConcurrency, traceEmitter
|
|
|
261
265
|
sessionId,
|
|
262
266
|
bindSandbox: (sandboxId) => rebind(formatDetachedSessionRef({ sandboxId, sessionId })),
|
|
263
267
|
signal: ctx.signal,
|
|
264
|
-
report: ctx.report
|
|
268
|
+
report: ctx.report,
|
|
269
|
+
...loopEmitter ? { traceEmitter: loopEmitter } : {},
|
|
270
|
+
...executor.placement === "fleet" ? { placement: "fleet" } : {}
|
|
265
271
|
});
|
|
266
272
|
const output3 = await settleSingle(turn, args, sessionId, ctx.signal);
|
|
267
273
|
ctx.report({ iteration: 1, phase: "completed" });
|
|
@@ -281,7 +287,11 @@ async function loadResearcherSupport(sandboxClient, maxConcurrency, traceEmitter
|
|
|
281
287
|
output: preset.output,
|
|
282
288
|
validator: preset.validator,
|
|
283
289
|
task,
|
|
284
|
-
ctx: {
|
|
290
|
+
ctx: {
|
|
291
|
+
sandboxClient,
|
|
292
|
+
signal: ctx.signal,
|
|
293
|
+
...loopEmitter ? { traceEmitter: loopEmitter } : {}
|
|
294
|
+
},
|
|
285
295
|
maxIterations: 1,
|
|
286
296
|
maxConcurrency
|
|
287
297
|
});
|
|
@@ -297,7 +307,11 @@ async function loadResearcherSupport(sandboxClient, maxConcurrency, traceEmitter
|
|
|
297
307
|
output: fanout.output,
|
|
298
308
|
validator: fanout.validator,
|
|
299
309
|
task,
|
|
300
|
-
ctx: {
|
|
310
|
+
ctx: {
|
|
311
|
+
sandboxClient,
|
|
312
|
+
signal: ctx.signal,
|
|
313
|
+
...loopEmitter ? { traceEmitter: loopEmitter } : {}
|
|
314
|
+
},
|
|
301
315
|
maxIterations: variants,
|
|
302
316
|
maxConcurrency: Math.min(maxConcurrency, variants)
|
|
303
317
|
});
|
package/dist/mcp/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * @experimental\n *\n * `agent-runtime-mcp` — stdio MCP server entry point.\n *\n * Spins up a server with the default coder delegate (wired against the\n * real `@tangle-network/sandbox` client) and, when the optional\n * `@tangle-network/agent-knowledge` peer is installed, a researcher\n * delegate against `multiHarnessResearcherFanout`.\n *\n * Environment variables:\n * TANGLE_API_KEY required — passed to `new Sandbox({ apiKey })`\n * SANDBOX_BASE_URL optional — sandbox-SDK base URL override\n * TANGLE_FLEET_ID optional — when set, delegations dispatch\n * INTO this fleet's shared workspace instead\n * of creating sibling sandboxes. Set by the\n * parent sandbox when launching this MCP\n * server so worker diffs land on the caller's\n * filesystem with no cross-sandbox boundary.\n * TANGLE_FLEET_EXCLUDE_MACHINES optional — comma-separated machine ids to\n * skip during fleet-mode round-robin\n * (typically the coordinator machine this\n * MCP server is running on).\n * MCP_MAX_CONCURRENT_SANDBOXES default 4 — kernel maxConcurrency cap\n * MCP_CODER_FANOUT_HARNESSES comma-separated harness ids to use for variants > 1\n * MCP_DISABLE_CODER set to `1` to omit `delegate_code`\n * MCP_DISABLE_RESEARCHER set to `1` to omit `delegate_research` even when peer is present\n * AGENT_RUNTIME_DELEGATION_STATE_FILE\n * optional — absolute path of a JSON state\n * file. When set, delegation records persist\n * across MCP restarts (FileDelegationStore):\n * status/history survive and idempotency keys\n * dedupe across processes. Single-variant\n * coder/researcher delegations additionally\n * dispatch DETACHED (driveTurn ticks against a\n * deterministic session id) on session-backed\n * placements, so restored in-flight records\n * resume against their still-running sandbox\n * sessions; non-detached in-flight records\n * settle as failed with a truthful\n * driver-restart error.\n * AGENT_RUNTIME_DELEGATION_DETACHED\n * set to `0` to keep every delegation on the\n * streaming path even when the state file is\n * configured (disables detached dispatch +\n * resume).\n * AGENT_RUNTIME_DELEGATION_STATE_RECOVER\n * set to `1` to archive a corrupt state file\n * (`<file>.corrupt-<ts>`) and start empty\n * instead of refusing to boot.\n * AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL\n * optional — positive integer cap on retained\n * terminal records. Unset = keep forever.\n */\n\nimport type { SandboxInstance } from '@tangle-network/sandbox'\nimport { coderProfile } from '../profiles/coder'\nimport type { AgentRunSpec, LoopTraceEmitter, SandboxClient } from '../runtime'\nimport { runLoop } from '../runtime'\nimport { detectExecutor } from './bin-helpers'\nimport {\n coderTaskFromArgs,\n createDefaultCoderDelegate,\n type ResearcherDelegate,\n settleDetachedCoderTurn,\n} from './delegates'\nimport { FileDelegationStore } from './delegation-store'\nimport {\n createDriveTurnResumeDriver,\n type DetachedTurn,\n type DriveTurnCapableBox,\n detachedTurnEvents,\n formatDetachedSessionRef,\n parseDetachedSessionRef,\n runDetachedTurn,\n} from './detached-turn'\nimport type { DelegationExecutor } from './executor'\nimport { createMcpServer } from './server'\nimport { type DelegationResumeDriver, DelegationTaskQueue } from './task-queue'\nimport { createPropagatingTraceEmitter, readTraceContextFromEnv } from './trace-propagation'\nimport type { DelegateCodeArgs, DelegateResearchArgs, ResearchOutputShape } from './types'\n\nasync function main(): Promise<void> {\n const fanoutHarnesses = parseHarnesses(process.env.MCP_CODER_FANOUT_HARNESSES)\n const maxConcurrency = parseConcurrency(process.env.MCP_MAX_CONCURRENT_SANDBOXES)\n const wantCoder = !process.env.MCP_DISABLE_CODER\n const wantResearcher = !process.env.MCP_DISABLE_RESEARCHER\n const fleetId = parseFleetId(process.env.TANGLE_FLEET_ID)\n\n // Skip the sandbox client load entirely when no profile delegate needs it —\n // the feedback + status + history tools are queue-bound and require no\n // sandbox. Useful for tooling that mounts the MCP server purely for\n // self-introspection.\n const needsSandbox = wantCoder || wantResearcher\n let sandboxClient: SandboxClient | undefined\n let executor: DelegationExecutor | undefined\n if (needsSandbox) {\n const apiKey = process.env.TANGLE_API_KEY\n if (!apiKey && !process.env.AGENT_RUNTIME_MCP_ALLOW_NO_KEY) {\n process.stderr.write(\n 'agent-runtime-mcp: TANGLE_API_KEY is required. Set AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 to run without it for diagnostics, or MCP_DISABLE_CODER=1 MCP_DISABLE_RESEARCHER=1 to run the queue-only subset.\\n',\n )\n process.exit(2)\n }\n // Fleet mode against a diagnostic stub is meaningless — the stub can't\n // resolve a real fleet handle. Refuse rather than silently degrading,\n // otherwise a fleet-mounted MCP would behave differently than configured.\n if (fleetId && !apiKey) {\n process.stderr.write(\n 'agent-runtime-mcp: TANGLE_FLEET_ID was set but TANGLE_API_KEY is missing; cannot resolve fleet handle. Provide an api key or unset TANGLE_FLEET_ID.\\n',\n )\n process.exit(2)\n }\n sandboxClient = await loadSandboxClient(apiKey)\n executor = await detectExecutor({ sandboxClient })\n if (fleetId) {\n process.stderr.write(`agent-runtime-mcp: fleet-aware delegation: fleetId=${fleetId}\\n`)\n }\n process.stderr.write(`agent-runtime-mcp: delegation placement → ${executor.describe()}\\n`)\n }\n\n // Export delegated-loop topology spans to the OTLP / Tangle Intelligence sink\n // when OTEL_EXPORTER_OTLP_ENDPOINT is set (+ TRACE_ID / PARENT_SPAN_ID for\n // correlation with the caller's trace). A cheap no-op when the endpoint is\n // unset — the fleet forwards the env into this MCP's process to turn it on.\n const { emitter: traceEmitter, exporter: traceExporter } = createPropagatingTraceEmitter(\n readTraceContextFromEnv(),\n )\n if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {\n process.stderr.write(\n `agent-runtime-mcp: exporting loop topology → ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}\\n`,\n )\n }\n\n const coderDelegate =\n wantCoder && executor\n ? createDefaultCoderDelegate({\n executor,\n fanoutHarnesses,\n maxConcurrency,\n traceEmitter,\n })\n : undefined\n\n const researcherSupport =\n wantResearcher && executor\n ? await loadResearcherSupport(executor.client, maxConcurrency, traceEmitter)\n : undefined\n\n // Detached dispatch + resume turn on together with the durable store, and\n // only for session-backed placements with real credentials: in-process\n // placement has no sandbox session to detach, and the diagnostic no-key stub\n // cannot resolve boxes. AGENT_RUNTIME_DELEGATION_DETACHED=0 keeps everything\n // on the streaming path.\n const detachedDispatch =\n Boolean(process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()) &&\n process.env.AGENT_RUNTIME_DELEGATION_DETACHED !== '0' &&\n Boolean(process.env.TANGLE_API_KEY) &&\n (executor?.placement === 'sibling' || executor?.placement === 'fleet')\n if (detachedDispatch) {\n process.stderr.write(\n 'agent-runtime-mcp: detached dispatch enabled — single-variant delegations resume across restarts\\n',\n )\n }\n const resumeDriver =\n detachedDispatch && sandboxClient\n ? buildResumeDriver({ sandboxClient, researcherResume: researcherSupport?.resume })\n : undefined\n\n const durableQueue = await buildDurableQueueFromEnv(resumeDriver)\n const server = createMcpServer({\n coderDelegate,\n researcherDelegate: researcherSupport?.delegate,\n detachedDispatch,\n ...(durableQueue ? { queue: durableQueue } : {}),\n })\n\n const shutdown = () => {\n server.stop()\n const pending: Promise<unknown>[] = []\n if (traceExporter) pending.push(traceExporter.shutdown())\n // Drain journal writes so the state file reflects the final record\n // states before the process exits. A persist failure already routed\n // through onPersistError; swallow the duplicate rejection here.\n if (durableQueue) pending.push(durableQueue.flush().catch(() => {}))\n if (pending.length === 0) {\n process.exit(0)\n return\n }\n void Promise.allSettled(pending).finally(() => process.exit(0))\n }\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n\n await server.serve()\n}\n\nasync function buildDurableQueueFromEnv(\n resumeDriver: DelegationResumeDriver | undefined,\n): Promise<DelegationTaskQueue | undefined> {\n const stateFile = process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()\n if (!stateFile) return undefined\n const store = new FileDelegationStore({\n filePath: stateFile,\n recoverCorrupt: process.env.AGENT_RUNTIME_DELEGATION_STATE_RECOVER === '1',\n })\n const maxTerminalRecords = parseRetention(process.env.AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL)\n // With a resume driver, restored in-flight records that carry a\n // detachedSessionRef re-attach to their still-running sandbox sessions;\n // without one (detached dispatch disabled / no credentials) they settle as\n // failed with a truthful driver-restart error.\n const queue = await DelegationTaskQueue.restore({\n store,\n ...(resumeDriver ? { resumeDelegate: resumeDriver } : {}),\n ...(maxTerminalRecords !== undefined ? { maxTerminalRecords } : {}),\n onPersistError: (error) => {\n // Durable mode that can no longer write is a broken contract: crash\n // loud instead of degrading to memory-only behind the caller's back.\n process.stderr.write(`agent-runtime-mcp: ${error.message}\\n`)\n process.exit(1)\n },\n })\n process.stderr.write(`agent-runtime-mcp: durable delegation state → ${stateFile}\\n`)\n return queue\n}\n\ninterface ResearcherResumeSupport {\n message(args: DelegateResearchArgs): string\n settle(\n turn: DetachedTurn,\n args: DelegateResearchArgs,\n signal: AbortSignal,\n ): Promise<ResearchOutputShape>\n}\n\n/**\n * Compose the `driveTurn`-backed resume driver over the real sandbox client.\n * Profile dispatch: coder records settle through the same parse + validate\n * gate the delegate applies; researcher records settle through the\n * agent-knowledge preset when the peer is installed. Profiles without resume\n * support (ui-auditor, researcher-without-peer) fail loud — the record settles\n * as failed with the reason instead of fabricating an output.\n */\nfunction buildResumeDriver(args: {\n sandboxClient: SandboxClient\n researcherResume: ResearcherResumeSupport | undefined\n}): DelegationResumeDriver {\n const client = args.sandboxClient as SandboxClient & {\n get?: (id: string) => Promise<SandboxInstance | null>\n }\n return createDriveTurnResumeDriver({\n async resolveSandbox(sandboxId) {\n if (typeof client.get !== 'function') {\n throw new Error(\n 'agent-runtime-mcp: the sandbox client exposes no get(sandboxId); upgrade @tangle-network/sandbox to >= 0.6 to resume detached delegations',\n )\n }\n const box = await client.get(sandboxId)\n if (!box) {\n throw new Error(\n `agent-runtime-mcp: sandbox ${sandboxId} no longer exists — the detached run cannot be resumed`,\n )\n }\n return box as unknown as DriveTurnCapableBox\n },\n buildMessage(record) {\n if (record.profile === 'coder') {\n const task = coderTaskFromArgs(record.args as DelegateCodeArgs)\n return coderProfile({ task }).taskToPrompt(task)\n }\n if (record.profile === 'researcher' && args.researcherResume) {\n return args.researcherResume.message(record.args as DelegateResearchArgs)\n }\n throw new Error(\n `agent-runtime-mcp: no detached resume support for profile \"${record.profile}\"`,\n )\n },\n async settleOutput(turn, record, ctx) {\n if (record.profile === 'coder') {\n if (!record.detachedSessionRef) {\n throw new Error(\n `agent-runtime-mcp: record ${record.taskId} reached the resume settle without a detachedSessionRef`,\n )\n }\n return settleDetachedCoderTurn(turn, {\n task: coderTaskFromArgs(record.args as DelegateCodeArgs),\n sessionId: parseDetachedSessionRef(record.detachedSessionRef).sessionId,\n signal: ctx.signal,\n })\n }\n if (record.profile === 'researcher' && args.researcherResume) {\n return args.researcherResume.settle(turn, record.args as DelegateResearchArgs, ctx.signal)\n }\n throw new Error(\n `agent-runtime-mcp: no detached resume support for profile \"${record.profile}\"`,\n )\n },\n })\n}\n\nfunction parseRetention(raw: string | undefined): number | undefined {\n if (raw === undefined || raw.trim() === '') return undefined\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1) {\n process.stderr.write(\n `agent-runtime-mcp: AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL must be a positive integer, got \"${raw}\"\\n`,\n )\n process.exit(2)\n }\n return n\n}\n\nasync function loadSandboxClient(apiKey: string | undefined): Promise<SandboxClient> {\n // Diagnostic mode: AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 enables tools/list + the\n // queue-bound tools (status / history / feedback) without sandbox creds.\n // Coder + researcher delegations require a real client; the stub fails loud\n // at create() so the agent observes the cause instead of silent success.\n if (!apiKey) {\n return {\n async create() {\n throw new Error(\n 'agent-runtime-mcp: TANGLE_API_KEY is unset; coder/researcher delegations are disabled in diagnostic mode. Set TANGLE_API_KEY or use MCP_DISABLE_CODER=1 MCP_DISABLE_RESEARCHER=1 to remove the unsupported tools from the tool list.',\n )\n },\n } satisfies SandboxClient\n }\n // Dynamic import keeps the bin importable in environments that haven't\n // installed `@tangle-network/sandbox` yet (the runtime package lists it\n // as a peer dep, not a hard dep).\n const mod = await import('@tangle-network/sandbox').catch((err) => {\n process.stderr.write(\n `agent-runtime-mcp: failed to load @tangle-network/sandbox (${err.message}); install the peer dependency\\n`,\n )\n process.exit(2)\n })\n const SandboxCtor = (mod as { Sandbox?: new (config: unknown) => SandboxClient }).Sandbox\n if (!SandboxCtor) {\n process.stderr.write(\n 'agent-runtime-mcp: @tangle-network/sandbox does not export Sandbox; cannot construct client\\n',\n )\n process.exit(2)\n }\n const baseUrl = process.env.SANDBOX_BASE_URL\n return new SandboxCtor({\n apiKey,\n ...(baseUrl ? { baseUrl } : {}),\n })\n}\n\ninterface ResearcherProfilePreset {\n agentRunSpec: Parameters<typeof runLoop>[0]['agentRun'] extends infer T ? NonNullable<T> : never\n output: Parameters<typeof runLoop>[0]['output']\n validator: Parameters<typeof runLoop>[0]['validator']\n}\n\ninterface ResearcherFanoutPreset {\n agentRuns: NonNullable<Parameters<typeof runLoop>[0]['agentRuns']>\n output: Parameters<typeof runLoop>[0]['output']\n validator: Parameters<typeof runLoop>[0]['validator']\n driver: Parameters<typeof runLoop>[0]['driver']\n}\n\ninterface ResearcherSupport {\n delegate: ResearcherDelegate\n resume: ResearcherResumeSupport\n}\n\nasync function loadResearcherSupport(\n sandboxClient: SandboxClient,\n maxConcurrency: number,\n traceEmitter?: LoopTraceEmitter,\n): Promise<ResearcherSupport | undefined> {\n // Optional peer — when `@tangle-network/agent-knowledge` isn't installed,\n // we silently omit the researcher tool from the advertisement. The\n // dynamic-import path is resolved at runtime; TypeScript cannot see the\n // peer, so we type the module structurally rather than via its own\n // declaration file.\n const profilesSpecifier = '@tangle-network/agent-knowledge/profiles'\n const mod = await import(profilesSpecifier).catch(() => undefined)\n if (!mod) return undefined\n type SingleFactory = (opts: { task: unknown }) => ResearcherProfilePreset\n type FanoutFactory = (opts: { task: unknown }) => ResearcherFanoutPreset\n const fanoutFactory = (mod as { multiHarnessResearcherFanout?: FanoutFactory })\n .multiHarnessResearcherFanout\n const singleFactory = (mod as { researcherProfile?: SingleFactory }).researcherProfile\n if (!fanoutFactory || !singleFactory) return undefined\n\n const settleSingle = async (\n turn: DetachedTurn,\n args: DelegateResearchArgs,\n sessionId: string,\n signal: AbortSignal,\n ): Promise<ResearchOutputShape> => {\n const task = buildResearchTask(args)\n const preset = singleFactory({ task })\n if (!preset.validator) {\n throw new Error('agent-runtime-mcp: researcher preset exposes no validator; cannot settle')\n }\n const parsed = preset.output.parse(detachedTurnEvents(sessionId, turn))\n const verdict = await preset.validator.validate(parsed, { iteration: 0, signal })\n if ((verdict as { valid?: boolean }).valid !== true) {\n throw new Error('researcher delegate produced no winner')\n }\n return parsed as ResearchOutputShape\n }\n\n const delegate: ResearcherDelegate = async (args, ctx) => {\n const task = buildResearchTask(args)\n const variants = Math.max(1, Math.trunc(args.variants ?? 1))\n ctx.report({ iteration: 0, phase: 'starting' })\n if (variants <= 1) {\n const preset = singleFactory({ task })\n // Detached dispatch — same contract as the coder delegate: one session\n // on one box, driveTurn ticks, resume key bound to the sandbox id.\n if (ctx.detachedSessionRef !== undefined && ctx.updateDetachedSessionRef) {\n const { sessionId } = parseDetachedSessionRef(ctx.detachedSessionRef)\n const rebind = ctx.updateDetachedSessionRef\n const spec = preset.agentRunSpec as AgentRunSpec<unknown>\n const turn = await runDetachedTurn({\n client: sandboxClient,\n spec,\n prompt: spec.taskToPrompt(task),\n sessionId,\n bindSandbox: (sandboxId) => rebind(formatDetachedSessionRef({ sandboxId, sessionId })),\n signal: ctx.signal,\n report: ctx.report,\n })\n const output = await settleSingle(turn, args, sessionId, ctx.signal)\n ctx.report({ iteration: 1, phase: 'completed' })\n return output\n }\n const result = await runLoop({\n driver: {\n name: 'mcp-researcher-single',\n async plan(t, history) {\n return history.length === 0 ? [t] : []\n },\n decide(history) {\n return history.length > 0 ? 'pick-winner' : 'fail'\n },\n },\n agentRun: preset.agentRunSpec,\n output: preset.output,\n validator: preset.validator,\n task,\n ctx: { sandboxClient, signal: ctx.signal, ...(traceEmitter ? { traceEmitter } : {}) },\n maxIterations: 1,\n maxConcurrency,\n })\n const output = result.winner?.output\n if (!output) throw new Error('researcher delegate produced no winner')\n ctx.report({ iteration: 1, phase: 'completed' })\n return output as ResearchOutputShape\n }\n const fanout = fanoutFactory({ task })\n const result = await runLoop({\n driver: fanout.driver,\n agentRuns: fanout.agentRuns.slice(0, variants),\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 output = result.winner?.output\n if (!output) throw new Error('researcher delegate fanout produced no winner')\n ctx.report({ iteration: result.iterations.length, phase: 'completed' })\n return output as ResearchOutputShape\n }\n\n return {\n delegate,\n resume: {\n message(args) {\n const task = buildResearchTask(args)\n const spec = singleFactory({ task }).agentRunSpec as AgentRunSpec<unknown>\n return spec.taskToPrompt(task)\n },\n async settle(turn, args, signal) {\n // The session id is only the synthesized event's id — the parser reads\n // data.result / data.text, never the id.\n return settleSingle(turn, args, 'resumed-detached-turn', signal)\n },\n },\n }\n}\n\nfunction buildResearchTask(args: DelegateResearchArgs): unknown {\n return {\n question: args.question,\n knowledgeNamespace: args.namespace,\n scope: args.scope,\n sources: args.sources,\n recencyWindow: args.config?.recencyWindow\n ? {\n since: args.config.recencyWindow.since\n ? new Date(args.config.recencyWindow.since)\n : undefined,\n until: args.config.recencyWindow.until\n ? new Date(args.config.recencyWindow.until)\n : undefined,\n }\n : undefined,\n maxItems: args.config?.maxItems,\n minConfidence: args.config?.minConfidence,\n }\n}\n\nfunction parseHarnesses(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined\n const list = raw\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n return list.length > 0 ? list : undefined\n}\n\nfunction parseFleetId(raw: string | undefined): string | undefined {\n if (typeof raw !== 'string') return undefined\n const trimmed = raw.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nfunction parseConcurrency(raw: string | undefined): number {\n if (!raw) return 4\n const n = Number(raw)\n if (!Number.isFinite(n) || n < 1) return 4\n return Math.min(Math.trunc(n), 32)\n}\n\nmain().catch((err) => {\n process.stderr.write(`agent-runtime-mcp: ${err instanceof Error ? err.stack : String(err)}\\n`)\n process.exit(1)\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoFA,eAAe,OAAsB;AACnC,QAAM,kBAAkB,eAAe,QAAQ,IAAI,0BAA0B;AAC7E,QAAM,iBAAiB,iBAAiB,QAAQ,IAAI,4BAA4B;AAChF,QAAM,YAAY,CAAC,QAAQ,IAAI;AAC/B,QAAM,iBAAiB,CAAC,QAAQ,IAAI;AACpC,QAAM,UAAU,aAAa,QAAQ,IAAI,eAAe;AAMxD,QAAM,eAAe,aAAa;AAClC,MAAI;AACJ,MAAI;AACJ,MAAI,cAAc;AAChB,UAAM,SAAS,QAAQ,IAAI;AAC3B,QAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,gCAAgC;AAC1D,cAAQ,OAAO;AAAA,QACb;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAIA,QAAI,WAAW,CAAC,QAAQ;AACtB,cAAQ,OAAO;AAAA,QACb;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,oBAAgB,MAAM,kBAAkB,MAAM;AAC9C,eAAW,MAAM,eAAe,EAAE,cAAc,CAAC;AACjD,QAAI,SAAS;AACX,cAAQ,OAAO,MAAM,sDAAsD,OAAO;AAAA,CAAI;AAAA,IACxF;AACA,YAAQ,OAAO,MAAM,kDAA6C,SAAS,SAAS,CAAC;AAAA,CAAI;AAAA,EAC3F;AAMA,QAAM,EAAE,SAAS,cAAc,UAAU,cAAc,IAAI;AAAA,IACzD,wBAAwB;AAAA,EAC1B;AACA,MAAI,QAAQ,IAAI,6BAA6B;AAC3C,YAAQ,OAAO;AAAA,MACb,qDAAgD,QAAQ,IAAI,2BAA2B;AAAA;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,gBACJ,aAAa,WACT,2BAA2B;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,IACD;AAEN,QAAM,oBACJ,kBAAkB,WACd,MAAM,sBAAsB,SAAS,QAAQ,gBAAgB,YAAY,IACzE;AAON,QAAM,mBACJ,QAAQ,QAAQ,IAAI,qCAAqC,KAAK,CAAC,KAC/D,QAAQ,IAAI,sCAAsC,OAClD,QAAQ,QAAQ,IAAI,cAAc,MACjC,UAAU,cAAc,aAAa,UAAU,cAAc;AAChE,MAAI,kBAAkB;AACpB,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,QAAM,eACJ,oBAAoB,gBAChB,kBAAkB,EAAE,eAAe,kBAAkB,mBAAmB,OAAO,CAAC,IAChF;AAEN,QAAM,eAAe,MAAM,yBAAyB,YAAY;AAChE,QAAM,SAAS,gBAAgB;AAAA,IAC7B;AAAA,IACA,oBAAoB,mBAAmB;AAAA,IACvC;AAAA,IACA,GAAI,eAAe,EAAE,OAAO,aAAa,IAAI,CAAC;AAAA,EAChD,CAAC;AAED,QAAM,WAAW,MAAM;AACrB,WAAO,KAAK;AACZ,UAAM,UAA8B,CAAC;AACrC,QAAI,cAAe,SAAQ,KAAK,cAAc,SAAS,CAAC;AAIxD,QAAI,aAAc,SAAQ,KAAK,aAAa,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAC;AACnE,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AACA,SAAK,QAAQ,WAAW,OAAO,EAAE,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EAChE;AACA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAE9B,QAAM,OAAO,MAAM;AACrB;AAEA,eAAe,yBACb,cAC0C;AAC1C,QAAM,YAAY,QAAQ,IAAI,qCAAqC,KAAK;AACxE,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,QAAQ,IAAI,oBAAoB;AAAA,IACpC,UAAU;AAAA,IACV,gBAAgB,QAAQ,IAAI,2CAA2C;AAAA,EACzE,CAAC;AACD,QAAM,qBAAqB,eAAe,QAAQ,IAAI,wCAAwC;AAK9F,QAAM,QAAQ,MAAM,oBAAoB,QAAQ;AAAA,IAC9C;AAAA,IACA,GAAI,eAAe,EAAE,gBAAgB,aAAa,IAAI,CAAC;AAAA,IACvD,GAAI,uBAAuB,SAAY,EAAE,mBAAmB,IAAI,CAAC;AAAA,IACjE,gBAAgB,CAAC,UAAU;AAGzB,cAAQ,OAAO,MAAM,sBAAsB,MAAM,OAAO;AAAA,CAAI;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACD,UAAQ,OAAO,MAAM,sDAAiD,SAAS;AAAA,CAAI;AACnF,SAAO;AACT;AAmBA,SAAS,kBAAkB,MAGA;AACzB,QAAM,SAAS,KAAK;AAGpB,SAAO,4BAA4B;AAAA,IACjC,MAAM,eAAe,WAAW;AAC9B,UAAI,OAAO,OAAO,QAAQ,YAAY;AACpC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,MAAM,MAAM,OAAO,IAAI,SAAS;AACtC,UAAI,CAAC,KAAK;AACR,cAAM,IAAI;AAAA,UACR,8BAA8B,SAAS;AAAA,QACzC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,aAAa,QAAQ;AACnB,UAAI,OAAO,YAAY,SAAS;AAC9B,cAAM,OAAO,kBAAkB,OAAO,IAAwB;AAC9D,eAAO,aAAa,EAAE,KAAK,CAAC,EAAE,aAAa,IAAI;AAAA,MACjD;AACA,UAAI,OAAO,YAAY,gBAAgB,KAAK,kBAAkB;AAC5D,eAAO,KAAK,iBAAiB,QAAQ,OAAO,IAA4B;AAAA,MAC1E;AACA,YAAM,IAAI;AAAA,QACR,8DAA8D,OAAO,OAAO;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,MAAM,aAAa,MAAM,QAAQ,KAAK;AACpC,UAAI,OAAO,YAAY,SAAS;AAC9B,YAAI,CAAC,OAAO,oBAAoB;AAC9B,gBAAM,IAAI;AAAA,YACR,6BAA6B,OAAO,MAAM;AAAA,UAC5C;AAAA,QACF;AACA,eAAO,wBAAwB,MAAM;AAAA,UACnC,MAAM,kBAAkB,OAAO,IAAwB;AAAA,UACvD,WAAW,wBAAwB,OAAO,kBAAkB,EAAE;AAAA,UAC9D,QAAQ,IAAI;AAAA,QACd,CAAC;AAAA,MACH;AACA,UAAI,OAAO,YAAY,gBAAgB,KAAK,kBAAkB;AAC5D,eAAO,KAAK,iBAAiB,OAAO,MAAM,OAAO,MAA8B,IAAI,MAAM;AAAA,MAC3F;AACA,YAAM,IAAI;AAAA,QACR,8DAA8D,OAAO,OAAO;AAAA,MAC9E;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,KAA6C;AACnE,MAAI,QAAQ,UAAa,IAAI,KAAK,MAAM,GAAI,QAAO;AACnD,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AACjC,YAAQ,OAAO;AAAA,MACb,gGAAgG,GAAG;AAAA;AAAA,IACrG;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,eAAe,kBAAkB,QAAoD;AAKnF,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,MAAM,SAAS;AACb,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,QAAM,MAAM,MAAM,OAAO,yBAAyB,EAAE,MAAM,CAAC,QAAQ;AACjE,YAAQ,OAAO;AAAA,MACb,8DAA8D,IAAI,OAAO;AAAA;AAAA,IAC3E;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACD,QAAM,cAAe,IAA6D;AAClF,MAAI,CAAC,aAAa;AAChB,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,QAAQ,IAAI;AAC5B,SAAO,IAAI,YAAY;AAAA,IACrB;AAAA,IACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B,CAAC;AACH;AAoBA,eAAe,sBACb,eACA,gBACA,cACwC;AAMxC,QAAM,oBAAoB;AAC1B,QAAM,MAAM,MAAM,OAAO,mBAAmB,MAAM,MAAM,MAAS;AACjE,MAAI,CAAC,IAAK,QAAO;AAGjB,QAAM,gBAAiB,IACpB;AACH,QAAM,gBAAiB,IAA8C;AACrE,MAAI,CAAC,iBAAiB,CAAC,cAAe,QAAO;AAE7C,QAAM,eAAe,OACnB,MACA,MACA,WACA,WACiC;AACjC,UAAM,OAAO,kBAAkB,IAAI;AACnC,UAAM,SAAS,cAAc,EAAE,KAAK,CAAC;AACrC,QAAI,CAAC,OAAO,WAAW;AACrB,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC5F;AACA,UAAM,SAAS,OAAO,OAAO,MAAM,mBAAmB,WAAW,IAAI,CAAC;AACtE,UAAM,UAAU,MAAM,OAAO,UAAU,SAAS,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC;AAChF,QAAK,QAAgC,UAAU,MAAM;AACnD,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAA+B,OAAO,MAAM,QAAQ;AACxD,UAAM,OAAO,kBAAkB,IAAI;AACnC,UAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,YAAY,CAAC,CAAC;AAC3D,QAAI,OAAO,EAAE,WAAW,GAAG,OAAO,WAAW,CAAC;AAC9C,QAAI,YAAY,GAAG;AACjB,YAAM,SAAS,cAAc,EAAE,KAAK,CAAC;AAGrC,UAAI,IAAI,uBAAuB,UAAa,IAAI,0BAA0B;AACxE,cAAM,EAAE,UAAU,IAAI,wBAAwB,IAAI,kBAAkB;AACpE,cAAM,SAAS,IAAI;AACnB,cAAM,OAAO,OAAO;AACpB,cAAM,OAAO,MAAM,gBAAgB;AAAA,UACjC,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,KAAK,aAAa,IAAI;AAAA,UAC9B;AAAA,UACA,aAAa,CAAC,cAAc,OAAO,yBAAyB,EAAE,WAAW,UAAU,CAAC,CAAC;AAAA,UACrF,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,QACd,CAAC;AACD,cAAMA,UAAS,MAAM,aAAa,MAAM,MAAM,WAAW,IAAI,MAAM;AACnE,YAAI,OAAO,EAAE,WAAW,GAAG,OAAO,YAAY,CAAC;AAC/C,eAAOA;AAAA,MACT;AACA,YAAMC,UAAS,MAAM,QAAQ;AAAA,QAC3B,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,KAAK,GAAG,SAAS;AACrB,mBAAO,QAAQ,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC;AAAA,UACvC;AAAA,UACA,OAAO,SAAS;AACd,mBAAO,QAAQ,SAAS,IAAI,gBAAgB;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,KAAK,EAAE,eAAe,QAAQ,IAAI,QAAQ,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC,EAAG;AAAA,QACpF,eAAe;AAAA,QACf;AAAA,MACF,CAAC;AACD,YAAMD,UAASC,QAAO,QAAQ;AAC9B,UAAI,CAACD,QAAQ,OAAM,IAAI,MAAM,wCAAwC;AACrE,UAAI,OAAO,EAAE,WAAW,GAAG,OAAO,YAAY,CAAC;AAC/C,aAAOA;AAAA,IACT;AACA,UAAM,SAAS,cAAc,EAAE,KAAK,CAAC;AACrC,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO,UAAU,MAAM,GAAG,QAAQ;AAAA,MAC7C,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB;AAAA,MACA,KAAK,EAAE,eAAe,QAAQ,IAAI,QAAQ,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC,EAAG;AAAA,MACpF,eAAe;AAAA,MACf,gBAAgB,KAAK,IAAI,gBAAgB,QAAQ;AAAA,IACnD,CAAC;AACD,UAAM,SAAS,OAAO,QAAQ;AAC9B,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,+CAA+C;AAC5E,QAAI,OAAO,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,YAAY,CAAC;AACtE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ,MAAM;AACZ,cAAM,OAAO,kBAAkB,IAAI;AACnC,cAAM,OAAO,cAAc,EAAE,KAAK,CAAC,EAAE;AACrC,eAAO,KAAK,aAAa,IAAI;AAAA,MAC/B;AAAA,MACA,MAAM,OAAO,MAAM,MAAM,QAAQ;AAG/B,eAAO,aAAa,MAAM,MAAM,yBAAyB,MAAM;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAAqC;AAC9D,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,oBAAoB,KAAK;AAAA,IACzB,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,eAAe,KAAK,QAAQ,gBACxB;AAAA,MACE,OAAO,KAAK,OAAO,cAAc,QAC7B,IAAI,KAAK,KAAK,OAAO,cAAc,KAAK,IACxC;AAAA,MACJ,OAAO,KAAK,OAAO,cAAc,QAC7B,IAAI,KAAK,KAAK,OAAO,cAAc,KAAK,IACxC;AAAA,IACN,IACA;AAAA,IACJ,UAAU,KAAK,QAAQ;AAAA,IACvB,eAAe,KAAK,QAAQ;AAAA,EAC9B;AACF;AAEA,SAAS,eAAe,KAA+C;AACrE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAO,IACV,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACjB,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAEA,SAAS,aAAa,KAA6C;AACjE,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAM,UAAU,IAAI,KAAK;AACzB,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,iBAAiB,KAAiC;AACzD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,QAAO;AACzC,SAAO,KAAK,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE;AACnC;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,OAAO,MAAM,sBAAsB,eAAe,QAAQ,IAAI,QAAQ,OAAO,GAAG,CAAC;AAAA,CAAI;AAC7F,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["output","result"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * @experimental\n *\n * `agent-runtime-mcp` — stdio MCP server entry point.\n *\n * Spins up a server with the default coder delegate (wired against the\n * real `@tangle-network/sandbox` client) and, when the optional\n * `@tangle-network/agent-knowledge` peer is installed, a researcher\n * delegate against `multiHarnessResearcherFanout`.\n *\n * Environment variables:\n * TANGLE_API_KEY required — passed to `new Sandbox({ apiKey })`\n * SANDBOX_BASE_URL optional — sandbox-SDK base URL override\n * TANGLE_FLEET_ID optional — when set, delegations dispatch\n * INTO this fleet's shared workspace instead\n * of creating sibling sandboxes. Set by the\n * parent sandbox when launching this MCP\n * server so worker diffs land on the caller's\n * filesystem with no cross-sandbox boundary.\n * TANGLE_FLEET_EXCLUDE_MACHINES optional — comma-separated machine ids to\n * skip during fleet-mode round-robin\n * (typically the coordinator machine this\n * MCP server is running on).\n * MCP_MAX_CONCURRENT_SANDBOXES default 4 — kernel maxConcurrency cap\n * MCP_CODER_FANOUT_HARNESSES comma-separated harness ids to use for variants > 1\n * MCP_DISABLE_CODER set to `1` to omit `delegate_code`\n * MCP_DISABLE_RESEARCHER set to `1` to omit `delegate_research` even when peer is present\n * AGENT_RUNTIME_DELEGATION_STATE_FILE\n * optional — absolute path of a JSON state\n * file. When set, delegation records persist\n * across MCP restarts (FileDelegationStore):\n * status/history survive and idempotency keys\n * dedupe across processes. Single-variant\n * coder/researcher delegations additionally\n * dispatch DETACHED (driveTurn ticks against a\n * deterministic session id) on session-backed\n * placements, so restored in-flight records\n * resume against their still-running sandbox\n * sessions; non-detached in-flight records\n * settle as failed with a truthful\n * driver-restart error.\n * AGENT_RUNTIME_DELEGATION_DETACHED\n * set to `0` to keep every delegation on the\n * streaming path even when the state file is\n * configured (disables detached dispatch +\n * resume).\n * AGENT_RUNTIME_DELEGATION_STATE_RECOVER\n * set to `1` to archive a corrupt state file\n * (`<file>.corrupt-<ts>`) and start empty\n * instead of refusing to boot.\n * AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL\n * optional — positive integer cap on retained\n * terminal records. Unset = keep forever.\n */\n\nimport type { SandboxInstance } from '@tangle-network/sandbox'\nimport { coderProfile } from '../profiles/coder'\nimport type { AgentRunSpec, LoopTraceEmitter, SandboxClient } from '../runtime'\nimport { runLoop } from '../runtime'\nimport { detectExecutor } from './bin-helpers'\nimport {\n coderTaskFromArgs,\n createDefaultCoderDelegate,\n type ResearcherDelegate,\n settleDetachedCoderTurn,\n} from './delegates'\nimport { FileDelegationStore } from './delegation-store'\nimport { composeLoopTraceEmitters } from './delegation-trace'\nimport {\n createDriveTurnResumeDriver,\n type DetachedTurn,\n type DriveTurnCapableBox,\n detachedTurnEvents,\n formatDetachedSessionRef,\n parseDetachedSessionRef,\n runDetachedTurn,\n} from './detached-turn'\nimport type { DelegationExecutor } from './executor'\nimport { createMcpServer } from './server'\nimport { type DelegationResumeDriver, DelegationTaskQueue } from './task-queue'\nimport {\n createPropagatingTraceEmitter,\n readTraceContextFromEnv,\n type TraceContext,\n} from './trace-propagation'\nimport type { DelegateCodeArgs, DelegateResearchArgs, ResearchOutputShape } from './types'\n\nasync function main(): Promise<void> {\n const fanoutHarnesses = parseHarnesses(process.env.MCP_CODER_FANOUT_HARNESSES)\n const maxConcurrency = parseConcurrency(process.env.MCP_MAX_CONCURRENT_SANDBOXES)\n const wantCoder = !process.env.MCP_DISABLE_CODER\n const wantResearcher = !process.env.MCP_DISABLE_RESEARCHER\n const fleetId = parseFleetId(process.env.TANGLE_FLEET_ID)\n\n // Skip the sandbox client load entirely when no profile delegate needs it —\n // the feedback + status + history tools are queue-bound and require no\n // sandbox. Useful for tooling that mounts the MCP server purely for\n // self-introspection.\n const needsSandbox = wantCoder || wantResearcher\n let sandboxClient: SandboxClient | undefined\n let executor: DelegationExecutor | undefined\n if (needsSandbox) {\n const apiKey = process.env.TANGLE_API_KEY\n if (!apiKey && !process.env.AGENT_RUNTIME_MCP_ALLOW_NO_KEY) {\n process.stderr.write(\n 'agent-runtime-mcp: TANGLE_API_KEY is required. Set AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 to run without it for diagnostics, or MCP_DISABLE_CODER=1 MCP_DISABLE_RESEARCHER=1 to run the queue-only subset.\\n',\n )\n process.exit(2)\n }\n // Fleet mode against a diagnostic stub is meaningless — the stub can't\n // resolve a real fleet handle. Refuse rather than silently degrading,\n // otherwise a fleet-mounted MCP would behave differently than configured.\n if (fleetId && !apiKey) {\n process.stderr.write(\n 'agent-runtime-mcp: TANGLE_FLEET_ID was set but TANGLE_API_KEY is missing; cannot resolve fleet handle. Provide an api key or unset TANGLE_FLEET_ID.\\n',\n )\n process.exit(2)\n }\n sandboxClient = await loadSandboxClient(apiKey)\n executor = await detectExecutor({ sandboxClient })\n if (fleetId) {\n process.stderr.write(`agent-runtime-mcp: fleet-aware delegation: fleetId=${fleetId}\\n`)\n }\n process.stderr.write(`agent-runtime-mcp: delegation placement → ${executor.describe()}\\n`)\n }\n\n // Export delegated-loop topology spans to the OTLP / Tangle Intelligence sink\n // when OTEL_EXPORTER_OTLP_ENDPOINT is set (+ TRACE_ID / PARENT_SPAN_ID for\n // correlation with the caller's trace). A cheap no-op when the endpoint is\n // unset — the fleet forwards the env into this MCP's process to turn it on.\n // The same context is stamped onto every delegation record (traceId /\n // parentSpanId) so journal consumers join records into the caller's trace.\n const traceContext = readTraceContextFromEnv()\n const { emitter: traceEmitter, exporter: traceExporter } =\n createPropagatingTraceEmitter(traceContext)\n if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {\n process.stderr.write(\n `agent-runtime-mcp: exporting loop topology → ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}\\n`,\n )\n }\n\n const coderDelegate =\n wantCoder && executor\n ? createDefaultCoderDelegate({\n executor,\n fanoutHarnesses,\n maxConcurrency,\n traceEmitter,\n })\n : undefined\n\n const researcherSupport =\n wantResearcher && executor\n ? await loadResearcherSupport(executor, maxConcurrency, traceEmitter)\n : undefined\n\n // Detached dispatch + resume turn on together with the durable store, and\n // only for session-backed placements with real credentials: in-process\n // placement has no sandbox session to detach, and the diagnostic no-key stub\n // cannot resolve boxes. AGENT_RUNTIME_DELEGATION_DETACHED=0 keeps everything\n // on the streaming path.\n const detachedDispatch =\n Boolean(process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()) &&\n process.env.AGENT_RUNTIME_DELEGATION_DETACHED !== '0' &&\n Boolean(process.env.TANGLE_API_KEY) &&\n (executor?.placement === 'sibling' || executor?.placement === 'fleet')\n if (detachedDispatch) {\n process.stderr.write(\n 'agent-runtime-mcp: detached dispatch enabled — single-variant delegations resume across restarts\\n',\n )\n }\n const resumeDriver =\n detachedDispatch && sandboxClient\n ? buildResumeDriver({ sandboxClient, researcherResume: researcherSupport?.resume })\n : undefined\n\n const durableQueue = await buildDurableQueueFromEnv(resumeDriver, traceContext)\n const server = createMcpServer({\n coderDelegate,\n researcherDelegate: researcherSupport?.delegate,\n detachedDispatch,\n traceContext,\n ...(durableQueue ? { queue: durableQueue } : {}),\n })\n\n const shutdown = () => {\n server.stop()\n const pending: Promise<unknown>[] = []\n if (traceExporter) pending.push(traceExporter.shutdown())\n // Drain journal writes so the state file reflects the final record\n // states before the process exits. A persist failure already routed\n // through onPersistError; swallow the duplicate rejection here.\n if (durableQueue) pending.push(durableQueue.flush().catch(() => {}))\n if (pending.length === 0) {\n process.exit(0)\n return\n }\n void Promise.allSettled(pending).finally(() => process.exit(0))\n }\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n\n await server.serve()\n}\n\nasync function buildDurableQueueFromEnv(\n resumeDriver: DelegationResumeDriver | undefined,\n traceContext: TraceContext,\n): Promise<DelegationTaskQueue | undefined> {\n const stateFile = process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()\n if (!stateFile) return undefined\n const store = new FileDelegationStore({\n filePath: stateFile,\n recoverCorrupt: process.env.AGENT_RUNTIME_DELEGATION_STATE_RECOVER === '1',\n })\n const maxTerminalRecords = parseRetention(process.env.AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL)\n // With a resume driver, restored in-flight records that carry a\n // detachedSessionRef re-attach to their still-running sandbox sessions;\n // without one (detached dispatch disabled / no credentials) they settle as\n // failed with a truthful driver-restart error.\n const queue = await DelegationTaskQueue.restore({\n store,\n traceContext,\n ...(resumeDriver ? { resumeDelegate: resumeDriver } : {}),\n ...(maxTerminalRecords !== undefined ? { maxTerminalRecords } : {}),\n onPersistError: (error) => {\n // Durable mode that can no longer write is a broken contract: crash\n // loud instead of degrading to memory-only behind the caller's back.\n process.stderr.write(`agent-runtime-mcp: ${error.message}\\n`)\n process.exit(1)\n },\n })\n process.stderr.write(`agent-runtime-mcp: durable delegation state → ${stateFile}\\n`)\n return queue\n}\n\ninterface ResearcherResumeSupport {\n message(args: DelegateResearchArgs): string\n settle(\n turn: DetachedTurn,\n args: DelegateResearchArgs,\n signal: AbortSignal,\n ): Promise<ResearchOutputShape>\n}\n\n/**\n * Compose the `driveTurn`-backed resume driver over the real sandbox client.\n * Profile dispatch: coder records settle through the same parse + validate\n * gate the delegate applies; researcher records settle through the\n * agent-knowledge preset when the peer is installed. Profiles without resume\n * support (ui-auditor, researcher-without-peer) fail loud — the record settles\n * as failed with the reason instead of fabricating an output.\n */\nfunction buildResumeDriver(args: {\n sandboxClient: SandboxClient\n researcherResume: ResearcherResumeSupport | undefined\n}): DelegationResumeDriver {\n const client = args.sandboxClient as SandboxClient & {\n get?: (id: string) => Promise<SandboxInstance | null>\n }\n return createDriveTurnResumeDriver({\n async resolveSandbox(sandboxId) {\n if (typeof client.get !== 'function') {\n throw new Error(\n 'agent-runtime-mcp: the sandbox client exposes no get(sandboxId); upgrade @tangle-network/sandbox to >= 0.6 to resume detached delegations',\n )\n }\n const box = await client.get(sandboxId)\n if (!box) {\n throw new Error(\n `agent-runtime-mcp: sandbox ${sandboxId} no longer exists — the detached run cannot be resumed`,\n )\n }\n return box as unknown as DriveTurnCapableBox\n },\n buildMessage(record) {\n if (record.profile === 'coder') {\n const task = coderTaskFromArgs(record.args as DelegateCodeArgs)\n return coderProfile({ task }).taskToPrompt(task)\n }\n if (record.profile === 'researcher' && args.researcherResume) {\n return args.researcherResume.message(record.args as DelegateResearchArgs)\n }\n throw new Error(\n `agent-runtime-mcp: no detached resume support for profile \"${record.profile}\"`,\n )\n },\n async settleOutput(turn, record, ctx) {\n if (record.profile === 'coder') {\n if (!record.detachedSessionRef) {\n throw new Error(\n `agent-runtime-mcp: record ${record.taskId} reached the resume settle without a detachedSessionRef`,\n )\n }\n return settleDetachedCoderTurn(turn, {\n task: coderTaskFromArgs(record.args as DelegateCodeArgs),\n sessionId: parseDetachedSessionRef(record.detachedSessionRef).sessionId,\n signal: ctx.signal,\n })\n }\n if (record.profile === 'researcher' && args.researcherResume) {\n return args.researcherResume.settle(turn, record.args as DelegateResearchArgs, ctx.signal)\n }\n throw new Error(\n `agent-runtime-mcp: no detached resume support for profile \"${record.profile}\"`,\n )\n },\n })\n}\n\nfunction parseRetention(raw: string | undefined): number | undefined {\n if (raw === undefined || raw.trim() === '') return undefined\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1) {\n process.stderr.write(\n `agent-runtime-mcp: AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL must be a positive integer, got \"${raw}\"\\n`,\n )\n process.exit(2)\n }\n return n\n}\n\nasync function loadSandboxClient(apiKey: string | undefined): Promise<SandboxClient> {\n // Diagnostic mode: AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 enables tools/list + the\n // queue-bound tools (status / history / feedback) without sandbox creds.\n // Coder + researcher delegations require a real client; the stub fails loud\n // at create() so the agent observes the cause instead of silent success.\n if (!apiKey) {\n return {\n async create() {\n throw new Error(\n 'agent-runtime-mcp: TANGLE_API_KEY is unset; coder/researcher delegations are disabled in diagnostic mode. Set TANGLE_API_KEY or use MCP_DISABLE_CODER=1 MCP_DISABLE_RESEARCHER=1 to remove the unsupported tools from the tool list.',\n )\n },\n } satisfies SandboxClient\n }\n // Dynamic import keeps the bin importable in environments that haven't\n // installed `@tangle-network/sandbox` yet (the runtime package lists it\n // as a peer dep, not a hard dep).\n const mod = await import('@tangle-network/sandbox').catch((err) => {\n process.stderr.write(\n `agent-runtime-mcp: failed to load @tangle-network/sandbox (${err.message}); install the peer dependency\\n`,\n )\n process.exit(2)\n })\n const SandboxCtor = (mod as { Sandbox?: new (config: unknown) => SandboxClient }).Sandbox\n if (!SandboxCtor) {\n process.stderr.write(\n 'agent-runtime-mcp: @tangle-network/sandbox does not export Sandbox; cannot construct client\\n',\n )\n process.exit(2)\n }\n const baseUrl = process.env.SANDBOX_BASE_URL\n return new SandboxCtor({\n apiKey,\n ...(baseUrl ? { baseUrl } : {}),\n })\n}\n\ninterface ResearcherProfilePreset {\n agentRunSpec: Parameters<typeof runLoop>[0]['agentRun'] extends infer T ? NonNullable<T> : never\n output: Parameters<typeof runLoop>[0]['output']\n validator: Parameters<typeof runLoop>[0]['validator']\n}\n\ninterface ResearcherFanoutPreset {\n agentRuns: NonNullable<Parameters<typeof runLoop>[0]['agentRuns']>\n output: Parameters<typeof runLoop>[0]['output']\n validator: Parameters<typeof runLoop>[0]['validator']\n driver: Parameters<typeof runLoop>[0]['driver']\n}\n\ninterface ResearcherSupport {\n delegate: ResearcherDelegate\n resume: ResearcherResumeSupport\n}\n\nasync function loadResearcherSupport(\n executor: DelegationExecutor,\n maxConcurrency: number,\n traceEmitter?: LoopTraceEmitter,\n): Promise<ResearcherSupport | undefined> {\n const sandboxClient = executor.client\n // Optional peer — when `@tangle-network/agent-knowledge` isn't installed,\n // we silently omit the researcher tool from the advertisement. The\n // dynamic-import path is resolved at runtime; TypeScript cannot see the\n // peer, so we type the module structurally rather than via its own\n // declaration file.\n const profilesSpecifier = '@tangle-network/agent-knowledge/profiles'\n const mod = await import(profilesSpecifier).catch(() => undefined)\n if (!mod) return undefined\n type SingleFactory = (opts: { task: unknown }) => ResearcherProfilePreset\n type FanoutFactory = (opts: { task: unknown }) => ResearcherFanoutPreset\n const fanoutFactory = (mod as { multiHarnessResearcherFanout?: FanoutFactory })\n .multiHarnessResearcherFanout\n const singleFactory = (mod as { researcherProfile?: SingleFactory }).researcherProfile\n if (!fanoutFactory || !singleFactory) return undefined\n\n const settleSingle = async (\n turn: DetachedTurn,\n args: DelegateResearchArgs,\n sessionId: string,\n signal: AbortSignal,\n ): Promise<ResearchOutputShape> => {\n const task = buildResearchTask(args)\n const preset = singleFactory({ task })\n if (!preset.validator) {\n throw new Error('agent-runtime-mcp: researcher preset exposes no validator; cannot settle')\n }\n const parsed = preset.output.parse(detachedTurnEvents(sessionId, turn))\n const verdict = await preset.validator.validate(parsed, { iteration: 0, signal })\n if ((verdict as { valid?: boolean }).valid !== true) {\n throw new Error('researcher delegate produced no winner')\n }\n return parsed as ResearchOutputShape\n }\n\n const delegate: ResearcherDelegate = async (args, ctx) => {\n const task = buildResearchTask(args)\n const variants = Math.max(1, Math.trunc(args.variants ?? 1))\n const loopEmitter = composeLoopTraceEmitters(traceEmitter, ctx.traceEmitter)\n ctx.report({ iteration: 0, phase: 'starting' })\n if (variants <= 1) {\n const preset = singleFactory({ task })\n // Detached dispatch — same contract as the coder delegate: one session\n // on one box, driveTurn ticks, resume key bound to the sandbox id.\n if (ctx.detachedSessionRef !== undefined && ctx.updateDetachedSessionRef) {\n const { sessionId } = parseDetachedSessionRef(ctx.detachedSessionRef)\n const rebind = ctx.updateDetachedSessionRef\n const spec = preset.agentRunSpec as AgentRunSpec<unknown>\n const turn = await runDetachedTurn({\n client: sandboxClient,\n spec,\n prompt: spec.taskToPrompt(task),\n sessionId,\n bindSandbox: (sandboxId) => rebind(formatDetachedSessionRef({ sandboxId, sessionId })),\n signal: ctx.signal,\n report: ctx.report,\n ...(loopEmitter ? { traceEmitter: loopEmitter } : {}),\n ...(executor.placement === 'fleet' ? { placement: 'fleet' as const } : {}),\n })\n const output = await settleSingle(turn, args, sessionId, ctx.signal)\n ctx.report({ iteration: 1, phase: 'completed' })\n return output\n }\n const result = await runLoop({\n driver: {\n name: 'mcp-researcher-single',\n async plan(t, history) {\n return history.length === 0 ? [t] : []\n },\n decide(history) {\n return history.length > 0 ? 'pick-winner' : 'fail'\n },\n },\n agentRun: preset.agentRunSpec,\n output: preset.output,\n validator: preset.validator,\n task,\n ctx: {\n sandboxClient,\n signal: ctx.signal,\n ...(loopEmitter ? { traceEmitter: loopEmitter } : {}),\n },\n maxIterations: 1,\n maxConcurrency,\n })\n const output = result.winner?.output\n if (!output) throw new Error('researcher delegate produced no winner')\n ctx.report({ iteration: 1, phase: 'completed' })\n return output as ResearchOutputShape\n }\n const fanout = fanoutFactory({ task })\n const result = await runLoop({\n driver: fanout.driver,\n agentRuns: fanout.agentRuns.slice(0, variants),\n output: fanout.output,\n validator: fanout.validator,\n task,\n ctx: {\n sandboxClient,\n signal: ctx.signal,\n ...(loopEmitter ? { traceEmitter: loopEmitter } : {}),\n },\n maxIterations: variants,\n maxConcurrency: Math.min(maxConcurrency, variants),\n })\n const output = result.winner?.output\n if (!output) throw new Error('researcher delegate fanout produced no winner')\n ctx.report({ iteration: result.iterations.length, phase: 'completed' })\n return output as ResearchOutputShape\n }\n\n return {\n delegate,\n resume: {\n message(args) {\n const task = buildResearchTask(args)\n const spec = singleFactory({ task }).agentRunSpec as AgentRunSpec<unknown>\n return spec.taskToPrompt(task)\n },\n async settle(turn, args, signal) {\n // The session id is only the synthesized event's id — the parser reads\n // data.result / data.text, never the id.\n return settleSingle(turn, args, 'resumed-detached-turn', signal)\n },\n },\n }\n}\n\nfunction buildResearchTask(args: DelegateResearchArgs): unknown {\n return {\n question: args.question,\n knowledgeNamespace: args.namespace,\n scope: args.scope,\n sources: args.sources,\n recencyWindow: args.config?.recencyWindow\n ? {\n since: args.config.recencyWindow.since\n ? new Date(args.config.recencyWindow.since)\n : undefined,\n until: args.config.recencyWindow.until\n ? new Date(args.config.recencyWindow.until)\n : undefined,\n }\n : undefined,\n maxItems: args.config?.maxItems,\n minConfidence: args.config?.minConfidence,\n }\n}\n\nfunction parseHarnesses(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined\n const list = raw\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n return list.length > 0 ? list : undefined\n}\n\nfunction parseFleetId(raw: string | undefined): string | undefined {\n if (typeof raw !== 'string') return undefined\n const trimmed = raw.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nfunction parseConcurrency(raw: string | undefined): number {\n if (!raw) return 4\n const n = Number(raw)\n if (!Number.isFinite(n) || n < 1) return 4\n return Math.min(Math.trunc(n), 32)\n}\n\nmain().catch((err) => {\n process.stderr.write(`agent-runtime-mcp: ${err instanceof Error ? err.stack : String(err)}\\n`)\n process.exit(1)\n})\n"],"mappings":"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","names":["output","result"]}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import { S as SandboxClient,
|
|
2
|
-
import { c as FleetHandle, d as DelegationExecutor, e as DelegateFeedbackArgs, f as DelegationFeedbackSnapshot, g as DelegationTaskQueue, h as CoderDelegate, R as ResearcherDelegate, U as UiAuditorDelegate, D as DelegateCodeArgs, i as DelegateCodeResult, j as DelegateFeedbackResult, k as ResearchSource, l as DelegateResearchArgs, m as DelegateResearchResult, n as DelegateUiAuditArgs, o as DelegateUiAuditResult, p as DelegationHistoryResult, q as DelegationHistoryArgs, r as DelegationStatusResult, s as DelegationStatusArgs } from '../kb-gate-
|
|
3
|
-
export { t as CoderReview, C as CoderReviewer, a as CoderWinnerSelection,
|
|
1
|
+
import { S as SandboxClient, e as LoopSandboxPlacement } from '../types-BEQsBhOE.js';
|
|
2
|
+
import { c as FleetHandle, d as DelegationExecutor, e as DelegateFeedbackArgs, f as DelegationFeedbackSnapshot, g as DelegationTaskQueue, h as CoderDelegate, R as ResearcherDelegate, U as UiAuditorDelegate, T as TraceContext, D as DelegateCodeArgs, i as DelegateCodeResult, j as DelegateFeedbackResult, k as ResearchSource, l as DelegateResearchArgs, m as DelegateResearchResult, n as DelegateUiAuditArgs, o as DelegateUiAuditResult, p as DelegationHistoryResult, q as DelegationHistoryArgs, r as DelegationStatusResult, s as DelegationStatusArgs } from '../kb-gate-CHAyt4aI.js';
|
|
3
|
+
export { t as CappedDelegationTrace, u as CoderReview, C as CoderReviewer, a as CoderWinnerSelection, v as CreateDefaultCoderDelegateOptions, b as CreateKbGateOptions, w as DELEGATION_TRACE_MAX_BYTES, x as DELEGATION_TRACE_MAX_SPANS, y as DelegateCodeConfig, z as DelegateResearchConfig, A as DelegateRunCtx, B as DelegateUiAuditConfig, E as DelegateUiAuditRoute, G as DelegationError, H as DelegationHistoryEntry, I as DelegationPersistenceError, J as DelegationProfile, K as DelegationProgress, L as DelegationRecord, M as DelegationResultPayload, N as DelegationResumeContext, O as DelegationResumeDriver, P as DelegationResumeTick, Q as DelegationRunContext, S as DelegationStateCorruptError, V as DelegationStatus, W as DelegationStore, X as DelegationTaskQueueOptions, Y as DelegationTraceCaps, Z as DelegationTraceCollector, _ as DelegationTraceSpan, $ as DetachedSessionRefParts, a0 as DetachedTurn, a1 as DriveTurnCapableBox, a2 as DriveTurnResumeDriverOptions, a3 as DriveTurnTick, F as FactCandidate, a4 as FactJudge, a5 as FactJudgeVerdict, a6 as FeedbackRating, a7 as FeedbackRefersTo, a8 as FileDelegationStore, a9 as FileDelegationStoreOptions, aa as FleetWorkspaceExecutorOptions, ab as InMemoryDelegationStore, ac as KbGateResult, ad as ResearchOutputShape, ae as RunDetachedTurnOptions, af as SettleDetachedCoderTurnOptions, ag as SiblingSandboxExecutorOptions, ah as SubmitInput, ai as SubmitOutput, aj as UiAuditorDelegationOutput, ak as buildDelegationTraceSpans, al as capDelegationTrace, am as coderTaskFromArgs, an as composeLoopTraceEmitters, ao as createDefaultCoderDelegate, ap as createDelegationTraceCollector, aq as createDriveTurnResumeDriver, ar as createFleetWorkspaceExecutor, as as createKbGate, at as createPropagatingTraceEmitter, au as createSiblingSandboxExecutor, av as detachedTurnEvents, aw as formatDetachedSessionRef, ax as hashIdempotencyInput, ay as parseDetachedSessionRef, az as readTraceContextFromEnv, aA as runDetachedTurn, aB as settleDetachedCoderTurn, aC as traceContextToEnv } from '../kb-gate-CHAyt4aI.js';
|
|
4
4
|
export { B as BuildDelegationMcpServerOptions, C as ComposeProductionAgentProfileOptions, D as DELEGATION_MCP_SERVER_KEY, b as buildDelegationMcpServer, c as composeProductionAgentProfile } from '../delegation-profile-1GbW5yA3.js';
|
|
5
5
|
import { L as LocalHarness, r as runLocalHarness } from '../local-harness-KrdFTY5R.js';
|
|
6
6
|
export { a as LocalHarnessResult, R as RunLocalHarnessOptions } from '../local-harness-KrdFTY5R.js';
|
|
7
|
-
|
|
8
|
-
export { m as mcpToolsForRuntimeMcp, a as mcpToolsForRuntimeMcpSubset } from '../otel-export-EzfsVUhh.js';
|
|
7
|
+
export { m as mcpToolsForRuntimeMcp, a as mcpToolsForRuntimeMcpSubset } from '../openai-tools-D4HLDWgw.js';
|
|
9
8
|
import { AnalystFinding } from '@tangle-network/agent-eval';
|
|
10
|
-
import { S as Scope, R as ResultBlobStore, A as Agent, B as Budget } from '../types-
|
|
9
|
+
import { S as Scope, R as ResultBlobStore, A as Agent, B as Budget } from '../types-5MGt5KTY.js';
|
|
11
10
|
import { a as UiLens } from '../substrate-CUgk7F7s.js';
|
|
12
11
|
import '@tangle-network/sandbox';
|
|
13
12
|
import '../runtime-hooks-C7JwKb9E.js';
|
|
14
|
-
import '../coder-
|
|
13
|
+
import '../coder-_YCf3BAK.js';
|
|
15
14
|
import 'node:child_process';
|
|
16
15
|
|
|
17
16
|
/**
|
|
@@ -345,6 +344,12 @@ interface McpServerOptions {
|
|
|
345
344
|
* duplicate name throws so delegation tools cannot be shadowed silently.
|
|
346
345
|
*/
|
|
347
346
|
extraTools?: McpToolDescriptor[];
|
|
347
|
+
/**
|
|
348
|
+
* Inherited trace identity (`readTraceContextFromEnv()`) stamped on every
|
|
349
|
+
* record the DEFAULT queue creates. Ignored when `queue` is supplied —
|
|
350
|
+
* pass `traceContext` to that queue's constructor instead.
|
|
351
|
+
*/
|
|
352
|
+
traceContext?: TraceContext;
|
|
348
353
|
/** Server display name surfaced via `initialize`. Default `'agent-runtime-mcp'`. */
|
|
349
354
|
serverName?: string;
|
|
350
355
|
/** Server version surfaced via `initialize`. Default = the package version baked at build time. */
|
|
@@ -990,6 +995,10 @@ declare const DELEGATION_STATUS_INPUT_SCHEMA: {
|
|
|
990
995
|
readonly type: "string";
|
|
991
996
|
readonly description: "Returned by delegate_code / delegate_research.";
|
|
992
997
|
};
|
|
998
|
+
readonly includeTrace: {
|
|
999
|
+
readonly type: "boolean";
|
|
1000
|
+
readonly description: "Also return the journaled loop-trace span tree for this delegation. Default false.";
|
|
1001
|
+
};
|
|
993
1002
|
};
|
|
994
1003
|
readonly required: readonly ["taskId"];
|
|
995
1004
|
readonly additionalProperties: false;
|
|
@@ -1003,52 +1012,4 @@ interface DelegationStatusHandlerOptions {
|
|
|
1003
1012
|
/** @experimental */
|
|
1004
1013
|
declare function createDelegationStatusHandler(options: DelegationStatusHandlerOptions): (raw: unknown) => Promise<DelegationStatusResult>;
|
|
1005
1014
|
|
|
1006
|
-
|
|
1007
|
-
* @experimental
|
|
1008
|
-
*
|
|
1009
|
-
* Trace context propagation for MCP subprocess.
|
|
1010
|
-
*
|
|
1011
|
-
* When the MCP server is launched as a child process by a sandbox harness,
|
|
1012
|
-
* the parent passes trace context via environment variables:
|
|
1013
|
-
*
|
|
1014
|
-
* TRACE_ID=<current-run-trace-id>
|
|
1015
|
-
* PARENT_SPAN_ID=<span-that-dispatched-the-delegation>
|
|
1016
|
-
*
|
|
1017
|
-
* The MCP server reads these at startup and uses them as the root of its
|
|
1018
|
-
* internal trace tree. All spans emitted by `runLoop` invocations inside
|
|
1019
|
-
* the MCP are children of the parent's delegation span.
|
|
1020
|
-
*
|
|
1021
|
-
* When these env vars are absent, the MCP generates a fresh trace root —
|
|
1022
|
-
* the server operates standalone without trace joining.
|
|
1023
|
-
*/
|
|
1024
|
-
|
|
1025
|
-
interface TraceContext {
|
|
1026
|
-
/** Trace id inherited from the parent process, or a fresh one. */
|
|
1027
|
-
traceId: string;
|
|
1028
|
-
/** Parent span id from the delegation that launched this MCP server. */
|
|
1029
|
-
parentSpanId?: string;
|
|
1030
|
-
}
|
|
1031
|
-
/**
|
|
1032
|
-
* Read trace context from the process environment.
|
|
1033
|
-
* Returns a context with inherited ids or a freshly generated root.
|
|
1034
|
-
*/
|
|
1035
|
-
declare function readTraceContextFromEnv(): TraceContext;
|
|
1036
|
-
/**
|
|
1037
|
-
* Create a LoopTraceEmitter that:
|
|
1038
|
-
* 1. Parents all spans under the inherited PARENT_SPAN_ID.
|
|
1039
|
-
* 2. Exports spans to OTEL when OTEL_EXPORTER_OTLP_ENDPOINT is set.
|
|
1040
|
-
*
|
|
1041
|
-
* Returns both the emitter and the optional exporter handle for shutdown.
|
|
1042
|
-
*/
|
|
1043
|
-
declare function createPropagatingTraceEmitter(ctx: TraceContext): {
|
|
1044
|
-
emitter: LoopTraceEmitter;
|
|
1045
|
-
exporter: OtelExporter | undefined;
|
|
1046
|
-
context: TraceContext;
|
|
1047
|
-
};
|
|
1048
|
-
/**
|
|
1049
|
-
* Build env vars to pass to a child MCP subprocess so it inherits the
|
|
1050
|
-
* current trace context.
|
|
1051
|
-
*/
|
|
1052
|
-
declare function traceContextToEnv(ctx: TraceContext): Record<string, string>;
|
|
1053
|
-
|
|
1054
|
-
export { type AnalystRegistry, type Check, type CheckRunnerOptions, CoderDelegate, type CoordinationEvent, type CoordinationTools, type CoordinationToolsOptions, type CreateWorktreeOptions, DELEGATE_CODE_DESCRIPTION, DELEGATE_CODE_INPUT_SCHEMA, DELEGATE_CODE_TOOL_NAME, DELEGATE_FEEDBACK_DESCRIPTION, DELEGATE_FEEDBACK_INPUT_SCHEMA, DELEGATE_FEEDBACK_TOOL_NAME, DELEGATE_RESEARCH_DESCRIPTION, DELEGATE_RESEARCH_INPUT_SCHEMA, DELEGATE_RESEARCH_TOOL_NAME, DELEGATE_UI_AUDIT_DESCRIPTION, DELEGATE_UI_AUDIT_INPUT_SCHEMA, DELEGATE_UI_AUDIT_TOOL_NAME, DELEGATION_HISTORY_DESCRIPTION, DELEGATION_HISTORY_INPUT_SCHEMA, DELEGATION_HISTORY_TOOL_NAME, DELEGATION_STATUS_DESCRIPTION, DELEGATION_STATUS_INPUT_SCHEMA, DELEGATION_STATUS_TOOL_NAME, DelegateCodeArgs, DelegateCodeResult, DelegateFeedbackArgs, DelegateFeedbackResult, DelegateResearchArgs, DelegateResearchResult, DelegateUiAuditArgs, DelegateUiAuditResult, DelegationExecutor, DelegationFeedbackSnapshot, DelegationHistoryArgs, DelegationHistoryResult, DelegationStatusArgs, DelegationStatusResult, DelegationTaskQueue, type DetectExecutorArgs, type DiffOptions, type DiffResult, type FeedbackEvent, type FeedbackStore, FleetHandle, type GitRunner, InMemoryFeedbackStore, type InProcessExecutorDescribePlacement, type InProcessExecutorOptions, type JsonRpcMessage, type JsonRpcResponse, LocalHarness, type MakeWorkerAgent, type McpServer, type McpServerOptions, type McpToolDescriptor, type McpTransport, type Question, type QuestionDecision, type QuestionPolicy, type QuestionRecord, type RemoveWorktreeOptions, ResearchSource, ResearcherDelegate, type SettledWorker, type TraceContext, UiAuditorDelegate, type WorktreeHandle, captureWorktreeDiff, createCoordinationTools, createDelegateCodeHandler, createDelegateFeedbackHandler, createDelegateResearchHandler, createDelegateUiAuditHandler, createDelegationHistoryHandler, createDelegationStatusHandler, createInProcessExecutor, createInProcessTransport, createMcpServer, createPropagatingTraceEmitter, createWorktree, defaultChecks, detectExecutor, eventToSnapshot, liftFindings, makeCheckRunner, readTraceContextFromEnv, removeWorktree, renderTrace, runCheck, runLocalHarness, traceContextToEnv, validateDelegateCodeArgs, validateDelegateFeedbackArgs, validateDelegateResearchArgs, validateDelegateUiAuditArgs, validateDelegationHistoryArgs, validateDelegationStatusArgs };
|
|
1015
|
+
export { type AnalystRegistry, type Check, type CheckRunnerOptions, CoderDelegate, type CoordinationEvent, type CoordinationTools, type CoordinationToolsOptions, type CreateWorktreeOptions, DELEGATE_CODE_DESCRIPTION, DELEGATE_CODE_INPUT_SCHEMA, DELEGATE_CODE_TOOL_NAME, DELEGATE_FEEDBACK_DESCRIPTION, DELEGATE_FEEDBACK_INPUT_SCHEMA, DELEGATE_FEEDBACK_TOOL_NAME, DELEGATE_RESEARCH_DESCRIPTION, DELEGATE_RESEARCH_INPUT_SCHEMA, DELEGATE_RESEARCH_TOOL_NAME, DELEGATE_UI_AUDIT_DESCRIPTION, DELEGATE_UI_AUDIT_INPUT_SCHEMA, DELEGATE_UI_AUDIT_TOOL_NAME, DELEGATION_HISTORY_DESCRIPTION, DELEGATION_HISTORY_INPUT_SCHEMA, DELEGATION_HISTORY_TOOL_NAME, DELEGATION_STATUS_DESCRIPTION, DELEGATION_STATUS_INPUT_SCHEMA, DELEGATION_STATUS_TOOL_NAME, DelegateCodeArgs, DelegateCodeResult, DelegateFeedbackArgs, DelegateFeedbackResult, DelegateResearchArgs, DelegateResearchResult, DelegateUiAuditArgs, DelegateUiAuditResult, DelegationExecutor, DelegationFeedbackSnapshot, DelegationHistoryArgs, DelegationHistoryResult, DelegationStatusArgs, DelegationStatusResult, DelegationTaskQueue, type DetectExecutorArgs, type DiffOptions, type DiffResult, type FeedbackEvent, type FeedbackStore, FleetHandle, type GitRunner, InMemoryFeedbackStore, type InProcessExecutorDescribePlacement, type InProcessExecutorOptions, type JsonRpcMessage, type JsonRpcResponse, LocalHarness, type MakeWorkerAgent, type McpServer, type McpServerOptions, type McpToolDescriptor, type McpTransport, type Question, type QuestionDecision, type QuestionPolicy, type QuestionRecord, type RemoveWorktreeOptions, ResearchSource, ResearcherDelegate, type SettledWorker, TraceContext, UiAuditorDelegate, type WorktreeHandle, captureWorktreeDiff, createCoordinationTools, createDelegateCodeHandler, createDelegateFeedbackHandler, createDelegateResearchHandler, createDelegateUiAuditHandler, createDelegationHistoryHandler, createDelegationStatusHandler, createInProcessExecutor, createInProcessTransport, createMcpServer, createWorktree, defaultChecks, detectExecutor, eventToSnapshot, liftFindings, makeCheckRunner, removeWorktree, renderTrace, runCheck, runLocalHarness, validateDelegateCodeArgs, validateDelegateFeedbackArgs, validateDelegateResearchArgs, validateDelegateUiAuditArgs, validateDelegationHistoryArgs, validateDelegationStatusArgs };
|
package/dist/mcp/index.js
CHANGED
|
@@ -14,12 +14,12 @@ import {
|
|
|
14
14
|
removeWorktree,
|
|
15
15
|
traceContextToEnv,
|
|
16
16
|
validateDelegateUiAuditArgs
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-NDM5VXZW.js";
|
|
18
18
|
import "../chunk-WIR4HOOJ.js";
|
|
19
19
|
import {
|
|
20
20
|
mcpToolsForRuntimeMcp,
|
|
21
21
|
mcpToolsForRuntimeMcpSubset
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-ML4IXGTV.js";
|
|
23
23
|
import {
|
|
24
24
|
DELEGATE_CODE_DESCRIPTION,
|
|
25
25
|
DELEGATE_CODE_INPUT_SCHEMA,
|
|
@@ -54,13 +54,19 @@ import {
|
|
|
54
54
|
validateDelegateResearchArgs,
|
|
55
55
|
validateDelegationHistoryArgs,
|
|
56
56
|
validateDelegationStatusArgs
|
|
57
|
-
} from "../chunk-
|
|
57
|
+
} from "../chunk-RHW75JW5.js";
|
|
58
58
|
import {
|
|
59
59
|
createKbGate
|
|
60
60
|
} from "../chunk-FNMGYYSS.js";
|
|
61
61
|
import {
|
|
62
|
+
DELEGATION_TRACE_MAX_BYTES,
|
|
63
|
+
DELEGATION_TRACE_MAX_SPANS,
|
|
64
|
+
buildDelegationTraceSpans,
|
|
65
|
+
capDelegationTrace,
|
|
62
66
|
coderTaskFromArgs,
|
|
67
|
+
composeLoopTraceEmitters,
|
|
63
68
|
createDefaultCoderDelegate,
|
|
69
|
+
createDelegationTraceCollector,
|
|
64
70
|
createDriveTurnResumeDriver,
|
|
65
71
|
createFleetWorkspaceExecutor,
|
|
66
72
|
createSiblingSandboxExecutor,
|
|
@@ -69,7 +75,7 @@ import {
|
|
|
69
75
|
parseDetachedSessionRef,
|
|
70
76
|
runDetachedTurn,
|
|
71
77
|
settleDetachedCoderTurn
|
|
72
|
-
} from "../chunk-
|
|
78
|
+
} from "../chunk-OM3YNZIW.js";
|
|
73
79
|
import "../chunk-KADIJAD4.js";
|
|
74
80
|
import {
|
|
75
81
|
runLocalHarness
|
|
@@ -81,7 +87,7 @@ import {
|
|
|
81
87
|
} from "../chunk-7JITYN6T.js";
|
|
82
88
|
import {
|
|
83
89
|
assertTraceDerivedFindings
|
|
84
|
-
} from "../chunk-
|
|
90
|
+
} from "../chunk-CM2IK7VS.js";
|
|
85
91
|
import "../chunk-GSUO5QS6.js";
|
|
86
92
|
import "../chunk-DGUM43GV.js";
|
|
87
93
|
|
|
@@ -590,6 +596,8 @@ export {
|
|
|
590
596
|
DELEGATION_STATUS_DESCRIPTION,
|
|
591
597
|
DELEGATION_STATUS_INPUT_SCHEMA,
|
|
592
598
|
DELEGATION_STATUS_TOOL_NAME,
|
|
599
|
+
DELEGATION_TRACE_MAX_BYTES,
|
|
600
|
+
DELEGATION_TRACE_MAX_SPANS,
|
|
593
601
|
DelegationPersistenceError,
|
|
594
602
|
DelegationStateCorruptError,
|
|
595
603
|
DelegationTaskQueue,
|
|
@@ -597,8 +605,11 @@ export {
|
|
|
597
605
|
InMemoryDelegationStore,
|
|
598
606
|
InMemoryFeedbackStore,
|
|
599
607
|
buildDelegationMcpServer,
|
|
608
|
+
buildDelegationTraceSpans,
|
|
609
|
+
capDelegationTrace,
|
|
600
610
|
captureWorktreeDiff,
|
|
601
611
|
coderTaskFromArgs,
|
|
612
|
+
composeLoopTraceEmitters,
|
|
602
613
|
composeProductionAgentProfile,
|
|
603
614
|
createCoordinationTools,
|
|
604
615
|
createDefaultCoderDelegate,
|
|
@@ -608,6 +619,7 @@ export {
|
|
|
608
619
|
createDelegateUiAuditHandler,
|
|
609
620
|
createDelegationHistoryHandler,
|
|
610
621
|
createDelegationStatusHandler,
|
|
622
|
+
createDelegationTraceCollector,
|
|
611
623
|
createDriveTurnResumeDriver,
|
|
612
624
|
createFleetWorkspaceExecutor,
|
|
613
625
|
createInProcessExecutor,
|