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,36 @@
1
+ /**
2
+ * Supported init systems
3
+ */
4
+ export type InitSystem = "systemd" | "openrc" | "sysv" | "upstart" | "unknown";
5
+ /**
6
+ * Command structure for listing services
7
+ */
8
+ export interface ServiceListCommand {
9
+ command: string;
10
+ args: string[];
11
+ }
12
+ /**
13
+ * Detect the init system from command output.
14
+ * Typically called with output from: ps -p 1 -o comm= or readlink /proc/1/exe
15
+ *
16
+ * @param output - Command output to analyze
17
+ * @returns Detected init system type
18
+ */
19
+ export declare function detectInitSystem(output: string): InitSystem;
20
+ /**
21
+ * Get the appropriate command to list services for a given init system.
22
+ *
23
+ * @param initSystem - The detected init system
24
+ * @param state - Optional state filter (only works with systemd)
25
+ * @param service - Optional service name filter (only works with systemd)
26
+ * @returns Command and arguments to list services
27
+ */
28
+ export declare function getServiceListCommand(initSystem: InitSystem, state?: string, service?: string): ServiceListCommand;
29
+ /**
30
+ * Format the output title based on the init system.
31
+ *
32
+ * @param initSystem - The detected init system
33
+ * @returns Human-readable title for the service list
34
+ */
35
+ export declare function getServiceListTitle(initSystem: InitSystem): string;
36
+ //# sourceMappingURL=init-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-detection.d.ts","sourceRoot":"","sources":["../../src/utils/init-detection.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAqB3D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,kBAAkB,CA8BpB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAclE"}
@@ -0,0 +1,79 @@
1
+ // src/utils/init-detection.ts
2
+ /**
3
+ * Detect the init system from command output.
4
+ * Typically called with output from: ps -p 1 -o comm= or readlink /proc/1/exe
5
+ *
6
+ * @param output - Command output to analyze
7
+ * @returns Detected init system type
8
+ */
9
+ export function detectInitSystem(output) {
10
+ const normalized = output.toLowerCase().trim();
11
+ if (normalized.includes("systemd")) {
12
+ return "systemd";
13
+ }
14
+ if (normalized.includes("openrc")) {
15
+ return "openrc";
16
+ }
17
+ // SysV init often shows as 'init' in process list
18
+ if (normalized.includes("init") && !normalized.includes("upstart")) {
19
+ return "sysv";
20
+ }
21
+ if (normalized.includes("upstart")) {
22
+ return "upstart";
23
+ }
24
+ return "unknown";
25
+ }
26
+ /**
27
+ * Get the appropriate command to list services for a given init system.
28
+ *
29
+ * @param initSystem - The detected init system
30
+ * @param state - Optional state filter (only works with systemd)
31
+ * @param service - Optional service name filter (only works with systemd)
32
+ * @returns Command and arguments to list services
33
+ */
34
+ export function getServiceListCommand(initSystem, state, service) {
35
+ switch (initSystem) {
36
+ case "systemd": {
37
+ const args = ["list-units", "--type=service", "--no-pager"];
38
+ if (state && state !== "all") {
39
+ args.push(`--state=${state}`);
40
+ }
41
+ if (service) {
42
+ args.push(service);
43
+ }
44
+ return { command: "systemctl", args };
45
+ }
46
+ case "openrc":
47
+ return { command: "rc-status", args: ["--servicelist"] };
48
+ case "sysv":
49
+ return { command: "service", args: ["--status-all"] };
50
+ case "upstart":
51
+ return { command: "initctl", args: ["list"] };
52
+ case "unknown":
53
+ default:
54
+ // Fallback to showing all processes
55
+ return { command: "ps", args: ["aux"] };
56
+ }
57
+ }
58
+ /**
59
+ * Format the output title based on the init system.
60
+ *
61
+ * @param initSystem - The detected init system
62
+ * @returns Human-readable title for the service list
63
+ */
64
+ export function getServiceListTitle(initSystem) {
65
+ switch (initSystem) {
66
+ case "systemd":
67
+ return "Systemd Services";
68
+ case "openrc":
69
+ return "OpenRC Services";
70
+ case "sysv":
71
+ return "SysV Init Services";
72
+ case "upstart":
73
+ return "Upstart Services";
74
+ case "unknown":
75
+ default:
76
+ return "Running Processes (init system unknown)";
77
+ }
78
+ }
79
+ //# sourceMappingURL=init-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-detection.js","sourceRoot":"","sources":["../../src/utils/init-detection.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAe9B;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE/C,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kDAAkD;IAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAsB,EACtB,KAAc,EACd,OAAgB;IAEhB,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;YAE5D,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,KAAK,QAAQ;YACX,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;QAE3D,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAExD,KAAK,SAAS;YACZ,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QAEhD,KAAK,SAAS,CAAC;QACf;YACE,oCAAoC;YACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAsB;IACxD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC;QAC9B,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC;QAC5B,KAAK,SAAS,CAAC;QACf;YACE,OAAO,yCAAyC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import pino from "pino";
2
+ /**
3
+ * Creates a structured logger instance with Pino
4
+ * Uses stderr (process.stderr.fd = 2) to keep stdout clean for MCP protocol
5
+ */
6
+ export declare const logger: pino.Logger<never, boolean>;
7
+ /**
8
+ * Creates a child logger with additional context
9
+ */
10
+ export declare function createLogger(context: Record<string, unknown>): pino.Logger;
11
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,MAAM,6BAsBlB,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAE1E"}
@@ -0,0 +1,32 @@
1
+ import pino from "pino";
2
+ /**
3
+ * Creates a structured logger instance with Pino
4
+ * Uses stderr (process.stderr.fd = 2) to keep stdout clean for MCP protocol
5
+ */
6
+ export const logger = pino({
7
+ level: process.env.LOG_LEVEL || "info",
8
+ transport: process.env.NODE_ENV !== "production"
9
+ ? {
10
+ target: "pino-pretty",
11
+ options: {
12
+ colorize: true,
13
+ translateTime: "HH:MM:ss | mm/dd/yyyy",
14
+ ignore: "pid,hostname"
15
+ }
16
+ }
17
+ : undefined,
18
+ formatters: {
19
+ level: (label) => {
20
+ return { level: label.toUpperCase() };
21
+ }
22
+ },
23
+ timestamp: () => `,"time":"${new Date().toISOString()}"`
24
+ }, pino.destination({ dest: 2, sync: false }) // Use stderr (fd 2) instead of stdout (fd 1)
25
+ );
26
+ /**
27
+ * Creates a child logger with additional context
28
+ */
29
+ export function createLogger(context) {
30
+ return logger.child(context);
31
+ }
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CACxB;IACE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACnC,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,uBAAuB;gBACtC,MAAM,EAAE,cAAc;aACvB;SACF;QACH,CAAC,CAAC,SAAS;IACf,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,CAAC;KACF;IACD,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG;CACzD,EACD,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,6CAA6C;CACzF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgC;IAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Apply pagination to an array of items.
3
+ *
4
+ * @param items - Array of items to paginate
5
+ * @param offset - Number of items to skip (default: 0)
6
+ * @param limit - Maximum number of items to return (default: undefined, returns all)
7
+ * @returns Paginated slice of the input array
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
12
+ *
13
+ * applyPagination(items, 0, 5); // [1, 2, 3, 4, 5]
14
+ * applyPagination(items, 5, 5); // [6, 7, 8, 9, 10]
15
+ * applyPagination(items, 5); // [6, 7, 8, 9, 10]
16
+ * applyPagination(items, 100, 5); // []
17
+ * ```
18
+ */
19
+ export declare function applyPagination<T>(items: T[], offset?: number, limit?: number): T[];
20
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAYnF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Apply pagination to an array of items.
3
+ *
4
+ * @param items - Array of items to paginate
5
+ * @param offset - Number of items to skip (default: 0)
6
+ * @param limit - Maximum number of items to return (default: undefined, returns all)
7
+ * @returns Paginated slice of the input array
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
12
+ *
13
+ * applyPagination(items, 0, 5); // [1, 2, 3, 4, 5]
14
+ * applyPagination(items, 5, 5); // [6, 7, 8, 9, 10]
15
+ * applyPagination(items, 5); // [6, 7, 8, 9, 10]
16
+ * applyPagination(items, 100, 5); // []
17
+ * ```
18
+ */
19
+ export function applyPagination(items, offset, limit) {
20
+ const start = offset ?? 0;
21
+ // No pagination needed
22
+ if (start === 0 && limit === undefined) {
23
+ return items;
24
+ }
25
+ // Calculate end index
26
+ const end = limit !== undefined ? start + limit : undefined;
27
+ return items.slice(start, end);
28
+ }
29
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAI,KAAU,EAAE,MAAe,EAAE,KAAc;IAC5E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC;IAE1B,uBAAuB;IACvB,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC"}
@@ -26,39 +26,153 @@ export declare class HostSecurityError extends Error {
26
26
  constructor(message: string, host: string);
27
27
  }
