@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.
Files changed (276) hide show
  1. package/README.md +35 -5
  2. package/dist/bin/cli.d.ts +20 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +260 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bridge/http-server.d.ts +35 -0
  7. package/dist/bridge/http-server.d.ts.map +1 -1
  8. package/dist/bridge/http-server.js +51 -2
  9. package/dist/bridge/http-server.js.map +1 -1
  10. package/dist/bridge/index.d.ts +1 -0
  11. package/dist/bridge/index.d.ts.map +1 -1
  12. package/dist/bridge/index.js +1 -0
  13. package/dist/bridge/index.js.map +1 -1
  14. package/dist/bridge/pool.d.ts +95 -0
  15. package/dist/bridge/pool.d.ts.map +1 -0
  16. package/dist/bridge/pool.js +384 -0
  17. package/dist/bridge/pool.js.map +1 -0
  18. package/dist/cache/cache.d.ts +64 -0
  19. package/dist/cache/cache.d.ts.map +1 -0
  20. package/dist/cache/cache.js +209 -0
  21. package/dist/cache/cache.js.map +1 -0
  22. package/dist/cache/delta.d.ts +32 -0
  23. package/dist/cache/delta.d.ts.map +1 -0
  24. package/dist/cache/delta.js +131 -0
  25. package/dist/cache/delta.js.map +1 -0
  26. package/dist/cache/disk.d.ts +65 -0
  27. package/dist/cache/disk.d.ts.map +1 -0
  28. package/dist/cache/disk.js +238 -0
  29. package/dist/cache/disk.js.map +1 -0
  30. package/dist/cache/index.d.ts +53 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +12 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/key.d.ts +44 -0
  35. package/dist/cache/key.d.ts.map +1 -0
  36. package/dist/cache/key.js +83 -0
  37. package/dist/cache/key.js.map +1 -0
  38. package/dist/cache/lru.d.ts +57 -0
  39. package/dist/cache/lru.d.ts.map +1 -0
  40. package/dist/cache/lru.js +112 -0
  41. package/dist/cache/lru.js.map +1 -0
  42. package/dist/cache/policy.d.ts +34 -0
  43. package/dist/cache/policy.d.ts.map +1 -0
  44. package/dist/cache/policy.js +95 -0
  45. package/dist/cache/policy.js.map +1 -0
  46. package/dist/cli/commands/doctor.d.ts +33 -0
  47. package/dist/cli/commands/doctor.d.ts.map +1 -0
  48. package/dist/cli/commands/doctor.js +135 -0
  49. package/dist/cli/commands/doctor.js.map +1 -0
  50. package/dist/cli/commands/export-servers.d.ts +22 -0
  51. package/dist/cli/commands/export-servers.d.ts.map +1 -0
  52. package/dist/cli/commands/export-servers.js +45 -0
  53. package/dist/cli/commands/export-servers.js.map +1 -0
  54. package/dist/cli/commands/import-servers.d.ts +57 -0
  55. package/dist/cli/commands/import-servers.d.ts.map +1 -0
  56. package/dist/cli/commands/import-servers.js +137 -0
  57. package/dist/cli/commands/import-servers.js.map +1 -0
  58. package/dist/cli/commands/routing.d.ts +34 -0
  59. package/dist/cli/commands/routing.d.ts.map +1 -0
  60. package/dist/cli/commands/routing.js +60 -0
  61. package/dist/cli/commands/routing.js.map +1 -0
  62. package/dist/cli/commands/test-server.d.ts +34 -0
  63. package/dist/cli/commands/test-server.d.ts.map +1 -0
  64. package/dist/cli/commands/test-server.js +86 -0
  65. package/dist/cli/commands/test-server.js.map +1 -0
  66. package/dist/cli/daemon.d.ts +60 -0
  67. package/dist/cli/daemon.d.ts.map +1 -0
  68. package/dist/cli/daemon.js +244 -0
  69. package/dist/cli/daemon.js.map +1 -0
  70. package/dist/cli/replay.d.ts +16 -0
  71. package/dist/cli/replay.d.ts.map +1 -0
  72. package/dist/cli/replay.js +89 -0
  73. package/dist/cli/replay.js.map +1 -0
  74. package/dist/cli/wizard/setup.d.ts +12 -0
  75. package/dist/cli/wizard/setup.d.ts.map +1 -0
  76. package/dist/cli/wizard/setup.js +71 -0
  77. package/dist/cli/wizard/setup.js.map +1 -0
  78. package/dist/config/defaults.d.ts.map +1 -1
  79. package/dist/config/defaults.js +4 -1
  80. package/dist/config/defaults.js.map +1 -1
  81. package/dist/config/schema.d.ts +34 -0
  82. package/dist/config/schema.d.ts.map +1 -1
  83. package/dist/daemon/client.d.ts +99 -0
  84. package/dist/daemon/client.d.ts.map +1 -0
  85. package/dist/daemon/client.js +292 -0
  86. package/dist/daemon/client.js.map +1 -0
  87. package/dist/daemon/discovery.d.ts +50 -0
  88. package/dist/daemon/discovery.d.ts.map +1 -0
  89. package/dist/daemon/discovery.js +104 -0
  90. package/dist/daemon/discovery.js.map +1 -0
  91. package/dist/daemon/index.d.ts +16 -0
  92. package/dist/daemon/index.d.ts.map +1 -0
  93. package/dist/daemon/index.js +11 -0
  94. package/dist/daemon/index.js.map +1 -0
  95. package/dist/daemon/sandbox-api.d.ts +45 -0
  96. package/dist/daemon/sandbox-api.d.ts.map +1 -0
  97. package/dist/daemon/sandbox-api.js +74 -0
  98. package/dist/daemon/sandbox-api.js.map +1 -0
  99. package/dist/daemon/server.d.ts +65 -0
  100. package/dist/daemon/server.d.ts.map +1 -0
  101. package/dist/daemon/server.js +373 -0
  102. package/dist/daemon/server.js.map +1 -0
  103. package/dist/daemon/shared-kv.d.ts +81 -0
  104. package/dist/daemon/shared-kv.d.ts.map +1 -0
  105. package/dist/daemon/shared-kv.js +215 -0
  106. package/dist/daemon/shared-kv.js.map +1 -0
  107. package/dist/daemon/shared-lock.d.ts +71 -0
  108. package/dist/daemon/shared-lock.d.ts.map +1 -0
  109. package/dist/daemon/shared-lock.js +119 -0
  110. package/dist/daemon/shared-lock.js.map +1 -0
  111. package/dist/hub/mcp-hub.d.ts +23 -0
  112. package/dist/hub/mcp-hub.d.ts.map +1 -1
  113. package/dist/hub/mcp-hub.js +34 -1
  114. package/dist/hub/mcp-hub.js.map +1 -1
  115. package/dist/index.js +7 -0
  116. package/dist/index.js.map +1 -1
  117. package/dist/observability/anomaly.d.ts +67 -0
  118. package/dist/observability/anomaly.d.ts.map +1 -0
  119. package/dist/observability/anomaly.js +141 -0
  120. package/dist/observability/anomaly.js.map +1 -0
  121. package/dist/observability/cost-predictor.d.ts +49 -0
  122. package/dist/observability/cost-predictor.d.ts.map +1 -0
  123. package/dist/observability/cost-predictor.js +145 -0
  124. package/dist/observability/cost-predictor.js.map +1 -0
  125. package/dist/observability/hot-path.d.ts +49 -0
  126. package/dist/observability/hot-path.d.ts.map +1 -0
  127. package/dist/observability/hot-path.js +125 -0
  128. package/dist/observability/hot-path.js.map +1 -0
  129. package/dist/observability/index.d.ts +10 -0
  130. package/dist/observability/index.d.ts.map +1 -0
  131. package/dist/observability/index.js +10 -0
  132. package/dist/observability/index.js.map +1 -0
  133. package/dist/observability/replay.d.ts +104 -0
  134. package/dist/observability/replay.d.ts.map +1 -0
  135. package/dist/observability/replay.js +239 -0
  136. package/dist/observability/replay.js.map +1 -0
  137. package/dist/registry/built-in-recommendations.d.ts +54 -0
  138. package/dist/registry/built-in-recommendations.d.ts.map +1 -0
  139. package/dist/registry/built-in-recommendations.js +65 -0
  140. package/dist/registry/built-in-recommendations.js.map +1 -0
  141. package/dist/registry/events.d.ts +26 -0
  142. package/dist/registry/events.d.ts.map +1 -0
  143. package/dist/registry/events.js +22 -0
  144. package/dist/registry/events.js.map +1 -0
  145. package/dist/registry/index.d.ts +159 -0
  146. package/dist/registry/index.d.ts.map +1 -0
  147. package/dist/registry/index.js +12 -0
  148. package/dist/registry/index.js.map +1 -0
  149. package/dist/registry/registry.d.ts +87 -0
  150. package/dist/registry/registry.d.ts.map +1 -0
  151. package/dist/registry/registry.js +294 -0
  152. package/dist/registry/registry.js.map +1 -0
  153. package/dist/registry/snapshot.d.ts +42 -0
  154. package/dist/registry/snapshot.d.ts.map +1 -0
  155. package/dist/registry/snapshot.js +71 -0
  156. package/dist/registry/snapshot.js.map +1 -0
  157. package/dist/registry/typegen.d.ts +48 -0
  158. package/dist/registry/typegen.d.ts.map +1 -0
  159. package/dist/registry/typegen.js +200 -0
  160. package/dist/registry/typegen.js.map +1 -0
  161. package/dist/registry/validator.d.ts +23 -0
  162. package/dist/registry/validator.d.ts.map +1 -0
  163. package/dist/registry/validator.js +50 -0
  164. package/dist/registry/validator.js.map +1 -0
  165. package/dist/reliability/breaker.d.ts +57 -0
  166. package/dist/reliability/breaker.d.ts.map +1 -0
  167. package/dist/reliability/breaker.js +130 -0
  168. package/dist/reliability/breaker.js.map +1 -0
  169. package/dist/reliability/errors.d.ts +78 -0
  170. package/dist/reliability/errors.d.ts.map +1 -0
  171. package/dist/reliability/errors.js +160 -0
  172. package/dist/reliability/errors.js.map +1 -0
  173. package/dist/reliability/gateway.d.ts +88 -0
  174. package/dist/reliability/gateway.d.ts.map +1 -0
  175. package/dist/reliability/gateway.js +180 -0
  176. package/dist/reliability/gateway.js.map +1 -0
  177. package/dist/reliability/index.d.ts +20 -0
  178. package/dist/reliability/index.d.ts.map +1 -0
  179. package/dist/reliability/index.js +16 -0
  180. package/dist/reliability/index.js.map +1 -0
  181. package/dist/reliability/profile.d.ts +49 -0
  182. package/dist/reliability/profile.d.ts.map +1 -0
  183. package/dist/reliability/profile.js +58 -0
  184. package/dist/reliability/profile.js.map +1 -0
  185. package/dist/reliability/retry.d.ts +39 -0
  186. package/dist/reliability/retry.d.ts.map +1 -0
  187. package/dist/reliability/retry.js +51 -0
  188. package/dist/reliability/retry.js.map +1 -0
  189. package/dist/reliability/timeout.d.ts +34 -0
  190. package/dist/reliability/timeout.d.ts.map +1 -0
  191. package/dist/reliability/timeout.js +53 -0
  192. package/dist/reliability/timeout.js.map +1 -0
  193. package/dist/runtime/executor.d.ts.map +1 -1
  194. package/dist/runtime/executor.js +122 -14
  195. package/dist/runtime/executor.js.map +1 -1
  196. package/dist/runtime/findtool/embed.d.ts +28 -0
  197. package/dist/runtime/findtool/embed.d.ts.map +1 -0
  198. package/dist/runtime/findtool/embed.js +85 -0
  199. package/dist/runtime/findtool/embed.js.map +1 -0
  200. package/dist/runtime/findtool/index.d.ts +52 -0
  201. package/dist/runtime/findtool/index.d.ts.map +1 -0
  202. package/dist/runtime/findtool/index.js +78 -0
  203. package/dist/runtime/findtool/index.js.map +1 -0
  204. package/dist/runtime/findtool/vector-index.d.ts +53 -0
  205. package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
  206. package/dist/runtime/findtool/vector-index.js +71 -0
  207. package/dist/runtime/findtool/vector-index.js.map +1 -0
  208. package/dist/runtime/helpers/budget.d.ts +27 -0
  209. package/dist/runtime/helpers/budget.d.ts.map +1 -0
  210. package/dist/runtime/helpers/budget.js +103 -0
  211. package/dist/runtime/helpers/budget.js.map +1 -0
  212. package/dist/runtime/helpers/compact.d.ts +32 -0
  213. package/dist/runtime/helpers/compact.d.ts.map +1 -0
  214. package/dist/runtime/helpers/compact.js +93 -0
  215. package/dist/runtime/helpers/compact.js.map +1 -0
  216. package/dist/runtime/helpers/delta.d.ts +45 -0
  217. package/dist/runtime/helpers/delta.d.ts.map +1 -0
  218. package/dist/runtime/helpers/delta.js +116 -0
  219. package/dist/runtime/helpers/delta.js.map +1 -0
  220. package/dist/runtime/helpers/index.d.ts +16 -0
  221. package/dist/runtime/helpers/index.d.ts.map +1 -0
  222. package/dist/runtime/helpers/index.js +13 -0
  223. package/dist/runtime/helpers/index.js.map +1 -0
  224. package/dist/runtime/helpers/summarize.d.ts +24 -0
  225. package/dist/runtime/helpers/summarize.d.ts.map +1 -0
  226. package/dist/runtime/helpers/summarize.js +124 -0
  227. package/dist/runtime/helpers/summarize.js.map +1 -0
  228. package/dist/runtime/helpers/worker-preload.d.ts +25 -0
  229. package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
  230. package/dist/runtime/helpers/worker-preload.js +223 -0
  231. package/dist/runtime/helpers/worker-preload.js.map +1 -0
  232. package/dist/runtime/index.d.ts +1 -0
  233. package/dist/runtime/index.d.ts.map +1 -1
  234. package/dist/runtime/index.js +1 -0
  235. package/dist/runtime/index.js.map +1 -1
  236. package/dist/runtime/pool/index.d.ts +11 -0
  237. package/dist/runtime/pool/index.d.ts.map +1 -0
  238. package/dist/runtime/pool/index.js +8 -0
  239. package/dist/runtime/pool/index.js.map +1 -0
  240. package/dist/runtime/pool/recycle.d.ts +44 -0
  241. package/dist/runtime/pool/recycle.d.ts.map +1 -0
  242. package/dist/runtime/pool/recycle.js +50 -0
  243. package/dist/runtime/pool/recycle.js.map +1 -0
  244. package/dist/runtime/pool/worker-pool.d.ts +77 -0
  245. package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
  246. package/dist/runtime/pool/worker-pool.js +216 -0
  247. package/dist/runtime/pool/worker-pool.js.map +1 -0
  248. package/dist/runtime/pool/worker.d.ts +80 -0
  249. package/dist/runtime/pool/worker.d.ts.map +1 -0
  250. package/dist/runtime/pool/worker.js +324 -0
  251. package/dist/runtime/pool/worker.js.map +1 -0
  252. package/dist/server/mcp-server.d.ts +3 -0
  253. package/dist/server/mcp-server.d.ts.map +1 -1
  254. package/dist/server/mcp-server.js +457 -3
  255. package/dist/server/mcp-server.js.map +1 -1
  256. package/dist/server/passthrough-registrar.d.ts +123 -0
  257. package/dist/server/passthrough-registrar.d.ts.map +1 -0
  258. package/dist/server/passthrough-registrar.js +199 -0
  259. package/dist/server/passthrough-registrar.js.map +1 -0
  260. package/dist/skills/skills-engine.d.ts +9 -1
  261. package/dist/skills/skills-engine.d.ts.map +1 -1
  262. package/dist/skills/skills-engine.js +20 -3
  263. package/dist/skills/skills-engine.js.map +1 -1
  264. package/dist/utils/index.d.ts +1 -0
  265. package/dist/utils/index.d.ts.map +1 -1
  266. package/dist/utils/index.js +1 -0
  267. package/dist/utils/index.js.map +1 -1
  268. package/dist/utils/tokenize.d.ts +55 -0
  269. package/dist/utils/tokenize.d.ts.map +1 -0
  270. package/dist/utils/tokenize.js +205 -0
  271. package/dist/utils/tokenize.js.map +1 -0
  272. package/dist/version.d.ts +3 -3
  273. package/dist/version.d.ts.map +1 -1
  274. package/dist/version.js +3 -3
  275. package/dist/version.js.map +1 -1
  276. package/package.json +13 -3
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Tool Registry — authoritative catalog of all backend MCP tools with
3
+ * auto-generated TypeScript declarations, ajv-based input validation,
4
+ * snapshot persistence, and hot-reload change events.
5
+ *
6
+ * Every v3 agent imports from this module. Do not change the public API
7
+ * without coordinating with all agents.
8
+ *
9
+ * @module registry
10
+ */
11
+ export type { RegistryEventType, RegistryEvent } from './events.js';
12
+ export { ToolRegistry } from './registry.js';
13
+ export interface JsonSchema {
14
+ type?: string | string[];
15
+ properties?: Record<string, JsonSchema>;
16
+ required?: string[];
17
+ enum?: unknown[];
18
+ items?: JsonSchema | JsonSchema[];
19
+ additionalProperties?: boolean | JsonSchema;
20
+ description?: string;
21
+ $ref?: string;
22
+ $defs?: Record<string, JsonSchema>;
23
+ definitions?: Record<string, JsonSchema>;
24
+ oneOf?: JsonSchema[];
25
+ anyOf?: JsonSchema[];
26
+ allOf?: JsonSchema[];
27
+ not?: JsonSchema;
28
+ if?: JsonSchema;
29
+ then?: JsonSchema;
30
+ else?: JsonSchema;
31
+ const?: unknown;
32
+ format?: string;
33
+ default?: unknown;
34
+ title?: string;
35
+ minimum?: number;
36
+ maximum?: number;
37
+ minLength?: number;
38
+ maxLength?: number;
39
+ pattern?: string;
40
+ minItems?: number;
41
+ maxItems?: number;
42
+ uniqueItems?: boolean;
43
+ nullable?: boolean;
44
+ }
45
+ /**
46
+ * Per-tool reliability overrides. Populated fully by Phase 3 (Agent C).
47
+ * Defined here so Phase 1 ToolDefinition can reference it without circular deps.
48
+ */
49
+ export interface ReliabilityProfile {
50
+ timeoutMs?: number;
51
+ retries?: number;
52
+ retryDelayMs?: number;
53
+ retryMaxDelayMs?: number;
54
+ circuitBreakerThreshold?: number;
55
+ circuitBreakerWindowMs?: number;
56
+ circuitBreakerMinCalls?: number;
57
+ halfOpenProbeIntervalMs?: number;
58
+ }
59
+ /**
60
+ * A single tool in the registry catalog.
61
+ *
62
+ * Core fields mirror the MCP `tools/list` response.
63
+ * Conductor-extension fields are optional and opt-in.
64
+ *
65
+ * Plan amendments (consolidated plan §3 Part B):
66
+ * - `routing` — for X1 passthrough adapter (Agent H)
67
+ * - `redact` — for X4 PII tokenization (Agent J)
68
+ * - `examples` — Anthropic Tool Use Examples pattern; emitted as @example JSDoc
69
+ */
70
+ export interface ToolDefinition {
71
+ /** Backend server name (matches key in ~/.mcp-conductor.json) */
72
+ server: string;
73
+ /** Tool name as reported by the backend */
74
+ name: string;
75
+ /** Human-readable description */
76
+ description: string;
77
+ /** JSON Schema for the tool's input parameters */
78
+ inputSchema: JsonSchema;
79
+ /** JSON Schema for the tool's output (optional; not all servers provide this) */
80
+ outputSchema?: JsonSchema;
81
+ /** Estimated call cost; used by cache policy and observability */
82
+ cost?: 'low' | 'medium' | 'high';
83
+ /** Whether this tool's results are safe to cache */
84
+ cacheable?: boolean;
85
+ /** Cache TTL in milliseconds (requires cacheable: true) */
86
+ cacheTtl?: number;
87
+ /** Per-tool reliability overrides (Phase 3) */
88
+ reliability?: ReliabilityProfile;
89
+ /**
90
+ * Execution routing decision.
91
+ * - `execute_code` (default) — route through the Deno sandbox
92
+ * - `passthrough` — expose as a first-class MCP tool (X1 / Agent H)
93
+ * - `hidden` — suppress from Claude's tool list
94
+ */
95
+ routing?: 'passthrough' | 'execute_code' | 'hidden';
96
+ /**
97
+ * PII redaction config applied to this tool's response before it enters
98
+ * the sandbox or Claude's context. (X4 — Agent J)
99
+ */
100
+ redact?: {
101
+ response?: Array<'email' | 'phone' | 'ssn' | 'credit_card' | string>;
102
+ };
103
+ /**
104
+ * Worked examples. Emitted as `@example` JSDoc blocks in generated .d.ts
105
+ * so both the sandbox TS LSP and Claude see concrete usage without extra
106
+ * round-trips. (Anthropic Tool Use Examples pattern)
107
+ */
108
+ examples?: Array<{
109
+ args: unknown;
110
+ result: unknown;
111
+ description?: string;
112
+ }>;
113
+ }
114
+ export interface ValidationResult {
115
+ valid: boolean;
116
+ errors?: Array<{
117
+ path: string;
118
+ message: string;
119
+ }>;
120
+ }
121
+ /**
122
+ * Minimal interface that ToolRegistry needs from the backend connection layer.
123
+ * MCPHub satisfies this interface; tests can pass a lightweight mock.
124
+ */
125
+ export interface BackendBridge {
126
+ /** Returns names of all currently-known servers and their connection status */
127
+ listServers(): Array<{
128
+ name: string;
129
+ status: string;
130
+ toolCount: number;
131
+ }>;
132
+ /**
133
+ * Returns raw tool descriptors for a server.
134
+ * Shape matches the MCP SDK's Tool type (name + description + inputSchema).
135
+ */
136
+ getServerTools(serverName: string): Array<{
137
+ name: string;
138
+ description?: string;
139
+ inputSchema?: JsonSchema;
140
+ outputSchema?: JsonSchema;
141
+ }>;
142
+ /** Register for server lifecycle events */
143
+ on(event: 'serverConnected' | 'serverDisconnected', listener: (name: string) => void): void;
144
+ /** Deregister server lifecycle event listeners */
145
+ off(event: 'serverConnected' | 'serverDisconnected', listener: (name: string) => void): void;
146
+ }
147
+ export interface RegistryOptions {
148
+ /** Backend connection layer (MCPHub or compatible mock) */
149
+ bridge: BackendBridge;
150
+ /** Path to persist/load the registry snapshot */
151
+ snapshotPath?: string;
152
+ /** Directory where generated .d.ts files are written */
153
+ typesDir?: string;
154
+ /** Run ajv validation before every backend call (default: true) */
155
+ validateInputs?: boolean;
156
+ /** Regenerate .d.ts files when a server reconnects (default: true) */
157
+ regenerateOnConnect?: boolean;
158
+ }
159
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tool Registry — authoritative catalog of all backend MCP tools with
3
+ * auto-generated TypeScript declarations, ajv-based input validation,
4
+ * snapshot persistence, and hot-reload change events.
5
+ *
6
+ * Every v3 agent imports from this module. Do not change the public API
7
+ * without coordinating with all agents.
8
+ *
9
+ * @module registry
10
+ */
11
+ export { ToolRegistry } from './registry.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * ToolRegistry — authoritative catalog of backend MCP tools.
3
+ *
4
+ * Responsibilities:
5
+ * - Populate the catalog from all connected backends (`refresh()`)
6
+ * - Validate tool call arguments before they hit the backend (`validateInput()`)
7
+ * - Generate TypeScript declarations for sandbox preload (`generateTypes()`,
8
+ * `writeTypesToDir()`)
9
+ * - Persist and restore the catalog across restarts (`saveSnapshot()`,
10
+ * `loadSnapshot()`)
11
+ * - Emit change events on hot-reload (`watch()`)
12
+ * - Allow out-of-band annotation of conductor-extension metadata (`annotate()`)
13
+ *
14
+ * @module registry/registry
15
+ */
16
+ import type { ToolDefinition, ValidationResult, RegistryOptions } from './index.js';
17
+ import type { RegistryEvent } from './events.js';
18
+ export declare class ToolRegistry {
19
+ private catalog;
20
+ private emitter;
21
+ private options;
22
+ /** Stable catalog key: `<server>/<name>` */
23
+ private static key;
24
+ constructor(options: RegistryOptions);
25
+ /**
26
+ * Populate the catalog from all currently-connected backends.
27
+ * Errors from individual backends are logged and skipped — the registry
28
+ * always ends in a consistent state.
29
+ * Returns the full catalog after refresh.
30
+ */
31
+ refresh(): Promise<ToolDefinition[]>;
32
+ /**
33
+ * Refresh a single server's tools, diffing against the current catalog
34
+ * and emitting per-tool change events.
35
+ */
36
+ private refreshServer;
37
+ private emit;
38
+ /** Look up a single tool. Returns null if not found. */
39
+ getTool(server: string, name: string): ToolDefinition | null;
40
+ /** All tools across all servers as a flat array. */
41
+ getAllTools(): ToolDefinition[];
42
+ /** Tools for a specific server. */
43
+ getServerTools(server: string): ToolDefinition[];
44
+ /**
45
+ * Validate input args against the tool's inputSchema.
46
+ * Returns `{ valid: true }` for unknown tools (fail-open).
47
+ * When `validateInputs: false`, always returns `{ valid: true }`.
48
+ */
49
+ validateInput(server: string, name: string, args: unknown): ValidationResult;
50
+ /**
51
+ * Generate combined TypeScript declarations for all servers as a single string.
52
+ * Use `writeTypesToDir()` for writing to disk.
53
+ */
54
+ generateTypes(): Promise<string>;
55
+ /**
56
+ * Write generated .d.ts and .routing.json files to `dir`.
57
+ * Creates `dir` if it does not exist.
58
+ * Returns the list of written file paths.
59
+ */
60
+ writeTypesToDir(dir: string): Promise<string[]>;
61
+ private uniqueServerNames;
62
+ /**
63
+ * Subscribe to registry change events.
64
+ * Returns an object with `unsubscribe()` for cleanup.
65
+ */
66
+ watch(callback: (event: RegistryEvent) => void): {
67
+ unsubscribe: () => void;
68
+ };
69
+ /**
70
+ * Persist the current catalog to disk.
71
+ * Uses `options.snapshotPath` when `path` is omitted.
72
+ */
73
+ saveSnapshot(path?: string): Promise<void>;
74
+ /**
75
+ * Load a previously saved snapshot from disk.
76
+ * Falls back silently when the file is missing, malformed, or version-mismatched.
77
+ */
78
+ loadSnapshot(path?: string): Promise<void>;
79
+ /**
80
+ * Update conductor-extension metadata for a tool.
81
+ * Annotations persist across `refresh()` calls.
82
+ * Calling `annotate()` for an unknown tool is a no-op (metadata will be
83
+ * applied the next time the tool appears via refresh).
84
+ */
85
+ annotate(server: string, name: string, metadata: Partial<ToolDefinition>): void;
86
+ }
87
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAEhB,eAAe,EAEhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,OAAO,CAA4B;IAE3C,4CAA4C;IAC5C,OAAO,CAAC,MAAM,CAAC,GAAG;gBAIN,OAAO,EAAE,eAAe;IA2CpC;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAY1C;;;OAGG;YACW,aAAa;IAqF3B,OAAO,CAAC,IAAI;IAQZ,wDAAwD;IACxD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI5D,oDAAoD;IACpD,WAAW,IAAI,cAAc,EAAE;IAI/B,mCAAmC;IACnC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE;IAQhD;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB;IAW5E;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAYtC;;;;OAIG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQrD,OAAO,CAAC,iBAAiB;IAQzB;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;IAS5E;;;OAGG;IACG,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD;;;OAGG;IACG,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;CAwBhF"}
@@ -0,0 +1,294 @@
1
+ /**
2
+ * ToolRegistry — authoritative catalog of backend MCP tools.
3
+ *
4
+ * Responsibilities:
5
+ * - Populate the catalog from all connected backends (`refresh()`)
6
+ * - Validate tool call arguments before they hit the backend (`validateInput()`)
7
+ * - Generate TypeScript declarations for sandbox preload (`generateTypes()`,
8
+ * `writeTypesToDir()`)
9
+ * - Persist and restore the catalog across restarts (`saveSnapshot()`,
10
+ * `loadSnapshot()`)
11
+ * - Emit change events on hot-reload (`watch()`)
12
+ * - Allow out-of-band annotation of conductor-extension metadata (`annotate()`)
13
+ *
14
+ * @module registry/registry
15
+ */
16
+ import { logger } from '../utils/index.js';
17
+ import { RegistryEmitter } from './events.js';
18
+ import { validateToolInput } from './validator.js';
19
+ import { saveSnapshot as persistSnapshot, loadSnapshot as restoreSnapshot, } from './snapshot.js';
20
+ import { generateServerTypes, generateIndexTypes, writeTypesToDir as writeTypeFiles, } from './typegen.js';
21
+ export class ToolRegistry {
22
+ catalog = new Map();
23
+ emitter = new RegistryEmitter();
24
+ options;
25
+ /** Stable catalog key: `<server>/<name>` */
26
+ static key(server, name) {
27
+ return `${server}/${name}`;
28
+ }
29
+ constructor(options) {
30
+ this.options = {
31
+ snapshotPath: '',
32
+ typesDir: '',
33
+ validateInputs: true,
34
+ regenerateOnConnect: true,
35
+ ...options,
36
+ };
37
+ // Wire hot-reload listeners: when a backend reconnects, re-fetch its
38
+ // tools, diff against the current catalog, emit change events, and
39
+ // optionally regenerate .d.ts files.
40
+ const onConnect = async (serverName) => {
41
+ logger.debug(`ToolRegistry: server reconnected — refreshing ${serverName}`);
42
+ await this.refreshServer(serverName);
43
+ if (this.options.regenerateOnConnect && this.options.typesDir) {
44
+ try {
45
+ await this.writeTypesToDir(this.options.typesDir);
46
+ }
47
+ catch (err) {
48
+ logger.warn(`ToolRegistry: type regeneration failed for ${serverName}`, {
49
+ error: String(err),
50
+ });
51
+ }
52
+ }
53
+ };
54
+ const onDisconnect = (serverName) => {
55
+ this.emitter.emit('change', {
56
+ type: 'server-disconnected',
57
+ server: serverName,
58
+ at: Date.now(),
59
+ });
60
+ };
61
+ this.options.bridge.on('serverConnected', onConnect);
62
+ this.options.bridge.on('serverDisconnected', onDisconnect);
63
+ }
64
+ // ─────────────────────────────────────────────────────────────────────────
65
+ // Refresh
66
+ // ─────────────────────────────────────────────────────────────────────────
67
+ /**
68
+ * Populate the catalog from all currently-connected backends.
69
+ * Errors from individual backends are logged and skipped — the registry
70
+ * always ends in a consistent state.
71
+ * Returns the full catalog after refresh.
72
+ */
73
+ async refresh() {
74
+ const servers = this.options.bridge.listServers();
75
+ await Promise.all(servers
76
+ .filter((s) => s.status === 'connected')
77
+ .map((s) => this.refreshServer(s.name)));
78
+ return this.getAllTools();
79
+ }
80
+ /**
81
+ * Refresh a single server's tools, diffing against the current catalog
82
+ * and emitting per-tool change events.
83
+ */
84
+ async refreshServer(serverName) {
85
+ let rawTools;
86
+ try {
87
+ rawTools = this.options.bridge.getServerTools(serverName);
88
+ }
89
+ catch (err) {
90
+ logger.warn(`ToolRegistry: failed to fetch tools for ${serverName}`, {
91
+ error: String(err),
92
+ });
93
+ return;
94
+ }
95
+ const incoming = new Map();
96
+ for (const raw of rawTools) {
97
+ const def = {
98
+ server: serverName,
99
+ name: raw.name,
100
+ description: raw.description ?? '',
101
+ inputSchema: raw.inputSchema ?? {},
102
+ ...(raw.outputSchema ? { outputSchema: raw.outputSchema } : {}),
103
+ };
104
+ // Preserve existing conductor-extension metadata (annotations survive refresh)
105
+ const existing = this.catalog.get(ToolRegistry.key(serverName, raw.name));
106
+ if (existing) {
107
+ def.cost = existing.cost;
108
+ def.cacheable = existing.cacheable;
109
+ def.cacheTtl = existing.cacheTtl;
110
+ def.reliability = existing.reliability;
111
+ def.routing = existing.routing;
112
+ def.redact = existing.redact;
113
+ def.examples = existing.examples;
114
+ }
115
+ incoming.set(ToolRegistry.key(serverName, raw.name), def);
116
+ }
117
+ // Keys currently in the catalog for this server
118
+ const currentKeys = new Set([...this.catalog.keys()].filter((k) => k.startsWith(`${serverName}/`)));
119
+ // Detect removed tools
120
+ for (const key of currentKeys) {
121
+ if (!incoming.has(key)) {
122
+ const before = this.catalog.get(key);
123
+ this.catalog.delete(key);
124
+ this.emit({ type: 'tool-removed', server: serverName, tool: before.name, before });
125
+ }
126
+ }
127
+ // Detect added / updated tools
128
+ for (const [key, def] of incoming) {
129
+ const existing = this.catalog.get(key);
130
+ if (!existing) {
131
+ this.catalog.set(key, def);
132
+ this.emit({ type: 'tool-added', server: serverName, tool: def.name, after: def });
133
+ }
134
+ else if (existing.description !== def.description ||
135
+ JSON.stringify(existing.inputSchema) !== JSON.stringify(def.inputSchema)) {
136
+ this.catalog.set(key, def);
137
+ this.emit({
138
+ type: 'tool-updated',
139
+ server: serverName,
140
+ tool: def.name,
141
+ before: existing,
142
+ after: def,
143
+ });
144
+ }
145
+ else {
146
+ // No schema change — update in-place so any raw value changes land
147
+ this.catalog.set(key, def);
148
+ }
149
+ }
150
+ this.emit({ type: 'server-connected', server: serverName });
151
+ logger.debug(`ToolRegistry: refreshed ${serverName}`, { toolCount: incoming.size });
152
+ }
153
+ emit(event) {
154
+ this.emitter.emit('change', { ...event, at: Date.now() });
155
+ }
156
+ // ─────────────────────────────────────────────────────────────────────────
157
+ // Lookup
158
+ // ─────────────────────────────────────────────────────────────────────────
159
+ /** Look up a single tool. Returns null if not found. */
160
+ getTool(server, name) {
161
+ return this.catalog.get(ToolRegistry.key(server, name)) ?? null;
162
+ }
163
+ /** All tools across all servers as a flat array. */
164
+ getAllTools() {
165
+ return [...this.catalog.values()];
166
+ }
167
+ /** Tools for a specific server. */
168
+ getServerTools(server) {
169
+ return [...this.catalog.values()].filter((t) => t.server === server);
170
+ }
171
+ // ─────────────────────────────────────────────────────────────────────────
172
+ // Validation
173
+ // ─────────────────────────────────────────────────────────────────────────
174
+ /**
175
+ * Validate input args against the tool's inputSchema.
176
+ * Returns `{ valid: true }` for unknown tools (fail-open).
177
+ * When `validateInputs: false`, always returns `{ valid: true }`.
178
+ */
179
+ validateInput(server, name, args) {
180
+ if (!this.options.validateInputs) {
181
+ return { valid: true };
182
+ }
183
+ return validateToolInput(this.getTool(server, name), args);
184
+ }
185
+ // ─────────────────────────────────────────────────────────────────────────
186
+ // Type generation
187
+ // ─────────────────────────────────────────────────────────────────────────
188
+ /**
189
+ * Generate combined TypeScript declarations for all servers as a single string.
190
+ * Use `writeTypesToDir()` for writing to disk.
191
+ */
192
+ async generateTypes() {
193
+ const sections = [];
194
+ const names = this.uniqueServerNames();
195
+ for (const serverName of names) {
196
+ sections.push(await generateServerTypes(serverName, this.getServerTools(serverName)));
197
+ }
198
+ sections.push(generateIndexTypes(names));
199
+ return sections.join('\n');
200
+ }
201
+ /**
202
+ * Write generated .d.ts and .routing.json files to `dir`.
203
+ * Creates `dir` if it does not exist.
204
+ * Returns the list of written file paths.
205
+ */
206
+ async writeTypesToDir(dir) {
207
+ const toolsByServer = new Map();
208
+ for (const name of this.uniqueServerNames()) {
209
+ toolsByServer.set(name, this.getServerTools(name));
210
+ }
211
+ return writeTypeFiles(dir, toolsByServer);
212
+ }
213
+ uniqueServerNames() {
214
+ return [...new Set([...this.catalog.values()].map((t) => t.server))];
215
+ }
216
+ // ─────────────────────────────────────────────────────────────────────────
217
+ // Watch
218
+ // ─────────────────────────────────────────────────────────────────────────
219
+ /**
220
+ * Subscribe to registry change events.
221
+ * Returns an object with `unsubscribe()` for cleanup.
222
+ */
223
+ watch(callback) {
224
+ this.emitter.on('change', callback);
225
+ return { unsubscribe: () => this.emitter.off('change', callback) };
226
+ }
227
+ // ─────────────────────────────────────────────────────────────────────────
228
+ // Snapshot persistence
229
+ // ─────────────────────────────────────────────────────────────────────────
230
+ /**
231
+ * Persist the current catalog to disk.
232
+ * Uses `options.snapshotPath` when `path` is omitted.
233
+ */
234
+ async saveSnapshot(path) {
235
+ const target = path ?? this.options.snapshotPath;
236
+ if (!target)
237
+ throw new Error('ToolRegistry.saveSnapshot: no snapshotPath configured');
238
+ await persistSnapshot(target, this.getAllTools());
239
+ logger.debug(`ToolRegistry: snapshot saved to ${target}`);
240
+ }
241
+ /**
242
+ * Load a previously saved snapshot from disk.
243
+ * Falls back silently when the file is missing, malformed, or version-mismatched.
244
+ */
245
+ async loadSnapshot(path) {
246
+ const target = path ?? this.options.snapshotPath;
247
+ if (!target)
248
+ return;
249
+ const catalog = await restoreSnapshot(target);
250
+ if (catalog === null) {
251
+ logger.debug(`ToolRegistry: no valid snapshot at ${target} — will refresh from backends`);
252
+ return;
253
+ }
254
+ for (const def of catalog) {
255
+ const key = ToolRegistry.key(def.server, def.name);
256
+ if (!this.catalog.has(key)) {
257
+ this.catalog.set(key, def);
258
+ }
259
+ }
260
+ logger.debug(`ToolRegistry: loaded ${catalog.length} tools from snapshot at ${target}`);
261
+ }
262
+ // ─────────────────────────────────────────────────────────────────────────
263
+ // Annotations
264
+ // ─────────────────────────────────────────────────────────────────────────
265
+ /**
266
+ * Update conductor-extension metadata for a tool.
267
+ * Annotations persist across `refresh()` calls.
268
+ * Calling `annotate()` for an unknown tool is a no-op (metadata will be
269
+ * applied the next time the tool appears via refresh).
270
+ */
271
+ annotate(server, name, metadata) {
272
+ const key = ToolRegistry.key(server, name);
273
+ const existing = this.catalog.get(key);
274
+ if (!existing) {
275
+ logger.debug(`ToolRegistry.annotate: tool not yet in catalog — ${key}`);
276
+ return;
277
+ }
278
+ const allowed = [
279
+ 'cost',
280
+ 'cacheable',
281
+ 'cacheTtl',
282
+ 'reliability',
283
+ 'routing',
284
+ 'redact',
285
+ 'examples',
286
+ ];
287
+ for (const field of allowed) {
288
+ if (field in metadata) {
289
+ existing[field] = metadata[field];
290
+ }
291
+ }
292
+ }
293
+ }
294
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
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 type { ToolDefinition } from './index.js';
17
+ /** Bump this when the ToolDefinition shape changes in a breaking way. */
18
+ export declare const SNAPSHOT_VERSION = "1";
19
+ export interface SnapshotFile {
20
+ version: string;
21
+ savedAt: number;
22
+ catalog: ToolDefinition[];
23
+ }
24
+ /**
25
+ * Persist `catalog` to `path` as a formatted JSON file.
26
+ * Creates intermediate directories if needed.
27
+ * Throws on I/O error — callers should handle gracefully.
28
+ */
29
+ export declare function saveSnapshot(path: string, catalog: ToolDefinition[]): Promise<void>;
30
+ /**
31
+ * Load a previously saved snapshot from `path`.
32
+ *
33
+ * Returns the catalog if the file exists and the version matches.
34
+ * Returns `null` if:
35
+ * - The file does not exist
36
+ * - The file is not valid JSON
37
+ * - The version field is missing or does not match SNAPSHOT_VERSION
38
+ *
39
+ * Never throws — callers fall back to a live refresh on null.
40
+ */
41
+ export declare function loadSnapshot(path: string): Promise<ToolDefinition[] | null>;
42
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/registry/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CA4BjF"}