@darkiceinteractive/mcp-conductor 1.1.0 → 3.0.0-beta.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 +35 -5
- package/dist/bin/cli.d.ts +20 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +260 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bridge/http-server.d.ts +65 -1
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +192 -7
- package/dist/bridge/http-server.js.map +1 -1
- package/dist/bridge/index.d.ts +1 -0
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +1 -0
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/pool.d.ts +95 -0
- package/dist/bridge/pool.d.ts.map +1 -0
- package/dist/bridge/pool.js +384 -0
- package/dist/bridge/pool.js.map +1 -0
- 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/cache/cache.d.ts +43 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +167 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/delta.d.ts +32 -0
- package/dist/cache/delta.d.ts.map +1 -0
- package/dist/cache/delta.js +131 -0
- package/dist/cache/delta.js.map +1 -0
- package/dist/cache/disk.d.ts +65 -0
- package/dist/cache/disk.d.ts.map +1 -0
- package/dist/cache/disk.js +238 -0
- package/dist/cache/disk.js.map +1 -0
- package/dist/cache/index.d.ts +53 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/key.d.ts +44 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +83 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/lru.d.ts +57 -0
- package/dist/cache/lru.d.ts.map +1 -0
- package/dist/cache/lru.js +112 -0
- package/dist/cache/lru.js.map +1 -0
- package/dist/cache/policy.d.ts +34 -0
- package/dist/cache/policy.d.ts.map +1 -0
- package/dist/cache/policy.js +95 -0
- package/dist/cache/policy.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +33 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +135 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export-servers.d.ts +22 -0
- package/dist/cli/commands/export-servers.d.ts.map +1 -0
- package/dist/cli/commands/export-servers.js +45 -0
- package/dist/cli/commands/export-servers.js.map +1 -0
- package/dist/cli/commands/import-servers.d.ts +57 -0
- package/dist/cli/commands/import-servers.d.ts.map +1 -0
- package/dist/cli/commands/import-servers.js +137 -0
- package/dist/cli/commands/import-servers.js.map +1 -0
- package/dist/cli/commands/routing.d.ts +34 -0
- package/dist/cli/commands/routing.d.ts.map +1 -0
- package/dist/cli/commands/routing.js +60 -0
- package/dist/cli/commands/routing.js.map +1 -0
- package/dist/cli/commands/test-server.d.ts +34 -0
- package/dist/cli/commands/test-server.d.ts.map +1 -0
- package/dist/cli/commands/test-server.js +86 -0
- package/dist/cli/commands/test-server.js.map +1 -0
- package/dist/cli/daemon.d.ts +60 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +244 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/replay.d.ts +16 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +89 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/wizard/setup.d.ts +12 -0
- package/dist/cli/wizard/setup.d.ts.map +1 -0
- package/dist/cli/wizard/setup.js +71 -0
- package/dist/cli/wizard/setup.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +14 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/daemon/client.d.ts +97 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +279 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/discovery.d.ts +50 -0
- package/dist/daemon/discovery.d.ts.map +1 -0
- package/dist/daemon/discovery.js +104 -0
- package/dist/daemon/discovery.js.map +1 -0
- package/dist/daemon/index.d.ts +16 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +11 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/sandbox-api.d.ts +45 -0
- package/dist/daemon/sandbox-api.d.ts.map +1 -0
- package/dist/daemon/sandbox-api.js +74 -0
- package/dist/daemon/sandbox-api.js.map +1 -0
- package/dist/daemon/server.d.ts +65 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +351 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/shared-kv.d.ts +81 -0
- package/dist/daemon/shared-kv.d.ts.map +1 -0
- package/dist/daemon/shared-kv.js +215 -0
- package/dist/daemon/shared-kv.js.map +1 -0
- package/dist/daemon/shared-lock.d.ts +71 -0
- package/dist/daemon/shared-lock.d.ts.map +1 -0
- package/dist/daemon/shared-lock.js +119 -0
- package/dist/daemon/shared-lock.js.map +1 -0
- package/dist/hub/mcp-hub.d.ts +23 -0
- package/dist/hub/mcp-hub.d.ts.map +1 -1
- package/dist/hub/mcp-hub.js +34 -1
- package/dist/hub/mcp-hub.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/observability/anomaly.d.ts +67 -0
- package/dist/observability/anomaly.d.ts.map +1 -0
- package/dist/observability/anomaly.js +141 -0
- package/dist/observability/anomaly.js.map +1 -0
- package/dist/observability/cost-predictor.d.ts +49 -0
- package/dist/observability/cost-predictor.d.ts.map +1 -0
- package/dist/observability/cost-predictor.js +145 -0
- package/dist/observability/cost-predictor.js.map +1 -0
- package/dist/observability/hot-path.d.ts +49 -0
- package/dist/observability/hot-path.d.ts.map +1 -0
- package/dist/observability/hot-path.js +125 -0
- package/dist/observability/hot-path.js.map +1 -0
- package/dist/observability/index.d.ts +10 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/replay.d.ts +104 -0
- package/dist/observability/replay.d.ts.map +1 -0
- package/dist/observability/replay.js +239 -0
- package/dist/observability/replay.js.map +1 -0
- package/dist/registry/built-in-recommendations.d.ts +54 -0
- package/dist/registry/built-in-recommendations.d.ts.map +1 -0
- package/dist/registry/built-in-recommendations.js +65 -0
- package/dist/registry/built-in-recommendations.js.map +1 -0
- package/dist/registry/events.d.ts +26 -0
- package/dist/registry/events.d.ts.map +1 -0
- package/dist/registry/events.js +22 -0
- package/dist/registry/events.js.map +1 -0
- package/dist/registry/index.d.ts +159 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +87 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +294 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/snapshot.d.ts +42 -0
- package/dist/registry/snapshot.d.ts.map +1 -0
- package/dist/registry/snapshot.js +71 -0
- package/dist/registry/snapshot.js.map +1 -0
- package/dist/registry/typegen.d.ts +48 -0
- package/dist/registry/typegen.d.ts.map +1 -0
- package/dist/registry/typegen.js +200 -0
- package/dist/registry/typegen.js.map +1 -0
- package/dist/registry/validator.d.ts +23 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +50 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/reliability/breaker.d.ts +57 -0
- package/dist/reliability/breaker.d.ts.map +1 -0
- package/dist/reliability/breaker.js +130 -0
- package/dist/reliability/breaker.js.map +1 -0
- package/dist/reliability/errors.d.ts +78 -0
- package/dist/reliability/errors.d.ts.map +1 -0
- package/dist/reliability/errors.js +160 -0
- package/dist/reliability/errors.js.map +1 -0
- package/dist/reliability/gateway.d.ts +88 -0
- package/dist/reliability/gateway.d.ts.map +1 -0
- package/dist/reliability/gateway.js +180 -0
- package/dist/reliability/gateway.js.map +1 -0
- package/dist/reliability/index.d.ts +20 -0
- package/dist/reliability/index.d.ts.map +1 -0
- package/dist/reliability/index.js +16 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/profile.d.ts +49 -0
- package/dist/reliability/profile.d.ts.map +1 -0
- package/dist/reliability/profile.js +58 -0
- package/dist/reliability/profile.js.map +1 -0
- package/dist/reliability/retry.d.ts +39 -0
- package/dist/reliability/retry.d.ts.map +1 -0
- package/dist/reliability/retry.js +51 -0
- package/dist/reliability/retry.js.map +1 -0
- package/dist/reliability/timeout.d.ts +34 -0
- package/dist/reliability/timeout.d.ts.map +1 -0
- package/dist/reliability/timeout.js +53 -0
- package/dist/reliability/timeout.js.map +1 -0
- package/dist/runtime/executor.d.ts +12 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +148 -16
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/findtool/embed.d.ts +28 -0
- package/dist/runtime/findtool/embed.d.ts.map +1 -0
- package/dist/runtime/findtool/embed.js +85 -0
- package/dist/runtime/findtool/embed.js.map +1 -0
- package/dist/runtime/findtool/index.d.ts +52 -0
- package/dist/runtime/findtool/index.d.ts.map +1 -0
- package/dist/runtime/findtool/index.js +78 -0
- package/dist/runtime/findtool/index.js.map +1 -0
- package/dist/runtime/findtool/vector-index.d.ts +53 -0
- package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
- package/dist/runtime/findtool/vector-index.js +71 -0
- package/dist/runtime/findtool/vector-index.js.map +1 -0
- package/dist/runtime/helpers/budget.d.ts +27 -0
- package/dist/runtime/helpers/budget.d.ts.map +1 -0
- package/dist/runtime/helpers/budget.js +103 -0
- package/dist/runtime/helpers/budget.js.map +1 -0
- package/dist/runtime/helpers/compact.d.ts +32 -0
- package/dist/runtime/helpers/compact.d.ts.map +1 -0
- package/dist/runtime/helpers/compact.js +93 -0
- package/dist/runtime/helpers/compact.js.map +1 -0
- package/dist/runtime/helpers/delta.d.ts +45 -0
- package/dist/runtime/helpers/delta.d.ts.map +1 -0
- package/dist/runtime/helpers/delta.js +116 -0
- package/dist/runtime/helpers/delta.js.map +1 -0
- package/dist/runtime/helpers/index.d.ts +16 -0
- package/dist/runtime/helpers/index.d.ts.map +1 -0
- package/dist/runtime/helpers/index.js +13 -0
- package/dist/runtime/helpers/index.js.map +1 -0
- package/dist/runtime/helpers/summarize.d.ts +24 -0
- package/dist/runtime/helpers/summarize.d.ts.map +1 -0
- package/dist/runtime/helpers/summarize.js +124 -0
- package/dist/runtime/helpers/summarize.js.map +1 -0
- package/dist/runtime/helpers/worker-preload.d.ts +25 -0
- package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
- package/dist/runtime/helpers/worker-preload.js +223 -0
- package/dist/runtime/helpers/worker-preload.js.map +1 -0
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/pool/index.d.ts +11 -0
- package/dist/runtime/pool/index.d.ts.map +1 -0
- package/dist/runtime/pool/index.js +8 -0
- package/dist/runtime/pool/index.js.map +1 -0
- package/dist/runtime/pool/recycle.d.ts +44 -0
- package/dist/runtime/pool/recycle.d.ts.map +1 -0
- package/dist/runtime/pool/recycle.js +50 -0
- package/dist/runtime/pool/recycle.js.map +1 -0
- package/dist/runtime/pool/worker-pool.d.ts +77 -0
- package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
- package/dist/runtime/pool/worker-pool.js +216 -0
- package/dist/runtime/pool/worker-pool.js.map +1 -0
- package/dist/runtime/pool/worker.d.ts +80 -0
- package/dist/runtime/pool/worker.d.ts.map +1 -0
- package/dist/runtime/pool/worker.js +324 -0
- package/dist/runtime/pool/worker.js.map +1 -0
- package/dist/server/mcp-server.d.ts +6 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +610 -45
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/passthrough-registrar.d.ts +73 -0
- package/dist/server/passthrough-registrar.d.ts.map +1 -0
- package/dist/server/passthrough-registrar.js +110 -0
- package/dist/server/passthrough-registrar.js.map +1 -0
- package/dist/skills/skills-engine.d.ts +9 -1
- package/dist/skills/skills-engine.d.ts.map +1 -1
- package/dist/skills/skills-engine.js +20 -3
- package/dist/skills/skills-engine.js.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -1
- 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/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/utils/tokenize.d.ts +55 -0
- package/dist/utils/tokenize.d.ts.map +1 -0
- package/dist/utils/tokenize.js +205 -0
- package/dist/utils/tokenize.js.map +1 -0
- package/dist/version.d.ts +3 -3
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker preload — inline sandbox helper source
|
|
3
|
+
*
|
|
4
|
+
* Generates the JavaScript source string that is written to a temp file
|
|
5
|
+
* and passed via WorkerOptions.preloadHelpers[] so the Deno worker evaluates
|
|
6
|
+
* it before any user code runs. Injects compact/summarize/delta/budget/findTool
|
|
7
|
+
* onto the mcp global.
|
|
8
|
+
*
|
|
9
|
+
* @module runtime/helpers/worker-preload
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Build a self-contained JS source string for the Deno worker preload.
|
|
13
|
+
* The string is plain JavaScript — no TypeScript-only syntax — because
|
|
14
|
+
* it runs inside the Deno subprocess at runtime.
|
|
15
|
+
*/
|
|
16
|
+
export function buildHelperPreloadSource(options = {}) {
|
|
17
|
+
const toolsJson = JSON.stringify(options.tools ?? []);
|
|
18
|
+
const compactSrc = `
|
|
19
|
+
(function injectCompact() {
|
|
20
|
+
function buildSelectorTree(fields) {
|
|
21
|
+
var tree = {};
|
|
22
|
+
for (var i = 0; i < fields.length; i++) {
|
|
23
|
+
var parts = fields[i].split('.');
|
|
24
|
+
var node = tree;
|
|
25
|
+
for (var j = 0; j < parts.length; j++) {
|
|
26
|
+
if (j === parts.length - 1) { node[parts[j]] = true; }
|
|
27
|
+
else { if (typeof node[parts[j]] !== 'object') node[parts[j]] = {}; node = node[parts[j]]; }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return tree;
|
|
31
|
+
}
|
|
32
|
+
function trimValue(value, selector, opts, depth) {
|
|
33
|
+
var maxDepth = opts.maxDepth !== undefined ? opts.maxDepth : Infinity;
|
|
34
|
+
if (depth > maxDepth) return (typeof value === 'object' && value !== null) ? '[truncated]' : value;
|
|
35
|
+
if (typeof value === 'string') {
|
|
36
|
+
var max = opts.maxStringLength;
|
|
37
|
+
return (max !== undefined && value.length > max) ? value.slice(0, max) + '…' : value;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
var arr = opts.maxItems !== undefined ? value.slice(0, opts.maxItems) : value;
|
|
41
|
+
return arr.map(function(item) { return trimValue(item, selector, opts, depth + 1); });
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === 'object' && value !== null) {
|
|
44
|
+
var result = {};
|
|
45
|
+
if (selector && Object.keys(selector).length > 0) {
|
|
46
|
+
var keys = Object.keys(selector);
|
|
47
|
+
for (var k = 0; k < keys.length; k++) {
|
|
48
|
+
var key = keys[k];
|
|
49
|
+
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
50
|
+
var cs = selector[key];
|
|
51
|
+
result[key] = trimValue(value[key], cs === true ? null : cs, opts, depth + 1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
var objKeys = Object.keys(value);
|
|
56
|
+
for (var ok = 0; ok < objKeys.length; ok++) result[objKeys[ok]] = trimValue(value[objKeys[ok]], null, opts, depth + 1);
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
globalThis.__mcp_compact = function compact(data, options) {
|
|
63
|
+
options = options || {};
|
|
64
|
+
var selector = (options.fields && options.fields.length > 0) ? buildSelectorTree(options.fields) : null;
|
|
65
|
+
return trimValue(data, selector, options, 0);
|
|
66
|
+
};
|
|
67
|
+
})();
|
|
68
|
+
`;
|
|
69
|
+
const summarizeSrc = `
|
|
70
|
+
(function injectSummarize() {
|
|
71
|
+
var CPT = 4;
|
|
72
|
+
function clip(text, max) { return text.length <= max ? text : text.slice(0, Math.max(0, max - 1)) + '…'; }
|
|
73
|
+
globalThis.__mcp_summarize = function summarize(data, options) {
|
|
74
|
+
var maxChars = options.maxTokens * CPT;
|
|
75
|
+
var style = options.style || 'list';
|
|
76
|
+
if (style === 'json') { try { return clip(JSON.stringify(data, null, 2), maxChars); } catch(e) { return clip(String(data), maxChars); } }
|
|
77
|
+
if (style === 'paragraph') {
|
|
78
|
+
var text;
|
|
79
|
+
if (typeof data === 'string') { text = data; }
|
|
80
|
+
else if (Array.isArray(data)) {
|
|
81
|
+
var prev = data.slice(0,3).map(function(x){return typeof x==='object'?JSON.stringify(x).slice(0,60):String(x).slice(0,60);}).join(', ');
|
|
82
|
+
text = data.length + ' item' + (data.length!==1?'s':'') + ': ' + prev + (data.length>3?'...':'');
|
|
83
|
+
} else if (typeof data === 'object' && data !== null) {
|
|
84
|
+
var kk = Object.keys(data);
|
|
85
|
+
text = 'Object with ' + kk.length + ' field' + (kk.length!==1?'s':'') + ': ' + kk.slice(0,5).map(function(k){return k+': '+JSON.stringify(data[k]).slice(0,30);}).join('; ');
|
|
86
|
+
} else { text = String(data); }
|
|
87
|
+
return clip(text, maxChars);
|
|
88
|
+
}
|
|
89
|
+
var lines = [];
|
|
90
|
+
if (Array.isArray(data)) {
|
|
91
|
+
for (var i = 0; i < data.length; i++) {
|
|
92
|
+
var item = data[i];
|
|
93
|
+
if (typeof item === 'object' && item !== null) {
|
|
94
|
+
lines.push('• ' + Object.entries(item).slice(0,4).map(function(e){return e[0]+'='+JSON.stringify(e[1]);}).join(', '));
|
|
95
|
+
} else { lines.push('• ' + String(item)); }
|
|
96
|
+
}
|
|
97
|
+
} else if (typeof data === 'object' && data !== null) {
|
|
98
|
+
Object.entries(data).forEach(function(e){lines.push(e[0]+': '+(typeof e[1]==='object'?JSON.stringify(e[1]):String(e[1])));});
|
|
99
|
+
} else { lines.push(String(data)); }
|
|
100
|
+
var result = '';
|
|
101
|
+
for (var li = 0; li < lines.length; li++) {
|
|
102
|
+
var candidate = result ? result + '\n' + lines[li] : lines[li];
|
|
103
|
+
if (candidate.length > maxChars) { var rem = maxChars - result.length - 1; if (rem > 4) result += (result?'\n':'')+clip(lines[li],rem); break; }
|
|
104
|
+
result = candidate;
|
|
105
|
+
}
|
|
106
|
+
return result || clip(String(data), maxChars);
|
|
107
|
+
};
|
|
108
|
+
})();
|
|
109
|
+
`;
|
|
110
|
+
const deltaSrc = `
|
|
111
|
+
(function injectDelta() {
|
|
112
|
+
var __snapshots = new Map();
|
|
113
|
+
globalThis.__mcp_delta = async function delta(server, tool, args, current) {
|
|
114
|
+
var key = server + '::' + tool + '::' + JSON.stringify(args);
|
|
115
|
+
var previous = __snapshots.get(key);
|
|
116
|
+
__snapshots.set(key, current);
|
|
117
|
+
if (previous === undefined) return { changed: true, delta: current };
|
|
118
|
+
if (Array.isArray(current) && Array.isArray(previous)) {
|
|
119
|
+
var changed = JSON.stringify(previous) !== JSON.stringify(current);
|
|
120
|
+
return { changed: changed, delta: changed ? current : [], added: Math.max(0,current.length-previous.length), removed: Math.max(0,previous.length-current.length) };
|
|
121
|
+
}
|
|
122
|
+
if (typeof current === 'object' && current !== null && !Array.isArray(current)) {
|
|
123
|
+
var d = {}; var ck = [];
|
|
124
|
+
var allKeys = new Set(Object.keys(previous||{}).concat(Object.keys(current)));
|
|
125
|
+
allKeys.forEach(function(k){ if(JSON.stringify((previous||{})[k])!==JSON.stringify(current[k])){ d[k]=current[k]; ck.push(k); } });
|
|
126
|
+
return { changed: ck.length > 0, delta: ck.length > 0 ? d : {}, changedKeys: ck };
|
|
127
|
+
}
|
|
128
|
+
var prim_changed = JSON.stringify(previous) !== JSON.stringify(current);
|
|
129
|
+
return { changed: prim_changed, delta: prim_changed ? current : undefined };
|
|
130
|
+
};
|
|
131
|
+
})();
|
|
132
|
+
`;
|
|
133
|
+
const budgetSrc = `
|
|
134
|
+
(function injectBudget() {
|
|
135
|
+
var CPT = 4;
|
|
136
|
+
function est(data) { try { return Math.ceil((JSON.stringify(data)||String(data)).length/CPT); } catch(e) { return Math.ceil(String(data).length/CPT); } }
|
|
137
|
+
function BudgetExceededError(estimated, max) {
|
|
138
|
+
this.name = 'BudgetExceededError';
|
|
139
|
+
this.message = 'Result exceeds token budget: '+estimated+' > '+max;
|
|
140
|
+
this.estimatedTokens = estimated;
|
|
141
|
+
this.maxTokens = max;
|
|
142
|
+
}
|
|
143
|
+
BudgetExceededError.prototype = Object.create(Error.prototype);
|
|
144
|
+
function tryTrim(data, maxTokens) {
|
|
145
|
+
if (Array.isArray(data)) {
|
|
146
|
+
var mxList = [100, 50, 20, 10, 5, 1];
|
|
147
|
+
for (var mi = 0; mi < mxList.length; mi++) {
|
|
148
|
+
var t = globalThis.__mcp_compact(data, {maxItems: mxList[mi], maxStringLength: 200});
|
|
149
|
+
if (est(t) <= maxTokens) return t;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (typeof data === 'object' && data !== null) {
|
|
153
|
+
var mdList = [5, 3, 2, 1];
|
|
154
|
+
for (var md = 0; md < mdList.length; md++) {
|
|
155
|
+
var td = globalThis.__mcp_compact(data, {maxDepth: mdList[md], maxItems: 20, maxStringLength: 200});
|
|
156
|
+
if (est(td) <= maxTokens) return td;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
var ls = globalThis.__mcp_summarize(data, {maxTokens: maxTokens, style: 'list'});
|
|
160
|
+
if (est(ls) <= maxTokens) return ls;
|
|
161
|
+
var ps = globalThis.__mcp_summarize(data, {maxTokens: maxTokens, style: 'paragraph'});
|
|
162
|
+
if (est(ps) <= maxTokens) return ps;
|
|
163
|
+
var raw = typeof data === 'string' ? data : JSON.stringify(data) || String(data);
|
|
164
|
+
var cl = raw.slice(0, maxTokens * CPT - 1) + '…';
|
|
165
|
+
if (est(cl) <= maxTokens) return cl;
|
|
166
|
+
throw new BudgetExceededError(est(data), maxTokens);
|
|
167
|
+
}
|
|
168
|
+
globalThis.__mcp_budget = async function budget(maxTokens, fn) {
|
|
169
|
+
var result = await fn();
|
|
170
|
+
return est(result) <= maxTokens ? result : tryTrim(result, maxTokens);
|
|
171
|
+
};
|
|
172
|
+
globalThis.BudgetExceededError = BudgetExceededError;
|
|
173
|
+
})();
|
|
174
|
+
`;
|
|
175
|
+
const findToolSrc = `
|
|
176
|
+
(function injectFindTool() {
|
|
177
|
+
var EMBED_DIM = 256;
|
|
178
|
+
function tokenise(text) { return text.toLowerCase().replace(/[^a-z0-9_.-]/g,' ').split(/\\s+/).filter(Boolean); }
|
|
179
|
+
function hashBucket(s) { var h=5381; for(var i=0;i<s.length;i++){h=((h<<5)+h)^s.charCodeAt(i);h=h>>>0;} return h%EMBED_DIM; }
|
|
180
|
+
function embed(text) {
|
|
181
|
+
var vec = new Float32Array(EMBED_DIM);
|
|
182
|
+
var tokens = tokenise(text);
|
|
183
|
+
if (!tokens.length) return vec;
|
|
184
|
+
for (var i=0;i<tokens.length;i++) vec[hashBucket(tokens[i])]+=1;
|
|
185
|
+
for (var j=0;j<tokens.length-1;j++) vec[hashBucket(tokens[j]+'_'+tokens[j+1])]+=0.5;
|
|
186
|
+
var norm=0; for(var k=0;k<EMBED_DIM;k++) norm+=vec[k]*vec[k]; norm=Math.sqrt(norm);
|
|
187
|
+
if(norm>0) for(var n=0;n<EMBED_DIM;n++) vec[n]/=norm;
|
|
188
|
+
return vec;
|
|
189
|
+
}
|
|
190
|
+
function cosine(a,b) { var d=0; for(var i=0;i<a.length;i++) d+=a[i]*b[i]; return d; }
|
|
191
|
+
var __toolEntries = ${toolsJson}.map(function(e){return{server:e.server,tool:e.tool,description:e.description,vector:embed(e.tool+'\\n'+e.description)};});
|
|
192
|
+
globalThis.__mcp_findTool = async function findTool(query, options) {
|
|
193
|
+
options = options || {};
|
|
194
|
+
var qv = embed(query);
|
|
195
|
+
var topK = options.topK || 5;
|
|
196
|
+
var filter = options.serverFilter;
|
|
197
|
+
var candidates = filter ? __toolEntries.filter(function(e){return filter.includes(e.server);}) : __toolEntries;
|
|
198
|
+
var scored = candidates.map(function(e){return{server:e.server,tool:e.tool,description:e.description,score:cosine(qv,e.vector)};});
|
|
199
|
+
scored.sort(function(a,b){return b.score-a.score;});
|
|
200
|
+
return scored.slice(0,topK);
|
|
201
|
+
};
|
|
202
|
+
})();
|
|
203
|
+
`;
|
|
204
|
+
const extendMcpSrc = `
|
|
205
|
+
if (typeof mcp !== 'undefined') {
|
|
206
|
+
Object.defineProperty(mcp, 'compact', { value: globalThis.__mcp_compact, writable: false, configurable: true });
|
|
207
|
+
Object.defineProperty(mcp, 'summarize', { value: globalThis.__mcp_summarize, writable: false, configurable: true });
|
|
208
|
+
Object.defineProperty(mcp, 'delta', { value: globalThis.__mcp_delta, writable: false, configurable: true });
|
|
209
|
+
Object.defineProperty(mcp, 'budget', { value: globalThis.__mcp_budget, writable: false, configurable: true });
|
|
210
|
+
Object.defineProperty(mcp, 'findTool', { value: globalThis.__mcp_findTool, writable: false, configurable: true });
|
|
211
|
+
}
|
|
212
|
+
`;
|
|
213
|
+
return [
|
|
214
|
+
'// Phase 5 Sandbox Helpers — auto-injected into Deno worker via preloadHelpers[]',
|
|
215
|
+
compactSrc,
|
|
216
|
+
summarizeSrc,
|
|
217
|
+
deltaSrc,
|
|
218
|
+
budgetSrc,
|
|
219
|
+
findToolSrc,
|
|
220
|
+
extendMcpSrc,
|
|
221
|
+
].join('\n');
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=worker-preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-preload.js","sourceRoot":"","sources":["../../../src/runtime/helpers/worker-preload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAA0B,EAAE;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDpB,CAAC;IAEA,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCtB,CAAC;IAEA,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBlB,CAAC;IAEA,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCnB,CAAC;IAEA,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;wBAgBE,SAAS;;;;;;;;;;;;CAYhC,CAAC;IAEA,MAAM,YAAY,GAAG;;;;;;;;CAQtB,CAAC;IAEA,OAAO;QACL,kFAAkF;QAClF,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,WAAW;QACX,YAAY;KACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime pool — warm Deno worker pool for low-latency code execution.
|
|
3
|
+
* @module runtime/pool
|
|
4
|
+
*/
|
|
5
|
+
export { WorkerPool } from './worker-pool.js';
|
|
6
|
+
export type { WorkerPoolOptions, PoolExecuteOptions } from './worker-pool.js';
|
|
7
|
+
export { PooledWorker } from './worker.js';
|
|
8
|
+
export type { WorkerOptions, WorkerJob, WorkerResult, WorkerState } from './worker.js';
|
|
9
|
+
export { evaluateRecycle, isEligible } from './recycle.js';
|
|
10
|
+
export type { RecycleCandidate, RecycleDecision } from './recycle.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime pool — warm Deno worker pool for low-latency code execution.
|
|
3
|
+
* @module runtime/pool
|
|
4
|
+
*/
|
|
5
|
+
export { WorkerPool } from './worker-pool.js';
|
|
6
|
+
export { PooledWorker } from './worker.js';
|
|
7
|
+
export { evaluateRecycle, isEligible } from './recycle.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/pool/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Recycle Policy
|
|
3
|
+
*
|
|
4
|
+
* Determines when a warm Deno worker should be replaced. Three eviction
|
|
5
|
+
* triggers are evaluated in order:
|
|
6
|
+
* 1. Error state — worker crashed or entered an unrecoverable error
|
|
7
|
+
* 2. Age — worker has been alive longer than `maxAgeMs`
|
|
8
|
+
* 3. Job count — worker has processed more than `maxJobsPerWorker` jobs
|
|
9
|
+
*
|
|
10
|
+
* Recycle is designed to be async-safe: the pool spawns a replacement
|
|
11
|
+
* *before* terminating the old worker, ensuring capacity is never reduced
|
|
12
|
+
* during normal operation.
|
|
13
|
+
*
|
|
14
|
+
* @module runtime/pool/recycle
|
|
15
|
+
*/
|
|
16
|
+
import type { WorkerPoolOptions } from './worker-pool.js';
|
|
17
|
+
export interface RecycleCandidate {
|
|
18
|
+
/** Worker unique identifier */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Current state of the worker */
|
|
21
|
+
state: 'idle' | 'busy' | 'recycling' | 'dead';
|
|
22
|
+
/** Epoch ms when the worker was created */
|
|
23
|
+
createdAt: number;
|
|
24
|
+
/** Total jobs run since creation */
|
|
25
|
+
jobsRun: number;
|
|
26
|
+
}
|
|
27
|
+
export interface RecycleDecision {
|
|
28
|
+
shouldRecycle: boolean;
|
|
29
|
+
reason?: 'error' | 'age' | 'job-count';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Evaluate whether a worker should be recycled based on the pool policy.
|
|
33
|
+
*
|
|
34
|
+
* Called by the pool after every job completion and after any error event.
|
|
35
|
+
* When `shouldRecycle` is true, the pool spawns a replacement then calls
|
|
36
|
+
* `worker.shutdown(drainFirst=false)` on the old worker.
|
|
37
|
+
*/
|
|
38
|
+
export declare function evaluateRecycle(candidate: RecycleCandidate, opts: Pick<WorkerPoolOptions, 'maxJobsPerWorker' | 'maxAgeMs'>): RecycleDecision;
|
|
39
|
+
/**
|
|
40
|
+
* Return true if a worker is eligible to receive new jobs
|
|
41
|
+
* (idle and not scheduled for recycle).
|
|
42
|
+
*/
|
|
43
|
+
export declare function isEligible(candidate: RecycleCandidate, opts: Pick<WorkerPoolOptions, 'maxJobsPerWorker' | 'maxAgeMs'>): boolean;
|
|
44
|
+
//# sourceMappingURL=recycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recycle.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/recycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC9C,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,WAAW,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,UAAU,CAAC,GAC7D,eAAe,CAoBjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,UAAU,CAAC,GAC7D,OAAO,CAIT"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Recycle Policy
|
|
3
|
+
*
|
|
4
|
+
* Determines when a warm Deno worker should be replaced. Three eviction
|
|
5
|
+
* triggers are evaluated in order:
|
|
6
|
+
* 1. Error state — worker crashed or entered an unrecoverable error
|
|
7
|
+
* 2. Age — worker has been alive longer than `maxAgeMs`
|
|
8
|
+
* 3. Job count — worker has processed more than `maxJobsPerWorker` jobs
|
|
9
|
+
*
|
|
10
|
+
* Recycle is designed to be async-safe: the pool spawns a replacement
|
|
11
|
+
* *before* terminating the old worker, ensuring capacity is never reduced
|
|
12
|
+
* during normal operation.
|
|
13
|
+
*
|
|
14
|
+
* @module runtime/pool/recycle
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Evaluate whether a worker should be recycled based on the pool policy.
|
|
18
|
+
*
|
|
19
|
+
* Called by the pool after every job completion and after any error event.
|
|
20
|
+
* When `shouldRecycle` is true, the pool spawns a replacement then calls
|
|
21
|
+
* `worker.shutdown(drainFirst=false)` on the old worker.
|
|
22
|
+
*/
|
|
23
|
+
export function evaluateRecycle(candidate, opts) {
|
|
24
|
+
// Error state always recycles
|
|
25
|
+
if (candidate.state === 'dead' || candidate.state === 'recycling') {
|
|
26
|
+
return { shouldRecycle: true, reason: 'error' };
|
|
27
|
+
}
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const ageMs = now - candidate.createdAt;
|
|
30
|
+
const maxAge = opts.maxAgeMs ?? 600_000;
|
|
31
|
+
const maxJobs = opts.maxJobsPerWorker ?? 100;
|
|
32
|
+
if (ageMs >= maxAge) {
|
|
33
|
+
return { shouldRecycle: true, reason: 'age' };
|
|
34
|
+
}
|
|
35
|
+
if (candidate.jobsRun >= maxJobs) {
|
|
36
|
+
return { shouldRecycle: true, reason: 'job-count' };
|
|
37
|
+
}
|
|
38
|
+
return { shouldRecycle: false };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Return true if a worker is eligible to receive new jobs
|
|
42
|
+
* (idle and not scheduled for recycle).
|
|
43
|
+
*/
|
|
44
|
+
export function isEligible(candidate, opts) {
|
|
45
|
+
if (candidate.state !== 'idle')
|
|
46
|
+
return false;
|
|
47
|
+
const { shouldRecycle } = evaluateRecycle(candidate, opts);
|
|
48
|
+
return !shouldRecycle;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=recycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recycle.js","sourceRoot":"","sources":["../../../src/runtime/pool/recycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA2B,EAC3B,IAA8D;IAE9D,8BAA8B;IAC9B,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAClE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC;IAE7C,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,SAAS,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QACjC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,SAA2B,EAC3B,IAA8D;IAE9D,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,aAAa,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warm Deno Worker Pool
|
|
3
|
+
*
|
|
4
|
+
* Maintains a fixed pool of pre-warmed Deno workers so that the first
|
|
5
|
+
* execute_code call after startup hits an already-running sandbox.
|
|
6
|
+
*
|
|
7
|
+
* Lifecycle:
|
|
8
|
+
* 1. `new WorkerPool(opts)` — configure
|
|
9
|
+
* 2. `await pool.warmUp()` — spawn `size` workers concurrently
|
|
10
|
+
* 3. `await pool.execute(job)` — pick idle worker, run, release
|
|
11
|
+
* 4. `await pool.shutdown()` — drain in-flight jobs, terminate all workers
|
|
12
|
+
*
|
|
13
|
+
* Recycle policy (see recycle.ts):
|
|
14
|
+
* - After `maxJobsPerWorker` jobs the worker is replaced before termination
|
|
15
|
+
* - After `maxAgeMs` age the worker is replaced after its current job finishes
|
|
16
|
+
* - After any uncaught error the worker is replaced immediately
|
|
17
|
+
*
|
|
18
|
+
* Phase 5 plug-in: pass `preloadHelpers` to `WorkerPoolOptions` and the
|
|
19
|
+
* bootstrap script inside `worker.ts` will `await import()` each path before
|
|
20
|
+
* entering the job loop.
|
|
21
|
+
*
|
|
22
|
+
* @module runtime/pool/worker-pool
|
|
23
|
+
*/
|
|
24
|
+
import type { WorkerJob } from './worker.js';
|
|
25
|
+
export interface WorkerPoolOptions {
|
|
26
|
+
/** Number of warm workers to maintain (default: 4) */
|
|
27
|
+
size?: number;
|
|
28
|
+
/** Recycle a worker after this many jobs (default: 100) */
|
|
29
|
+
maxJobsPerWorker?: number;
|
|
30
|
+
/** Recycle a worker after this age in ms (default: 600000 = 10 min) */
|
|
31
|
+
maxAgeMs?: number;
|
|
32
|
+
/** Directory of generated .d.ts files from the registry (Agent A output) */
|
|
33
|
+
preloadTypesDir: string;
|
|
34
|
+
/**
|
|
35
|
+
* Additional helper scripts to preload in each worker.
|
|
36
|
+
* Phase 5 (Agent E) passes compact/summarize/delta helpers here.
|
|
37
|
+
* Default: [] (no additional preloads).
|
|
38
|
+
*/
|
|
39
|
+
preloadHelpers?: string[];
|
|
40
|
+
/** Max Deno memory per worker in MB (default: 128) */
|
|
41
|
+
maxMemoryMb?: number;
|
|
42
|
+
/** Bridge URL injected into the sandbox (default: http://127.0.0.1:9847) */
|
|
43
|
+
bridgeUrl?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface PoolExecuteOptions {
|
|
46
|
+
signal?: AbortSignal;
|
|
47
|
+
/** Timeout in ms for waiting to acquire an idle worker (default: 5000) */
|
|
48
|
+
acquireTimeoutMs?: number;
|
|
49
|
+
}
|
|
50
|
+
export declare class WorkerPool {
|
|
51
|
+
private readonly opts;
|
|
52
|
+
private workers;
|
|
53
|
+
private queue;
|
|
54
|
+
private isShuttingDown;
|
|
55
|
+
private isWarmedUp;
|
|
56
|
+
constructor(options: WorkerPoolOptions);
|
|
57
|
+
/** Pre-spawn all workers. Must be called before `execute()`. */
|
|
58
|
+
warmUp(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Execute a job on an idle worker.
|
|
61
|
+
*
|
|
62
|
+
* If no idle worker is available, the job is queued until one becomes
|
|
63
|
+
* free or the acquire timeout elapses.
|
|
64
|
+
*/
|
|
65
|
+
execute<T = unknown>(job: Omit<WorkerJob, 'signal'>, execOpts?: PoolExecuteOptions): Promise<T>;
|
|
66
|
+
size(): number;
|
|
67
|
+
busyCount(): number;
|
|
68
|
+
idleCount(): number;
|
|
69
|
+
/** Gracefully drain all in-flight jobs then terminate all workers. */
|
|
70
|
+
shutdown(): Promise<void>;
|
|
71
|
+
private _findIdle;
|
|
72
|
+
private _runOnWorker;
|
|
73
|
+
private _maybeRecycle;
|
|
74
|
+
private _removeWorker;
|
|
75
|
+
private _drainQueue;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=worker-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/worker-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,SAAS,EAA+B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAkBD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,iBAAiB;IAYtC,gEAAgE;IAC1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B;;;;;OAKG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC9B,QAAQ,GAAE,kBAAuB,GAChC,OAAO,CAAC,CAAC,CAAC;IAkCb,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAInB,sEAAsE;IAChE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB/B,OAAO,CAAC,SAAS;YAIH,YAAY;YAuBZ,aAAa;IAkD3B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;CAapB"}
|