@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,34 @@
1
+ /**
2
+ * Per-tool TTL policy for the cache layer.
3
+ *
4
+ * Policy resolution order (highest priority first):
5
+ * 1. ToolDefinition.cacheable === false → never cache (return 0)
6
+ * 2. ToolDefinition.cacheTtl → explicit per-tool TTL
7
+ * 3. Per-server config overrides (from CacheLayerOptions.policies)
8
+ * 4. Default pattern table (mutations → 0, read patterns → ms per table below)
9
+ *
10
+ * TTL of 0 means "do not cache".
11
+ *
12
+ * @module cache/policy
13
+ */
14
+ import type { ToolDefinition } from '../registry/index.js';
15
+ /** Fallback TTL for tools that match none of the patterns above. */
16
+ export declare const DEFAULT_TTL_MS: number;
17
+ export type ServerPolicies = Record<string, Record<string, number>>;
18
+ /**
19
+ * Determine the effective TTL in milliseconds for a tool call.
20
+ *
21
+ * Returns 0 when the result must not be cached (mutations or
22
+ * `cacheable: false` annotation).
23
+ */
24
+ export declare function resolveTtl(tool: ToolDefinition | null | undefined, serverPolicies?: ServerPolicies): number;
25
+ /**
26
+ * Determine the default TTL from the tool-name pattern table.
27
+ * Public so tests can verify the defaults independently of ToolDefinition.
28
+ */
29
+ export declare function defaultTtlForName(toolName: string): number;
30
+ /**
31
+ * Returns true when this tool should be cached (TTL > 0).
32
+ */
33
+ export declare function isCacheable(tool: ToolDefinition | null | undefined, serverPolicies?: ServerPolicies): boolean;
34
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/cache/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAyB3D,oEAAoE;AACpE,eAAO,MAAM,cAAc,QAAY,CAAC;AAIxC,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAIpE;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,cAAc,CAAC,EAAE,cAAc,GAC9B,MAAM,CAuBR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuB1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAET"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Per-tool TTL policy for the cache layer.
3
+ *
4
+ * Policy resolution order (highest priority first):
5
+ * 1. ToolDefinition.cacheable === false → never cache (return 0)
6
+ * 2. ToolDefinition.cacheTtl → explicit per-tool TTL
7
+ * 3. Per-server config overrides (from CacheLayerOptions.policies)
8
+ * 4. Default pattern table (mutations → 0, read patterns → ms per table below)
9
+ *
10
+ * TTL of 0 means "do not cache".
11
+ *
12
+ * @module cache/policy
13
+ */
14
+ // ─── Default TTL table (milliseconds) ────────────────────────────────────────
15
+ /**
16
+ * Substrings that identify mutation tools.
17
+ * Checked against both prefixes (create_issue) and suffixes (issue_create)
18
+ * to handle both MCP naming conventions.
19
+ */
20
+ const MUTATION_SUBSTRINGS = [
21
+ 'create', 'update', 'delete', 'remove', 'add_', '_add',
22
+ 'write', 'push', 'insert', 'patch', 'put', 'post',
23
+ 'set_', 'reset', 'clear', 'archive', 'restore', 'move',
24
+ ];
25
+ /** Glob-style prefix patterns with their default TTLs. */
26
+ const PREFIX_TTL_TABLE = [
27
+ { prefix: 'list_', ttlMs: 5 * 60 * 1000 }, // 5 min — listings change infrequently
28
+ { prefix: 'search_', ttlMs: 5 * 60 * 1000 }, // 5 min
29
+ { prefix: 'get_', ttlMs: 60 * 1000 }, // 1 min — identity-stable reads
30
+ { prefix: 'read_', ttlMs: 60 * 1000 }, // 1 min — file reads
31
+ { prefix: 'query_', ttlMs: 30 * 1000 }, // 30 sec — DB freshness/perf balance
32
+ { prefix: 'fetch_', ttlMs: 30 * 1000 }, // 30 sec
33
+ ];
34
+ /** Fallback TTL for tools that match none of the patterns above. */
35
+ export const DEFAULT_TTL_MS = 30 * 1000; // 30 sec
36
+ // ─── Resolution ──────────────────────────────────────────────────────────────
37
+ /**
38
+ * Determine the effective TTL in milliseconds for a tool call.
39
+ *
40
+ * Returns 0 when the result must not be cached (mutations or
41
+ * `cacheable: false` annotation).
42
+ */
43
+ export function resolveTtl(tool, serverPolicies) {
44
+ const toolName = tool?.name ?? '';
45
+ // 1. Explicit cacheable:false annotation → never cache
46
+ if (tool && tool.cacheable === false) {
47
+ return 0;
48
+ }
49
+ // 2. Explicit cacheTtl annotation (cacheable must not be false)
50
+ if (tool && typeof tool.cacheTtl === 'number') {
51
+ return tool.cacheTtl;
52
+ }
53
+ // 3. Per-server policy override from config
54
+ if (tool && serverPolicies) {
55
+ const serverOverrides = serverPolicies[tool.server];
56
+ if (serverOverrides && typeof serverOverrides[toolName] === 'number') {
57
+ return serverOverrides[toolName];
58
+ }
59
+ }
60
+ // 4. Default pattern table
61
+ return defaultTtlForName(toolName);
62
+ }
63
+ /**
64
+ * Determine the default TTL from the tool-name pattern table.
65
+ * Public so tests can verify the defaults independently of ToolDefinition.
66
+ */
67
+ export function defaultTtlForName(toolName) {
68
+ const lower = toolName.toLowerCase();
69
+ // Mutations are never cached — check for mutation substrings
70
+ for (const sub of MUTATION_SUBSTRINGS) {
71
+ // Match whole-word boundaries: either at start, end, or adjacent to underscore
72
+ const idx = lower.indexOf(sub);
73
+ if (idx >= 0) {
74
+ const before = idx === 0 ? '_' : lower[idx - 1];
75
+ const after = idx + sub.length >= lower.length ? '_' : lower[idx + sub.length];
76
+ // Accept if the mutation word is at a word boundary (underscore or string edge)
77
+ if ((before === '_' || idx === 0) && (after === '_' || idx + sub.length === lower.length)) {
78
+ return 0;
79
+ }
80
+ }
81
+ }
82
+ // Prefix match for read-like tools
83
+ for (const { prefix, ttlMs } of PREFIX_TTL_TABLE) {
84
+ if (lower.startsWith(prefix))
85
+ return ttlMs;
86
+ }
87
+ return DEFAULT_TTL_MS;
88
+ }
89
+ /**
90
+ * Returns true when this tool should be cached (TTL > 0).
91
+ */
92
+ export function isCacheable(tool, serverPolicies) {
93
+ return resolveTtl(tool, serverPolicies) > 0;
94
+ }
95
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/cache/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * doctor command: actionable health report across all configured servers.
3
+ * @module cli/commands/doctor
4
+ */
5
+ export interface ServerHealthEntry {
6
+ name: string;
7
+ command: string;
8
+ args: string[];
9
+ commandFound: boolean;
10
+ status: 'ok' | 'warn' | 'error';
11
+ issues: string[];
12
+ suggestions: string[];
13
+ }
14
+ export interface DoctorResult {
15
+ conductorConfigFound: boolean;
16
+ conductorConfigPath: string;
17
+ serverCount: number;
18
+ healthyCount: number;
19
+ warnCount: number;
20
+ errorCount: number;
21
+ servers: ServerHealthEntry[];
22
+ globalIssues: string[];
23
+ }
24
+ /**
25
+ * Run a health check on all configured MCP servers.
26
+ * Non-connecting — just inspects config structure.
27
+ */
28
+ export declare function runDoctor(): DoctorResult;
29
+ /**
30
+ * Format doctor results as human-readable text.
31
+ */
32
+ export declare function formatDoctorResults(result: DoctorResult): string;
33
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAgBD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,YAAY,CAyFxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiChE"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * doctor command: actionable health report across all configured servers.
3
+ * @module cli/commands/doctor
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { getDefaultConductorConfigPath, loadConductorConfig } from '../../config/index.js';
7
+ /**
8
+ * Check if a command is available on PATH or as an absolute path.
9
+ */
10
+ function isCommandAvailable(command) {
11
+ if (existsSync(command))
12
+ return true;
13
+ // For npx/node/python/etc — check via which-like lookup using PATH
14
+ // We do a simple check: if it contains a path separator it must exist as file.
15
+ if (command.includes('/') || command.includes('\\')) {
16
+ return existsSync(command);
17
+ }
18
+ // Otherwise assume available (we don't shell out here — tests would fail)
19
+ return true;
20
+ }
21
+ /**
22
+ * Run a health check on all configured MCP servers.
23
+ * Non-connecting — just inspects config structure.
24
+ */
25
+ export function runDoctor() {
26
+ const conductorConfigPath = getDefaultConductorConfigPath();
27
+ const conductorConfigFound = existsSync(conductorConfigPath);
28
+ const globalIssues = [];
29
+ if (!conductorConfigFound) {
30
+ return {
31
+ conductorConfigFound: false,
32
+ conductorConfigPath,
33
+ serverCount: 0,
34
+ healthyCount: 0,
35
+ warnCount: 0,
36
+ errorCount: 0,
37
+ servers: [],
38
+ globalIssues: [
39
+ `Conductor config not found at ${conductorConfigPath}`,
40
+ 'Run `mcp-conductor-cli setup` or `mcp-conductor-cli import` to create it.',
41
+ ],
42
+ };
43
+ }
44
+ const config = loadConductorConfig();
45
+ if (!config) {
46
+ return {
47
+ conductorConfigFound: true,
48
+ conductorConfigPath,
49
+ serverCount: 0,
50
+ healthyCount: 0,
51
+ warnCount: 0,
52
+ errorCount: 0,
53
+ servers: [],
54
+ globalIssues: ['Conductor config found but could not be parsed — check JSON syntax.'],
55
+ };
56
+ }
57
+ const servers = [];
58
+ for (const [name, def] of Object.entries(config.servers)) {
59
+ const issues = [];
60
+ const suggestions = [];
61
+ if (!def.command) {
62
+ issues.push('Missing `command` field');
63
+ suggestions.push('Add a `command` field to this server entry in ~/.mcp-conductor.json');
64
+ }
65
+ const cmdAvail = def.command ? isCommandAvailable(def.command) : false;
66
+ if (def.command && !cmdAvail) {
67
+ issues.push(`Command not found on PATH: ${def.command}`);
68
+ suggestions.push(`Ensure \`${def.command}\` is installed and available on PATH`);
69
+ }
70
+ // Check for env vars with placeholder values
71
+ for (const [k, v] of Object.entries(def.env ?? {})) {
72
+ if (v === 'YOUR_TOKEN_HERE' || v === '<YOUR_API_KEY>' || v === '') {
73
+ issues.push(`Env var ${k} appears unset or placeholder`);
74
+ suggestions.push(`Set a real value for ${k} in the server env config`);
75
+ }
76
+ }
77
+ const status = issues.length === 0 ? 'ok' :
78
+ issues.some((i) => i.includes('Missing') || i.includes('not found')) ? 'error' : 'warn';
79
+ servers.push({
80
+ name,
81
+ command: def.command ?? '',
82
+ args: def.args ?? [],
83
+ commandFound: cmdAvail,
84
+ status,
85
+ issues,
86
+ suggestions,
87
+ });
88
+ }
89
+ const healthyCount = servers.filter((s) => s.status === 'ok').length;
90
+ const warnCount = servers.filter((s) => s.status === 'warn').length;
91
+ const errorCount = servers.filter((s) => s.status === 'error').length;
92
+ return {
93
+ conductorConfigFound: true,
94
+ conductorConfigPath,
95
+ serverCount: servers.length,
96
+ healthyCount,
97
+ warnCount,
98
+ errorCount,
99
+ servers,
100
+ globalIssues,
101
+ };
102
+ }
103
+ /**
104
+ * Format doctor results as human-readable text.
105
+ */
106
+ export function formatDoctorResults(result) {
107
+ const lines = [];
108
+ if (!result.conductorConfigFound) {
109
+ lines.push('CONDUCTOR CONFIG: NOT FOUND');
110
+ for (const issue of result.globalIssues) {
111
+ lines.push(` ! ${issue}`);
112
+ }
113
+ return lines.join('\n');
114
+ }
115
+ lines.push(`CONDUCTOR CONFIG: ${result.conductorConfigPath}`);
116
+ lines.push(`SERVERS: ${result.serverCount} total — ${result.healthyCount} ok, ${result.warnCount} warn, ${result.errorCount} error\n`);
117
+ for (const server of result.servers) {
118
+ const icon = server.status === 'ok' ? 'OK' : server.status === 'warn' ? 'WARN' : 'ERROR';
119
+ lines.push(`[${icon}] ${server.name} (${server.command}${server.args.length ? ' ' + server.args.join(' ') : ''})`);
120
+ for (const issue of server.issues) {
121
+ lines.push(` Issue: ${issue}`);
122
+ }
123
+ for (const suggestion of server.suggestions) {
124
+ lines.push(` Fix: ${suggestion}`);
125
+ }
126
+ }
127
+ if (result.globalIssues.length > 0) {
128
+ lines.push('\nGlobal issues:');
129
+ for (const issue of result.globalIssues) {
130
+ lines.push(` ! ${issue}`);
131
+ }
132
+ }
133
+ return lines.join('\n');
134
+ }
135
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * export-servers command: generate mcpServers JSON pointing at mcp-conductor stdio.
3
+ * @module cli/commands/export-servers
4
+ */
5
+ export interface ExportOptions {
6
+ /** Output format: 'claude-desktop' | 'claude-code' | 'raw' */
7
+ format?: 'claude-desktop' | 'claude-code' | 'raw';
8
+ /** Path to conductor binary (defaults to npx @darkiceinteractive/mcp-conductor) */
9
+ conductorPath?: string;
10
+ }
11
+ export interface ExportResult {
12
+ json: string;
13
+ format: string;
14
+ serverCount: number;
15
+ }
16
+ /**
17
+ * Generate a mcpServers block that points Claude back at mcp-conductor stdio.
18
+ * This is the rollback path: if someone wants to undo the import, they paste
19
+ * this JSON back into their Claude config.
20
+ */
21
+ export declare function exportToClaude(options?: ExportOptions): ExportResult;
22
+ //# sourceMappingURL=export-servers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-servers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export-servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,gBAAgB,GAAG,aAAa,GAAG,KAAK,CAAC;IAClD,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAkCxE"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * export-servers command: generate mcpServers JSON pointing at mcp-conductor stdio.
3
+ * @module cli/commands/export-servers
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { loadConductorConfig, getDefaultConductorConfigPath } from '../../config/index.js';
7
+ /**
8
+ * Generate a mcpServers block that points Claude back at mcp-conductor stdio.
9
+ * This is the rollback path: if someone wants to undo the import, they paste
10
+ * this JSON back into their Claude config.
11
+ */
12
+ export function exportToClaude(options = {}) {
13
+ const conductorPath = getDefaultConductorConfigPath();
14
+ const hasConfig = existsSync(conductorPath);
15
+ const config = hasConfig ? loadConductorConfig() : null;
16
+ const serverCount = config ? Object.keys(config.servers).length : 0;
17
+ const format = options.format ?? 'claude-desktop';
18
+ const command = options.conductorPath ?? 'npx';
19
+ const args = options.conductorPath
20
+ ? []
21
+ : ['-y', '@darkiceinteractive/mcp-conductor'];
22
+ const mcpServersBlock = {
23
+ mcpServers: {
24
+ 'mcp-conductor': {
25
+ command,
26
+ args,
27
+ },
28
+ },
29
+ };
30
+ let json;
31
+ if (format === 'claude-code') {
32
+ // Claude Code uses a flat mcpServers object in settings.json
33
+ json = JSON.stringify({ mcpServers: mcpServersBlock.mcpServers }, null, 2);
34
+ }
35
+ else if (format === 'raw') {
36
+ // Just the inner mcpServers value
37
+ json = JSON.stringify(mcpServersBlock.mcpServers, null, 2);
38
+ }
39
+ else {
40
+ // claude-desktop format: full wrapper object
41
+ json = JSON.stringify(mcpServersBlock, null, 2);
42
+ }
43
+ return { json, format, serverCount };
44
+ }
45
+ //# sourceMappingURL=export-servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-servers.js","sourceRoot":"","sources":["../../../src/cli/commands/export-servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAe3F;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,UAAyB,EAAE;IACxD,MAAM,aAAa,GAAG,6BAA6B,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa;QAChC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;IAEhD,MAAM,eAAe,GAAG;QACtB,UAAU,EAAE;YACV,eAAe,EAAE;gBACf,OAAO;gBACP,IAAI;aACL;SACF;KACF,CAAC;IAEF,IAAI,IAAY,CAAC;IACjB,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,6DAA6D;QAC7D,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,kCAAkC;QAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * import-servers command: read Claude config files, show diff, copy to ~/.mcp-conductor.json
3
+ * @module cli/commands/import-servers
4
+ */
5
+ export interface ImportOptions {
6
+ /** Paths to search for Claude config (defaults to standard paths) */
7
+ configPaths?: string[];
8
+ /** Skip interactive confirmation — import immediately */
9
+ yes?: boolean;
10
+ /** Remove imported servers from source configs after import */
11
+ removeOriginals?: boolean;
12
+ /** Dry-run: show diff but don't write anything */
13
+ dryRun?: boolean;
14
+ }
15
+ export interface ServerEntry {
16
+ name: string;
17
+ command: string;
18
+ args?: string[];
19
+ env?: Record<string, string>;
20
+ }
21
+ export interface ImportResult {
22
+ imported: ServerEntry[];
23
+ skipped: string[];
24
+ sourcePath: string;
25
+ conductorPath: string;
26
+ backupPaths: string[];
27
+ removedFromSource: boolean;
28
+ }
29
+ /**
30
+ * Find all Claude config files that contain mcpServers.
31
+ */
32
+ export declare function findClaudeConfigsWithServers(configPaths?: string[]): Array<{
33
+ path: string;
34
+ servers: Record<string, {
35
+ command: string;
36
+ args?: string[];
37
+ env?: Record<string, string>;
38
+ }>;
39
+ }>;
40
+ /**
41
+ * Write a .bak file alongside the original.
42
+ */
43
+ export declare function writeBackup(filePath: string): string;
44
+ /**
45
+ * Strip named servers from a Claude config file.
46
+ */
47
+ export declare function stripServersFromConfig(filePath: string, serverNames: string[]): void;
48
+ /**
49
+ * Perform the import: merge servers from Claude configs into conductor config.
50
+ * Non-interactive (no prompts) — callers handle confirmation.
51
+ */
52
+ export declare function importServers(options?: ImportOptions): ImportResult[];
53
+ /**
54
+ * Format import results as human-readable text (for CLI output).
55
+ */
56
+ export declare function formatImportResults(results: ImportResult[], dryRun?: boolean): string;
57
+ //# sourceMappingURL=import-servers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-servers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import-servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,yDAAyD;IACzD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmBzL;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CASpF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE,CA8CzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,MAAM,UAAQ,GAAG,MAAM,CAuCnF"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * import-servers command: read Claude config files, show diff, copy to ~/.mcp-conductor.json
3
+ * @module cli/commands/import-servers
4
+ */
5
+ import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'node:fs';
6
+ import { safeJsonParse } from '../../utils/index.js';
7
+ import { getClaudeConfigPaths, getDefaultConductorConfigPath, loadConductorConfig, saveConductorConfig, } from '../../config/index.js';
8
+ /**
9
+ * Find all Claude config files that contain mcpServers.
10
+ */
11
+ export function findClaudeConfigsWithServers(configPaths) {
12
+ const paths = configPaths ?? getClaudeConfigPaths();
13
+ const found = [];
14
+ for (const p of paths) {
15
+ if (!existsSync(p))
16
+ continue;
17
+ try {
18
+ const content = readFileSync(p, 'utf-8');
19
+ const cfg = safeJsonParse(content, {});
20
+ const servers = cfg.mcpServers ?? {};
21
+ if (Object.keys(servers).length > 0) {
22
+ found.push({ path: p, servers });
23
+ }
24
+ }
25
+ catch {
26
+ // skip unreadable
27
+ }
28
+ }
29
+ return found;
30
+ }
31
+ /**
32
+ * Write a .bak file alongside the original.
33
+ */
34
+ export function writeBackup(filePath) {
35
+ const backupPath = `${filePath}.bak`;
36
+ copyFileSync(filePath, backupPath);
37
+ return backupPath;
38
+ }
39
+ /**
40
+ * Strip named servers from a Claude config file.
41
+ */
42
+ export function stripServersFromConfig(filePath, serverNames) {
43
+ if (!existsSync(filePath))
44
+ return;
45
+ const content = readFileSync(filePath, 'utf-8');
46
+ const cfg = safeJsonParse(content, {});
47
+ if (!cfg.mcpServers)
48
+ return;
49
+ for (const name of serverNames) {
50
+ delete cfg.mcpServers[name];
51
+ }
52
+ writeFileSync(filePath, JSON.stringify(cfg, null, 2), 'utf-8');
53
+ }
54
+ /**
55
+ * Perform the import: merge servers from Claude configs into conductor config.
56
+ * Non-interactive (no prompts) — callers handle confirmation.
57
+ */
58
+ export function importServers(options = {}) {
59
+ const sources = findClaudeConfigsWithServers(options.configPaths);
60
+ const conductorPath = getDefaultConductorConfigPath();
61
+ const results = [];
62
+ for (const source of sources) {
63
+ let conductorConfig = loadConductorConfig() ?? { exclusive: false, servers: {} };
64
+ const imported = [];
65
+ const skipped = [];
66
+ const backupPaths = [];
67
+ for (const [name, def] of Object.entries(source.servers)) {
68
+ if (conductorConfig.servers[name]) {
69
+ skipped.push(name);
70
+ continue;
71
+ }
72
+ conductorConfig.servers[name] = {
73
+ command: def.command,
74
+ args: def.args ?? [],
75
+ env: def.env ?? {},
76
+ };
77
+ imported.push({ name, command: def.command, args: def.args, env: def.env });
78
+ }
79
+ if (!options.dryRun && imported.length > 0) {
80
+ // Write .bak before touching source
81
+ backupPaths.push(writeBackup(source.path));
82
+ saveConductorConfig(conductorConfig, conductorPath);
83
+ if (options.removeOriginals) {
84
+ stripServersFromConfig(source.path, imported.map((s) => s.name));
85
+ }
86
+ }
87
+ results.push({
88
+ imported,
89
+ skipped,
90
+ sourcePath: source.path,
91
+ conductorPath,
92
+ backupPaths,
93
+ removedFromSource: !options.dryRun && !!options.removeOriginals && imported.length > 0,
94
+ });
95
+ }
96
+ return results;
97
+ }
98
+ /**
99
+ * Format import results as human-readable text (for CLI output).
100
+ */
101
+ export function formatImportResults(results, dryRun = false) {
102
+ if (results.length === 0) {
103
+ return 'No Claude config files with MCP servers found.';
104
+ }
105
+ const lines = [];
106
+ let totalImported = 0;
107
+ let totalSkipped = 0;
108
+ for (const r of results) {
109
+ lines.push(`\nSource: ${r.sourcePath}`);
110
+ if (r.imported.length > 0) {
111
+ lines.push(` ${dryRun ? 'Would import' : 'Imported'} (${r.imported.length}):`);
112
+ for (const s of r.imported) {
113
+ lines.push(` + ${s.name} [${s.command}${s.args?.length ? ' ' + s.args.join(' ') : ''}]`);
114
+ }
115
+ }
116
+ if (r.skipped.length > 0) {
117
+ lines.push(` Skipped (already in conductor) (${r.skipped.length}):`);
118
+ for (const s of r.skipped) {
119
+ lines.push(` ~ ${s}`);
120
+ }
121
+ }
122
+ if (!dryRun && r.backupPaths.length > 0) {
123
+ lines.push(` Backup written: ${r.backupPaths.join(', ')}`);
124
+ }
125
+ if (!dryRun && r.removedFromSource) {
126
+ lines.push(` Removed ${r.imported.length} server(s) from source config.`);
127
+ }
128
+ totalImported += r.imported.length;
129
+ totalSkipped += r.skipped.length;
130
+ }
131
+ lines.push(`\nTotal: ${totalImported} imported, ${totalSkipped} skipped.`);
132
+ if (!dryRun && totalImported > 0) {
133
+ lines.push(`Config written to: ${results[0]?.conductorPath ?? getDefaultConductorConfigPath()}`);
134
+ }
135
+ return lines.join('\n');
136
+ }
137
+ //# sourceMappingURL=import-servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-servers.js","sourceRoot":"","sources":["../../../src/cli/commands/import-servers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * routing command: heuristic per-tool routing recommendation.
3
+ * @module cli/commands/routing
4
+ */
5
+ export interface RoutingRecommendation {
6
+ serverName: string;
7
+ recommendation: 'passthrough' | 'execute_code';
8
+ reason: string;
9
+ }
10
+ export interface RoutingResult {
11
+ recommendations: RoutingRecommendation[];
12
+ applied: boolean;
13
+ configPath?: string;
14
+ }
15
+ /**
16
+ * Heuristic: servers whose names or typical tool shapes suggest small payloads
17
+ * should be marked passthrough. This is the X1 heuristic adapted for the CLI.
18
+ *
19
+ * Rule: if the server name matches known lightweight patterns (search, calendar,
20
+ * weather, echo, ping) → passthrough. Otherwise → execute_code.
21
+ *
22
+ * A more sophisticated version would sample live tool responses — this is the
23
+ * static heuristic that can be applied without connecting.
24
+ */
25
+ export declare function recommendRouting(serverName: string): RoutingRecommendation;
26
+ /**
27
+ * Generate routing recommendations for one or all configured servers.
28
+ * Optionally write the recommendations back to the conductor config.
29
+ */
30
+ export declare function getRoutingRecommendations(options: {
31
+ serverName?: string;
32
+ apply?: boolean;
33
+ }): RoutingResult;
34
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/routing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,aAAa,GAAG,cAAc,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,qBAAqB,EAAE,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAgB1E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,aAAa,CA4BhB"}