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,176 @@
1
+ /**
2
+ * Timeout for host resolution operations.
3
+ * Defaults to 30s, overridable via COMPOSE_HOST_RESOLUTION_TIMEOUT_MS.
4
+ */
5
+ function getResolutionTimeoutMs() {
6
+ const raw = process.env.COMPOSE_HOST_RESOLUTION_TIMEOUT_MS;
7
+ if (!raw)
8
+ return 30000;
9
+ const parsed = Number.parseInt(raw, 10);
10
+ if (!Number.isFinite(parsed) || parsed <= 0)
11
+ return 30000;
12
+ return parsed;
13
+ }
14
+ /**
15
+ * Grace period (ms) after first match to collect concurrent matches
16
+ * for conflict detection. Defaults to 500ms unless overridden.
17
+ */
18
+ function getConflictGraceMs() {
19
+ const raw = process.env.COMPOSE_CONFLICT_GRACE_MS;
20
+ if (!raw)
21
+ return 500;
22
+ const parsed = Number.parseInt(raw, 10);
23
+ if (!Number.isFinite(parsed) || parsed < 0)
24
+ return 500;
25
+ return parsed;
26
+ }
27
+ /**
28
+ * Error thrown when host resolution fails
29
+ */
30
+ export class HostResolutionError extends Error {
31
+ constructor(message) {
32
+ super(message);
33
+ this.name = "HostResolutionError";
34
+ }
35
+ }
36
+ /**
37
+ * Resolves which host contains a compose project when not explicitly specified
38
+ */
39
+ export class HostResolver {
40
+ discovery;
41
+ hosts;
42
+ constructor(discovery, hosts) {
43
+ this.discovery = discovery;
44
+ this.hosts = hosts;
45
+ }
46
+ /**
47
+ * Resolve which host to use for a compose operation
48
+ *
49
+ * @param projectName - Name of the compose project
50
+ * @param specifiedHost - Optional host name explicitly provided by user
51
+ * @returns The resolved host configuration
52
+ * @throws {HostResolutionError} If resolution fails
53
+ */
54
+ async resolveHost(projectName, specifiedHost) {
55
+ // If host is specified, validate and return it
56
+ if (specifiedHost) {
57
+ const host = this.hosts.find((h) => h.name === specifiedHost);
58
+ if (!host) {
59
+ throw new HostResolutionError(`Host "${specifiedHost}" not found in configuration`);
60
+ }
61
+ return host;
62
+ }
63
+ // Auto-resolve: check all hosts in parallel
64
+ if (this.hosts.length === 0) {
65
+ throw new HostResolutionError("No hosts configured");
66
+ }
67
+ const matchingHosts = await this.findMatchingHosts(projectName);
68
+ if (matchingHosts.length === 0) {
69
+ throw new HostResolutionError(`Project "${projectName}" not found on any configured host`);
70
+ }
71
+ if (matchingHosts.length > 1) {
72
+ const hostNames = matchingHosts.map((h) => h.name).join(", ");
73
+ throw new HostResolutionError(`Project "${projectName}" found on multiple hosts: ${hostNames}. Please specify which host to use.`);
74
+ }
75
+ return matchingHosts[0];
76
+ }
77
+ /**
78
+ * Find all hosts that contain the specified project.
79
+ *
80
+ * Uses an AbortController to cancel remaining checks on early exit or timeout.
81
+ * SECURITY (CWE-404): Timer is properly cleared when resolution settles
82
+ * to prevent dangling promise rejection and memory leak.
83
+ */
84
+ async findMatchingHosts(projectName) {
85
+ const resolutionTimeoutMs = getResolutionTimeoutMs();
86
+ const abortController = new AbortController();
87
+ let timeoutId;
88
+ const checkPromise = this.checkAllHosts(projectName, abortController.signal);
89
+ const timeoutPromise = new Promise((_, reject) => {
90
+ timeoutId = setTimeout(() => {
91
+ abortController.abort();
92
+ reject(new HostResolutionError(`Host resolution timed out after ${resolutionTimeoutMs}ms`));
93
+ }, resolutionTimeoutMs);
94
+ });
95
+ try {
96
+ const result = await Promise.race([checkPromise, timeoutPromise]);
97
+ return result;
98
+ }
99
+ finally {
100
+ abortController.abort();
101
+ if (timeoutId) {
102
+ clearTimeout(timeoutId);
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Check all hosts in parallel for the project with early-exit.
108
+ *
109
+ * When the first match arrives, starts a short grace period to collect
110
+ * any near-simultaneous matches (for conflict detection). After the
111
+ * grace period or when all checks settle (whichever is first), resolves
112
+ * with all collected matches.
113
+ *
114
+ * If all checks fail before any match, resolves immediately with
115
+ * an empty array.
116
+ *
117
+ * This avoids blocking on slow/offline hosts while still detecting
118
+ * conflicts between responsive hosts.
119
+ */
120
+ checkAllHosts(projectName, signal) {
121
+ const matchingHosts = [];
122
+ let settledCount = 0;
123
+ const totalChecks = this.hosts.length;
124
+ const conflictGraceMs = getConflictGraceMs();
125
+ return new Promise((resolve) => {
126
+ if (totalChecks === 0) {
127
+ resolve([]);
128
+ return;
129
+ }
130
+ let resolved = false;
131
+ let graceTimeoutId;
132
+ const doResolve = () => {
133
+ if (resolved)
134
+ return;
135
+ resolved = true;
136
+ if (graceTimeoutId) {
137
+ clearTimeout(graceTimeoutId);
138
+ }
139
+ resolve(matchingHosts);
140
+ };
141
+ const startGracePeriod = () => {
142
+ if (graceTimeoutId)
143
+ return; // Already started
144
+ graceTimeoutId = setTimeout(doResolve, conflictGraceMs);
145
+ };
146
+ const tryResolve = () => {
147
+ if (resolved || signal.aborted)
148
+ return;
149
+ settledCount++;
150
+ // All checks settled — no more results possible
151
+ if (settledCount === totalChecks) {
152
+ doResolve();
153
+ return;
154
+ }
155
+ // First match arrived — start grace period for conflict detection
156
+ if (matchingHosts.length >= 1 && !graceTimeoutId) {
157
+ startGracePeriod();
158
+ }
159
+ };
160
+ for (const host of this.hosts) {
161
+ this.discovery
162
+ .resolveProjectPath(host, projectName)
163
+ .then(() => {
164
+ if (!resolved && !signal.aborted) {
165
+ matchingHosts.push(host);
166
+ }
167
+ tryResolve();
168
+ })
169
+ .catch(() => {
170
+ tryResolve();
171
+ });
172
+ }
173
+ });
174
+ }
175
+ }
176
+ //# sourceMappingURL=host-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-resolver.js","sourceRoot":"","sources":["../../src/services/host-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,197 +1,9 @@
1
- import type { HostConfig, ContainerInfo, ContainerStats, HostStatus, LogEntry, ImageInfo } from "../types.js";
2
- import type Docker from "dockerode";
3
1
  import type { NodeSSH } from "node-ssh";
2
+ import type { ComposeProject, HostConfig } from "../types.js";
3
+ import type { DockerOperations } from "./docker-interfaces.js";
4
4
  import type { HostResources } from "./ssh.js";
5
- import type { DockerSystemInfo, DockerDiskUsage, PruneResult, ListImagesOptions } from "./docker.js";
6
5
  import type { PoolStats } from "./ssh-pool.js";
7
- import type { ComposeProject } from "./compose.js";
8
- /**
9
- * Docker service interface for managing Docker containers, images, and resources.
10
- * Provides operations for container lifecycle management, image operations, system queries,
11
- * and Docker daemon interactions across multiple hosts.
12
- */
13
- export interface IDockerService {
14
- /**
15
- * Get a Docker client instance for the specified host configuration.
16
- * Clients are cached per host to reuse connections.
17
- *
18
- * @param config - Host configuration containing connection details
19
- * @returns Docker client instance (dockerode)
20
- */
21
- getDockerClient(config: HostConfig): Docker;
22
- /**
23
- * List containers across multiple hosts with optional filtering.
24
- *
25
- * @param hosts - Array of host configurations to query
26
- * @param options - Filtering options
27
- * @param options.state - Filter by container state (all, running, stopped, paused)
28
- * @param options.nameFilter - Filter by container name (partial match)
29
- * @param options.imageFilter - Filter by image name (partial match)
30
- * @param options.labelFilter - Filter by label (format: "key=value")
31
- * @returns Array of containers with their details and host information
32
- */
33
- listContainers(hosts: HostConfig[], options?: {
34
- state?: "all" | "running" | "stopped" | "paused";
35
- nameFilter?: string;
36
- imageFilter?: string;
37
- labelFilter?: string;
38
- }): Promise<ContainerInfo[]>;
39
- /**
40
- * Perform a lifecycle action on a container.
41
- *
42
- * @param containerId - Container ID or name
43
- * @param action - Action to perform (start, stop, restart, pause, unpause)
44
- * @param host - Host configuration where container is located
45
- */
46
- containerAction(containerId: string, action: "start" | "stop" | "restart" | "pause" | "unpause", host: HostConfig): Promise<void>;
47
- /**
48
- * Retrieve logs from a container.
49
- *
50
- * @param containerId - Container ID or name
51
- * @param host - Host configuration where container is located
52
- * @param options - Log retrieval options
53
- * @param options.lines - Number of lines to retrieve (default: 100)
54
- * @param options.since - Show logs since timestamp or duration (e.g., "2023-01-01T00:00:00Z" or "10m")
55
- * @param options.until - Show logs until timestamp or duration
56
- * @param options.stream - Stream to retrieve (all, stdout, stderr)
57
- * @returns Array of log entries with timestamps and content
58
- */
59
- getContainerLogs(containerId: string, host: HostConfig, options?: {
60
- lines?: number;
61
- since?: string;
62
- until?: string;
63
- stream?: "all" | "stdout" | "stderr";
64
- }): Promise<LogEntry[]>;
65
- /**
66
- * Get resource usage statistics for a container.
67
- *
68
- * @param containerId - Container ID or name
69
- * @param host - Host configuration where container is located
70
- * @returns Resource statistics including CPU, memory, network, and I/O
71
- */
72
- getContainerStats(containerId: string, host: HostConfig): Promise<ContainerStats>;
73
- /**
74
- * Find which host a container is running on.
75
- * Searches across all provided hosts.
76
- *
77
- * @param containerId - Container ID or name to find
78
- * @param hosts - Array of host configurations to search
79
- * @returns Host config and container info if found, null otherwise
80
- */
81
- findContainerHost(containerId: string, hosts: HostConfig[]): Promise<{
82
- host: HostConfig;
83
- container: Docker.ContainerInfo;
84
- } | null>;
85
- /**
86
- * Get Docker daemon status and version info for multiple hosts.
87
- *
88
- * @param hosts - Array of host configurations to check
89
- * @returns Array of host statuses with daemon info and reachability
90
- */
91
- getHostStatus(hosts: HostConfig[]): Promise<HostStatus[]>;
92
- /**
93
- * List Docker images across multiple hosts with optional filtering.
94
- *
95
- * @param hosts - Array of host configurations to query
96
- * @param options - Filtering options (dangling, reference, etc.)
97
- * @returns Array of images with their details and host information
98
- */
99
- listImages(hosts: HostConfig[], options?: ListImagesOptions): Promise<ImageInfo[]>;
100
- /**
101
- * Get detailed information about a container.
102
- *
103
- * @param containerId - Container ID or name
104
- * @param host - Host configuration where container is located
105
- * @returns Full container inspection data from Docker API
106
- */
107
- inspectContainer(containerId: string, host: HostConfig): Promise<Docker.ContainerInspectInfo>;
108
- /**
109
- * Get Docker daemon system information.
110
- *
111
- * @param host - Host configuration to query
112
- * @returns System info including version, OS, architecture, and resource limits
113
- */
114
- getDockerInfo(host: HostConfig): Promise<DockerSystemInfo>;
115
- /**
116
- * Get Docker disk usage information.
117
- *
118
- * @param host - Host configuration to query
119
- * @returns Disk usage breakdown for images, containers, volumes, and build cache
120
- */
121
- getDockerDiskUsage(host: HostConfig): Promise<DockerDiskUsage>;
122
- /**
123
- * Remove unused Docker resources (prune operation).
124
- *
125
- * @param host - Host configuration where pruning should occur
126
- * @param target - Resource type to prune (containers, images, volumes, networks, buildcache, all)
127
- * @returns Array of prune results showing what was removed and space reclaimed
128
- */
129
- pruneDocker(host: HostConfig, target: "containers" | "images" | "volumes" | "networks" | "buildcache" | "all"): Promise<PruneResult[]>;
130
- /**
131
- * Pull a Docker image from a registry.
132
- *
133
- * @param imageName - Image name with optional tag (e.g., "nginx:latest")
134
- * @param host - Host configuration where image should be pulled
135
- * @returns Operation status
136
- */
137
- pullImage(imageName: string, host: HostConfig): Promise<{
138
- status: string;
139
- }>;
140
- /**
141
- * Recreate a container with the same configuration.
142
- * Optionally pulls the latest image before recreating.
143
- *
144
- * @param containerId - Container ID or name to recreate
145
- * @param host - Host configuration where container is located
146
- * @param options - Recreate options
147
- * @param options.pull - Whether to pull latest image before recreating
148
- * @returns Operation status and new container ID
149
- */
150
- recreateContainer(containerId: string, host: HostConfig, options?: {
151
- pull?: boolean;
152
- }): Promise<{
153
- status: string;
154
- containerId: string;
155
- }>;
156
- /**
157
- * Remove a Docker image.
158
- *
159
- * @param imageId - Image ID or name to remove
160
- * @param host - Host configuration where image is located
161
- * @param options - Removal options
162
- * @param options.force - Force removal even if image is in use
163
- * @returns Operation status
164
- */
165
- removeImage(imageId: string, host: HostConfig, options?: {
166
- force?: boolean;
167
- }): Promise<{
168
- status: string;
169
- }>;
170
- /**
171
- * Build a Docker image from a Dockerfile.
172
- *
173
- * @param host - Host configuration where build should occur
174
- * @param options - Build options
175
- * @param options.context - Path to build context directory
176
- * @param options.tag - Tag for the built image
177
- * @param options.dockerfile - Path to Dockerfile (relative to context, default: "Dockerfile")
178
- * @param options.noCache - Disable build cache
179
- * @returns Operation status
180
- */
181
- buildImage(host: HostConfig, options: {
182
- context: string;
183
- tag: string;
184
- dockerfile?: string;
185
- noCache?: boolean;
186
- }): Promise<{
187
- status: string;
188
- }>;
189
- /**
190
- * Clear all cached Docker client connections.
191
- * Useful for cleanup during shutdown or when connections need to be reset.
192
- */
193
- clearClients(): void;
194
- }
6
+ export type { DockerOperations, IContainerOperations, IDockerClientProvider, IDockerSystemInfo, IImageOperations, IResourceOperations, } from "./docker-interfaces.js";
195
7
  /**
196
8
  * SSH service interface for executing commands on remote hosts.
197
9
  * Provides secure command execution and resource monitoring via SSH connections.
@@ -225,6 +37,13 @@ export interface ISSHService {
225
37
  * Provides operations for Compose project lifecycle management, service control,
226
38
  * and log retrieval.
227
39
  */
40
+ /**
41
+ * Interface for resolving compose project file paths.
42
+ * Extracted to break the circular dependency between ComposeService and ComposeDiscovery.
43
+ */
44
+ export interface IComposePathResolver {
45
+ resolveProjectPath(host: HostConfig, projectName: string): Promise<string>;
46
+ }
228
47
  export interface IComposeService {
229
48
  /**
230
49
  * Execute a Docker Compose command on a remote host.
@@ -392,6 +211,39 @@ export interface ISSHConnectionPool {
392
211
  * @returns Statistics including active connections, pool size, and usage metrics
393
212
  */
394
213
  getStats(): PoolStats;
214
+ /**
215
+ * Get pool health status.
216
+ * Returns whether the pool is healthy based on connection states and health check results.
217
+ *
218
+ * @returns Health status object with healthy flag
219
+ */
220
+ getHealth(): {
221
+ healthy: boolean;
222
+ };
223
+ }
224
+ /**
225
+ * Local command executor interface for executing commands on localhost.
226
+ * Provides secure command execution using Node.js child_process for local operations
227
+ * without SSH overhead.
228
+ */
229
+ export interface ILocalExecutorService {
230
+ /**
231
+ * Execute a command locally using Node.js execFile.
232
+ * Uses execFile (not shell) to prevent command injection.
233
+ *
234
+ * @param command - Command to execute (path or binary name)
235
+ * @param args - Array of command arguments
236
+ * @param options - Execution options
237
+ * @param options.timeoutMs - Command timeout in milliseconds (default: 30000)
238
+ * @param options.cwd - Working directory for command execution
239
+ * @returns Command output as string (stdout, trimmed)
240
+ * @throws Error if command fails (non-zero exit code), times out, or binary not found
241
+ * @note stderr output is included in error messages but does not cause failure by itself
242
+ */
243
+ executeLocalCommand(command: string, args?: string[], options?: {
244
+ timeoutMs?: number;
245
+ cwd?: string;
246
+ }): Promise<string>;
395
247
  }
396
248
  /**
397
249
  * Service factory interface for creating service instances with dependency injection.
@@ -404,7 +256,7 @@ export interface IServiceFactory {
404
256
  *
405
257
  * @returns Docker service instance
406
258
  */
407
- createDockerService(): IDockerService;
259
+ createDockerService(): DockerOperations;
408
260
  /**
409
261
  * Create an SSH connection pool instance.
410
262
  *
@@ -423,14 +275,22 @@ export interface IServiceFactory {
423
275
  * @returns SSH service instance
424
276
  */
425
277
  createSSHService(pool: ISSHConnectionPool): ISSHService;
278
+ /**
279
+ * Create a local executor service instance.
280
+ * Local executor runs commands on localhost without SSH.
281
+ *
282
+ * @returns Local executor service instance
283
+ */
284
+ createLocalExecutor(): ILocalExecutorService;
426
285
  /**
427
286
  * Create a Docker Compose service instance.
428
- * Compose service requires SSH service for executing remote commands.
287
+ * Compose service requires SSH service for remote commands and local executor for local commands.
429
288
  *
430
289
  * @param sshService - SSH service to use for remote command execution
290
+ * @param localExecutor - Local executor service for local command execution
431
291
  * @returns Compose service instance
432
292
  */
433
- createComposeService(sshService: ISSHService): IComposeService;
293
+ createComposeService(sshService: ISSHService, localExecutor: ILocalExecutorService): IComposeService;
434
294
  /**
435
295
  * Create a File service instance.
436
296
  * File service requires SSH service for remote file operations.
@@ -534,4 +394,11 @@ export interface IFileService {
534
394
  */
535
395
  diffFiles(host1: HostConfig, path1: string, host2: HostConfig, path2: string, contextLines: number): Promise<string>;
536
396
  }
397
+ /**
398
+ * Minimal interface for listing compose projects
399
+ * Used by ComposeDiscovery to avoid circular dependency with ComposeService
400
+ */
401
+ export interface IComposeProjectLister {
402
+ listComposeProjects(host: HostConfig): Promise<ComposeProject[]>;
403
+ }
537
404
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/services/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/services/interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ILocalExecutorService } from "./interfaces.js";
2
+ /**
3
+ * Options for local command execution
4
+ */
5
+ export interface LocalCommandOptions {
6
+ timeoutMs?: number;
7
+ cwd?: string;
8
+ }
9
+ /**
10
+ * LocalExecutorService implementation for executing commands on localhost.
11
+ * Uses Node.js execFile for secure command execution without shell interpretation.
12
+ *
13
+ * SECURITY: Uses execFile (not exec) to prevent shell injection attacks.
14
+ * Command and arguments are passed separately, preventing metacharacter interpretation.
15
+ */
16
+ export declare class LocalExecutorService implements ILocalExecutorService {
17
+ /**
18
+ * Execute a command locally using Node.js execFile
19
+ *
20
+ * SECURITY: Uses execFile which does NOT invoke a shell, preventing command injection.
21
+ * Arguments are passed as array elements, not concatenated strings.
22
+ *
23
+ * @param command - Command to execute (binary name or path)
24
+ * @param args - Command arguments (each element is a separate argument)
25
+ * @param options - Execution options (timeout, cwd)
26
+ * @returns Command stdout (trimmed)
27
+ * @throws Error if command fails, times out, or binary not found
28
+ */
29
+ executeLocalCommand(command: string, args?: string[], options?: LocalCommandOptions): Promise<string>;
30
+ }
31
+ //# sourceMappingURL=local-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-executor.d.ts","sourceRoot":"","sources":["../../src/services/local-executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAI7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE;;;;;;;;;;;OAWG;IACG,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC;CAgEnB"}
@@ -0,0 +1,71 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ /**
5
+ * LocalExecutorService implementation for executing commands on localhost.
6
+ * Uses Node.js execFile for secure command execution without shell interpretation.
7
+ *
8
+ * SECURITY: Uses execFile (not exec) to prevent shell injection attacks.
9
+ * Command and arguments are passed separately, preventing metacharacter interpretation.
10
+ */
11
+ export class LocalExecutorService {
12
+ /**
13
+ * Execute a command locally using Node.js execFile
14
+ *
15
+ * SECURITY: Uses execFile which does NOT invoke a shell, preventing command injection.
16
+ * Arguments are passed as array elements, not concatenated strings.
17
+ *
18
+ * @param command - Command to execute (binary name or path)
19
+ * @param args - Command arguments (each element is a separate argument)
20
+ * @param options - Execution options (timeout, cwd)
21
+ * @returns Command stdout (trimmed)
22
+ * @throws Error if command fails, times out, or binary not found
23
+ */
24
+ async executeLocalCommand(command, args = [], options = {}) {
25
+ const timeoutMs = options.timeoutMs ?? 30000;
26
+ if (!command || command.trim() === "") {
27
+ throw new Error("Command cannot be empty");
28
+ }
29
+ try {
30
+ // execFile does NOT use shell - args are passed directly to the binary
31
+ // This prevents injection: echo "foo; rm -rf /" becomes literal string, not executed
32
+ const { stdout } = await execFileAsync(command, args, {
33
+ timeout: timeoutMs,
34
+ cwd: options.cwd,
35
+ maxBuffer: 10 * 1024 * 1024, // 10MB max output
36
+ encoding: "utf8",
37
+ // IMPORTANT: no shell option - we want execFile's default behavior (no shell)
38
+ shell: false,
39
+ });
40
+ // execFile can succeed with stderr output in some cases
41
+ // We only fail on non-zero exit codes (handled by execFile rejection)
42
+ return stdout.trim();
43
+ }
44
+ catch (error) {
45
+ // Type guard for Error objects
46
+ if (error instanceof Error) {
47
+ // execFile throws with code property on command errors
48
+ const execError = error;
49
+ // Handle timeout or forced termination
50
+ // killed=true indicates process was forcibly terminated
51
+ // SIGTERM is graceful termination, SIGKILL is forced termination
52
+ if (execError.killed || execError.signal === "SIGTERM" || execError.signal === "SIGKILL") {
53
+ throw new Error(`Local command timeout after ${timeoutMs}ms: ${command} ${args.join(" ")}`, { cause: error });
54
+ }
55
+ // Handle command not found
56
+ if (execError.code === "ENOENT") {
57
+ throw new Error(`Command not found: ${command}`, { cause: error });
58
+ }
59
+ // Handle command execution failure with context
60
+ const argsStr = args.length > 0 ? ` ${args.join(" ")}` : "";
61
+ const stderrInfo = execError.stderr ? `\nStderr: ${execError.stderr}` : "";
62
+ throw new Error(`Local command failed: ${command}${argsStr}${stderrInfo}\nOriginal error: ${error.message}`, { cause: error });
63
+ }
64
+ // Non-Error exceptions (rare) - preserve original error as cause
65
+ throw new Error(`Local command execution failed: ${String(error)}`, {
66
+ cause: error,
67
+ });
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=local-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-executor.js","sourceRoot":"","sources":["../../src/services/local-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAU1C;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IAC/B;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,mBAAmB,CACvB,OAAe,EACf,OAAiB,EAAE,EACnB,UAA+B,EAAE;QAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAE7C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC;YACH,uEAAuE;YACvE,qFAAqF;YACrF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;gBACpD,OAAO,EAAE,SAAS;gBAClB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,kBAAkB;gBAC/C,QAAQ,EAAE,MAAM;gBAChB,8EAA8E;gBAC9E,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YAEH,wDAAwD;YACxD,sEAAsE;YACtE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+BAA+B;YAC/B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,uDAAuD;gBACvD,MAAM,SAAS,GAAG,KAMjB,CAAC;gBAEF,uCAAuC;gBACvC,wDAAwD;gBACxD,iEAAiE;gBACjE,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzF,MAAM,IAAI,KAAK,CACb,+BAA+B,SAAS,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC1E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;gBACJ,CAAC;gBAED,2BAA2B;gBAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC;gBAED,gDAAgD;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,KAAK,CACb,yBAAyB,OAAO,GAAG,OAAO,GAAG,UAAU,qBAAqB,KAAK,CAAC,OAAO,EAAE,EAC3F,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YAED,iEAAiE;YACjE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBAClE,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { HostConfig } from "../types.js";
2
+ /**
3
+ * Load host configurations from SSH config file
4
+ *
5
+ * @param configPath - Path to SSH config file (defaults to ~/.ssh/config)
6
+ * @returns Promise resolving to array of HostConfig objects parsed from SSH config
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const hosts = await loadFromSSHConfig("~/.ssh/config");
11
+ * // Returns: [{ name: "server1", host: "192.168.1.100", protocol: "ssh", ... }]
12
+ * ```
13
+ */
14
+ export declare function loadFromSSHConfig(configPath?: string): Promise<HostConfig[]>;
15
+ /**
16
+ * Merge host configurations with manual config taking precedence
17
+ *
18
+ * Manual hosts completely replace SSH config hosts with the same name.
19
+ * No property merging - manual config is used as-is.
20
+ *
21
+ * @param sshConfigHosts - Hosts loaded from SSH config
22
+ * @param manualHosts - Hosts from manual configuration (config file or env var)
23
+ * @returns Merged array with manual hosts taking precedence
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const sshHosts = [{ name: "server1", host: "192.168.1.100", protocol: "ssh" }];
28
+ * const manualHosts = [{ name: "server1", host: "10.0.0.100", protocol: "http" }];
29
+ * const merged = mergeHostConfigs(sshHosts, manualHosts);
30
+ * // Result: [{ name: "server1", host: "10.0.0.100", protocol: "http" }]
31
+ * // Manual config completely replaces SSH config
32
+ * ```
33
+ */
34
+ export declare function mergeHostConfigs(sshConfigHosts: HostConfig[], manualHosts: HostConfig[]): HostConfig[];
35
+ //# sourceMappingURL=ssh-config-loader.d.ts.map