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.
- package/README.md +1820 -147
- package/dist/constants.d.ts +10 -4
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -8
- package/dist/constants.js.map +1 -1
- package/dist/events/emitter.d.ts +63 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +112 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +51 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +3 -0
- package/dist/events/types.js.map +1 -0
- package/dist/formatters/compose.d.ts +185 -0
- package/dist/formatters/compose.d.ts.map +1 -0
- package/dist/formatters/compose.js +397 -0
- package/dist/formatters/compose.js.map +1 -0
- package/dist/formatters/container.d.ts +84 -0
- package/dist/formatters/container.d.ts.map +1 -0
- package/dist/formatters/container.js +323 -0
- package/dist/formatters/container.js.map +1 -0
- package/dist/formatters/diagnostics.d.ts +20 -0
- package/dist/formatters/diagnostics.d.ts.map +1 -0
- package/dist/formatters/diagnostics.js +73 -0
- package/dist/formatters/diagnostics.js.map +1 -0
- package/dist/formatters/docker.d.ts +139 -0
- package/dist/formatters/docker.d.ts.map +1 -0
- package/dist/formatters/docker.js +216 -0
- package/dist/formatters/docker.js.map +1 -0
- package/dist/formatters/host.d.ts +137 -0
- package/dist/formatters/host.d.ts.map +1 -0
- package/dist/formatters/host.js +198 -0
- package/dist/formatters/host.js.map +1 -0
- package/dist/formatters/index.d.ts +17 -270
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +21 -456
- package/dist/formatters/index.js.map +1 -1
- package/dist/formatters/scout.d.ts +424 -0
- package/dist/formatters/scout.d.ts.map +1 -0
- package/dist/formatters/scout.js +687 -0
- package/dist/formatters/scout.js.map +1 -0
- package/dist/formatters/strategy.d.ts +105 -0
- package/dist/formatters/strategy.d.ts.map +1 -0
- package/dist/formatters/strategy.js +120 -0
- package/dist/formatters/strategy.js.map +1 -0
- package/dist/formatters/utils.d.ts +84 -0
- package/dist/formatters/utils.d.ts.map +1 -0
- package/dist/formatters/utils.js +129 -0
- package/dist/formatters/utils.js.map +1 -0
- package/dist/health-rate-limiter.d.ts +59 -0
- package/dist/health-rate-limiter.d.ts.map +1 -0
- package/dist/health-rate-limiter.js +159 -0
- package/dist/health-rate-limiter.js.map +1 -0
- package/dist/index.js +61 -100
- package/dist/index.js.map +1 -1
- package/dist/middleware/async-handler.d.ts +62 -0
- package/dist/middleware/async-handler.d.ts.map +1 -0
- package/dist/middleware/async-handler.js +58 -0
- package/dist/middleware/async-handler.js.map +1 -0
- package/dist/middleware/auth.d.ts +32 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +63 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/csrf-protection.d.ts +58 -0
- package/dist/middleware/csrf-protection.d.ts.map +1 -0
- package/dist/middleware/csrf-protection.js +123 -0
- package/dist/middleware/csrf-protection.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +49 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +90 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/error-mapper.d.ts +44 -0
- package/dist/middleware/error-mapper.d.ts.map +1 -0
- package/dist/middleware/error-mapper.js +127 -0
- package/dist/middleware/error-mapper.js.map +1 -0
- package/dist/middleware/index.d.ts +13 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +13 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-id.d.ts +22 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +31 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/types.d.ts +33 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +2 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/schemas/common.d.ts +205 -8
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +290 -17
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/flux/compose.d.ts +307 -44
- package/dist/schemas/flux/compose.d.ts.map +1 -1
- package/dist/schemas/flux/compose.js +74 -48
- package/dist/schemas/flux/compose.js.map +1 -1
- package/dist/schemas/flux/container.d.ts +423 -56
- package/dist/schemas/flux/container.d.ts.map +1 -1
- package/dist/schemas/flux/container.js +83 -61
- package/dist/schemas/flux/container.js.map +1 -1
- package/dist/schemas/flux/docker.d.ts +254 -37
- package/dist/schemas/flux/docker.d.ts.map +1 -1
- package/dist/schemas/flux/docker.js +69 -39
- package/dist/schemas/flux/docker.js.map +1 -1
- package/dist/schemas/flux/host.d.ts +312 -29
- package/dist/schemas/flux/host.d.ts.map +1 -1
- package/dist/schemas/flux/host.js +74 -31
- package/dist/schemas/flux/host.js.map +1 -1
- package/dist/schemas/flux/index.d.ts +503 -11
- package/dist/schemas/flux/index.d.ts.map +1 -1
- package/dist/schemas/flux/index.js +34 -70
- package/dist/schemas/flux/index.js.map +1 -1
- package/dist/schemas/host-config.d.ts +76 -0
- package/dist/schemas/host-config.d.ts.map +1 -0
- package/dist/schemas/host-config.js +105 -0
- package/dist/schemas/host-config.js.map +1 -0
- package/dist/schemas/scout/index.d.ts +80 -23
- package/dist/schemas/scout/index.d.ts.map +1 -1
- package/dist/schemas/scout/index.js +26 -11
- package/dist/schemas/scout/index.js.map +1 -1
- package/dist/schemas/scout/logs.d.ts +17 -5
- package/dist/schemas/scout/logs.d.ts.map +1 -1
- package/dist/schemas/scout/logs.js +41 -31
- package/dist/schemas/scout/logs.js.map +1 -1
- package/dist/schemas/scout/simple.d.ts +126 -11
- package/dist/schemas/scout/simple.d.ts.map +1 -1
- package/dist/schemas/scout/simple.js +112 -57
- package/dist/schemas/scout/simple.js.map +1 -1
- package/dist/schemas/scout/zfs.d.ts +17 -5
- package/dist/schemas/scout/zfs.d.ts.map +1 -1
- package/dist/schemas/scout/zfs.js +34 -25
- package/dist/schemas/scout/zfs.js.map +1 -1
- package/dist/services/cache-layer.d.ts +160 -0
- package/dist/services/cache-layer.d.ts.map +1 -0
- package/dist/services/cache-layer.js +138 -0
- package/dist/services/cache-layer.js.map +1 -0
- package/dist/services/compose-cache.d.ts +75 -0
- package/dist/services/compose-cache.d.ts.map +1 -0
- package/dist/services/compose-cache.js +178 -0
- package/dist/services/compose-cache.js.map +1 -0
- package/dist/services/compose-discovery.d.ts +46 -0
- package/dist/services/compose-discovery.d.ts.map +1 -0
- package/dist/services/compose-discovery.js +219 -0
- package/dist/services/compose-discovery.js.map +1 -0
- package/dist/services/compose-project-lister.d.ts +27 -0
- package/dist/services/compose-project-lister.d.ts.map +1 -0
- package/dist/services/compose-project-lister.js +71 -0
- package/dist/services/compose-project-lister.js.map +1 -0
- package/dist/services/compose-scanner.d.ts +63 -0
- package/dist/services/compose-scanner.d.ts.map +1 -0
- package/dist/services/compose-scanner.js +253 -0
- package/dist/services/compose-scanner.js.map +1 -0
- package/dist/services/compose.d.ts +64 -28
- package/dist/services/compose.d.ts.map +1 -1
- package/dist/services/compose.js +220 -98
- package/dist/services/compose.js.map +1 -1
- package/dist/services/config-loader.d.ts +23 -0
- package/dist/services/config-loader.d.ts.map +1 -0
- package/dist/services/config-loader.js +124 -0
- package/dist/services/config-loader.js.map +1 -0
- package/dist/services/config-service.d.ts +38 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +225 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/container-host-map-cache.d.ts +121 -0
- package/dist/services/container-host-map-cache.d.ts.map +1 -0
- package/dist/services/container-host-map-cache.js +188 -0
- package/dist/services/container-host-map-cache.js.map +1 -0
- package/dist/services/container.d.ts +194 -6
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +386 -11
- package/dist/services/container.js.map +1 -1
- package/dist/services/diagnostics.d.ts +57 -0
- package/dist/services/diagnostics.d.ts.map +1 -0
- package/dist/services/diagnostics.js +271 -0
- package/dist/services/diagnostics.js.map +1 -0
- package/dist/services/docker/container-service.d.ts +123 -0
- package/dist/services/docker/container-service.d.ts.map +1 -0
- package/dist/services/docker/container-service.js +347 -0
- package/dist/services/docker/container-service.js.map +1 -0
- package/dist/services/docker/image-service.d.ts +82 -0
- package/dist/services/docker/image-service.d.ts.map +1 -0
- package/dist/services/docker/image-service.js +193 -0
- package/dist/services/docker/image-service.js.map +1 -0
- package/dist/services/docker/index.d.ts +80 -0
- package/dist/services/docker/index.d.ts.map +1 -0
- package/dist/services/docker/index.js +103 -0
- package/dist/services/docker/index.js.map +1 -0
- package/dist/services/docker/network-service.d.ts +22 -0
- package/dist/services/docker/network-service.d.ts.map +1 -0
- package/dist/services/docker/network-service.js +43 -0
- package/dist/services/docker/network-service.js.map +1 -0
- package/dist/services/docker/system-service.d.ts +49 -0
- package/dist/services/docker/system-service.d.ts.map +1 -0
- package/dist/services/docker/system-service.js +215 -0
- package/dist/services/docker/system-service.js.map +1 -0
- package/dist/services/docker/utils/client-factory.d.ts +56 -0
- package/dist/services/docker/utils/client-factory.d.ts.map +1 -0
- package/dist/services/docker/utils/client-factory.js +139 -0
- package/dist/services/docker/utils/client-factory.js.map +1 -0
- package/dist/services/docker/utils/client-manager.d.ts +88 -0
- package/dist/services/docker/utils/client-manager.d.ts.map +1 -0
- package/dist/services/docker/utils/client-manager.js +124 -0
- package/dist/services/docker/utils/client-manager.js.map +1 -0
- package/dist/services/docker/utils/exec-handler.d.ts +94 -0
- package/dist/services/docker/utils/exec-handler.d.ts.map +1 -0
- package/dist/services/docker/utils/exec-handler.js +197 -0
- package/dist/services/docker/utils/exec-handler.js.map +1 -0
- package/dist/services/docker/utils/formatters.d.ts +13 -0
- package/dist/services/docker/utils/formatters.d.ts.map +1 -0
- package/dist/services/docker/utils/formatters.js +33 -0
- package/dist/services/docker/utils/formatters.js.map +1 -0
- package/dist/services/docker/utils/log-parser.d.ts +10 -0
- package/dist/services/docker/utils/log-parser.d.ts.map +1 -0
- package/dist/services/docker/utils/log-parser.js +48 -0
- package/dist/services/docker/utils/log-parser.js.map +1 -0
- package/dist/services/docker/utils/stats-calculator.d.ts +68 -0
- package/dist/services/docker/utils/stats-calculator.d.ts.map +1 -0
- package/dist/services/docker/utils/stats-calculator.js +61 -0
- package/dist/services/docker/utils/stats-calculator.js.map +1 -0
- package/dist/services/docker/volume-service.d.ts +22 -0
- package/dist/services/docker/volume-service.d.ts.map +1 -0
- package/dist/services/docker/volume-service.js +48 -0
- package/dist/services/docker/volume-service.js.map +1 -0
- package/dist/services/docker-interfaces.d.ts +283 -0
- package/dist/services/docker-interfaces.d.ts.map +1 -0
- package/dist/services/docker-interfaces.js +13 -0
- package/dist/services/docker-interfaces.js.map +1 -0
- package/dist/services/docker.d.ts +42 -5
- package/dist/services/docker.d.ts.map +1 -1
- package/dist/services/docker.js +335 -127
- package/dist/services/docker.js.map +1 -1
- package/dist/services/file-service.d.ts +6 -2
- package/dist/services/file-service.d.ts.map +1 -1
- package/dist/services/file-service.js +156 -52
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/host-config-repository.d.ts +133 -0
- package/dist/services/host-config-repository.d.ts.map +1 -0
- package/dist/services/host-config-repository.js +323 -0
- package/dist/services/host-config-repository.js.map +1 -0
- package/dist/services/host-resolver.d.ts +49 -0
- package/dist/services/host-resolver.d.ts.map +1 -0
- package/dist/services/host-resolver.js +176 -0
- package/dist/services/host-resolver.js.map +1 -0
- package/dist/services/interfaces.d.ts +61 -194
- package/dist/services/interfaces.d.ts.map +1 -1
- package/dist/services/local-executor.d.ts +31 -0
- package/dist/services/local-executor.d.ts.map +1 -0
- package/dist/services/local-executor.js +71 -0
- package/dist/services/local-executor.js.map +1 -0
- package/dist/services/ssh-config-loader.d.ts +35 -0
- package/dist/services/ssh-config-loader.d.ts.map +1 -0
- package/dist/services/ssh-config-loader.js +218 -0
- package/dist/services/ssh-config-loader.js.map +1 -0
- package/dist/services/ssh-pool.d.ts +26 -1
- package/dist/services/ssh-pool.d.ts.map +1 -1
- package/dist/services/ssh-pool.js +166 -25
- package/dist/services/ssh-pool.js.map +1 -1
- package/dist/services/ssh-service.d.ts +3 -0
- package/dist/services/ssh-service.d.ts.map +1 -1
- package/dist/services/ssh-service.js +53 -31
- package/dist/services/ssh-service.js.map +1 -1
- package/dist/services/ssh.d.ts +2 -6
- package/dist/services/ssh.d.ts.map +1 -1
- package/dist/services/ssh.js +9 -40
- package/dist/services/ssh.js.map +1 -1
- package/dist/tools/definitions/flux.d.ts +13 -0
- package/dist/tools/definitions/flux.d.ts.map +1 -0
- package/dist/tools/definitions/flux.js +101 -0
- package/dist/tools/definitions/flux.js.map +1 -0
- package/dist/tools/definitions/index.d.ts +8 -0
- package/dist/tools/definitions/index.d.ts.map +1 -0
- package/dist/tools/definitions/index.js +8 -0
- package/dist/tools/definitions/index.js.map +1 -0
- package/dist/tools/definitions/scout.d.ts +13 -0
- package/dist/tools/definitions/scout.d.ts.map +1 -0
- package/dist/tools/definitions/scout.js +78 -0
- package/dist/tools/definitions/scout.js.map +1 -0
- package/dist/tools/flux.d.ts +16 -8
- package/dist/tools/flux.d.ts.map +1 -1
- package/dist/tools/flux.js +27 -66
- package/dist/tools/flux.js.map +1 -1
- package/dist/tools/handlers/base-handler.d.ts +172 -0
- package/dist/tools/handlers/base-handler.d.ts.map +1 -0
- package/dist/tools/handlers/base-handler.js +234 -0
- package/dist/tools/handlers/base-handler.js.map +1 -0
- package/dist/tools/handlers/compose-handlers.d.ts +108 -0
- package/dist/tools/handlers/compose-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/compose-handlers.js +293 -0
- package/dist/tools/handlers/compose-handlers.js.map +1 -0
- package/dist/tools/handlers/compose-utils.d.ts +35 -0
- package/dist/tools/handlers/compose-utils.d.ts.map +1 -0
- package/dist/tools/handlers/compose-utils.js +76 -0
- package/dist/tools/handlers/compose-utils.js.map +1 -0
- package/dist/tools/handlers/compose.d.ts +23 -0
- package/dist/tools/handlers/compose.d.ts.map +1 -0
- package/dist/tools/handlers/compose.js +125 -0
- package/dist/tools/handlers/compose.js.map +1 -0
- package/dist/tools/handlers/container.d.ts +23 -0
- package/dist/tools/handlers/container.d.ts.map +1 -0
- package/dist/tools/handlers/container.js +333 -0
- package/dist/tools/handlers/container.js.map +1 -0
- package/dist/tools/handlers/docker.d.ts +24 -0
- package/dist/tools/handlers/docker.d.ts.map +1 -0
- package/dist/tools/handlers/docker.js +155 -0
- package/dist/tools/handlers/docker.js.map +1 -0
- package/dist/tools/handlers/host.d.ts +23 -0
- package/dist/tools/handlers/host.d.ts.map +1 -0
- package/dist/tools/handlers/host.js +196 -0
- package/dist/tools/handlers/host.js.map +1 -0
- package/dist/tools/handlers/scout-logs.d.ts +24 -0
- package/dist/tools/handlers/scout-logs.d.ts.map +1 -0
- package/dist/tools/handlers/scout-logs.js +119 -0
- package/dist/tools/handlers/scout-logs.js.map +1 -0
- package/dist/tools/handlers/scout-simple.d.ts +23 -0
- package/dist/tools/handlers/scout-simple.d.ts.map +1 -0
- package/dist/tools/handlers/scout-simple.js +286 -0
- package/dist/tools/handlers/scout-simple.js.map +1 -0
- package/dist/tools/handlers/scout-zfs.d.ts +23 -0
- package/dist/tools/handlers/scout-zfs.d.ts.map +1 -0
- package/dist/tools/handlers/scout-zfs.js +82 -0
- package/dist/tools/handlers/scout-zfs.js.map +1 -0
- package/dist/tools/index.d.ts +32 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +41 -35
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +135 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +151 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/scout.d.ts +16 -8
- package/dist/tools/scout.d.ts.map +1 -1
- package/dist/tools/scout.js +36 -78
- package/dist/tools/scout.js.map +1 -1
- package/dist/types.d.ts +629 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/command-security.d.ts +82 -0
- package/dist/utils/command-security.d.ts.map +1 -0
- package/dist/utils/command-security.js +122 -0
- package/dist/utils/command-security.js.map +1 -0
- package/dist/utils/error-sanitization.d.ts +77 -0
- package/dist/utils/error-sanitization.d.ts.map +1 -0
- package/dist/utils/error-sanitization.js +107 -0
- package/dist/utils/error-sanitization.js.map +1 -0
- package/dist/utils/errors.d.ts +30 -6
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +91 -12
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/help-handler.d.ts +23 -0
- package/dist/utils/help-handler.d.ts.map +1 -0
- package/dist/utils/help-handler.js +21 -0
- package/dist/utils/help-handler.js.map +1 -0
- package/dist/utils/help.d.ts +1 -1
- package/dist/utils/help.d.ts.map +1 -1
- package/dist/utils/help.js +57 -16
- package/dist/utils/help.js.map +1 -1
- package/dist/utils/host-utils.d.ts +31 -0
- package/dist/utils/host-utils.d.ts.map +1 -0
- package/dist/utils/host-utils.js +80 -0
- package/dist/utils/host-utils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/init-detection.d.ts +36 -0
- package/dist/utils/init-detection.d.ts.map +1 -0
- package/dist/utils/init-detection.js +79 -0
- package/dist/utils/init-detection.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pagination.d.ts +20 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +29 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/path-security.d.ts +132 -18
- package/dist/utils/path-security.d.ts.map +1 -1
- package/dist/utils/path-security.js +164 -35
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/sorting.d.ts +33 -0
- package/dist/utils/sorting.d.ts.map +1 -0
- package/dist/utils/sorting.js +57 -0
- package/dist/utils/sorting.js.map +1 -0
- package/dist/utils/text-filters.d.ts +13 -0
- package/dist/utils/text-filters.d.ts.map +1 -0
- package/dist/utils/text-filters.js +18 -0
- package/dist/utils/text-filters.js.map +1 -0
- package/dist/utils/time.d.ts +11 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +13 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/validation.d.ts +25 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +45 -19
- package/dist/schemas/discriminator.d.ts +0 -20
- package/dist/schemas/discriminator.d.ts.map +0 -1
- package/dist/schemas/discriminator.js +0 -25
- package/dist/schemas/discriminator.js.map +0 -1
- package/dist/schemas/unified.d.ts +0 -674
- package/dist/schemas/unified.d.ts.map +0 -1
- package/dist/schemas/unified.js +0 -453
- package/dist/schemas/unified.js.map +0 -1
- package/dist/tools/unified.d.ts +0 -7
- package/dist/tools/unified.d.ts.map +0 -1
- package/dist/tools/unified.js +0 -827
- 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"}
|