@daniel.stefan/metalink 1.3.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 (333) hide show
  1. package/README.md +160 -0
  2. package/package.json +96 -0
  3. package/packages/cli/dist/bin/cli.d.ts +3 -0
  4. package/packages/cli/dist/bin/cli.d.ts.map +1 -0
  5. package/packages/cli/dist/bin/cli.js +4 -0
  6. package/packages/cli/dist/bin/cli.js.map +1 -0
  7. package/packages/cli/dist/commands/config/init.d.ts +9 -0
  8. package/packages/cli/dist/commands/config/init.d.ts.map +1 -0
  9. package/packages/cli/dist/commands/config/init.js +38 -0
  10. package/packages/cli/dist/commands/config/init.js.map +1 -0
  11. package/packages/cli/dist/commands/config/validate.d.ts +9 -0
  12. package/packages/cli/dist/commands/config/validate.d.ts.map +1 -0
  13. package/packages/cli/dist/commands/config/validate.js +34 -0
  14. package/packages/cli/dist/commands/config/validate.js.map +1 -0
  15. package/packages/cli/dist/commands/daemon/restart.d.ts +15 -0
  16. package/packages/cli/dist/commands/daemon/restart.d.ts.map +1 -0
  17. package/packages/cli/dist/commands/daemon/restart.js +184 -0
  18. package/packages/cli/dist/commands/daemon/restart.js.map +1 -0
  19. package/packages/cli/dist/commands/daemon/start.d.ts +7 -0
  20. package/packages/cli/dist/commands/daemon/start.d.ts.map +1 -0
  21. package/packages/cli/dist/commands/daemon/start.js +85 -0
  22. package/packages/cli/dist/commands/daemon/start.js.map +1 -0
  23. package/packages/cli/dist/commands/daemon/status.d.ts +7 -0
  24. package/packages/cli/dist/commands/daemon/status.d.ts.map +1 -0
  25. package/packages/cli/dist/commands/daemon/status.js +69 -0
  26. package/packages/cli/dist/commands/daemon/status.js.map +1 -0
  27. package/packages/cli/dist/commands/daemon/stop.d.ts +8 -0
  28. package/packages/cli/dist/commands/daemon/stop.d.ts.map +1 -0
  29. package/packages/cli/dist/commands/daemon/stop.js +77 -0
  30. package/packages/cli/dist/commands/daemon/stop.js.map +1 -0
  31. package/packages/cli/dist/commands/import/mcpm.d.ts +10 -0
  32. package/packages/cli/dist/commands/import/mcpm.d.ts.map +1 -0
  33. package/packages/cli/dist/commands/import/mcpm.js +58 -0
  34. package/packages/cli/dist/commands/import/mcpm.js.map +1 -0
  35. package/packages/cli/dist/commands/safety/add-risky-pattern.d.ts +16 -0
  36. package/packages/cli/dist/commands/safety/add-risky-pattern.d.ts.map +1 -0
  37. package/packages/cli/dist/commands/safety/add-risky-pattern.js +72 -0
  38. package/packages/cli/dist/commands/safety/add-risky-pattern.js.map +1 -0
  39. package/packages/cli/dist/commands/safety/add-risky.d.ts +12 -0
  40. package/packages/cli/dist/commands/safety/add-risky.d.ts.map +1 -0
  41. package/packages/cli/dist/commands/safety/add-risky.js +52 -0
  42. package/packages/cli/dist/commands/safety/add-risky.js.map +1 -0
  43. package/packages/cli/dist/commands/safety/add-safe-pattern.d.ts +16 -0
  44. package/packages/cli/dist/commands/safety/add-safe-pattern.d.ts.map +1 -0
  45. package/packages/cli/dist/commands/safety/add-safe-pattern.js +72 -0
  46. package/packages/cli/dist/commands/safety/add-safe-pattern.js.map +1 -0
  47. package/packages/cli/dist/commands/safety/add-safe.d.ts +12 -0
  48. package/packages/cli/dist/commands/safety/add-safe.d.ts.map +1 -0
  49. package/packages/cli/dist/commands/safety/add-safe.js +52 -0
  50. package/packages/cli/dist/commands/safety/add-safe.js.map +1 -0
  51. package/packages/cli/dist/commands/safety/check.d.ts +9 -0
  52. package/packages/cli/dist/commands/safety/check.d.ts.map +1 -0
  53. package/packages/cli/dist/commands/safety/check.js +36 -0
  54. package/packages/cli/dist/commands/safety/check.js.map +1 -0
  55. package/packages/cli/dist/commands/safety/export.d.ts +10 -0
  56. package/packages/cli/dist/commands/safety/export.d.ts.map +1 -0
  57. package/packages/cli/dist/commands/safety/export.js +48 -0
  58. package/packages/cli/dist/commands/safety/export.js.map +1 -0
  59. package/packages/cli/dist/commands/safety/import.d.ts +12 -0
  60. package/packages/cli/dist/commands/safety/import.d.ts.map +1 -0
  61. package/packages/cli/dist/commands/safety/import.js +78 -0
  62. package/packages/cli/dist/commands/safety/import.js.map +1 -0
  63. package/packages/cli/dist/commands/safety/index.d.ts +8 -0
  64. package/packages/cli/dist/commands/safety/index.d.ts.map +1 -0
  65. package/packages/cli/dist/commands/safety/index.js +46 -0
  66. package/packages/cli/dist/commands/safety/index.js.map +1 -0
  67. package/packages/cli/dist/commands/safety/list.d.ts +6 -0
  68. package/packages/cli/dist/commands/safety/list.d.ts.map +1 -0
  69. package/packages/cli/dist/commands/safety/list.js +77 -0
  70. package/packages/cli/dist/commands/safety/list.js.map +1 -0
  71. package/packages/cli/dist/commands/safety/remove.d.ts +9 -0
  72. package/packages/cli/dist/commands/safety/remove.d.ts.map +1 -0
  73. package/packages/cli/dist/commands/safety/remove.js +46 -0
  74. package/packages/cli/dist/commands/safety/remove.js.map +1 -0
  75. package/packages/cli/dist/commands/safety/reset.d.ts +9 -0
  76. package/packages/cli/dist/commands/safety/reset.d.ts.map +1 -0
  77. package/packages/cli/dist/commands/safety/reset.js +46 -0
  78. package/packages/cli/dist/commands/safety/reset.js.map +1 -0
  79. package/packages/cli/dist/commands/safety/validate.d.ts +9 -0
  80. package/packages/cli/dist/commands/safety/validate.d.ts.map +1 -0
  81. package/packages/cli/dist/commands/safety/validate.js +51 -0
  82. package/packages/cli/dist/commands/safety/validate.js.map +1 -0
  83. package/packages/cli/dist/commands/secret/get.d.ts +9 -0
  84. package/packages/cli/dist/commands/secret/get.d.ts.map +1 -0
  85. package/packages/cli/dist/commands/secret/get.js +26 -0
  86. package/packages/cli/dist/commands/secret/get.js.map +1 -0
  87. package/packages/cli/dist/commands/secret/set.d.ts +10 -0
  88. package/packages/cli/dist/commands/secret/set.d.ts.map +1 -0
  89. package/packages/cli/dist/commands/secret/set.js +22 -0
  90. package/packages/cli/dist/commands/secret/set.js.map +1 -0
  91. package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.d.ts +2 -0
  92. package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.d.ts.map +1 -0
  93. package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.js +234 -0
  94. package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.js.map +1 -0
  95. package/packages/cli/dist/commands/server/add.d.ts +14 -0
  96. package/packages/cli/dist/commands/server/add.d.ts.map +1 -0
  97. package/packages/cli/dist/commands/server/add.js +86 -0
  98. package/packages/cli/dist/commands/server/add.js.map +1 -0
  99. package/packages/cli/dist/commands/server/available.d.ts +10 -0
  100. package/packages/cli/dist/commands/server/available.d.ts.map +1 -0
  101. package/packages/cli/dist/commands/server/available.js +62 -0
  102. package/packages/cli/dist/commands/server/available.js.map +1 -0
  103. package/packages/cli/dist/commands/server/debug.d.ts +18 -0
  104. package/packages/cli/dist/commands/server/debug.d.ts.map +1 -0
  105. package/packages/cli/dist/commands/server/debug.js +165 -0
  106. package/packages/cli/dist/commands/server/debug.js.map +1 -0
  107. package/packages/cli/dist/commands/server/info.d.ts +13 -0
  108. package/packages/cli/dist/commands/server/info.d.ts.map +1 -0
  109. package/packages/cli/dist/commands/server/info.js +62 -0
  110. package/packages/cli/dist/commands/server/info.js.map +1 -0
  111. package/packages/cli/dist/commands/server/list.d.ts +10 -0
  112. package/packages/cli/dist/commands/server/list.d.ts.map +1 -0
  113. package/packages/cli/dist/commands/server/list.js +105 -0
  114. package/packages/cli/dist/commands/server/list.js.map +1 -0
  115. package/packages/cli/dist/commands/server/refresh-tools.d.ts +13 -0
  116. package/packages/cli/dist/commands/server/refresh-tools.d.ts.map +1 -0
  117. package/packages/cli/dist/commands/server/refresh-tools.js +46 -0
  118. package/packages/cli/dist/commands/server/refresh-tools.js.map +1 -0
  119. package/packages/cli/dist/commands/server/remove.d.ts +12 -0
  120. package/packages/cli/dist/commands/server/remove.d.ts.map +1 -0
  121. package/packages/cli/dist/commands/server/remove.js +39 -0
  122. package/packages/cli/dist/commands/server/remove.js.map +1 -0
  123. package/packages/cli/dist/commands/server/restart.d.ts +9 -0
  124. package/packages/cli/dist/commands/server/restart.d.ts.map +1 -0
  125. package/packages/cli/dist/commands/server/restart.js +30 -0
  126. package/packages/cli/dist/commands/server/restart.js.map +1 -0
  127. package/packages/cli/dist/commands/server/start.d.ts +9 -0
  128. package/packages/cli/dist/commands/server/start.d.ts.map +1 -0
  129. package/packages/cli/dist/commands/server/start.js +37 -0
  130. package/packages/cli/dist/commands/server/start.js.map +1 -0
  131. package/packages/cli/dist/commands/server/status.d.ts +9 -0
  132. package/packages/cli/dist/commands/server/status.d.ts.map +1 -0
  133. package/packages/cli/dist/commands/server/status.js +30 -0
  134. package/packages/cli/dist/commands/server/status.js.map +1 -0
  135. package/packages/cli/dist/commands/server/stop.d.ts +9 -0
  136. package/packages/cli/dist/commands/server/stop.d.ts.map +1 -0
  137. package/packages/cli/dist/commands/server/stop.js +31 -0
  138. package/packages/cli/dist/commands/server/stop.js.map +1 -0
  139. package/packages/cli/dist/commands/server/validate.d.ts +15 -0
  140. package/packages/cli/dist/commands/server/validate.d.ts.map +1 -0
  141. package/packages/cli/dist/commands/server/validate.js +87 -0
  142. package/packages/cli/dist/commands/server/validate.js.map +1 -0
  143. package/packages/cli/dist/commands/stdio.d.ts +36 -0
  144. package/packages/cli/dist/commands/stdio.d.ts.map +1 -0
  145. package/packages/cli/dist/commands/stdio.js +85 -0
  146. package/packages/cli/dist/commands/stdio.js.map +1 -0
  147. package/packages/cli/dist/commands/tool/execute-confirm.d.ts +12 -0
  148. package/packages/cli/dist/commands/tool/execute-confirm.d.ts.map +1 -0
  149. package/packages/cli/dist/commands/tool/execute-confirm.js +98 -0
  150. package/packages/cli/dist/commands/tool/execute-confirm.js.map +1 -0
  151. package/packages/cli/dist/commands/tool/execute.d.ts +12 -0
  152. package/packages/cli/dist/commands/tool/execute.d.ts.map +1 -0
  153. package/packages/cli/dist/commands/tool/execute.js +55 -0
  154. package/packages/cli/dist/commands/tool/execute.js.map +1 -0
  155. package/packages/cli/dist/commands/tool/list.d.ts +13 -0
  156. package/packages/cli/dist/commands/tool/list.d.ts.map +1 -0
  157. package/packages/cli/dist/commands/tool/list.js +91 -0
  158. package/packages/cli/dist/commands/tool/list.js.map +1 -0
  159. package/packages/cli/dist/commands/tool/search.d.ts +12 -0
  160. package/packages/cli/dist/commands/tool/search.d.ts.map +1 -0
  161. package/packages/cli/dist/commands/tool/search.js +87 -0
  162. package/packages/cli/dist/commands/tool/search.js.map +1 -0
  163. package/packages/cli/dist/index.d.ts +2 -0
  164. package/packages/cli/dist/index.d.ts.map +1 -0
  165. package/packages/cli/dist/index.js +9 -0
  166. package/packages/cli/dist/index.js.map +1 -0
  167. package/packages/cli/dist/utils/daemon-checker.d.ts +18 -0
  168. package/packages/cli/dist/utils/daemon-checker.d.ts.map +1 -0
  169. package/packages/cli/dist/utils/daemon-checker.js +69 -0
  170. package/packages/cli/dist/utils/daemon-checker.js.map +1 -0
  171. package/packages/cli/dist/utils/daemon-endpoint.d.ts +7 -0
  172. package/packages/cli/dist/utils/daemon-endpoint.d.ts.map +1 -0
  173. package/packages/cli/dist/utils/daemon-endpoint.js +13 -0
  174. package/packages/cli/dist/utils/daemon-endpoint.js.map +1 -0
  175. package/packages/cli/dist/utils/get-configured-port.d.ts +43 -0
  176. package/packages/cli/dist/utils/get-configured-port.d.ts.map +1 -0
  177. package/packages/cli/dist/utils/get-configured-port.js +141 -0
  178. package/packages/cli/dist/utils/get-configured-port.js.map +1 -0
  179. package/packages/cli/dist/utils/stdio-bridge.d.ts +48 -0
  180. package/packages/cli/dist/utils/stdio-bridge.d.ts.map +1 -0
  181. package/packages/cli/dist/utils/stdio-bridge.js +181 -0
  182. package/packages/cli/dist/utils/stdio-bridge.js.map +1 -0
  183. package/packages/cli/package.json +48 -0
  184. package/packages/core/dist/config/defaults.d.ts +36 -0
  185. package/packages/core/dist/config/defaults.d.ts.map +1 -0
  186. package/packages/core/dist/config/defaults.js +324 -0
  187. package/packages/core/dist/config/defaults.js.map +1 -0
  188. package/packages/core/dist/config/index.d.ts +9 -0
  189. package/packages/core/dist/config/index.d.ts.map +1 -0
  190. package/packages/core/dist/config/index.js +14 -0
  191. package/packages/core/dist/config/index.js.map +1 -0
  192. package/packages/core/dist/config/loader.d.ts +269 -0
  193. package/packages/core/dist/config/loader.d.ts.map +1 -0
  194. package/packages/core/dist/config/loader.js +777 -0
  195. package/packages/core/dist/config/loader.js.map +1 -0
  196. package/packages/core/dist/config/registry.d.ts +212 -0
  197. package/packages/core/dist/config/registry.d.ts.map +1 -0
  198. package/packages/core/dist/config/registry.js +754 -0
  199. package/packages/core/dist/config/registry.js.map +1 -0
  200. package/packages/core/dist/config/schema.d.ts +4352 -0
  201. package/packages/core/dist/config/schema.d.ts.map +1 -0
  202. package/packages/core/dist/config/schema.js +267 -0
  203. package/packages/core/dist/config/schema.js.map +1 -0
  204. package/packages/core/dist/daemon.d.ts +7 -0
  205. package/packages/core/dist/daemon.d.ts.map +1 -0
  206. package/packages/core/dist/daemon.js +116 -0
  207. package/packages/core/dist/daemon.js.map +1 -0
  208. package/packages/core/dist/http-client-retry.d.ts +67 -0
  209. package/packages/core/dist/http-client-retry.d.ts.map +1 -0
  210. package/packages/core/dist/http-client-retry.js +133 -0
  211. package/packages/core/dist/http-client-retry.js.map +1 -0
  212. package/packages/core/dist/http-client-updated.d.ts +147 -0
  213. package/packages/core/dist/http-client-updated.d.ts.map +1 -0
  214. package/packages/core/dist/http-client-updated.js +452 -0
  215. package/packages/core/dist/http-client-updated.js.map +1 -0
  216. package/packages/core/dist/http-client.d.ts +207 -0
  217. package/packages/core/dist/http-client.d.ts.map +1 -0
  218. package/packages/core/dist/http-client.js +704 -0
  219. package/packages/core/dist/http-client.js.map +1 -0
  220. package/packages/core/dist/index.d.ts +13 -0
  221. package/packages/core/dist/index.d.ts.map +1 -0
  222. package/packages/core/dist/index.js +23 -0
  223. package/packages/core/dist/index.js.map +1 -0
  224. package/packages/core/dist/logging/index.d.ts +46 -0
  225. package/packages/core/dist/logging/index.d.ts.map +1 -0
  226. package/packages/core/dist/logging/index.js +74 -0
  227. package/packages/core/dist/logging/index.js.map +1 -0
  228. package/packages/core/dist/metrics/index.d.ts +339 -0
  229. package/packages/core/dist/metrics/index.d.ts.map +1 -0
  230. package/packages/core/dist/metrics/index.js +792 -0
  231. package/packages/core/dist/metrics/index.js.map +1 -0
  232. package/packages/core/dist/plugins/index.d.ts +49 -0
  233. package/packages/core/dist/plugins/index.d.ts.map +1 -0
  234. package/packages/core/dist/plugins/index.js +82 -0
  235. package/packages/core/dist/plugins/index.js.map +1 -0
  236. package/packages/core/dist/secrets/index.d.ts +6 -0
  237. package/packages/core/dist/secrets/index.d.ts.map +1 -0
  238. package/packages/core/dist/secrets/index.js +5 -0
  239. package/packages/core/dist/secrets/index.js.map +1 -0
  240. package/packages/core/dist/secrets/keyring.d.ts +54 -0
  241. package/packages/core/dist/secrets/keyring.d.ts.map +1 -0
  242. package/packages/core/dist/secrets/keyring.js +141 -0
  243. package/packages/core/dist/secrets/keyring.js.map +1 -0
  244. package/packages/core/dist/server/batch-executor.d.ts +83 -0
  245. package/packages/core/dist/server/batch-executor.d.ts.map +1 -0
  246. package/packages/core/dist/server/batch-executor.js +291 -0
  247. package/packages/core/dist/server/batch-executor.js.map +1 -0
  248. package/packages/core/dist/server/circuit-breaker.d.ts +215 -0
  249. package/packages/core/dist/server/circuit-breaker.d.ts.map +1 -0
  250. package/packages/core/dist/server/circuit-breaker.js +330 -0
  251. package/packages/core/dist/server/circuit-breaker.js.map +1 -0
  252. package/packages/core/dist/server/client-detection.d.ts +40 -0
  253. package/packages/core/dist/server/client-detection.d.ts.map +1 -0
  254. package/packages/core/dist/server/client-detection.js +242 -0
  255. package/packages/core/dist/server/client-detection.js.map +1 -0
  256. package/packages/core/dist/server/client-profiles.d.ts +102 -0
  257. package/packages/core/dist/server/client-profiles.d.ts.map +1 -0
  258. package/packages/core/dist/server/client-profiles.js +254 -0
  259. package/packages/core/dist/server/client-profiles.js.map +1 -0
  260. package/packages/core/dist/server/http.d.ts +386 -0
  261. package/packages/core/dist/server/http.d.ts.map +1 -0
  262. package/packages/core/dist/server/http.js +4253 -0
  263. package/packages/core/dist/server/http.js.map +1 -0
  264. package/packages/core/dist/server/index.d.ts +7 -0
  265. package/packages/core/dist/server/index.d.ts.map +1 -0
  266. package/packages/core/dist/server/index.js +6 -0
  267. package/packages/core/dist/server/index.js.map +1 -0
  268. package/packages/core/dist/server/manager.d.ts +458 -0
  269. package/packages/core/dist/server/manager.d.ts.map +1 -0
  270. package/packages/core/dist/server/manager.js +3255 -0
  271. package/packages/core/dist/server/manager.js.map +1 -0
  272. package/packages/core/dist/server/managers/HttpConnectionManager.d.ts +69 -0
  273. package/packages/core/dist/server/managers/HttpConnectionManager.d.ts.map +1 -0
  274. package/packages/core/dist/server/managers/HttpConnectionManager.js +214 -0
  275. package/packages/core/dist/server/managers/HttpConnectionManager.js.map +1 -0
  276. package/packages/core/dist/server/managers/ProcessManager.d.ts +128 -0
  277. package/packages/core/dist/server/managers/ProcessManager.d.ts.map +1 -0
  278. package/packages/core/dist/server/managers/ProcessManager.js +443 -0
  279. package/packages/core/dist/server/managers/ProcessManager.js.map +1 -0
  280. package/packages/core/dist/server/managers/SchemaCacheManager.d.ts +152 -0
  281. package/packages/core/dist/server/managers/SchemaCacheManager.d.ts.map +1 -0
  282. package/packages/core/dist/server/managers/SchemaCacheManager.js +426 -0
  283. package/packages/core/dist/server/managers/SchemaCacheManager.js.map +1 -0
  284. package/packages/core/dist/server/managers/index.d.ts +9 -0
  285. package/packages/core/dist/server/managers/index.d.ts.map +1 -0
  286. package/packages/core/dist/server/managers/index.js +9 -0
  287. package/packages/core/dist/server/managers/index.js.map +1 -0
  288. package/packages/core/dist/server/metrics.d.ts +134 -0
  289. package/packages/core/dist/server/metrics.d.ts.map +1 -0
  290. package/packages/core/dist/server/metrics.js +273 -0
  291. package/packages/core/dist/server/metrics.js.map +1 -0
  292. package/packages/core/dist/server/prompts.d.ts +58 -0
  293. package/packages/core/dist/server/prompts.d.ts.map +1 -0
  294. package/packages/core/dist/server/prompts.js +405 -0
  295. package/packages/core/dist/server/prompts.js.map +1 -0
  296. package/packages/core/dist/server/protocol-versions.d.ts +49 -0
  297. package/packages/core/dist/server/protocol-versions.d.ts.map +1 -0
  298. package/packages/core/dist/server/protocol-versions.js +173 -0
  299. package/packages/core/dist/server/protocol-versions.js.map +1 -0
  300. package/packages/core/dist/server/resources.d.ts +64 -0
  301. package/packages/core/dist/server/resources.d.ts.map +1 -0
  302. package/packages/core/dist/server/resources.js +243 -0
  303. package/packages/core/dist/server/resources.js.map +1 -0
  304. package/packages/core/dist/server/schema-store.d.ts +84 -0
  305. package/packages/core/dist/server/schema-store.d.ts.map +1 -0
  306. package/packages/core/dist/server/schema-store.js +234 -0
  307. package/packages/core/dist/server/schema-store.js.map +1 -0
  308. package/packages/core/dist/server/schema-validator.d.ts +51 -0
  309. package/packages/core/dist/server/schema-validator.d.ts.map +1 -0
  310. package/packages/core/dist/server/schema-validator.js +208 -0
  311. package/packages/core/dist/server/schema-validator.js.map +1 -0
  312. package/packages/core/dist/server/token-calculator.d.ts +44 -0
  313. package/packages/core/dist/server/token-calculator.d.ts.map +1 -0
  314. package/packages/core/dist/server/token-calculator.js +53 -0
  315. package/packages/core/dist/server/token-calculator.js.map +1 -0
  316. package/packages/core/dist/server/types.d.ts +45 -0
  317. package/packages/core/dist/server/types.d.ts.map +1 -0
  318. package/packages/core/dist/server/types.js +5 -0
  319. package/packages/core/dist/server/types.js.map +1 -0
  320. package/packages/core/dist/utils/file-lock.d.ts +73 -0
  321. package/packages/core/dist/utils/file-lock.d.ts.map +1 -0
  322. package/packages/core/dist/utils/file-lock.js +235 -0
  323. package/packages/core/dist/utils/file-lock.js.map +1 -0
  324. package/packages/core/package.json +36 -0
  325. package/packages/dashboard/dist/assets/index-B7hvkCMu.css +1 -0
  326. package/packages/dashboard/dist/assets/index-yZhLPpzr.js +1 -0
  327. package/packages/dashboard/dist/index.html +14 -0
  328. package/packages/dashboard/package.json +24 -0
  329. package/packages/shared/dist/version.d.ts +2 -0
  330. package/packages/shared/dist/version.d.ts.map +1 -0
  331. package/packages/shared/dist/version.js +2 -0
  332. package/packages/shared/dist/version.js.map +1 -0
  333. package/packages/shared/package.json +18 -0
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Circuit Breaker Implementation for MetaLink
3
+ *
4
+ * Prevents cascade failures by monitoring server health and temporarily
5
+ * blocking requests to failing servers. Implements the Circuit Breaker pattern
6
+ * with three states: CLOSED, OPEN, and HALF_OPEN.
7
+ *
8
+ * @see https://martinfowler.com/bliki/CircuitBreaker.html
9
+ */
10
+ /**
11
+ * Circuit breaker states
12
+ *
13
+ * - CLOSED: Normal operation, requests flow through
14
+ * - OPEN: Server is failing, requests blocked immediately
15
+ * - HALF_OPEN: Testing if server has recovered, limited requests allowed
16
+ */
17
+ export var CircuitState;
18
+ (function (CircuitState) {
19
+ CircuitState["CLOSED"] = "CLOSED";
20
+ CircuitState["OPEN"] = "OPEN";
21
+ CircuitState["HALF_OPEN"] = "HALF_OPEN";
22
+ })(CircuitState || (CircuitState = {}));
23
+ /**
24
+ * Circuit Breaker implementation
25
+ *
26
+ * Monitors server health and prevents cascade failures by temporarily blocking
27
+ * requests to failing servers. Automatically recovers when server becomes healthy.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const breaker = new CircuitBreaker('memory-server', {
32
+ * failureThreshold: 3,
33
+ * resetTimeout: 30000,
34
+ * halfOpenSuccessThreshold: 1,
35
+ * });
36
+ *
37
+ * // Before making request
38
+ * if (!breaker.canExecute()) {
39
+ * throw new Error('Circuit breaker is OPEN');
40
+ * }
41
+ *
42
+ * try {
43
+ * const result = await makeRequest();
44
+ * breaker.recordSuccess();
45
+ * return result;
46
+ * } catch (error) {
47
+ * breaker.recordFailure();
48
+ * throw error;
49
+ * }
50
+ * ```
51
+ */
52
+ export class CircuitBreaker {
53
+ /**
54
+ * Create a new circuit breaker for a server
55
+ *
56
+ * @param serverName - Name of the server being protected
57
+ * @param config - Circuit breaker configuration options
58
+ */
59
+ constructor(serverName, config = {}) {
60
+ this.state = CircuitState.CLOSED;
61
+ this.failureCount = 0;
62
+ this.successCount = 0;
63
+ this.lastFailureTime = null;
64
+ this.lastSuccessTime = null;
65
+ this.stateChangedAt = Date.now();
66
+ this.resetTimer = null;
67
+ // Metrics tracking
68
+ this.totalRequests = 0;
69
+ this.rejectedRequests = 0;
70
+ this.serverName = serverName;
71
+ this.config = {
72
+ failureThreshold: config.failureThreshold ?? 3,
73
+ resetTimeout: config.resetTimeout ?? 30000,
74
+ halfOpenSuccessThreshold: config.halfOpenSuccessThreshold ?? 1,
75
+ onStateChange: config.onStateChange ?? (() => { }),
76
+ };
77
+ }
78
+ /**
79
+ * Check if a request can be executed
80
+ *
81
+ * @returns true if request should proceed, false if circuit is OPEN
82
+ */
83
+ canExecute() {
84
+ this.totalRequests++;
85
+ switch (this.state) {
86
+ case CircuitState.CLOSED:
87
+ return true;
88
+ case CircuitState.OPEN:
89
+ // Check if reset timeout has elapsed
90
+ if (this.shouldAttemptReset()) {
91
+ this.transitionTo(CircuitState.HALF_OPEN);
92
+ return true;
93
+ }
94
+ this.rejectedRequests++;
95
+ return false;
96
+ case CircuitState.HALF_OPEN:
97
+ // Allow limited requests in HALF_OPEN state
98
+ return true;
99
+ default:
100
+ // Should never reach here
101
+ return false;
102
+ }
103
+ }
104
+ /**
105
+ * Record a successful operation
106
+ *
107
+ * Resets failure count and may transition circuit to CLOSED state
108
+ */
109
+ recordSuccess() {
110
+ this.lastSuccessTime = Date.now();
111
+ switch (this.state) {
112
+ case CircuitState.CLOSED:
113
+ // Reset failure count on success
114
+ this.failureCount = 0;
115
+ break;
116
+ case CircuitState.HALF_OPEN:
117
+ this.successCount++;
118
+ if (this.successCount >= this.config.halfOpenSuccessThreshold) {
119
+ this.transitionTo(CircuitState.CLOSED);
120
+ this.failureCount = 0;
121
+ this.successCount = 0;
122
+ }
123
+ break;
124
+ case CircuitState.OPEN:
125
+ // Should not receive success in OPEN state, but handle gracefully
126
+ console.warn(`[CircuitBreaker] Unexpected success in OPEN state for ${this.serverName}`);
127
+ break;
128
+ }
129
+ }
130
+ /**
131
+ * Record a failed operation
132
+ *
133
+ * Increments failure count and may transition circuit to OPEN state
134
+ */
135
+ recordFailure() {
136
+ this.lastFailureTime = Date.now();
137
+ this.failureCount++;
138
+ switch (this.state) {
139
+ case CircuitState.CLOSED:
140
+ if (this.failureCount >= this.config.failureThreshold) {
141
+ this.transitionTo(CircuitState.OPEN);
142
+ }
143
+ break;
144
+ case CircuitState.HALF_OPEN:
145
+ // Immediate transition to OPEN on failure during recovery test
146
+ this.transitionTo(CircuitState.OPEN);
147
+ this.successCount = 0;
148
+ break;
149
+ case CircuitState.OPEN:
150
+ // Already open, just update timestamp
151
+ break;
152
+ }
153
+ }
154
+ /**
155
+ * Get current circuit breaker state
156
+ *
157
+ * @returns Current state (CLOSED, OPEN, or HALF_OPEN)
158
+ */
159
+ getState() {
160
+ return this.state;
161
+ }
162
+ /**
163
+ * Get circuit breaker metrics
164
+ *
165
+ * @returns Current metrics including state, failure count, etc.
166
+ */
167
+ getMetrics() {
168
+ return {
169
+ state: this.state,
170
+ failures: this.failureCount,
171
+ successes: this.successCount,
172
+ lastFailureTime: this.lastFailureTime,
173
+ lastSuccessTime: this.lastSuccessTime,
174
+ stateChangedAt: this.stateChangedAt,
175
+ totalRequests: this.totalRequests,
176
+ rejectedRequests: this.rejectedRequests,
177
+ };
178
+ }
179
+ /**
180
+ * Manually reset the circuit breaker to CLOSED state
181
+ *
182
+ * Use with caution - typically only for testing or administrative override
183
+ */
184
+ reset() {
185
+ this.transitionTo(CircuitState.CLOSED);
186
+ this.failureCount = 0;
187
+ this.successCount = 0;
188
+ this.lastFailureTime = null;
189
+ this.lastSuccessTime = null;
190
+ }
191
+ /**
192
+ * Check if enough time has passed to attempt reset
193
+ *
194
+ * @returns true if reset timeout has elapsed
195
+ */
196
+ shouldAttemptReset() {
197
+ if (this.lastFailureTime === null) {
198
+ return false;
199
+ }
200
+ const timeSinceLastFailure = Date.now() - this.lastFailureTime;
201
+ return timeSinceLastFailure >= this.config.resetTimeout;
202
+ }
203
+ /**
204
+ * Transition to a new circuit state
205
+ *
206
+ * @param newState - Target state
207
+ */
208
+ transitionTo(newState) {
209
+ const oldState = this.state;
210
+ if (oldState === newState) {
211
+ return;
212
+ }
213
+ this.state = newState;
214
+ this.stateChangedAt = Date.now();
215
+ // Clear any existing reset timer
216
+ if (this.resetTimer) {
217
+ clearTimeout(this.resetTimer);
218
+ this.resetTimer = null;
219
+ }
220
+ // Schedule reset timer for OPEN state
221
+ if (newState === CircuitState.OPEN) {
222
+ this.resetTimer = setTimeout(() => {
223
+ if (this.state === CircuitState.OPEN) {
224
+ this.transitionTo(CircuitState.HALF_OPEN);
225
+ }
226
+ }, this.config.resetTimeout);
227
+ }
228
+ // Log state transition
229
+ console.log(`[CircuitBreaker] ${this.serverName}: ${oldState} → ${newState} ` +
230
+ `(failures: ${this.failureCount}, threshold: ${this.config.failureThreshold})`);
231
+ // Invoke callback
232
+ this.config.onStateChange(oldState, newState, this.serverName);
233
+ }
234
+ /**
235
+ * Clean up resources
236
+ *
237
+ * Call this when circuit breaker is no longer needed
238
+ */
239
+ destroy() {
240
+ if (this.resetTimer) {
241
+ clearTimeout(this.resetTimer);
242
+ this.resetTimer = null;
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Circuit Breaker Manager
248
+ *
249
+ * Manages multiple circuit breakers for different servers.
250
+ * Provides centralized monitoring and control.
251
+ */
252
+ export class CircuitBreakerManager {
253
+ /**
254
+ * Create a new circuit breaker manager
255
+ *
256
+ * @param defaultConfig - Default configuration for all circuit breakers
257
+ */
258
+ constructor(defaultConfig = {}) {
259
+ this.breakers = new Map();
260
+ this.defaultConfig = defaultConfig;
261
+ }
262
+ /**
263
+ * Get or create a circuit breaker for a server
264
+ *
265
+ * @param serverName - Name of the server
266
+ * @param config - Optional server-specific configuration
267
+ * @returns Circuit breaker instance
268
+ */
269
+ getBreaker(serverName, config) {
270
+ let breaker = this.breakers.get(serverName);
271
+ if (!breaker) {
272
+ const finalConfig = { ...this.defaultConfig, ...config };
273
+ breaker = new CircuitBreaker(serverName, finalConfig);
274
+ this.breakers.set(serverName, breaker);
275
+ }
276
+ return breaker;
277
+ }
278
+ /**
279
+ * Get all circuit breakers
280
+ *
281
+ * @returns Map of server names to circuit breakers
282
+ */
283
+ getAllBreakers() {
284
+ return new Map(this.breakers);
285
+ }
286
+ /**
287
+ * Get aggregated metrics for all circuit breakers
288
+ *
289
+ * @returns Array of metrics for all servers
290
+ */
291
+ getAllMetrics() {
292
+ const results = [];
293
+ for (const [serverName, breaker] of this.breakers) {
294
+ results.push({
295
+ serverName,
296
+ metrics: breaker.getMetrics(),
297
+ });
298
+ }
299
+ return results;
300
+ }
301
+ /**
302
+ * Reset a specific circuit breaker
303
+ *
304
+ * @param serverName - Name of the server
305
+ */
306
+ reset(serverName) {
307
+ const breaker = this.breakers.get(serverName);
308
+ if (breaker) {
309
+ breaker.reset();
310
+ }
311
+ }
312
+ /**
313
+ * Reset all circuit breakers
314
+ */
315
+ resetAll() {
316
+ for (const breaker of this.breakers.values()) {
317
+ breaker.reset();
318
+ }
319
+ }
320
+ /**
321
+ * Clean up all circuit breakers
322
+ */
323
+ destroy() {
324
+ for (const breaker of this.breakers.values()) {
325
+ breaker.destroy();
326
+ }
327
+ this.breakers.clear();
328
+ }
329
+ }
330
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/server/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * v1.1.8: Client Detection Module
3
+ * Detects client type and capabilities from request headers
4
+ * Supports: Claude Code, Raycast, Grok, Gemini, GPT, Cursor, Continue, MCP Remote
5
+ */
6
+ export type ClientType = 'claude-code' | 'raycast' | 'grok' | 'gemini' | 'openai' | 'cursor' | 'continue' | 'mcp-remote' | 'unknown';
7
+ export interface ClientCapabilities {
8
+ type: ClientType;
9
+ name: string;
10
+ version?: string;
11
+ userAgent?: string;
12
+ detectedFrom: 'clientInfo' | 'x-mcp-client' | 'user-agent' | 'fallback';
13
+ features: {
14
+ batchRequests: boolean;
15
+ streaming: boolean;
16
+ schemaFormat: 'standard' | 'raycast' | 'minimal';
17
+ toolsListChanged: boolean;
18
+ maxToolsPerResponse: number;
19
+ nestedArguments: boolean;
20
+ };
21
+ }
22
+ /**
23
+ * Detect client from headers (with priority order)
24
+ * Priority: clientInfo > X-MCP-Client > User-Agent > fallback
25
+ */
26
+ export declare function detectClientCapabilities(headers: {
27
+ 'x-mcp-client'?: string;
28
+ 'user-agent'?: string;
29
+ clientinfo?: string;
30
+ [key: string]: string | undefined;
31
+ }): ClientCapabilities;
32
+ /**
33
+ * Format client type for human-readable logging
34
+ */
35
+ export declare function formatClientForLogging(clientType: ClientType): string;
36
+ /**
37
+ * Test helper: Create mock headers for testing
38
+ */
39
+ export declare function createMockHeaders(clientType: ClientType, version?: string): Record<string, string>;
40
+ //# sourceMappingURL=client-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-detection.d.ts","sourceRoot":"","sources":["../../src/server/client-detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAErI,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC;IACxE,QAAQ,EAAE;QACR,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;QACjD,gBAAgB,EAAE,OAAO,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;CACH;AA2LD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC,GAAG,kBAAkB,CA6CrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAcrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKlG"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * v1.1.8: Client Detection Module
3
+ * Detects client type and capabilities from request headers
4
+ * Supports: Claude Code, Raycast, Grok, Gemini, GPT, Cursor, Continue, MCP Remote
5
+ */
6
+ /**
7
+ * Detect client type from User-Agent string
8
+ */
9
+ function parseUserAgent(userAgent) {
10
+ if (!userAgent)
11
+ return null;
12
+ const ua = userAgent.toLowerCase();
13
+ // Claude Code detection
14
+ if (ua.includes('claude-code') || ua.includes('claude-ai') || ua.includes('anthropic')) {
15
+ return 'claude-code';
16
+ }
17
+ // Raycast detection
18
+ if (ua.includes('raycast')) {
19
+ return 'raycast';
20
+ }
21
+ // Grok detection
22
+ if (ua.includes('grok') || ua.includes('x-grok')) {
23
+ return 'grok';
24
+ }
25
+ // Gemini detection
26
+ if (ua.includes('gemini') || ua.includes('google-gemini')) {
27
+ return 'gemini';
28
+ }
29
+ // OpenAI/GPT detection
30
+ if (ua.includes('chatgpt') || ua.includes('openai') || ua.includes('gpt')) {
31
+ return 'openai';
32
+ }
33
+ // Cursor detection
34
+ if (ua.includes('cursor') || ua.includes('cursor-ai')) {
35
+ return 'cursor';
36
+ }
37
+ // Continue detection
38
+ if (ua.includes('continue') || ua.includes('continue-dev')) {
39
+ return 'continue';
40
+ }
41
+ // MCP Remote detection
42
+ if (ua.includes('mcp-remote') || ua.includes('mcp-client')) {
43
+ return 'mcp-remote';
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * Normalize client type string
49
+ */
50
+ function normalizeClientType(clientType) {
51
+ const normalized = clientType.toLowerCase().trim();
52
+ switch (normalized) {
53
+ case 'claude-code':
54
+ case 'claude':
55
+ case 'claude-ai':
56
+ return 'claude-code';
57
+ case 'raycast':
58
+ return 'raycast';
59
+ case 'grok':
60
+ case 'x-grok':
61
+ return 'grok';
62
+ case 'gemini':
63
+ case 'google-gemini':
64
+ return 'gemini';
65
+ case 'openai':
66
+ case 'gpt':
67
+ case 'chatgpt':
68
+ return 'openai';
69
+ case 'cursor':
70
+ case 'cursor-ai':
71
+ return 'cursor';
72
+ case 'continue':
73
+ case 'continue-dev':
74
+ return 'continue';
75
+ case 'mcp-remote':
76
+ case 'mcp-client':
77
+ return 'mcp-remote';
78
+ default:
79
+ return 'unknown';
80
+ }
81
+ }
82
+ /**
83
+ * Get client capabilities based on detected type
84
+ */
85
+ function getClientCapabilities(clientType) {
86
+ switch (clientType) {
87
+ case 'claude-code':
88
+ return {
89
+ batchRequests: true,
90
+ streaming: true,
91
+ schemaFormat: 'standard',
92
+ toolsListChanged: true,
93
+ maxToolsPerResponse: 500,
94
+ nestedArguments: true
95
+ };
96
+ case 'raycast':
97
+ return {
98
+ batchRequests: false,
99
+ streaming: false,
100
+ schemaFormat: 'raycast',
101
+ toolsListChanged: false,
102
+ maxToolsPerResponse: 50,
103
+ nestedArguments: false
104
+ };
105
+ case 'grok':
106
+ return {
107
+ batchRequests: true,
108
+ streaming: true,
109
+ schemaFormat: 'standard',
110
+ toolsListChanged: true,
111
+ maxToolsPerResponse: 300,
112
+ nestedArguments: true
113
+ };
114
+ case 'gemini':
115
+ return {
116
+ batchRequests: false,
117
+ streaming: true,
118
+ schemaFormat: 'standard',
119
+ toolsListChanged: true,
120
+ maxToolsPerResponse: 200,
121
+ nestedArguments: true
122
+ };
123
+ case 'openai':
124
+ return {
125
+ batchRequests: true,
126
+ streaming: true,
127
+ schemaFormat: 'standard',
128
+ toolsListChanged: true,
129
+ maxToolsPerResponse: 400,
130
+ nestedArguments: true
131
+ };
132
+ case 'cursor':
133
+ return {
134
+ batchRequests: true,
135
+ streaming: true,
136
+ schemaFormat: 'standard',
137
+ toolsListChanged: true,
138
+ maxToolsPerResponse: 300,
139
+ nestedArguments: true
140
+ };
141
+ case 'continue':
142
+ return {
143
+ batchRequests: false,
144
+ streaming: true,
145
+ schemaFormat: 'standard',
146
+ toolsListChanged: true,
147
+ maxToolsPerResponse: 150,
148
+ nestedArguments: true
149
+ };
150
+ case 'mcp-remote':
151
+ return {
152
+ batchRequests: true,
153
+ streaming: false,
154
+ schemaFormat: 'standard',
155
+ toolsListChanged: true,
156
+ maxToolsPerResponse: 500,
157
+ nestedArguments: true
158
+ };
159
+ default:
160
+ return {
161
+ batchRequests: false,
162
+ streaming: false,
163
+ schemaFormat: 'standard',
164
+ toolsListChanged: false,
165
+ maxToolsPerResponse: 100,
166
+ nestedArguments: false
167
+ };
168
+ }
169
+ }
170
+ /**
171
+ * Detect client from headers (with priority order)
172
+ * Priority: clientInfo > X-MCP-Client > User-Agent > fallback
173
+ */
174
+ export function detectClientCapabilities(headers) {
175
+ let clientType = 'unknown';
176
+ let detectedFrom = 'fallback';
177
+ let version;
178
+ let userAgent = headers['user-agent'];
179
+ // Priority 1: clientInfo (Claude Code specific)
180
+ if (headers.clientinfo) {
181
+ try {
182
+ const clientInfo = JSON.parse(headers.clientinfo);
183
+ if (clientInfo.type) {
184
+ clientType = normalizeClientType(clientInfo.type);
185
+ detectedFrom = 'clientInfo';
186
+ version = clientInfo.version;
187
+ }
188
+ }
189
+ catch (e) {
190
+ // Fallback to next detection method
191
+ }
192
+ }
193
+ // Priority 2: X-MCP-Client header
194
+ if (detectedFrom === 'fallback' && headers['x-mcp-client']) {
195
+ clientType = normalizeClientType(headers['x-mcp-client']);
196
+ detectedFrom = 'x-mcp-client';
197
+ }
198
+ // Priority 3: User-Agent header
199
+ if (detectedFrom === 'fallback' && userAgent) {
200
+ const detected = parseUserAgent(userAgent);
201
+ if (detected) {
202
+ clientType = detected;
203
+ detectedFrom = 'user-agent';
204
+ }
205
+ }
206
+ const features = getClientCapabilities(clientType);
207
+ return {
208
+ type: clientType,
209
+ name: formatClientForLogging(clientType),
210
+ version,
211
+ userAgent,
212
+ detectedFrom,
213
+ features
214
+ };
215
+ }
216
+ /**
217
+ * Format client type for human-readable logging
218
+ */
219
+ export function formatClientForLogging(clientType) {
220
+ const names = {
221
+ 'claude-code': 'Claude Code',
222
+ 'raycast': 'Raycast',
223
+ 'grok': 'Grok',
224
+ 'gemini': 'Gemini',
225
+ 'openai': 'OpenAI/GPT',
226
+ 'cursor': 'Cursor',
227
+ 'continue': 'Continue',
228
+ 'mcp-remote': 'MCP Remote',
229
+ 'unknown': 'Unknown Client'
230
+ };
231
+ return names[clientType];
232
+ }
233
+ /**
234
+ * Test helper: Create mock headers for testing
235
+ */
236
+ export function createMockHeaders(clientType, version) {
237
+ return {
238
+ 'x-mcp-client': clientType,
239
+ 'user-agent': `MockClient/${version || '1.0'} ${clientType}/1.0`
240
+ };
241
+ }
242
+ //# sourceMappingURL=client-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-detection.js","sourceRoot":"","sources":["../../src/server/client-detection.ts"],"names":[],"mappings":"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"}