@tangle-network/agent-runtime 0.68.0 → 0.70.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/README.md +81 -13
- package/dist/agent.d.ts +4 -5
- package/dist/agent.js +3 -6
- package/dist/agent.js.map +1 -1
- package/dist/chunk-BYZCXQHF.js +474 -0
- package/dist/chunk-BYZCXQHF.js.map +1 -0
- package/dist/{chunk-OYU5LR4T.js → chunk-EDCVUZZC.js} +2 -2
- package/dist/{chunk-QNUEFNU7.js → chunk-L5ZFBVT6.js} +6 -6
- package/dist/chunk-L5ZFBVT6.js.map +1 -0
- package/dist/{chunk-VKUHUFX7.js → chunk-QXWGSDAQ.js} +914 -590
- package/dist/chunk-QXWGSDAQ.js.map +1 -0
- package/dist/{chunk-LTEF2LYD.js → chunk-ZNQVMMR5.js} +3 -3
- package/dist/{coordination-Curpzeyc.d.ts → coordination-C7WxwHXq.d.ts} +8 -1
- package/dist/{delegates-CLFNAKyi.d.ts → delegates-DqAgo32T.d.ts} +105 -10
- package/dist/{improvement-adapter-BC4HhuAR.d.ts → improvement-adapter-BVuMragr.d.ts} +1 -1
- package/dist/index.d.ts +439 -100
- package/dist/index.js +583 -125
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +2 -3
- package/dist/{loop-runner-bin-B6dzNZC8.d.ts → loop-runner-bin-B0NeLTRd.d.ts} +4 -4
- package/dist/loop-runner-bin.d.ts +7 -10
- package/dist/loop-runner-bin.js +4 -7
- package/dist/loops.d.ts +3149 -16
- package/dist/loops.js +34 -63
- package/dist/mcp/bin.js +14 -16
- package/dist/mcp/bin.js.map +1 -1
- package/dist/mcp/index.d.ts +8 -12
- package/dist/mcp/index.js +16 -19
- package/dist/mcp/index.js.map +1 -1
- package/dist/{openai-tools-CA2N3-Ak.d.ts → openai-tools-DPx9Gzvn.d.ts} +1 -1
- package/dist/profiles.d.ts +94 -6
- package/dist/profiles.js +320 -9
- package/dist/profiles.js.map +1 -1
- package/dist/{router-client-30Y_pca8.d.ts → router-client-C7kp_ECN.d.ts} +37 -1
- package/dist/{substrate-CUgk7F7s.d.ts → substrate-BoRXgvka.d.ts} +52 -1
- package/dist/{types-Crxftafi.d.ts → types-BYa2ZOAx.d.ts} +83 -2
- package/dist/{types-p8dWBIXL.d.ts → types-DJu6TBGp.d.ts} +2 -16
- package/dist/{worktree-fanout-DUiKPApb.d.ts → worktree-fanout-gNfl0Byj.d.ts} +9 -37
- package/package.json +9 -39
- package/dist/analyst-loop.d.ts +0 -52
- package/dist/analyst-loop.js +0 -11
- package/dist/analyst-loop.js.map +0 -1
- package/dist/audit.d.ts +0 -93
- package/dist/audit.js +0 -312
- package/dist/audit.js.map +0 -1
- package/dist/chunk-4B6U4CVQ.js +0 -15
- package/dist/chunk-4B6U4CVQ.js.map +0 -1
- package/dist/chunk-FCIPUALH.js +0 -214
- package/dist/chunk-FCIPUALH.js.map +0 -1
- package/dist/chunk-O2UPHN7X.js +0 -114
- package/dist/chunk-O2UPHN7X.js.map +0 -1
- package/dist/chunk-P5OKDSLB.js +0 -580
- package/dist/chunk-P5OKDSLB.js.map +0 -1
- package/dist/chunk-QNUEFNU7.js.map +0 -1
- package/dist/chunk-VKUHUFX7.js.map +0 -1
- package/dist/chunk-VLF5RHEQ.js +0 -143
- package/dist/chunk-VLF5RHEQ.js.map +0 -1
- package/dist/coder-2leJPOvC.d.ts +0 -52
- package/dist/improvement.d.ts +0 -208
- package/dist/improvement.js +0 -343
- package/dist/improvement.js.map +0 -1
- package/dist/local-harness-BE_h8szs.d.ts +0 -93
- package/dist/platform.d.ts +0 -255
- package/dist/platform.js +0 -229
- package/dist/platform.js.map +0 -1
- package/dist/run-loop-D3PwlG7J.d.ts +0 -112
- package/dist/runtime-hooks-C7JwKb9E.d.ts +0 -70
- package/dist/runtime.d.ts +0 -3108
- package/dist/runtime.js +0 -263
- package/dist/runtime.js.map +0 -1
- package/dist/topology.d.ts +0 -126
- package/dist/topology.js +0 -333
- package/dist/topology.js.map +0 -1
- package/dist/workflow.d.ts +0 -551
- package/dist/workflow.js +0 -1781
- package/dist/workflow.js.map +0 -1
- /package/dist/{chunk-OYU5LR4T.js.map → chunk-EDCVUZZC.js.map} +0 -0
- /package/dist/{chunk-LTEF2LYD.js.map → chunk-ZNQVMMR5.js.map} +0 -0
package/dist/loops.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FileCorpus,
|
|
3
|
-
FileResultBlobStore,
|
|
4
|
-
FileSpawnJournal,
|
|
5
3
|
InMemoryCorpus,
|
|
6
4
|
InMemoryResultBlobStore,
|
|
7
5
|
InMemorySpawnJournal,
|
|
@@ -10,19 +8,20 @@ import {
|
|
|
10
8
|
analyzeTrace,
|
|
11
9
|
anytimeReport,
|
|
12
10
|
asAuthoredProfile,
|
|
11
|
+
assertModelAllowed,
|
|
13
12
|
assertStrategyContract,
|
|
14
13
|
assertTraceDerivedFindings,
|
|
14
|
+
assessAuthoredProfile,
|
|
15
15
|
auditIntent,
|
|
16
16
|
authorStrategy,
|
|
17
17
|
authoredWorker,
|
|
18
|
-
|
|
18
|
+
breadthStrategy,
|
|
19
19
|
buildSteerContext,
|
|
20
20
|
builtinShapes,
|
|
21
21
|
cliWorktreeExecutor,
|
|
22
22
|
completionAuthorizes,
|
|
23
|
+
computeFindingId,
|
|
23
24
|
contentAddress,
|
|
24
|
-
coordinationDriverAgent,
|
|
25
|
-
countDiffLines,
|
|
26
25
|
createBudgetPool,
|
|
27
26
|
createEventBus,
|
|
28
27
|
createExecutor,
|
|
@@ -30,10 +29,7 @@ import {
|
|
|
30
29
|
createInMemoryRunContext,
|
|
31
30
|
createInbox,
|
|
32
31
|
createMcpEnvironment,
|
|
33
|
-
createPartsTraceSource,
|
|
34
32
|
createPushTraceSource,
|
|
35
|
-
createRootHandle,
|
|
36
|
-
createSandboxForSpec,
|
|
37
33
|
createSandboxLineage,
|
|
38
34
|
createScope,
|
|
39
35
|
createScopeAnalyst,
|
|
@@ -42,37 +38,33 @@ import {
|
|
|
42
38
|
createVerifierEnvironment,
|
|
43
39
|
createWaterfallCollector,
|
|
44
40
|
createWorktreeCliExecutor,
|
|
45
|
-
decodeAnthropicPart,
|
|
46
|
-
decodeOpenAiPart,
|
|
47
|
-
decodeOpencodePart,
|
|
48
41
|
decodeToolPart,
|
|
49
42
|
defaultAnalystInstruction,
|
|
50
43
|
defaultAuditorInstruction,
|
|
44
|
+
defaultProfileRichnessThresholds,
|
|
51
45
|
defaultSelectWinner,
|
|
52
46
|
defaultToolDetectors,
|
|
53
47
|
definePersona,
|
|
54
48
|
defineStrategy,
|
|
55
|
-
|
|
49
|
+
depthStrategy,
|
|
56
50
|
deterministicCompletion,
|
|
57
51
|
discriminatingMeans,
|
|
58
|
-
|
|
59
|
-
driverExecutorFactory,
|
|
60
|
-
driverRuntime,
|
|
52
|
+
driverAgent,
|
|
61
53
|
equalKOnCost,
|
|
54
|
+
extractLlmCallEvent,
|
|
62
55
|
fanout,
|
|
56
|
+
finalizeBestDelivered,
|
|
63
57
|
flatWidenGate,
|
|
64
58
|
gateOnDeliverable,
|
|
65
59
|
gitWorkspace,
|
|
66
60
|
harvestCorpus,
|
|
67
61
|
inlineSandboxClient,
|
|
68
|
-
isDriverSpec,
|
|
69
|
-
isNonEmptyPatch,
|
|
70
62
|
jjWorkspace,
|
|
71
63
|
localShell,
|
|
72
64
|
loopDispatch,
|
|
73
65
|
loopUntil,
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
makeFinding,
|
|
67
|
+
mapSandboxEvent,
|
|
76
68
|
observe,
|
|
77
69
|
openSandboxRun,
|
|
78
70
|
panel,
|
|
@@ -81,6 +73,7 @@ import {
|
|
|
81
73
|
pipeline,
|
|
82
74
|
printBenchmarkReport,
|
|
83
75
|
probeSandboxCapabilities,
|
|
76
|
+
profileRichnessFinding,
|
|
84
77
|
promotionGate,
|
|
85
78
|
refine,
|
|
86
79
|
registerShape,
|
|
@@ -88,15 +81,13 @@ import {
|
|
|
88
81
|
renderAnytimeTable,
|
|
89
82
|
renderCorpusToInstructions,
|
|
90
83
|
renderReport,
|
|
91
|
-
replaySpawnTree,
|
|
92
84
|
reportLoopUsage,
|
|
85
|
+
routerBrain,
|
|
93
86
|
routerChatWithTools,
|
|
94
87
|
routerChatWithUsage,
|
|
95
|
-
routerDriverChat,
|
|
96
88
|
routerToolLoop,
|
|
97
89
|
runAgentic,
|
|
98
90
|
runBenchmark,
|
|
99
|
-
runCoderChecks,
|
|
100
91
|
runInWorkspace,
|
|
101
92
|
runLoop,
|
|
102
93
|
runPersonified,
|
|
@@ -112,30 +103,21 @@ import {
|
|
|
112
103
|
spendFromUsageEvents,
|
|
113
104
|
stopSentinel,
|
|
114
105
|
strategyAuthorContract,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
touchedPathsFromPatch,
|
|
119
|
-
touchesSecretPath,
|
|
106
|
+
supervise,
|
|
107
|
+
supervisorAgent,
|
|
108
|
+
supervisorInstructions,
|
|
120
109
|
trajectoryReport,
|
|
121
110
|
verify,
|
|
122
111
|
watchTrace,
|
|
123
112
|
widen,
|
|
124
|
-
|
|
113
|
+
workerFromBackend,
|
|
125
114
|
worktreeFanout
|
|
126
|
-
} from "./chunk-
|
|
127
|
-
import "./chunk-WIR4HOOJ.js";
|
|
128
|
-
import {
|
|
129
|
-
extractLlmCallEvent,
|
|
130
|
-
mapSandboxEvent
|
|
131
|
-
} from "./chunk-VLF5RHEQ.js";
|
|
132
|
-
import "./chunk-O2UPHN7X.js";
|
|
115
|
+
} from "./chunk-QXWGSDAQ.js";
|
|
133
116
|
import "./chunk-G3RGMA7C.js";
|
|
117
|
+
import "./chunk-WIR4HOOJ.js";
|
|
134
118
|
import "./chunk-DGUM43GV.js";
|
|
135
119
|
export {
|
|
136
120
|
FileCorpus,
|
|
137
|
-
FileResultBlobStore,
|
|
138
|
-
FileSpawnJournal,
|
|
139
121
|
InMemoryCorpus,
|
|
140
122
|
InMemoryResultBlobStore,
|
|
141
123
|
InMemorySpawnJournal,
|
|
@@ -144,19 +126,20 @@ export {
|
|
|
144
126
|
analyzeTrace,
|
|
145
127
|
anytimeReport,
|
|
146
128
|
asAuthoredProfile,
|
|
129
|
+
assertModelAllowed,
|
|
147
130
|
assertStrategyContract,
|
|
148
131
|
assertTraceDerivedFindings,
|
|
132
|
+
assessAuthoredProfile,
|
|
149
133
|
auditIntent,
|
|
150
134
|
authorStrategy,
|
|
151
135
|
authoredWorker,
|
|
152
|
-
|
|
136
|
+
breadthStrategy,
|
|
153
137
|
buildSteerContext,
|
|
154
138
|
builtinShapes,
|
|
155
139
|
cliWorktreeExecutor,
|
|
156
140
|
completionAuthorizes,
|
|
141
|
+
computeFindingId,
|
|
157
142
|
contentAddress,
|
|
158
|
-
coordinationDriverAgent,
|
|
159
|
-
countDiffLines,
|
|
160
143
|
createBudgetPool,
|
|
161
144
|
createEventBus,
|
|
162
145
|
createExecutor,
|
|
@@ -164,10 +147,7 @@ export {
|
|
|
164
147
|
createInMemoryRunContext,
|
|
165
148
|
createInbox,
|
|
166
149
|
createMcpEnvironment,
|
|
167
|
-
createPartsTraceSource,
|
|
168
150
|
createPushTraceSource,
|
|
169
|
-
createRootHandle,
|
|
170
|
-
createSandboxForSpec,
|
|
171
151
|
createSandboxLineage,
|
|
172
152
|
createScope,
|
|
173
153
|
createScopeAnalyst,
|
|
@@ -176,39 +156,33 @@ export {
|
|
|
176
156
|
createVerifierEnvironment,
|
|
177
157
|
createWaterfallCollector,
|
|
178
158
|
createWorktreeCliExecutor,
|
|
179
|
-
decodeAnthropicPart,
|
|
180
|
-
decodeOpenAiPart,
|
|
181
|
-
decodeOpencodePart,
|
|
182
159
|
decodeToolPart,
|
|
183
160
|
defaultAnalystInstruction,
|
|
184
161
|
defaultAuditorInstruction,
|
|
162
|
+
defaultProfileRichnessThresholds,
|
|
185
163
|
defaultSelectWinner,
|
|
186
164
|
defaultToolDetectors,
|
|
187
165
|
definePersona,
|
|
188
166
|
defineStrategy,
|
|
189
|
-
|
|
167
|
+
depthStrategy,
|
|
190
168
|
deterministicCompletion,
|
|
191
169
|
discriminatingMeans,
|
|
192
|
-
|
|
193
|
-
driverExecutorFactory,
|
|
194
|
-
driverRuntime,
|
|
170
|
+
driverAgent,
|
|
195
171
|
equalKOnCost,
|
|
196
172
|
extractLlmCallEvent,
|
|
197
173
|
fanout,
|
|
174
|
+
finalizeBestDelivered,
|
|
198
175
|
flatWidenGate,
|
|
199
176
|
gateOnDeliverable,
|
|
200
177
|
gitWorkspace,
|
|
201
178
|
harvestCorpus,
|
|
202
179
|
inlineSandboxClient,
|
|
203
|
-
isDriverSpec,
|
|
204
|
-
isNonEmptyPatch,
|
|
205
180
|
jjWorkspace,
|
|
206
181
|
localShell,
|
|
207
182
|
loopDispatch,
|
|
208
183
|
loopUntil,
|
|
184
|
+
makeFinding,
|
|
209
185
|
mapSandboxEvent,
|
|
210
|
-
materializeTreeView,
|
|
211
|
-
nestedScopeSeamKey,
|
|
212
186
|
observe,
|
|
213
187
|
openSandboxRun,
|
|
214
188
|
panel,
|
|
@@ -217,6 +191,7 @@ export {
|
|
|
217
191
|
pipeline,
|
|
218
192
|
printBenchmarkReport,
|
|
219
193
|
probeSandboxCapabilities,
|
|
194
|
+
profileRichnessFinding,
|
|
220
195
|
promotionGate,
|
|
221
196
|
refine,
|
|
222
197
|
registerShape,
|
|
@@ -224,15 +199,13 @@ export {
|
|
|
224
199
|
renderAnytimeTable,
|
|
225
200
|
renderCorpusToInstructions,
|
|
226
201
|
renderReport,
|
|
227
|
-
replaySpawnTree,
|
|
228
202
|
reportLoopUsage,
|
|
203
|
+
routerBrain,
|
|
229
204
|
routerChatWithTools,
|
|
230
205
|
routerChatWithUsage,
|
|
231
|
-
routerDriverChat,
|
|
232
206
|
routerToolLoop,
|
|
233
207
|
runAgentic,
|
|
234
208
|
runBenchmark,
|
|
235
|
-
runCoderChecks,
|
|
236
209
|
runInWorkspace,
|
|
237
210
|
runLoop,
|
|
238
211
|
runPersonified,
|
|
@@ -248,16 +221,14 @@ export {
|
|
|
248
221
|
spendFromUsageEvents,
|
|
249
222
|
stopSentinel,
|
|
250
223
|
strategyAuthorContract,
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
touchedPathsFromPatch,
|
|
255
|
-
touchesSecretPath,
|
|
224
|
+
supervise,
|
|
225
|
+
supervisorAgent,
|
|
226
|
+
supervisorInstructions,
|
|
256
227
|
trajectoryReport,
|
|
257
228
|
verify,
|
|
258
229
|
watchTrace,
|
|
259
230
|
widen,
|
|
260
|
-
|
|
231
|
+
workerFromBackend,
|
|
261
232
|
worktreeFanout
|
|
262
233
|
};
|
|
263
234
|
//# sourceMappingURL=loops.js.map
|
package/dist/mcp/bin.js
CHANGED
|
@@ -1,39 +1,37 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveRouterBaseUrl
|
|
4
|
+
} from "../chunk-GRAGM4MC.js";
|
|
2
5
|
import {
|
|
3
6
|
createPropagatingTraceEmitter,
|
|
4
7
|
detectExecutor,
|
|
5
8
|
readTraceContextFromEnv
|
|
6
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-ZNQVMMR5.js";
|
|
7
10
|
import {
|
|
8
|
-
|
|
9
|
-
} from "../chunk-
|
|
11
|
+
DEFAULT_SANDBOX_BASE_URL
|
|
12
|
+
} from "../chunk-XRYEZPR6.js";
|
|
10
13
|
import {
|
|
11
14
|
coderTaskFromArgs,
|
|
12
15
|
detachedSessionDelegate,
|
|
13
16
|
settleDetachedCoderTurn
|
|
14
|
-
} from "../chunk-
|
|
15
|
-
import {
|
|
16
|
-
coderTaskToPrompt
|
|
17
|
-
} from "../chunk-DVQGYDN5.js";
|
|
18
|
-
import {
|
|
19
|
-
DEFAULT_SANDBOX_BASE_URL
|
|
20
|
-
} from "../chunk-XRYEZPR6.js";
|
|
17
|
+
} from "../chunk-L5ZFBVT6.js";
|
|
21
18
|
import {
|
|
22
19
|
DelegationTaskQueue,
|
|
23
20
|
FileDelegationStore,
|
|
24
21
|
composeLoopTraceEmitters,
|
|
25
|
-
|
|
22
|
+
createDetachedTurnResumeDriver,
|
|
26
23
|
createMcpServer,
|
|
27
24
|
detachedTurnEvents,
|
|
28
25
|
formatDetachedSessionRef,
|
|
29
26
|
parseDetachedSessionRef,
|
|
30
27
|
runDetachedTurn,
|
|
31
28
|
runLoop
|
|
32
|
-
} from "../chunk-
|
|
33
|
-
import "../chunk-WIR4HOOJ.js";
|
|
34
|
-
import "../chunk-VLF5RHEQ.js";
|
|
35
|
-
import "../chunk-O2UPHN7X.js";
|
|
29
|
+
} from "../chunk-QXWGSDAQ.js";
|
|
36
30
|
import "../chunk-G3RGMA7C.js";
|
|
31
|
+
import {
|
|
32
|
+
coderTaskToPrompt
|
|
33
|
+
} from "../chunk-DVQGYDN5.js";
|
|
34
|
+
import "../chunk-WIR4HOOJ.js";
|
|
37
35
|
import "../chunk-DGUM43GV.js";
|
|
38
36
|
|
|
39
37
|
// src/mcp/researcher-provisioning.ts
|
|
@@ -180,7 +178,7 @@ async function buildDurableQueueFromEnv(resumeDriver, traceContext) {
|
|
|
180
178
|
}
|
|
181
179
|
function buildResumeDriver(args) {
|
|
182
180
|
const client = args.sandboxClient;
|
|
183
|
-
return
|
|
181
|
+
return createDetachedTurnResumeDriver({
|
|
184
182
|
async resolveSandbox(sandboxId) {
|
|
185
183
|
if (typeof client.get !== "function") {
|
|
186
184
|
throw new Error(
|
package/dist/mcp/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/researcher-provisioning.ts","../../src/mcp/bin.ts"],"sourcesContent":["/**\n * Researcher delegate provisioning — resolves the worker harness, model, and router\n * credentials for `delegate_research`, and injects the OpenAI-compatible router creds\n * into a sandbox agent-run spec.\n *\n * Why this exists: the agent-knowledge researcher profile defaults to a harness\n * (`opencode/zai-coding-plan/glm-5.1`) that isn't broadly provisionable, and the sandbox\n * SDK does not wire `backend.model.apiKey` into the in-box agent's OpenAI-compatible\n * provider. So the MCP server picks a provisionable harness + model and passes the router\n * creds as box env. Everything is env-overridable and reuses the repo's router resolution.\n */\nimport { type RouterEnv, resolveRouterBaseUrl } from '../model-resolution.js'\n\nexport interface ResearcherProvisioning {\n harness: string\n /** Worker model id (router-served). */\n model: string\n /** OpenAI-compatible router key for the in-box provider; undefined disables injection. */\n routerKey?: string\n /** OpenAI-compatible router base, always ending in a `/vN` segment. */\n routerBaseUrl: string\n /** Explicit fanout harness list (MCP_RESEARCHER_FANOUT_HARNESSES); undefined ⇒ caller defaults. */\n fanoutHarnesses?: string[]\n /** Per-harness fanout model overrides (MCP_RESEARCHER_FANOUT_MODELS), index-aligned. */\n fanoutModels?: string[]\n}\n\n/** A sandbox agent-run spec whose box env can be overridden. */\nexport interface ProvisionableSpec {\n sandboxOverrides?: { env?: Record<string, string> } & Record<string, unknown>\n}\n\nconst DEFAULT_HARNESS = 'opencode'\nconst DEFAULT_MODEL = 'moonshotai/kimi-k2.6'\n\nfunction trimmed(value: string | undefined): string | undefined {\n const t = value?.trim()\n return t ? t : undefined\n}\n\nfunction csv(value: string | undefined): string[] | undefined {\n const list = value\n ?.split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n return list && list.length > 0 ? list : undefined\n}\n\n/**\n * Resolve harness/model/router from env. Model falls back through the repo's\n * `WORKER_MODEL` convention; router base reuses `resolveRouterBaseUrl` (TANGLE_ROUTER_URL\n * / TANGLE_ROUTER_BASE_URL) and is normalized to an OpenAI-compatible `/v1` endpoint.\n */\nexport function resolveResearcherProvisioning(\n env: NodeJS.ProcessEnv = process.env,\n): ResearcherProvisioning {\n const harness = trimmed(env.MCP_RESEARCHER_HARNESS) ?? DEFAULT_HARNESS\n const model =\n trimmed(env.MCP_RESEARCHER_MODEL) ??\n trimmed(env.MCP_WORKER_MODEL) ??\n trimmed(env.WORKER_MODEL) ??\n DEFAULT_MODEL\n const routerKey = trimmed(env.MCP_RESEARCHER_ROUTER_KEY) ?? trimmed(env.TANGLE_API_KEY)\n const base = trimmed(env.MCP_RESEARCHER_ROUTER_BASE_URL) ?? resolveRouterBaseUrl(env as RouterEnv)\n const routerBaseUrl = /\\/v\\d+\\/?$/.test(base)\n ? base.replace(/\\/$/, '')\n : `${base.replace(/\\/$/, '')}/v1`\n const fanoutHarnesses = csv(env.MCP_RESEARCHER_FANOUT_HARNESSES)\n const fanoutModels = csv(env.MCP_RESEARCHER_FANOUT_MODELS)\n return {\n harness,\n model,\n ...(routerKey ? { routerKey } : {}),\n routerBaseUrl,\n ...(fanoutHarnesses ? { fanoutHarnesses } : {}),\n ...(fanoutModels ? { fanoutModels } : {}),\n }\n}\n\n/**\n * Overlay the router creds onto a spec's box env (in place): preserve every env var the\n * preset already supplied and set OPENAI_API_KEY / OPENAI_BASE_URL on top (these two are\n * intentionally authoritative — they point the in-box provider at the router). No-op when\n * there is no router key.\n */\nexport function applyRouterEnv(\n spec: ProvisionableSpec,\n routerKey: string | undefined,\n routerBaseUrl: string,\n): void {\n if (!routerKey) return\n spec.sandboxOverrides = {\n ...(spec.sandboxOverrides ?? {}),\n env: {\n ...(spec.sandboxOverrides?.env ?? {}),\n OPENAI_API_KEY: routerKey,\n OPENAI_BASE_URL: routerBaseUrl,\n },\n }\n}\n","#!/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 * MCP_RESEARCHER_HARNESS researcher worker harness (default `opencode`)\n * MCP_RESEARCHER_MODEL researcher worker model id (falls back to\n * MCP_WORKER_MODEL, then WORKER_MODEL, then a default)\n * MCP_RESEARCHER_FANOUT_HARNESSES comma-separated harnesses for researcher variants > 1\n * MCP_RESEARCHER_FANOUT_MODELS comma-separated per-harness models, index-aligned\n * MCP_RESEARCHER_ROUTER_KEY OpenAI-compatible router key for the in-box agent\n * (defaults to TANGLE_API_KEY)\n * MCP_RESEARCHER_ROUTER_BASE_URL router base for the in-box agent (defaults to the\n * repo's resolveRouterBaseUrl, normalized to `/v1`)\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 { coderTaskToPrompt } from '../profiles/coder'\nimport type { AgentRunSpec, LoopTraceEmitter, SandboxClient } from '../runtime'\nimport { runLoop } from '../runtime'\nimport { detectExecutor } from './bin-helpers'\nimport {\n coderTaskFromArgs,\n detachedSessionDelegate,\n type ResearcherDelegate,\n settleDetachedCoderTurn,\n} from './delegates'\nimport { DEFAULT_SANDBOX_BASE_URL } from './delegation-profile'\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 {\n applyRouterEnv,\n type ProvisionableSpec,\n resolveResearcherProvisioning,\n} from './researcher-provisioning'\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 ? detachedSessionDelegate({\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 is QUARANTINED behind MCP_ENABLE_DETACHED_RESUME (default off): the\n // recursive Scope/worktree-CLI leaf has no durable detached-resume equivalent yet, so the\n // sandbox-session resume path is kept but opt-in. It additionally requires the durable store and\n // a session-backed placement with real credentials: in-process placement has no sandbox session\n // to detach, and the diagnostic no-key stub cannot resolve boxes.\n // AGENT_RUNTIME_DELEGATION_DETACHED=0 keeps everything on the streaming path even when enabled.\n const detachedDispatch =\n process.env.MCP_ENABLE_DETACHED_RESUME === '1' &&\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 coderTaskToPrompt(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 // @tangle-network/sandbox ≥0.6 makes baseUrl required; default it so the MCP server\n // starts without forcing every caller to set SANDBOX_BASE_URL. Treat empty/whitespace as\n // unset (|| not ??) so `SANDBOX_BASE_URL=` still resolves to the default.\n const baseUrl = process.env.SANDBOX_BASE_URL?.trim() || DEFAULT_SANDBOX_BASE_URL\n return new SandboxCtor({ apiKey, baseUrl })\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: {\n task: unknown\n harness?: string\n model?: string\n }) => ResearcherProfilePreset\n type FanoutFactory = (opts: {\n task: unknown\n harnesses?: string[]\n models?: (string | undefined)[]\n }) => 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 // Worker harness + model + provider auth. Two reasons a researcher run otherwise makes\n // zero LLM calls and \"produces no winner\" on a successful box: (1) the profile's default\n // harness (opencode/zai-coding-plan/glm-5.1) is not broadly provisionable; (2) the\n // sandbox SDK does not wire backend.model.apiKey into the in-box agent's OpenAI-compatible\n // provider. resolveResearcherProvisioning picks a provisionable harness + model and the\n // router creds (all env-overridable); applyRouterEnv injects them as box env. Applied to\n // BOTH the single-variant path and every fanout agent-run so variants > 1 work too.\n const {\n harness,\n model,\n routerKey,\n routerBaseUrl,\n fanoutHarnesses: cfgFanoutHarnesses,\n fanoutModels,\n } = resolveResearcherProvisioning()\n const buildPreset = (task: unknown): ResearcherProfilePreset => {\n const preset = singleFactory({ task, harness, model })\n applyRouterEnv(preset.agentRunSpec as ProvisionableSpec, routerKey, routerBaseUrl)\n return preset\n }\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 = buildPreset(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 = buildPreset(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 // Match the single-variant fix: use a provisionable harness/model and inject router\n // creds into every fanout agent-run, else variants > 1 makes zero LLM calls. Default to\n // `variants` copies of the working harness; MCP_RESEARCHER_FANOUT_HARNESSES overrides for\n // diversity (with optional per-harness MCP_RESEARCHER_FANOUT_MODELS).\n const fanoutHarnesses = cfgFanoutHarnesses ?? Array.from({ length: variants }, () => harness)\n const fanout = fanoutFactory({\n task,\n harnesses: fanoutHarnesses,\n models: fanoutHarnesses.map((_, i) => fanoutModels?.[i] ?? model),\n })\n for (const spec of fanout.agentRuns) {\n applyRouterEnv(spec as ProvisionableSpec, routerKey, routerBaseUrl)\n }\n // The harness list may be shorter than `variants` (misconfig) — never claim more\n // iterations than there are runs.\n const runs = fanout.agentRuns.slice(0, variants)\n const effectiveVariants = Math.max(1, runs.length)\n const result = await runLoop({\n driver: fanout.driver,\n agentRuns: runs,\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: effectiveVariants,\n maxConcurrency: Math.min(maxConcurrency, effectiveVariants),\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 // Use the same preset construction as dispatch so the displayed prompt can't drift.\n const spec = buildPreset(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","trimmed"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/researcher-provisioning.ts","../../src/mcp/bin.ts"],"sourcesContent":["/**\n * Researcher delegate provisioning — resolves the worker harness, model, and router\n * credentials for `delegate_research`, and injects the OpenAI-compatible router creds\n * into a sandbox agent-run spec.\n *\n * Why this exists: the agent-knowledge researcher profile defaults to a harness\n * (`opencode/zai-coding-plan/glm-5.1`) that isn't broadly provisionable, and the sandbox\n * SDK does not wire `backend.model.apiKey` into the in-box agent's OpenAI-compatible\n * provider. So the MCP server picks a provisionable harness + model and passes the router\n * creds as box env. Everything is env-overridable and reuses the repo's router resolution.\n */\nimport { type RouterEnv, resolveRouterBaseUrl } from '../model-resolution.js'\n\nexport interface ResearcherProvisioning {\n harness: string\n /** Worker model id (router-served). */\n model: string\n /** OpenAI-compatible router key for the in-box provider; undefined disables injection. */\n routerKey?: string\n /** OpenAI-compatible router base, always ending in a `/vN` segment. */\n routerBaseUrl: string\n /** Explicit fanout harness list (MCP_RESEARCHER_FANOUT_HARNESSES); undefined ⇒ caller defaults. */\n fanoutHarnesses?: string[]\n /** Per-harness fanout model overrides (MCP_RESEARCHER_FANOUT_MODELS), index-aligned. */\n fanoutModels?: string[]\n}\n\n/** A sandbox agent-run spec whose box env can be overridden. */\nexport interface ProvisionableSpec {\n sandboxOverrides?: { env?: Record<string, string> } & Record<string, unknown>\n}\n\nconst DEFAULT_HARNESS = 'opencode'\nconst DEFAULT_MODEL = 'moonshotai/kimi-k2.6'\n\nfunction trimmed(value: string | undefined): string | undefined {\n const t = value?.trim()\n return t ? t : undefined\n}\n\nfunction csv(value: string | undefined): string[] | undefined {\n const list = value\n ?.split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n return list && list.length > 0 ? list : undefined\n}\n\n/**\n * Resolve harness/model/router from env. Model falls back through the repo's\n * `WORKER_MODEL` convention; router base reuses `resolveRouterBaseUrl` (TANGLE_ROUTER_URL\n * / TANGLE_ROUTER_BASE_URL) and is normalized to an OpenAI-compatible `/v1` endpoint.\n */\nexport function resolveResearcherProvisioning(\n env: NodeJS.ProcessEnv = process.env,\n): ResearcherProvisioning {\n const harness = trimmed(env.MCP_RESEARCHER_HARNESS) ?? DEFAULT_HARNESS\n const model =\n trimmed(env.MCP_RESEARCHER_MODEL) ??\n trimmed(env.MCP_WORKER_MODEL) ??\n trimmed(env.WORKER_MODEL) ??\n DEFAULT_MODEL\n const routerKey = trimmed(env.MCP_RESEARCHER_ROUTER_KEY) ?? trimmed(env.TANGLE_API_KEY)\n const base = trimmed(env.MCP_RESEARCHER_ROUTER_BASE_URL) ?? resolveRouterBaseUrl(env as RouterEnv)\n const routerBaseUrl = /\\/v\\d+\\/?$/.test(base)\n ? base.replace(/\\/$/, '')\n : `${base.replace(/\\/$/, '')}/v1`\n const fanoutHarnesses = csv(env.MCP_RESEARCHER_FANOUT_HARNESSES)\n const fanoutModels = csv(env.MCP_RESEARCHER_FANOUT_MODELS)\n return {\n harness,\n model,\n ...(routerKey ? { routerKey } : {}),\n routerBaseUrl,\n ...(fanoutHarnesses ? { fanoutHarnesses } : {}),\n ...(fanoutModels ? { fanoutModels } : {}),\n }\n}\n\n/**\n * Overlay the router creds onto a spec's box env (in place): preserve every env var the\n * preset already supplied and set OPENAI_API_KEY / OPENAI_BASE_URL on top (these two are\n * intentionally authoritative — they point the in-box provider at the router). No-op when\n * there is no router key.\n */\nexport function applyRouterEnv(\n spec: ProvisionableSpec,\n routerKey: string | undefined,\n routerBaseUrl: string,\n): void {\n if (!routerKey) return\n spec.sandboxOverrides = {\n ...(spec.sandboxOverrides ?? {}),\n env: {\n ...(spec.sandboxOverrides?.env ?? {}),\n OPENAI_API_KEY: routerKey,\n OPENAI_BASE_URL: routerBaseUrl,\n },\n }\n}\n","#!/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 * MCP_RESEARCHER_HARNESS researcher worker harness (default `opencode`)\n * MCP_RESEARCHER_MODEL researcher worker model id (falls back to\n * MCP_WORKER_MODEL, then WORKER_MODEL, then a default)\n * MCP_RESEARCHER_FANOUT_HARNESSES comma-separated harnesses for researcher variants > 1\n * MCP_RESEARCHER_FANOUT_MODELS comma-separated per-harness models, index-aligned\n * MCP_RESEARCHER_ROUTER_KEY OpenAI-compatible router key for the in-box agent\n * (defaults to TANGLE_API_KEY)\n * MCP_RESEARCHER_ROUTER_BASE_URL router base for the in-box agent (defaults to the\n * repo's resolveRouterBaseUrl, normalized to `/v1`)\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 { coderTaskToPrompt } from '../profiles/coder'\nimport type { AgentRunSpec, LoopTraceEmitter, SandboxClient } from '../runtime'\nimport { runLoop } from '../runtime'\nimport { detectExecutor } from './bin-helpers'\nimport {\n coderTaskFromArgs,\n detachedSessionDelegate,\n type ResearcherDelegate,\n settleDetachedCoderTurn,\n} from './delegates'\nimport { DEFAULT_SANDBOX_BASE_URL } from './delegation-profile'\nimport { FileDelegationStore } from './delegation-store'\nimport { composeLoopTraceEmitters } from './delegation-trace'\nimport {\n createDetachedTurnResumeDriver,\n type DetachedTurn,\n type DriveTurnCapableBox,\n detachedTurnEvents,\n formatDetachedSessionRef,\n parseDetachedSessionRef,\n runDetachedTurn,\n} from './detached-turn'\nimport type { DelegationExecutor } from './executor'\nimport {\n applyRouterEnv,\n type ProvisionableSpec,\n resolveResearcherProvisioning,\n} from './researcher-provisioning'\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 ? detachedSessionDelegate({\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 is QUARANTINED behind MCP_ENABLE_DETACHED_RESUME (default off): the\n // recursive Scope/worktree-CLI leaf has no durable detached-resume equivalent yet, so the\n // sandbox-session resume path is kept but opt-in. It additionally requires the durable store and\n // a session-backed placement with real credentials: in-process placement has no sandbox session\n // to detach, and the diagnostic no-key stub cannot resolve boxes.\n // AGENT_RUNTIME_DELEGATION_DETACHED=0 keeps everything on the streaming path even when enabled.\n const detachedDispatch =\n process.env.MCP_ENABLE_DETACHED_RESUME === '1' &&\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 createDetachedTurnResumeDriver({\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 coderTaskToPrompt(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 // @tangle-network/sandbox ≥0.6 makes baseUrl required; default it so the MCP server\n // starts without forcing every caller to set SANDBOX_BASE_URL. Treat empty/whitespace as\n // unset (|| not ??) so `SANDBOX_BASE_URL=` still resolves to the default.\n const baseUrl = process.env.SANDBOX_BASE_URL?.trim() || DEFAULT_SANDBOX_BASE_URL\n return new SandboxCtor({ apiKey, baseUrl })\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: {\n task: unknown\n harness?: string\n model?: string\n }) => ResearcherProfilePreset\n type FanoutFactory = (opts: {\n task: unknown\n harnesses?: string[]\n models?: (string | undefined)[]\n }) => 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 // Worker harness + model + provider auth. Two reasons a researcher run otherwise makes\n // zero LLM calls and \"produces no winner\" on a successful box: (1) the profile's default\n // harness (opencode/zai-coding-plan/glm-5.1) is not broadly provisionable; (2) the\n // sandbox SDK does not wire backend.model.apiKey into the in-box agent's OpenAI-compatible\n // provider. resolveResearcherProvisioning picks a provisionable harness + model and the\n // router creds (all env-overridable); applyRouterEnv injects them as box env. Applied to\n // BOTH the single-variant path and every fanout agent-run so variants > 1 work too.\n const {\n harness,\n model,\n routerKey,\n routerBaseUrl,\n fanoutHarnesses: cfgFanoutHarnesses,\n fanoutModels,\n } = resolveResearcherProvisioning()\n const buildPreset = (task: unknown): ResearcherProfilePreset => {\n const preset = singleFactory({ task, harness, model })\n applyRouterEnv(preset.agentRunSpec as ProvisionableSpec, routerKey, routerBaseUrl)\n return preset\n }\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 = buildPreset(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 = buildPreset(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 // Match the single-variant fix: use a provisionable harness/model and inject router\n // creds into every fanout agent-run, else variants > 1 makes zero LLM calls. Default to\n // `variants` copies of the working harness; MCP_RESEARCHER_FANOUT_HARNESSES overrides for\n // diversity (with optional per-harness MCP_RESEARCHER_FANOUT_MODELS).\n const fanoutHarnesses = cfgFanoutHarnesses ?? Array.from({ length: variants }, () => harness)\n const fanout = fanoutFactory({\n task,\n harnesses: fanoutHarnesses,\n models: fanoutHarnesses.map((_, i) => fanoutModels?.[i] ?? model),\n })\n for (const spec of fanout.agentRuns) {\n applyRouterEnv(spec as ProvisionableSpec, routerKey, routerBaseUrl)\n }\n // The harness list may be shorter than `variants` (misconfig) — never claim more\n // iterations than there are runs.\n const runs = fanout.agentRuns.slice(0, variants)\n const effectiveVariants = Math.max(1, runs.length)\n const result = await runLoop({\n driver: fanout.driver,\n agentRuns: runs,\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: effectiveVariants,\n maxConcurrency: Math.min(maxConcurrency, effectiveVariants),\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 // Use the same preset construction as dispatch so the displayed prompt can't drift.\n const spec = buildPreset(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","trimmed"]}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import { S as SandboxClient,
|
|
2
|
-
import { F as FleetHandle, o as DelegationExecutor, G as GitRunner, e as DelegationTaskQueue, f as CoderDelegate, D as DelegateCodeArgs, p as DelegateCodeResult, q as DelegateFeedbackResult, c as DelegateFeedbackArgs,
|
|
3
|
-
export {
|
|
1
|
+
import { S as SandboxClient, c as LoopSandboxPlacement } from '../types-BYa2ZOAx.js';
|
|
2
|
+
import { F as FleetHandle, o as DelegationExecutor, L as LocalHarness, G as GitRunner, r as runLocalHarness, e as DelegationTaskQueue, f as CoderDelegate, D as DelegateCodeArgs, p as DelegateCodeResult, q as DelegateFeedbackResult, c as DelegateFeedbackArgs, s as ResearchSource, R as ResearcherDelegate, t as DelegateResearchArgs, u as DelegateResearchResult, U as UiAuditorDelegate, v as DelegateUiAuditArgs, w as DelegateUiAuditResult, x as DelegationHistoryResult, y as DelegationHistoryArgs, z as DelegationStatusResult, H as DelegationStatusArgs } from '../delegates-DqAgo32T.js';
|
|
3
|
+
export { I as CappedDelegationTrace, J as CoderReview, C as CoderReviewer, K as CreateWorktreeOptions, M as DELEGATION_TRACE_MAX_BYTES, O as DELEGATION_TRACE_MAX_SPANS, P as DelegateCodeConfig, Q as DelegateResearchConfig, V as DelegateRunCtx, W as DelegateUiAuditConfig, X as DelegateUiAuditRoute, Y as DelegationError, d as DelegationFeedbackSnapshot, Z as DelegationHistoryEntry, _ as DelegationPersistenceError, $ as DelegationProfile, a0 as DelegationProgress, a1 as DelegationRecord, a2 as DelegationResultPayload, a3 as DelegationResumeContext, a4 as DelegationResumeDriver, a5 as DelegationResumeTick, a6 as DelegationRunContext, a7 as DelegationStateCorruptError, a8 as DelegationStatus, a9 as DelegationStore, aa as DelegationTaskQueueOptions, ab as DelegationTraceCaps, ac as DelegationTraceCollector, ad as DelegationTraceSpan, ae as DetachedSessionDelegateOptions, af as DetachedSessionRefParts, ag as DetachedTurn, ah as DetachedTurnResumeDriverOptions, a as DetachedWinnerSelection, ai as DiffOptions, aj as DiffResult, ak as DriveTurnCapableBox, al as DriveTurnTick, am as FeedbackRating, an as FeedbackRefersTo, ao as FileDelegationStore, ap as FileDelegationStoreOptions, aq as FleetWorkspaceExecutorOptions, ar as InMemoryDelegationStore, as as LocalHarnessResult, at as RemoveWorktreeOptions, au as ResearchOutputShape, av as RunDetachedTurnOptions, aw as RunLocalHarnessOptions, ax as SettleDetachedCoderTurnOptions, ay as SiblingSandboxExecutorOptions, az as SubmitInput, aA as SubmitOutput, T as TraceContext, aB as UiAuditorDelegationOutput, aC as WorktreeHandle, aD as buildDelegationTraceSpans, aE as capDelegationTrace, aF as captureWorktreeDiff, aG as coderTaskFromArgs, aH as composeLoopTraceEmitters, aI as createDelegationTraceCollector, aJ as createDetachedTurnResumeDriver, aK as createFleetWorkspaceExecutor, aL as createPropagatingTraceEmitter, aM as createSiblingSandboxExecutor, aN as createWorktree, aO as detachedSessionDelegate, aP as detachedTurnEvents, aQ as formatDetachedSessionRef, aR as hashIdempotencyInput, aS as parseDetachedSessionRef, aT as readTraceContextFromEnv, aU as removeWorktree, aV as runDetachedTurn, aW as settleDetachedCoderTurn, aX as traceContextToEnv } from '../delegates-DqAgo32T.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-Bvfro2m1.js';
|
|
5
|
-
import { F as FeedbackStore } from '../coordination-
|
|
6
|
-
export { A as AnalystRegistry, C as CoordinationEvent, a as CoordinationTools, b as CoordinationToolsOptions, c as FeedbackEvent, I as InMemoryFeedbackStore, J as JsonRpcMessage, d as JsonRpcResponse, M as MakeWorkerAgent, e as McpServer, f as McpServerOptions, g as McpToolDescriptor, h as McpTransport, Q as Question, i as QuestionDecision, j as QuestionPolicy, k as QuestionRecord, S as SettledWorker, l as createCoordinationTools, m as createInProcessTransport, n as createMcpServer, o as eventToSnapshot } from '../coordination-
|
|
7
|
-
import { L as LocalHarness, r as runLocalHarness } from '../local-harness-BE_h8szs.js';
|
|
8
|
-
export { a as LocalHarnessResult, R as RunLocalHarnessOptions } from '../local-harness-BE_h8szs.js';
|
|
5
|
+
import { F as FeedbackStore } from '../coordination-C7WxwHXq.js';
|
|
6
|
+
export { A as AnalystRegistry, C as CoordinationEvent, a as CoordinationTools, b as CoordinationToolsOptions, c as FeedbackEvent, I as InMemoryFeedbackStore, J as JsonRpcMessage, d as JsonRpcResponse, M as MakeWorkerAgent, e as McpServer, f as McpServerOptions, g as McpToolDescriptor, h as McpTransport, Q as Question, i as QuestionDecision, j as QuestionPolicy, k as QuestionRecord, S as SettledWorker, l as createCoordinationTools, m as createInProcessTransport, n as createMcpServer, o as eventToSnapshot } from '../coordination-C7WxwHXq.js';
|
|
9
7
|
export { C as CreateKbGateOptions, F as FactCandidate, a as FactJudge, b as FactJudgeVerdict, K as KbGateResult, c as createKbGate } from '../kb-gate-CuzMYGYM.js';
|
|
10
|
-
export { m as mcpToolsForRuntimeMcp, a as mcpToolsForRuntimeMcpSubset } from '../openai-tools-
|
|
8
|
+
export { m as mcpToolsForRuntimeMcp, a as mcpToolsForRuntimeMcpSubset } from '../openai-tools-DPx9Gzvn.js';
|
|
11
9
|
import { AnalystFinding } from '@tangle-network/agent-eval';
|
|
12
|
-
import { a as UiLens } from '../substrate-
|
|
10
|
+
import { a as UiLens } from '../substrate-BoRXgvka.js';
|
|
13
11
|
import '@tangle-network/sandbox';
|
|
14
|
-
import '../runtime-hooks-C7JwKb9E.js';
|
|
15
|
-
import '@tangle-network/agent-interface';
|
|
16
|
-
import '../coder-2leJPOvC.js';
|
|
17
12
|
import 'node:child_process';
|
|
13
|
+
import '@tangle-network/agent-interface';
|
|
18
14
|
|
|
19
15
|
/**
|
|
20
16
|
* @experimental
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
mcpToolsForRuntimeMcp,
|
|
3
|
+
mcpToolsForRuntimeMcpSubset
|
|
4
|
+
} from "../chunk-EDCVUZZC.js";
|
|
1
5
|
import {
|
|
2
6
|
createInProcessExecutor,
|
|
3
7
|
createPropagatingTraceEmitter,
|
|
4
8
|
detectExecutor,
|
|
5
9
|
readTraceContextFromEnv,
|
|
6
10
|
traceContextToEnv
|
|
7
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-ZNQVMMR5.js";
|
|
8
12
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
DELEGATION_MCP_SERVER_KEY,
|
|
14
|
+
buildDelegationMcpServer,
|
|
15
|
+
composeProductionAgentProfile
|
|
16
|
+
} from "../chunk-XRYEZPR6.js";
|
|
12
17
|
import {
|
|
13
18
|
createKbGate
|
|
14
19
|
} from "../chunk-FNMGYYSS.js";
|
|
@@ -18,13 +23,7 @@ import {
|
|
|
18
23
|
createSiblingSandboxExecutor,
|
|
19
24
|
detachedSessionDelegate,
|
|
20
25
|
settleDetachedCoderTurn
|
|
21
|
-
} from "../chunk-
|
|
22
|
-
import "../chunk-DVQGYDN5.js";
|
|
23
|
-
import {
|
|
24
|
-
DELEGATION_MCP_SERVER_KEY,
|
|
25
|
-
buildDelegationMcpServer,
|
|
26
|
-
composeProductionAgentProfile
|
|
27
|
-
} from "../chunk-XRYEZPR6.js";
|
|
26
|
+
} from "../chunk-L5ZFBVT6.js";
|
|
28
27
|
import {
|
|
29
28
|
DELEGATE_CODE_DESCRIPTION,
|
|
30
29
|
DELEGATE_CODE_INPUT_SCHEMA,
|
|
@@ -65,7 +64,7 @@ import {
|
|
|
65
64
|
createDelegationHistoryHandler,
|
|
66
65
|
createDelegationStatusHandler,
|
|
67
66
|
createDelegationTraceCollector,
|
|
68
|
-
|
|
67
|
+
createDetachedTurnResumeDriver,
|
|
69
68
|
createInProcessTransport,
|
|
70
69
|
createMcpServer,
|
|
71
70
|
createWorktree,
|
|
@@ -76,19 +75,17 @@ import {
|
|
|
76
75
|
parseDetachedSessionRef,
|
|
77
76
|
removeWorktree,
|
|
78
77
|
runDetachedTurn,
|
|
78
|
+
runLocalHarness,
|
|
79
79
|
validateDelegateCodeArgs,
|
|
80
80
|
validateDelegateFeedbackArgs,
|
|
81
81
|
validateDelegateResearchArgs,
|
|
82
82
|
validateDelegateUiAuditArgs,
|
|
83
83
|
validateDelegationHistoryArgs,
|
|
84
84
|
validateDelegationStatusArgs
|
|
85
|
-
} from "../chunk-
|
|
86
|
-
import "../chunk-WIR4HOOJ.js";
|
|
87
|
-
import "../chunk-VLF5RHEQ.js";
|
|
88
|
-
import {
|
|
89
|
-
runLocalHarness
|
|
90
|
-
} from "../chunk-O2UPHN7X.js";
|
|
85
|
+
} from "../chunk-QXWGSDAQ.js";
|
|
91
86
|
import "../chunk-G3RGMA7C.js";
|
|
87
|
+
import "../chunk-DVQGYDN5.js";
|
|
88
|
+
import "../chunk-WIR4HOOJ.js";
|
|
92
89
|
import "../chunk-DGUM43GV.js";
|
|
93
90
|
|
|
94
91
|
// src/mcp/tools/checks.ts
|
|
@@ -300,7 +297,7 @@ export {
|
|
|
300
297
|
createDelegationHistoryHandler,
|
|
301
298
|
createDelegationStatusHandler,
|
|
302
299
|
createDelegationTraceCollector,
|
|
303
|
-
|
|
300
|
+
createDetachedTurnResumeDriver,
|
|
304
301
|
createFleetWorkspaceExecutor,
|
|
305
302
|
createInProcessExecutor,
|
|
306
303
|
createInProcessTransport,
|