@darkiceinteractive/mcp-conductor 1.0.0 → 2.0.0-alpha.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/README.md +263 -432
- package/dist/bridge/http-server.d.ts +39 -1
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +187 -10
- package/dist/bridge/http-server.js.map +1 -1
- package/dist/bridge/index.d.ts +4 -1
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +4 -1
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/session-registry.d.ts +64 -0
- package/dist/bridge/session-registry.d.ts.map +1 -0
- package/dist/bridge/session-registry.js +124 -0
- package/dist/bridge/session-registry.js.map +1 -0
- package/dist/config/defaults.d.ts +58 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +61 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +3 -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 +3 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +29 -6
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +2 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/hub/index.d.ts +3 -1
- package/dist/hub/index.d.ts.map +1 -1
- package/dist/hub/index.js +3 -1
- package/dist/hub/index.js.map +1 -1
- package/dist/hub/mcp-hub.d.ts +1 -0
- package/dist/hub/mcp-hub.d.ts.map +1 -1
- package/dist/hub/mcp-hub.js +47 -14
- package/dist/hub/mcp-hub.js.map +1 -1
- package/dist/index.d.ts +21 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -7
- package/dist/index.js.map +1 -1
- package/dist/metrics/index.d.ts +3 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +3 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/metrics-collector.d.ts.map +1 -1
- package/dist/metrics/metrics-collector.js +1 -1
- package/dist/metrics/metrics-collector.js.map +1 -1
- package/dist/modes/index.d.ts +3 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +3 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/runtime/executor.d.ts +36 -1
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +245 -16
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/index.d.ts +3 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/server/index.d.ts +3 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp-server.d.ts +5 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +243 -44
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/skills/index.d.ts +3 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +3 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/streaming/execution-stream.d.ts.map +1 -1
- package/dist/streaming/execution-stream.js +22 -5
- package/dist/streaming/execution-stream.js.map +1 -1
- package/dist/streaming/index.d.ts +3 -1
- package/dist/streaming/index.d.ts.map +1 -1
- package/dist/streaming/index.js +3 -1
- package/dist/streaming/index.js.map +1 -1
- package/dist/utils/env.d.ts +20 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +33 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/errors.d.ts +17 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/index.d.ts +6 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +8 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +13 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/orphan-watch.d.ts +34 -0
- package/dist/utils/orphan-watch.d.ts.map +1 -0
- package/dist/utils/orphan-watch.js +54 -0
- package/dist/utils/orphan-watch.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +6 -0
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/redact.d.ts +15 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +48 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher/index.d.ts +3 -1
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +3 -1
- package/dist/watcher/index.js.map +1 -1
- package/package.json +4 -5
- package/dist/bin/cli.d.ts +0 -8
- package/dist/bin/cli.d.ts.map +0 -1
- package/dist/bin/cli.js +0 -940
- package/dist/bin/cli.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC"}
|
package/dist/skills/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Skills
|
|
2
|
+
* Skills engine — loads YAML-defined reusable code templates from a
|
|
3
|
+
* directory, supports search/list/execute, and hot-reloads on change.
|
|
4
|
+
* @module skills
|
|
3
5
|
*/
|
|
4
6
|
export { SkillsEngine, getSkillsEngine, shutdownSkillsEngine, } from './skills-engine.js';
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,GAQrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-stream.d.ts","sourceRoot":"","sources":["../../src/streaming/execution-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-stream.d.ts","sourceRoot":"","sources":["../../src/streaming/execution-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { EventEmitter } from 'node:events';
|
|
8
8
|
import { logger } from '../utils/index.js';
|
|
9
|
+
import { LIFECYCLE_TIMEOUTS } from '../config/defaults.js';
|
|
9
10
|
/**
|
|
10
11
|
* Manages streaming for a single execution
|
|
11
12
|
*/
|
|
@@ -64,6 +65,10 @@ export class ExecutionStream extends EventEmitter {
|
|
|
64
65
|
*/
|
|
65
66
|
log(message, level = 'info') {
|
|
66
67
|
this.state.logs.push(message);
|
|
68
|
+
// Cap logs to prevent unbounded memory growth
|
|
69
|
+
if (this.state.logs.length > 500) {
|
|
70
|
+
this.state.logs = this.state.logs.slice(-500);
|
|
71
|
+
}
|
|
67
72
|
this.state.lastUpdate = new Date();
|
|
68
73
|
const event = {
|
|
69
74
|
type: 'log',
|
|
@@ -128,6 +133,8 @@ export class ExecutionStream extends EventEmitter {
|
|
|
128
133
|
this.state.status = result.success ? 'completed' : 'error';
|
|
129
134
|
this.state.progress = 100;
|
|
130
135
|
this.state.lastUpdate = new Date();
|
|
136
|
+
// Release log memory on completion
|
|
137
|
+
this.state.logs = [];
|
|
131
138
|
const event = {
|
|
132
139
|
type: 'complete',
|
|
133
140
|
timestamp: new Date().toISOString(),
|
|
@@ -207,10 +214,10 @@ export class ExecutionStream extends EventEmitter {
|
|
|
207
214
|
export class StreamManager {
|
|
208
215
|
streams = new Map();
|
|
209
216
|
cleanupInterval = null;
|
|
210
|
-
maxStreamAge =
|
|
217
|
+
maxStreamAge = LIFECYCLE_TIMEOUTS.STREAM_STALE_TTL_MS;
|
|
211
218
|
constructor() {
|
|
212
219
|
// Start cleanup interval
|
|
213
|
-
this.cleanupInterval = setInterval(() => this.cleanupStaleStreams(),
|
|
220
|
+
this.cleanupInterval = setInterval(() => this.cleanupStaleStreams(), LIFECYCLE_TIMEOUTS.STREAM_CLEANUP_INTERVAL_MS);
|
|
214
221
|
}
|
|
215
222
|
/**
|
|
216
223
|
* Create a new execution stream
|
|
@@ -267,12 +274,21 @@ export class StreamManager {
|
|
|
267
274
|
for (const [id, stream] of this.streams) {
|
|
268
275
|
const state = stream.getState();
|
|
269
276
|
const age = now - state.lastUpdate.getTime();
|
|
270
|
-
//
|
|
277
|
+
// Normal cleanup: completed + no connections + 5min old
|
|
271
278
|
if ((state.status === 'completed' || state.status === 'error') &&
|
|
272
279
|
!stream.hasConnections() &&
|
|
273
280
|
age > this.maxStreamAge) {
|
|
274
281
|
toRemove.push(id);
|
|
275
282
|
}
|
|
283
|
+
// Force cleanup: completed/error + STREAM_COMPLETED_TTL_MS old (even with connections)
|
|
284
|
+
else if ((state.status === 'completed' || state.status === 'error') &&
|
|
285
|
+
age > LIFECYCLE_TIMEOUTS.STREAM_COMPLETED_TTL_MS) {
|
|
286
|
+
toRemove.push(id);
|
|
287
|
+
}
|
|
288
|
+
// Stuck cleanup: running + no update in STREAM_STUCK_TTL_MS
|
|
289
|
+
else if (state.status === 'running' && age > LIFECYCLE_TIMEOUTS.STREAM_STUCK_TTL_MS) {
|
|
290
|
+
toRemove.push(id);
|
|
291
|
+
}
|
|
276
292
|
}
|
|
277
293
|
for (const id of toRemove) {
|
|
278
294
|
this.removeStream(id);
|
|
@@ -289,8 +305,9 @@ export class StreamManager {
|
|
|
289
305
|
clearInterval(this.cleanupInterval);
|
|
290
306
|
this.cleanupInterval = null;
|
|
291
307
|
}
|
|
292
|
-
// Close all streams
|
|
293
|
-
for (const [
|
|
308
|
+
// Close all streams and clean up listeners
|
|
309
|
+
for (const [_id, stream] of this.streams) {
|
|
310
|
+
stream.removeAllListeners();
|
|
294
311
|
stream.closeAllConnections();
|
|
295
312
|
}
|
|
296
313
|
this.streams.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-stream.js","sourceRoot":"","sources":["../../src/streaming/execution-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-stream.js","sourceRoot":"","sources":["../../src/streaming/execution-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Streaming
|
|
2
|
+
* Streaming — SSE-based event stream for real-time progress updates,
|
|
3
|
+
* console log forwarding, tool call tracing, and execution completion.
|
|
4
|
+
* @module streaming
|
|
3
5
|
*/
|
|
4
6
|
export { ExecutionStream, StreamManager, getStreamManager, shutdownStreamManager, type StreamEvent, type LogEvent, type ProgressEvent, type ToolCallEvent, type CompleteEvent, type ExecutionState, } from './execution-stream.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC"}
|
package/dist/streaming/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Streaming
|
|
2
|
+
* Streaming — SSE-based event stream for real-time progress updates,
|
|
3
|
+
* console log forwarding, tool call tracing, and execution completion.
|
|
4
|
+
* @module streaming
|
|
3
5
|
*/
|
|
4
6
|
export { ExecutionStream, StreamManager, getStreamManager, shutdownStreamManager, } from './execution-stream.js';
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GAOtB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal environment builder for spawned child processes.
|
|
3
|
+
*
|
|
4
|
+
* Passing `process.env` wholesale to child processes leaks secrets (API keys,
|
|
5
|
+
* tokens) and user identity (USER, SHELL, LOGNAME) into sandboxes and backend
|
|
6
|
+
* MCP servers. Children only need PATH (to resolve binaries) and HOME (for
|
|
7
|
+
* Deno/npm caches). Everything else is explicitly opted in via `extra`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Build a minimal env for spawning a child process.
|
|
11
|
+
*
|
|
12
|
+
* Always includes `PATH` and `HOME`. Any keys supplied via `extra` are merged
|
|
13
|
+
* on top, with `undefined`/empty values dropped so they can't override a valid
|
|
14
|
+
* parent value unintentionally.
|
|
15
|
+
*
|
|
16
|
+
* @param extra - Additional env vars to include (e.g. `{ DENO_DIR, NO_COLOR: '1' }`)
|
|
17
|
+
* @returns Env object suitable for `child_process.spawn({ env: ... })`
|
|
18
|
+
*/
|
|
19
|
+
export declare function minimalChildEnv(extra?: Record<string, string | undefined>): Record<string, string>;
|
|
20
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAexB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal environment builder for spawned child processes.
|
|
3
|
+
*
|
|
4
|
+
* Passing `process.env` wholesale to child processes leaks secrets (API keys,
|
|
5
|
+
* tokens) and user identity (USER, SHELL, LOGNAME) into sandboxes and backend
|
|
6
|
+
* MCP servers. Children only need PATH (to resolve binaries) and HOME (for
|
|
7
|
+
* Deno/npm caches). Everything else is explicitly opted in via `extra`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Build a minimal env for spawning a child process.
|
|
11
|
+
*
|
|
12
|
+
* Always includes `PATH` and `HOME`. Any keys supplied via `extra` are merged
|
|
13
|
+
* on top, with `undefined`/empty values dropped so they can't override a valid
|
|
14
|
+
* parent value unintentionally.
|
|
15
|
+
*
|
|
16
|
+
* @param extra - Additional env vars to include (e.g. `{ DENO_DIR, NO_COLOR: '1' }`)
|
|
17
|
+
* @returns Env object suitable for `child_process.spawn({ env: ... })`
|
|
18
|
+
*/
|
|
19
|
+
export function minimalChildEnv(extra) {
|
|
20
|
+
const env = {
|
|
21
|
+
PATH: process.env.PATH ?? '',
|
|
22
|
+
HOME: process.env.HOME ?? '',
|
|
23
|
+
};
|
|
24
|
+
if (extra) {
|
|
25
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
26
|
+
if (value !== undefined && value !== '') {
|
|
27
|
+
env[key] = value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return env;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,KAA0C;IAE1C,MAAM,GAAG,GAA2B;QAClC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;KAC7B,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Custom error
|
|
2
|
+
* Custom error hierarchy for MCP Conductor.
|
|
3
|
+
*
|
|
4
|
+
* All errors extend {@link ExecutionError}, which carries a discriminated
|
|
5
|
+
* `type` field so callers can pattern-match without `instanceof` checks.
|
|
6
|
+
* The `toJSON()` method produces a serialisable representation suitable
|
|
7
|
+
* for returning in MCP tool error responses.
|
|
8
|
+
*
|
|
9
|
+
* @module utils/errors
|
|
3
10
|
*/
|
|
11
|
+
/** Discriminated union of all error categories. */
|
|
4
12
|
export type ErrorType = 'syntax' | 'runtime' | 'timeout' | 'security' | 'connection' | 'tool_not_found' | 'server_not_found';
|
|
13
|
+
/** Base error for all sandbox execution failures. */
|
|
5
14
|
export declare class ExecutionError extends Error {
|
|
6
15
|
readonly type: ErrorType;
|
|
7
16
|
readonly line?: number;
|
|
@@ -12,24 +21,31 @@ export declare class ExecutionError extends Error {
|
|
|
12
21
|
});
|
|
13
22
|
toJSON(): Record<string, unknown>;
|
|
14
23
|
}
|
|
24
|
+
/** Raised when user-supplied TypeScript fails to parse. */
|
|
15
25
|
export declare class SyntaxError extends ExecutionError {
|
|
16
26
|
constructor(message: string, line?: number);
|
|
17
27
|
}
|
|
28
|
+
/** Raised when code throws an unhandled exception during execution. */
|
|
18
29
|
export declare class RuntimeError extends ExecutionError {
|
|
19
30
|
constructor(message: string, stack?: string);
|
|
20
31
|
}
|
|
32
|
+
/** Raised when a sandbox execution exceeds its configured timeout. */
|
|
21
33
|
export declare class TimeoutError extends ExecutionError {
|
|
22
34
|
constructor(timeoutMs: number);
|
|
23
35
|
}
|
|
36
|
+
/** Raised when sandbox code attempts a disallowed operation (e.g. net access). */
|
|
24
37
|
export declare class SecurityError extends ExecutionError {
|
|
25
38
|
constructor(message: string);
|
|
26
39
|
}
|
|
40
|
+
/** Raised when a backend MCP server fails to connect or respond. */
|
|
27
41
|
export declare class ConnectionError extends ExecutionError {
|
|
28
42
|
constructor(serverName: string, message: string);
|
|
29
43
|
}
|
|
44
|
+
/** Raised when sandbox code calls a tool that does not exist on the target server. */
|
|
30
45
|
export declare class ToolNotFoundError extends ExecutionError {
|
|
31
46
|
constructor(serverName: string, toolName: string);
|
|
32
47
|
}
|
|
48
|
+
/** Raised when sandbox code references a server name not in the conductor config. */
|
|
33
49
|
export declare class ServerNotFoundError extends ExecutionError {
|
|
34
50
|
constructor(serverName: string);
|
|
35
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,mDAAmD;AACnD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE7H,qDAAqD;AACrD,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;gBAEnB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAUzF,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQlC;AAED,2DAA2D;AAC3D,qBAAa,WAAY,SAAQ,cAAc;gBACjC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAI3C;AAED,uEAAuE;AACvE,qBAAa,YAAa,SAAQ,cAAc;gBAClC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAI5C;AAED,sEAAsE;AACtE,qBAAa,YAAa,SAAQ,cAAc;gBAClC,SAAS,EAAE,MAAM;CAI9B;AAED,kFAAkF;AAClF,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,oEAAoE;AACpE,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIhD;AAED,sFAAsF;AACtF,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAIjD;AAED,qFAAqF;AACrF,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,UAAU,EAAE,MAAM;CAI/B"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Custom error
|
|
2
|
+
* Custom error hierarchy for MCP Conductor.
|
|
3
|
+
*
|
|
4
|
+
* All errors extend {@link ExecutionError}, which carries a discriminated
|
|
5
|
+
* `type` field so callers can pattern-match without `instanceof` checks.
|
|
6
|
+
* The `toJSON()` method produces a serialisable representation suitable
|
|
7
|
+
* for returning in MCP tool error responses.
|
|
8
|
+
*
|
|
9
|
+
* @module utils/errors
|
|
3
10
|
*/
|
|
11
|
+
/** Base error for all sandbox execution failures. */
|
|
4
12
|
export class ExecutionError extends Error {
|
|
5
13
|
type;
|
|
6
14
|
line;
|
|
@@ -23,42 +31,49 @@ export class ExecutionError extends Error {
|
|
|
23
31
|
};
|
|
24
32
|
}
|
|
25
33
|
}
|
|
34
|
+
/** Raised when user-supplied TypeScript fails to parse. */
|
|
26
35
|
export class SyntaxError extends ExecutionError {
|
|
27
36
|
constructor(message, line) {
|
|
28
37
|
super('syntax', message, { line });
|
|
29
38
|
this.name = 'SyntaxError';
|
|
30
39
|
}
|
|
31
40
|
}
|
|
41
|
+
/** Raised when code throws an unhandled exception during execution. */
|
|
32
42
|
export class RuntimeError extends ExecutionError {
|
|
33
43
|
constructor(message, stack) {
|
|
34
44
|
super('runtime', message, { stack });
|
|
35
45
|
this.name = 'RuntimeError';
|
|
36
46
|
}
|
|
37
47
|
}
|
|
48
|
+
/** Raised when a sandbox execution exceeds its configured timeout. */
|
|
38
49
|
export class TimeoutError extends ExecutionError {
|
|
39
50
|
constructor(timeoutMs) {
|
|
40
51
|
super('timeout', `Execution timed out after ${timeoutMs}ms`);
|
|
41
52
|
this.name = 'TimeoutError';
|
|
42
53
|
}
|
|
43
54
|
}
|
|
55
|
+
/** Raised when sandbox code attempts a disallowed operation (e.g. net access). */
|
|
44
56
|
export class SecurityError extends ExecutionError {
|
|
45
57
|
constructor(message) {
|
|
46
58
|
super('security', message);
|
|
47
59
|
this.name = 'SecurityError';
|
|
48
60
|
}
|
|
49
61
|
}
|
|
62
|
+
/** Raised when a backend MCP server fails to connect or respond. */
|
|
50
63
|
export class ConnectionError extends ExecutionError {
|
|
51
64
|
constructor(serverName, message) {
|
|
52
65
|
super('connection', `Failed to connect to server '${serverName}': ${message}`);
|
|
53
66
|
this.name = 'ConnectionError';
|
|
54
67
|
}
|
|
55
68
|
}
|
|
69
|
+
/** Raised when sandbox code calls a tool that does not exist on the target server. */
|
|
56
70
|
export class ToolNotFoundError extends ExecutionError {
|
|
57
71
|
constructor(serverName, toolName) {
|
|
58
72
|
super('tool_not_found', `Tool '${toolName}' not found on server '${serverName}'`);
|
|
59
73
|
this.name = 'ToolNotFoundError';
|
|
60
74
|
}
|
|
61
75
|
}
|
|
76
|
+
/** Raised when sandbox code references a server name not in the conductor config. */
|
|
62
77
|
export class ServerNotFoundError extends ExecutionError {
|
|
63
78
|
constructor(serverName) {
|
|
64
79
|
super('server_not_found', `Server '${serverName}' not found`);
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,qDAAqD;AACrD,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAY;IAChB,IAAI,CAAU;IACd,KAAK,CAAU;IAE/B,YAAY,IAAe,EAAE,OAAe,EAAE,OAA2C;QACvF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,OAAO,WAAY,SAAQ,cAAc;IAC7C,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,uEAAuE;AACvE,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C,YAAY,OAAe,EAAE,KAAc;QACzC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C,YAAY,SAAiB;QAC3B,KAAK,CAAC,SAAS,EAAE,6BAA6B,SAAS,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,OAAO,aAAc,SAAQ,cAAc;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,UAAkB,EAAE,OAAe;QAC7C,KAAK,CAAC,YAAY,EAAE,gCAAgC,UAAU,MAAM,OAAO,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,sFAAsF;AACtF,MAAM,OAAO,iBAAkB,SAAQ,cAAc;IACnD,YAAY,UAAkB,EAAE,QAAgB;QAC9C,KAAK,CAAC,gBAAgB,EAAE,SAAS,QAAQ,0BAA0B,UAAU,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,UAAkB;QAC5B,KAAK,CAAC,kBAAkB,EAAE,WAAW,UAAU,aAAa,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Shared utilities — structured logger, error hierarchy, helper functions,
|
|
3
|
+
* Deno permission builder, and token-bucket rate limiter.
|
|
4
|
+
* @module utils
|
|
3
5
|
*/
|
|
4
6
|
export * from './logger.js';
|
|
5
7
|
export * from './errors.js';
|
|
6
8
|
export * from './helpers.js';
|
|
7
9
|
export * from './permissions.js';
|
|
8
10
|
export * from './rate-limiter.js';
|
|
11
|
+
export * from './env.js';
|
|
12
|
+
export * from './orphan-watch.js';
|
|
13
|
+
export * from './redact.js';
|
|
9
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Shared utilities — structured logger, error hierarchy, helper functions,
|
|
3
|
+
* Deno permission builder, and token-bucket rate limiter.
|
|
4
|
+
* @module utils
|
|
3
5
|
*/
|
|
4
6
|
export * from './logger.js';
|
|
5
7
|
export * from './errors.js';
|
|
6
8
|
export * from './helpers.js';
|
|
7
9
|
export * from './permissions.js';
|
|
8
10
|
export * from './rate-limiter.js';
|
|
11
|
+
export * from './env.js';
|
|
12
|
+
export * from './orphan-watch.js';
|
|
13
|
+
export * from './redact.js';
|
|
9
14
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Structured logger for MCP Conductor.
|
|
3
|
+
*
|
|
4
|
+
* All output goes to `stderr` so it does not interfere with the MCP protocol
|
|
5
|
+
* (which uses `stdout`). Messages are JSON-structured with ISO-8601 timestamps.
|
|
6
|
+
*
|
|
7
|
+
* Set `MCP_EXECUTOR_LOG_LEVEL` to `debug`, `info`, `warn`, or `error`.
|
|
8
|
+
*
|
|
9
|
+
* @module utils/logger
|
|
3
10
|
*/
|
|
4
11
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
5
12
|
export declare const logger: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAyB3D,eAAO,MAAM,MAAM;oBACD,QAAQ,GAAG,IAAI;gBAInB,QAAQ;mBAIL,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;kBAM9C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;kBAM7C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;mBAM5C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAK7D,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Structured logger for MCP Conductor.
|
|
3
|
+
*
|
|
4
|
+
* All output goes to `stderr` so it does not interfere with the MCP protocol
|
|
5
|
+
* (which uses `stdout`). Messages are JSON-structured with ISO-8601 timestamps.
|
|
6
|
+
*
|
|
7
|
+
* Set `MCP_EXECUTOR_LOG_LEVEL` to `debug`, `info`, `warn`, or `error`.
|
|
8
|
+
*
|
|
9
|
+
* @module utils/logger
|
|
3
10
|
*/
|
|
11
|
+
import { redactSecrets } from './redact.js';
|
|
4
12
|
const LOG_LEVELS = {
|
|
5
13
|
debug: 0,
|
|
6
14
|
info: 1,
|
|
@@ -15,7 +23,10 @@ function formatMessage(level, message, meta) {
|
|
|
15
23
|
const timestamp = new Date().toISOString();
|
|
16
24
|
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
|
|
17
25
|
const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';
|
|
18
|
-
|
|
26
|
+
// Redact known-secret patterns in both the message and the serialised
|
|
27
|
+
// meta before writing. Defensive: callers shouldn't log secrets, but
|
|
28
|
+
// sandbox stdout/stderr can leak them through error strings.
|
|
29
|
+
return redactSecrets(`${prefix} ${message}${metaStr}`);
|
|
19
30
|
}
|
|
20
31
|
export const logger = {
|
|
21
32
|
setLevel(level) {
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAc,IAAI,MAAM,CAAC;AAE3F,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;IACrF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,sEAAsE;IACtE,qEAAqE;IACrE,6DAA6D;IAC7D,OAAO,aAAa,CAAC,GAAG,MAAM,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,CAAC,KAAe;QACtB,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orphan-process watchdog.
|
|
3
|
+
*
|
|
4
|
+
* Conductor is launched by Claude (or another MCP client) as a long-running
|
|
5
|
+
* stdio subprocess. If the client crashes or is force-killed, Conductor can
|
|
6
|
+
* stay alive — along with its Deno children — leaking memory and compute
|
|
7
|
+
* until an operator notices. On POSIX the orphaning is visible: the parent
|
|
8
|
+
* PID changes to 1 (init) once the original parent has reaped. We poll
|
|
9
|
+
* periodically and, when reparenting is detected, invoke a graceful
|
|
10
|
+
* shutdown so everything downstream (Deno, MCP hub, HTTP bridge, timers)
|
|
11
|
+
* stops cleanly.
|
|
12
|
+
*
|
|
13
|
+
* On Windows `process.ppid` is less reliable but we still compare against
|
|
14
|
+
* the startup value; any change is treated as an orphan signal.
|
|
15
|
+
*/
|
|
16
|
+
import { logger } from './logger.js';
|
|
17
|
+
export interface OrphanWatch {
|
|
18
|
+
stop(): void;
|
|
19
|
+
}
|
|
20
|
+
export interface OrphanWatchOptions {
|
|
21
|
+
onOrphaned: () => void | Promise<void>;
|
|
22
|
+
intervalMs?: number;
|
|
23
|
+
/** Inject for tests. Defaults to `() => process.ppid`. */
|
|
24
|
+
getPpid?: () => number;
|
|
25
|
+
/** Called once orphaning is confirmed. */
|
|
26
|
+
logger?: Pick<typeof logger, 'warn'>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Start watching. Returns a handle with stop() so callers can unhook the
|
|
30
|
+
* watcher during normal shutdown (prevents spurious orphan fires during
|
|
31
|
+
* SIGTERM cleanup).
|
|
32
|
+
*/
|
|
33
|
+
export declare function startOrphanWatch(options: OrphanWatchOptions): OrphanWatch;
|
|
34
|
+
//# sourceMappingURL=orphan-watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-watch.d.ts","sourceRoot":"","sources":["../../src/utils/orphan-watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAqCzE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orphan-process watchdog.
|
|
3
|
+
*
|
|
4
|
+
* Conductor is launched by Claude (or another MCP client) as a long-running
|
|
5
|
+
* stdio subprocess. If the client crashes or is force-killed, Conductor can
|
|
6
|
+
* stay alive — along with its Deno children — leaking memory and compute
|
|
7
|
+
* until an operator notices. On POSIX the orphaning is visible: the parent
|
|
8
|
+
* PID changes to 1 (init) once the original parent has reaped. We poll
|
|
9
|
+
* periodically and, when reparenting is detected, invoke a graceful
|
|
10
|
+
* shutdown so everything downstream (Deno, MCP hub, HTTP bridge, timers)
|
|
11
|
+
* stops cleanly.
|
|
12
|
+
*
|
|
13
|
+
* On Windows `process.ppid` is less reliable but we still compare against
|
|
14
|
+
* the startup value; any change is treated as an orphan signal.
|
|
15
|
+
*/
|
|
16
|
+
import { logger } from './logger.js';
|
|
17
|
+
import { LIFECYCLE_TIMEOUTS } from '../config/defaults.js';
|
|
18
|
+
/**
|
|
19
|
+
* Start watching. Returns a handle with stop() so callers can unhook the
|
|
20
|
+
* watcher during normal shutdown (prevents spurious orphan fires during
|
|
21
|
+
* SIGTERM cleanup).
|
|
22
|
+
*/
|
|
23
|
+
export function startOrphanWatch(options) {
|
|
24
|
+
const { onOrphaned, intervalMs = LIFECYCLE_TIMEOUTS.ORPHAN_CHECK_INTERVAL_MS, getPpid = () => process.ppid, logger: log = logger, } = options;
|
|
25
|
+
const initialPpid = getPpid();
|
|
26
|
+
let fired = false;
|
|
27
|
+
const timer = setInterval(() => {
|
|
28
|
+
if (fired)
|
|
29
|
+
return;
|
|
30
|
+
const current = getPpid();
|
|
31
|
+
// We treat *any* change from the startup ppid as orphaning. We do NOT
|
|
32
|
+
// also treat ppid===1 as orphaning unconditionally, because conductor
|
|
33
|
+
// is sometimes launched directly under PID 1 (systemd Type=simple,
|
|
34
|
+
// supervisord, container ENTRYPOINT) — in those environments the
|
|
35
|
+
// initial ppid is already 1 and the watchdog must not self-fire.
|
|
36
|
+
if (current !== initialPpid) {
|
|
37
|
+
fired = true;
|
|
38
|
+
log.warn('Parent process gone, triggering orphan shutdown', {
|
|
39
|
+
initialPpid,
|
|
40
|
+
currentPpid: current,
|
|
41
|
+
});
|
|
42
|
+
void Promise.resolve(onOrphaned()).catch((err) => {
|
|
43
|
+
log.warn('Orphan shutdown handler threw', { error: String(err) });
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}, intervalMs);
|
|
47
|
+
timer.unref?.();
|
|
48
|
+
return {
|
|
49
|
+
stop() {
|
|
50
|
+
clearInterval(timer);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=orphan-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-watch.js","sourceRoot":"","sources":["../../src/utils/orphan-watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAe3D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,MAAM,EACJ,UAAU,EACV,UAAU,GAAG,kBAAkB,CAAC,wBAAwB,EACxD,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAC5B,MAAM,EAAE,GAAG,GAAG,MAAM,GACrB,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,KAAK;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,sEAAsE;QACtE,sEAAsE;QACtE,mEAAmE;QACnE,iEAAiE;QACjE,iEAAiE;QACjE,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,KAAK,GAAG,IAAI,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,iDAAiD,EAAE;gBAC1D,WAAW;gBACX,WAAW,EAAE,OAAO;aACrB,CAAC,CAAC;YACH,KAAK,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACxD,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACf,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,OAAO;QACL,IAAI;YACF,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AASD;;GAEG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;gBAEd,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM;IAsBvD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,QAAQ,IAAI,gBAAgB;IAa5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAgBf;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AASD;;GAEG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;gBAEd,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM;IAsBvD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,QAAQ,IAAI,gBAAgB;IAa5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAgBf;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAiDf;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,YAAY;CAkBrB"}
|
|
@@ -112,6 +112,12 @@ export class RateLimiter extends EventEmitter {
|
|
|
112
112
|
* Enqueue a request to wait for a token
|
|
113
113
|
*/
|
|
114
114
|
enqueue() {
|
|
115
|
+
// Reject if queue is full to prevent unbounded memory growth
|
|
116
|
+
if (this.queue.length >= 100) {
|
|
117
|
+
this.totalRejected++;
|
|
118
|
+
this.emit('rejected', { serverName: this.serverName, reason: 'queue full' });
|
|
119
|
+
return Promise.reject(new Error(`Rate limit queue full for ${this.serverName}: ${this.queue.length} pending`));
|
|
120
|
+
}
|
|
115
121
|
return new Promise((resolve, reject) => {
|
|
116
122
|
const queuePosition = this.queue.length + 1;
|
|
117
123
|
const estimatedWaitMs = Math.ceil((queuePosition / this.requestsPerSecond) * 1000);
|