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,133 @@
1
+ import type { HostConfig } from "../types.js";
2
+ /**
3
+ * Log security warnings for hosts with Docker socket access
4
+ *
5
+ * SECURITY (S-M2, CWE-269): Docker socket access grants root-equivalent privileges.
6
+ * Any process with socket access can:
7
+ * - Create containers with host filesystem mounts
8
+ * - Execute commands as root inside containers
9
+ * - Access the host network
10
+ *
11
+ * This function informs operators about which hosts have this elevated privilege.
12
+ *
13
+ * @param hosts - Array of host configurations to check
14
+ */
15
+ export declare function logDockerSocketSecurityWarnings(hosts: HostConfig[]): void;
16
+ /**
17
+ * Interface for host configuration repository
18
+ */
19
+ export interface IHostConfigRepository {
20
+ /**
21
+ * Load host configurations from all sources
22
+ * @returns Promise resolving to array of host configurations
23
+ */
24
+ loadHosts(): Promise<HostConfig[]>;
25
+ /**
26
+ * Clear cached host configurations
27
+ */
28
+ clearCache(): void;
29
+ }
30
+ /**
31
+ * Repository for loading and caching host configurations
32
+ *
33
+ * Loads hosts from multiple sources in priority order:
34
+ * 1. Manual config file (synapse.config.json) - highest priority
35
+ * 2. SYNAPSE_HOSTS_CONFIG environment variable
36
+ * 3. SSH config auto-discovery (~/.ssh/config)
37
+ * 4. Local Docker socket (fallback)
38
+ *
39
+ * Manual hosts completely replace SSH config hosts with the same name.
40
+ */
41
+ export declare class HostConfigRepository implements IHostConfigRepository {
42
+ private cache;
43
+ private cacheEnabled;
44
+ private sshConfigPath;
45
+ private defaultSocketPath;
46
+ private autoAddLocalSocket;
47
+ /**
48
+ * Create a new HostConfigRepository
49
+ *
50
+ * @param options - Configuration options
51
+ * @param options.enableCache - Enable caching of host configurations (default: false)
52
+ * @param options.sshConfigPath - Path to SSH config file (default: null, set to ~/.ssh/config to enable)
53
+ * @param options.defaultSocketPath - Path to default Docker socket (default: /var/run/docker.sock)
54
+ * @param options.autoAddLocalSocket - Auto-add local Docker socket (default: true - always auto-add if exists)
55
+ */
56
+ constructor(options?: {
57
+ enableCache?: boolean;
58
+ sshConfigPath?: string | null;
59
+ defaultSocketPath?: string;
60
+ autoAddLocalSocket?: boolean;
61
+ });
62
+ /**
63
+ * Load host configurations from all sources
64
+ *
65
+ * Returns cached result if caching is enabled and cache exists.
66
+ * Otherwise loads from sources and caches if enabled.
67
+ *
68
+ * @returns Promise resolving to array of host configurations
69
+ */
70
+ loadHosts(): Promise<HostConfig[]>;
71
+ /**
72
+ * Clear cached host configurations
73
+ */
74
+ clearCache(): void;
75
+ /**
76
+ * Internal method to load hosts from all sources
77
+ *
78
+ * @returns Promise resolving to array of host configurations
79
+ */
80
+ private loadHostsInternal;
81
+ /**
82
+ * Remove hosts excluded through SYNAPSE_EXCLUDE_HOSTS.
83
+ *
84
+ * Environment format: comma-separated host names, e.g. "code-server,clawd".
85
+ */
86
+ private applyExcludedHostsFilter;
87
+ /**
88
+ * Get config file search paths (in order of priority)
89
+ * Computed at runtime to support testing with env var changes
90
+ *
91
+ * @returns Array of config file paths to check
92
+ */
93
+ private getConfigPaths;
94
+ /**
95
+ * Load host configurations from config file with Zod validation
96
+ *
97
+ * Security: Validates all config fields against schema (S-H2)
98
+ * @see https://cwe.mitre.org/data/definitions/20.html
99
+ *
100
+ * @param configPath - Path to config file
101
+ * @returns Promise resolving to array of host configurations (empty if failed)
102
+ */
103
+ private loadFromConfigFile;
104
+ /**
105
+ * Load host configurations from environment variable with Zod validation
106
+ *
107
+ * Security: Validates all config fields against schema (S-H2)
108
+ * @see https://cwe.mitre.org/data/definitions/20.html
109
+ *
110
+ * @returns Array of host configurations (empty if failed)
111
+ */
112
+ private loadFromEnvVar;
113
+ /**
114
+ * Load host configurations from SSH config file
115
+ *
116
+ * @returns Promise resolving to array of host configurations (empty if failed or none found)
117
+ */
118
+ private loadFromSSHConfig;
119
+ /**
120
+ * Get default local host configuration
121
+ *
122
+ * @returns Default local host configuration
123
+ */
124
+ private getDefaultLocalHost;
125
+ /**
126
+ * Auto-add local Docker socket if it exists and isn't already configured
127
+ *
128
+ * @param hosts - Current host configurations
129
+ * @returns Host configurations with local socket added if needed
130
+ */
131
+ private ensureLocalSocket;
132
+ }
133
+ //# sourceMappingURL=host-config-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-config-repository.d.ts","sourceRoot":"","sources":["../../src/services/host-config-repository.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAWzE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnC;;OAEG;IACH,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAsB;IAEhD;;;;;;;;OAQG;gBAED,OAAO,GAAE;QACP,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KACzB;IAiBR;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAiBxC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;;;OAIG;YACW,iBAAiB;IAwD/B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA0BhC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAStB;;;;;;;;OAQG;YACW,kBAAkB;IAuBhC;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAuBtB;;;;OAIG;YACW,iBAAiB;IAsB/B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;CAkC1B"}
@@ -0,0 +1,323 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { homedir, hostname } from "node:os";
4
+ import { join } from "node:path";
5
+ import { DEFAULT_DOCKER_SOCKET, ENV_HOSTS_CONFIG } from "../constants.js";
6
+ import { validateHostConfigs } from "../schemas/host-config.js";
7
+ import { logError } from "../utils/errors.js";
8
+ import { isSocketPath } from "./docker/utils/client-factory.js";
9
+ import { loadFromSSHConfig, mergeHostConfigs } from "./ssh-config-loader.js";
10
+ /**
11
+ * Log security warnings for hosts with Docker socket access
12
+ *
13
+ * SECURITY (S-M2, CWE-269): Docker socket access grants root-equivalent privileges.
14
+ * Any process with socket access can:
15
+ * - Create containers with host filesystem mounts
16
+ * - Execute commands as root inside containers
17
+ * - Access the host network
18
+ *
19
+ * This function informs operators about which hosts have this elevated privilege.
20
+ *
21
+ * @param hosts - Array of host configurations to check
22
+ */
23
+ export function logDockerSocketSecurityWarnings(hosts) {
24
+ for (const host of hosts) {
25
+ // Check if host uses Docker socket (either explicitly or via host field)
26
+ const socketPath = host.dockerSocketPath || (isSocketPath(host.host) ? host.host : null);
27
+ if (socketPath) {
28
+ console.error(`WARNING: Docker socket access grants root-equivalent privileges on ${host.name}`);
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * Repository for loading and caching host configurations
34
+ *
35
+ * Loads hosts from multiple sources in priority order:
36
+ * 1. Manual config file (synapse.config.json) - highest priority
37
+ * 2. SYNAPSE_HOSTS_CONFIG environment variable
38
+ * 3. SSH config auto-discovery (~/.ssh/config)
39
+ * 4. Local Docker socket (fallback)
40
+ *
41
+ * Manual hosts completely replace SSH config hosts with the same name.
42
+ */
43
+ export class HostConfigRepository {
44
+ cache = null;
45
+ cacheEnabled;
46
+ sshConfigPath;
47
+ defaultSocketPath;
48
+ autoAddLocalSocket;
49
+ /**
50
+ * Create a new HostConfigRepository
51
+ *
52
+ * @param options - Configuration options
53
+ * @param options.enableCache - Enable caching of host configurations (default: false)
54
+ * @param options.sshConfigPath - Path to SSH config file (default: null, set to ~/.ssh/config to enable)
55
+ * @param options.defaultSocketPath - Path to default Docker socket (default: /var/run/docker.sock)
56
+ * @param options.autoAddLocalSocket - Auto-add local Docker socket (default: true - always auto-add if exists)
57
+ */
58
+ constructor(options = {}) {
59
+ this.cacheEnabled = options.enableCache ?? false;
60
+ // SSH config loading: use provided path, or default to ~/.ssh/config in non-test environments
61
+ // In test environments (NODE_ENV=test or vitest), default to null to avoid environment dependencies
62
+ if (options.sshConfigPath !== undefined) {
63
+ this.sshConfigPath = options.sshConfigPath;
64
+ }
65
+ else if (process.env.NODE_ENV === "test" || process.env.VITEST) {
66
+ this.sshConfigPath = null;
67
+ }
68
+ else {
69
+ this.sshConfigPath = join(homedir(), ".ssh", "config");
70
+ }
71
+ this.defaultSocketPath = options.defaultSocketPath ?? DEFAULT_DOCKER_SOCKET;
72
+ // Auto-add local socket: if not specified, will be determined based on whether manual config exists
73
+ this.autoAddLocalSocket = options.autoAddLocalSocket;
74
+ }
75
+ /**
76
+ * Load host configurations from all sources
77
+ *
78
+ * Returns cached result if caching is enabled and cache exists.
79
+ * Otherwise loads from sources and caches if enabled.
80
+ *
81
+ * @returns Promise resolving to array of host configurations
82
+ */
83
+ async loadHosts() {
84
+ // Return cached if enabled and available
85
+ if (this.cacheEnabled && this.cache !== null) {
86
+ return this.cache;
87
+ }
88
+ // Load from sources
89
+ const hosts = await this.loadHostsInternal();
90
+ // Cache if enabled
91
+ if (this.cacheEnabled) {
92
+ this.cache = hosts;
93
+ }
94
+ return hosts;
95
+ }
96
+ /**
97
+ * Clear cached host configurations
98
+ */
99
+ clearCache() {
100
+ this.cache = null;
101
+ }
102
+ /**
103
+ * Internal method to load hosts from all sources
104
+ *
105
+ * @returns Promise resolving to array of host configurations
106
+ */
107
+ async loadHostsInternal() {
108
+ let manualHosts = [];
109
+ // 1. Try manual config file first
110
+ for (const configPath of this.getConfigPaths()) {
111
+ if (existsSync(configPath)) {
112
+ const loadedHosts = await this.loadFromConfigFile(configPath);
113
+ if (loadedHosts.length > 0) {
114
+ manualHosts = loadedHosts;
115
+ break;
116
+ }
117
+ }
118
+ }
119
+ // 2. Fall back to env var if no config file
120
+ if (manualHosts.length === 0) {
121
+ const loadedHosts = this.loadFromEnvVar();
122
+ if (loadedHosts.length > 0) {
123
+ manualHosts = loadedHosts;
124
+ }
125
+ }
126
+ // 3. Load SSH config hosts (auto-discovery)
127
+ const sshHosts = await this.loadFromSSHConfig();
128
+ // 4. Merge hosts with manual taking precedence
129
+ const mergedHosts = mergeHostConfigs(sshHosts, manualHosts);
130
+ const hosts = this.applyExcludedHostsFilter(mergedHosts);
131
+ // 5. If still no hosts, default to local socket only
132
+ if (hosts.length === 0) {
133
+ console.error("No config found, using local Docker socket");
134
+ const defaultHost = this.getDefaultLocalHost();
135
+ // SECURITY (S-M2): Warn about Docker socket privileges
136
+ logDockerSocketSecurityWarnings([defaultHost]);
137
+ return [defaultHost];
138
+ }
139
+ // 6. Auto-add local socket if exists and not configured
140
+ // If autoAddLocalSocket is explicitly set, honor it
141
+ // If undefined (default), always auto-add (matches original docker.ts:1280 behavior)
142
+ const shouldAutoAdd = this.autoAddLocalSocket !== undefined ? this.autoAddLocalSocket : true;
143
+ let finalHosts;
144
+ if (shouldAutoAdd) {
145
+ finalHosts = this.ensureLocalSocket(hosts);
146
+ }
147
+ else {
148
+ finalHosts = hosts;
149
+ }
150
+ // SECURITY (S-M2): Log warnings for hosts with Docker socket access
151
+ logDockerSocketSecurityWarnings(finalHosts);
152
+ return finalHosts;
153
+ }
154
+ /**
155
+ * Remove hosts excluded through SYNAPSE_EXCLUDE_HOSTS.
156
+ *
157
+ * Environment format: comma-separated host names, e.g. "code-server,clawd".
158
+ */
159
+ applyExcludedHostsFilter(hosts) {
160
+ const raw = process.env.SYNAPSE_EXCLUDE_HOSTS?.trim();
161
+ if (!raw) {
162
+ return hosts;
163
+ }
164
+ const excluded = new Set(raw
165
+ .split(",")
166
+ .map((value) => value.trim())
167
+ .filter((value) => value.length > 0));
168
+ if (excluded.size === 0) {
169
+ return hosts;
170
+ }
171
+ const filtered = hosts.filter((host) => !excluded.has(host.name));
172
+ const removed = hosts.length - filtered.length;
173
+ if (removed > 0) {
174
+ console.error(`Excluded ${removed} host(s) via SYNAPSE_EXCLUDE_HOSTS`);
175
+ }
176
+ return filtered;
177
+ }
178
+ /**
179
+ * Get config file search paths (in order of priority)
180
+ * Computed at runtime to support testing with env var changes
181
+ *
182
+ * @returns Array of config file paths to check
183
+ */
184
+ getConfigPaths() {
185
+ return [
186
+ process.env.SYNAPSE_CONFIG_FILE, // Explicit path
187
+ join(process.cwd(), "synapse.config.json"), // Current directory
188
+ join(homedir(), ".config", "synapse-mcp", "config.json"), // XDG style
189
+ join(homedir(), ".synapse-mcp.json"), // Dotfile style
190
+ ].filter(Boolean);
191
+ }
192
+ /**
193
+ * Load host configurations from config file with Zod validation
194
+ *
195
+ * Security: Validates all config fields against schema (S-H2)
196
+ * @see https://cwe.mitre.org/data/definitions/20.html
197
+ *
198
+ * @param configPath - Path to config file
199
+ * @returns Promise resolving to array of host configurations (empty if failed)
200
+ */
201
+ async loadFromConfigFile(configPath) {
202
+ try {
203
+ const raw = await readFile(configPath, "utf-8");
204
+ const config = JSON.parse(raw);
205
+ const configHosts = config.hosts || config; // Support { hosts: [...] } or just [...]
206
+ if (Array.isArray(configHosts) && configHosts.length > 0) {
207
+ // SECURITY (S-H2): Validate config with Zod schema before use
208
+ const validated = validateHostConfigs(configHosts);
209
+ console.error(`Loaded ${validated.length} hosts from ${configPath}`);
210
+ return validated;
211
+ }
212
+ return [];
213
+ }
214
+ catch (error) {
215
+ logError(error, {
216
+ operation: "loadFromConfigFile",
217
+ metadata: { configPath, source: "file" },
218
+ });
219
+ return [];
220
+ }
221
+ }
222
+ /**
223
+ * Load host configurations from environment variable with Zod validation
224
+ *
225
+ * Security: Validates all config fields against schema (S-H2)
226
+ * @see https://cwe.mitre.org/data/definitions/20.html
227
+ *
228
+ * @returns Array of host configurations (empty if failed)
229
+ */
230
+ loadFromEnvVar() {
231
+ const configJson = process.env[ENV_HOSTS_CONFIG];
232
+ if (!configJson) {
233
+ return [];
234
+ }
235
+ try {
236
+ const parsed = JSON.parse(configJson);
237
+ const hostsArray = Array.isArray(parsed) ? parsed : [parsed];
238
+ // SECURITY (S-H2): Validate config with Zod schema before use
239
+ const validated = validateHostConfigs(hostsArray);
240
+ console.error(`Loaded ${validated.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
241
+ return validated;
242
+ }
243
+ catch (error) {
244
+ logError(error, {
245
+ operation: "loadFromEnvVar",
246
+ metadata: { source: "SYNAPSE_HOSTS_CONFIG" },
247
+ });
248
+ return [];
249
+ }
250
+ }
251
+ /**
252
+ * Load host configurations from SSH config file
253
+ *
254
+ * @returns Promise resolving to array of host configurations (empty if failed or none found)
255
+ */
256
+ async loadFromSSHConfig() {
257
+ // Skip SSH config loading if path is not provided
258
+ if (!this.sshConfigPath) {
259
+ return [];
260
+ }
261
+ try {
262
+ const hosts = await loadFromSSHConfig(this.sshConfigPath);
263
+ if (hosts.length > 0) {
264
+ console.error(`Auto-discovered ${hosts.length} hosts from SSH config`);
265
+ }
266
+ return hosts;
267
+ }
268
+ catch (error) {
269
+ // SSH config loading failed - this is expected if config is invalid or missing
270
+ logError(error, {
271
+ operation: "loadFromSSHConfig",
272
+ metadata: { sshConfigPath: this.sshConfigPath },
273
+ });
274
+ return [];
275
+ }
276
+ }
277
+ /**
278
+ * Get default local host configuration
279
+ *
280
+ * @returns Default local host configuration
281
+ */
282
+ getDefaultLocalHost() {
283
+ return {
284
+ name: "local",
285
+ host: "localhost",
286
+ protocol: "http",
287
+ dockerSocketPath: this.defaultSocketPath,
288
+ };
289
+ }
290
+ /**
291
+ * Auto-add local Docker socket if it exists and isn't already configured
292
+ *
293
+ * @param hosts - Current host configurations
294
+ * @returns Host configurations with local socket added if needed
295
+ */
296
+ ensureLocalSocket(hosts) {
297
+ // Check if local socket exists
298
+ if (!existsSync(this.defaultSocketPath)) {
299
+ return hosts;
300
+ }
301
+ // Check if any host already uses the local socket
302
+ const hasLocalSocket = hosts.some((h) => h.dockerSocketPath === this.defaultSocketPath ||
303
+ h.host === this.defaultSocketPath ||
304
+ (h.host === "localhost" && h.dockerSocketPath));
305
+ if (hasLocalSocket) {
306
+ return hosts;
307
+ }
308
+ // Auto-add local socket entry
309
+ const localName = hostname()
310
+ .toLowerCase()
311
+ .replace(/[^a-z0-9-]/g, "-") || "local";
312
+ return [
313
+ ...hosts,
314
+ {
315
+ name: localName,
316
+ host: this.defaultSocketPath,
317
+ protocol: "http",
318
+ dockerSocketPath: this.defaultSocketPath,
319
+ },
320
+ ];
321
+ }
322
+ }
323
+ //# sourceMappingURL=host-config-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-config-repository.js","sourceRoot":"","sources":["../../src/services/host-config-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { HostConfig } from "../types.js";
2
+ import type { ComposeDiscovery } from "./compose-discovery.js";
3
+ /**
4
+ * Error thrown when host resolution fails
5
+ */
6
+ export declare class HostResolutionError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ /**
10
+ * Resolves which host contains a compose project when not explicitly specified
11
+ */
12
+ export declare class HostResolver {
13
+ private readonly discovery;
14
+ private readonly hosts;
15
+ constructor(discovery: ComposeDiscovery, hosts: HostConfig[]);
16
+ /**
17
+ * Resolve which host to use for a compose operation
18
+ *
19
+ * @param projectName - Name of the compose project
20
+ * @param specifiedHost - Optional host name explicitly provided by user
21
+ * @returns The resolved host configuration
22
+ * @throws {HostResolutionError} If resolution fails
23
+ */
24
+ resolveHost(projectName: string, specifiedHost?: string): Promise<HostConfig>;
25
+ /**
26
+ * Find all hosts that contain the specified project.
27
+ *
28
+ * Uses an AbortController to cancel remaining checks on early exit or timeout.
29
+ * SECURITY (CWE-404): Timer is properly cleared when resolution settles
30
+ * to prevent dangling promise rejection and memory leak.
31
+ */
32
+ private findMatchingHosts;
33
+ /**
34
+ * Check all hosts in parallel for the project with early-exit.
35
+ *
36
+ * When the first match arrives, starts a short grace period to collect
37
+ * any near-simultaneous matches (for conflict detection). After the
38
+ * grace period or when all checks settle (whichever is first), resolves
39
+ * with all collected matches.
40
+ *
41
+ * If all checks fail before any match, resolves immediately with
42
+ * an empty array.
43
+ *
44
+ * This avoids blocking on slow/offline hosts while still detecting
45
+ * conflicts between responsive hosts.
46
+ */
47
+ private checkAllHosts;
48
+ }
49
+ //# sourceMappingURL=host-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-resolver.d.ts","sourceRoot":"","sources":["../../src/services/host-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA4B/D;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,UAAU,EAAE;IAGtC;;;;;;;OAOG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA+BnF;;;;;;OAMG;YACW,iBAAiB;IAwB/B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,aAAa;CA6DtB"}