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
@@ -0,0 +1,23 @@
1
+ import type { HostConfig } from "../types.js";
2
+ /**
3
+ * Get config file search paths (in order of priority)
4
+ * Computed at runtime to support testing with env var changes
5
+ */
6
+ export declare function getConfigPaths(): string[];
7
+ /**
8
+ * Auto-add local Docker socket if it exists and isn't already configured
9
+ */
10
+ export declare function ensureLocalSocket(hosts: HostConfig[]): HostConfig[];
11
+ /**
12
+ * Load host configurations from SSH config, config file, env var, or defaults
13
+ *
14
+ * Priority order:
15
+ * 1. Manual config file (synapse.config.json) - highest priority
16
+ * 2. SYNAPSE_HOSTS_CONFIG environment variable
17
+ * 3. SSH config auto-discovery (~/.ssh/config)
18
+ * 4. Local Docker socket (fallback)
19
+ *
20
+ * Manual hosts completely replace SSH config hosts with the same name.
21
+ */
22
+ export declare function loadHostConfigs(): HostConfig[];
23
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO9C;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAOzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAkCnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAiE9C"}
@@ -0,0 +1,124 @@
1
+ // src/services/config-loader.ts
2
+ import { readFileSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir, hostname } from "node:os";
5
+ import { loadFromSSHConfigSync, mergeHostConfigs } from "./ssh-config-loader.js";
6
+ import { logError } from "../utils/errors.js";
7
+ const DEFAULT_DOCKER_SOCKET = "/var/run/docker.sock";
8
+ const ENV_HOSTS_CONFIG = "SYNAPSE_HOSTS_CONFIG";
9
+ /**
10
+ * Get config file search paths (in order of priority)
11
+ * Computed at runtime to support testing with env var changes
12
+ */
13
+ export function getConfigPaths() {
14
+ return [
15
+ process.env.SYNAPSE_CONFIG_FILE, // Explicit path
16
+ join(process.cwd(), "synapse.config.json"), // Current directory
17
+ join(homedir(), ".config", "synapse-mcp", "config.json"), // XDG style
18
+ join(homedir(), ".synapse-mcp.json") // Dotfile style
19
+ ].filter(Boolean);
20
+ }
21
+ /**
22
+ * Auto-add local Docker socket if it exists and isn't already configured
23
+ */
24
+ export function ensureLocalSocket(hosts) {
25
+ // Check if local socket exists
26
+ if (!existsSync(DEFAULT_DOCKER_SOCKET)) {
27
+ return hosts;
28
+ }
29
+ // Check if any host already uses the local socket
30
+ const hasLocalSocket = hosts.some((h) => h.dockerSocketPath === DEFAULT_DOCKER_SOCKET ||
31
+ h.host === DEFAULT_DOCKER_SOCKET ||
32
+ (h.host === "localhost" && h.dockerSocketPath));
33
+ if (hasLocalSocket) {
34
+ return hosts;
35
+ }
36
+ // Auto-add local socket entry
37
+ const localName = hostname()
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9-]/g, "-") || "local";
40
+ console.error(`Auto-adding local Docker socket as "${localName}"`);
41
+ return [
42
+ ...hosts,
43
+ {
44
+ name: localName,
45
+ host: DEFAULT_DOCKER_SOCKET,
46
+ protocol: "http",
47
+ dockerSocketPath: DEFAULT_DOCKER_SOCKET
48
+ }
49
+ ];
50
+ }
51
+ /**
52
+ * Load host configurations from SSH config, config file, env var, or defaults
53
+ *
54
+ * Priority order:
55
+ * 1. Manual config file (synapse.config.json) - highest priority
56
+ * 2. SYNAPSE_HOSTS_CONFIG environment variable
57
+ * 3. SSH config auto-discovery (~/.ssh/config)
58
+ * 4. Local Docker socket (fallback)
59
+ *
60
+ * Manual hosts completely replace SSH config hosts with the same name.
61
+ */
62
+ export function loadHostConfigs() {
63
+ let manualHosts = [];
64
+ // 1. Try manual config file first
65
+ for (const configPath of getConfigPaths()) {
66
+ if (existsSync(configPath)) {
67
+ try {
68
+ const raw = readFileSync(configPath, "utf-8");
69
+ const config = JSON.parse(raw);
70
+ const configHosts = config.hosts || config; // Support { hosts: [...] } or just [...]
71
+ if (Array.isArray(configHosts) && configHosts.length > 0) {
72
+ console.error(`Loaded ${configHosts.length} hosts from ${configPath}`);
73
+ manualHosts = configHosts;
74
+ break;
75
+ }
76
+ }
77
+ catch (error) {
78
+ logError(error, {
79
+ operation: "loadHostConfigs",
80
+ metadata: { configPath, source: "file" }
81
+ });
82
+ }
83
+ }
84
+ }
85
+ // 2. Fall back to env var if no config file
86
+ if (manualHosts.length === 0) {
87
+ const configJson = process.env[ENV_HOSTS_CONFIG];
88
+ if (configJson) {
89
+ try {
90
+ manualHosts = JSON.parse(configJson);
91
+ console.error(`Loaded ${manualHosts.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
92
+ }
93
+ catch (error) {
94
+ logError(error, {
95
+ operation: "loadHostConfigs",
96
+ metadata: { source: "SYNAPSE_HOSTS_CONFIG" }
97
+ });
98
+ }
99
+ }
100
+ }
101
+ // 3. Load SSH config hosts (auto-discovery)
102
+ const sshConfigPath = join(homedir(), ".ssh", "config");
103
+ const sshHosts = loadFromSSHConfigSync(sshConfigPath);
104
+ if (sshHosts.length > 0) {
105
+ console.error(`Auto-discovered ${sshHosts.length} hosts from SSH config`);
106
+ }
107
+ // 4. Merge hosts with manual taking precedence
108
+ const hosts = mergeHostConfigs(sshHosts, manualHosts);
109
+ // 5. If still no hosts, default to local socket only
110
+ if (hosts.length === 0) {
111
+ console.error("No config found, using local Docker socket");
112
+ return [
113
+ {
114
+ name: "local",
115
+ host: "localhost",
116
+ protocol: "http",
117
+ dockerSocketPath: DEFAULT_DOCKER_SOCKET
118
+ }
119
+ ];
120
+ }
121
+ // 6. Auto-add local socket if exists and not configured
122
+ return ensureLocalSocket(hosts);
123
+ }
124
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { HostConfig } from "../types.js";
2
+ /**
3
+ * ConfigService - Caches host configurations to avoid blocking I/O on every request
4
+ * PERF-C1: Eliminates 2-10ms sync file I/O per tool invocation
5
+ */
6
+ export declare class ConfigService {
7
+ private configCache;
8
+ private cacheTime;
9
+ private configLoadLock;
10
+ private readonly CACHE_TTL;
11
+ /**
12
+ * Load host configurations with caching and async I/O
13
+ *
14
+ * Priority order:
15
+ * 1. Manual config file (synapse.config.json) - highest priority
16
+ * 2. SYNAPSE_HOSTS_CONFIG environment variable
17
+ * 3. SSH config auto-discovery (~/.ssh/config)
18
+ * 4. Local Docker socket (fallback)
19
+ *
20
+ * Manual hosts completely replace SSH config hosts with the same name.
21
+ */
22
+ loadHostConfigs(): Promise<HostConfig[]>;
23
+ /**
24
+ * Internal load implementation
25
+ */
26
+ private _doLoad;
27
+ /**
28
+ * Invalidate cache (for testing or manual refresh)
29
+ */
30
+ invalidateCache(): void;
31
+ }
32
+ export declare const configService: ConfigService;
33
+ /**
34
+ * Legacy sync wrapper for backwards compatibility
35
+ * @deprecated Use configService.loadHostConfigs() instead for async caching
36
+ */
37
+ export declare function loadHostConfigs(): HostConfig[];
38
+ //# sourceMappingURL=config-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../../src/services/config-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoD9C;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;;;;;;OAUG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAuB9C;;OAEG;YACW,OAAO;IAiErB;;OAEG;IACH,eAAe,IAAI,IAAI;CAIxB;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAyE9C"}
@@ -0,0 +1,225 @@
1
+ import { promises as fs } from "fs";
2
+ import { homedir, hostname } from "os";
3
+ import { join } from "path";
4
+ import { DEFAULT_DOCKER_SOCKET, ENV_HOSTS_CONFIG } from "../constants.js";
5
+ import { logError } from "../utils/errors.js";
6
+ import { loadFromSSHConfig, loadFromSSHConfigSync, mergeHostConfigs } from "./ssh-config-loader.js";
7
+ /**
8
+ * Get prioritized list of config file paths
9
+ */
10
+ function getConfigPaths() {
11
+ const configName = "synapse.config.json";
12
+ const paths = [];
13
+ // 1. Explicit path from environment variable (highest priority)
14
+ if (process.env.SYNAPSE_CONFIG_FILE) {
15
+ paths.push(process.env.SYNAPSE_CONFIG_FILE);
16
+ }
17
+ // 2. Standard search paths
18
+ paths.push(join(process.cwd(), configName), join(homedir(), ".config", "synapse", configName), join(homedir(), `.${configName}`), join("/etc", "synapse", configName));
19
+ return paths;
20
+ }
21
+ /**
22
+ * Ensure local Docker socket is included if available
23
+ */
24
+ function ensureLocalSocket(hosts) {
25
+ const localName = `local-${hostname()}`;
26
+ // Check if local socket is already configured
27
+ const hasLocalSocket = hosts.some((h) => h.dockerSocketPath === DEFAULT_DOCKER_SOCKET);
28
+ if (hasLocalSocket) {
29
+ return hosts;
30
+ }
31
+ return [
32
+ ...hosts,
33
+ {
34
+ name: localName,
35
+ host: DEFAULT_DOCKER_SOCKET,
36
+ protocol: "http",
37
+ dockerSocketPath: DEFAULT_DOCKER_SOCKET
38
+ }
39
+ ];
40
+ }
41
+ /**
42
+ * ConfigService - Caches host configurations to avoid blocking I/O on every request
43
+ * PERF-C1: Eliminates 2-10ms sync file I/O per tool invocation
44
+ */
45
+ export class ConfigService {
46
+ configCache = null;
47
+ cacheTime = 0;
48
+ configLoadLock = null;
49
+ CACHE_TTL = 60000; // 60s
50
+ /**
51
+ * Load host configurations with caching and async I/O
52
+ *
53
+ * Priority order:
54
+ * 1. Manual config file (synapse.config.json) - highest priority
55
+ * 2. SYNAPSE_HOSTS_CONFIG environment variable
56
+ * 3. SSH config auto-discovery (~/.ssh/config)
57
+ * 4. Local Docker socket (fallback)
58
+ *
59
+ * Manual hosts completely replace SSH config hosts with the same name.
60
+ */
61
+ async loadHostConfigs() {
62
+ const now = Date.now();
63
+ // Return cached config if still valid
64
+ if (this.configCache && now - this.cacheTime < this.CACHE_TTL) {
65
+ return this.configCache;
66
+ }
67
+ // Prevent concurrent loads with lock
68
+ if (this.configLoadLock) {
69
+ return this.configLoadLock;
70
+ }
71
+ this.configLoadLock = this._doLoad();
72
+ try {
73
+ this.configCache = await this.configLoadLock;
74
+ this.cacheTime = now;
75
+ return this.configCache;
76
+ }
77
+ finally {
78
+ this.configLoadLock = null;
79
+ }
80
+ }
81
+ /**
82
+ * Internal load implementation
83
+ */
84
+ async _doLoad() {
85
+ let manualHosts = [];
86
+ // 1. Try manual config file first (async I/O)
87
+ for (const configPath of getConfigPaths()) {
88
+ try {
89
+ // Check file exists with async stat
90
+ await fs.access(configPath);
91
+ const raw = await fs.readFile(configPath, "utf-8");
92
+ const config = JSON.parse(raw);
93
+ const configHosts = config.hosts || config; // Support { hosts: [...] } or just [...]
94
+ if (Array.isArray(configHosts) && configHosts.length > 0) {
95
+ console.error(`Loaded ${configHosts.length} hosts from ${configPath}`);
96
+ manualHosts = configHosts;
97
+ break;
98
+ }
99
+ }
100
+ catch {
101
+ // File doesn't exist or can't be read - try next path
102
+ continue;
103
+ }
104
+ }
105
+ // 2. Fall back to env var if no config file
106
+ if (manualHosts.length === 0) {
107
+ const configJson = process.env[ENV_HOSTS_CONFIG];
108
+ if (configJson) {
109
+ try {
110
+ manualHosts = JSON.parse(configJson);
111
+ console.error(`Loaded ${manualHosts.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
112
+ }
113
+ catch (error) {
114
+ logError(error, {
115
+ operation: "loadHostConfigs",
116
+ metadata: { source: "SYNAPSE_HOSTS_CONFIG" }
117
+ });
118
+ }
119
+ }
120
+ }
121
+ // 3. Load SSH config hosts (auto-discovery) - already async
122
+ const sshConfigPath = join(homedir(), ".ssh", "config");
123
+ const sshHosts = await loadFromSSHConfig(sshConfigPath);
124
+ if (sshHosts.length > 0) {
125
+ console.error(`Auto-discovered ${sshHosts.length} hosts from SSH config`);
126
+ }
127
+ // 4. Merge hosts with manual taking precedence
128
+ const hosts = mergeHostConfigs(sshHosts, manualHosts);
129
+ // 5. If still no hosts, default to local socket only
130
+ if (hosts.length === 0) {
131
+ console.error("No config found, using local Docker socket");
132
+ return [
133
+ {
134
+ name: "local",
135
+ host: "localhost",
136
+ protocol: "http",
137
+ dockerSocketPath: DEFAULT_DOCKER_SOCKET
138
+ }
139
+ ];
140
+ }
141
+ // 6. Auto-add local socket if exists and not configured
142
+ return ensureLocalSocket(hosts);
143
+ }
144
+ /**
145
+ * Invalidate cache (for testing or manual refresh)
146
+ */
147
+ invalidateCache() {
148
+ this.configCache = null;
149
+ this.cacheTime = 0;
150
+ }
151
+ }
152
+ // Global singleton instance for service-wide caching
153
+ export const configService = new ConfigService();
154
+ /**
155
+ * Legacy sync wrapper for backwards compatibility
156
+ * @deprecated Use configService.loadHostConfigs() instead for async caching
157
+ */
158
+ export function loadHostConfigs() {
159
+ // This is a fallback for sync callers - it will block but at least cache works
160
+ // We need to use the sync version of the old code temporarily
161
+ console.warn("WARNING: Using deprecated sync loadHostConfigs() - migrate to async configService.loadHostConfigs()");
162
+ let manualHosts = [];
163
+ // 1. Try manual config file first
164
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
165
+ const { readFileSync, existsSync } = require("fs");
166
+ for (const configPath of getConfigPaths()) {
167
+ if (existsSync(configPath)) {
168
+ try {
169
+ const raw = readFileSync(configPath, "utf-8");
170
+ const config = JSON.parse(raw);
171
+ const configHosts = config.hosts || config;
172
+ if (Array.isArray(configHosts) && configHosts.length > 0) {
173
+ console.error(`Loaded ${configHosts.length} hosts from ${configPath}`);
174
+ manualHosts = configHosts;
175
+ break;
176
+ }
177
+ }
178
+ catch (error) {
179
+ logError(error, {
180
+ operation: "loadHostConfigs",
181
+ metadata: { configPath, source: "file" }
182
+ });
183
+ }
184
+ }
185
+ }
186
+ // 2. Fall back to env var if no config file
187
+ if (manualHosts.length === 0) {
188
+ const configJson = process.env[ENV_HOSTS_CONFIG];
189
+ if (configJson) {
190
+ try {
191
+ manualHosts = JSON.parse(configJson);
192
+ console.error(`Loaded ${manualHosts.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
193
+ }
194
+ catch (error) {
195
+ logError(error, {
196
+ operation: "loadHostConfigs",
197
+ metadata: { source: "SYNAPSE_HOSTS_CONFIG" }
198
+ });
199
+ }
200
+ }
201
+ }
202
+ // 3. Load SSH config hosts (auto-discovery) - use sync for backwards compat
203
+ const sshConfigPath = join(homedir(), ".ssh", "config");
204
+ const sshHosts = loadFromSSHConfigSync(sshConfigPath);
205
+ if (sshHosts.length > 0) {
206
+ console.error(`Auto-discovered ${sshHosts.length} hosts from SSH config`);
207
+ }
208
+ // 4. Merge hosts with manual taking precedence
209
+ const hosts = mergeHostConfigs(sshHosts, manualHosts);
210
+ // 5. If still no hosts, default to local socket only
211
+ if (hosts.length === 0) {
212
+ console.error("No config found, using local Docker socket");
213
+ return [
214
+ {
215
+ name: "local",
216
+ host: "localhost",
217
+ protocol: "http",
218
+ dockerSocketPath: DEFAULT_DOCKER_SOCKET
219
+ }
220
+ ];
221
+ }
222
+ // 6. Auto-add local socket if exists and not configured
223
+ return ensureLocalSocket(hosts);
224
+ }
225
+ //# sourceMappingURL=config-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-service.js","sourceRoot":"","sources":["../../src/services/config-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import type { DockerRawContainerInfo, HostConfig } from "../types.js";
2
+ import type { IDockerClientProvider } from "./interfaces.js";
3
+ /**
4
+ * Container to host mapping entry with multiple index keys.
5
+ * Supports lookup by full ID, short ID (12 chars), and container name.
6
+ *
7
+ * @internal This is an internal cache structure; external callers should use findContainerHost()
8
+ */
9
+ export interface ContainerHostMapping {
10
+ containerId: string;
11
+ shortId: string;
12
+ containerName: string;
13
+ hostName: string;
14
+ host: HostConfig;
15
+ container: DockerRawContainerInfo;
16
+ timestamp: number;
17
+ }
18
+ /**
19
+ * Cache for container-to-host mappings.
20
+ * Optimizes findContainerHost() by eliminating N+1 queries.
21
+ *
22
+ * Key features:
23
+ * - Parallel host scanning with configurable concurrency
24
+ * - Multiple index keys per container (ID, name, ID prefix)
25
+ * - TTL-based expiration (default: 5 minutes)
26
+ * - Automatic cache rebuild on miss
27
+ * - LRU eviction policy
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const cache = new ContainerHostMapCache();
32
+ * await cache.buildMapping(hosts, dockerService);
33
+ *
34
+ * const result = await cache.findContainerHost("my-container", hosts, dockerService);
35
+ * // Returns { host, container } immediately without scanning all hosts
36
+ * ```
37
+ */
38
+ export declare class ContainerHostMapCache {
39
+ private cache;
40
+ private concurrency;
41
+ /**
42
+ * Create a new container-to-host mapping cache.
43
+ *
44
+ * @param ttlMs - Time-to-live for cache entries in milliseconds (default: 5 minutes)
45
+ * @param maxSize - Maximum number of cache entries (default: 500)
46
+ * @param concurrency - Number of parallel host scans (default from constants)
47
+ */
48
+ constructor(ttlMs?: number, maxSize?: number, concurrency?: number);
49
+ /**
50
+ * Build container-to-host mapping for all hosts in parallel.
51
+ * Uses concurrency control to avoid overwhelming the network.
52
+ *
53
+ * @param hosts - List of hosts to scan
54
+ * @param dockerService - Docker service to query containers
55
+ * @returns Promise that resolves when mapping is complete
56
+ */
57
+ buildMapping(hosts: HostConfig[], dockerService: IDockerClientProvider): Promise<void>;
58
+ /**
59
+ * Scan a single host and cache its containers.
60
+ * Returns true if the target container was found on this host.
61
+ *
62
+ * @param host - Host to scan
63
+ * @param dockerService - Docker service to query containers
64
+ * @param targetContainerId - Optional container ID/name to search for
65
+ * @returns Whether the target container was found on this host
66
+ */
67
+ private scanSingleHost;
68
+ /**
69
+ * Find which host a container is on, using cache with fallback.
70
+ * Supports full ID, short ID, or container name lookups.
71
+ *
72
+ * On cache miss, scans hosts incrementally (one at a time) instead of
73
+ * rebuilding the entire mapping. Stops as soon as the container is found,
74
+ * avoiding unnecessary network calls to remaining hosts.
75
+ *
76
+ * @param containerId - Container ID (full/short) or name
77
+ * @param hosts - Array of host configurations to search
78
+ * @param dockerService - Docker service for fallback queries
79
+ * @returns Host config and container info if found, null otherwise
80
+ */
81
+ findContainerHost(containerId: string, hosts: HostConfig[], dockerService: IDockerClientProvider): Promise<{
82
+ host: HostConfig;
83
+ container: DockerRawContainerInfo;
84
+ } | null>;
85
+ /**
86
+ * Invalidate entire cache after container lifecycle changes.
87
+ * Call this after container state changes (start, stop, pause, resume, remove, create).
88
+ *
89
+ * Note: Clears the ENTIRE cache for all hosts. This is simpler than selective
90
+ * per-host invalidation and the cache will rebuild automatically on next query.
91
+ * For production use with many hosts, consider implementing per-host invalidation.
92
+ */
93
+ invalidateCache(): void;
94
+ /**
95
+ * Warm cache by pre-populating with all containers on startup.
96
+ * Reduces initial query latency.
97
+ *
98
+ * @param hosts - Array of host configurations
99
+ * @param dockerService - Docker service for API calls
100
+ */
101
+ warmCache(hosts: HostConfig[], dockerService: IDockerClientProvider): Promise<void>;
102
+ /**
103
+ * Get cache statistics for monitoring and debugging.
104
+ * Returns metrics on hits, misses, size, and evictions.
105
+ *
106
+ * @returns Cache statistics object
107
+ */
108
+ getStats(): {
109
+ hits: number;
110
+ misses: number;
111
+ size: number;
112
+ maxSize: number;
113
+ evictions: number;
114
+ };
115
+ /**
116
+ * Log cache statistics to console.error for observability.
117
+ * Outputs formatted stats with hit rate calculation.
118
+ */
119
+ logStats(): void;
120
+ }
121
+ //# sourceMappingURL=container-host-map-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-host-map-cache.d.ts","sourceRoot":"","sources":["../../src/services/container-host-map-cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,sBAAsB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;;OAMG;gBAED,KAAK,GAAE,MAAsB,EAC7B,OAAO,GAAE,MAAY,EACrB,WAAW,GAAE,MAA0C;IAMzD;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5F;;;;;;;;OAQG;YACW,cAAc;IA8C5B;;;;;;;;;;;;OAYG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,aAAa,EAAE,qBAAqB,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,sBAAsB,CAAA;KAAE,GAAG,IAAI,CAAC;IA6B1E;;;;;;;OAOG;IACH,eAAe,IAAI,IAAI;IAWvB;;;;;;OAMG;IACG,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzF;;;;;OAKG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAI9F;;;OAGG;IACH,QAAQ,IAAI,IAAI;CAYjB"}