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
@@ -18,7 +18,6 @@
18
18
  * @see https://cwe.mitre.org/data/definitions/22.html
19
19
  * @see https://cwe.mitre.org/data/definitions/78.html
20
20
  */
21
- import { resolve } from "node:path";
22
21
  /**
23
22
  * Security error for invalid host format
24
23
  */
@@ -31,37 +30,115 @@ export class HostSecurityError extends Error {
31
30
  }
32
31
  }
33
32
  // Pattern for valid hostnames: alphanumeric, dots, hyphens, underscores
34
- const VALID_HOST_PATTERN = /^[a-zA-Z0-9._-]+$/;
33
+ const VALID_HOSTNAME_PATTERN = /^[a-zA-Z0-9._-]+$/;
35
34
  // Dangerous shell characters that could enable command injection
36
35
  const DANGEROUS_HOST_CHARS = /[;|$`&<>(){}[\]'"\\!#*?]/;
37
36
  /**
38
- * Validates hostname format to prevent command injection
37
+ * Shell metacharacters that could enable command injection in SSH arguments
38
+ * More permissive than DANGEROUS_HOST_CHARS to allow valid argument values
39
+ */
40
+ const SHELL_METACHARACTERS = /[;&|`$()<>{}[\]\\"\n\r\t]/;
41
+ /**
42
+ * Pattern for valid systemd service names
43
+ * Allows alphanumeric characters plus @ . _ -
44
+ */
45
+ export const SYSTEMD_SERVICE_NAME_PATTERN = /^[a-zA-Z0-9@._-]+$/;
46
+ /**
47
+ * Validates hostname format to prevent command injection.
48
+ *
49
+ * Security: Prevents CWE-78 (OS Command Injection) by rejecting shell metacharacters
50
+ * that could be used to inject arbitrary commands when hostname is used in SSH commands.
51
+ * @see https://cwe.mitre.org/data/definitions/78.html
52
+ *
53
+ * @param hostname - Hostname to validate (must match pattern: alphanumeric, dots, hyphens, underscores)
54
+ * @throws {HostSecurityError} If hostname is empty, contains dangerous characters, or has invalid format
55
+ * @example
56
+ * ```typescript
57
+ * validateHostname("proxy.example.com"); // valid
58
+ * validateHostname("host-01"); // valid
59
+ * validateHostname("bad;rm -rf /"); // throws HostSecurityError
60
+ * ```
61
+ */
62
+ export function validateHostname(hostname) {
63
+ if (!hostname || hostname.length === 0) {
64
+ throw new HostSecurityError("Hostname cannot be empty", hostname);
65
+ }
66
+ if (DANGEROUS_HOST_CHARS.test(hostname)) {
67
+ throw new HostSecurityError(`Invalid characters in hostname: ${hostname.substring(0, 50)}`, hostname);
68
+ }
69
+ if (!VALID_HOSTNAME_PATTERN.test(hostname)) {
70
+ throw new HostSecurityError(`Invalid hostname format: ${hostname.substring(0, 50)}`, hostname);
71
+ }
72
+ }
73
+ /**
74
+ * Security error for SSH argument validation
75
+ */
76
+ export class SSHArgSecurityError extends Error {
77
+ arg;
78
+ paramName;
79
+ constructor(message, arg, paramName) {
80
+ super(message);
81
+ this.arg = arg;
82
+ this.paramName = paramName;
83
+ this.name = "SSHArgSecurityError";
84
+ }
85
+ }
86
+ /**
87
+ * Validates SSH command argument to prevent command injection.
88
+ *
89
+ * Security: Prevents CWE-77 (Command Injection) and CWE-78 (OS Command Injection)
90
+ * by rejecting shell metacharacters. The SSH service joins args with spaces and executes
91
+ * as a shell command, so an attacker could inject arbitrary commands (e.g., "running; rm -rf /").
92
+ * @see https://cwe.mitre.org/data/definitions/77.html
93
+ * @see https://cwe.mitre.org/data/definitions/78.html
39
94
  *
40
- * @param host - Hostname to validate
41
- * @throws HostSecurityError if host contains dangerous characters
95
+ * @param arg - Argument value to validate (max 500 characters, no shell metacharacters)
96
+ * @param paramName - Name of the parameter (used in error messages for context)
97
+ * @throws {SSHArgSecurityError} If arg is empty, contains shell metacharacters, or exceeds 500 characters
98
+ * @example
99
+ * ```typescript
100
+ * validateSSHArg("running", "status"); // valid
101
+ * validateSSHArg("docker-compose.yml", "file"); // valid
102
+ * validateSSHArg("arg; rm -rf /", "input"); // throws SSHArgSecurityError
103
+ * ```
42
104
  */
43
- export function validateHostFormat(host) {
44
- if (!host || host.length === 0) {
45
- throw new HostSecurityError("Host cannot be empty", host);
105
+ export function validateSSHArg(arg, paramName) {
106
+ if (!arg || arg.length === 0) {
107
+ throw new SSHArgSecurityError(`${paramName} cannot be empty`, arg, paramName);
46
108
  }
47
- if (DANGEROUS_HOST_CHARS.test(host)) {
48
- throw new HostSecurityError(`Invalid characters in hostname: ${host.substring(0, 50)}`, host);
109
+ if (SHELL_METACHARACTERS.test(arg)) {
110
+ throw new SSHArgSecurityError(`Invalid character in ${paramName}: shell metacharacters not allowed`, arg.substring(0, 50), paramName);
49
111
  }
50
- if (!VALID_HOST_PATTERN.test(host)) {
51
- throw new HostSecurityError(`Invalid hostname format: ${host.substring(0, 50)}`, host);
112
+ // Additional safety: reject extremely long arguments (DoS prevention)
113
+ if (arg.length > 500) {
114
+ throw new SSHArgSecurityError(`${paramName} too long: maximum 500 characters allowed`, arg.substring(0, 50), paramName);
52
115
  }
53
116
  }
117
+ /**
118
+ * @deprecated Use validateServiceName from validation.ts instead
119
+ * Re-exported for backwards compatibility
120
+ */
121
+ export { validateServiceName as validateSystemdServiceName } from "./validation.js";
54
122
  /**
55
123
  * Escapes a string for safe use as a shell argument.
56
- * Uses single quotes with proper escaping for embedded single quotes.
57
124
  *
58
- * @param arg - String to escape
59
- * @returns Safely quoted string
125
+ * Security: Prevents CWE-78 (OS Command Injection) by wrapping argument in single quotes
126
+ * and properly escaping any embedded single quotes using the '\'' sequence.
127
+ * @see https://cwe.mitre.org/data/definitions/78.html
128
+ *
129
+ * @param arg - String to escape for shell usage
130
+ * @returns Safely quoted string suitable for shell command construction
131
+ * @example
132
+ * ```typescript
133
+ * escapeShellArg("hello world"); // returns: 'hello world'
134
+ * escapeShellArg("it's a test"); // returns: 'it'\''s a test'
135
+ * escapeShellArg("$(rm -rf /)"); // returns: '$(rm -rf /)' (neutered)
136
+ * ```
60
137
  */
61
138
  export function escapeShellArg(arg) {
62
139
  // Single quote the entire string, escaping any embedded single quotes
63
140
  // by ending the quote, adding an escaped single quote, and starting a new quote
64
- return "'" + arg.replace(/'/g, "'\\''") + "'";
141
+ return `'${arg.replace(/'/g, "'\\''")}'`;
65
142
  }
66
143
  /**
67
144
  * System paths that should trigger warnings when used as transfer targets
@@ -75,29 +152,86 @@ const SYSTEM_PATH_PREFIXES = [
75
152
  "/lib",
76
153
  "/lib64",
77
154
  "/boot",
78
- "/root"
155
+ "/root",
79
156
  ];
80
157
  /**
81
- * Checks if a path is a system path that should be protected
158
+ * Checks if a path is a system path that should be protected from modification.
82
159
  *
83
- * @param path - Path to check
84
- * @returns true if path is in a system directory
160
+ * Identifies paths in critical system directories (/etc, /bin, /sbin, /usr/bin, /usr/sbin,
161
+ * /lib, /lib64, /boot, /root) that typically require elevated privileges and should
162
+ * trigger warnings when used as transfer targets.
163
+ *
164
+ * @param path - Absolute path to check against system directory prefixes
165
+ * @returns true if path is in a system directory, false otherwise
166
+ * @example
167
+ * ```typescript
168
+ * isSystemPath("/etc/nginx/nginx.conf"); // true
169
+ * isSystemPath("/home/user/file.txt"); // false
170
+ * isSystemPath("/usr/bin/curl"); // true
171
+ * ```
85
172
  */
86
173
  export function isSystemPath(path) {
87
- return SYSTEM_PATH_PREFIXES.some((prefix) => path === prefix || path.startsWith(prefix + "/"));
174
+ return SYSTEM_PATH_PREFIXES.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));
88
175
  }
89
176
  /**
90
- * Validates that a file path is safe from directory traversal attacks
177
+ * Validates that a file path is safe from directory traversal attacks.
91
178
  *
92
- * Rules:
179
+ * Security: Prevents CWE-22 (Path Traversal) by enforcing strict path validation rules
180
+ * to prevent attackers from accessing files outside intended directories.
181
+ * @see https://cwe.mitre.org/data/definitions/22.html
182
+ *
183
+ * SECURITY (S-M5, CWE-22): Character Set Restrictions
184
+ * ----------------------------------------------------
185
+ * This function deliberately uses a conservative character whitelist to prioritize
186
+ * security over flexibility. The allowed character set is: [a-zA-Z0-9._\-/]
187
+ *
188
+ * **Allowed:**
189
+ * - Alphanumeric: a-z, A-Z, 0-9
190
+ * - Separators: forward slash (/)
191
+ * - Safe punctuation: dot (.), hyphen (-), underscore (_)
192
+ *
193
+ * **Explicitly Rejected:**
194
+ * - Spaces: Rejected to prevent parsing ambiguity in shell contexts and URL encoding issues
195
+ * - Colons: Rejected to prevent NTFS alternate data stream access (Windows) and URL scheme confusion
196
+ * - Backslashes: Rejected to prevent Windows path traversal and escape sequence injection
197
+ * - Shell metacharacters: &, |, ;, $, `, <, >, (, ), {, }, [, ], *, ?, ~, !, #, @
198
+ *
199
+ * **Design Rationale:**
200
+ * While spaces and colons are technically valid in POSIX paths, they create security risks:
201
+ * 1. Spaces require proper quoting in shell contexts (SSH commands, Docker exec)
202
+ * 2. Colons enable Windows alternate data streams (file.txt:hidden) and path separator confusion
203
+ * 3. Conservative whitelist prevents future attack vectors as new exploits are discovered
204
+ *
205
+ * **If you need paths with spaces or colons:**
206
+ * Use escapeShellArg() for shell command construction, but understand this function
207
+ * deliberately rejects them at the validation layer as a defense-in-depth measure.
208
+ * The security review (02-security-performance.md, S-M5) concluded: "Security over flexibility."
209
+ *
210
+ * Validation rules:
93
211
  * 1. Must be absolute path (starts with /)
94
- * 2. Cannot contain .. (parent directory)
95
- * 3. Cannot contain . as a path component (except in filenames)
96
- * 4. Must contain only allowed characters: a-zA-Z0-9._-/
212
+ * 2. Cannot contain .. (parent directory traversal)
213
+ * 3. Cannot contain . as a standalone component (current directory)
214
+ * 4. Must contain only safe characters: a-zA-Z0-9._-/
215
+ * 5. Path resolution must not result in traversal
97
216
  *
98
- * @param path - The file path to validate
99
- * @param paramName - Name of the parameter (for error messages)
100
- * @throws Error if path contains directory traversal or is invalid
217
+ * @param path - The file path to validate (must be absolute)
218
+ * @param paramName - Name of the parameter (used in error messages for context)
219
+ * @throws {Error} If path is empty, contains traversal sequences, has invalid characters, or is not absolute
220
+ * @example
221
+ * ```typescript
222
+ * // Valid paths
223
+ * validateSecurePath("/data/files/doc.txt", "file"); // OK
224
+ * validateSecurePath("/app/config.json", "config"); // OK
225
+ * validateSecurePath("/srv/docker-compose.yml", "file"); // OK (hyphens allowed)
226
+ * validateSecurePath("/home/user_name/file.tar.gz", "archive"); // OK (underscores, dots allowed)
227
+ *
228
+ * // Rejected for security
229
+ * validateSecurePath("../../../etc/passwd", "file"); // throws: relative path with traversal
230
+ * validateSecurePath("/valid/../../../etc/passwd", "file"); // throws: traversal sequence
231
+ * validateSecurePath("/path with spaces/file.txt", "file"); // throws: spaces not allowed
232
+ * validateSecurePath("/path:alternate/file", "file"); // throws: colons not allowed
233
+ * validateSecurePath("/path/$(rm -rf /)", "file"); // throws: shell metacharacters not allowed
234
+ * ```
101
235
  */
102
236
  export function validateSecurePath(path, paramName) {
103
237
  // 1. Check for empty path
@@ -128,11 +262,6 @@ export function validateSecurePath(path, paramName) {
128
262
  throw new Error(`${paramName}: directory traversal (.) not allowed in path: ${path}`);
129
263
  }
130
264
  }
131
- // 5. Additional safety check: resolve path and verify it doesn't traverse
132
- // This catches cases like /valid/path/../../etc that might slip through
133
- const resolved = resolve(path);
134
- if (!resolved.startsWith(path.split("/")[1] ? `/${path.split("/")[1]}` : "/")) {
135
- throw new Error(`${paramName}: Path resolution resulted in directory traversal: ${path}`);
136
- }
265
+ // Path is secure - all ".." and "." components rejected, absolute path verified
137
266
  }
138
267
  //# sourceMappingURL=path-security.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-security.js","sourceRoot":"","sources":["../../src/utils/path-security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path-security.js","sourceRoot":"","sources":["../../src/utils/path-security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared severity sorting utilities (STYLE.md Section 12).
3
+ *
4
+ * Provides a generic severity-first sort function used by container,
5
+ * compose, and host formatters.
6
+ */
7
+ /**
8
+ * Predefined severity orders for container states.
9
+ * Lower values appear first (most critical).
10
+ */
11
+ export declare const CONTAINER_SEVERITY: Record<string, number>;
12
+ /**
13
+ * Predefined severity orders for compose project statuses.
14
+ * Lower values appear first (most critical).
15
+ */
16
+ export declare const COMPOSE_PROJECT_SEVERITY: Record<string, number>;
17
+ /**
18
+ * Predefined severity orders for compose service statuses.
19
+ * Lower values appear first (most critical).
20
+ */
21
+ export declare const COMPOSE_SERVICE_SEVERITY: Record<string, number>;
22
+ /**
23
+ * Sort items by severity, with lowest severity value appearing first.
24
+ * Items with unknown states are placed at the end.
25
+ *
26
+ * @param items - Array to sort (not mutated)
27
+ * @param getState - Function to extract the state/status string from an item
28
+ * @param severityOrder - Map of state strings to numeric severity (lower = more critical)
29
+ * @param getSecondaryKey - Optional function for tiebreaking (typically name); uses localeCompare
30
+ * @returns New sorted array
31
+ */
32
+ export declare function sortBySeverity<T>(items: readonly T[], getState: (item: T) => string, severityOrder: Record<string, number>, getSecondaryKey?: (item: T) => string): T[];
33
+ //# sourceMappingURL=sorting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorting.d.ts","sourceRoot":"","sources":["../../src/utils/sorting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOrD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI3D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG3D,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GACpC,CAAC,EAAE,CAQL"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Shared severity sorting utilities (STYLE.md Section 12).
3
+ *
4
+ * Provides a generic severity-first sort function used by container,
5
+ * compose, and host formatters.
6
+ */
7
+ /**
8
+ * Predefined severity orders for container states.
9
+ * Lower values appear first (most critical).
10
+ */
11
+ export const CONTAINER_SEVERITY = {
12
+ exited: 0,
13
+ dead: 1,
14
+ stopped: 2,
15
+ paused: 3,
16
+ restarting: 4,
17
+ running: 5,
18
+ };
19
+ /**
20
+ * Predefined severity orders for compose project statuses.
21
+ * Lower values appear first (most critical).
22
+ */
23
+ export const COMPOSE_PROJECT_SEVERITY = {
24
+ partial: 0,
25
+ running: 1,
26
+ stopped: 2,
27
+ };
28
+ /**
29
+ * Predefined severity orders for compose service statuses.
30
+ * Lower values appear first (most critical).
31
+ */
32
+ export const COMPOSE_SERVICE_SEVERITY = {
33
+ stopped: 0,
34
+ running: 1,
35
+ };
36
+ /**
37
+ * Sort items by severity, with lowest severity value appearing first.
38
+ * Items with unknown states are placed at the end.
39
+ *
40
+ * @param items - Array to sort (not mutated)
41
+ * @param getState - Function to extract the state/status string from an item
42
+ * @param severityOrder - Map of state strings to numeric severity (lower = more critical)
43
+ * @param getSecondaryKey - Optional function for tiebreaking (typically name); uses localeCompare
44
+ * @returns New sorted array
45
+ */
46
+ export function sortBySeverity(items, getState, severityOrder, getSecondaryKey) {
47
+ return [...items].sort((a, b) => {
48
+ const aSeverity = severityOrder[getState(a)] ?? 999;
49
+ const bSeverity = severityOrder[getState(b)] ?? 999;
50
+ if (aSeverity !== bSeverity)
51
+ return aSeverity - bSeverity;
52
+ if (getSecondaryKey)
53
+ return getSecondaryKey(a).localeCompare(getSecondaryKey(b));
54
+ return 0;
55
+ });
56
+ }
57
+ //# sourceMappingURL=sorting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorting.js","sourceRoot":"","sources":["../../src/utils/sorting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC9D,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC9D,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAmB,EACnB,QAA6B,EAC7B,aAAqC,EACrC,eAAqC;IAErC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QACpD,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QACpD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,GAAG,SAAS,CAAC;QAC1D,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Apply grep filter to output string using String.includes()
3
+ *
4
+ * SECURITY: Uses JavaScript String.includes() for filtering,
5
+ * making it immune to shell injection. The grep parameter can
6
+ * safely contain any characters that pass jsFilterSchema validation.
7
+ *
8
+ * @param output - Multi-line string to filter
9
+ * @param grep - Optional pattern to filter lines by (case-sensitive)
10
+ * @returns Filtered output with matching lines joined by newlines
11
+ */
12
+ export declare function applyGrepFilter(output: string, grep?: string): string;
13
+ //# sourceMappingURL=text-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-filters.d.ts","sourceRoot":"","sources":["../../src/utils/text-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAIrE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Apply grep filter to output string using String.includes()
3
+ *
4
+ * SECURITY: Uses JavaScript String.includes() for filtering,
5
+ * making it immune to shell injection. The grep parameter can
6
+ * safely contain any characters that pass jsFilterSchema validation.
7
+ *
8
+ * @param output - Multi-line string to filter
9
+ * @param grep - Optional pattern to filter lines by (case-sensitive)
10
+ * @returns Filtered output with matching lines joined by newlines
11
+ */
12
+ export function applyGrepFilter(output, grep) {
13
+ if (!grep)
14
+ return output;
15
+ const lines = output.split("\n");
16
+ return lines.filter((line) => line.includes(grep)).join("\n");
17
+ }
18
+ //# sourceMappingURL=text-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-filters.js","sourceRoot":"","sources":["../../src/utils/text-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAa;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Time utility functions
3
+ */
4
+ /**
5
+ * Get current timestamp in ISO 8601 format
6
+ * Centralized timestamp generation for consistency across the codebase
7
+ *
8
+ * @returns ISO 8601 timestamp string (e.g., "2026-02-14T12:34:56.789Z")
9
+ */
10
+ export declare function getCurrentTimestamp(): string;
11
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Time utility functions
3
+ */
4
+ /**
5
+ * Get current timestamp in ISO 8601 format
6
+ * Centralized timestamp generation for consistency across the codebase
7
+ *
8
+ * @returns ISO 8601 timestamp string (e.g., "2026-02-14T12:34:56.789Z")
9
+ */
10
+ export function getCurrentTimestamp() {
11
+ return new Date().toISOString();
12
+ }
13
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Centralized validation utilities
3
+ * Consolidates duplicated validation logic from across the codebase
4
+ */
5
+ /**
6
+ * Validates alphanumeric string (letters, numbers, dots, dashes, underscores)
7
+ *
8
+ * @param value - Value to validate
9
+ * @param name - Parameter name for error messages
10
+ * @param options - Optional flags for allowing slashes and tildes
11
+ * @throws Error if value contains invalid characters
12
+ */
13
+ export declare function validateAlphanumeric(value: string, name: string, options?: {
14
+ allowSlash?: boolean;
15
+ allowTilde?: boolean;
16
+ }): void;
17
+ /**
18
+ * Validates systemd service name format
19
+ * Consolidates validation from 4 locations
20
+ *
21
+ * @param service - Service name to validate
22
+ * @throws SSHArgSecurityError if service name is invalid
23
+ */
24
+ export declare function validateServiceName(service: string): void;
25
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAYzD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Centralized validation utilities
3
+ * Consolidates duplicated validation logic from across the codebase
4
+ */
5
+ import { SSHArgSecurityError, SYSTEMD_SERVICE_NAME_PATTERN, validateSSHArg, } from "./path-security.js";
6
+ /**
7
+ * Validates alphanumeric string (letters, numbers, dots, dashes, underscores)
8
+ *
9
+ * @param value - Value to validate
10
+ * @param name - Parameter name for error messages
11
+ * @param options - Optional flags for allowing slashes and tildes
12
+ * @throws Error if value contains invalid characters
13
+ */
14
+ export function validateAlphanumeric(value, name, options = {}) {
15
+ if (!value || value.length === 0) {
16
+ throw new Error(`${name} cannot be empty`);
17
+ }
18
+ const { allowSlash = false, allowTilde = false } = options;
19
+ let pattern;
20
+ if (allowSlash && allowTilde) {
21
+ pattern = /^[a-zA-Z0-9._\-/~]+$/;
22
+ }
23
+ else if (allowSlash) {
24
+ pattern = /^[a-zA-Z0-9._\-/]+$/;
25
+ }
26
+ else if (allowTilde) {
27
+ pattern = /^[a-zA-Z0-9._\-~]+$/;
28
+ }
29
+ else {
30
+ pattern = /^[a-zA-Z0-9._-]+$/;
31
+ }
32
+ if (!pattern.test(value)) {
33
+ const allowed = ["letters", "numbers", "dots", "dashes", "underscores"];
34
+ if (allowSlash)
35
+ allowed.push("forward slashes");
36
+ if (allowTilde)
37
+ allowed.push("tilde");
38
+ throw new Error(`${name}: Invalid characters (allowed: ${allowed.join(", ")})`);
39
+ }
40
+ }
41
+ /**
42
+ * Validates systemd service name format
43
+ * Consolidates validation from 4 locations
44
+ *
45
+ * @param service - Service name to validate
46
+ * @throws SSHArgSecurityError if service name is invalid
47
+ */
48
+ export function validateServiceName(service) {
49
+ // First check for shell metacharacters (from validateSSHArg)
50
+ validateSSHArg(service, "service");
51
+ // Then check systemd naming rules
52
+ if (!SYSTEMD_SERVICE_NAME_PATTERN.test(service)) {
53
+ throw new SSHArgSecurityError("Invalid service name: only letters, numbers, @, ., _, and - are allowed", service.substring(0, 50), "service");
54
+ }
55
+ }
56
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,IAAY,EACZ,UAA0D,EAAE;IAE5D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE3D,IAAI,OAAe,CAAC;IACpB,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAC7B,OAAO,GAAG,sBAAsB,CAAC;IACnC,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,OAAO,GAAG,qBAAqB,CAAC;IAClC,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,OAAO,GAAG,qBAAqB,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,mBAAmB,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACxE,IAAI,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChD,IAAI,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kCAAkC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,6DAA6D;IAC7D,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEnC,kCAAkC;IAClC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,mBAAmB,CAC3B,yEAAyE,EACzE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EACxB,SAAS,CACV,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synapse-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "MCP server providing Flux (Docker management) and Scout (SSH operations) tools for homelab infrastructure",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -18,21 +18,23 @@
18
18
  "README.md"
19
19
  ],
20
20
  "scripts": {
21
- "build": "tsc",
21
+ "build": "pnpm docs:update && tsc",
22
22
  "start": "node dist/index.js",
23
23
  "dev": "tsc --watch",
24
- "clean": "rm -rf dist coverage",
24
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true});require('fs').rmSync('coverage',{recursive:true,force:true})\"",
25
+ "docs:update": "tsx scripts/update-readme.ts",
25
26
  "typecheck": "tsc --noEmit",
26
27
  "test": "vitest run",
27
28
  "test:watch": "vitest",
28
29
  "test:coverage": "vitest run --coverage",
29
30
  "test:integration": "vitest run \"**/*.integration.test.ts\"",
30
31
  "test:bench": "vitest run src/schemas/unified.bench.test.ts",
31
- "lint": "eslint src/",
32
- "lint:fix": "eslint src/ --fix",
33
- "format": "prettier --write src/",
34
- "format:check": "prettier --check src/",
35
- "prepublishOnly": "pnpm run build"
32
+ "lint": "biome check src/",
33
+ "lint:fix": "biome check --write src/",
34
+ "format": "biome format --write src/ && prettier --write \"**/*.{md,yml,yaml}\"",
35
+ "format:check": "biome format src/ && prettier --check \"**/*.{md,yml,yaml}\"",
36
+ "prepublishOnly": "pnpm run build",
37
+ "prepare": "husky"
36
38
  },
