@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,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disk persistence for the tool catalog.
|
|
3
|
+
*
|
|
4
|
+
* Snapshot format (JSON):
|
|
5
|
+
* {
|
|
6
|
+
* "version": "1",
|
|
7
|
+
* "savedAt": 1714816000000, // epoch ms
|
|
8
|
+
* "catalog": [ ...ToolDefinition[] ]
|
|
9
|
+
* }
|
|
10
|
+
*
|
|
11
|
+
* On load, if the `version` field is missing or does not match SNAPSHOT_VERSION,
|
|
12
|
+
* the snapshot is rejected and the caller must fall back to a live refresh.
|
|
13
|
+
*
|
|
14
|
+
* @module registry/snapshot
|
|
15
|
+
*/
|
|
16
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
17
|
+
import { dirname } from 'node:path';
|
|
18
|
+
/** Bump this when the ToolDefinition shape changes in a breaking way. */
|
|
19
|
+
export const SNAPSHOT_VERSION = '1';
|
|
20
|
+
/**
|
|
21
|
+
* Persist `catalog` to `path` as a formatted JSON file.
|
|
22
|
+
* Creates intermediate directories if needed.
|
|
23
|
+
* Throws on I/O error — callers should handle gracefully.
|
|
24
|
+
*/
|
|
25
|
+
export async function saveSnapshot(path, catalog) {
|
|
26
|
+
await mkdir(dirname(path), { recursive: true });
|
|
27
|
+
const file = {
|
|
28
|
+
version: SNAPSHOT_VERSION,
|
|
29
|
+
savedAt: Date.now(),
|
|
30
|
+
catalog,
|
|
31
|
+
};
|
|
32
|
+
await writeFile(path, JSON.stringify(file, null, 2), 'utf8');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load a previously saved snapshot from `path`.
|
|
36
|
+
*
|
|
37
|
+
* Returns the catalog if the file exists and the version matches.
|
|
38
|
+
* Returns `null` if:
|
|
39
|
+
* - The file does not exist
|
|
40
|
+
* - The file is not valid JSON
|
|
41
|
+
* - The version field is missing or does not match SNAPSHOT_VERSION
|
|
42
|
+
*
|
|
43
|
+
* Never throws — callers fall back to a live refresh on null.
|
|
44
|
+
*/
|
|
45
|
+
export async function loadSnapshot(path) {
|
|
46
|
+
let raw;
|
|
47
|
+
try {
|
|
48
|
+
raw = await readFile(path, 'utf8');
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// File not found or not readable — expected on first run.
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(raw);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
if (typeof parsed !== 'object' ||
|
|
62
|
+
parsed === null ||
|
|
63
|
+
!('version' in parsed) ||
|
|
64
|
+
parsed.version !== SNAPSHOT_VERSION ||
|
|
65
|
+
!Array.isArray(parsed.catalog)) {
|
|
66
|
+
// Version mismatch or malformed — force a live refresh.
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return parsed.catalog;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/registry/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAQpC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAyB;IACxE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAiB;QACzB,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,OAAO;KACR,CAAC;IAEF,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC;QACrB,MAAuB,CAAC,OAAO,KAAK,gBAAgB;QACrD,CAAC,KAAK,CAAC,OAAO,CAAE,MAAuB,CAAC,OAAO,CAAC,EAChD,CAAC;QACD,wDAAwD;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAQ,MAAuB,CAAC,OAAO,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type generation — converts the tool registry catalog into TypeScript
|
|
3
|
+
* declaration files for sandbox preload.
|
|
4
|
+
*
|
|
5
|
+
* Output layout (written to `typesDir`):
|
|
6
|
+
* <server>.d.ts — per-server namespace with Input/Output interfaces
|
|
7
|
+
* <server>.routing.json — per-tool routing decisions for X1 adapter (Agent H)
|
|
8
|
+
* _index.d.ts — combined ambient `declare global { namespace mcp.tools }` block
|
|
9
|
+
*
|
|
10
|
+
* Plan amendments (consolidated plan §3 Part B):
|
|
11
|
+
* 1. Emit `@example` JSDoc blocks from `ToolDefinition.examples[]`
|
|
12
|
+
* 2. Write `<server>.routing.json` capturing per-tool routing decisions
|
|
13
|
+
* so Agent H (X1 passthrough adapter) can read it without re-parsing types
|
|
14
|
+
*
|
|
15
|
+
* @module registry/typegen
|
|
16
|
+
*/
|
|
17
|
+
import type { ToolDefinition } from './index.js';
|
|
18
|
+
export interface RoutingManifest {
|
|
19
|
+
/** Server name */
|
|
20
|
+
server: string;
|
|
21
|
+
/** Epoch ms when this manifest was generated */
|
|
22
|
+
generatedAt: number;
|
|
23
|
+
/** Per-tool routing decisions (defaults to execute_code when unset) */
|
|
24
|
+
tools: Record<string, 'passthrough' | 'execute_code' | 'hidden'>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate the TypeScript declaration string for a single server's tools.
|
|
28
|
+
* Returns a string suitable for writing to `<server>.d.ts`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateServerTypes(serverName: string, tools: ToolDefinition[]): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Generate the combined `_index.d.ts` that exposes `mcp.tools` as a global
|
|
33
|
+
* ambient namespace, referencing each per-server namespace.
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateIndexTypes(serverNames: string[]): string;
|
|
36
|
+
/**
|
|
37
|
+
* Build the routing manifest for a server (plan amendment #2).
|
|
38
|
+
* Defaults to `execute_code` when `tool.routing` is not set, preserving
|
|
39
|
+
* current behaviour for all existing tools.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildRoutingManifest(serverName: string, tools: ToolDefinition[]): RoutingManifest;
|
|
42
|
+
/**
|
|
43
|
+
* Write all type and routing files to `typesDir`.
|
|
44
|
+
* Creates the directory if it does not exist.
|
|
45
|
+
* Returns the list of written file paths.
|
|
46
|
+
*/
|
|
47
|
+
export declare function writeTypesToDir(typesDir: string, toolsByServer: Map<string, ToolDefinition[]>): Promise<string[]>;
|
|
48
|
+
//# sourceMappingURL=typegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typegen.d.ts","sourceRoot":"","sources":["../../src/registry/typegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAM7D,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC,CAAC;CAClE;AAuED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,CAsDjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CA4BhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,EAAE,GACtB,eAAe,CAYjB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,GAC3C,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type generation — converts the tool registry catalog into TypeScript
|
|
3
|
+
* declaration files for sandbox preload.
|
|
4
|
+
*
|
|
5
|
+
* Output layout (written to `typesDir`):
|
|
6
|
+
* <server>.d.ts — per-server namespace with Input/Output interfaces
|
|
7
|
+
* <server>.routing.json — per-tool routing decisions for X1 adapter (Agent H)
|
|
8
|
+
* _index.d.ts — combined ambient `declare global { namespace mcp.tools }` block
|
|
9
|
+
*
|
|
10
|
+
* Plan amendments (consolidated plan §3 Part B):
|
|
11
|
+
* 1. Emit `@example` JSDoc blocks from `ToolDefinition.examples[]`
|
|
12
|
+
* 2. Write `<server>.routing.json` capturing per-tool routing decisions
|
|
13
|
+
* so Agent H (X1 passthrough adapter) can read it without re-parsing types
|
|
14
|
+
*
|
|
15
|
+
* @module registry/typegen
|
|
16
|
+
*/
|
|
17
|
+
import { compile } from 'json-schema-to-typescript';
|
|
18
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
// Internal helpers
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
/** Sanitise a name so it can be used as a TypeScript identifier. */
|
|
24
|
+
function toIdentifier(name) {
|
|
25
|
+
return name.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
26
|
+
}
|
|
27
|
+
/** Escape text for safe embedding inside a JSDoc comment block. */
|
|
28
|
+
function escapeJsDoc(text) {
|
|
29
|
+
return text.replace(/\*\//g, '* /');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build a JSDoc comment block from a description and optional examples array.
|
|
33
|
+
* Follows the Anthropic Tool Use Examples pattern (plan amendment).
|
|
34
|
+
*/
|
|
35
|
+
function buildJsDoc(description, examples) {
|
|
36
|
+
const lines = ['/**'];
|
|
37
|
+
if (description) {
|
|
38
|
+
for (const line of description.split('\n')) {
|
|
39
|
+
lines.push(` * ${escapeJsDoc(line)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (examples && examples.length > 0) {
|
|
43
|
+
lines.push(' *');
|
|
44
|
+
for (const ex of examples) {
|
|
45
|
+
if (ex.description) {
|
|
46
|
+
lines.push(` * @example ${escapeJsDoc(ex.description)}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
lines.push(' * @example');
|
|
50
|
+
}
|
|
51
|
+
lines.push(` * args: ${escapeJsDoc(JSON.stringify(ex.args))}`);
|
|
52
|
+
lines.push(` * result: ${escapeJsDoc(JSON.stringify(ex.result))}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
lines.push(' */');
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Attempt to compile a JSON Schema to a TypeScript type string via
|
|
60
|
+
* json-schema-to-typescript. On failure (e.g. recursive schema) falls
|
|
61
|
+
* back to `type <Name> = unknown` — never crashes the generation run.
|
|
62
|
+
* Per the kickoff doc: "if json-schema-to-typescript chokes on a recursive
|
|
63
|
+
* schema, accept whatever it emits and move on".
|
|
64
|
+
*/
|
|
65
|
+
async function schemaToTs(schema, name) {
|
|
66
|
+
try {
|
|
67
|
+
const result = await compile(schema, name, {
|
|
68
|
+
bannerComment: '',
|
|
69
|
+
unknownAny: false,
|
|
70
|
+
strictIndexSignatures: false,
|
|
71
|
+
});
|
|
72
|
+
return result.trim();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Recursive or malformed schema — safe fallback
|
|
76
|
+
return `export type ${toIdentifier(name)} = unknown; // schema could not be compiled`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
80
|
+
// Public API
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Generate the TypeScript declaration string for a single server's tools.
|
|
84
|
+
* Returns a string suitable for writing to `<server>.d.ts`.
|
|
85
|
+
*/
|
|
86
|
+
export async function generateServerTypes(serverName, tools) {
|
|
87
|
+
const id = toIdentifier(serverName);
|
|
88
|
+
const lines = [
|
|
89
|
+
'// Auto-generated by MCP Conductor. Do not edit.',
|
|
90
|
+
`// Source: ${serverName} tool catalog`,
|
|
91
|
+
'',
|
|
92
|
+
`export namespace ${id} {`,
|
|
93
|
+
];
|
|
94
|
+
for (const tool of tools) {
|
|
95
|
+
const toolId = toIdentifier(tool.name);
|
|
96
|
+
// Input interface
|
|
97
|
+
const inputSchema = tool.inputSchema && Object.keys(tool.inputSchema).length > 0
|
|
98
|
+
? tool.inputSchema
|
|
99
|
+
: { type: 'object' };
|
|
100
|
+
const inputTypeName = `${toolId}_Input`;
|
|
101
|
+
const inputTs = await schemaToTs(inputSchema, inputTypeName);
|
|
102
|
+
lines.push('');
|
|
103
|
+
// Emit JSDoc with @example blocks (plan amendment #1)
|
|
104
|
+
lines.push(buildJsDoc(tool.description, tool.examples)
|
|
105
|
+
.split('\n')
|
|
106
|
+
.map((l) => ` ${l}`)
|
|
107
|
+
.join('\n'));
|
|
108
|
+
lines.push(inputTs
|
|
109
|
+
.split('\n')
|
|
110
|
+
.map((l) => ` ${l}`)
|
|
111
|
+
.join('\n'));
|
|
112
|
+
// Output interface (optional)
|
|
113
|
+
if (tool.outputSchema && Object.keys(tool.outputSchema).length > 0) {
|
|
114
|
+
const outputTypeName = `${toolId}_Output`;
|
|
115
|
+
const outputTs = await schemaToTs(tool.outputSchema, outputTypeName);
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push(outputTs
|
|
118
|
+
.split('\n')
|
|
119
|
+
.map((l) => ` ${l}`)
|
|
120
|
+
.join('\n'));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
lines.push('}');
|
|
124
|
+
lines.push('');
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Generate the combined `_index.d.ts` that exposes `mcp.tools` as a global
|
|
129
|
+
* ambient namespace, referencing each per-server namespace.
|
|
130
|
+
*/
|
|
131
|
+
export function generateIndexTypes(serverNames) {
|
|
132
|
+
const lines = ['// Auto-generated by MCP Conductor. Do not edit.', ''];
|
|
133
|
+
for (const name of serverNames) {
|
|
134
|
+
const id = toIdentifier(name);
|
|
135
|
+
lines.push(`import type { ${id} } from './${name}.js';`);
|
|
136
|
+
}
|
|
137
|
+
lines.push('');
|
|
138
|
+
lines.push('declare global {');
|
|
139
|
+
lines.push(' namespace mcp {');
|
|
140
|
+
lines.push(' namespace tools {');
|
|
141
|
+
for (const name of serverNames) {
|
|
142
|
+
const id = toIdentifier(name);
|
|
143
|
+
lines.push(` const ${id}: {`);
|
|
144
|
+
lines.push(` [tool: string]: (args: unknown) => Promise<unknown>;`);
|
|
145
|
+
lines.push(` } & typeof import('./${name}.js').${id};`);
|
|
146
|
+
}
|
|
147
|
+
lines.push(' }');
|
|
148
|
+
lines.push(' }');
|
|
149
|
+
lines.push('}');
|
|
150
|
+
lines.push('');
|
|
151
|
+
lines.push('export {};');
|
|
152
|
+
lines.push('');
|
|
153
|
+
return lines.join('\n');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Build the routing manifest for a server (plan amendment #2).
|
|
157
|
+
* Defaults to `execute_code` when `tool.routing` is not set, preserving
|
|
158
|
+
* current behaviour for all existing tools.
|
|
159
|
+
*/
|
|
160
|
+
export function buildRoutingManifest(serverName, tools) {
|
|
161
|
+
const toolRoutes = {};
|
|
162
|
+
for (const tool of tools) {
|
|
163
|
+
toolRoutes[tool.name] = tool.routing ?? 'execute_code';
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
server: serverName,
|
|
167
|
+
generatedAt: Date.now(),
|
|
168
|
+
tools: toolRoutes,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Write all type and routing files to `typesDir`.
|
|
173
|
+
* Creates the directory if it does not exist.
|
|
174
|
+
* Returns the list of written file paths.
|
|
175
|
+
*/
|
|
176
|
+
export async function writeTypesToDir(typesDir, toolsByServer) {
|
|
177
|
+
await mkdir(typesDir, { recursive: true });
|
|
178
|
+
const written = [];
|
|
179
|
+
const serverNames = [];
|
|
180
|
+
for (const [serverName, tools] of toolsByServer) {
|
|
181
|
+
serverNames.push(serverName);
|
|
182
|
+
// <server>.d.ts
|
|
183
|
+
const dtsContent = await generateServerTypes(serverName, tools);
|
|
184
|
+
const dtsPath = join(typesDir, `${serverName}.d.ts`);
|
|
185
|
+
await writeFile(dtsPath, dtsContent, 'utf8');
|
|
186
|
+
written.push(dtsPath);
|
|
187
|
+
// <server>.routing.json (plan amendment for X1 adapter — Agent H)
|
|
188
|
+
const manifest = buildRoutingManifest(serverName, tools);
|
|
189
|
+
const routingPath = join(typesDir, `${serverName}.routing.json`);
|
|
190
|
+
await writeFile(routingPath, JSON.stringify(manifest, null, 2), 'utf8');
|
|
191
|
+
written.push(routingPath);
|
|
192
|
+
}
|
|
193
|
+
// _index.d.ts
|
|
194
|
+
const indexContent = generateIndexTypes(serverNames);
|
|
195
|
+
const indexPath = join(typesDir, '_index.d.ts');
|
|
196
|
+
await writeFile(indexPath, indexContent, 'utf8');
|
|
197
|
+
written.push(indexPath);
|
|
198
|
+
return written;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=typegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typegen.js","sourceRoot":"","sources":["../../src/registry/typegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation using ajv (JSON Schema draft 7).
|
|
3
|
+
* Validates tool call arguments before they hit the backend — eliminating
|
|
4
|
+
* unnecessary round-trips for bad params.
|
|
5
|
+
*
|
|
6
|
+
* Performance target: <1ms p99 for typical schemas (ajv compiles schemas
|
|
7
|
+
* once and caches the resulting validate function).
|
|
8
|
+
*
|
|
9
|
+
* @module registry/validator
|
|
10
|
+
*/
|
|
11
|
+
import type { JsonSchema, ToolDefinition, ValidationResult } from './index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Validate `args` against a raw JSON Schema.
|
|
14
|
+
* Returns a `ValidationResult` — never throws.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateAgainstSchema(schema: JsonSchema, args: unknown): ValidationResult;
|
|
17
|
+
/**
|
|
18
|
+
* Validate `args` against a specific tool's inputSchema.
|
|
19
|
+
* Returns `{ valid: true }` when the tool is unknown (fail-open — the
|
|
20
|
+
* backend will surface its own error) or when no schema is present.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateToolInput(tool: ToolDefinition | null | undefined, args: unknown): ValidationResult;
|
|
23
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/registry/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM/E;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,OAAO,GACZ,gBAAgB,CAalB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,IAAI,EAAE,OAAO,GACZ,gBAAgB,CAYlB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation using ajv (JSON Schema draft 7).
|
|
3
|
+
* Validates tool call arguments before they hit the backend — eliminating
|
|
4
|
+
* unnecessary round-trips for bad params.
|
|
5
|
+
*
|
|
6
|
+
* Performance target: <1ms p99 for typical schemas (ajv compiles schemas
|
|
7
|
+
* once and caches the resulting validate function).
|
|
8
|
+
*
|
|
9
|
+
* @module registry/validator
|
|
10
|
+
*/
|
|
11
|
+
// ajv v8 ships a named export AND a default export that both point to the
|
|
12
|
+
// class. TypeScript's ESM interop with CJS packages sometimes resolves the
|
|
13
|
+
// module-level value as the namespace rather than the default; importing the
|
|
14
|
+
// named export is the most portable form.
|
|
15
|
+
import { Ajv } from 'ajv';
|
|
16
|
+
// One shared Ajv instance — compiled validators are cached internally.
|
|
17
|
+
// allErrors:true collects all violations rather than stopping at the first.
|
|
18
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
19
|
+
/**
|
|
20
|
+
* Validate `args` against a raw JSON Schema.
|
|
21
|
+
* Returns a `ValidationResult` — never throws.
|
|
22
|
+
*/
|
|
23
|
+
export function validateAgainstSchema(schema, args) {
|
|
24
|
+
const valid = ajv.validate(schema, args);
|
|
25
|
+
if (valid) {
|
|
26
|
+
return { valid: true };
|
|
27
|
+
}
|
|
28
|
+
const errors = (ajv.errors ?? []).map((e) => ({
|
|
29
|
+
path: e.instancePath || '/',
|
|
30
|
+
message: e.message ?? 'validation error',
|
|
31
|
+
}));
|
|
32
|
+
return { valid: false, errors };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate `args` against a specific tool's inputSchema.
|
|
36
|
+
* Returns `{ valid: true }` when the tool is unknown (fail-open — the
|
|
37
|
+
* backend will surface its own error) or when no schema is present.
|
|
38
|
+
*/
|
|
39
|
+
export function validateToolInput(tool, args) {
|
|
40
|
+
if (!tool) {
|
|
41
|
+
// Unknown tool — fail open; backend handles the error.
|
|
42
|
+
return { valid: true };
|
|
43
|
+
}
|
|
44
|
+
if (!tool.inputSchema || Object.keys(tool.inputSchema).length === 0) {
|
|
45
|
+
// No schema to validate against — treat as valid.
|
|
46
|
+
return { valid: true };
|
|
47
|
+
}
|
|
48
|
+
return validateAgainstSchema(tool.inputSchema, args);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/registry/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,0CAA0C;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI1B,uEAAuE;AACvE,4EAA4E;AAC5E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAkB,EAClB,IAAa;IAEb,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAgB,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,GAAG;QAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,kBAAkB;KACzC,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAuC,EACvC,IAAa;IAEb,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,uDAAuD;QACvD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,kDAAkD;QAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker — closed/open/half-open state machine with rolling failure window.
|
|
3
|
+
*
|
|
4
|
+
* Tracks success/failure ratio within a configurable time window. When the ratio
|
|
5
|
+
* drops below the threshold AND the minimum call count is met, the circuit trips
|
|
6
|
+
* OPEN. After halfOpenProbeIntervalMs the circuit moves to HALF-OPEN allowing
|
|
7
|
+
* exactly one probe call. A successful probe closes the circuit; a failed probe
|
|
8
|
+
* re-opens it.
|
|
9
|
+
*/
|
|
10
|
+
import { CircuitState, type ReliabilityProfile } from './profile.js';
|
|
11
|
+
export interface BreakerStats {
|
|
12
|
+
state: CircuitState;
|
|
13
|
+
totalCalls: number;
|
|
14
|
+
successes: number;
|
|
15
|
+
failures: number;
|
|
16
|
+
/** Timestamp when circuit last tripped OPEN (ms since epoch), if ever */
|
|
17
|
+
lastTrip?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class CircuitBreaker {
|
|
20
|
+
private state;
|
|
21
|
+
private window;
|
|
22
|
+
private lastTrip?;
|
|
23
|
+
/** When in HALF-OPEN, true if a probe is already in flight */
|
|
24
|
+
private probeInFlight;
|
|
25
|
+
private readonly threshold;
|
|
26
|
+
private readonly windowMs;
|
|
27
|
+
private readonly minCalls;
|
|
28
|
+
private readonly halfOpenIntervalMs;
|
|
29
|
+
private readonly server;
|
|
30
|
+
constructor(server: string, profile?: Partial<ReliabilityProfile>);
|
|
31
|
+
/** Current circuit state. */
|
|
32
|
+
getState(): CircuitState;
|
|
33
|
+
/**
|
|
34
|
+
* Check whether a call should be allowed through.
|
|
35
|
+
* Throws CircuitOpenError if the circuit is OPEN (fast-fail).
|
|
36
|
+
* In HALF-OPEN allows exactly one concurrent probe call.
|
|
37
|
+
*/
|
|
38
|
+
allowCall(tool: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Record a successful call outcome.
|
|
41
|
+
* If in HALF-OPEN, close the circuit.
|
|
42
|
+
*/
|
|
43
|
+
recordSuccess(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Record a failed call outcome.
|
|
46
|
+
* Re-evaluates the failure ratio; may trip or re-trip the circuit.
|
|
47
|
+
*/
|
|
48
|
+
recordFailure(): void;
|
|
49
|
+
/** Reset the circuit to CLOSED, clearing the window. */
|
|
50
|
+
reset(): void;
|
|
51
|
+
/** Snapshot of current statistics (window-based). */
|
|
52
|
+
getStats(): BreakerStats;
|
|
53
|
+
private _pruneWindow;
|
|
54
|
+
private _maybeTrip;
|
|
55
|
+
private _maybeTransitionToHalfOpen;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breaker.d.ts","sourceRoot":"","sources":["../../src/reliability/breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAmB,MAAM,cAAc,CAAC;AAStF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,8DAA8D;IAC9D,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,kBAAkB,CAAM;IASrE,6BAA6B;IAC7B,QAAQ,IAAI,YAAY;IAKxB;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgB7B;;;OAGG;IACH,aAAa,IAAI,IAAI;IAWrB;;;OAGG;IACH,aAAa,IAAI,IAAI;IAiBrB,wDAAwD;IACxD,KAAK,IAAI,IAAI;IAOb,qDAAqD;IACrD,QAAQ,IAAI,YAAY;IAexB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,0BAA0B;CASnC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker — closed/open/half-open state machine with rolling failure window.
|
|
3
|
+
*
|
|
4
|
+
* Tracks success/failure ratio within a configurable time window. When the ratio
|
|
5
|
+
* drops below the threshold AND the minimum call count is met, the circuit trips
|
|
6
|
+
* OPEN. After halfOpenProbeIntervalMs the circuit moves to HALF-OPEN allowing
|
|
7
|
+
* exactly one probe call. A successful probe closes the circuit; a failed probe
|
|
8
|
+
* re-opens it.
|
|
9
|
+
*/
|
|
10
|
+
import { CircuitOpenError } from './errors.js';
|
|
11
|
+
import { DEFAULT_PROFILE } from './profile.js';
|
|
12
|
+
export class CircuitBreaker {
|
|
13
|
+
state = 'closed';
|
|
14
|
+
window = [];
|
|
15
|
+
lastTrip;
|
|
16
|
+
/** When in HALF-OPEN, true if a probe is already in flight */
|
|
17
|
+
probeInFlight = false;
|
|
18
|
+
threshold;
|
|
19
|
+
windowMs;
|
|
20
|
+
minCalls;
|
|
21
|
+
halfOpenIntervalMs;
|
|
22
|
+
server;
|
|
23
|
+
constructor(server, profile = {}) {
|
|
24
|
+
this.server = server;
|
|
25
|
+
this.threshold = profile.circuitBreakerThreshold ?? DEFAULT_PROFILE.circuitBreakerThreshold;
|
|
26
|
+
this.windowMs = profile.circuitBreakerWindowMs ?? DEFAULT_PROFILE.circuitBreakerWindowMs;
|
|
27
|
+
this.minCalls = profile.circuitBreakerMinCalls ?? DEFAULT_PROFILE.circuitBreakerMinCalls;
|
|
28
|
+
this.halfOpenIntervalMs =
|
|
29
|
+
profile.halfOpenProbeIntervalMs ?? DEFAULT_PROFILE.halfOpenProbeIntervalMs;
|
|
30
|
+
}
|
|
31
|
+
/** Current circuit state. */
|
|
32
|
+
getState() {
|
|
33
|
+
this._maybeTransitionToHalfOpen();
|
|
34
|
+
return this.state;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check whether a call should be allowed through.
|
|
38
|
+
* Throws CircuitOpenError if the circuit is OPEN (fast-fail).
|
|
39
|
+
* In HALF-OPEN allows exactly one concurrent probe call.
|
|
40
|
+
*/
|
|
41
|
+
allowCall(tool) {
|
|
42
|
+
this._maybeTransitionToHalfOpen();
|
|
43
|
+
if (this.state === 'open') {
|
|
44
|
+
throw new CircuitOpenError(this.server, tool);
|
|
45
|
+
}
|
|
46
|
+
if (this.state === 'half-open') {
|
|
47
|
+
if (this.probeInFlight) {
|
|
48
|
+
// Another probe is already in flight — fail fast for subsequent calls
|
|
49
|
+
throw new CircuitOpenError(this.server, tool);
|
|
50
|
+
}
|
|
51
|
+
this.probeInFlight = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Record a successful call outcome.
|
|
56
|
+
* If in HALF-OPEN, close the circuit.
|
|
57
|
+
*/
|
|
58
|
+
recordSuccess() {
|
|
59
|
+
this._pruneWindow();
|
|
60
|
+
this.window.push({ ts: Date.now(), success: true });
|
|
61
|
+
if (this.state === 'half-open') {
|
|
62
|
+
this.probeInFlight = false;
|
|
63
|
+
this.state = 'closed';
|
|
64
|
+
this.window = []; // reset window on recovery
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Record a failed call outcome.
|
|
69
|
+
* Re-evaluates the failure ratio; may trip or re-trip the circuit.
|
|
70
|
+
*/
|
|
71
|
+
recordFailure() {
|
|
72
|
+
this._pruneWindow();
|
|
73
|
+
this.window.push({ ts: Date.now(), success: false });
|
|
74
|
+
if (this.state === 'half-open') {
|
|
75
|
+
// Probe failed — return to OPEN
|
|
76
|
+
this.probeInFlight = false;
|
|
77
|
+
this.state = 'open';
|
|
78
|
+
this.lastTrip = Date.now();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (this.state === 'closed') {
|
|
82
|
+
this._maybeTrip();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Reset the circuit to CLOSED, clearing the window. */
|
|
86
|
+
reset() {
|
|
87
|
+
this.state = 'closed';
|
|
88
|
+
this.window = [];
|
|
89
|
+
this.lastTrip = undefined;
|
|
90
|
+
this.probeInFlight = false;
|
|
91
|
+
}
|
|
92
|
+
/** Snapshot of current statistics (window-based). */
|
|
93
|
+
getStats() {
|
|
94
|
+
this._pruneWindow();
|
|
95
|
+
const successes = this.window.filter((r) => r.success).length;
|
|
96
|
+
const failures = this.window.filter((r) => !r.success).length;
|
|
97
|
+
return {
|
|
98
|
+
state: this.getState(),
|
|
99
|
+
totalCalls: this.window.length,
|
|
100
|
+
successes,
|
|
101
|
+
failures,
|
|
102
|
+
lastTrip: this.lastTrip,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
106
|
+
_pruneWindow() {
|
|
107
|
+
const cutoff = Date.now() - this.windowMs;
|
|
108
|
+
this.window = this.window.filter((r) => r.ts >= cutoff);
|
|
109
|
+
}
|
|
110
|
+
_maybeTrip() {
|
|
111
|
+
if (this.window.length < this.minCalls)
|
|
112
|
+
return;
|
|
113
|
+
const failures = this.window.filter((r) => !r.success).length;
|
|
114
|
+
const ratio = failures / this.window.length;
|
|
115
|
+
if (ratio > this.threshold) {
|
|
116
|
+
this.state = 'open';
|
|
117
|
+
this.lastTrip = Date.now();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_maybeTransitionToHalfOpen() {
|
|
121
|
+
if (this.state === 'open' && this.lastTrip !== undefined) {
|
|
122
|
+
const elapsed = Date.now() - this.lastTrip;
|
|
123
|
+
if (elapsed >= this.halfOpenIntervalMs) {
|
|
124
|
+
this.state = 'half-open';
|
|
125
|
+
this.probeInFlight = false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breaker.js","sourceRoot":"","sources":["../../src/reliability/breaker.ts"],"names":[],"mappings":"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"}
|