28
28
  /**
29
- * Validates hostname format to prevent command injection
29
+ * Pattern for valid systemd service names
30
+ * Allows alphanumeric characters plus @ . _ -
31
+ */
32
+ export declare const SYSTEMD_SERVICE_NAME_PATTERN: RegExp;
33
+ /**
34
+ * Validates hostname format to prevent command injection.
35
+ *
36
+ * Security: Prevents CWE-78 (OS Command Injection) by rejecting shell metacharacters
37
+ * that could be used to inject arbitrary commands when hostname is used in SSH commands.
38
+ * @see https://cwe.mitre.org/data/definitions/78.html
30
39
  *
31
- * @param host - Hostname to validate
32
- * @throws HostSecurityError if host contains dangerous characters
40
+ * @param hostname - Hostname to validate (must match pattern: alphanumeric, dots, hyphens, underscores)
41
+ * @throws {HostSecurityError} If hostname is empty, contains dangerous characters, or has invalid format
42
+ * @example
43
+ * ```typescript
44
+ * validateHostname("proxy.example.com"); // valid
45
+ * validateHostname("host-01"); // valid
46
+ * validateHostname("bad;rm -rf /"); // throws HostSecurityError
47
+ * ```
33
48
  */
34
- export declare function validateHostFormat(host: string): void;
49
+ export declare function validateHostname(hostname: string): void;
50
+ /**
51
+ * Security error for SSH argument validation
52
+ */
53
+ export declare class SSHArgSecurityError extends Error {
54
+ readonly arg: string;
55
+ readonly paramName: string;
56
+ constructor(message: string, arg: string, paramName: string);
57
+ }
58
+ /**
59
+ * Validates SSH command argument to prevent command injection.
60
+ *
61
+ * Security: Prevents CWE-77 (Command Injection) and CWE-78 (OS Command Injection)
62
+ * by rejecting shell metacharacters. The SSH service joins args with spaces and executes
63
+ * as a shell command, so an attacker could inject arbitrary commands (e.g., "running; rm -rf /").
64
+ * @see https://cwe.mitre.org/data/definitions/77.html
65
+ * @see https://cwe.mitre.org/data/definitions/78.html
66
+ *
67
+ * @param arg - Argument value to validate (max 500 characters, no shell metacharacters)
68
+ * @param paramName - Name of the parameter (used in error messages for context)
69
+ * @throws {SSHArgSecurityError} If arg is empty, contains shell metacharacters, or exceeds 500 characters
70
+ * @example
71
+ * ```typescript
72
+ * validateSSHArg("running", "status"); // valid
73
+ * validateSSHArg("docker-compose.yml", "file"); // valid
74
+ * validateSSHArg("arg; rm -rf /", "input"); // throws SSHArgSecurityError
75
+ * ```
76
+ */
77
+ export declare function validateSSHArg(arg: string, paramName: string): void;
78
+ /**
79
+ * @deprecated Use validateServiceName from validation.ts instead
80
+ * Re-exported for backwards compatibility
81
+ */
82
+ export { validateServiceName as validateSystemdServiceName } from "./validation.js";
35
83
  /**
36
84
  * Escapes a string for safe use as a shell argument.
37
- * Uses single quotes with proper escaping for embedded single quotes.
38
85
  *
39
- * @param arg - String to escape
40
- * @returns Safely quoted string
86
+ * Security: Prevents CWE-78 (OS Command Injection) by wrapping argument in single quotes
87
+ * and properly escaping any embedded single quotes using the '\'' sequence.
88
+ * @see https://cwe.mitre.org/data/definitions/78.html
89
+ *
90
+ * @param arg - String to escape for shell usage
91
+ * @returns Safely quoted string suitable for shell command construction
92
+ * @example
93
+ * ```typescript
94
+ * escapeShellArg("hello world"); // returns: 'hello world'
95
+ * escapeShellArg("it's a test"); // returns: 'it'\''s a test'
96
+ * escapeShellArg("$(rm -rf /)"); // returns: '$(rm -rf /)' (neutered)
97
+ * ```
41
98
  */
