@herdctl/core 4.0.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +571 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +67 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/coverage.test.js +8 -0
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/discord-manager.test.js +2 -2
- package/dist/fleet-manager/__tests__/discord-manager.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/slack-manager.test.d.ts +11 -0
- package/dist/fleet-manager/__tests__/slack-manager.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/slack-manager.test.js +1027 -0
- package/dist/fleet-manager/__tests__/slack-manager.test.js.map +1 -0
- package/dist/fleet-manager/context.d.ts +4 -0
- package/dist/fleet-manager/context.d.ts.map +1 -1
- package/dist/fleet-manager/discord-manager.js +7 -7
- package/dist/fleet-manager/discord-manager.js.map +1 -1
- package/dist/fleet-manager/event-types.d.ts +113 -0
- package/dist/fleet-manager/event-types.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +3 -0
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +15 -9
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts.map +1 -1
- package/dist/fleet-manager/job-control.js +6 -3
- package/dist/fleet-manager/job-control.js.map +1 -1
- package/dist/fleet-manager/job-queue.d.ts.map +1 -1
- package/dist/fleet-manager/job-queue.js +2 -6
- package/dist/fleet-manager/job-queue.js.map +1 -1
- package/dist/fleet-manager/slack-manager.d.ts +158 -0
- package/dist/fleet-manager/slack-manager.d.ts.map +1 -0
- package/dist/fleet-manager/slack-manager.js +570 -0
- package/dist/fleet-manager/slack-manager.js.map +1 -0
- package/dist/fleet-manager/status-queries.d.ts +2 -1
- package/dist/fleet-manager/status-queries.d.ts.map +1 -1
- package/dist/fleet-manager/status-queries.js +42 -3
- package/dist/fleet-manager/status-queries.js.map +1 -1
- package/dist/fleet-manager/types.d.ts +43 -3
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/hooks/__tests__/slack-runner.test.d.ts +5 -0
- package/dist/hooks/__tests__/slack-runner.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/slack-runner.test.js +307 -0
- package/dist/hooks/__tests__/slack-runner.test.js.map +1 -0
- package/dist/hooks/hook-executor.d.ts +1 -0
- package/dist/hooks/hook-executor.d.ts.map +1 -1
- package/dist/hooks/hook-executor.js +8 -0
- package/dist/hooks/hook-executor.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/runners/slack.d.ts +62 -0
- package/dist/hooks/runners/slack.d.ts.map +1 -0
- package/dist/hooks/runners/slack.js +329 -0
- package/dist/hooks/runners/slack.js.map +1 -0
- package/dist/hooks/types.d.ts +4 -4
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/runner/__tests__/file-sender-mcp.test.d.ts +2 -0
- package/dist/runner/__tests__/file-sender-mcp.test.d.ts.map +1 -0
- package/dist/runner/__tests__/file-sender-mcp.test.js +177 -0
- package/dist/runner/__tests__/file-sender-mcp.test.js.map +1 -0
- package/dist/runner/__tests__/job-executor.test.js +12 -12
- package/dist/runner/__tests__/job-executor.test.js.map +1 -1
- package/dist/runner/file-sender-mcp.d.ts +69 -0
- package/dist/runner/file-sender-mcp.d.ts.map +1 -0
- package/dist/runner/file-sender-mcp.js +145 -0
- package/dist/runner/file-sender-mcp.js.map +1 -0
- package/dist/runner/index.d.ts +1 -0
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +2 -0
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/job-executor.d.ts +1 -0
- package/dist/runner/job-executor.d.ts.map +1 -1
- package/dist/runner/job-executor.js +38 -11
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/runtime/__tests__/docker-security.test.js +12 -12
- package/dist/runner/runtime/__tests__/docker-security.test.js.map +1 -1
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.js +191 -0
- package/dist/runner/runtime/__tests__/mcp-http-bridge.test.js.map +1 -0
- package/dist/runner/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runner/runtime/cli-runtime.js +29 -27
- package/dist/runner/runtime/cli-runtime.js.map +1 -1
- package/dist/runner/runtime/cli-session-watcher.d.ts.map +1 -1
- package/dist/runner/runtime/cli-session-watcher.js +20 -18
- package/dist/runner/runtime/cli-session-watcher.js.map +1 -1
- package/dist/runner/runtime/container-manager.d.ts +5 -1
- package/dist/runner/runtime/container-manager.d.ts.map +1 -1
- package/dist/runner/runtime/container-manager.js +117 -5
- package/dist/runner/runtime/container-manager.js.map +1 -1
- package/dist/runner/runtime/container-runner.d.ts +2 -0
- package/dist/runner/runtime/container-runner.d.ts.map +1 -1
- package/dist/runner/runtime/container-runner.js +127 -78
- package/dist/runner/runtime/container-runner.js.map +1 -1
- package/dist/runner/runtime/index.d.ts +1 -0
- package/dist/runner/runtime/index.d.ts.map +1 -1
- package/dist/runner/runtime/index.js +2 -0
- package/dist/runner/runtime/index.js.map +1 -1
- package/dist/runner/runtime/interface.d.ts +2 -0
- package/dist/runner/runtime/interface.d.ts.map +1 -1
- package/dist/runner/runtime/mcp-http-bridge.d.ts +39 -0
- package/dist/runner/runtime/mcp-http-bridge.d.ts.map +1 -0
- package/dist/runner/runtime/mcp-http-bridge.js +205 -0
- package/dist/runner/runtime/mcp-http-bridge.js.map +1 -0
- package/dist/runner/runtime/sdk-runtime.d.ts.map +1 -1
- package/dist/runner/runtime/sdk-runtime.js +74 -1
- package/dist/runner/runtime/sdk-runtime.js.map +1 -1
- package/dist/runner/types.d.ts +44 -0
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/scheduler/__tests__/scheduler.test.js +2 -2
- package/dist/scheduler/__tests__/scheduler.test.js.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +2 -6
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/scheduler/schedule-state.d.ts.map +1 -1
- package/dist/scheduler/schedule-state.js +2 -3
- package/dist/scheduler/schedule-state.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +3 -7
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/state/fleet-state.d.ts.map +1 -1
- package/dist/state/fleet-state.js +2 -3
- package/dist/state/fleet-state.js.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/schemas/job-output.d.ts +2 -2
- package/dist/state/session-validation.d.ts +8 -0
- package/dist/state/session-validation.d.ts.map +1 -1
- package/dist/state/session-validation.js +36 -0
- package/dist/state/session-validation.js.map +1 -1
- package/dist/utils/__tests__/logger.test.d.ts +2 -0
- package/dist/utils/__tests__/logger.test.d.ts.map +1 -0
- package/dist/utils/__tests__/logger.test.js +360 -0
- package/dist/utils/__tests__/logger.test.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +72 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +117 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -9
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import Dockerode from "dockerode";
|
|
8
8
|
import * as path from "node:path";
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import { createLogger } from "../../utils/logger.js";
|
|
12
|
+
const logger = createLogger("ContainerManager");
|
|
9
13
|
/**
|
|
10
14
|
* Container manager for herdctl Docker execution
|
|
11
15
|
*/
|
|
@@ -224,7 +228,6 @@ export function buildContainerMounts(agent, dockerConfig, stateDir) {
|
|
|
224
228
|
// Claude CLI writes sessions to ~/.claude/projects/<encoded-workspace>/
|
|
225
229
|
// Inside container, working dir is /workspace → encoded as "-workspace"
|
|
226
230
|
// Mount docker-sessions to this location so we can watch files from host
|
|
227
|
-
// Note: Authentication uses ANTHROPIC_API_KEY env var, so no auth mount needed
|
|
228
231
|
const dockerSessionsDir = path.join(stateDir, "docker-sessions");
|
|
229
232
|
mounts.push({
|
|
230
233
|
hostPath: dockerSessionsDir,
|
|
@@ -235,22 +238,131 @@ export function buildContainerMounts(agent, dockerConfig, stateDir) {
|
|
|
235
238
|
mounts.push(...dockerConfig.volumes);
|
|
236
239
|
return mounts;
|
|
237
240
|
}
|
|
241
|
+
const CLAUDE_OAUTH_TOKEN_URL = "https://console.anthropic.com/v1/oauth/token";
|
|
242
|
+
const CLAUDE_OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
243
|
+
// Refresh 5 minutes before expiry to avoid race conditions
|
|
244
|
+
const TOKEN_REFRESH_BUFFER_MS = 5 * 60 * 1000;
|
|
245
|
+
/**
|
|
246
|
+
* Read Claude OAuth credentials from the mounted credentials file.
|
|
247
|
+
* Returns the parsed claudeAiOauth object or null if unavailable.
|
|
248
|
+
*/
|
|
249
|
+
function readCredentialsFile() {
|
|
250
|
+
const credsPath = path.join(os.homedir(), ".claude", ".credentials.json");
|
|
251
|
+
try {
|
|
252
|
+
const creds = JSON.parse(fs.readFileSync(credsPath, "utf-8"));
|
|
253
|
+
return creds.claudeAiOauth ?? null;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Write updated OAuth tokens back to the credentials file.
|
|
261
|
+
*/
|
|
262
|
+
function writeCredentialsFile(oauth) {
|
|
263
|
+
const credsPath = path.join(os.homedir(), ".claude", ".credentials.json");
|
|
264
|
+
try {
|
|
265
|
+
let creds = {};
|
|
266
|
+
try {
|
|
267
|
+
creds = JSON.parse(fs.readFileSync(credsPath, "utf-8"));
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// File doesn't exist or is invalid — start fresh
|
|
271
|
+
}
|
|
272
|
+
creds.claudeAiOauth = oauth;
|
|
273
|
+
fs.writeFileSync(credsPath, JSON.stringify(creds, null, 2));
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
logger.error(`Failed to write credentials file: ${err}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Refresh the Claude OAuth access token using the refresh token.
|
|
281
|
+
* Updates the credentials file with the new tokens.
|
|
282
|
+
* Returns the updated oauth object, or null on failure.
|
|
283
|
+
*/
|
|
284
|
+
async function refreshClaudeOAuthToken(refreshToken) {
|
|
285
|
+
try {
|
|
286
|
+
logger.info("Refreshing Claude OAuth token...");
|
|
287
|
+
const response = await fetch(CLAUDE_OAUTH_TOKEN_URL, {
|
|
288
|
+
method: "POST",
|
|
289
|
+
headers: { "Content-Type": "application/json" },
|
|
290
|
+
body: JSON.stringify({
|
|
291
|
+
grant_type: "refresh_token",
|
|
292
|
+
refresh_token: refreshToken,
|
|
293
|
+
client_id: CLAUDE_OAUTH_CLIENT_ID,
|
|
294
|
+
}),
|
|
295
|
+
});
|
|
296
|
+
if (!response.ok) {
|
|
297
|
+
logger.error(`Token refresh failed: HTTP ${response.status}`);
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
const data = await response.json();
|
|
301
|
+
const oauth = {
|
|
302
|
+
accessToken: data.access_token,
|
|
303
|
+
refreshToken: data.refresh_token,
|
|
304
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
305
|
+
};
|
|
306
|
+
writeCredentialsFile(oauth);
|
|
307
|
+
logger.info(`Token refreshed, expires in ${Math.round(data.expires_in / 3600)}h`);
|
|
308
|
+
return oauth;
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
logger.error(`Token refresh error: ${err}`);
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
238
315
|
/**
|
|
239
316
|
* Build environment variables for container
|
|
240
317
|
*
|
|
318
|
+
* Reads OAuth tokens from the mounted credentials file and refreshes
|
|
319
|
+
* them if expired. This ensures agents always get valid tokens without
|
|
320
|
+
* requiring manual herdctl restarts.
|
|
321
|
+
*
|
|
241
322
|
* @param agent - Resolved agent configuration
|
|
242
323
|
* @param config - Docker configuration (for custom env vars)
|
|
243
324
|
* @returns Array of "KEY=value" strings
|
|
244
325
|
*/
|
|
245
|
-
export function buildContainerEnv(agent, config) {
|
|
326
|
+
export async function buildContainerEnv(agent, config) {
|
|
246
327
|
const env = [];
|
|
247
328
|
// Pass through API key if available (preferred over mounted auth)
|
|
248
329
|
if (process.env.ANTHROPIC_API_KEY) {
|
|
249
330
|
env.push(`ANTHROPIC_API_KEY=${process.env.ANTHROPIC_API_KEY}`);
|
|
250
331
|
}
|
|
251
|
-
//
|
|
252
|
-
|
|
253
|
-
|
|
332
|
+
// Read fresh OAuth tokens from mounted credentials file on each spawn.
|
|
333
|
+
let oauth = readCredentialsFile();
|
|
334
|
+
// Refresh if token is expired or about to expire
|
|
335
|
+
if (oauth?.refreshToken && oauth?.expiresAt) {
|
|
336
|
+
const now = Date.now();
|
|
337
|
+
if (now >= oauth.expiresAt - TOKEN_REFRESH_BUFFER_MS) {
|
|
338
|
+
const refreshed = await refreshClaudeOAuthToken(oauth.refreshToken);
|
|
339
|
+
if (refreshed) {
|
|
340
|
+
oauth = refreshed;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (oauth) {
|
|
345
|
+
if (oauth.accessToken) {
|
|
346
|
+
env.push(`CLAUDE_CODE_OAUTH_TOKEN=${oauth.accessToken}`);
|
|
347
|
+
}
|
|
348
|
+
if (oauth.refreshToken) {
|
|
349
|
+
env.push(`CLAUDE_REFRESH_TOKEN=${oauth.refreshToken}`);
|
|
350
|
+
}
|
|
351
|
+
if (oauth.expiresAt) {
|
|
352
|
+
env.push(`CLAUDE_EXPIRES_AT=${oauth.expiresAt}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
// Fall back to env vars if credentials file not available
|
|
357
|
+
if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
|
|
358
|
+
env.push(`CLAUDE_CODE_OAUTH_TOKEN=${process.env.CLAUDE_CODE_OAUTH_TOKEN}`);
|
|
359
|
+
}
|
|
360
|
+
if (process.env.CLAUDE_REFRESH_TOKEN) {
|
|
361
|
+
env.push(`CLAUDE_REFRESH_TOKEN=${process.env.CLAUDE_REFRESH_TOKEN}`);
|
|
362
|
+
}
|
|
363
|
+
if (process.env.CLAUDE_EXPIRES_AT) {
|
|
364
|
+
env.push(`CLAUDE_EXPIRES_AT=${process.env.CLAUDE_EXPIRES_AT}`);
|
|
365
|
+
}
|
|
254
366
|
}
|
|
255
367
|
// Add custom environment variables from docker config
|
|
256
368
|
if (config?.env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-manager.js","sourceRoot":"","sources":["../../../src/runner/runtime/container-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"container-manager.js","sourceRoot":"","sources":["../../../src/runner/runtime/container-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,6 +56,8 @@ export declare class ContainerRunner implements RuntimeInterface {
|
|
|
56
56
|
* Execute SDK runtime inside Docker container
|
|
57
57
|
*
|
|
58
58
|
* Runs docker-sdk-wrapper.js script which imports SDK and streams messages as JSONL.
|
|
59
|
+
* If injected MCP servers are present, starts HTTP bridges on the Docker network
|
|
60
|
+
* so the agent container can access them via `http://herdctl:<port>/mcp`.
|
|
59
61
|
*/
|
|
60
62
|
private executeSDKRuntime;
|
|
61
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-runner.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/container-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"container-runner.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/container-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAevD;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IAapD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IAbhB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;;;;;OAOG;gBAEO,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,YAAY,EAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,WAAW,CAAC;IAM9B;;;;;;OAMG;IACI,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,UAAU,CAAC;IAqEzE;;;;OAIG;YACY,iBAAiB;IAkChC;;;;;;OAMG;YACY,iBAAiB;CAkJjC"}
|
|
@@ -20,11 +20,14 @@ import * as path from "node:path";
|
|
|
20
20
|
import * as fs from "node:fs/promises";
|
|
21
21
|
import { PassThrough } from "node:stream";
|
|
22
22
|
import { createInterface } from "node:readline";
|
|
23
|
+
import { startMcpHttpBridge } from "./mcp-http-bridge.js";
|
|
23
24
|
import { ContainerManager, buildContainerMounts, buildContainerEnv, } from "./container-manager.js";
|
|
24
25
|
import { CLIRuntime } from "./cli-runtime.js";
|
|
25
26
|
import { SDKRuntime } from "./sdk-runtime.js";
|
|
26
27
|
import { toSDKOptions } from "../sdk-adapter.js";
|
|
27
28
|
import Dockerode from "dockerode";
|
|
29
|
+
import { createLogger } from "../../utils/logger.js";
|
|
30
|
+
const logger = createLogger("ContainerRunner");
|
|
28
31
|
/**
|
|
29
32
|
* Container runtime decorator
|
|
30
33
|
*
|
|
@@ -64,7 +67,7 @@ export class ContainerRunner {
|
|
|
64
67
|
await fs.mkdir(dockerSessionsDir, { recursive: true });
|
|
65
68
|
// Build mounts and environment
|
|
66
69
|
const mounts = buildContainerMounts(agent, this.config, this.stateDir);
|
|
67
|
-
const env = buildContainerEnv(agent, this.config);
|
|
70
|
+
const env = await buildContainerEnv(agent, this.config);
|
|
68
71
|
// Get or create container
|
|
69
72
|
const container = await this.manager.getOrCreateContainer(agent.name, this.config, mounts, env);
|
|
70
73
|
try {
|
|
@@ -101,7 +104,7 @@ export class ContainerRunner {
|
|
|
101
104
|
}
|
|
102
105
|
catch (stopError) {
|
|
103
106
|
// Log but don't fail - container might already be stopped
|
|
104
|
-
|
|
107
|
+
logger.error(`Failed to stop ephemeral container: ${stopError}`);
|
|
105
108
|
}
|
|
106
109
|
}
|
|
107
110
|
// Always cleanup old containers, regardless of success/failure
|
|
@@ -111,7 +114,7 @@ export class ContainerRunner {
|
|
|
111
114
|
}
|
|
112
115
|
catch (cleanupError) {
|
|
113
116
|
// Log cleanup errors but don't fail the execution
|
|
114
|
-
|
|
117
|
+
logger.error(`Failed to cleanup old containers: ${cleanupError}`);
|
|
115
118
|
}
|
|
116
119
|
}
|
|
117
120
|
}
|
|
@@ -133,8 +136,8 @@ export class ContainerRunner {
|
|
|
133
136
|
return `'${arg.replace(/'/g, "'\\''")}'`;
|
|
134
137
|
}).join(" ");
|
|
135
138
|
const claudeCommand = `cd /workspace && printf %s "${escapedPrompt}" | claude ${claudeArgs}`;
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
logger.debug(`Executing docker exec in container ${containerId}`);
|
|
140
|
+
logger.debug(`Prompt length: ${prompt.length}`);
|
|
138
141
|
// execa returns Subprocess directly (which is promise-like)
|
|
139
142
|
return execa("docker", ["exec", containerId, "sh", "-c", claudeCommand], {
|
|
140
143
|
cancelSignal: signal,
|
|
@@ -150,85 +153,131 @@ export class ContainerRunner {
|
|
|
150
153
|
* Execute SDK runtime inside Docker container
|
|
151
154
|
*
|
|
152
155
|
* Runs docker-sdk-wrapper.js script which imports SDK and streams messages as JSONL.
|
|
156
|
+
* If injected MCP servers are present, starts HTTP bridges on the Docker network
|
|
157
|
+
* so the agent container can access them via `http://herdctl:<port>/mcp`.
|
|
153
158
|
*/
|
|
154
159
|
async *executeSDKRuntime(container, options) {
|
|
155
|
-
//
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
// Collect stderr for error diagnosis
|
|
194
|
-
const stderrLines = [];
|
|
195
|
-
const stderrRl = createInterface({
|
|
196
|
-
input: stderr,
|
|
197
|
-
crlfDelay: Infinity,
|
|
198
|
-
});
|
|
199
|
-
stderrRl.on("line", (line) => {
|
|
200
|
-
const trimmed = line.trim();
|
|
201
|
-
if (trimmed) {
|
|
202
|
-
console.error("[ContainerRunner] SDK stderr:", trimmed);
|
|
203
|
-
stderrLines.push(trimmed);
|
|
160
|
+
// Start HTTP bridges for injected MCP servers
|
|
161
|
+
const bridges = [];
|
|
162
|
+
try {
|
|
163
|
+
// Build SDK options
|
|
164
|
+
const sdkOptions = toSDKOptions(options.agent, {
|
|
165
|
+
resume: options.resume,
|
|
166
|
+
fork: options.fork,
|
|
167
|
+
});
|
|
168
|
+
// Override cwd for Docker - workspace is always mounted at /workspace
|
|
169
|
+
sdkOptions.cwd = "/workspace";
|
|
170
|
+
// Start HTTP bridges for injected MCP servers and inject as HTTP configs
|
|
171
|
+
if (options.injectedMcpServers && Object.keys(options.injectedMcpServers).length > 0) {
|
|
172
|
+
const mcpServers = sdkOptions.mcpServers ?? {};
|
|
173
|
+
for (const [name, def] of Object.entries(options.injectedMcpServers)) {
|
|
174
|
+
const bridge = await startMcpHttpBridge(def);
|
|
175
|
+
bridges.push(bridge);
|
|
176
|
+
// Agent container connects via Docker DNS: herdctl is the hostname
|
|
177
|
+
// of the herdctl container on the shared Docker network (herdctl-net)
|
|
178
|
+
mcpServers[name] = {
|
|
179
|
+
type: "http",
|
|
180
|
+
url: `http://herdctl:${bridge.port}/mcp`,
|
|
181
|
+
};
|
|
182
|
+
logger.debug(`Started MCP HTTP bridge for '${name}' on port ${bridge.port}`);
|
|
183
|
+
}
|
|
184
|
+
sdkOptions.mcpServers = mcpServers;
|
|
185
|
+
// Auto-add injected MCP server tool patterns to allowedTools
|
|
186
|
+
// Without this, agents with an allowedTools list can't call injected tools
|
|
187
|
+
if (sdkOptions.allowedTools?.length) {
|
|
188
|
+
for (const name of Object.keys(options.injectedMcpServers)) {
|
|
189
|
+
sdkOptions.allowedTools.push(`mcp__${name}__*`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// File uploads via MCP tools can take longer than the default 60s timeout
|
|
193
|
+
if (options.injectedMcpServers["herdctl-file-sender"]) {
|
|
194
|
+
if (!process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT) {
|
|
195
|
+
process.env.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT = "120000";
|
|
196
|
+
}
|
|
197
|
+
}
|
|
204
198
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
199
|
+
// Prepare options JSON for wrapper script
|
|
200
|
+
const wrapperOptions = {
|
|
201
|
+
prompt: options.prompt,
|
|
202
|
+
sdkOptions,
|
|
203
|
+
};
|
|
204
|
+
// Create exec with environment variable
|
|
205
|
+
// Use bash login shell to get full environment including PATH
|
|
206
|
+
const optionsJson = JSON.stringify(wrapperOptions).replace(/'/g, "'\\''");
|
|
207
|
+
const command = `export HERDCTL_SDK_OPTIONS='${optionsJson}' && node /usr/local/lib/docker-sdk-wrapper.js`;
|
|
208
|
+
logger.debug(`SDK exec command length: ${command.length}`);
|
|
209
|
+
logger.debug(`Options JSON length: ${optionsJson.length}`);
|
|
210
|
+
const exec = await container.exec({
|
|
211
|
+
Cmd: [
|
|
212
|
+
"bash",
|
|
213
|
+
"-l",
|
|
214
|
+
"-c",
|
|
215
|
+
command,
|
|
216
|
+
],
|
|
217
|
+
AttachStdout: true,
|
|
218
|
+
AttachStderr: true,
|
|
219
|
+
AttachStdin: false,
|
|
220
|
+
Tty: false,
|
|
221
|
+
WorkingDir: "/workspace",
|
|
222
|
+
});
|
|
223
|
+
// Start exec and get stream
|
|
224
|
+
const stream = await exec.start({ hijack: true, stdin: false });
|
|
225
|
+
// Demultiplex stdout/stderr
|
|
226
|
+
const stdout = new PassThrough();
|
|
227
|
+
const stderr = new PassThrough();
|
|
228
|
+
const modem = new Dockerode().modem;
|
|
229
|
+
modem.demuxStream(stream, stdout, stderr);
|
|
230
|
+
// Collect stderr for error diagnosis
|
|
231
|
+
const stderrLines = [];
|
|
232
|
+
const stderrRl = createInterface({
|
|
233
|
+
input: stderr,
|
|
234
|
+
crlfDelay: Infinity,
|
|
235
|
+
});
|
|
236
|
+
stderrRl.on("line", (line) => {
|
|
237
|
+
const trimmed = line.trim();
|
|
238
|
+
if (trimmed) {
|
|
239
|
+
logger.error(`SDK stderr: ${trimmed}`);
|
|
240
|
+
stderrLines.push(trimmed);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
// Parse stdout line-by-line as JSONL
|
|
244
|
+
const rl = createInterface({
|
|
245
|
+
input: stdout,
|
|
246
|
+
crlfDelay: Infinity,
|
|
247
|
+
});
|
|
248
|
+
for await (const line of rl) {
|
|
249
|
+
const trimmed = line.trim();
|
|
250
|
+
if (!trimmed)
|
|
251
|
+
continue;
|
|
252
|
+
try {
|
|
253
|
+
const message = JSON.parse(trimmed);
|
|
254
|
+
yield message;
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
logger.warn(`Failed to parse SDK output: ${error instanceof Error ? error.message : String(error)}`);
|
|
258
|
+
}
|
|
218
259
|
}
|
|
219
|
-
|
|
220
|
-
|
|
260
|
+
// Check exec exit code
|
|
261
|
+
const inspectData = await exec.inspect();
|
|
262
|
+
const exitCode = inspectData.ExitCode ?? 0;
|
|
263
|
+
if (exitCode !== 0) {
|
|
264
|
+
const stderr = stderrLines.join("\n");
|
|
265
|
+
yield {
|
|
266
|
+
type: "error",
|
|
267
|
+
message: `SDK wrapper exited with code ${exitCode}${stderr ? `\n\nStderr:\n${stderr}` : ""}`,
|
|
268
|
+
};
|
|
221
269
|
}
|
|
222
270
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
271
|
+
finally {
|
|
272
|
+
// Always close HTTP bridges to prevent port leaks
|
|
273
|
+
for (const bridge of bridges) {
|
|
274
|
+
try {
|
|
275
|
+
await bridge.close();
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
logger.error(`Failed to close MCP HTTP bridge: ${err}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
232
281
|
}
|
|
233
282
|
}
|
|
234
283
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-runner.js","sourceRoot":"","sources":["../../../src/runner/runtime/container-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,SAAS,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"container-runner.js","sourceRoot":"","sources":["../../../src/runner/runtime/container-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,4 +17,5 @@ export { CLISessionWatcher, watchSessionFile, } from "./cli-session-watcher.js";
|
|
|
17
17
|
export { type DockerConfig, type PathMapping, type NetworkMode, type VolumeMode, parseMemoryToBytes, parseVolumeMount, getHostUser, resolveDockerConfig, DEFAULT_DOCKER_IMAGE, DEFAULT_MEMORY_LIMIT, DEFAULT_MAX_CONTAINERS, } from "./docker-config.js";
|
|
18
18
|
export { ContainerRunner } from "./container-runner.js";
|
|
19
19
|
export { ContainerManager, buildContainerMounts, buildContainerEnv, } from "./container-manager.js";
|
|
20
|
+
export { startMcpHttpBridge, type McpHttpBridge } from "./mcp-http-bridge.js";
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -18,4 +18,6 @@ export { parseMemoryToBytes, parseVolumeMount, getHostUser, resolveDockerConfig,
|
|
|
18
18
|
// Container execution
|
|
19
19
|
export { ContainerRunner } from "./container-runner.js";
|
|
20
20
|
export { ContainerManager, buildContainerMounts, buildContainerEnv, } from "./container-manager.js";
|
|
21
|
+
// MCP HTTP bridge for Docker
|
|
22
|
+
export { startMcpHttpBridge } from "./mcp-http-bridge.js";
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runner/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,uBAAuB;AACvB,OAAO,EAKL,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runner/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,uBAAuB;AACvB,OAAO,EAKL,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAsB,MAAM,sBAAsB,CAAC"}
|
|
@@ -24,6 +24,8 @@ export interface RuntimeExecuteOptions {
|
|
|
24
24
|
fork?: boolean;
|
|
25
25
|
/** AbortController for cancellation support */
|
|
26
26
|
abortController?: AbortController;
|
|
27
|
+
/** MCP servers to inject at runtime (SDK and Docker runtimes) */
|
|
28
|
+
injectedMcpServers?: Record<string, import("../types.js").InjectedMcpServerDef>;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
31
|
* Runtime interface for executing Claude agents
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IAEf,mCAAmC;IACnC,KAAK,EAAE,aAAa,CAAC;IAErB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,+CAA+C;IAC/C,eAAe,CAAC,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IAEf,mCAAmC;IACnC,KAAK,EAAE,aAAa,CAAC;IAErB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,+CAA+C;IAC/C,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,oBAAoB,CAAC,CAAC;CACjF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;CACpE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP HTTP Bridge
|
|
3
|
+
*
|
|
4
|
+
* Minimal HTTP server implementing MCP Streamable HTTP transport (JSON-RPC 2.0 over POST).
|
|
5
|
+
* Used by ContainerRunner to expose injected MCP servers to Docker containers.
|
|
6
|
+
*
|
|
7
|
+
* The agent container connects to `http://herdctl:<port>/mcp` and the bridge
|
|
8
|
+
* translates tool calls to the in-process handler functions from InjectedMcpServerDef.
|
|
9
|
+
*
|
|
10
|
+
* Supports:
|
|
11
|
+
* - initialize
|
|
12
|
+
* - notifications/initialized
|
|
13
|
+
* - tools/list
|
|
14
|
+
* - tools/call
|
|
15
|
+
* - ping
|
|
16
|
+
*
|
|
17
|
+
* @module mcp-http-bridge
|
|
18
|
+
*/
|
|
19
|
+
import { type Server } from "node:http";
|
|
20
|
+
import type { InjectedMcpServerDef } from "../types.js";
|
|
21
|
+
export interface McpHttpBridge {
|
|
22
|
+
/** The HTTP server */
|
|
23
|
+
server: Server;
|
|
24
|
+
/** Port the server is listening on */
|
|
25
|
+
port: number;
|
|
26
|
+
/** Stop the bridge server */
|
|
27
|
+
close: () => Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start an MCP HTTP bridge for an InjectedMcpServerDef.
|
|
31
|
+
*
|
|
32
|
+
* Binds to 0.0.0.0 on a random available port. The agent container
|
|
33
|
+
* connects via `http://herdctl:<port>/mcp`.
|
|
34
|
+
*
|
|
35
|
+
* @param def - The injected MCP server definition to expose
|
|
36
|
+
* @returns Promise resolving to the bridge with server, port, and close method
|
|
37
|
+
*/
|
|
38
|
+
export declare function startMcpHttpBridge(def: InjectedMcpServerDef): Promise<McpHttpBridge>;
|
|
39
|
+
//# sourceMappingURL=mcp-http-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-http-bridge.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/mcp-http-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAgB,KAAK,MAAM,EAA6C,MAAM,WAAW,CAAC;AACjG,OAAO,KAAK,EAAE,oBAAoB,EAAyC,MAAM,aAAa,CAAC;AAoB/F,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AA8KD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoC1F"}
|