@darkiceinteractive/mcp-conductor 2.0.0-alpha.1 → 3.0.0-beta.2
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 +35 -0
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +51 -2
- 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/cache/cache.d.ts +64 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +209 -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.map +1 -1
- package/dist/config/defaults.js +4 -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 +99 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +292 -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 +373 -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 +7 -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.map +1 -1
- package/dist/runtime/executor.js +122 -14
- 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 +3 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +457 -3
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/passthrough-registrar.d.ts +123 -0
- package/dist/server/passthrough-registrar.d.ts.map +1 -0
- package/dist/server/passthrough-registrar.js +199 -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 +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- 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,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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
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 { logger } from '../../utils/index.js';
|
|
25
|
+
import { PooledWorker } from './worker.js';
|
|
26
|
+
import { evaluateRecycle } from './recycle.js';
|
|
27
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
28
|
+
// WorkerPool
|
|
29
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
30
|
+
const DEFAULT_SIZE = 4;
|
|
31
|
+
const DEFAULT_MAX_JOBS = 100;
|
|
32
|
+
const DEFAULT_MAX_AGE_MS = 600_000;
|
|
33
|
+
const DEFAULT_ACQUIRE_TIMEOUT_MS = 5_000;
|
|
34
|
+
export class WorkerPool {
|
|
35
|
+
opts;
|
|
36
|
+
workers = [];
|
|
37
|
+
queue = [];
|
|
38
|
+
isShuttingDown = false;
|
|
39
|
+
isWarmedUp = false;
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.opts = {
|
|
42
|
+
size: options.size ?? DEFAULT_SIZE,
|
|
43
|
+
maxJobsPerWorker: options.maxJobsPerWorker ?? DEFAULT_MAX_JOBS,
|
|
44
|
+
maxAgeMs: options.maxAgeMs ?? DEFAULT_MAX_AGE_MS,
|
|
45
|
+
preloadTypesDir: options.preloadTypesDir,
|
|
46
|
+
preloadHelpers: options.preloadHelpers ?? [],
|
|
47
|
+
maxMemoryMb: options.maxMemoryMb ?? 128,
|
|
48
|
+
bridgeUrl: options.bridgeUrl ?? 'http://127.0.0.1:9847',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Pre-spawn all workers. Must be called before `execute()`. */
|
|
52
|
+
async warmUp() {
|
|
53
|
+
if (this.isWarmedUp)
|
|
54
|
+
return;
|
|
55
|
+
const workerOpts = {
|
|
56
|
+
preloadTypesDir: this.opts.preloadTypesDir,
|
|
57
|
+
preloadHelpers: this.opts.preloadHelpers,
|
|
58
|
+
maxMemoryMb: this.opts.maxMemoryMb,
|
|
59
|
+
bridgeUrl: this.opts.bridgeUrl,
|
|
60
|
+
};
|
|
61
|
+
const spawns = Array.from({ length: this.opts.size }, async () => {
|
|
62
|
+
const w = new PooledWorker(workerOpts);
|
|
63
|
+
await w.start();
|
|
64
|
+
this.workers.push(w);
|
|
65
|
+
});
|
|
66
|
+
await Promise.allSettled(spawns);
|
|
67
|
+
const alive = this.workers.filter((w) => w.currentState !== 'dead').length;
|
|
68
|
+
logger.info('WorkerPool warmed up', { requested: this.opts.size, alive });
|
|
69
|
+
this.isWarmedUp = true;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Execute a job on an idle worker.
|
|
73
|
+
*
|
|
74
|
+
* If no idle worker is available, the job is queued until one becomes
|
|
75
|
+
* free or the acquire timeout elapses.
|
|
76
|
+
*/
|
|
77
|
+
async execute(job, execOpts = {}) {
|
|
78
|
+
if (this.isShuttingDown) {
|
|
79
|
+
throw new Error('WorkerPool is shutting down');
|
|
80
|
+
}
|
|
81
|
+
const fullJob = {
|
|
82
|
+
...job,
|
|
83
|
+
signal: execOpts.signal,
|
|
84
|
+
};
|
|
85
|
+
const worker = this._findIdle();
|
|
86
|
+
if (worker) {
|
|
87
|
+
return this._runOnWorker(worker, fullJob);
|
|
88
|
+
}
|
|
89
|
+
// Queue the job
|
|
90
|
+
const acquireTimeoutMs = execOpts.acquireTimeoutMs ?? DEFAULT_ACQUIRE_TIMEOUT_MS;
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const timeoutTimer = setTimeout(() => {
|
|
93
|
+
const idx = this.queue.findIndex((q) => q.job.id === fullJob.id);
|
|
94
|
+
if (idx !== -1)
|
|
95
|
+
this.queue.splice(idx, 1);
|
|
96
|
+
reject(new Error(`WorkerPool: acquire timeout after ${acquireTimeoutMs}ms`));
|
|
97
|
+
}, acquireTimeoutMs);
|
|
98
|
+
if (timeoutTimer.unref)
|
|
99
|
+
timeoutTimer.unref();
|
|
100
|
+
this.queue.push({
|
|
101
|
+
job: fullJob,
|
|
102
|
+
resolve: resolve,
|
|
103
|
+
reject,
|
|
104
|
+
timeoutTimer,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
size() {
|
|
109
|
+
return this.workers.filter((w) => w.currentState !== 'dead').length;
|
|
110
|
+
}
|
|
111
|
+
busyCount() {
|
|
112
|
+
return this.workers.filter((w) => w.currentState === 'busy').length;
|
|
113
|
+
}
|
|
114
|
+
idleCount() {
|
|
115
|
+
return this.workers.filter((w) => w.currentState === 'idle').length;
|
|
116
|
+
}
|
|
117
|
+
/** Gracefully drain all in-flight jobs then terminate all workers. */
|
|
118
|
+
async shutdown() {
|
|
119
|
+
this.isShuttingDown = true;
|
|
120
|
+
// Reject queued jobs that haven't started
|
|
121
|
+
for (const queued of this.queue) {
|
|
122
|
+
clearTimeout(queued.timeoutTimer);
|
|
123
|
+
queued.reject(new Error('WorkerPool shut down'));
|
|
124
|
+
}
|
|
125
|
+
this.queue.length = 0;
|
|
126
|
+
// Drain busy workers (wait for current jobs to finish, then terminate)
|
|
127
|
+
await Promise.allSettled(this.workers.map((w) => w.shutdown(true)));
|
|
128
|
+
this.workers.length = 0;
|
|
129
|
+
logger.info('WorkerPool: shutdown complete');
|
|
130
|
+
}
|
|
131
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
132
|
+
// Private
|
|
133
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
134
|
+
_findIdle() {
|
|
135
|
+
return this.workers.find((w) => w.isIdle && w.currentState === 'idle');
|
|
136
|
+
}
|
|
137
|
+
async _runOnWorker(worker, job) {
|
|
138
|
+
let result;
|
|
139
|
+
try {
|
|
140
|
+
result = await worker.execute(job);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
// Worker errored — mark for recycle and propagate
|
|
144
|
+
await this._maybeRecycle(worker);
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
// Post-job recycle check (age / job-count triggers)
|
|
148
|
+
await this._maybeRecycle(worker);
|
|
149
|
+
// Drain one queued job onto the (now idle) worker or next available idle
|
|
150
|
+
this._drainQueue();
|
|
151
|
+
if (!result.success && result.error) {
|
|
152
|
+
throw new Error(result.error.message);
|
|
153
|
+
}
|
|
154
|
+
return result.result;
|
|
155
|
+
}
|
|
156
|
+
async _maybeRecycle(worker) {
|
|
157
|
+
const decision = evaluateRecycle({
|
|
158
|
+
id: worker.id,
|
|
159
|
+
state: worker.currentState,
|
|
160
|
+
createdAt: worker.createdAt,
|
|
161
|
+
jobsRun: worker.jobsRun,
|
|
162
|
+
}, { maxJobsPerWorker: this.opts.maxJobsPerWorker, maxAgeMs: this.opts.maxAgeMs });
|
|
163
|
+
if (!decision.shouldRecycle)
|
|
164
|
+
return;
|
|
165
|
+
logger.debug('WorkerPool: recycling worker', { workerId: worker.id, reason: decision.reason });
|
|
166
|
+
// Spawn replacement first to maintain capacity
|
|
167
|
+
const workerOpts = {
|
|
168
|
+
preloadTypesDir: this.opts.preloadTypesDir,
|
|
169
|
+
preloadHelpers: this.opts.preloadHelpers,
|
|
170
|
+
maxMemoryMb: this.opts.maxMemoryMb,
|
|
171
|
+
bridgeUrl: this.opts.bridgeUrl,
|
|
172
|
+
};
|
|
173
|
+
if (!this.isShuttingDown) {
|
|
174
|
+
const replacement = new PooledWorker(workerOpts);
|
|
175
|
+
// Start async — don't block the caller
|
|
176
|
+
replacement.start().then(() => {
|
|
177
|
+
const idx = this.workers.indexOf(worker);
|
|
178
|
+
if (idx !== -1) {
|
|
179
|
+
this.workers.splice(idx, 1, replacement);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.workers.push(replacement);
|
|
183
|
+
}
|
|
184
|
+
this._drainQueue();
|
|
185
|
+
logger.debug('WorkerPool: replacement worker ready', { workerId: replacement.id });
|
|
186
|
+
}).catch((err) => {
|
|
187
|
+
logger.error('WorkerPool: replacement spawn failed', { err: String(err) });
|
|
188
|
+
// Remove old dead worker anyway
|
|
189
|
+
this._removeWorker(worker);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// Terminate old worker (drainFirst=false: it's already idle or dead)
|
|
193
|
+
await worker.shutdown(false);
|
|
194
|
+
if (this.isShuttingDown) {
|
|
195
|
+
this._removeWorker(worker);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
_removeWorker(worker) {
|
|
199
|
+
const idx = this.workers.indexOf(worker);
|
|
200
|
+
if (idx !== -1)
|
|
201
|
+
this.workers.splice(idx, 1);
|
|
202
|
+
}
|
|
203
|
+
_drainQueue() {
|
|
204
|
+
while (this.queue.length > 0) {
|
|
205
|
+
const idle = this._findIdle();
|
|
206
|
+
if (!idle)
|
|
207
|
+
break;
|
|
208
|
+
const queued = this.queue.shift();
|
|
209
|
+
clearTimeout(queued.timeoutTimer);
|
|
210
|
+
this._runOnWorker(idle, queued.job)
|
|
211
|
+
.then((result) => queued.resolve(result))
|
|
212
|
+
.catch((err) => queued.reject(err));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=worker-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../../src/runtime/pool/worker-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Individual Deno Worker Lifecycle
|
|
3
|
+
*
|
|
4
|
+
* Manages a single warm Deno worker subprocess. The worker runs a persistent
|
|
5
|
+
* bootstrap script that:
|
|
6
|
+
* 1. Accepts a list of preload helper scripts (Phase 5 plug-in point)
|
|
7
|
+
* 2. Waits for job messages on stdin, executes the code, returns results on stdout
|
|
8
|
+
*
|
|
9
|
+
* Communication protocol (newline-delimited JSON over stdio):
|
|
10
|
+
* host → worker: { id, code, context }
|
|
11
|
+
* worker → host: { id, success, result?, error?, logs }
|
|
12
|
+
*
|
|
13
|
+
* @module runtime/pool/worker
|
|
14
|
+
*/
|
|
15
|
+
export interface WorkerOptions {
|
|
16
|
+
/** Directory containing generated .d.ts files from the registry */
|
|
17
|
+
preloadTypesDir: string;
|
|
18
|
+
/**
|
|
19
|
+
* Additional helper scripts to preload (absolute paths or Deno URLs).
|
|
20
|
+
* Phase 5 (Agent E) plugs compact/summarize/delta helpers in here.
|
|
21
|
+
*/
|
|
22
|
+
preloadHelpers?: string[];
|
|
23
|
+
/** Maximum old-space memory for the Deno process (MB) */
|
|
24
|
+
maxMemoryMb?: number;
|
|
25
|
+
/** Bridge URL the sandbox code uses for MCP calls */
|
|
26
|
+
bridgeUrl?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface WorkerJob {
|
|
29
|
+
/** Unique job identifier for routing responses */
|
|
30
|
+
id: string;
|
|
31
|
+
/** TypeScript source code to execute */
|
|
32
|
+
code: string;
|
|
33
|
+
/** Execution context injected as global variables */
|
|
34
|
+
context: Record<string, unknown>;
|
|
35
|
+
/** Optional AbortSignal to cancel in-flight job */
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
}
|
|
38
|
+
export interface WorkerResult {
|
|
39
|
+
id: string;
|
|
40
|
+
success: boolean;
|
|
41
|
+
result?: unknown;
|
|
42
|
+
error?: {
|
|
43
|
+
message: string;
|
|
44
|
+
stack?: string;
|
|
45
|
+
};
|
|
46
|
+
logs: string[];
|
|
47
|
+
}
|
|
48
|
+
export type WorkerState = 'idle' | 'busy' | 'recycling' | 'dead';
|
|
49
|
+
export declare class PooledWorker {
|
|
50
|
+
private readonly opts;
|
|
51
|
+
readonly id: string;
|
|
52
|
+
private state;
|
|
53
|
+
private proc;
|
|
54
|
+
private bootstrapFile;
|
|
55
|
+
private lineBuffer;
|
|
56
|
+
private pending;
|
|
57
|
+
readonly createdAt: number;
|
|
58
|
+
jobsRun: number;
|
|
59
|
+
constructor(opts: WorkerOptions);
|
|
60
|
+
get currentState(): WorkerState;
|
|
61
|
+
get isIdle(): boolean;
|
|
62
|
+
/** Spawn the Deno subprocess. */
|
|
63
|
+
start(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Execute a job on this worker.
|
|
66
|
+
* The worker must be idle before calling this.
|
|
67
|
+
*/
|
|
68
|
+
execute(job: WorkerJob): Promise<WorkerResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Gracefully shut down the worker.
|
|
71
|
+
* If `drainFirst` is true, waits for any in-flight job to complete.
|
|
72
|
+
*/
|
|
73
|
+
shutdown(drainFirst?: boolean): Promise<void>;
|
|
74
|
+
private _handleLine;
|
|
75
|
+
private _handleClose;
|
|
76
|
+
private _rejectAll;
|
|
77
|
+
private _terminate;
|
|
78
|
+
private _cleanup;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AA4GjE,qBAAa,YAAY;IAcX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,OAAO,CAGA;IAEf,QAAQ,CAAC,SAAS,SAAc;IAChC,OAAO,SAAK;gBAEiB,IAAI,EAAE,aAAa;IAIhD,IAAI,YAAY,IAAI,WAAW,CAE9B;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,iCAAiC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8D5B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAoD9C;;;OAGG;IACG,QAAQ,CAAC,UAAU,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhD,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,QAAQ;CAMjB"}
|