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,293 @@
1
+ import { DEFAULT_COMPOSE_SCAN_CONCURRENCY } from "../../constants.js";
2
+ import { HostResolver } from "../../services/host-resolver.js";
3
+ import { getCurrentTimestamp } from "../../utils/time.js";
4
+ import { withCacheInvalidation } from "./compose-utils.js";
5
+ /**
6
+ * Cache for HostResolver instances keyed by ComposeDiscovery.
7
+ * Avoids creating 7+ HostResolver instances per compose request when
8
+ * the same discovery and hosts are used repeatedly.
9
+ *
10
+ * Uses WeakMap so resolvers are garbage-collected when their discovery
11
+ * instance is no longer referenced.
12
+ */
13
+ const resolverCache = new WeakMap();
14
+ /**
15
+ * Get or create a shared HostResolver for the given discovery and hosts.
16
+ * Returns a cached instance if the discovery and hosts array are the same.
17
+ *
18
+ * @param discovery - ComposeDiscovery instance
19
+ * @param hosts - Array of host configurations
20
+ * @returns Shared HostResolver instance
21
+ */
22
+ function getResolver(discovery, hosts) {
23
+ const cached = resolverCache.get(discovery);
24
+ if (cached && cached.hosts === hosts) {
25
+ return cached.resolver;
26
+ }
27
+ const resolver = new HostResolver(discovery, hosts);
28
+ resolverCache.set(discovery, { resolver, hosts });
29
+ return resolver;
30
+ }
31
+ /**
32
+ * Format compose operation result as markdown.
33
+ *
34
+ * @param operation - Operation performed (e.g., 'started', 'stopped')
35
+ * @param hostName - Name of the host
36
+ * @param projectName - Name of the compose project
37
+ * @param result - Optional additional result text
38
+ * @returns Formatted markdown string
39
+ */
40
+ function formatComposeResult(operation, hostName, projectName, result) {
41
+ return `Project '${projectName}' ${operation} completed on ${hostName}${result ? `\n${result}` : ""}`;
42
+ }
43
+ /**
44
+ * Handle compose up operation with cache invalidation.
45
+ *
46
+ * Starts services in a compose project with auto-discovery support.
47
+ * Invalidates compose cache after successful operation.
48
+ *
49
+ * @param input - Validated compose up input with project and detach options
50
+ * @param hosts - Array of available host configurations
51
+ * @param container - Service container with compose service
52
+ * @returns Success message
53
+ * @throws {Error} When project/host not found or operation fails
54
+ */
55
+ export async function handleComposeUp(input, hosts, container) {
56
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
57
+ const host = await resolver.resolveHost(input.project, input.host);
58
+ const eventEmitter = container.getEventEmitter();
59
+ const result = await withCacheInvalidation(async () => {
60
+ await container.getComposeService().composeUp(host, input.project, input.detach ?? true);
61
+ return formatComposeResult("started", host.name, input.project);
62
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposeUp", eventEmitter);
63
+ // Emit operation event for audit trail
64
+ eventEmitter.emit({
65
+ type: "compose_operation",
66
+ operation: "up",
67
+ project: input.project,
68
+ host: host.name,
69
+ timestamp: getCurrentTimestamp(),
70
+ });
71
+ return result;
72
+ }
73
+ /**
74
+ * Handle compose down operation with cache invalidation.
75
+ *
76
+ * Stops services in a compose project with optional volume removal.
77
+ * Requires force flag when removing volumes to prevent accidental data loss.
78
+ *
79
+ * @param input - Validated compose down input with project and volume options
80
+ * @param hosts - Array of available host configurations
81
+ * @param container - Service container with compose service
82
+ * @returns Success message
83
+ * @throws {Error} When project/host not found, force required, or operation fails
84
+ */
85
+ export async function handleComposeDown(input, hosts, container) {
86
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
87
+ const host = await resolver.resolveHost(input.project, input.host);
88
+ // Validate force requirement for remove_volumes
89
+ if (input.remove_volumes && !input.force) {
90
+ throw new Error("Compose down with remove_volumes requires force=true to prevent accidental data loss");
91
+ }
92
+ const eventEmitter = container.getEventEmitter();
93
+ // Emit destructive operation event BEFORE execution for audit trail
94
+ if (input.remove_volumes) {
95
+ eventEmitter.emit({
96
+ type: "destructive_operation",
97
+ operation: "compose_down_with_volumes",
98
+ target: input.project,
99
+ host: host.name,
100
+ confirmed: input.force === true,
101
+ timestamp: getCurrentTimestamp(),
102
+ });
103
+ }
104
+ const result = await withCacheInvalidation(async () => {
105
+ await container
106
+ .getComposeService()
107
+ .composeDown(host, input.project, input.remove_volumes ?? false);
108
+ return formatComposeResult("stopped", host.name, input.project);
109
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposeDown", eventEmitter);
110
+ // Emit operation event for audit trail
111
+ eventEmitter.emit({
112
+ type: "compose_operation",
113
+ operation: "down",
114
+ project: input.project,
115
+ host: host.name,
116
+ timestamp: getCurrentTimestamp(),
117
+ });
118
+ return result;
119
+ }
120
+ /**
121
+ * Handle compose restart operation with cache invalidation.
122
+ *
123
+ * Restarts all services in a compose project.
124
+ * Invalidates compose cache after successful operation.
125
+ *
126
+ * @param input - Validated compose restart input with project
127
+ * @param hosts - Array of available host configurations
128
+ * @param container - Service container with compose service
129
+ * @returns Success message
130
+ * @throws {Error} When project/host not found or operation fails
131
+ */
132
+ export async function handleComposeRestart(input, hosts, container) {
133
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
134
+ const host = await resolver.resolveHost(input.project, input.host);
135
+ return withCacheInvalidation(async () => {
136
+ await container.getComposeService().composeRestart(host, input.project);
137
+ return formatComposeResult("restarted", host.name, input.project);
138
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposeRestart");
139
+ }
140
+ /**
141
+ * Handle compose logs operation with cache invalidation.
142
+ *
143
+ * Retrieves logs from compose project services with optional filtering.
144
+ * Supports time range, service filtering, and grep patterns.
145
+ *
146
+ * @param input - Validated compose logs input with project and filter options
147
+ * @param hosts - Array of available host configurations
148
+ * @param container - Service container with compose service
149
+ * @returns Formatted logs in markdown
150
+ * @throws {Error} When project/host not found or operation fails
151
+ */
152
+ export async function handleComposeLogs(input, hosts, container) {
153
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
154
+ const host = await resolver.resolveHost(input.project, input.host);
155
+ return withCacheInvalidation(async () => {
156
+ const options = {};
157
+ if (input.lines !== undefined) {
158
+ options.tail = input.lines;
159
+ }
160
+ if (input.since) {
161
+ options.since = input.since;
162
+ }
163
+ if (input.until) {
164
+ options.until = input.until;
165
+ }
166
+ if (input.service) {
167
+ options.services = [input.service];
168
+ }
169
+ let logs = await container.getComposeService().composeLogs(host, input.project, options);
170
+ // Apply grep filter if specified
171
+ if (input.grep) {
172
+ const grepPattern = input.grep;
173
+ const lines = logs.split("\n");
174
+ const filtered = lines.filter((line) => line.includes(grepPattern));
175
+ logs = filtered.join("\n");
176
+ }
177
+ return `## Logs: ${input.project} (${host.name})\n\n\`\`\`\n${logs}\n\`\`\``;
178
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposeLogs");
179
+ }
180
+ /**
181
+ * Handle compose build operation with cache invalidation.
182
+ *
183
+ * Builds or rebuilds service images in a compose project.
184
+ * Supports no-cache builds and service-specific builds.
185
+ *
186
+ * @param input - Validated compose build input with project and build options
187
+ * @param hosts - Array of available host configurations
188
+ * @param container - Service container with compose service
189
+ * @returns Success message
190
+ * @throws {Error} When project/host not found or operation fails
191
+ */
192
+ export async function handleComposeBuild(input, hosts, container) {
193
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
194
+ const host = await resolver.resolveHost(input.project, input.host);
195
+ return withCacheInvalidation(async () => {
196
+ const options = {};
197
+ if (input.service) {
198
+ options.service = input.service;
199
+ }
200
+ if (input.no_cache) {
201
+ options.noCache = input.no_cache;
202
+ }
203
+ await container.getComposeService().composeBuild(host, input.project, options);
204
+ return formatComposeResult("build", host.name, input.project);
205
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposeBuild");
206
+ }
207
+ /**
208
+ * Handle compose pull operation with cache invalidation.
209
+ *
210
+ * Pulls service images defined in a compose project.
211
+ * Supports service-specific pulls.
212
+ *
213
+ * @param input - Validated compose pull input with project and service options
214
+ * @param hosts - Array of available host configurations
215
+ * @param container - Service container with compose service
216
+ * @returns Success message
217
+ * @throws {Error} When project/host not found or operation fails
218
+ */
219
+ export async function handleComposePull(input, hosts, container) {
220
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
221
+ const host = await resolver.resolveHost(input.project, input.host);
222
+ return withCacheInvalidation(async () => {
223
+ const options = {};
224
+ if (input.service) {
225
+ options.service = input.service;
226
+ }
227
+ await container.getComposeService().composePull(host, input.project, options);
228
+ return formatComposeResult("pull", host.name, input.project);
229
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposePull");
230
+ }
231
+ /**
232
+ * Handle compose recreate operation with cache invalidation.
233
+ *
234
+ * Recreates containers in a compose project without rebuilding images.
235
+ * Supports service-specific recreation and force-recreate option.
236
+ *
237
+ * @param input - Validated compose recreate input with project and recreate options
238
+ * @param hosts - Array of available host configurations
239
+ * @param container - Service container with compose service
240
+ * @returns Success message
241
+ * @throws {Error} When project/host not found or operation fails
242
+ */
243
+ export async function handleComposeRecreate(input, hosts, container) {
244
+ const resolver = getResolver(container.getComposeDiscovery(), hosts);
245
+ const host = await resolver.resolveHost(input.project, input.host);
246
+ return withCacheInvalidation(async () => {
247
+ const options = {};
248
+ if (input.service) {
249
+ options.service = input.service;
250
+ }
251
+ await container.getComposeService().composeRecreate(host, input.project, options);
252
+ return formatComposeResult("recreated", host.name, input.project);
253
+ }, input.project, host.name, container.getComposeDiscovery(), "handleComposeRecreate");
254
+ }
255
+ /**
256
+ * Handle compose refresh operation - scans filesystem and updates cache.
257
+ *
258
+ * Scans host for compose files and updates discovery cache.
259
+ * Uses host's configured compose search paths.
260
+ *
261
+ * @param input - Validated compose refresh input with host
262
+ * @param hosts - Array of available host configurations
263
+ * @param container - Service container with compose scanner and discovery
264
+ * @returns Summary of discovered projects
265
+ * @throws {Error} When host not found or scan fails
266
+ */
267
+ export async function handleComposeRefresh(input, hosts, container) {
268
+ const host = hosts.find((h) => h.name === input.host);
269
+ if (!host) {
270
+ throw new Error(`Host '${input.host}' not found`);
271
+ }
272
+ const discovery = container.getComposeDiscovery();
273
+ const scanner = container.getComposeScanner();
274
+ // Scan filesystem for compose files (scanner uses host.composeSearchPaths internally)
275
+ const composePaths = await scanner.findComposeFiles(host);
276
+ // Batch parse all files at once (uses DEFAULT_COMPOSE_SCAN_CONCURRENCY)
277
+ const nameMap = await scanner.batchParseComposeNames(host, composePaths, DEFAULT_COMPOSE_SCAN_CONCURRENCY);
278
+ const projects = [];
279
+ for (const composePath of composePaths) {
280
+ const explicitName = nameMap.get(composePath);
281
+ const projectName = explicitName ?? scanner.extractProjectName(composePath);
282
+ // Update cache with discovered project
283
+ await discovery.cache.updateProject(host.name, projectName, {
284
+ name: projectName,
285
+ path: composePath,
286
+ discoveredFrom: "scan",
287
+ lastSeen: getCurrentTimestamp(),
288
+ });
289
+ projects.push(`${projectName} (${composePath})`);
290
+ }
291
+ return `Cache refreshed for host '${host.name}'\nDiscovered ${projects.length} project(s):\n${projects.join("\n")}`;
292
+ }
293
+ //# sourceMappingURL=compose-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-handlers.js","sourceRoot":"","sources":["../../../src/tools/handlers/compose-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { EventEmitter } from "../../events/index.js";
2
+ import type { ComposeDiscovery } from "../../services/compose-discovery.js";
3
+ /**
4
+ * Check if an error is a file-not-found error
5
+ *
6
+ * Detects:
7
+ * - ENOENT error code (Node.js file system errors)
8
+ * - Error messages containing file-not-found indicators
9
+ *
10
+ * @param error - The error to check
11
+ * @returns True if this is a file-not-found error
12
+ */
13
+ export declare function isFileNotFoundError(error: unknown): boolean;
14
+ /**
15
+ * Wrap a compose operation with cache invalidation on file-not-found errors
16
+ *
17
+ * When a compose operation fails due to a stale cached path, this wrapper:
18
+ * 1. Detects the file-not-found error
19
+ * 2. Invalidates the cache for that project
20
+ * 3. Emits cache invalidation event
21
+ * 4. Re-throws the error for normal error handling
22
+ *
23
+ * The cache invalidation ensures the next operation will re-discover the project.
24
+ *
25
+ * @param operation - The async operation to execute
26
+ * @param projectName - The compose project name
27
+ * @param hostName - The host name
28
+ * @param discovery - The discovery service (for cache access)
29
+ * @param operationName - Name of the operation (for logging)
30
+ * @param eventEmitter - Optional event emitter for cross-cutting concerns
31
+ * @returns The result of the operation
32
+ * @throws Re-throws any errors from the operation
33
+ */
34
+ export declare function withCacheInvalidation<T>(operation: () => Promise<T>, projectName: string, hostName: string, discovery: ComposeDiscovery, operationName: string, eventEmitter?: EventEmitter): Promise<T>;
35
+ //# sourceMappingURL=compose-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-utils.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/compose-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqB3D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,CAAC,CAAC,CA0BZ"}
@@ -0,0 +1,76 @@
1
+ import { logError } from "../../utils/errors.js";
2
+ import { getCurrentTimestamp } from "../../utils/time.js";
3
+ /**
4
+ * Check if an error is a file-not-found error
5
+ *
6
+ * Detects:
7
+ * - ENOENT error code (Node.js file system errors)
8
+ * - Error messages containing file-not-found indicators
9
+ *
10
+ * @param error - The error to check
11
+ * @returns True if this is a file-not-found error
12
+ */
13
+ export function isFileNotFoundError(error) {
14
+ if (!error || typeof error !== "object") {
15
+ return false;
16
+ }
17
+ // Check for ENOENT error code
18
+ if ("code" in error && error.code === "ENOENT") {
19
+ return true;
20
+ }
21
+ // Check error message for file-not-found indicators
22
+ if ("message" in error && typeof error.message === "string") {
23
+ const message = error.message.toLowerCase();
24
+ return (message.includes("no such file or directory") ||
25
+ message.includes("does not exist") ||
26
+ message.includes("cannot find"));
27
+ }
28
+ return false;
29
+ }
30
+ /**
31
+ * Wrap a compose operation with cache invalidation on file-not-found errors
32
+ *
33
+ * When a compose operation fails due to a stale cached path, this wrapper:
34
+ * 1. Detects the file-not-found error
35
+ * 2. Invalidates the cache for that project
36
+ * 3. Emits cache invalidation event
37
+ * 4. Re-throws the error for normal error handling
38
+ *
39
+ * The cache invalidation ensures the next operation will re-discover the project.
40
+ *
41
+ * @param operation - The async operation to execute
42
+ * @param projectName - The compose project name
43
+ * @param hostName - The host name
44
+ * @param discovery - The discovery service (for cache access)
45
+ * @param operationName - Name of the operation (for logging)
46
+ * @param eventEmitter - Optional event emitter for cross-cutting concerns
47
+ * @returns The result of the operation
48
+ * @throws Re-throws any errors from the operation
49
+ */
50
+ export async function withCacheInvalidation(operation, projectName, hostName, discovery, operationName, eventEmitter) {
51
+ try {
52
+ return await operation();
53
+ }
54
+ catch (error) {
55
+ // If this is a file-not-found error, invalidate cache and re-throw
56
+ if (isFileNotFoundError(error)) {
57
+ await discovery.cache.removeProject(hostName, projectName);
58
+ logError(error, {
59
+ operation: operationName,
60
+ metadata: { host: hostName, project: projectName, reason: "stale path, cache invalidated" },
61
+ });
62
+ // Emit cache invalidation event
63
+ if (eventEmitter) {
64
+ eventEmitter.emit({
65
+ type: "cache_invalidated",
66
+ cache: "compose_project",
67
+ reason: `Stale path for project ${projectName} on ${hostName}`,
68
+ timestamp: getCurrentTimestamp(),
69
+ });
70
+ }
71
+ }
72
+ // Always re-throw the error
73
+ throw error;
74
+ }
75
+ }
76
+ //# sourceMappingURL=compose-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-utils.js","sourceRoot":"","sources":["../../../src/tools/handlers/compose-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAA2B,EAC3B,WAAmB,EACnB,QAAgB,EAChB,SAA2B,EAC3B,aAAqB,EACrB,YAA2B;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mEAAmE;QACnE,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC3D,QAAQ,CAAC,KAAK,EAAE;gBACd,SAAS,EAAE,aAAa;gBACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,+BAA+B,EAAE;aAC5F,CAAC,CAAC;YAEH,gCAAgC;YAChC,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,mBAAmB;oBACzB,KAAK,EAAE,iBAAiB;oBACxB,MAAM,EAAE,0BAA0B,WAAW,OAAO,QAAQ,EAAE;oBAC9D,SAAS,EAAE,mBAAmB,EAAE;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ComposeActionInput } from "../../schemas/flux/compose.js";
2
+ import type { ServiceContainer } from "../../services/container.js";
3
+ /**
4
+ * Handle all compose subactions for Docker Compose project management.
5
+ *
6
+ * Supports 10 subactions: list, status, up, down, restart, logs, build, pull,
7
+ * recreate, refresh. Uses auto-discovery to find projects across hosts.
8
+ *
9
+ * @param input - Validated Flux input with compose action
10
+ * @param container - Service container with Compose service
11
+ * @returns Formatted response string (markdown or JSON)
12
+ * @throws {Error} When project/host not found or operation fails
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const result = await handleComposeAction(
17
+ * { action: 'compose', subaction: 'status', project: 'myapp' },
18
+ * container
19
+ * );
20
+ * ```
21
+ */
22
+ export declare function handleComposeAction(input: ComposeActionInput, container: ServiceContainer): Promise<string>;
23
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/compose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAWnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAsBpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA+IjB"}
@@ -0,0 +1,125 @@
1
+ // src/tools/handlers/compose.ts
2
+ import { formatComposeListMarkdown, formatComposeStatusMarkdown } from "../../formatters/index.js";
3
+ import { HostResolver } from "../../services/host-resolver.js";
4
+ import { logError } from "../../utils/errors.js";
5
+ import { createExhaustiveError, formatResponse, initializeHandler, paginateItems, resolveTargetHosts, } from "./base-handler.js";
6
+ import { handleComposeBuild, handleComposeDown, handleComposeLogs, handleComposePull, handleComposeRecreate, handleComposeRefresh, handleComposeRestart, handleComposeUp, } from "./compose-handlers.js";
7
+ /**
8
+ * Handle all compose subactions for Docker Compose project management.
9
+ *
10
+ * Supports 10 subactions: list, status, up, down, restart, logs, build, pull,
11
+ * recreate, refresh. Uses auto-discovery to find projects across hosts.
12
+ *
13
+ * @param input - Validated Flux input with compose action
14
+ * @param container - Service container with Compose service
15
+ * @returns Formatted response string (markdown or JSON)
16
+ * @throws {Error} When project/host not found or operation fails
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const result = await handleComposeAction(
21
+ * { action: 'compose', subaction: 'status', project: 'myapp' },
22
+ * container
23
+ * );
24
+ * ```
25
+ */
26
+ export async function handleComposeAction(input, container) {
27
+ const validated = input;
28
+ const { service: composeService, hosts, format, } = await initializeHandler(validated, container, (c) => c.getComposeService());
29
+ switch (validated.subaction) {
30
+ case "list": {
31
+ const listInput = validated;
32
+ const targetHosts = resolveTargetHosts(hosts, listInput.host);
33
+ // For single-host queries, propagate errors. For multi-host aggregation, catch and continue.
34
+ const isSingleHost = targetHosts.length === 1;
35
+ const allProjects = await Promise.all(targetHosts.map(async (h) => {
36
+ try {
37
+ const projects = await composeService.listComposeProjects(h);
38
+ return projects.map((p) => ({ ...p, host: h.name }));
39
+ }
40
+ catch (error) {
41
+ if (isSingleHost) {
42
+ // Propagate errors when targeting a specific host
43
+ throw error;
44
+ }
45
+ // Log and continue when aggregating across multiple hosts
46
+ logError(error, { operation: "compose:list", metadata: { host: h.name } });
47
+ return [];
48
+ }
49
+ }));
50
+ let projects = allProjects.flat();
51
+ // Apply name filter
52
+ if (listInput.name_filter) {
53
+ const nameFilter = listInput.name_filter;
54
+ projects = projects.filter((p) => p.name.toLowerCase().includes(nameFilter.toLowerCase()));
55
+ }
56
+ // Apply pagination
57
+ const { items: paginatedProjects, total, offset, hasMore, } = paginateItems(projects, { offset: listInput.offset, limit: listInput.limit });
58
+ const label = targetHosts.length === 1 ? (targetHosts[0]?.name ?? "all-hosts") : "all-hosts";
59
+ return formatResponse(paginatedProjects, format, () => formatComposeListMarkdown(paginatedProjects, label, total, offset, hasMore));
60
+ }
61
+ case "status": {
62
+ const statusInput = validated;
63
+ let hostConfig;
64
+ // Use HostResolver for auto-discovery if no host specified
65
+ if (!statusInput.host) {
66
+ const resolver = new HostResolver(container.getComposeDiscovery(), hosts);
67
+ hostConfig = await resolver.resolveHost(statusInput.project, undefined);
68
+ }
69
+ else {
70
+ const found = hosts.find((h) => h.name === statusInput.host);
71
+ if (!found) {
72
+ throw new Error(`Host not found: ${statusInput.host}`);
73
+ }
74
+ hostConfig = found;
75
+ }
76
+ const project = await composeService.getComposeStatus(hostConfig, statusInput.project);
77
+ // Apply service filter if specified
78
+ let services = project.services;
79
+ if (statusInput.service_filter) {
80
+ const serviceFilter = statusInput.service_filter;
81
+ services = services.filter((s) => s.name.toLowerCase().includes(serviceFilter.toLowerCase()));
82
+ project.services = services;
83
+ }
84
+ // Apply pagination to services
85
+ const { items: paginatedServices, total: totalServices, offset, hasMore, } = paginateItems(services, { offset: statusInput.offset, limit: statusInput.limit });
86
+ const paginatedProject = { ...project, services: paginatedServices };
87
+ return formatResponse(paginatedProject, format, () => formatComposeStatusMarkdown(paginatedProject, totalServices, offset, hasMore));
88
+ }
89
+ case "up": {
90
+ const upInput = validated;
91
+ return handleComposeUp(upInput, hosts, container);
92
+ }
93
+ case "down": {
94
+ const downInput = validated;
95
+ return handleComposeDown(downInput, hosts, container);
96
+ }
97
+ case "restart": {
98
+ const restartInput = validated;
99
+ return handleComposeRestart(restartInput, hosts, container);
100
+ }
101
+ case "logs": {
102
+ const logsInput = validated;
103
+ return handleComposeLogs(logsInput, hosts, container);
104
+ }
105
+ case "build": {
106
+ const buildInput = validated;
107
+ return handleComposeBuild(buildInput, hosts, container);
108
+ }
109
+ case "pull": {
110
+ const pullInput = validated;
111
+ return handleComposePull(pullInput, hosts, container);
112
+ }
113
+ case "recreate": {
114
+ const recreateInput = validated;
115
+ return handleComposeRecreate(recreateInput, hosts, container);
116
+ }
117
+ case "refresh": {
118
+ const refreshInput = validated;
119
+ return handleComposeRefresh(refreshInput, hosts, container);
120
+ }
121
+ default:
122
+ throw createExhaustiveError(validated, "compose subaction");
123
+ }
124
+ }
125
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/tools/handlers/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ContainerActionInput } from "../../schemas/flux/container.js";
2
+ import type { ServiceContainer } from "../../services/container.js";
3
+ /**
4
+ * Handle all container subactions for Docker container management.
5
+ *
6
+ * Supports 14 subactions: list, start, stop, restart, pause, resume, logs, stats,
7
+ * inspect, search, pull, recreate, exec, top.
8
+ *
9
+ * @param validatedut - Validated Flux input with container action
10
+ * @param container - Service container with Docker service
11
+ * @returns Formatted response string (markdown or JSON)
12
+ * @throws {Error} When container not found or operation fails
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const result = await handleContainerAction(
17
+ * { action: 'container', subaction: 'list', state: 'running' },
18
+ * container
19
+ * );
20
+ * ```
21
+ */
22
+ export declare function handleContainerAction(input: ContainerActionInput, container: ServiceContainer): Promise<string>;
23
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/container.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,oBAAoB,EAUrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAcpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA0ZjB"}