@darkiceinteractive/mcp-conductor 1.1.0 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) 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 +65 -1
  7. package/dist/bridge/http-server.d.ts.map +1 -1
  8. package/dist/bridge/http-server.js +192 -7
  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/bridge/session-registry.d.ts +64 -0
  19. package/dist/bridge/session-registry.d.ts.map +1 -0
  20. package/dist/bridge/session-registry.js +124 -0
  21. package/dist/bridge/session-registry.js.map +1 -0
  22. package/dist/cache/cache.d.ts +43 -0
  23. package/dist/cache/cache.d.ts.map +1 -0
  24. package/dist/cache/cache.js +167 -0
  25. package/dist/cache/cache.js.map +1 -0
  26. package/dist/cache/delta.d.ts +32 -0
  27. package/dist/cache/delta.d.ts.map +1 -0
  28. package/dist/cache/delta.js +131 -0
  29. package/dist/cache/delta.js.map +1 -0
  30. package/dist/cache/disk.d.ts +65 -0
  31. package/dist/cache/disk.d.ts.map +1 -0
  32. package/dist/cache/disk.js +238 -0
  33. package/dist/cache/disk.js.map +1 -0
  34. package/dist/cache/index.d.ts +53 -0
  35. package/dist/cache/index.d.ts.map +1 -0
  36. package/dist/cache/index.js +12 -0
  37. package/dist/cache/index.js.map +1 -0
  38. package/dist/cache/key.d.ts +44 -0
  39. package/dist/cache/key.d.ts.map +1 -0
  40. package/dist/cache/key.js +83 -0
  41. package/dist/cache/key.js.map +1 -0
  42. package/dist/cache/lru.d.ts +57 -0
  43. package/dist/cache/lru.d.ts.map +1 -0
  44. package/dist/cache/lru.js +112 -0
  45. package/dist/cache/lru.js.map +1 -0
  46. package/dist/cache/policy.d.ts +34 -0
  47. package/dist/cache/policy.d.ts.map +1 -0
  48. package/dist/cache/policy.js +95 -0
  49. package/dist/cache/policy.js.map +1 -0
  50. package/dist/cli/commands/doctor.d.ts +33 -0
  51. package/dist/cli/commands/doctor.d.ts.map +1 -0
  52. package/dist/cli/commands/doctor.js +135 -0
  53. package/dist/cli/commands/doctor.js.map +1 -0
  54. package/dist/cli/commands/export-servers.d.ts +22 -0
  55. package/dist/cli/commands/export-servers.d.ts.map +1 -0
  56. package/dist/cli/commands/export-servers.js +45 -0
  57. package/dist/cli/commands/export-servers.js.map +1 -0
  58. package/dist/cli/commands/import-servers.d.ts +57 -0
  59. package/dist/cli/commands/import-servers.d.ts.map +1 -0
  60. package/dist/cli/commands/import-servers.js +137 -0
  61. package/dist/cli/commands/import-servers.js.map +1 -0
  62. package/dist/cli/commands/routing.d.ts +34 -0
  63. package/dist/cli/commands/routing.d.ts.map +1 -0
  64. package/dist/cli/commands/routing.js +60 -0
  65. package/dist/cli/commands/routing.js.map +1 -0
  66. package/dist/cli/commands/test-server.d.ts +34 -0
  67. package/dist/cli/commands/test-server.d.ts.map +1 -0
  68. package/dist/cli/commands/test-server.js +86 -0
  69. package/dist/cli/commands/test-server.js.map +1 -0
  70. package/dist/cli/daemon.d.ts +60 -0
  71. package/dist/cli/daemon.d.ts.map +1 -0
  72. package/dist/cli/daemon.js +244 -0
  73. package/dist/cli/daemon.js.map +1 -0
  74. package/dist/cli/replay.d.ts +16 -0
  75. package/dist/cli/replay.d.ts.map +1 -0
  76. package/dist/cli/replay.js +89 -0
  77. package/dist/cli/replay.js.map +1 -0
  78. package/dist/cli/wizard/setup.d.ts +12 -0
  79. package/dist/cli/wizard/setup.d.ts.map +1 -0
  80. package/dist/cli/wizard/setup.js +71 -0
  81. package/dist/cli/wizard/setup.js.map +1 -0
  82. package/dist/config/defaults.d.ts +10 -0
  83. package/dist/config/defaults.d.ts.map +1 -1
  84. package/dist/config/defaults.js +14 -1
  85. package/dist/config/defaults.js.map +1 -1
  86. package/dist/config/schema.d.ts +34 -0
  87. package/dist/config/schema.d.ts.map +1 -1
  88. package/dist/daemon/client.d.ts +97 -0
  89. package/dist/daemon/client.d.ts.map +1 -0
  90. package/dist/daemon/client.js +279 -0
  91. package/dist/daemon/client.js.map +1 -0
  92. package/dist/daemon/discovery.d.ts +50 -0
  93. package/dist/daemon/discovery.d.ts.map +1 -0
  94. package/dist/daemon/discovery.js +104 -0
  95. package/dist/daemon/discovery.js.map +1 -0
  96. package/dist/daemon/index.d.ts +16 -0
  97. package/dist/daemon/index.d.ts.map +1 -0
  98. package/dist/daemon/index.js +11 -0
  99. package/dist/daemon/index.js.map +1 -0
  100. package/dist/daemon/sandbox-api.d.ts +45 -0
  101. package/dist/daemon/sandbox-api.d.ts.map +1 -0
  102. package/dist/daemon/sandbox-api.js +74 -0
  103. package/dist/daemon/sandbox-api.js.map +1 -0
  104. package/dist/daemon/server.d.ts +65 -0
  105. package/dist/daemon/server.d.ts.map +1 -0
  106. package/dist/daemon/server.js +351 -0
  107. package/dist/daemon/server.js.map +1 -0
  108. package/dist/daemon/shared-kv.d.ts +81 -0
  109. package/dist/daemon/shared-kv.d.ts.map +1 -0
  110. package/dist/daemon/shared-kv.js +215 -0
  111. package/dist/daemon/shared-kv.js.map +1 -0
  112. package/dist/daemon/shared-lock.d.ts +71 -0
  113. package/dist/daemon/shared-lock.d.ts.map +1 -0
  114. package/dist/daemon/shared-lock.js +119 -0
  115. package/dist/daemon/shared-lock.js.map +1 -0
  116. package/dist/hub/mcp-hub.d.ts +23 -0
  117. package/dist/hub/mcp-hub.d.ts.map +1 -1
  118. package/dist/hub/mcp-hub.js +34 -1
  119. package/dist/hub/mcp-hub.js.map +1 -1
  120. package/dist/index.js +19 -0
  121. package/dist/index.js.map +1 -1
  122. package/dist/observability/anomaly.d.ts +67 -0
  123. package/dist/observability/anomaly.d.ts.map +1 -0
  124. package/dist/observability/anomaly.js +141 -0
  125. package/dist/observability/anomaly.js.map +1 -0
  126. package/dist/observability/cost-predictor.d.ts +49 -0
  127. package/dist/observability/cost-predictor.d.ts.map +1 -0
  128. package/dist/observability/cost-predictor.js +145 -0
  129. package/dist/observability/cost-predictor.js.map +1 -0
  130. package/dist/observability/hot-path.d.ts +49 -0
  131. package/dist/observability/hot-path.d.ts.map +1 -0
  132. package/dist/observability/hot-path.js +125 -0
  133. package/dist/observability/hot-path.js.map +1 -0
  134. package/dist/observability/index.d.ts +10 -0
  135. package/dist/observability/index.d.ts.map +1 -0
  136. package/dist/observability/index.js +10 -0
  137. package/dist/observability/index.js.map +1 -0
  138. package/dist/observability/replay.d.ts +104 -0
  139. package/dist/observability/replay.d.ts.map +1 -0
  140. package/dist/observability/replay.js +239 -0
  141. package/dist/observability/replay.js.map +1 -0
  142. package/dist/registry/built-in-recommendations.d.ts +54 -0
  143. package/dist/registry/built-in-recommendations.d.ts.map +1 -0
  144. package/dist/registry/built-in-recommendations.js +65 -0
  145. package/dist/registry/built-in-recommendations.js.map +1 -0
  146. package/dist/registry/events.d.ts +26 -0
  147. package/dist/registry/events.d.ts.map +1 -0
  148. package/dist/registry/events.js +22 -0
  149. package/dist/registry/events.js.map +1 -0
  150. package/dist/registry/index.d.ts +159 -0
  151. package/dist/registry/index.d.ts.map +1 -0
  152. package/dist/registry/index.js +12 -0
  153. package/dist/registry/index.js.map +1 -0
  154. package/dist/registry/registry.d.ts +87 -0
  155. package/dist/registry/registry.d.ts.map +1 -0
  156. package/dist/registry/registry.js +294 -0
  157. package/dist/registry/registry.js.map +1 -0
  158. package/dist/registry/snapshot.d.ts +42 -0
  159. package/dist/registry/snapshot.d.ts.map +1 -0
  160. package/dist/registry/snapshot.js +71 -0
  161. package/dist/registry/snapshot.js.map +1 -0
  162. package/dist/registry/typegen.d.ts +48 -0
  163. package/dist/registry/typegen.d.ts.map +1 -0
  164. package/dist/registry/typegen.js +200 -0
  165. package/dist/registry/typegen.js.map +1 -0
  166. package/dist/registry/validator.d.ts +23 -0
  167. package/dist/registry/validator.d.ts.map +1 -0
  168. package/dist/registry/validator.js +50 -0
  169. package/dist/registry/validator.js.map +1 -0
  170. package/dist/reliability/breaker.d.ts +57 -0
  171. package/dist/reliability/breaker.d.ts.map +1 -0
  172. package/dist/reliability/breaker.js +130 -0
  173. package/dist/reliability/breaker.js.map +1 -0
  174. package/dist/reliability/errors.d.ts +78 -0
  175. package/dist/reliability/errors.d.ts.map +1 -0
  176. package/dist/reliability/errors.js +160 -0
  177. package/dist/reliability/errors.js.map +1 -0
  178. package/dist/reliability/gateway.d.ts +88 -0
  179. package/dist/reliability/gateway.d.ts.map +1 -0
  180. package/dist/reliability/gateway.js +180 -0
  181. package/dist/reliability/gateway.js.map +1 -0
  182. package/dist/reliability/index.d.ts +20 -0
  183. package/dist/reliability/index.d.ts.map +1 -0
  184. package/dist/reliability/index.js +16 -0
  185. package/dist/reliability/index.js.map +1 -0
  186. package/dist/reliability/profile.d.ts +49 -0
  187. package/dist/reliability/profile.d.ts.map +1 -0
  188. package/dist/reliability/profile.js +58 -0
  189. package/dist/reliability/profile.js.map +1 -0
  190. package/dist/reliability/retry.d.ts +39 -0
  191. package/dist/reliability/retry.d.ts.map +1 -0
  192. package/dist/reliability/retry.js +51 -0
  193. package/dist/reliability/retry.js.map +1 -0
  194. package/dist/reliability/timeout.d.ts +34 -0
  195. package/dist/reliability/timeout.d.ts.map +1 -0
  196. package/dist/reliability/timeout.js +53 -0
  197. package/dist/reliability/timeout.js.map +1 -0
  198. package/dist/runtime/executor.d.ts +12 -0
  199. package/dist/runtime/executor.d.ts.map +1 -1
  200. package/dist/runtime/executor.js +148 -16
  201. package/dist/runtime/executor.js.map +1 -1
  202. package/dist/runtime/findtool/embed.d.ts +28 -0
  203. package/dist/runtime/findtool/embed.d.ts.map +1 -0
  204. package/dist/runtime/findtool/embed.js +85 -0
  205. package/dist/runtime/findtool/embed.js.map +1 -0
  206. package/dist/runtime/findtool/index.d.ts +52 -0
  207. package/dist/runtime/findtool/index.d.ts.map +1 -0
  208. package/dist/runtime/findtool/index.js +78 -0
  209. package/dist/runtime/findtool/index.js.map +1 -0
  210. package/dist/runtime/findtool/vector-index.d.ts +53 -0
  211. package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
  212. package/dist/runtime/findtool/vector-index.js +71 -0
  213. package/dist/runtime/findtool/vector-index.js.map +1 -0
  214. package/dist/runtime/helpers/budget.d.ts +27 -0
  215. package/dist/runtime/helpers/budget.d.ts.map +1 -0
  216. package/dist/runtime/helpers/budget.js +103 -0
  217. package/dist/runtime/helpers/budget.js.map +1 -0
  218. package/dist/runtime/helpers/compact.d.ts +32 -0
  219. package/dist/runtime/helpers/compact.d.ts.map +1 -0
  220. package/dist/runtime/helpers/compact.js +93 -0
  221. package/dist/runtime/helpers/compact.js.map +1 -0
  222. package/dist/runtime/helpers/delta.d.ts +45 -0
  223. package/dist/runtime/helpers/delta.d.ts.map +1 -0
  224. package/dist/runtime/helpers/delta.js +116 -0
  225. package/dist/runtime/helpers/delta.js.map +1 -0
  226. package/dist/runtime/helpers/index.d.ts +16 -0
  227. package/dist/runtime/helpers/index.d.ts.map +1 -0
  228. package/dist/runtime/helpers/index.js +13 -0
  229. package/dist/runtime/helpers/index.js.map +1 -0
  230. package/dist/runtime/helpers/summarize.d.ts +24 -0
  231. package/dist/runtime/helpers/summarize.d.ts.map +1 -0
  232. package/dist/runtime/helpers/summarize.js +124 -0
  233. package/dist/runtime/helpers/summarize.js.map +1 -0
  234. package/dist/runtime/helpers/worker-preload.d.ts +25 -0
  235. package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
  236. package/dist/runtime/helpers/worker-preload.js +223 -0
  237. package/dist/runtime/helpers/worker-preload.js.map +1 -0
  238. package/dist/runtime/index.d.ts +1 -0
  239. package/dist/runtime/index.d.ts.map +1 -1
  240. package/dist/runtime/index.js +1 -0
  241. package/dist/runtime/index.js.map +1 -1
  242. package/dist/runtime/pool/index.d.ts +11 -0
  243. package/dist/runtime/pool/index.d.ts.map +1 -0
  244. package/dist/runtime/pool/index.js +8 -0
  245. package/dist/runtime/pool/index.js.map +1 -0
  246. package/dist/runtime/pool/recycle.d.ts +44 -0
  247. package/dist/runtime/pool/recycle.d.ts.map +1 -0
  248. package/dist/runtime/pool/recycle.js +50 -0
  249. package/dist/runtime/pool/recycle.js.map +1 -0
  250. package/dist/runtime/pool/worker-pool.d.ts +77 -0
  251. package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
  252. package/dist/runtime/pool/worker-pool.js +216 -0
  253. package/dist/runtime/pool/worker-pool.js.map +1 -0
  254. package/dist/runtime/pool/worker.d.ts +80 -0
  255. package/dist/runtime/pool/worker.d.ts.map +1 -0
  256. package/dist/runtime/pool/worker.js +324 -0
  257. package/dist/runtime/pool/worker.js.map +1 -0
  258. package/dist/server/mcp-server.d.ts +6 -0
  259. package/dist/server/mcp-server.d.ts.map +1 -1
  260. package/dist/server/mcp-server.js +610 -45
  261. package/dist/server/mcp-server.js.map +1 -1
  262. package/dist/server/passthrough-registrar.d.ts +73 -0
  263. package/dist/server/passthrough-registrar.d.ts.map +1 -0
  264. package/dist/server/passthrough-registrar.js +110 -0
  265. package/dist/server/passthrough-registrar.js.map +1 -0
  266. package/dist/skills/skills-engine.d.ts +9 -1
  267. package/dist/skills/skills-engine.d.ts.map +1 -1
  268. package/dist/skills/skills-engine.js +20 -3
  269. package/dist/skills/skills-engine.js.map +1 -1
  270. package/dist/utils/index.d.ts +3 -0
  271. package/dist/utils/index.d.ts.map +1 -1
  272. package/dist/utils/index.js +3 -0
  273. package/dist/utils/index.js.map +1 -1
  274. package/dist/utils/logger.d.ts.map +1 -1
  275. package/dist/utils/logger.js +5 -1
  276. package/dist/utils/logger.js.map +1 -1
  277. package/dist/utils/orphan-watch.d.ts +34 -0
  278. package/dist/utils/orphan-watch.d.ts.map +1 -0
  279. package/dist/utils/orphan-watch.js +54 -0
  280. package/dist/utils/orphan-watch.js.map +1 -0
  281. package/dist/utils/redact.d.ts +15 -0
  282. package/dist/utils/redact.d.ts.map +1 -0
  283. package/dist/utils/redact.js +48 -0
  284. package/dist/utils/redact.js.map +1 -0
  285. package/dist/utils/tokenize.d.ts +55 -0
  286. package/dist/utils/tokenize.d.ts.map +1 -0
  287. package/dist/utils/tokenize.js +205 -0
  288. package/dist/utils/tokenize.js.map +1 -0
  289. package/dist/version.d.ts +3 -3
  290. package/dist/version.d.ts.map +1 -1
  291. package/dist/version.js +3 -3
  292. package/dist/version.js.map +1 -1
  293. package/package.json +13 -3
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAc,IAAI,MAAM,CAAC;AAE3F,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;IACrF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO,GAAG,MAAM,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,CAAC,KAAe;QACtB,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAc,IAAI,MAAM,CAAC;AAE3F,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;IACrF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,sEAAsE;IACtE,qEAAqE;IACrE,6DAA6D;IAC7D,OAAO,aAAa,CAAC,GAAG,MAAM,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,CAAC,KAAe;QACtB,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Orphan-process watchdog.
3
+ *
4
+ * Conductor is launched by Claude (or another MCP client) as a long-running
5
+ * stdio subprocess. If the client crashes or is force-killed, Conductor can
6
+ * stay alive — along with its Deno children — leaking memory and compute
7
+ * until an operator notices. On POSIX the orphaning is visible: the parent
8
+ * PID changes to 1 (init) once the original parent has reaped. We poll
9
+ * periodically and, when reparenting is detected, invoke a graceful
10
+ * shutdown so everything downstream (Deno, MCP hub, HTTP bridge, timers)
11
+ * stops cleanly.
12
+ *
13
+ * On Windows `process.ppid` is less reliable but we still compare against
14
+ * the startup value; any change is treated as an orphan signal.
15
+ */
16
+ import { logger } from './logger.js';
17
+ export interface OrphanWatch {
18
+ stop(): void;
19
+ }
20
+ export interface OrphanWatchOptions {
21
+ onOrphaned: () => void | Promise<void>;
22
+ intervalMs?: number;
23
+ /** Inject for tests. Defaults to `() => process.ppid`. */
24
+ getPpid?: () => number;
25
+ /** Called once orphaning is confirmed. */
26
+ logger?: Pick<typeof logger, 'warn'>;
27
+ }
28
+ /**
29
+ * Start watching. Returns a handle with stop() so callers can unhook the
30
+ * watcher during normal shutdown (prevents spurious orphan fires during
31
+ * SIGTERM cleanup).
32
+ */
33
+ export declare function startOrphanWatch(options: OrphanWatchOptions): OrphanWatch;
34
+ //# sourceMappingURL=orphan-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-watch.d.ts","sourceRoot":"","sources":["../../src/utils/orphan-watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAqCzE"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Orphan-process watchdog.
3
+ *
4
+ * Conductor is launched by Claude (or another MCP client) as a long-running
5
+ * stdio subprocess. If the client crashes or is force-killed, Conductor can
6
+ * stay alive — along with its Deno children — leaking memory and compute
7
+ * until an operator notices. On POSIX the orphaning is visible: the parent
8
+ * PID changes to 1 (init) once the original parent has reaped. We poll
9
+ * periodically and, when reparenting is detected, invoke a graceful
10
+ * shutdown so everything downstream (Deno, MCP hub, HTTP bridge, timers)
11
+ * stops cleanly.
12
+ *
13
+ * On Windows `process.ppid` is less reliable but we still compare against
14
+ * the startup value; any change is treated as an orphan signal.
15
+ */
16
+ import { logger } from './logger.js';
17
+ import { LIFECYCLE_TIMEOUTS } from '../config/defaults.js';
18
+ /**
19
+ * Start watching. Returns a handle with stop() so callers can unhook the
20
+ * watcher during normal shutdown (prevents spurious orphan fires during
21
+ * SIGTERM cleanup).
22
+ */
23
+ export function startOrphanWatch(options) {
24
+ const { onOrphaned, intervalMs = LIFECYCLE_TIMEOUTS.ORPHAN_CHECK_INTERVAL_MS, getPpid = () => process.ppid, logger: log = logger, } = options;
25
+ const initialPpid = getPpid();
26
+ let fired = false;
27
+ const timer = setInterval(() => {
28
+ if (fired)
29
+ return;
30
+ const current = getPpid();
31
+ // We treat *any* change from the startup ppid as orphaning. We do NOT
32
+ // also treat ppid===1 as orphaning unconditionally, because conductor
33
+ // is sometimes launched directly under PID 1 (systemd Type=simple,
34
+ // supervisord, container ENTRYPOINT) — in those environments the
35
+ // initial ppid is already 1 and the watchdog must not self-fire.
36
+ if (current !== initialPpid) {
37
+ fired = true;
38
+ log.warn('Parent process gone, triggering orphan shutdown', {
39
+ initialPpid,
40
+ currentPpid: current,
41
+ });
42
+ void Promise.resolve(onOrphaned()).catch((err) => {
43
+ log.warn('Orphan shutdown handler threw', { error: String(err) });
44
+ });
45
+ }
46
+ }, intervalMs);
47
+ timer.unref?.();
48
+ return {
49
+ stop() {
50
+ clearInterval(timer);
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=orphan-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-watch.js","sourceRoot":"","sources":["../../src/utils/orphan-watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAe3D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,MAAM,EACJ,UAAU,EACV,UAAU,GAAG,kBAAkB,CAAC,wBAAwB,EACxD,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAC5B,MAAM,EAAE,GAAG,GAAG,MAAM,GACrB,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,KAAK;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,sEAAsE;QACtE,sEAAsE;QACtE,mEAAmE;QACnE,iEAAiE;QACjE,iEAAiE;QACjE,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,KAAK,GAAG,IAAI,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,iDAAiD,EAAE;gBAC1D,WAAW;gBACX,WAAW,EAAE,OAAO;aACrB,CAAC,CAAC;YACH,KAAK,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACxD,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACf,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,OAAO;QACL,IAAI;YACF,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Secret redaction for log output.
3
+ *
4
+ * Logs from Conductor land on stderr and may include error strings, tool
5
+ * arguments, or stdout/stderr captured from backend MCP processes. Any of
6
+ * those could contain API tokens (e.g. a user's Brave Search key showing
7
+ * up in a server-side error). We scan for well-known key formats and
8
+ * replace the matching region with `[REDACTED_<KIND>]` before the line
9
+ * is written.
10
+ *
11
+ * This is defensive, not a replacement for careful logging — callers should
12
+ * still avoid putting secrets in log fields.
13
+ */
14
+ export declare function redactSecrets(input: string): string;
15
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA+BH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASnD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Secret redaction for log output.
3
+ *
4
+ * Logs from Conductor land on stderr and may include error strings, tool
5
+ * arguments, or stdout/stderr captured from backend MCP processes. Any of
6
+ * those could contain API tokens (e.g. a user's Brave Search key showing
7
+ * up in a server-side error). We scan for well-known key formats and
8
+ * replace the matching region with `[REDACTED_<KIND>]` before the line
9
+ * is written.
10
+ *
11
+ * This is defensive, not a replacement for careful logging — callers should
12
+ * still avoid putting secrets in log fields.
13
+ */
14
+ /**
15
+ * Ordered list of known secret shapes. Each entry redacts its match to
16
+ * `[REDACTED_<NAME>]` so operators can tell what kind of credential was
17
+ * scrubbed without exposing the value.
18
+ *
19
+ * Add new patterns here as new providers become relevant.
20
+ */
21
+ const PATTERNS = [
22
+ // GitHub — ghp_, gho_, ghu_, ghs_, ghr_ prefixes
23
+ { name: 'GITHUB_TOKEN', pattern: /gh[pousr]_[A-Za-z0-9]{30,}/g },
24
+ // Anthropic
25
+ { name: 'ANTHROPIC_KEY', pattern: /sk-ant-[A-Za-z0-9_-]{30,}/g },
26
+ // OpenAI (sk-proj-, sk-svcacct-, sk-...)
27
+ { name: 'OPENAI_KEY', pattern: /sk-[A-Za-z0-9_-]{30,}/g },
28
+ // Brave Search
29
+ { name: 'BRAVE_KEY', pattern: /BSA[A-Za-z0-9_-]{25,}/g },
30
+ // AWS Access Key ID (paired secret is high-entropy but unmarked)
31
+ { name: 'AWS_ACCESS_KEY', pattern: /AKIA[A-Z0-9]{16}/g },
32
+ // Google API keys
33
+ { name: 'GOOGLE_API_KEY', pattern: /AIza[A-Za-z0-9_-]{35}/g },
34
+ // Slack tokens
35
+ { name: 'SLACK_TOKEN', pattern: /xox[baprs]-[A-Za-z0-9-]{10,}/g },
36
+ ];
37
+ export function redactSecrets(input) {
38
+ if (!input)
39
+ return input;
40
+ let out = input;
41
+ for (const { name, pattern } of PATTERNS) {
42
+ // Reset lastIndex because /g regexes retain state across calls.
43
+ pattern.lastIndex = 0;
44
+ out = out.replace(pattern, `[REDACTED_${name}]`);
45
+ }
46
+ return out;
47
+ }
48
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;;;GAMG;AACH,MAAM,QAAQ,GAA6B;IACzC,iDAAiD;IACjD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,6BAA6B,EAAE;IAChE,YAAY;IACZ,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,4BAA4B,EAAE;IAChE,yCAAyC;IACzC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,wBAAwB,EAAE;IACzD,eAAe;IACf,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE;IACxD,iEAAiE;IACjE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,EAAE;IACxD,kBAAkB;IAClB,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC7D,eAAe;IACf,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,+BAA+B,EAAE;CAClE,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;QACzC,gEAAgE;QAChE,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,IAAI,GAAG,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * PII Tokenization — Workstream X4 (Agent J)
3
+ *
4
+ * Strips sensitive values from MCP tool responses *before* they enter
5
+ * the Deno sandbox or Claude's context. Each detected value is replaced
6
+ * with a stable token (e.g. `[EMAIL_1]`). A per-execution reverse map
7
+ * lets sandbox code call `mcp.detokenize(token)` to recover the original
8
+ * value for outbound MCP calls.
9
+ *
10
+ * Design:
11
+ * - Built-in matchers only this sprint (email, phone, SSN, CC/Luhn,
12
+ * IBAN, IPv4/v6). Inline-regex matchers are deferred to the follow-up.
13
+ * - The reverse map is passed to `generateSandboxCode` and embedded in
14
+ * the sandbox preamble as a frozen object. It is NOT persisted and
15
+ * cannot outlive the `execute_code` call that created it.
16
+ * - Tokenization is deterministic within a call: the same value always
17
+ * gets the same token (idempotent within one tokenize() invocation via
18
+ * the `seen` map).
19
+ *
20
+ * @module utils/tokenize
21
+ */
22
+ export type BuiltinMatcherName = 'email' | 'phone' | 'ssn' | 'credit_card' | 'iban' | 'ipv4' | 'ipv6';
23
+ export type RedactMatcher = BuiltinMatcherName | string;
24
+ export interface TokenizeResult {
25
+ /** The redacted value (tokens replace original sensitive data) */
26
+ redacted: unknown;
27
+ /**
28
+ * Reverse map from token → original value.
29
+ * Scoped to one `execute_code` call; never persisted.
30
+ */
31
+ reverseMap: Record<string, string>;
32
+ }
33
+ /**
34
+ * Tokenize PII in `value` according to the requested `matchers`.
35
+ *
36
+ * - Walks nested objects and arrays recursively.
37
+ * - String values are scanned for all active matchers.
38
+ * - Object keys are NOT tokenized (only values).
39
+ * - If the same literal appears twice it receives the same token
40
+ * (idempotent within one call).
41
+ *
42
+ * @param value The data returned by an MCP tool.
43
+ * @param matchers Array of built-in matcher names (e.g. `['email','phone']`).
44
+ * Unknown names are silently ignored (future-proof for inline-regex extension).
45
+ * @returns `{ redacted, reverseMap }` where `reverseMap[token] = original`.
46
+ */
47
+ export declare function tokenize(value: unknown, matchers: ReadonlyArray<RedactMatcher>): TokenizeResult;
48
+ /**
49
+ * Given a reverse map and a token string, return the original value.
50
+ * Returns `undefined` if the token is not in the map.
51
+ *
52
+ * Used in the sandbox preamble to implement `mcp.detokenize(token)`.
53
+ */
54
+ export declare function detokenize(token: string, reverseMap: Readonly<Record<string, string>>): string | undefined;
55
+ //# sourceMappingURL=tokenize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/utils/tokenize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,OAAO,GACP,KAAK,GACL,aAAa,GACb,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAwIxD,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,GACrC,cAAc,CA+DhB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC3C,MAAM,GAAG,SAAS,CAEpB"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * PII Tokenization — Workstream X4 (Agent J)
3
+ *
4
+ * Strips sensitive values from MCP tool responses *before* they enter
5
+ * the Deno sandbox or Claude's context. Each detected value is replaced
6
+ * with a stable token (e.g. `[EMAIL_1]`). A per-execution reverse map
7
+ * lets sandbox code call `mcp.detokenize(token)` to recover the original
8
+ * value for outbound MCP calls.
9
+ *
10
+ * Design:
11
+ * - Built-in matchers only this sprint (email, phone, SSN, CC/Luhn,
12
+ * IBAN, IPv4/v6). Inline-regex matchers are deferred to the follow-up.
13
+ * - The reverse map is passed to `generateSandboxCode` and embedded in
14
+ * the sandbox preamble as a frozen object. It is NOT persisted and
15
+ * cannot outlive the `execute_code` call that created it.
16
+ * - Tokenization is deterministic within a call: the same value always
17
+ * gets the same token (idempotent within one tokenize() invocation via
18
+ * the `seen` map).
19
+ *
20
+ * @module utils/tokenize
21
+ */
22
+ // ─────────────────────────────────────────────────────────────────────────────
23
+ // Token format
24
+ // ─────────────────────────────────────────────────────────────────────────────
25
+ const TOKEN_LABELS = {
26
+ email: 'EMAIL',
27
+ phone: 'PHONE',
28
+ ssn: 'SSN',
29
+ credit_card: 'CC',
30
+ iban: 'IBAN',
31
+ ipv4: 'IPV4',
32
+ ipv6: 'IPV6',
33
+ };
34
+ // ─────────────────────────────────────────────────────────────────────────────
35
+ // Luhn algorithm (credit-card validation)
36
+ // ─────────────────────────────────────────────────────────────────────────────
37
+ function luhnCheck(digits) {
38
+ let sum = 0;
39
+ let alternate = false;
40
+ for (let i = digits.length - 1; i >= 0; i--) {
41
+ let n = parseInt(digits[i], 10);
42
+ if (alternate) {
43
+ n *= 2;
44
+ if (n > 9)
45
+ n -= 9;
46
+ }
47
+ sum += n;
48
+ alternate = !alternate;
49
+ }
50
+ return sum % 10 === 0;
51
+ }
52
+ // ─────────────────────────────────────────────────────────────────────────────
53
+ // IBAN checksum (ISO 13616 mod-97)
54
+ // ─────────────────────────────────────────────────────────────────────────────
55
+ function ibanCheck(raw) {
56
+ // Move first 4 chars to end and convert letters to digits
57
+ const rearranged = (raw.slice(4) + raw.slice(0, 4)).toUpperCase();
58
+ let numeric = '';
59
+ for (const ch of rearranged) {
60
+ if (ch >= 'A' && ch <= 'Z') {
61
+ numeric += (ch.charCodeAt(0) - 55).toString();
62
+ }
63
+ else {
64
+ numeric += ch;
65
+ }
66
+ }
67
+ // BigInt mod-97 (string is too long for Number)
68
+ let remainder = BigInt(0);
69
+ for (const ch of numeric) {
70
+ remainder = (remainder * 10n + BigInt(ch)) % 97n;
71
+ }
72
+ return remainder === 1n;
73
+ }
74
+ const BUILTIN_MATCHERS = {
75
+ // RFC 5322 simplified — local@domain.tld
76
+ email: {
77
+ label: TOKEN_LABELS.email,
78
+ pattern: /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+/g,
79
+ },
80
+ // Loose international: +CC NNN…, (NNN) NNN-NNNN, NNN-NNN-NNNN, etc.
81
+ // Last group is \d{3,} to cover 3-digit tails (+61 412 345 678) and
82
+ // 4-digit tails ((555) 867-5309). \+\d{7,15} catches compact international
83
+ // numbers without separators.
84
+ phone: {
85
+ label: TOKEN_LABELS.phone,
86
+ pattern: /(?:\+\d{1,3}[\s.-])?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{3,}|\+\d{7,15}/g,
87
+ },
88
+ // SSN: NNN-NN-NNNN or 9-digit run. The 9-digit run is only matched
89
+ // when preceded/followed by a word boundary so we don't swallow longer IDs.
90
+ ssn: {
91
+ label: TOKEN_LABELS.ssn,
92
+ pattern: /\b\d{3}-\d{2}-\d{4}\b|\b\d{9}\b/g,
93
+ },
94
+ // Credit card: 13–19 digits with optional spaces/dashes, Luhn-validated.
95
+ credit_card: {
96
+ label: TOKEN_LABELS.credit_card,
97
+ pattern: /\b(?:\d[ -]?){13,19}\b/g,
98
+ extractDigits: (m) => m.replace(/[ -]/g, ''),
99
+ validate: (digits) => digits.length >= 13 && digits.length <= 19 && luhnCheck(digits),
100
+ },
101
+ // IBAN: 2-letter country, 2 check digits, 11–30 alphanumeric chars.
102
+ // Tolerates spaces every 4 chars (SEPA print form).
103
+ iban: {
104
+ label: TOKEN_LABELS.iban,
105
+ pattern: /\b[A-Z]{2}\d{2}(?:[ ]?[A-Z0-9]{4}){2,7}(?:[ ]?[A-Z0-9]{1,4})?\b/gi,
106
+ extractDigits: (m) => m.replace(/\s/g, ''),
107
+ validate: (raw) => {
108
+ const stripped = raw.replace(/\s/g, '');
109
+ return stripped.length >= 15 && stripped.length <= 34 && ibanCheck(stripped);
110
+ },
111
+ },
112
+ // IPv4: standard dotted-quad with optional CIDR suffix
113
+ ipv4: {
114
+ label: TOKEN_LABELS.ipv4,
115
+ pattern: /\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?:\/\d{1,2})?\b/g,
116
+ },
117
+ // IPv6: full, compressed (::), and mixed IPv4/v6 forms
118
+ ipv6: {
119
+ label: TOKEN_LABELS.ipv6,
120
+ pattern: /(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:)*::(?:[0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}|::(?:[0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:)*::/g,
121
+ },
122
+ };
123
+ /**
124
+ * Tokenize PII in `value` according to the requested `matchers`.
125
+ *
126
+ * - Walks nested objects and arrays recursively.
127
+ * - String values are scanned for all active matchers.
128
+ * - Object keys are NOT tokenized (only values).
129
+ * - If the same literal appears twice it receives the same token
130
+ * (idempotent within one call).
131
+ *
132
+ * @param value The data returned by an MCP tool.
133
+ * @param matchers Array of built-in matcher names (e.g. `['email','phone']`).
134
+ * Unknown names are silently ignored (future-proof for inline-regex extension).
135
+ * @returns `{ redacted, reverseMap }` where `reverseMap[token] = original`.
136
+ */
137
+ export function tokenize(value, matchers) {
138
+ // Build the active spec set once per call.
139
+ const activeSpecs = [];
140
+ for (const name of matchers) {
141
+ if (name in BUILTIN_MATCHERS) {
142
+ activeSpecs.push(BUILTIN_MATCHERS[name]);
143
+ }
144
+ // Unknown names (future inline-regex) are skipped silently.
145
+ }
146
+ if (activeSpecs.length === 0) {
147
+ return { redacted: value, reverseMap: {} };
148
+ }
149
+ const counters = {};
150
+ const seen = new Map(); // originalValue → token
151
+ const reverseMap = {};
152
+ function nextToken(label) {
153
+ counters[label] = (counters[label] ?? 0) + 1;
154
+ return `[${label}_${counters[label]}]`;
155
+ }
156
+ function redactString(input) {
157
+ let result = input;
158
+ for (const spec of activeSpecs) {
159
+ spec.pattern.lastIndex = 0; // reset stateful global regex
160
+ result = result.replace(spec.pattern, (match) => {
161
+ // Secondary validation (Luhn, IBAN mod-97)
162
+ if (spec.validate) {
163
+ const digits = spec.extractDigits ? spec.extractDigits(match) : match;
164
+ if (!spec.validate(digits))
165
+ return match; // not a valid PAN/IBAN — leave it
166
+ }
167
+ // Idempotent: same value → same token
168
+ if (seen.has(match)) {
169
+ return seen.get(match);
170
+ }
171
+ const token = nextToken(spec.label);
172
+ seen.set(match, token);
173
+ reverseMap[token] = match;
174
+ return token;
175
+ });
176
+ }
177
+ return result;
178
+ }
179
+ function walk(node) {
180
+ if (typeof node === 'string')
181
+ return redactString(node);
182
+ if (Array.isArray(node))
183
+ return node.map(walk);
184
+ if (node !== null && typeof node === 'object') {
185
+ const out = {};
186
+ for (const [k, v] of Object.entries(node)) {
187
+ out[k] = walk(v);
188
+ }
189
+ return out;
190
+ }
191
+ return node; // number, boolean, null, undefined — pass through
192
+ }
193
+ const redacted = walk(value);
194
+ return { redacted, reverseMap };
195
+ }
196
+ /**
197
+ * Given a reverse map and a token string, return the original value.
198
+ * Returns `undefined` if the token is not in the map.
199
+ *
200
+ * Used in the sandbox preamble to implement `mcp.detokenize(token)`.
201
+ */
202
+ export function detokenize(token, reverseMap) {
203
+ return reverseMap[token];
204
+ }
205
+ //# sourceMappingURL=tokenize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/utils/tokenize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAiBH,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,MAAM,YAAY,GAAuC;IACvD,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,WAAW,EAAE,IAAI;IACjB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,gFAAgF;AAChF,0CAA0C;AAC1C,gFAAgF;AAEhF,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,SAAS,EAAE,CAAC;YACd,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;QACT,SAAS,GAAG,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,SAAS,SAAS,CAAC,GAAW;IAC5B,0DAA0D;IAC1D,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,IAAI,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,KAAK,EAAE,CAAC;AAC1B,CAAC;AAoBD,MAAM,gBAAgB,GAA4C;IAChE,yCAAyC;IACzC,KAAK,EAAE;QACL,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,OAAO,EAAE,qIAAqI;KAC/I;IAED,oEAAoE;IACpE,oEAAoE;IACpE,2EAA2E;IAC3E,8BAA8B;IAC9B,KAAK,EAAE;QACL,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,OAAO,EAAE,oEAAoE;KAC9E;IAED,mEAAmE;IACnE,4EAA4E;IAC5E,GAAG,EAAE;QACH,KAAK,EAAE,YAAY,CAAC,GAAG;QACvB,OAAO,EAAE,kCAAkC;KAC5C;IAED,yEAAyE;IACzE,WAAW,EAAE;QACX,KAAK,EAAE,YAAY,CAAC,WAAW;QAC/B,OAAO,EAAE,yBAAyB;QAClC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC;KACtF;IAED,oEAAoE;IACpE,oDAAoD;IACpD,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY,CAAC,IAAI;QACxB,OAAO,EAAE,mEAAmE;QAC5E,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC1C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,QAAQ,CAAC,MAAM,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/E,CAAC;KACF;IAED,uDAAuD;IACvD,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY,CAAC,IAAI;QACxB,OAAO,EAAE,sGAAsG;KAChH;IAED,uDAAuD;IACvD,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY,CAAC,IAAI;QACxB,OAAO,EAAE,4KAA4K;KACtL;CACF,CAAC;AAgBF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAc,EACd,QAAsC;IAEtC,2CAA2C;IAC3C,MAAM,WAAW,GAAkB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,IAAI,gBAAgB,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAA0B,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,4DAA4D;IAC9D,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,wBAAwB;IACrE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,SAAS,SAAS,CAAC,KAAa;QAC9B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;IACzC,CAAC;IAED,SAAS,YAAY,CAAC,KAAa;QACjC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,8BAA8B;YAC1D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC9C,2CAA2C;gBAC3C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBACtE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAAE,OAAO,KAAK,CAAC,CAAC,kCAAkC;gBAC9E,CAAC;gBAED,sCAAsC;gBACtC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;gBAC1B,CAAC;gBAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACvB,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;gBAC1B,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,IAAI,CAAC,IAAa;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;gBACrE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,kDAAkD;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,UAA4C;IAE5C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "1.1.0";
2
- export declare const BUILD_NUMBER = 2;
3
- export declare const BUILD_STRING = "1.1.0 (build 2)";
1
+ export declare const VERSION = "3.0.0-beta.1";
2
+ export declare const BUILD_NUMBER = 4;
3
+ export declare const BUILD_STRING = "3.0.0-beta.1 (build 4)";
4
4
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,YAAY,oBAAoB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,YAAY,2BAA2B,CAAC"}
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
- export const VERSION = '1.1.0';
2
- export const BUILD_NUMBER = 2;
3
- export const BUILD_STRING = '1.1.0 (build 2)';
1
+ export const VERSION = '3.0.0-beta.1';
2
+ export const BUILD_NUMBER = 4;
3
+ export const BUILD_STRING = '3.0.0-beta.1 (build 4)';
4
4
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@darkiceinteractive/mcp-conductor",
3
- "version": "1.1.0",
3
+ "version": "3.0.0-beta.1",
4
4
  "description": "MCP server that orchestrates code execution in a sandboxed Deno environment with access to all MCP servers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "bin": {
9
- "mcp-conductor": "./dist/index.js"
9
+ "mcp-conductor": "./dist/index.js",
10
+ "mcp-conductor-cli": "./dist/bin/cli.js"
10
11
  },
11
12
  "files": [
12
13
  "dist",
@@ -62,11 +63,20 @@
62
63
  "node": ">=18.0.0"
63
64
  },
64
65
  "dependencies": {
65
- "@modelcontextprotocol/sdk": "^1.0.0",
66
+ "@inquirer/prompts": "^7.10.1",
67
+ "@modelcontextprotocol/sdk": "^1.29.0",
68
+ "ajv": "^8.20.0",
69
+ "cbor-x": "^1.6.4",
66
70
  "chalk": "^5.3.0",
67
71
  "chokidar": "^3.5.3",
72
+ "commander": "^12.1.0",
68
73
  "conf": "^13.0.1",
69
74
  "gray-matter": "^4.0.3",
75
+ "json-schema-to-typescript": "^15.0.4",
76
+ "lru-cache": "^11.3.5",
77
+ "nanoid": "^5.1.11",
78
+ "p-queue": "^8.1.1",
79
+ "picocolors": "^1.1.1",
70
80
  "uuid": "^10.0.0",
71
81
  "zod": "^3.23.8"
72
82
  },