synapse-mcp 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/README.md +1820 -147
  2. package/dist/constants.d.ts +10 -4
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +18 -8
  5. package/dist/constants.js.map +1 -1
  6. package/dist/events/emitter.d.ts +63 -0
  7. package/dist/events/emitter.d.ts.map +1 -0
  8. package/dist/events/emitter.js +112 -0
  9. package/dist/events/emitter.js.map +1 -0
  10. package/dist/events/index.d.ts +3 -0
  11. package/dist/events/index.d.ts.map +1 -0
  12. package/dist/events/index.js +3 -0
  13. package/dist/events/index.js.map +1 -0
  14. package/dist/events/types.d.ts +51 -0
  15. package/dist/events/types.d.ts.map +1 -0
  16. package/dist/events/types.js +3 -0
  17. package/dist/events/types.js.map +1 -0
  18. package/dist/formatters/compose.d.ts +185 -0
  19. package/dist/formatters/compose.d.ts.map +1 -0
  20. package/dist/formatters/compose.js +397 -0
  21. package/dist/formatters/compose.js.map +1 -0
  22. package/dist/formatters/container.d.ts +84 -0
  23. package/dist/formatters/container.d.ts.map +1 -0
  24. package/dist/formatters/container.js +323 -0
  25. package/dist/formatters/container.js.map +1 -0
  26. package/dist/formatters/diagnostics.d.ts +20 -0
  27. package/dist/formatters/diagnostics.d.ts.map +1 -0
  28. package/dist/formatters/diagnostics.js +73 -0
  29. package/dist/formatters/diagnostics.js.map +1 -0
  30. package/dist/formatters/docker.d.ts +139 -0
  31. package/dist/formatters/docker.d.ts.map +1 -0
  32. package/dist/formatters/docker.js +216 -0
  33. package/dist/formatters/docker.js.map +1 -0
  34. package/dist/formatters/host.d.ts +137 -0
  35. package/dist/formatters/host.d.ts.map +1 -0
  36. package/dist/formatters/host.js +198 -0
  37. package/dist/formatters/host.js.map +1 -0
  38. package/dist/formatters/index.d.ts +17 -270
  39. package/dist/formatters/index.d.ts.map +1 -1
  40. package/dist/formatters/index.js +21 -456
  41. package/dist/formatters/index.js.map +1 -1
  42. package/dist/formatters/scout.d.ts +424 -0
  43. package/dist/formatters/scout.d.ts.map +1 -0
  44. package/dist/formatters/scout.js +687 -0
  45. package/dist/formatters/scout.js.map +1 -0
  46. package/dist/formatters/strategy.d.ts +105 -0
  47. package/dist/formatters/strategy.d.ts.map +1 -0
  48. package/dist/formatters/strategy.js +120 -0
  49. package/dist/formatters/strategy.js.map +1 -0
  50. package/dist/formatters/utils.d.ts +84 -0
  51. package/dist/formatters/utils.d.ts.map +1 -0
  52. package/dist/formatters/utils.js +129 -0
  53. package/dist/formatters/utils.js.map +1 -0
  54. package/dist/health-rate-limiter.d.ts +59 -0
  55. package/dist/health-rate-limiter.d.ts.map +1 -0
  56. package/dist/health-rate-limiter.js +159 -0
  57. package/dist/health-rate-limiter.js.map +1 -0
  58. package/dist/index.js +61 -100
  59. package/dist/index.js.map +1 -1
  60. package/dist/middleware/async-handler.d.ts +62 -0
  61. package/dist/middleware/async-handler.d.ts.map +1 -0
  62. package/dist/middleware/async-handler.js +58 -0
  63. package/dist/middleware/async-handler.js.map +1 -0
  64. package/dist/middleware/auth.d.ts +32 -0
  65. package/dist/middleware/auth.d.ts.map +1 -0
  66. package/dist/middleware/auth.js +63 -0
  67. package/dist/middleware/auth.js.map +1 -0
  68. package/dist/middleware/csrf-protection.d.ts +58 -0
  69. package/dist/middleware/csrf-protection.d.ts.map +1 -0
  70. package/dist/middleware/csrf-protection.js +123 -0
  71. package/dist/middleware/csrf-protection.js.map +1 -0
  72. package/dist/middleware/error-handler.d.ts +49 -0
  73. package/dist/middleware/error-handler.d.ts.map +1 -0
  74. package/dist/middleware/error-handler.js +90 -0
  75. package/dist/middleware/error-handler.js.map +1 -0
  76. package/dist/middleware/error-mapper.d.ts +44 -0
  77. package/dist/middleware/error-mapper.d.ts.map +1 -0
  78. package/dist/middleware/error-mapper.js +127 -0
  79. package/dist/middleware/error-mapper.js.map +1 -0
  80. package/dist/middleware/index.d.ts +13 -0
  81. package/dist/middleware/index.d.ts.map +1 -0
  82. package/dist/middleware/index.js +13 -0
  83. package/dist/middleware/index.js.map +1 -0
  84. package/dist/middleware/request-id.d.ts +22 -0
  85. package/dist/middleware/request-id.d.ts.map +1 -0
  86. package/dist/middleware/request-id.js +31 -0
  87. package/dist/middleware/request-id.js.map +1 -0
  88. package/dist/middleware/types.d.ts +33 -0
  89. package/dist/middleware/types.d.ts.map +1 -0
  90. package/dist/middleware/types.js +2 -0
  91. package/dist/middleware/types.js.map +1 -0
  92. package/dist/schemas/common.d.ts +205 -8
  93. package/dist/schemas/common.d.ts.map +1 -1
  94. package/dist/schemas/common.js +290 -17
  95. package/dist/schemas/common.js.map +1 -1
  96. package/dist/schemas/flux/compose.d.ts +307 -44
  97. package/dist/schemas/flux/compose.d.ts.map +1 -1
  98. package/dist/schemas/flux/compose.js +74 -48
  99. package/dist/schemas/flux/compose.js.map +1 -1
  100. package/dist/schemas/flux/container.d.ts +423 -56
  101. package/dist/schemas/flux/container.d.ts.map +1 -1
  102. package/dist/schemas/flux/container.js +83 -61
  103. package/dist/schemas/flux/container.js.map +1 -1
  104. package/dist/schemas/flux/docker.d.ts +254 -37
  105. package/dist/schemas/flux/docker.d.ts.map +1 -1
  106. package/dist/schemas/flux/docker.js +69 -39
  107. package/dist/schemas/flux/docker.js.map +1 -1
  108. package/dist/schemas/flux/host.d.ts +312 -29
  109. package/dist/schemas/flux/host.d.ts.map +1 -1
  110. package/dist/schemas/flux/host.js +74 -31
  111. package/dist/schemas/flux/host.js.map +1 -1
  112. package/dist/schemas/flux/index.d.ts +503 -11
  113. package/dist/schemas/flux/index.d.ts.map +1 -1
  114. package/dist/schemas/flux/index.js +34 -70
  115. package/dist/schemas/flux/index.js.map +1 -1
  116. package/dist/schemas/host-config.d.ts +76 -0
  117. package/dist/schemas/host-config.d.ts.map +1 -0
  118. package/dist/schemas/host-config.js +105 -0
  119. package/dist/schemas/host-config.js.map +1 -0
  120. package/dist/schemas/scout/index.d.ts +80 -23
  121. package/dist/schemas/scout/index.d.ts.map +1 -1
  122. package/dist/schemas/scout/index.js +26 -11
  123. package/dist/schemas/scout/index.js.map +1 -1
  124. package/dist/schemas/scout/logs.d.ts +17 -5
  125. package/dist/schemas/scout/logs.d.ts.map +1 -1
  126. package/dist/schemas/scout/logs.js +41 -31
  127. package/dist/schemas/scout/logs.js.map +1 -1
  128. package/dist/schemas/scout/simple.d.ts +126 -11
  129. package/dist/schemas/scout/simple.d.ts.map +1 -1
  130. package/dist/schemas/scout/simple.js +112 -57
  131. package/dist/schemas/scout/simple.js.map +1 -1
  132. package/dist/schemas/scout/zfs.d.ts +17 -5
  133. package/dist/schemas/scout/zfs.d.ts.map +1 -1
  134. package/dist/schemas/scout/zfs.js +34 -25
  135. package/dist/schemas/scout/zfs.js.map +1 -1
  136. package/dist/services/cache-layer.d.ts +160 -0
  137. package/dist/services/cache-layer.d.ts.map +1 -0
  138. package/dist/services/cache-layer.js +138 -0
  139. package/dist/services/cache-layer.js.map +1 -0
  140. package/dist/services/compose-cache.d.ts +75 -0
  141. package/dist/services/compose-cache.d.ts.map +1 -0
  142. package/dist/services/compose-cache.js +178 -0
  143. package/dist/services/compose-cache.js.map +1 -0
  144. package/dist/services/compose-discovery.d.ts +46 -0
  145. package/dist/services/compose-discovery.d.ts.map +1 -0
  146. package/dist/services/compose-discovery.js +219 -0
  147. package/dist/services/compose-discovery.js.map +1 -0
  148. package/dist/services/compose-project-lister.d.ts +27 -0
  149. package/dist/services/compose-project-lister.d.ts.map +1 -0
  150. package/dist/services/compose-project-lister.js +71 -0
  151. package/dist/services/compose-project-lister.js.map +1 -0
  152. package/dist/services/compose-scanner.d.ts +63 -0
  153. package/dist/services/compose-scanner.d.ts.map +1 -0
  154. package/dist/services/compose-scanner.js +253 -0
  155. package/dist/services/compose-scanner.js.map +1 -0
  156. package/dist/services/compose.d.ts +64 -28
  157. package/dist/services/compose.d.ts.map +1 -1
  158. package/dist/services/compose.js +220 -98
  159. package/dist/services/compose.js.map +1 -1
  160. package/dist/services/config-loader.d.ts +23 -0
  161. package/dist/services/config-loader.d.ts.map +1 -0
  162. package/dist/services/config-loader.js +124 -0
  163. package/dist/services/config-loader.js.map +1 -0
  164. package/dist/services/config-service.d.ts +38 -0
  165. package/dist/services/config-service.d.ts.map +1 -0
  166. package/dist/services/config-service.js +225 -0
  167. package/dist/services/config-service.js.map +1 -0
  168. package/dist/services/container-host-map-cache.d.ts +121 -0
  169. package/dist/services/container-host-map-cache.d.ts.map +1 -0
  170. package/dist/services/container-host-map-cache.js +188 -0
  171. package/dist/services/container-host-map-cache.js.map +1 -0
  172. package/dist/services/container.d.ts +194 -6
  173. package/dist/services/container.d.ts.map +1 -1
  174. package/dist/services/container.js +386 -11
  175. package/dist/services/container.js.map +1 -1
  176. package/dist/services/diagnostics.d.ts +57 -0
  177. package/dist/services/diagnostics.d.ts.map +1 -0
  178. package/dist/services/diagnostics.js +271 -0
  179. package/dist/services/diagnostics.js.map +1 -0
  180. package/dist/services/docker/container-service.d.ts +123 -0
  181. package/dist/services/docker/container-service.d.ts.map +1 -0
  182. package/dist/services/docker/container-service.js +347 -0
  183. package/dist/services/docker/container-service.js.map +1 -0
  184. package/dist/services/docker/image-service.d.ts +82 -0
  185. package/dist/services/docker/image-service.d.ts.map +1 -0
  186. package/dist/services/docker/image-service.js +193 -0
  187. package/dist/services/docker/image-service.js.map +1 -0
  188. package/dist/services/docker/index.d.ts +80 -0
  189. package/dist/services/docker/index.d.ts.map +1 -0
  190. package/dist/services/docker/index.js +103 -0
  191. package/dist/services/docker/index.js.map +1 -0
  192. package/dist/services/docker/network-service.d.ts +22 -0
  193. package/dist/services/docker/network-service.d.ts.map +1 -0
  194. package/dist/services/docker/network-service.js +43 -0
  195. package/dist/services/docker/network-service.js.map +1 -0
  196. package/dist/services/docker/system-service.d.ts +49 -0
  197. package/dist/services/docker/system-service.d.ts.map +1 -0
  198. package/dist/services/docker/system-service.js +215 -0
  199. package/dist/services/docker/system-service.js.map +1 -0
  200. package/dist/services/docker/utils/client-factory.d.ts +56 -0
  201. package/dist/services/docker/utils/client-factory.d.ts.map +1 -0
  202. package/dist/services/docker/utils/client-factory.js +139 -0
  203. package/dist/services/docker/utils/client-factory.js.map +1 -0
  204. package/dist/services/docker/utils/client-manager.d.ts +88 -0
  205. package/dist/services/docker/utils/client-manager.d.ts.map +1 -0
  206. package/dist/services/docker/utils/client-manager.js +124 -0
  207. package/dist/services/docker/utils/client-manager.js.map +1 -0
  208. package/dist/services/docker/utils/exec-handler.d.ts +94 -0
  209. package/dist/services/docker/utils/exec-handler.d.ts.map +1 -0
  210. package/dist/services/docker/utils/exec-handler.js +197 -0
  211. package/dist/services/docker/utils/exec-handler.js.map +1 -0
  212. package/dist/services/docker/utils/formatters.d.ts +13 -0
  213. package/dist/services/docker/utils/formatters.d.ts.map +1 -0
  214. package/dist/services/docker/utils/formatters.js +33 -0
  215. package/dist/services/docker/utils/formatters.js.map +1 -0
  216. package/dist/services/docker/utils/log-parser.d.ts +10 -0
  217. package/dist/services/docker/utils/log-parser.d.ts.map +1 -0
  218. package/dist/services/docker/utils/log-parser.js +48 -0
  219. package/dist/services/docker/utils/log-parser.js.map +1 -0
  220. package/dist/services/docker/utils/stats-calculator.d.ts +68 -0
  221. package/dist/services/docker/utils/stats-calculator.d.ts.map +1 -0
  222. package/dist/services/docker/utils/stats-calculator.js +61 -0
  223. package/dist/services/docker/utils/stats-calculator.js.map +1 -0
  224. package/dist/services/docker/volume-service.d.ts +22 -0
  225. package/dist/services/docker/volume-service.d.ts.map +1 -0
  226. package/dist/services/docker/volume-service.js +48 -0
  227. package/dist/services/docker/volume-service.js.map +1 -0
  228. package/dist/services/docker-interfaces.d.ts +283 -0
  229. package/dist/services/docker-interfaces.d.ts.map +1 -0
  230. package/dist/services/docker-interfaces.js +13 -0
  231. package/dist/services/docker-interfaces.js.map +1 -0
  232. package/dist/services/docker.d.ts +42 -5
  233. package/dist/services/docker.d.ts.map +1 -1
  234. package/dist/services/docker.js +335 -127
  235. package/dist/services/docker.js.map +1 -1
  236. package/dist/services/file-service.d.ts +6 -2
  237. package/dist/services/file-service.d.ts.map +1 -1
  238. package/dist/services/file-service.js +156 -52
  239. package/dist/services/file-service.js.map +1 -1
  240. package/dist/services/host-config-repository.d.ts +133 -0
  241. package/dist/services/host-config-repository.d.ts.map +1 -0
  242. package/dist/services/host-config-repository.js +323 -0
  243. package/dist/services/host-config-repository.js.map +1 -0
  244. package/dist/services/host-resolver.d.ts +49 -0
  245. package/dist/services/host-resolver.d.ts.map +1 -0
  246. package/dist/services/host-resolver.js +176 -0
  247. package/dist/services/host-resolver.js.map +1 -0
  248. package/dist/services/interfaces.d.ts +61 -194
  249. package/dist/services/interfaces.d.ts.map +1 -1
  250. package/dist/services/local-executor.d.ts +31 -0
  251. package/dist/services/local-executor.d.ts.map +1 -0
  252. package/dist/services/local-executor.js +71 -0
  253. package/dist/services/local-executor.js.map +1 -0
  254. package/dist/services/ssh-config-loader.d.ts +35 -0
  255. package/dist/services/ssh-config-loader.d.ts.map +1 -0
  256. package/dist/services/ssh-config-loader.js +218 -0
  257. package/dist/services/ssh-config-loader.js.map +1 -0
  258. package/dist/services/ssh-pool.d.ts +26 -1
  259. package/dist/services/ssh-pool.d.ts.map +1 -1
  260. package/dist/services/ssh-pool.js +166 -25
  261. package/dist/services/ssh-pool.js.map +1 -1
  262. package/dist/services/ssh-service.d.ts +3 -0
  263. package/dist/services/ssh-service.d.ts.map +1 -1
  264. package/dist/services/ssh-service.js +53 -31
  265. package/dist/services/ssh-service.js.map +1 -1
  266. package/dist/services/ssh.d.ts +2 -6
  267. package/dist/services/ssh.d.ts.map +1 -1
  268. package/dist/services/ssh.js +9 -40
  269. package/dist/services/ssh.js.map +1 -1
  270. package/dist/tools/definitions/flux.d.ts +13 -0
  271. package/dist/tools/definitions/flux.d.ts.map +1 -0
  272. package/dist/tools/definitions/flux.js +101 -0
  273. package/dist/tools/definitions/flux.js.map +1 -0
  274. package/dist/tools/definitions/index.d.ts +8 -0
  275. package/dist/tools/definitions/index.d.ts.map +1 -0
  276. package/dist/tools/definitions/index.js +8 -0
  277. package/dist/tools/definitions/index.js.map +1 -0
  278. package/dist/tools/definitions/scout.d.ts +13 -0
  279. package/dist/tools/definitions/scout.d.ts.map +1 -0
  280. package/dist/tools/definitions/scout.js +78 -0
  281. package/dist/tools/definitions/scout.js.map +1 -0
  282. package/dist/tools/flux.d.ts +16 -8
  283. package/dist/tools/flux.d.ts.map +1 -1
  284. package/dist/tools/flux.js +27 -66
  285. package/dist/tools/flux.js.map +1 -1
  286. package/dist/tools/handlers/base-handler.d.ts +172 -0
  287. package/dist/tools/handlers/base-handler.d.ts.map +1 -0
  288. package/dist/tools/handlers/base-handler.js +234 -0
  289. package/dist/tools/handlers/base-handler.js.map +1 -0
  290. package/dist/tools/handlers/compose-handlers.d.ts +108 -0
  291. package/dist/tools/handlers/compose-handlers.d.ts.map +1 -0
  292. package/dist/tools/handlers/compose-handlers.js +293 -0
  293. package/dist/tools/handlers/compose-handlers.js.map +1 -0
  294. package/dist/tools/handlers/compose-utils.d.ts +35 -0
  295. package/dist/tools/handlers/compose-utils.d.ts.map +1 -0
  296. package/dist/tools/handlers/compose-utils.js +76 -0
  297. package/dist/tools/handlers/compose-utils.js.map +1 -0
  298. package/dist/tools/handlers/compose.d.ts +23 -0
  299. package/dist/tools/handlers/compose.d.ts.map +1 -0
  300. package/dist/tools/handlers/compose.js +125 -0
  301. package/dist/tools/handlers/compose.js.map +1 -0
  302. package/dist/tools/handlers/container.d.ts +23 -0
  303. package/dist/tools/handlers/container.d.ts.map +1 -0
  304. package/dist/tools/handlers/container.js +333 -0
  305. package/dist/tools/handlers/container.js.map +1 -0
  306. package/dist/tools/handlers/docker.d.ts +24 -0
  307. package/dist/tools/handlers/docker.d.ts.map +1 -0
  308. package/dist/tools/handlers/docker.js +155 -0
  309. package/dist/tools/handlers/docker.js.map +1 -0
  310. package/dist/tools/handlers/host.d.ts +23 -0
  311. package/dist/tools/handlers/host.d.ts.map +1 -0
  312. package/dist/tools/handlers/host.js +196 -0
  313. package/dist/tools/handlers/host.js.map +1 -0
  314. package/dist/tools/handlers/scout-logs.d.ts +24 -0
  315. package/dist/tools/handlers/scout-logs.d.ts.map +1 -0
  316. package/dist/tools/handlers/scout-logs.js +119 -0
  317. package/dist/tools/handlers/scout-logs.js.map +1 -0
  318. package/dist/tools/handlers/scout-simple.d.ts +23 -0
  319. package/dist/tools/handlers/scout-simple.d.ts.map +1 -0
  320. package/dist/tools/handlers/scout-simple.js +286 -0
  321. package/dist/tools/handlers/scout-simple.js.map +1 -0
  322. package/dist/tools/handlers/scout-zfs.d.ts +23 -0
  323. package/dist/tools/handlers/scout-zfs.d.ts.map +1 -0
  324. package/dist/tools/handlers/scout-zfs.js +82 -0
  325. package/dist/tools/handlers/scout-zfs.js.map +1 -0
  326. package/dist/tools/index.d.ts +32 -2
  327. package/dist/tools/index.d.ts.map +1 -1
  328. package/dist/tools/index.js +41 -35
  329. package/dist/tools/index.js.map +1 -1
  330. package/dist/tools/registry.d.ts +135 -0
  331. package/dist/tools/registry.d.ts.map +1 -0
  332. package/dist/tools/registry.js +151 -0
  333. package/dist/tools/registry.js.map +1 -0
  334. package/dist/tools/scout.d.ts +16 -8
  335. package/dist/tools/scout.d.ts.map +1 -1
  336. package/dist/tools/scout.js +36 -78
  337. package/dist/tools/scout.js.map +1 -1
  338. package/dist/types.d.ts +629 -1
  339. package/dist/types.d.ts.map +1 -1
  340. package/dist/types.js.map +1 -1
  341. package/dist/utils/command-security.d.ts +82 -0
  342. package/dist/utils/command-security.d.ts.map +1 -0
  343. package/dist/utils/command-security.js +122 -0
  344. package/dist/utils/command-security.js.map +1 -0
  345. package/dist/utils/error-sanitization.d.ts +77 -0
  346. package/dist/utils/error-sanitization.d.ts.map +1 -0
  347. package/dist/utils/error-sanitization.js +107 -0
  348. package/dist/utils/error-sanitization.js.map +1 -0
  349. package/dist/utils/errors.d.ts +30 -6
  350. package/dist/utils/errors.d.ts.map +1 -1
  351. package/dist/utils/errors.js +91 -12
  352. package/dist/utils/errors.js.map +1 -1
  353. package/dist/utils/help-handler.d.ts +23 -0
  354. package/dist/utils/help-handler.d.ts.map +1 -0
  355. package/dist/utils/help-handler.js +21 -0
  356. package/dist/utils/help-handler.js.map +1 -0
  357. package/dist/utils/help.d.ts +1 -1
  358. package/dist/utils/help.d.ts.map +1 -1
  359. package/dist/utils/help.js +57 -16
  360. package/dist/utils/help.js.map +1 -1
  361. package/dist/utils/host-utils.d.ts +31 -0
  362. package/dist/utils/host-utils.d.ts.map +1 -0
  363. package/dist/utils/host-utils.js +80 -0
  364. package/dist/utils/host-utils.js.map +1 -0
  365. package/dist/utils/index.d.ts +8 -2
  366. package/dist/utils/index.d.ts.map +1 -1
  367. package/dist/utils/index.js +8 -2
  368. package/dist/utils/index.js.map +1 -1
  369. package/dist/utils/init-detection.d.ts +36 -0
  370. package/dist/utils/init-detection.d.ts.map +1 -0
  371. package/dist/utils/init-detection.js +79 -0
  372. package/dist/utils/init-detection.js.map +1 -0
  373. package/dist/utils/logger.d.ts +11 -0
  374. package/dist/utils/logger.d.ts.map +1 -0
  375. package/dist/utils/logger.js +32 -0
  376. package/dist/utils/logger.js.map +1 -0
  377. package/dist/utils/pagination.d.ts +20 -0
  378. package/dist/utils/pagination.d.ts.map +1 -0
  379. package/dist/utils/pagination.js +29 -0
  380. package/dist/utils/pagination.js.map +1 -0
  381. package/dist/utils/path-security.d.ts +132 -18
  382. package/dist/utils/path-security.d.ts.map +1 -1
  383. package/dist/utils/path-security.js +164 -35
  384. package/dist/utils/path-security.js.map +1 -1
  385. package/dist/utils/sorting.d.ts +33 -0
  386. package/dist/utils/sorting.d.ts.map +1 -0
  387. package/dist/utils/sorting.js +57 -0
  388. package/dist/utils/sorting.js.map +1 -0
  389. package/dist/utils/text-filters.d.ts +13 -0
  390. package/dist/utils/text-filters.d.ts.map +1 -0
  391. package/dist/utils/text-filters.js +18 -0
  392. package/dist/utils/text-filters.js.map +1 -0
  393. package/dist/utils/time.d.ts +11 -0
  394. package/dist/utils/time.d.ts.map +1 -0
  395. package/dist/utils/time.js +13 -0
  396. package/dist/utils/time.js.map +1 -0
  397. package/dist/utils/validation.d.ts +25 -0
  398. package/dist/utils/validation.d.ts.map +1 -0
  399. package/dist/utils/validation.js +56 -0
  400. package/dist/utils/validation.js.map +1 -0
  401. package/package.json +45 -19
  402. package/dist/schemas/discriminator.d.ts +0 -20
  403. package/dist/schemas/discriminator.d.ts.map +0 -1
  404. package/dist/schemas/discriminator.js +0 -25
  405. package/dist/schemas/discriminator.js.map +0 -1
  406. package/dist/schemas/unified.d.ts +0 -674
  407. package/dist/schemas/unified.d.ts.map +0 -1
  408. package/dist/schemas/unified.js +0 -453
  409. package/dist/schemas/unified.js.map +0 -1
  410. package/dist/tools/unified.d.ts +0 -7
  411. package/dist/tools/unified.d.ts.map +0 -1
  412. package/dist/tools/unified.js +0 -827
  413. package/dist/tools/unified.js.map +0 -1