37
39
  "keywords": [
38
40
  "mcp",
@@ -60,26 +62,50 @@
60
62
  "node": ">=20.0.0"
61
63
  },
62
64
  "dependencies": {
63
- "@modelcontextprotocol/sdk": "^1.25.1",
65
+ "@modelcontextprotocol/sdk": "^1.26.0",
64
66
  "dockerode": "^4.0.9",
65
67
  "express": "^5.2.1",
66
68
  "express-rate-limit": "^8.2.1",
67
69
  "node-ssh": "^13.2.1",
68
- "zod": "^4.2.1",
70
+ "p-limit": "^7.2.0",
71
+ "ssh-config": "^5.0.4",
72
+ "yaml": "^2.8.2",
73
+ "zod": "^4.3.6",
69
74
  "zod-to-json-schema": "^3.25.1"
70
75
  },
76
+ "pnpm": {
77
+ "overrides": {
78
+ "hono": ">=4.11.7"
79
+ }
80
+ },
71
81
  "devDependencies": {
72
- "@eslint/js": "^9.39.2",
73
- "@types/dockerode": "^3.3.47",
82
+ "@biomejs/biome": "^2.3.15",
83
+ "@eslint/js": "^10.0.1",
84
+ "@types/dockerode": "^4.0.1",
74
85
  "@types/express": "^5.0.6",
75
- "@types/node": "^25.0.3",
86
+ "@types/node": "^25.2.2",
76
87
  "@types/ssh2": "^1.15.5",
77
- "@vitest/coverage-v8": "^4.0.16",
78
- "eslint": "^9.39.2",
88
+ "@types/supertest": "^6.0.3",
89
+ "@vitest/coverage-v8": "^4.0.18",
90
+ "axios": "^1.13.5",
91
+ "eslint": "^10.0.0",
79
92
  "eslint-config-prettier": "^10.1.8",
80
- "prettier": "^3.7.4",
81
- "typescript": "^5.7.0",
82
- "typescript-eslint": "^8.51.0",
83
- "vitest": "^4.0.16"
93
+ "husky": "^9.1.7",
94
+ "lint-staged": "^16.2.7",
95
+ "prettier": "^3.8.1",
96
+ "supertest": "^7.2.2",
97
+ "tsx": "^4.21.0",
98
+ "typescript": "^5.9.3",
99
+ "typescript-eslint": "^8.55.0",
100
+ "vitest": "^4.0.18"
101
+ },
102
+ "lint-staged": {
103
+ "*.ts": [
104
+ "biome check --write",
105
+ "vitest related --run"
106
+ ],
107
+ "*.{json,md,yml,yaml}": [
108
+ "prettier --write"
109
+ ]
84
110
  }
85
111
  }