kubeview-mcp 1.0.0

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 (454) hide show
  1. package/.prettierrc.json +11 -0
  2. package/CHANGELOG.md +55 -0
  3. package/LICENSE +21 -0
  4. package/README.md +251 -0
  5. package/RELEASE.md +154 -0
  6. package/TODO.md +0 -0
  7. package/bin/kubeview-mcp.js +274 -0
  8. package/bin/setup.js +368 -0
  9. package/dist/src/cli/cli.d.ts +3 -0
  10. package/dist/src/cli/cli.d.ts.map +1 -0
  11. package/dist/src/cli/cli.js +23 -0
  12. package/dist/src/cli/cli.js.map +1 -0
  13. package/dist/src/index.d.ts +8 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +45 -0
  16. package/dist/src/index.js.map +1 -0
  17. package/dist/src/kubernetes/BaseResourceOperations.d.ts +155 -0
  18. package/dist/src/kubernetes/BaseResourceOperations.d.ts.map +1 -0
  19. package/dist/src/kubernetes/BaseResourceOperations.js +136 -0
  20. package/dist/src/kubernetes/BaseResourceOperations.js.map +1 -0
  21. package/dist/src/kubernetes/CircuitBreaker.d.ts +182 -0
  22. package/dist/src/kubernetes/CircuitBreaker.d.ts.map +1 -0
  23. package/dist/src/kubernetes/CircuitBreaker.js +369 -0
  24. package/dist/src/kubernetes/CircuitBreaker.js.map +1 -0
  25. package/dist/src/kubernetes/ConnectionManager.d.ts +60 -0
  26. package/dist/src/kubernetes/ConnectionManager.d.ts.map +1 -0
  27. package/dist/src/kubernetes/ConnectionManager.js +77 -0
  28. package/dist/src/kubernetes/ConnectionManager.js.map +1 -0
  29. package/dist/src/kubernetes/ConnectionPool.d.ts +183 -0
  30. package/dist/src/kubernetes/ConnectionPool.d.ts.map +1 -0
  31. package/dist/src/kubernetes/ConnectionPool.js +437 -0
  32. package/dist/src/kubernetes/ConnectionPool.js.map +1 -0
  33. package/dist/src/kubernetes/ErrorHandler.d.ts +172 -0
  34. package/dist/src/kubernetes/ErrorHandler.d.ts.map +1 -0
  35. package/dist/src/kubernetes/ErrorHandler.js +328 -0
  36. package/dist/src/kubernetes/ErrorHandler.js.map +1 -0
  37. package/dist/src/kubernetes/ErrorHandling.d.ts +148 -0
  38. package/dist/src/kubernetes/ErrorHandling.d.ts.map +1 -0
  39. package/dist/src/kubernetes/ErrorHandling.js +304 -0
  40. package/dist/src/kubernetes/ErrorHandling.js.map +1 -0
  41. package/dist/src/kubernetes/KubernetesClient.d.ts +162 -0
  42. package/dist/src/kubernetes/KubernetesClient.d.ts.map +1 -0
  43. package/dist/src/kubernetes/KubernetesClient.js +382 -0
  44. package/dist/src/kubernetes/KubernetesClient.js.map +1 -0
  45. package/dist/src/kubernetes/ResourceOperations.d.ts +69 -0
  46. package/dist/src/kubernetes/ResourceOperations.d.ts.map +1 -0
  47. package/dist/src/kubernetes/ResourceOperations.js +99 -0
  48. package/dist/src/kubernetes/ResourceOperations.js.map +1 -0
  49. package/dist/src/kubernetes/RetryStrategy.d.ts +137 -0
  50. package/dist/src/kubernetes/RetryStrategy.d.ts.map +1 -0
  51. package/dist/src/kubernetes/RetryStrategy.js +277 -0
  52. package/dist/src/kubernetes/RetryStrategy.js.map +1 -0
  53. package/dist/src/kubernetes/RetryableOperation.d.ts +118 -0
  54. package/dist/src/kubernetes/RetryableOperation.d.ts.map +1 -0
  55. package/dist/src/kubernetes/RetryableOperation.js +233 -0
  56. package/dist/src/kubernetes/RetryableOperation.js.map +1 -0
  57. package/dist/src/kubernetes/index.d.ts +18 -0
  58. package/dist/src/kubernetes/index.d.ts.map +1 -0
  59. package/dist/src/kubernetes/index.js +28 -0
  60. package/dist/src/kubernetes/index.js.map +1 -0
  61. package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts +60 -0
  62. package/dist/src/kubernetes/resources/ConfigMapOperations.d.ts.map +1 -0
  63. package/dist/src/kubernetes/resources/ConfigMapOperations.js +306 -0
  64. package/dist/src/kubernetes/resources/ConfigMapOperations.js.map +1 -0
  65. package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts +55 -0
  66. package/dist/src/kubernetes/resources/CustomResourceOperations.d.ts.map +1 -0
  67. package/dist/src/kubernetes/resources/CustomResourceOperations.js +363 -0
  68. package/dist/src/kubernetes/resources/CustomResourceOperations.js.map +1 -0
  69. package/dist/src/kubernetes/resources/DeploymentOperations.d.ts +66 -0
  70. package/dist/src/kubernetes/resources/DeploymentOperations.d.ts.map +1 -0
  71. package/dist/src/kubernetes/resources/DeploymentOperations.js +234 -0
  72. package/dist/src/kubernetes/resources/DeploymentOperations.js.map +1 -0
  73. package/dist/src/kubernetes/resources/IngressOperations.d.ts +60 -0
  74. package/dist/src/kubernetes/resources/IngressOperations.d.ts.map +1 -0
  75. package/dist/src/kubernetes/resources/IngressOperations.js +224 -0
  76. package/dist/src/kubernetes/resources/IngressOperations.js.map +1 -0
  77. package/dist/src/kubernetes/resources/MetricOperations.d.ts +218 -0
  78. package/dist/src/kubernetes/resources/MetricOperations.d.ts.map +1 -0
  79. package/dist/src/kubernetes/resources/MetricOperations.js +893 -0
  80. package/dist/src/kubernetes/resources/MetricOperations.js.map +1 -0
  81. package/dist/src/kubernetes/resources/NamespaceOperations.d.ts +38 -0
  82. package/dist/src/kubernetes/resources/NamespaceOperations.d.ts.map +1 -0
  83. package/dist/src/kubernetes/resources/NamespaceOperations.js +101 -0
  84. package/dist/src/kubernetes/resources/NamespaceOperations.js.map +1 -0
  85. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts +109 -0
  86. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.d.ts.map +1 -0
  87. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js +383 -0
  88. package/dist/src/kubernetes/resources/PersistentVolumeClaimOperations.js.map +1 -0
  89. package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts +97 -0
  90. package/dist/src/kubernetes/resources/PersistentVolumeOperations.d.ts.map +1 -0
  91. package/dist/src/kubernetes/resources/PersistentVolumeOperations.js +321 -0
  92. package/dist/src/kubernetes/resources/PersistentVolumeOperations.js.map +1 -0
  93. package/dist/src/kubernetes/resources/PodOperations.d.ts +99 -0
  94. package/dist/src/kubernetes/resources/PodOperations.d.ts.map +1 -0
  95. package/dist/src/kubernetes/resources/PodOperations.js +333 -0
  96. package/dist/src/kubernetes/resources/PodOperations.js.map +1 -0
  97. package/dist/src/kubernetes/resources/SecretOperations.d.ts +71 -0
  98. package/dist/src/kubernetes/resources/SecretOperations.d.ts.map +1 -0
  99. package/dist/src/kubernetes/resources/SecretOperations.js +254 -0
  100. package/dist/src/kubernetes/resources/SecretOperations.js.map +1 -0
  101. package/dist/src/kubernetes/resources/ServiceOperations.d.ts +64 -0
  102. package/dist/src/kubernetes/resources/ServiceOperations.d.ts.map +1 -0
  103. package/dist/src/kubernetes/resources/ServiceOperations.js +232 -0
  104. package/dist/src/kubernetes/resources/ServiceOperations.js.map +1 -0
  105. package/dist/src/kubernetes/utils/ResourceUtils.d.ts +238 -0
  106. package/dist/src/kubernetes/utils/ResourceUtils.d.ts.map +1 -0
  107. package/dist/src/kubernetes/utils/ResourceUtils.js +439 -0
  108. package/dist/src/kubernetes/utils/ResourceUtils.js.map +1 -0
  109. package/dist/src/plugins/ArgoCDToolsPlugin.d.ts +45 -0
  110. package/dist/src/plugins/ArgoCDToolsPlugin.d.ts.map +1 -0
  111. package/dist/src/plugins/ArgoCDToolsPlugin.js +155 -0
  112. package/dist/src/plugins/ArgoCDToolsPlugin.js.map +1 -0
  113. package/dist/src/plugins/ArgoToolsPlugin.d.ts +45 -0
  114. package/dist/src/plugins/ArgoToolsPlugin.d.ts.map +1 -0
  115. package/dist/src/plugins/ArgoToolsPlugin.js +149 -0
  116. package/dist/src/plugins/ArgoToolsPlugin.js.map +1 -0
  117. package/dist/src/plugins/HelmToolsPlugin.d.ts +41 -0
  118. package/dist/src/plugins/HelmToolsPlugin.d.ts.map +1 -0
  119. package/dist/src/plugins/HelmToolsPlugin.js +146 -0
  120. package/dist/src/plugins/HelmToolsPlugin.js.map +1 -0
  121. package/dist/src/plugins/KubernetesToolsPlugin.d.ts +44 -0
  122. package/dist/src/plugins/KubernetesToolsPlugin.d.ts.map +1 -0
  123. package/dist/src/plugins/KubernetesToolsPlugin.js +159 -0
  124. package/dist/src/plugins/KubernetesToolsPlugin.js.map +1 -0
  125. package/dist/src/plugins/SamplePlugin.d.ts +12 -0
  126. package/dist/src/plugins/SamplePlugin.d.ts.map +1 -0
  127. package/dist/src/plugins/SamplePlugin.js +51 -0
  128. package/dist/src/plugins/SamplePlugin.js.map +1 -0
  129. package/dist/src/plugins/index.d.ts +5 -0
  130. package/dist/src/plugins/index.d.ts.map +1 -0
  131. package/dist/src/plugins/index.js +5 -0
  132. package/dist/src/plugins/index.js.map +1 -0
  133. package/dist/src/server/MCPServer.d.ts +93 -0
  134. package/dist/src/server/MCPServer.d.ts.map +1 -0
  135. package/dist/src/server/MCPServer.js +398 -0
  136. package/dist/src/server/MCPServer.js.map +1 -0
  137. package/dist/src/tools/argo/ArgoCronListTool.d.ts +10 -0
  138. package/dist/src/tools/argo/ArgoCronListTool.d.ts.map +1 -0
  139. package/dist/src/tools/argo/ArgoCronListTool.js +70 -0
  140. package/dist/src/tools/argo/ArgoCronListTool.js.map +1 -0
  141. package/dist/src/tools/argo/ArgoGetTool.d.ts +10 -0
  142. package/dist/src/tools/argo/ArgoGetTool.d.ts.map +1 -0
  143. package/dist/src/tools/argo/ArgoGetTool.js +80 -0
  144. package/dist/src/tools/argo/ArgoGetTool.js.map +1 -0
  145. package/dist/src/tools/argo/ArgoListTool.d.ts +10 -0
  146. package/dist/src/tools/argo/ArgoListTool.d.ts.map +1 -0
  147. package/dist/src/tools/argo/ArgoListTool.js +133 -0
  148. package/dist/src/tools/argo/ArgoListTool.js.map +1 -0
  149. package/dist/src/tools/argo/ArgoLogsTool.d.ts +10 -0
  150. package/dist/src/tools/argo/ArgoLogsTool.d.ts.map +1 -0
  151. package/dist/src/tools/argo/ArgoLogsTool.js +117 -0
  152. package/dist/src/tools/argo/ArgoLogsTool.js.map +1 -0
  153. package/dist/src/tools/argo/BaseTool.d.ts +60 -0
  154. package/dist/src/tools/argo/BaseTool.d.ts.map +1 -0
  155. package/dist/src/tools/argo/BaseTool.js +51 -0
  156. package/dist/src/tools/argo/BaseTool.js.map +1 -0
  157. package/dist/src/tools/argo/index.d.ts +7 -0
  158. package/dist/src/tools/argo/index.d.ts.map +1 -0
  159. package/dist/src/tools/argo/index.js +6 -0
  160. package/dist/src/tools/argo/index.js.map +1 -0
  161. package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts +10 -0
  162. package/dist/src/tools/argocd/ArgoCDAppGetTool.d.ts.map +1 -0
  163. package/dist/src/tools/argocd/ArgoCDAppGetTool.js +97 -0
  164. package/dist/src/tools/argocd/ArgoCDAppGetTool.js.map +1 -0
  165. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts +10 -0
  166. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.d.ts.map +1 -0
  167. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js +80 -0
  168. package/dist/src/tools/argocd/ArgoCDAppHistoryTool.js.map +1 -0
  169. package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts +10 -0
  170. package/dist/src/tools/argocd/ArgoCDAppListTool.d.ts.map +1 -0
  171. package/dist/src/tools/argocd/ArgoCDAppListTool.js +128 -0
  172. package/dist/src/tools/argocd/ArgoCDAppListTool.js.map +1 -0
  173. package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts +10 -0
  174. package/dist/src/tools/argocd/ArgoCDAppLogsTool.d.ts.map +1 -0
  175. package/dist/src/tools/argocd/ArgoCDAppLogsTool.js +143 -0
  176. package/dist/src/tools/argocd/ArgoCDAppLogsTool.js.map +1 -0
  177. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts +10 -0
  178. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.d.ts.map +1 -0
  179. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js +123 -0
  180. package/dist/src/tools/argocd/ArgoCDAppResourcesTool.js.map +1 -0
  181. package/dist/src/tools/argocd/BaseTool.d.ts +71 -0
  182. package/dist/src/tools/argocd/BaseTool.d.ts.map +1 -0
  183. package/dist/src/tools/argocd/BaseTool.js +62 -0
  184. package/dist/src/tools/argocd/BaseTool.js.map +1 -0
  185. package/dist/src/tools/argocd/index.d.ts +8 -0
  186. package/dist/src/tools/argocd/index.d.ts.map +1 -0
  187. package/dist/src/tools/argocd/index.js +7 -0
  188. package/dist/src/tools/argocd/index.js.map +1 -0
  189. package/dist/src/tools/helm/BaseTool.d.ts +51 -0
  190. package/dist/src/tools/helm/BaseTool.d.ts.map +1 -0
  191. package/dist/src/tools/helm/BaseTool.js +42 -0
  192. package/dist/src/tools/helm/BaseTool.js.map +1 -0
  193. package/dist/src/tools/helm/HelmGetHooksTool.d.ts +10 -0
  194. package/dist/src/tools/helm/HelmGetHooksTool.d.ts.map +1 -0
  195. package/dist/src/tools/helm/HelmGetHooksTool.js +38 -0
  196. package/dist/src/tools/helm/HelmGetHooksTool.js.map +1 -0
  197. package/dist/src/tools/helm/HelmGetManifestTool.d.ts +10 -0
  198. package/dist/src/tools/helm/HelmGetManifestTool.d.ts.map +1 -0
  199. package/dist/src/tools/helm/HelmGetManifestTool.js +38 -0
  200. package/dist/src/tools/helm/HelmGetManifestTool.js.map +1 -0
  201. package/dist/src/tools/helm/HelmGetNotesTool.d.ts +10 -0
  202. package/dist/src/tools/helm/HelmGetNotesTool.d.ts.map +1 -0
  203. package/dist/src/tools/helm/HelmGetNotesTool.js +38 -0
  204. package/dist/src/tools/helm/HelmGetNotesTool.js.map +1 -0
  205. package/dist/src/tools/helm/HelmGetResourcesTool.d.ts +13 -0
  206. package/dist/src/tools/helm/HelmGetResourcesTool.d.ts.map +1 -0
  207. package/dist/src/tools/helm/HelmGetResourcesTool.js +124 -0
  208. package/dist/src/tools/helm/HelmGetResourcesTool.js.map +1 -0
  209. package/dist/src/tools/helm/HelmGetValuesTool.d.ts +10 -0
  210. package/dist/src/tools/helm/HelmGetValuesTool.d.ts.map +1 -0
  211. package/dist/src/tools/helm/HelmGetValuesTool.js +54 -0
  212. package/dist/src/tools/helm/HelmGetValuesTool.js.map +1 -0
  213. package/dist/src/tools/helm/HelmHistoryTool.d.ts +10 -0
  214. package/dist/src/tools/helm/HelmHistoryTool.d.ts.map +1 -0
  215. package/dist/src/tools/helm/HelmHistoryTool.js +49 -0
  216. package/dist/src/tools/helm/HelmHistoryTool.js.map +1 -0
  217. package/dist/src/tools/helm/HelmListTool.d.ts +10 -0
  218. package/dist/src/tools/helm/HelmListTool.d.ts.map +1 -0
  219. package/dist/src/tools/helm/HelmListTool.js +107 -0
  220. package/dist/src/tools/helm/HelmListTool.js.map +1 -0
  221. package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts +14 -0
  222. package/dist/src/tools/helm/HelmListWithResourcesTool.d.ts.map +1 -0
  223. package/dist/src/tools/helm/HelmListWithResourcesTool.js +175 -0
  224. package/dist/src/tools/helm/HelmListWithResourcesTool.js.map +1 -0
  225. package/dist/src/tools/helm/HelmStatusTool.d.ts +10 -0
  226. package/dist/src/tools/helm/HelmStatusTool.d.ts.map +1 -0
  227. package/dist/src/tools/helm/HelmStatusTool.js +54 -0
  228. package/dist/src/tools/helm/HelmStatusTool.js.map +1 -0
  229. package/dist/src/tools/helm/index.d.ts +12 -0
  230. package/dist/src/tools/helm/index.d.ts.map +1 -0
  231. package/dist/src/tools/helm/index.js +11 -0
  232. package/dist/src/tools/helm/index.js.map +1 -0
  233. package/dist/src/tools/kubernetes/BaseTool.d.ts +48 -0
  234. package/dist/src/tools/kubernetes/BaseTool.d.ts.map +1 -0
  235. package/dist/src/tools/kubernetes/BaseTool.js +55 -0
  236. package/dist/src/tools/kubernetes/BaseTool.js.map +1 -0
  237. package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts +11 -0
  238. package/dist/src/tools/kubernetes/GetConfigMapTool.d.ts.map +1 -0
  239. package/dist/src/tools/kubernetes/GetConfigMapTool.js +28 -0
  240. package/dist/src/tools/kubernetes/GetConfigMapTool.js.map +1 -0
  241. package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts +15 -0
  242. package/dist/src/tools/kubernetes/GetContainerLogsTool.d.ts.map +1 -0
  243. package/dist/src/tools/kubernetes/GetContainerLogsTool.js +119 -0
  244. package/dist/src/tools/kubernetes/GetContainerLogsTool.js.map +1 -0
  245. package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts +11 -0
  246. package/dist/src/tools/kubernetes/GetDeploymentsTool.d.ts.map +1 -0
  247. package/dist/src/tools/kubernetes/GetDeploymentsTool.js +30 -0
  248. package/dist/src/tools/kubernetes/GetDeploymentsTool.js.map +1 -0
  249. package/dist/src/tools/kubernetes/GetEventsTool.d.ts +11 -0
  250. package/dist/src/tools/kubernetes/GetEventsTool.d.ts.map +1 -0
  251. package/dist/src/tools/kubernetes/GetEventsTool.js +123 -0
  252. package/dist/src/tools/kubernetes/GetEventsTool.js.map +1 -0
  253. package/dist/src/tools/kubernetes/GetIngressTool.d.ts +11 -0
  254. package/dist/src/tools/kubernetes/GetIngressTool.d.ts.map +1 -0
  255. package/dist/src/tools/kubernetes/GetIngressTool.js +35 -0
  256. package/dist/src/tools/kubernetes/GetIngressTool.js.map +1 -0
  257. package/dist/src/tools/kubernetes/GetMetricsTool.d.ts +11 -0
  258. package/dist/src/tools/kubernetes/GetMetricsTool.d.ts.map +1 -0
  259. package/dist/src/tools/kubernetes/GetMetricsTool.js +40 -0
  260. package/dist/src/tools/kubernetes/GetMetricsTool.js.map +1 -0
  261. package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts +11 -0
  262. package/dist/src/tools/kubernetes/GetNamespacesTool.d.ts.map +1 -0
  263. package/dist/src/tools/kubernetes/GetNamespacesTool.js +33 -0
  264. package/dist/src/tools/kubernetes/GetNamespacesTool.js.map +1 -0
  265. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts +11 -0
  266. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.d.ts.map +1 -0
  267. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js +92 -0
  268. package/dist/src/tools/kubernetes/GetPersistentVolumeClaimsTool.js.map +1 -0
  269. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts +11 -0
  270. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.d.ts.map +1 -0
  271. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js +88 -0
  272. package/dist/src/tools/kubernetes/GetPersistentVolumesTool.js.map +1 -0
  273. package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts +11 -0
  274. package/dist/src/tools/kubernetes/GetPodMetricsTool.d.ts.map +1 -0
  275. package/dist/src/tools/kubernetes/GetPodMetricsTool.js +100 -0
  276. package/dist/src/tools/kubernetes/GetPodMetricsTool.js.map +1 -0
  277. package/dist/src/tools/kubernetes/GetPodsTool.d.ts +11 -0
  278. package/dist/src/tools/kubernetes/GetPodsTool.d.ts.map +1 -0
  279. package/dist/src/tools/kubernetes/GetPodsTool.js +35 -0
  280. package/dist/src/tools/kubernetes/GetPodsTool.js.map +1 -0
  281. package/dist/src/tools/kubernetes/GetResourceTool.d.ts +12 -0
  282. package/dist/src/tools/kubernetes/GetResourceTool.d.ts.map +1 -0
  283. package/dist/src/tools/kubernetes/GetResourceTool.js +79 -0
  284. package/dist/src/tools/kubernetes/GetResourceTool.js.map +1 -0
  285. package/dist/src/tools/kubernetes/GetSecretsTool.d.ts +11 -0
  286. package/dist/src/tools/kubernetes/GetSecretsTool.d.ts.map +1 -0
  287. package/dist/src/tools/kubernetes/GetSecretsTool.js +49 -0
  288. package/dist/src/tools/kubernetes/GetSecretsTool.js.map +1 -0
  289. package/dist/src/tools/kubernetes/GetServicesTool.d.ts +11 -0
  290. package/dist/src/tools/kubernetes/GetServicesTool.d.ts.map +1 -0
  291. package/dist/src/tools/kubernetes/GetServicesTool.js +35 -0
  292. package/dist/src/tools/kubernetes/GetServicesTool.js.map +1 -0
  293. package/dist/src/tools/kubernetes/index.d.ts +17 -0
  294. package/dist/src/tools/kubernetes/index.d.ts.map +1 -0
  295. package/dist/src/tools/kubernetes/index.js +16 -0
  296. package/dist/src/tools/kubernetes/index.js.map +1 -0
  297. package/dist/src/utils/CliUtils.d.ts +24 -0
  298. package/dist/src/utils/CliUtils.d.ts.map +1 -0
  299. package/dist/src/utils/CliUtils.js +159 -0
  300. package/dist/src/utils/CliUtils.js.map +1 -0
  301. package/dist/tests/__mocks__/@kubernetes/client-node.d.ts +34 -0
  302. package/dist/tests/__mocks__/@kubernetes/client-node.d.ts.map +1 -0
  303. package/dist/tests/__mocks__/@kubernetes/client-node.js +20 -0
  304. package/dist/tests/__mocks__/@kubernetes/client-node.js.map +1 -0
  305. package/dist/tests/argo/ArgoGetTool.test.d.ts +2 -0
  306. package/dist/tests/argo/ArgoGetTool.test.d.ts.map +1 -0
  307. package/dist/tests/argo/ArgoGetTool.test.js +141 -0
  308. package/dist/tests/argo/ArgoGetTool.test.js.map +1 -0
  309. package/dist/tests/helm/BaseTool.test.d.ts +2 -0
  310. package/dist/tests/helm/BaseTool.test.d.ts.map +1 -0
  311. package/dist/tests/helm/BaseTool.test.js +241 -0
  312. package/dist/tests/helm/BaseTool.test.js.map +1 -0
  313. package/dist/tests/index.test.d.ts +2 -0
  314. package/dist/tests/index.test.d.ts.map +1 -0
  315. package/dist/tests/index.test.js +7 -0
  316. package/dist/tests/index.test.js.map +1 -0
  317. package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts +2 -0
  318. package/dist/tests/kubernetes/ConfigMapOperations.test.d.ts.map +1 -0
  319. package/dist/tests/kubernetes/ConfigMapOperations.test.js +460 -0
  320. package/dist/tests/kubernetes/ConfigMapOperations.test.js.map +1 -0
  321. package/dist/tests/kubernetes/ConnectionManager.test.d.ts +2 -0
  322. package/dist/tests/kubernetes/ConnectionManager.test.d.ts.map +1 -0
  323. package/dist/tests/kubernetes/ConnectionManager.test.js +97 -0
  324. package/dist/tests/kubernetes/ConnectionManager.test.js.map +1 -0
  325. package/dist/tests/kubernetes/ConnectionPool.test.d.ts +2 -0
  326. package/dist/tests/kubernetes/ConnectionPool.test.d.ts.map +1 -0
  327. package/dist/tests/kubernetes/ConnectionPool.test.js +328 -0
  328. package/dist/tests/kubernetes/ConnectionPool.test.js.map +1 -0
  329. package/dist/tests/kubernetes/DeploymentOperations.test.d.ts +2 -0
  330. package/dist/tests/kubernetes/DeploymentOperations.test.d.ts.map +1 -0
  331. package/dist/tests/kubernetes/DeploymentOperations.test.js +196 -0
  332. package/dist/tests/kubernetes/DeploymentOperations.test.js.map +1 -0
  333. package/dist/tests/kubernetes/ErrorHandling.test.d.ts +2 -0
  334. package/dist/tests/kubernetes/ErrorHandling.test.d.ts.map +1 -0
  335. package/dist/tests/kubernetes/ErrorHandling.test.js +329 -0
  336. package/dist/tests/kubernetes/ErrorHandling.test.js.map +1 -0
  337. package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts +2 -0
  338. package/dist/tests/kubernetes/GetPodMetricsTool.test.d.ts.map +1 -0
  339. package/dist/tests/kubernetes/GetPodMetricsTool.test.js +150 -0
  340. package/dist/tests/kubernetes/GetPodMetricsTool.test.js.map +1 -0
  341. package/dist/tests/kubernetes/KubernetesClient.test.d.ts +2 -0
  342. package/dist/tests/kubernetes/KubernetesClient.test.d.ts.map +1 -0
  343. package/dist/tests/kubernetes/KubernetesClient.test.js +371 -0
  344. package/dist/tests/kubernetes/KubernetesClient.test.js.map +1 -0
  345. package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts +2 -0
  346. package/dist/tests/kubernetes/MetricOperations.parsing.test.d.ts.map +1 -0
  347. package/dist/tests/kubernetes/MetricOperations.parsing.test.js +49 -0
  348. package/dist/tests/kubernetes/MetricOperations.parsing.test.js.map +1 -0
  349. package/dist/tests/kubernetes/NamespaceOperations.test.d.ts +2 -0
  350. package/dist/tests/kubernetes/NamespaceOperations.test.d.ts.map +1 -0
  351. package/dist/tests/kubernetes/NamespaceOperations.test.js +115 -0
  352. package/dist/tests/kubernetes/NamespaceOperations.test.js.map +1 -0
  353. package/dist/tests/kubernetes/PodOperations.test.d.ts +2 -0
  354. package/dist/tests/kubernetes/PodOperations.test.d.ts.map +1 -0
  355. package/dist/tests/kubernetes/PodOperations.test.js +209 -0
  356. package/dist/tests/kubernetes/PodOperations.test.js.map +1 -0
  357. package/dist/tests/kubernetes/RetryStrategy.test.d.ts +2 -0
  358. package/dist/tests/kubernetes/RetryStrategy.test.d.ts.map +1 -0
  359. package/dist/tests/kubernetes/RetryStrategy.test.js +419 -0
  360. package/dist/tests/kubernetes/RetryStrategy.test.js.map +1 -0
  361. package/dist/tests/kubernetes/ServiceOperations.test.d.ts +2 -0
  362. package/dist/tests/kubernetes/ServiceOperations.test.d.ts.map +1 -0
  363. package/dist/tests/kubernetes/ServiceOperations.test.js +159 -0
  364. package/dist/tests/kubernetes/ServiceOperations.test.js.map +1 -0
  365. package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts +2 -0
  366. package/dist/tests/plugins/KubernetesToolsPlugin.test.d.ts.map +1 -0
  367. package/dist/tests/plugins/KubernetesToolsPlugin.test.js +153 -0
  368. package/dist/tests/plugins/KubernetesToolsPlugin.test.js.map +1 -0
  369. package/dist/tests/server/MCPServer.integration.test.d.ts +2 -0
  370. package/dist/tests/server/MCPServer.integration.test.d.ts.map +1 -0
  371. package/dist/tests/server/MCPServer.integration.test.js +244 -0
  372. package/dist/tests/server/MCPServer.integration.test.js.map +1 -0
  373. package/dist/tests/server/MCPServer.test.d.ts +2 -0
  374. package/dist/tests/server/MCPServer.test.d.ts.map +1 -0
  375. package/dist/tests/server/MCPServer.test.js +257 -0
  376. package/dist/tests/server/MCPServer.test.js.map +1 -0
  377. package/package.json +85 -0
  378. package/src/cli/cli.ts +25 -0
  379. package/src/cli/run-command.js +391 -0
  380. package/src/index.ts +46 -0
  381. package/src/kubernetes/BaseResourceOperations.ts +286 -0
  382. package/src/kubernetes/CircuitBreaker.ts +485 -0
  383. package/src/kubernetes/ConnectionManager.ts +114 -0
  384. package/src/kubernetes/ConnectionPool.ts +551 -0
  385. package/src/kubernetes/ErrorHandler.ts +436 -0
  386. package/src/kubernetes/ErrorHandling.ts +401 -0
  387. package/src/kubernetes/KubernetesClient.ts +500 -0
  388. package/src/kubernetes/README.md +349 -0
  389. package/src/kubernetes/ResourceOperations.ts +116 -0
  390. package/src/kubernetes/RetryStrategy.ts +365 -0
  391. package/src/kubernetes/RetryableOperation.ts +313 -0
  392. package/src/kubernetes/docs/ResourceOperations.md +606 -0
  393. package/src/kubernetes/index.ts +116 -0
  394. package/src/kubernetes/resources/ConfigMapOperations.ts +367 -0
  395. package/src/kubernetes/resources/CustomResourceOperations.ts +392 -0
  396. package/src/kubernetes/resources/DeploymentOperations.ts +294 -0
  397. package/src/kubernetes/resources/IngressOperations.ts +277 -0
  398. package/src/kubernetes/resources/MetricOperations.ts +1159 -0
  399. package/src/kubernetes/resources/NamespaceOperations.ts +129 -0
  400. package/src/kubernetes/resources/PersistentVolumeClaimOperations.ts +516 -0
  401. package/src/kubernetes/resources/PersistentVolumeOperations.ts +438 -0
  402. package/src/kubernetes/resources/PodOperations.ts +417 -0
  403. package/src/kubernetes/resources/SecretOperations.ts +304 -0
  404. package/src/kubernetes/resources/ServiceOperations.ts +283 -0
  405. package/src/kubernetes/utils/ResourceUtils.ts +553 -0
  406. package/src/plugins/ArgoCDToolsPlugin.ts +189 -0
  407. package/src/plugins/ArgoToolsPlugin.ts +180 -0
  408. package/src/plugins/HelmToolsPlugin.ts +180 -0
  409. package/src/plugins/KubernetesToolsPlugin.ts +198 -0
  410. package/src/plugins/SamplePlugin.ts +60 -0
  411. package/src/plugins/index.ts +4 -0
  412. package/src/server/MCPServer.ts +500 -0
  413. package/src/tools/argo/ArgoCronListTool.ts +78 -0
  414. package/src/tools/argo/ArgoGetTool.ts +91 -0
  415. package/src/tools/argo/ArgoListTool.ts +143 -0
  416. package/src/tools/argo/ArgoLogsTool.ts +131 -0
  417. package/src/tools/argo/BaseTool.ts +69 -0
  418. package/src/tools/argo/index.ts +6 -0
  419. package/src/tools/argocd/ArgoCDAppGetTool.ts +109 -0
  420. package/src/tools/argocd/ArgoCDAppHistoryTool.ts +91 -0
  421. package/src/tools/argocd/ArgoCDAppListTool.ts +144 -0
  422. package/src/tools/argocd/ArgoCDAppLogsTool.ts +162 -0
  423. package/src/tools/argocd/ArgoCDAppResourcesTool.ts +139 -0
  424. package/src/tools/argocd/BaseTool.ts +83 -0
  425. package/src/tools/argocd/index.ts +7 -0
  426. package/src/tools/helm/BaseTool.ts +60 -0
  427. package/src/tools/helm/HelmGetHooksTool.ts +44 -0
  428. package/src/tools/helm/HelmGetManifestTool.ts +44 -0
  429. package/src/tools/helm/HelmGetNotesTool.ts +44 -0
  430. package/src/tools/helm/HelmGetResourcesTool.ts +140 -0
  431. package/src/tools/helm/HelmGetValuesTool.ts +62 -0
  432. package/src/tools/helm/HelmHistoryTool.ts +56 -0
  433. package/src/tools/helm/HelmListTool.ts +107 -0
  434. package/src/tools/helm/HelmListWithResourcesTool.ts +194 -0
  435. package/src/tools/helm/HelmStatusTool.ts +62 -0
  436. package/src/tools/helm/index.ts +11 -0
  437. package/src/tools/kubernetes/BaseTool.ts +76 -0
  438. package/src/tools/kubernetes/GetConfigMapTool.ts +33 -0
  439. package/src/tools/kubernetes/GetContainerLogsTool.ts +140 -0
  440. package/src/tools/kubernetes/GetDeploymentsTool.ts +33 -0
  441. package/src/tools/kubernetes/GetEventsTool.ts +133 -0
  442. package/src/tools/kubernetes/GetIngressTool.ts +39 -0
  443. package/src/tools/kubernetes/GetMetricsTool.ts +53 -0
  444. package/src/tools/kubernetes/GetNamespacesTool.ts +36 -0
  445. package/src/tools/kubernetes/GetPersistentVolumeClaimsTool.ts +113 -0
  446. package/src/tools/kubernetes/GetPersistentVolumesTool.ts +107 -0
  447. package/src/tools/kubernetes/GetPodMetricsTool.ts +113 -0
  448. package/src/tools/kubernetes/GetPodsTool.ts +39 -0
  449. package/src/tools/kubernetes/GetResourceTool.ts +90 -0
  450. package/src/tools/kubernetes/GetSecretsTool.ts +55 -0
  451. package/src/tools/kubernetes/GetServicesTool.ts +39 -0
  452. package/src/tools/kubernetes/index.ts +16 -0
  453. package/src/utils/CliUtils.ts +207 -0
  454. package/tsconfig.json +36 -0
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Circuit Breaker Module
3
+ *
4
+ * Implements the circuit breaker pattern for fault tolerance in distributed systems.
5
+ * Prevents cascading failures by temporarily blocking requests to failing services.
6
+ */
7
+
8
+ import { Logger } from 'winston';
9
+ import { EventEmitter } from 'events';
10
+
11
+ /**
12
+ * Circuit breaker states
13
+ */
14
+ export enum CircuitState {
15
+ CLOSED = 'CLOSED', // Normal operation, requests pass through
16
+ OPEN = 'OPEN', // Circuit broken, requests blocked
17
+ HALF_OPEN = 'HALF_OPEN', // Testing if service recovered
18
+ }
19
+
20
+ /**
21
+ * Circuit breaker configuration
22
+ */
23
+ export interface CircuitBreakerConfig {
24
+ /** Name of the circuit for identification */
25
+ name: string;
26
+ /** Number of failures before opening circuit */
27
+ failureThreshold: number;
28
+ /** Success threshold to close circuit from half-open */
29
+ successThreshold: number;
30
+ /** Time window for counting failures (ms) */
31
+ failureCountWindow: number;
32
+ /** Time to wait before attempting recovery (ms) */
33
+ resetTimeout: number;
34
+ /** Percentage of requests to fail before opening (0-100) */
35
+ failureRateThreshold?: number;
36
+ /** Minimum number of requests before applying rate threshold */
37
+ volumeThreshold?: number;
38
+ /** Optional timeout for operations (ms) */
39
+ operationTimeout?: number;
40
+ /** Function to determine if an error counts as failure */
41
+ isFailure?: (error: any) => boolean;
42
+ /** Fallback function when circuit is open */
43
+ fallback?: <T>() => T | Promise<T>;
44
+ }
45
+
46
+ /**
47
+ * Default circuit breaker configuration
48
+ */
49
+ export const DEFAULT_CIRCUIT_CONFIG: Omit<CircuitBreakerConfig, 'name'> = {
50
+ failureThreshold: 5,
51
+ successThreshold: 2,
52
+ failureCountWindow: 60000, // 1 minute
53
+ resetTimeout: 30000, // 30 seconds
54
+ failureRateThreshold: 50, // 50%
55
+ volumeThreshold: 10,
56
+ operationTimeout: 10000, // 10 seconds
57
+ };
58
+
59
+ /**
60
+ * Circuit breaker statistics
61
+ */
62
+ export interface CircuitStats {
63
+ state: CircuitState;
64
+ failures: number;
65
+ successes: number;
66
+ totalCalls: number;
67
+ lastFailureTime?: Date;
68
+ lastSuccessTime?: Date;
69
+ lastStateChange: Date;
70
+ consecutiveSuccesses: number;
71
+ consecutiveFailures: number;
72
+ failureRate: number;
73
+ }
74
+
75
+ /**
76
+ * Request tracking for sliding window
77
+ */
78
+ interface RequestRecord {
79
+ timestamp: number;
80
+ success: boolean;
81
+ }
82
+
83
+ /**
84
+ * Circuit breaker implementation
85
+ */
86
+ export class CircuitBreaker extends EventEmitter {
87
+ private state: CircuitState = CircuitState.CLOSED;
88
+ private readonly config: CircuitBreakerConfig;
89
+ private readonly logger?: Logger;
90
+
91
+ private stats: CircuitStats;
92
+ private resetTimer?: NodeJS.Timeout;
93
+ private readonly requestHistory: RequestRecord[] = [];
94
+ private lastStateChangeTime: Date = new Date();
95
+
96
+ constructor(config: CircuitBreakerConfig, logger?: Logger) {
97
+ super();
98
+ this.config = { ...DEFAULT_CIRCUIT_CONFIG, ...config };
99
+ this.logger = logger;
100
+
101
+ this.stats = this.initializeStats();
102
+ }
103
+
104
+ /**
105
+ * Execute an operation through the circuit breaker
106
+ */
107
+ async execute<T>(operation: () => Promise<T>): Promise<T> {
108
+ // Check if circuit is open
109
+ if (this.state === CircuitState.OPEN) {
110
+ this.logger?.warn(`Circuit breaker '${this.config.name}' is OPEN, rejecting request`);
111
+ this.emit('fallback');
112
+
113
+ if (this.config.fallback) {
114
+ return this.config.fallback<T>();
115
+ }
116
+
117
+ throw new Error(`Circuit breaker '${this.config.name}' is OPEN`);
118
+ }
119
+
120
+ // Record attempt
121
+ this.stats.totalCalls++;
122
+
123
+ try {
124
+ // Execute with timeout if configured
125
+ const result = await this.executeWithTimeout(operation);
126
+
127
+ // Record success
128
+ this.recordSuccess();
129
+ this.emit('success', result);
130
+
131
+ return result;
132
+ } catch (error) {
133
+ // Check if error should be counted as failure
134
+ if (this.shouldCountAsFailure(error)) {
135
+ this.recordFailure();
136
+ this.emit('failure', error);
137
+ }
138
+
139
+ throw error;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Get current circuit statistics
145
+ */
146
+ getStats(): CircuitStats {
147
+ return {
148
+ ...this.stats,
149
+ state: this.state,
150
+ failureRate: this.calculateFailureRate(),
151
+ };
152
+ }
153
+
154
+ /**
155
+ * Get current state
156
+ */
157
+ getState(): CircuitState {
158
+ return this.state;
159
+ }
160
+
161
+ /**
162
+ * Manually reset the circuit breaker
163
+ */
164
+ reset(): void {
165
+ this.logger?.info(`Manually resetting circuit breaker '${this.config.name}'`);
166
+ this.transition(CircuitState.CLOSED);
167
+ this.stats = this.initializeStats();
168
+ this.requestHistory.length = 0;
169
+ this.clearResetTimer();
170
+ }
171
+
172
+ /**
173
+ * Force open the circuit
174
+ */
175
+ open(): void {
176
+ this.logger?.warn(`Manually opening circuit breaker '${this.config.name}'`);
177
+ this.transition(CircuitState.OPEN);
178
+ }
179
+
180
+ /**
181
+ * Initialize statistics
182
+ */
183
+ private initializeStats(): CircuitStats {
184
+ return {
185
+ state: this.state,
186
+ failures: 0,
187
+ successes: 0,
188
+ totalCalls: 0,
189
+ lastStateChange: new Date(),
190
+ consecutiveSuccesses: 0,
191
+ consecutiveFailures: 0,
192
+ failureRate: 0,
193
+ };
194
+ }
195
+
196
+ /**
197
+ * Execute operation with timeout
198
+ */
199
+ private async executeWithTimeout<T>(operation: () => Promise<T>): Promise<T> {
200
+ if (!this.config.operationTimeout) {
201
+ return operation();
202
+ }
203
+
204
+ return Promise.race([
205
+ operation(),
206
+ new Promise<T>((_, reject) => {
207
+ setTimeout(() => {
208
+ this.emit('timeout');
209
+ reject(new Error(`Operation timed out after ${this.config.operationTimeout}ms`));
210
+ }, this.config.operationTimeout);
211
+ }),
212
+ ]);
213
+ }
214
+
215
+ /**
216
+ * Record successful operation
217
+ */
218
+ private recordSuccess(): void {
219
+ this.stats.successes++;
220
+ this.stats.consecutiveSuccesses++;
221
+ this.stats.consecutiveFailures = 0;
222
+ this.stats.lastSuccessTime = new Date();
223
+
224
+ // Add to history
225
+ this.addToHistory(true);
226
+
227
+ // Handle state transitions
228
+ if (this.state === CircuitState.HALF_OPEN) {
229
+ if (this.stats.consecutiveSuccesses >= this.config.successThreshold) {
230
+ this.logger?.info(
231
+ `Circuit breaker '${this.config.name}' closing after ${this.stats.consecutiveSuccesses} successful attempts`,
232
+ );
233
+ this.transition(CircuitState.CLOSED);
234
+ }
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Record failed operation
240
+ */
241
+ private recordFailure(): void {
242
+ this.stats.failures++;
243
+ this.stats.consecutiveFailures++;
244
+ this.stats.consecutiveSuccesses = 0;
245
+ this.stats.lastFailureTime = new Date();
246
+
247
+ // Add to history
248
+ this.addToHistory(false);
249
+
250
+ // Check if we should open the circuit
251
+ if (this.state === CircuitState.CLOSED || this.state === CircuitState.HALF_OPEN) {
252
+ if (this.shouldOpenCircuit()) {
253
+ this.logger?.warn(
254
+ `Circuit breaker '${this.config.name}' opening after ${this.stats.consecutiveFailures} failures`,
255
+ );
256
+ this.transition(CircuitState.OPEN);
257
+ this.scheduleReset();
258
+ }
259
+ }
260
+ }
261
+
262
+ /**
263
+ * Check if circuit should open based on failure conditions
264
+ */
265
+ private shouldOpenCircuit(): boolean {
266
+ // Check consecutive failure threshold
267
+ if (this.stats.consecutiveFailures >= this.config.failureThreshold) {
268
+ return true;
269
+ }
270
+
271
+ // Check failure rate if configured
272
+ if (this.config.failureRateThreshold && this.config.volumeThreshold) {
273
+ const recentRequests = this.getRecentRequests();
274
+
275
+ if (recentRequests.length >= this.config.volumeThreshold) {
276
+ const failureRate = this.calculateFailureRate();
277
+ if (failureRate >= this.config.failureRateThreshold) {
278
+ this.logger?.warn(
279
+ `Circuit breaker '${this.config.name}' failure rate ${failureRate.toFixed(1)}% exceeds threshold`,
280
+ );
281
+ return true;
282
+ }
283
+ }
284
+ }
285
+
286
+ return false;
287
+ }
288
+
289
+ /**
290
+ * Add request to history
291
+ */
292
+ private addToHistory(success: boolean): void {
293
+ const now = Date.now();
294
+ this.requestHistory.push({ timestamp: now, success });
295
+
296
+ // Clean old entries
297
+ const cutoff = now - this.config.failureCountWindow;
298
+ while (this.requestHistory.length > 0 && this.requestHistory[0].timestamp < cutoff) {
299
+ this.requestHistory.shift();
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Get recent requests within the time window
305
+ */
306
+ private getRecentRequests(): RequestRecord[] {
307
+ const cutoff = Date.now() - this.config.failureCountWindow;
308
+ return this.requestHistory.filter((r) => r.timestamp >= cutoff);
309
+ }
310
+
311
+ /**
312
+ * Calculate current failure rate
313
+ */
314
+ private calculateFailureRate(): number {
315
+ const recent = this.getRecentRequests();
316
+ if (recent.length === 0) return 0;
317
+
318
+ const failures = recent.filter((r) => !r.success).length;
319
+ return (failures / recent.length) * 100;
320
+ }
321
+
322
+ /**
323
+ * Determine if error should count as failure
324
+ */
325
+ private shouldCountAsFailure(error: any): boolean {
326
+ if (this.config.isFailure) {
327
+ return this.config.isFailure(error);
328
+ }
329
+
330
+ // Default: all errors count as failures
331
+ return true;
332
+ }
333
+
334
+ /**
335
+ * Transition to new state
336
+ */
337
+ private transition(newState: CircuitState): void {
338
+ const oldState = this.state;
339
+
340
+ if (oldState === newState) return;
341
+
342
+ this.state = newState;
343
+ this.lastStateChangeTime = new Date();
344
+ this.stats.lastStateChange = this.lastStateChangeTime;
345
+
346
+ // Reset consecutive counters on state change
347
+ if (newState === CircuitState.CLOSED) {
348
+ this.stats.consecutiveFailures = 0;
349
+ this.emit('circuit-close', this.getStats());
350
+ } else if (newState === CircuitState.OPEN) {
351
+ this.stats.consecutiveSuccesses = 0;
352
+ this.emit('circuit-open', this.getStats());
353
+ } else if (newState === CircuitState.HALF_OPEN) {
354
+ this.stats.consecutiveSuccesses = 0;
355
+ this.stats.consecutiveFailures = 0;
356
+ this.emit('circuit-half-open');
357
+ }
358
+
359
+ this.emit('state-change', oldState, newState);
360
+
361
+ this.logger?.info(
362
+ `Circuit breaker '${this.config.name}' state changed: ${oldState} -> ${newState}`,
363
+ );
364
+ }
365
+
366
+ /**
367
+ * Schedule circuit reset attempt
368
+ */
369
+ private scheduleReset(): void {
370
+ this.clearResetTimer();
371
+
372
+ this.resetTimer = setTimeout(() => {
373
+ this.logger?.info(`Circuit breaker '${this.config.name}' attempting reset to HALF_OPEN`);
374
+ this.transition(CircuitState.HALF_OPEN);
375
+ }, this.config.resetTimeout);
376
+ }
377
+
378
+ /**
379
+ * Clear reset timer
380
+ */
381
+ private clearResetTimer(): void {
382
+ if (this.resetTimer) {
383
+ clearTimeout(this.resetTimer);
384
+ this.resetTimer = undefined;
385
+ }
386
+ }
387
+
388
+ /**
389
+ * Cleanup resources
390
+ */
391
+ dispose(): void {
392
+ this.clearResetTimer();
393
+ this.removeAllListeners();
394
+ }
395
+ }
396
+
397
+ /**
398
+ * Circuit breaker factory for managing multiple circuits
399
+ */
400
+ export class CircuitBreakerFactory {
401
+ private readonly circuits = new Map<string, CircuitBreaker>();
402
+ private readonly logger?: Logger;
403
+
404
+ constructor(logger?: Logger) {
405
+ this.logger = logger;
406
+ }
407
+
408
+ /**
409
+ * Get or create a circuit breaker
410
+ */
411
+ getOrCreate(config: CircuitBreakerConfig): CircuitBreaker {
412
+ let circuit = this.circuits.get(config.name);
413
+
414
+ if (!circuit) {
415
+ circuit = new CircuitBreaker(config, this.logger);
416
+ this.circuits.set(config.name, circuit);
417
+ this.logger?.debug(`Created new circuit breaker: ${config.name}`);
418
+ }
419
+
420
+ return circuit;
421
+ }
422
+
423
+ /**
424
+ * Get existing circuit breaker
425
+ */
426
+ get(name: string): CircuitBreaker | undefined {
427
+ return this.circuits.get(name);
428
+ }
429
+
430
+ /**
431
+ * Get all circuit breakers
432
+ */
433
+ getAll(): Map<string, CircuitBreaker> {
434
+ return new Map(this.circuits);
435
+ }
436
+
437
+ /**
438
+ * Get statistics for all circuits
439
+ */
440
+ getAllStats(): Record<string, CircuitStats> {
441
+ const stats: Record<string, CircuitStats> = {};
442
+
443
+ for (const [name, circuit] of this.circuits) {
444
+ stats[name] = circuit.getStats();
445
+ }
446
+
447
+ return stats;
448
+ }
449
+
450
+ /**
451
+ * Reset all circuits
452
+ */
453
+ resetAll(): void {
454
+ for (const circuit of this.circuits.values()) {
455
+ circuit.reset();
456
+ }
457
+ }
458
+
459
+ /**
460
+ * Dispose all circuits
461
+ */
462
+ dispose(): void {
463
+ for (const circuit of this.circuits.values()) {
464
+ circuit.dispose();
465
+ }
466
+ this.circuits.clear();
467
+ }
468
+ }
469
+
470
+ /**
471
+ * Decorator for adding circuit breaker to methods
472
+ */
473
+ export function WithCircuitBreaker(config: Omit<CircuitBreakerConfig, 'name'>) {
474
+ return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
475
+ const originalMethod = descriptor.value;
476
+ const circuitName = `${target.constructor.name}.${propertyKey}`;
477
+ const circuit = new CircuitBreaker({ ...config, name: circuitName });
478
+
479
+ descriptor.value = async function (...args: any[]) {
480
+ return circuit.execute(() => originalMethod.apply(this, args));
481
+ };
482
+
483
+ return descriptor;
484
+ };
485
+ }
@@ -0,0 +1,114 @@
1
+ import * as k8s from '@kubernetes/client-node';
2
+ import { Logger } from 'winston';
3
+ import { EventEmitter } from 'events';
4
+ import { ConnectionPool, ConnectionPoolConfig, ConnectionEntry } from './ConnectionPool.js';
5
+
6
+ /**
7
+ * Configuration for SingleClusterConnectionManager
8
+ */
9
+ export interface ConnectionManagerConfig {
10
+ /**
11
+ * Connection pool configuration
12
+ */
13
+ poolConfig?: ConnectionPoolConfig;
14
+
15
+ /**
16
+ * Logger instance
17
+ */
18
+ logger?: Logger;
19
+ }
20
+
21
+ /**
22
+ * Statistics for the managed cluster
23
+ */
24
+ export interface ClusterStats {
25
+ healthy: boolean;
26
+ poolStats: {
27
+ total: number;
28
+ idle: number;
29
+ inUse: number;
30
+ unhealthy: number;
31
+ waitQueueLength: number;
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Connection manager for handling a single Kubernetes cluster
37
+ */
38
+ export class ConnectionManager extends EventEmitter {
39
+ private readonly pool: ConnectionPool;
40
+ private readonly logger?: Logger;
41
+ private disposed = false;
42
+
43
+ constructor(kubeConfigFactory: () => k8s.KubeConfig, config: ConnectionManagerConfig = {}) {
44
+ super();
45
+ this.logger = config.logger;
46
+ this.pool = new ConnectionPool('default', kubeConfigFactory, {
47
+ ...config.poolConfig,
48
+ logger: this.logger,
49
+ });
50
+ // Forward pool events
51
+ this.pool.on('connectionCreated', (conn) => {
52
+ this.emit('connectionCreated', { connection: conn });
53
+ });
54
+ this.pool.on('connectionRemoved', (conn) => {
55
+ this.emit('connectionRemoved', { connection: conn });
56
+ });
57
+ this.pool.on('connectionAcquired', (conn) => {
58
+ this.emit('connectionAcquired', { connection: conn });
59
+ });
60
+ this.pool.on('connectionReleased', (conn) => {
61
+ this.emit('connectionReleased', { connection: conn });
62
+ });
63
+ }
64
+
65
+ /**
66
+ * Acquire a connection from the pool
67
+ */
68
+ async acquire(): Promise<ConnectionEntry> {
69
+ if (this.disposed) {
70
+ throw new Error('Connection manager has been disposed');
71
+ }
72
+ return this.pool.acquire();
73
+ }
74
+
75
+ /**
76
+ * Release a connection back to the pool
77
+ */
78
+ release(connection: ConnectionEntry): void {
79
+ this.pool.release(connection);
80
+ }
81
+
82
+ /**
83
+ * Get statistics for the cluster
84
+ */
85
+ getStats(): ClusterStats {
86
+ return {
87
+ healthy: this.isClusterHealthy(),
88
+ poolStats: this.pool.stats,
89
+ };
90
+ }
91
+
92
+ /**
93
+ * Check if the cluster is healthy
94
+ */
95
+ private isClusterHealthy(): boolean {
96
+ const stats = this.pool.stats;
97
+ // Consider healthy if at least one available connection
98
+ return stats.total > 0 && (stats.idle > 0 || stats.inUse > 0);
99
+ }
100
+
101
+ /**
102
+ * Dispose of the connection manager
103
+ */
104
+ async dispose(): Promise<void> {
105
+ if (this.disposed) {
106
+ return;
107
+ }
108
+ this.disposed = true;
109
+ this.logger?.info('Disposing connection manager');
110
+ await this.pool.dispose();
111
+ this.emit('disposed');
112
+ this.removeAllListeners();
113
+ }
114
+ }