@@ -1,18 +1,59 @@
1
- import { DockerService } from "./docker.js";
2
- import { SSHConnectionPoolImpl } from "./ssh-pool.js";
3
- import { SSHService } from "./ssh-service.js";
1
+ import { EventEmitter } from "../events/index.js";
2
+ import { getCurrentTimestamp } from "../utils/time.js";
4
3
  import { ComposeService } from "./compose.js";
4
+ import { ComposeProjectCache } from "./compose-cache.js";
5
+ import { ComposeDiscovery } from "./compose-discovery.js";
6
+ import { ComposeProjectLister } from "./compose-project-lister.js";
7
+ import { ComposeScanner } from "./compose-scanner.js";
8
+ import { ContainerHostMapCache } from "./container-host-map-cache.js";
9
+ import { DockerService } from "./docker/index.js";
5
10
  import { FileService } from "./file-service.js";
11
+ import { HostConfigRepository } from "./host-config-repository.js";
12
+ import { LocalExecutorService } from "./local-executor.js";
13
+ import { SSHConnectionPoolImpl } from "./ssh-pool.js";
14
+ import { SSHService } from "./ssh-service.js";
15
+ /**
16
+ * Service lifecycle state
17
+ */
18
+ export var LifecycleState;
19
+ (function (LifecycleState) {
20
+ /** Container created but not initialized */
21
+ LifecycleState["CREATED"] = "created";
22
+ /** Initialization in progress */
23
+ LifecycleState["INITIALIZING"] = "initializing";
24
+ /** Fully initialized and ready */
25
+ LifecycleState["READY"] = "ready";
26
+ /** Shutdown initiated */
27
+ LifecycleState["SHUTTING_DOWN"] = "shutting_down";
28
+ /** Fully shut down */
29
+ LifecycleState["SHUTDOWN"] = "shutdown";
30
+ })(LifecycleState || (LifecycleState = {}));
6
31
  /**
7
32
  * Service container for dependency injection.
8
33
  * Manages service lifecycle and dependencies.
9
34
  *
10
- * Dependency chain:
35
+ * Lifecycle phases:
36
+ * 1. CREATED - Container instantiated
37
+ * 2. INITIALIZING - Services being initialized (async setup)
38
+ * 3. READY - All services ready, accepting requests
39
+ * 4. SHUTTING_DOWN - Graceful shutdown in progress
40
+ * 5. SHUTDOWN - All services stopped
41
+ *
42
+ * Dependency chain (no circular dependencies):
43
+ * - EventEmitter (no dependencies) - application-wide event bus
44
+ * - LocalExecutorService (no dependencies)
11
45
  * - SSHConnectionPool (no dependencies)
46
+ * - HostConfigRepository (no dependencies)
12
47
  * - SSHService (requires SSHConnectionPool)
13
- * - ComposeService (requires SSHService)
48
+ * - ComposeProjectLister (requires SSHService, LocalExecutorService)
49
+ * - ComposeProjectCache (no dependencies)
50
+ * - ComposeScanner (requires SSHService, LocalExecutorService)
51
+ * - ComposeDiscovery (requires ComposeProjectLister, ComposeProjectCache, ComposeScanner)
52
+ * - ComposeService (requires SSHService, LocalExecutorService, ComposeDiscovery as IComposePathResolver)
14
53
  * - FileService (requires SSHService)
15
54
  * - DockerService (no dependencies)
55
+ * - HostConfigs (loaded once at startup with 60s TTL cache)
56
+ * - ContainerHostMapCache (no dependencies)
16
57
  */