42
99
  export declare function escapeShellArg(arg: string): string;
43
100
  /**
44
- * Checks if a path is a system path that should be protected
101
+ * Checks if a path is a system path that should be protected from modification.
45
102
  *
46
- * @param path - Path to check
47
- * @returns true if path is in a system directory
103
+ * Identifies paths in critical system directories (/etc, /bin, /sbin, /usr/bin, /usr/sbin,
104
+ * /lib, /lib64, /boot, /root) that typically require elevated privileges and should
105
+ * trigger warnings when used as transfer targets.
106
+ *
107
+ * @param path - Absolute path to check against system directory prefixes
108
+ * @returns true if path is in a system directory, false otherwise
109
+ * @example
110
+ * ```typescript
111
+ * isSystemPath("/etc/nginx/nginx.conf"); // true
112
+ * isSystemPath("/home/user/file.txt"); // false
113
+ * isSystemPath("/usr/bin/curl"); // true
114
+ * ```
48
115
  */
49
116
  export declare function isSystemPath(path: string): boolean;
50
117
  /**
51
- * Validates that a file path is safe from directory traversal attacks
118
+ * Validates that a file path is safe from directory traversal attacks.
119
+ *
120
+ * Security: Prevents CWE-22 (Path Traversal) by enforcing strict path validation rules
121
+ * to prevent attackers from accessing files outside intended directories.
122
+ * @see https://cwe.mitre.org/data/definitions/22.html
52
123
  *
53
- * Rules:
124
+ * SECURITY (S-M5, CWE-22): Character Set Restrictions
125
+ * ----------------------------------------------------
126
+ * This function deliberately uses a conservative character whitelist to prioritize
127
+ * security over flexibility. The allowed character set is: [a-zA-Z0-9._\-/]
128
+ *
129
+ * **Allowed:**
130
+ * - Alphanumeric: a-z, A-Z, 0-9
131
+ * - Separators: forward slash (/)
132
+ * - Safe punctuation: dot (.), hyphen (-), underscore (_)
133
+ *
134
+ * **Explicitly Rejected:**
135
+ * - Spaces: Rejected to prevent parsing ambiguity in shell contexts and URL encoding issues
136
+ * - Colons: Rejected to prevent NTFS alternate data stream access (Windows) and URL scheme confusion
137
+ * - Backslashes: Rejected to prevent Windows path traversal and escape sequence injection
138
+ * - Shell metacharacters: &, |, ;, $, `, <, >, (, ), {, }, [, ], *, ?, ~, !, #, @
139
+ *
140
+ * **Design Rationale:**
141
+ * While spaces and colons are technically valid in POSIX paths, they create security risks:
142
+ * 1. Spaces require proper quoting in shell contexts (SSH commands, Docker exec)
143
+ * 2. Colons enable Windows alternate data streams (file.txt:hidden) and path separator confusion
144
+ * 3. Conservative whitelist prevents future attack vectors as new exploits are discovered
145
+ *
146
+ * **If you need paths with spaces or colons:**
147
+ * Use escapeShellArg() for shell command construction, but understand this function
148
+ * deliberately rejects them at the validation layer as a defense-in-depth measure.
149
+ * The security review (02-security-performance.md, S-M5) concluded: "Security over flexibility."
150
+ *
151
+ * Validation rules:
54
152
  * 1. Must be absolute path (starts with /)
55
- * 2. Cannot contain .. (parent directory)
56
- * 3. Cannot contain . as a path component (except in filenames)
57
- * 4. Must contain only allowed characters: a-zA-Z0-9._-/
153
+ * 2. Cannot contain .. (parent directory traversal)
154
+ * 3. Cannot contain . as a standalone component (current directory)
155
+ * 4. Must contain only safe characters: a-zA-Z0-9._-/
156
+ * 5. Path resolution must not result in traversal
157
+ *
158
+ * @param path - The file path to validate (must be absolute)
159
+ * @param paramName - Name of the parameter (used in error messages for context)
160
+ * @throws {Error} If path is empty, contains traversal sequences, has invalid characters, or is not absolute
161
+ * @example
162
+ * ```typescript
163
+ * // Valid paths
164
+ * validateSecurePath("/data/files/doc.txt", "file"); // OK
165
+ * validateSecurePath("/app/config.json", "config"); // OK
166
+ * validateSecurePath("/srv/docker-compose.yml", "file"); // OK (hyphens allowed)
167
+ * validateSecurePath("/home/user_name/file.tar.gz", "archive"); // OK (underscores, dots allowed)
58
168
  *
59
- * @param path - The file path to validate
60
- * @param paramName - Name of the parameter (for error messages)
61
- * @throws Error if path contains directory traversal or is invalid
169
+ * // Rejected for security
170
+ * validateSecurePath("../../../etc/passwd", "file"); // throws: relative path with traversal
171
+ * validateSecurePath("/valid/../../../etc/passwd", "file"); // throws: traversal sequence
172
+ * validateSecurePath("/path with spaces/file.txt", "file"); // throws: spaces not allowed
173
+ * validateSecurePath("/path:alternate/file", "file"); // throws: colons not allowed
174
+ * validateSecurePath("/path/$(rm -rf /)", "file"); // throws: shell metacharacters not allowed
175
+ * ```
62
176
  */
63
177
  export declare function validateSecurePath(path: string, paramName: string): void;
64
178
  //# sourceMappingURL=path-security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-security.d.ts","sourceRoot":"","sources":["../../src/utils/path-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAYrD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAiBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAyCxE"}
1
+ {"version":3,"file":"path-security.d.ts","sourceRoot":"","sources":["../../src/utils/path-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAcD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAuB,CAAC;AAEjE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAevD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,GAAG,EAAE,MAAM;aACX,SAAS,EAAE,MAAM;gBAFjC,OAAO,EAAE,MAAM,EACC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM;CAKpC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAqBnE;AAED;;;GAGG;AACH,OAAO,EAAE,mBAAmB,IAAI,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEpF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAiBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoCxE"}