17
58
  export class ServiceContainer {
18
59
  dockerService;
@@ -20,6 +61,18 @@ export class ServiceContainer {
20
61
  composeService;
21
62
  sshPool;
22
63
  fileService;
64
+ localExecutor;
65
+ composeProjectLister;
66
+ composeCache;
67
+ composeScanner;
68
+ composeDiscovery;
69
+ hostConfigRepository;
70
+ containerHostMapCache;
71
+ eventEmitter = new EventEmitter();
72
+ /** Current lifecycle state */
73
+ lifecycleState = LifecycleState.CREATED;
74
+ /** Shutdown timeout in milliseconds */
75
+ shutdownTimeout = 30000; // 30 seconds
23
76
  /**
24
77
  * Get Docker service instance (lazy initialization)
25
78
  */
@@ -63,11 +116,38 @@ export class ServiceContainer {
63
116
  this.sshService = service;
64
117
  }
65
118
  /**
66
- * Get Compose service instance (lazy initialization with dependencies)
119
+ * Get Local executor service instance (lazy initialization)
120
+ */
121
+ getLocalExecutor() {
122
+ if (!this.localExecutor)
123
+ this.localExecutor = new LocalExecutorService();
124
+ return this.localExecutor;
125
+ }
126
+ /**
127
+ * Set Local executor service instance (for testing/overrides)
128
+ */
129
+ setLocalExecutor(service) {
130
+ this.localExecutor = service;
131
+ }
132
+ /**
133
+ * Get Compose project lister instance (lazy initialization).
134
+ * Standalone service for `docker compose ls` - used by ComposeDiscovery
135
+ * to break the former circular dependency.
136
+ */
137
+ getComposeProjectLister() {
138
+ if (!this.composeProjectLister) {
139
+ this.composeProjectLister = new ComposeProjectLister(this.getSSHService(), this.getLocalExecutor());
140
+ }
141
+ return this.composeProjectLister;
142
+ }
143
+ /**
144
+ * Get Compose service instance (lazy initialization with dependencies).
145
+ * ComposeDiscovery is injected as path resolver via constructor (no setter injection).
67
146
  */
68
147
  getComposeService() {
69
- if (!this.composeService)
70
- this.composeService = new ComposeService(this.getSSHService());
148
+ if (!this.composeService) {
149
+ this.composeService = new ComposeService(this.getSSHService(), this.getLocalExecutor(), this.getComposeDiscovery());
150
+ }
71
151
  return this.composeService;
72
152
  }
73
153
  /**
@@ -91,15 +171,310 @@ export class ServiceContainer {
91
171
  this.fileService = service;
92
172
  }
93
173
  /**
94
- * Cleanup all services and close connections.
95
- * Call during shutdown to ensure clean termination.
174
+ * Get Compose project cache instance (lazy initialization)
96
175
  */
97
- async cleanup() {
176
+ getComposeCache() {
177
+ if (!this.composeCache) {
178
+ this.composeCache = new ComposeProjectCache();
179
+ }
180
+ return this.composeCache;
181
+ }
182
+ /**
183
+ * Get Compose scanner instance (lazy initialization with dependencies)
184
+ */
185
+ getComposeScanner() {
186
+ if (!this.composeScanner) {
187
+ this.composeScanner = new ComposeScanner(this.getSSHService(), this.getLocalExecutor());
188
+ }
189
+ return this.composeScanner;
190
+ }
191
+ /**
192
+ * Get Compose discovery instance (lazy initialization with dependencies).
193
+ * Uses ComposeProjectLister (not ComposeService) to avoid circular dependency.
194
+ * Dependency chain: ProjectLister -> Discovery -> ComposeService (linear, no cycle).
195
+ */
196
+ getComposeDiscovery() {
197
+ if (!this.composeDiscovery) {
198
+ this.composeDiscovery = new ComposeDiscovery(this.getComposeProjectLister(), this.getComposeCache(), this.getComposeScanner());
199
+ }
200
+ return this.composeDiscovery;
201
+ }
202
+ /**
203
+ * Get Host config repository instance (lazy initialization)
204
+ */
205
+ getHostConfigRepository() {
206
+ if (!this.hostConfigRepository) {
207
+ // Enable cache by default to avoid 5-50ms per-request file I/O
208
+ this.hostConfigRepository = new HostConfigRepository({ enableCache: true });
209
+ }
210
+ return this.hostConfigRepository;
211
+ }
212
+ /**
213
+ * Set Host config repository instance (for testing/overrides)
214
+ */
215
+ setHostConfigRepository(repository) {
216
+ this.hostConfigRepository = repository;
217
+ }
218
+ /**
219
+ * Get Container host map cache instance (lazy initialization)
220
+ */
221
+ getContainerHostMapCache() {
222
+ if (!this.containerHostMapCache)
223
+ this.containerHostMapCache = new ContainerHostMapCache();
224
+ return this.containerHostMapCache;
225
+ }
226
+ /**
227
+ * Set Container host map cache instance (for testing/overrides)
228
+ */
229
+ setContainerHostMapCache(cache) {
230
+ this.containerHostMapCache = cache;
231
+ }
232
+ /**
233
+ * Get EventEmitter instance (application-wide event bus).
234
+ * Use this to emit or subscribe to application events.
235
+ */
236
+ getEventEmitter() {
237
+ return this.eventEmitter;
238
+ }
239
+ /**
240
+ * Get current lifecycle state
241
+ */
242
+ getLifecycleState() {
243
+ return this.lifecycleState;
244
+ }
245
+ /**
246
+ * Check if container is ready to accept requests
247
+ */
248
+ isReady() {
249
+ return this.lifecycleState === LifecycleState.READY;
250
+ }
251
+ /**
252
+ * Initialize container and perform async service setup
253
+ *
254
+ * Performs:
255
+ * 1. Preload host configurations
256
+ * 2. Start SSH connection pool health checks
257
+ * 3. Emit lifecycle events
258
+ *
259
+ * @throws {Error} If already initialized or shutting down
260
+ *
261
+ * @example
262
+ * ```typescript
263
+ * const container = new ServiceContainer();
264
+ * await container.initialize();
265
+ * // Container is now ready to use
266
+ * ```
267
+ */
268
+ async initialize() {
269
+ if (this.lifecycleState !== LifecycleState.CREATED) {
270
+ throw new Error(`Cannot initialize: container is ${this.lifecycleState}. Must be in CREATED state.`);
271
+ }
272
+ this.lifecycleState = LifecycleState.INITIALIZING;
273
+ this.eventEmitter.emit({
274
+ type: "container_state_changed",
275
+ containerId: "service-container",
276
+ action: "start",
277
+ host: "local",
278
+ timestamp: getCurrentTimestamp(),
279
+ });
280
+ try {
281
+ // Preload host configurations (enables caching)
282
+ const hostRepo = this.getHostConfigRepository();
283
+ await hostRepo.loadHosts();
284
+ // SSH pool starts health checks automatically when first connection is created
285
+ // No explicit initialization needed
286
+ this.lifecycleState = LifecycleState.READY;
287
+ this.eventEmitter.emit({
288
+ type: "container_state_changed",
289
+ containerId: "service-container",
290
+ action: "start",
291
+ host: "local",
292
+ timestamp: getCurrentTimestamp(),
293
+ });
294
+ }
295
+ catch (error) {
296
+ this.lifecycleState = LifecycleState.CREATED; // Reset to created on failure
297
+ throw new Error(`Container initialization failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
298
+ }
299
+ }
300
+ /**
301
+ * Perform health checks on all initialized services
302
+ *
303
+ * Returns health status for each service. Useful for monitoring
304
+ * and graceful degradation.
305
+ *
306
+ * @returns Array of service health statuses
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const health = await container.healthCheck();
311
+ * const unhealthy = health.filter(h => !h.healthy);
312
+ * if (unhealthy.length > 0) {
313
+ * console.error('Unhealthy services:', unhealthy);
314
+ * }
315
+ * ```
316
+ */
317
+ async healthCheck() {
318
+ const results = [];
319
+ // Check SSH connection pool
320
+ if (this.sshPool) {
321
+ const startTime = Date.now();
322
+ try {
323
+ const poolHealth = this.sshPool.getHealth();
324
+ results.push({
325
+ name: "SSHConnectionPool",
326
+ healthy: poolHealth.healthy,
327
+ message: poolHealth.healthy ? undefined : "Pool unhealthy or has failed connections",
328
+ responseTime: Date.now() - startTime,
329
+ });
330
+ }
331
+ catch (error) {
332
+ results.push({
333
+ name: "SSHConnectionPool",
334
+ healthy: false,
335
+ message: error instanceof Error ? error.message : String(error),
336
+ responseTime: Date.now() - startTime,
337
+ });
338
+ }
339
+ }
340
+ // Check host config repository (can it load hosts?)
341
+ if (this.hostConfigRepository) {
342
+ const startTime = Date.now();
343
+ try {
344
+ const hosts = await this.hostConfigRepository.loadHosts();
345
+ results.push({
346
+ name: "HostConfigRepository",
347
+ healthy: hosts.length > 0,
348
+ message: hosts.length === 0 ? "No hosts configured" : undefined,
349
+ responseTime: Date.now() - startTime,
350
+ });
351
+ }
352
+ catch (error) {
353
+ results.push({
354
+ name: "HostConfigRepository",
355
+ healthy: false,
356
+ message: error instanceof Error ? error.message : String(error),
357
+ responseTime: Date.now() - startTime,
358
+ });
359
+ }
360
+ }
361
+ // Check Docker service (is it instantiated?)
362
+ if (this.dockerService) {
363
+ results.push({
364
+ name: "DockerService",
365
+ healthy: true,
366
+ message: "Service instantiated",
367
+ });
368
+ }
369
+ // Check event emitter (listener count as health indicator)
370
+ const eventTypes = [
371
+ "cache_invalidated",
372
+ "container_state_changed",
373
+ "compose_operation",
374
+ ];
375
+ const listenerCount = eventTypes.reduce((sum, eventType) => sum + this.eventEmitter.listenerCount(eventType), 0);
376
+ results.push({
377
+ name: "EventEmitter",
378
+ healthy: true,
379
+ message: `${listenerCount} active listeners`,
380
+ });
381
+ return results;
382
+ }
383
+ /**
384
+ * Gracefully shut down container and all services
385
+ *
386
+ * Performs ordered shutdown:
387
+ * 1. Stop accepting new requests (set state to SHUTTING_DOWN)
388
+ * 2. Wait for in-flight operations (via timeout)
389
+ * 3. Close all connections
390
+ * 4. Clear caches
391
+ * 5. Emit shutdown complete event
392
+ *
393
+ * @param timeout - Maximum time to wait for graceful shutdown (ms)
394
+ * @throws {Error} If shutdown times out
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * // Graceful shutdown with 30s timeout
399
+ * await container.shutdown();
400
+ *
401
+ * // Custom timeout
402
+ * await container.shutdown(10000); // 10 seconds
403
+ * ```
404
+ */
405
+ async shutdown(timeout = this.shutdownTimeout) {
406
+ if (this.lifecycleState === LifecycleState.SHUTDOWN) {
407
+ return; // Already shut down
408
+ }
409
+ if (this.lifecycleState === LifecycleState.SHUTTING_DOWN) {
410
+ throw new Error("Shutdown already in progress");
411
+ }
412
+ this.lifecycleState = LifecycleState.SHUTTING_DOWN;
413
+ this.eventEmitter.emit({
414
+ type: "container_state_changed",
415
+ containerId: "service-container",
416
+ action: "stop",
417
+ host: "local",
418
+ timestamp: getCurrentTimestamp(),
419
+ });
420
+ let timeoutId;
421
+ try {
422
+ // Create timeout promise with clearable timer to prevent leaks
423
+ const timeoutPromise = new Promise((_, reject) => {
424
+ timeoutId = setTimeout(() => reject(new Error(`Shutdown timed out after ${timeout}ms`)), timeout);
425
+ });
426
+ // Perform cleanup with timeout (closes connections, clears caches)
427
+ await Promise.race([this.performCleanup(), timeoutPromise]);
428
+ this.lifecycleState = LifecycleState.SHUTDOWN;
429
+ // Emit final shutdown event BEFORE removing listeners so subscribers
430
+ // can observe the shutdown completion
431
+ this.eventEmitter.emit({
432
+ type: "container_state_changed",
433
+ containerId: "service-container",
434
+ action: "stop",
435
+ host: "local",
436
+ timestamp: getCurrentTimestamp(),
437
+ });
438
+ // Now safe to remove all listeners
439
+ this.eventEmitter.removeAllListeners();
440
+ }
441
+ catch (error) {
442
+ // Even if timeout occurs, mark as shutdown and clean up listeners
443
+ this.lifecycleState = LifecycleState.SHUTDOWN;
444
+ this.eventEmitter.removeAllListeners();
445
+ throw error;
446
+ }
447
+ finally {
448
+ // Clear the timeout timer to prevent leaks and unhandled rejections
449
+ if (timeoutId !== undefined)
450
+ clearTimeout(timeoutId);
451
+ }
452
+ }
453
+ /**
454
+ * Close connections and clear caches without removing event listeners.
455
+ * Used internally by shutdown() which handles listener cleanup after
456
+ * emitting the final shutdown event.
457
+ */
458
+ async performCleanup() {
98
459
  if (this.sshPool)
99
460
  await this.sshPool.closeAll();
100
461
  if (this.dockerService) {
101
462
  this.dockerService.clearClients();
102
463
  }
464
+ if (this.hostConfigRepository) {
465
+ this.hostConfigRepository.clearCache();
466
+ }
467
+ }
468
+ /**
469
+ * Cleanup all services and close connections.
470
+ * Call during shutdown to ensure clean termination.
471
+ *
472
+ * @deprecated Use shutdown() for graceful shutdown with timeout.
473
+ * This method is kept for backward compatibility but performs immediate cleanup.
474
+ */
475
+ async cleanup() {
476
+ await this.performCleanup();
477
+ this.eventEmitter.removeAllListeners();
103
478
  }
104
479
  }
105
480
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gBAAgB;IACnB,aAAa,CAAkB;IAC/B,UAAU,CAAe;IACzB,cAAc,CAAmB;IACjC,OAAO,CAAsB;IAC7B,WAAW,CAAgB;IAEnC;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAuB;QACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,IAAwB;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAoB;QAChC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAwB;QACxC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAqB;QAClC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Diagnostic checks for host health monitoring
3
+ *
4
+ * Provides actionable health checks for Docker hosts:
5
+ * - Resources: CPU/memory/disk thresholds
6
+ * - Containers: Exited/unhealthy container detection
7
+ * - Logs: Recent error pattern scanning
8
+ * - Processes: Zombie/defunct process detection
9
+ * - Docker: Daemon health verification
10
+ * - Network: Connectivity testing
11
+ */
12
+ import type { HostConfig } from "../types.js";
13
+ import type { ISSHService, IDockerService } from "./interfaces.js";
14
+ /**
15
+ * Diagnostic check status
16
+ */
17
+ export type DiagnosticStatus = "pass" | "warn" | "fail";
18
+ /**
19
+ * Result of a diagnostic check
20
+ */
21
+ export interface DiagnosticCheckResult {
22
+ status: DiagnosticStatus;
23
+ message: string;
24
+ details?: string;
25
+ recommendations?: string;
26
+ }
27
+ /**
28
+ * Check host resources (CPU, memory, disk)
29
+ * Warns if any resource exceeds 80% usage
30
+ */
31
+ export declare function checkResources(host: HostConfig, sshService: ISSHService): Promise<DiagnosticCheckResult>;
32
+ /**
33
+ * Check container health
34
+ * Finds exited or unhealthy containers
35
+ */
36
+ export declare function checkContainers(host: HostConfig, dockerService: IDockerService): Promise<DiagnosticCheckResult>;
37
+ /**
38
+ * Check system logs for error patterns
39
+ * Scans journalctl for recent errors/warnings
40
+ */
41
+ export declare function checkLogs(host: HostConfig, sshService: ISSHService): Promise<DiagnosticCheckResult>;
42
+ /**
43
+ * Check for zombie or defunct processes
44
+ * Detects processes that failed to clean up properly
45
+ */
46
+ export declare function checkProcesses(host: HostConfig, sshService: ISSHService): Promise<DiagnosticCheckResult>;
47
+ /**
48
+ * Check Docker daemon health
49
+ * Verifies Docker API connectivity and version
50
+ */
51
+ export declare function checkDocker(host: HostConfig, dockerService: IDockerService): Promise<DiagnosticCheckResult>;
52
+ /**
53
+ * Check network connectivity
54
+ * Tests external connectivity and measures latency
55
+ */
56
+ export declare function checkNetwork(host: HostConfig, sshService: ISSHService): Promise<DiagnosticCheckResult>;
57
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/services/diagnostics.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGnE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,qBAAqB,CAAC,CAoDhC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAsDhC;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,qBAAqB,CAAC,CA4ChC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,qBAAqB,CAAC,CA0ChC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAuBhC;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,qBAAqB,CAAC,CAqChC"}