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,23 @@
|
|
|
1
|
+
import type { HostConfig } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Get config file search paths (in order of priority)
|
|
4
|
+
* Computed at runtime to support testing with env var changes
|
|
5
|
+
*/
|
|
6
|
+
export declare function getConfigPaths(): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Auto-add local Docker socket if it exists and isn't already configured
|
|
9
|
+
*/
|
|
10
|
+
export declare function ensureLocalSocket(hosts: HostConfig[]): HostConfig[];
|
|
11
|
+
/**
|
|
12
|
+
* Load host configurations from SSH config, config file, env var, or defaults
|
|
13
|
+
*
|
|
14
|
+
* Priority order:
|
|
15
|
+
* 1. Manual config file (synapse.config.json) - highest priority
|
|
16
|
+
* 2. SYNAPSE_HOSTS_CONFIG environment variable
|
|
17
|
+
* 3. SSH config auto-discovery (~/.ssh/config)
|
|
18
|
+
* 4. Local Docker socket (fallback)
|
|
19
|
+
*
|
|
20
|
+
* Manual hosts completely replace SSH config hosts with the same name.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadHostConfigs(): HostConfig[];
|
|
23
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO9C;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAOzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAkCnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAiE9C"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// src/services/config-loader.ts
|
|
2
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir, hostname } from "node:os";
|
|
5
|
+
import { loadFromSSHConfigSync, mergeHostConfigs } from "./ssh-config-loader.js";
|
|
6
|
+
import { logError } from "../utils/errors.js";
|
|
7
|
+
const DEFAULT_DOCKER_SOCKET = "/var/run/docker.sock";
|
|
8
|
+
const ENV_HOSTS_CONFIG = "SYNAPSE_HOSTS_CONFIG";
|
|
9
|
+
/**
|
|
10
|
+
* Get config file search paths (in order of priority)
|
|
11
|
+
* Computed at runtime to support testing with env var changes
|
|
12
|
+
*/
|
|
13
|
+
export function getConfigPaths() {
|
|
14
|
+
return [
|
|
15
|
+
process.env.SYNAPSE_CONFIG_FILE, // Explicit path
|
|
16
|
+
join(process.cwd(), "synapse.config.json"), // Current directory
|
|
17
|
+
join(homedir(), ".config", "synapse-mcp", "config.json"), // XDG style
|
|
18
|
+
join(homedir(), ".synapse-mcp.json") // Dotfile style
|
|
19
|
+
].filter(Boolean);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Auto-add local Docker socket if it exists and isn't already configured
|
|
23
|
+
*/
|
|
24
|
+
export function ensureLocalSocket(hosts) {
|
|
25
|
+
// Check if local socket exists
|
|
26
|
+
if (!existsSync(DEFAULT_DOCKER_SOCKET)) {
|
|
27
|
+
return hosts;
|
|
28
|
+
}
|
|
29
|
+
// Check if any host already uses the local socket
|
|
30
|
+
const hasLocalSocket = hosts.some((h) => h.dockerSocketPath === DEFAULT_DOCKER_SOCKET ||
|
|
31
|
+
h.host === DEFAULT_DOCKER_SOCKET ||
|
|
32
|
+
(h.host === "localhost" && h.dockerSocketPath));
|
|
33
|
+
if (hasLocalSocket) {
|
|
34
|
+
return hosts;
|
|
35
|
+
}
|
|
36
|
+
// Auto-add local socket entry
|
|
37
|
+
const localName = hostname()
|
|
38
|
+
.toLowerCase()
|
|
39
|
+
.replace(/[^a-z0-9-]/g, "-") || "local";
|
|
40
|
+
console.error(`Auto-adding local Docker socket as "${localName}"`);
|
|
41
|
+
return [
|
|
42
|
+
...hosts,
|
|
43
|
+
{
|
|
44
|
+
name: localName,
|
|
45
|
+
host: DEFAULT_DOCKER_SOCKET,
|
|
46
|
+
protocol: "http",
|
|
47
|
+
dockerSocketPath: DEFAULT_DOCKER_SOCKET
|
|
48
|
+
}
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load host configurations from SSH config, config file, env var, or defaults
|
|
53
|
+
*
|
|
54
|
+
* Priority order:
|
|
55
|
+
* 1. Manual config file (synapse.config.json) - highest priority
|
|
56
|
+
* 2. SYNAPSE_HOSTS_CONFIG environment variable
|
|
57
|
+
* 3. SSH config auto-discovery (~/.ssh/config)
|
|
58
|
+
* 4. Local Docker socket (fallback)
|
|
59
|
+
*
|
|
60
|
+
* Manual hosts completely replace SSH config hosts with the same name.
|
|
61
|
+
*/
|
|
62
|
+
export function loadHostConfigs() {
|
|
63
|
+
let manualHosts = [];
|
|
64
|
+
// 1. Try manual config file first
|
|
65
|
+
for (const configPath of getConfigPaths()) {
|
|
66
|
+
if (existsSync(configPath)) {
|
|
67
|
+
try {
|
|
68
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
69
|
+
const config = JSON.parse(raw);
|
|
70
|
+
const configHosts = config.hosts || config; // Support { hosts: [...] } or just [...]
|
|
71
|
+
if (Array.isArray(configHosts) && configHosts.length > 0) {
|
|
72
|
+
console.error(`Loaded ${configHosts.length} hosts from ${configPath}`);
|
|
73
|
+
manualHosts = configHosts;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logError(error, {
|
|
79
|
+
operation: "loadHostConfigs",
|
|
80
|
+
metadata: { configPath, source: "file" }
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 2. Fall back to env var if no config file
|
|
86
|
+
if (manualHosts.length === 0) {
|
|
87
|
+
const configJson = process.env[ENV_HOSTS_CONFIG];
|
|
88
|
+
if (configJson) {
|
|
89
|
+
try {
|
|
90
|
+
manualHosts = JSON.parse(configJson);
|
|
91
|
+
console.error(`Loaded ${manualHosts.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logError(error, {
|
|
95
|
+
operation: "loadHostConfigs",
|
|
96
|
+
metadata: { source: "SYNAPSE_HOSTS_CONFIG" }
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 3. Load SSH config hosts (auto-discovery)
|
|
102
|
+
const sshConfigPath = join(homedir(), ".ssh", "config");
|
|
103
|
+
const sshHosts = loadFromSSHConfigSync(sshConfigPath);
|
|
104
|
+
if (sshHosts.length > 0) {
|
|
105
|
+
console.error(`Auto-discovered ${sshHosts.length} hosts from SSH config`);
|
|
106
|
+
}
|
|
107
|
+
// 4. Merge hosts with manual taking precedence
|
|
108
|
+
const hosts = mergeHostConfigs(sshHosts, manualHosts);
|
|
109
|
+
// 5. If still no hosts, default to local socket only
|
|
110
|
+
if (hosts.length === 0) {
|
|
111
|
+
console.error("No config found, using local Docker socket");
|
|
112
|
+
return [
|
|
113
|
+
{
|
|
114
|
+
name: "local",
|
|
115
|
+
host: "localhost",
|
|
116
|
+
protocol: "http",
|
|
117
|
+
dockerSocketPath: DEFAULT_DOCKER_SOCKET
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
// 6. Auto-add local socket if exists and not configured
|
|
122
|
+
return ensureLocalSocket(hosts);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { HostConfig } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* ConfigService - Caches host configurations to avoid blocking I/O on every request
|
|
4
|
+
* PERF-C1: Eliminates 2-10ms sync file I/O per tool invocation
|
|
5
|
+
*/
|
|
6
|
+
export declare class ConfigService {
|
|
7
|
+
private configCache;
|
|
8
|
+
private cacheTime;
|
|
9
|
+
private configLoadLock;
|
|
10
|
+
private readonly CACHE_TTL;
|
|
11
|
+
/**
|
|
12
|
+
* Load host configurations with caching and async I/O
|
|
13
|
+
*
|
|
14
|
+
* Priority order:
|
|
15
|
+
* 1. Manual config file (synapse.config.json) - highest priority
|
|
16
|
+
* 2. SYNAPSE_HOSTS_CONFIG environment variable
|
|
17
|
+
* 3. SSH config auto-discovery (~/.ssh/config)
|
|
18
|
+
* 4. Local Docker socket (fallback)
|
|
19
|
+
*
|
|
20
|
+
* Manual hosts completely replace SSH config hosts with the same name.
|
|
21
|
+
*/
|
|
22
|
+
loadHostConfigs(): Promise<HostConfig[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Internal load implementation
|
|
25
|
+
*/
|
|
26
|
+
private _doLoad;
|
|
27
|
+
/**
|
|
28
|
+
* Invalidate cache (for testing or manual refresh)
|
|
29
|
+
*/
|
|
30
|
+
invalidateCache(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare const configService: ConfigService;
|
|
33
|
+
/**
|
|
34
|
+
* Legacy sync wrapper for backwards compatibility
|
|
35
|
+
* @deprecated Use configService.loadHostConfigs() instead for async caching
|
|
36
|
+
*/
|
|
37
|
+
export declare function loadHostConfigs(): HostConfig[];
|
|
38
|
+
//# sourceMappingURL=config-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../../src/services/config-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoD9C;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;;;;;;OAUG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAuB9C;;OAEG;YACW,OAAO;IAiErB;;OAEG;IACH,eAAe,IAAI,IAAI;CAIxB;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAyE9C"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { promises as fs } from "fs";
|
|
2
|
+
import { homedir, hostname } from "os";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { DEFAULT_DOCKER_SOCKET, ENV_HOSTS_CONFIG } from "../constants.js";
|
|
5
|
+
import { logError } from "../utils/errors.js";
|
|
6
|
+
import { loadFromSSHConfig, loadFromSSHConfigSync, mergeHostConfigs } from "./ssh-config-loader.js";
|
|
7
|
+
/**
|
|
8
|
+
* Get prioritized list of config file paths
|
|
9
|
+
*/
|
|
10
|
+
function getConfigPaths() {
|
|
11
|
+
const configName = "synapse.config.json";
|
|
12
|
+
const paths = [];
|
|
13
|
+
// 1. Explicit path from environment variable (highest priority)
|
|
14
|
+
if (process.env.SYNAPSE_CONFIG_FILE) {
|
|
15
|
+
paths.push(process.env.SYNAPSE_CONFIG_FILE);
|
|
16
|
+
}
|
|
17
|
+
// 2. Standard search paths
|
|
18
|
+
paths.push(join(process.cwd(), configName), join(homedir(), ".config", "synapse", configName), join(homedir(), `.${configName}`), join("/etc", "synapse", configName));
|
|
19
|
+
return paths;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ensure local Docker socket is included if available
|
|
23
|
+
*/
|
|
24
|
+
function ensureLocalSocket(hosts) {
|
|
25
|
+
const localName = `local-${hostname()}`;
|
|
26
|
+
// Check if local socket is already configured
|
|
27
|
+
const hasLocalSocket = hosts.some((h) => h.dockerSocketPath === DEFAULT_DOCKER_SOCKET);
|
|
28
|
+
if (hasLocalSocket) {
|
|
29
|
+
return hosts;
|
|
30
|
+
}
|
|
31
|
+
return [
|
|
32
|
+
...hosts,
|
|
33
|
+
{
|
|
34
|
+
name: localName,
|
|
35
|
+
host: DEFAULT_DOCKER_SOCKET,
|
|
36
|
+
protocol: "http",
|
|
37
|
+
dockerSocketPath: DEFAULT_DOCKER_SOCKET
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* ConfigService - Caches host configurations to avoid blocking I/O on every request
|
|
43
|
+
* PERF-C1: Eliminates 2-10ms sync file I/O per tool invocation
|
|
44
|
+
*/
|
|
45
|
+
export class ConfigService {
|
|
46
|
+
configCache = null;
|
|
47
|
+
cacheTime = 0;
|
|
48
|
+
configLoadLock = null;
|
|
49
|
+
CACHE_TTL = 60000; // 60s
|
|
50
|
+
/**
|
|
51
|
+
* Load host configurations with caching and async I/O
|
|
52
|
+
*
|
|
53
|
+
* Priority order:
|
|
54
|
+
* 1. Manual config file (synapse.config.json) - highest priority
|
|
55
|
+
* 2. SYNAPSE_HOSTS_CONFIG environment variable
|
|
56
|
+
* 3. SSH config auto-discovery (~/.ssh/config)
|
|
57
|
+
* 4. Local Docker socket (fallback)
|
|
58
|
+
*
|
|
59
|
+
* Manual hosts completely replace SSH config hosts with the same name.
|
|
60
|
+
*/
|
|
61
|
+
async loadHostConfigs() {
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
// Return cached config if still valid
|
|
64
|
+
if (this.configCache && now - this.cacheTime < this.CACHE_TTL) {
|
|
65
|
+
return this.configCache;
|
|
66
|
+
}
|
|
67
|
+
// Prevent concurrent loads with lock
|
|
68
|
+
if (this.configLoadLock) {
|
|
69
|
+
return this.configLoadLock;
|
|
70
|
+
}
|
|
71
|
+
this.configLoadLock = this._doLoad();
|
|
72
|
+
try {
|
|
73
|
+
this.configCache = await this.configLoadLock;
|
|
74
|
+
this.cacheTime = now;
|
|
75
|
+
return this.configCache;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
this.configLoadLock = null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Internal load implementation
|
|
83
|
+
*/
|
|
84
|
+
async _doLoad() {
|
|
85
|
+
let manualHosts = [];
|
|
86
|
+
// 1. Try manual config file first (async I/O)
|
|
87
|
+
for (const configPath of getConfigPaths()) {
|
|
88
|
+
try {
|
|
89
|
+
// Check file exists with async stat
|
|
90
|
+
await fs.access(configPath);
|
|
91
|
+
const raw = await fs.readFile(configPath, "utf-8");
|
|
92
|
+
const config = JSON.parse(raw);
|
|
93
|
+
const configHosts = config.hosts || config; // Support { hosts: [...] } or just [...]
|
|
94
|
+
if (Array.isArray(configHosts) && configHosts.length > 0) {
|
|
95
|
+
console.error(`Loaded ${configHosts.length} hosts from ${configPath}`);
|
|
96
|
+
manualHosts = configHosts;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// File doesn't exist or can't be read - try next path
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 2. Fall back to env var if no config file
|
|
106
|
+
if (manualHosts.length === 0) {
|
|
107
|
+
const configJson = process.env[ENV_HOSTS_CONFIG];
|
|
108
|
+
if (configJson) {
|
|
109
|
+
try {
|
|
110
|
+
manualHosts = JSON.parse(configJson);
|
|
111
|
+
console.error(`Loaded ${manualHosts.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
logError(error, {
|
|
115
|
+
operation: "loadHostConfigs",
|
|
116
|
+
metadata: { source: "SYNAPSE_HOSTS_CONFIG" }
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 3. Load SSH config hosts (auto-discovery) - already async
|
|
122
|
+
const sshConfigPath = join(homedir(), ".ssh", "config");
|
|
123
|
+
const sshHosts = await loadFromSSHConfig(sshConfigPath);
|
|
124
|
+
if (sshHosts.length > 0) {
|
|
125
|
+
console.error(`Auto-discovered ${sshHosts.length} hosts from SSH config`);
|
|
126
|
+
}
|
|
127
|
+
// 4. Merge hosts with manual taking precedence
|
|
128
|
+
const hosts = mergeHostConfigs(sshHosts, manualHosts);
|
|
129
|
+
// 5. If still no hosts, default to local socket only
|
|
130
|
+
if (hosts.length === 0) {
|
|
131
|
+
console.error("No config found, using local Docker socket");
|
|
132
|
+
return [
|
|
133
|
+
{
|
|
134
|
+
name: "local",
|
|
135
|
+
host: "localhost",
|
|
136
|
+
protocol: "http",
|
|
137
|
+
dockerSocketPath: DEFAULT_DOCKER_SOCKET
|
|
138
|
+
}
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
// 6. Auto-add local socket if exists and not configured
|
|
142
|
+
return ensureLocalSocket(hosts);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Invalidate cache (for testing or manual refresh)
|
|
146
|
+
*/
|
|
147
|
+
invalidateCache() {
|
|
148
|
+
this.configCache = null;
|
|
149
|
+
this.cacheTime = 0;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Global singleton instance for service-wide caching
|
|
153
|
+
export const configService = new ConfigService();
|
|
154
|
+
/**
|
|
155
|
+
* Legacy sync wrapper for backwards compatibility
|
|
156
|
+
* @deprecated Use configService.loadHostConfigs() instead for async caching
|
|
157
|
+
*/
|
|
158
|
+
export function loadHostConfigs() {
|
|
159
|
+
// This is a fallback for sync callers - it will block but at least cache works
|
|
160
|
+
// We need to use the sync version of the old code temporarily
|
|
161
|
+
console.warn("WARNING: Using deprecated sync loadHostConfigs() - migrate to async configService.loadHostConfigs()");
|
|
162
|
+
let manualHosts = [];
|
|
163
|
+
// 1. Try manual config file first
|
|
164
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
165
|
+
const { readFileSync, existsSync } = require("fs");
|
|
166
|
+
for (const configPath of getConfigPaths()) {
|
|
167
|
+
if (existsSync(configPath)) {
|
|
168
|
+
try {
|
|
169
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
170
|
+
const config = JSON.parse(raw);
|
|
171
|
+
const configHosts = config.hosts || config;
|
|
172
|
+
if (Array.isArray(configHosts) && configHosts.length > 0) {
|
|
173
|
+
console.error(`Loaded ${configHosts.length} hosts from ${configPath}`);
|
|
174
|
+
manualHosts = configHosts;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
logError(error, {
|
|
180
|
+
operation: "loadHostConfigs",
|
|
181
|
+
metadata: { configPath, source: "file" }
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// 2. Fall back to env var if no config file
|
|
187
|
+
if (manualHosts.length === 0) {
|
|
188
|
+
const configJson = process.env[ENV_HOSTS_CONFIG];
|
|
189
|
+
if (configJson) {
|
|
190
|
+
try {
|
|
191
|
+
manualHosts = JSON.parse(configJson);
|
|
192
|
+
console.error(`Loaded ${manualHosts.length} hosts from SYNAPSE_HOSTS_CONFIG env`);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
logError(error, {
|
|
196
|
+
operation: "loadHostConfigs",
|
|
197
|
+
metadata: { source: "SYNAPSE_HOSTS_CONFIG" }
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// 3. Load SSH config hosts (auto-discovery) - use sync for backwards compat
|
|
203
|
+
const sshConfigPath = join(homedir(), ".ssh", "config");
|
|
204
|
+
const sshHosts = loadFromSSHConfigSync(sshConfigPath);
|
|
205
|
+
if (sshHosts.length > 0) {
|
|
206
|
+
console.error(`Auto-discovered ${sshHosts.length} hosts from SSH config`);
|
|
207
|
+
}
|
|
208
|
+
// 4. Merge hosts with manual taking precedence
|
|
209
|
+
const hosts = mergeHostConfigs(sshHosts, manualHosts);
|
|
210
|
+
// 5. If still no hosts, default to local socket only
|
|
211
|
+
if (hosts.length === 0) {
|
|
212
|
+
console.error("No config found, using local Docker socket");
|
|
213
|
+
return [
|
|
214
|
+
{
|
|
215
|
+
name: "local",
|
|
216
|
+
host: "localhost",
|
|
217
|
+
protocol: "http",
|
|
218
|
+
dockerSocketPath: DEFAULT_DOCKER_SOCKET
|
|
219
|
+
}
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
// 6. Auto-add local socket if exists and not configured
|
|
223
|
+
return ensureLocalSocket(hosts);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=config-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-service.js","sourceRoot":"","sources":["../../src/services/config-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEpG;;GAEG;AACH,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,qBAAqB,CAAC;IACzC,MAAM,KAAK,GAAG,EAAE,CAAC;IAEjB,gEAAgE;IAChE,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,EAC/B,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EACjD,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,EACjC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CACpC,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,MAAM,SAAS,GAAG,SAAS,QAAQ,EAAE,EAAE,CAAC;IAExC,8CAA8C;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,qBAAqB,CAAC,CAAC;IAEvF,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE,MAAe;YACzB,gBAAgB,EAAE,qBAAqB;SACxC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,WAAW,GAAwB,IAAI,CAAC;IACxC,SAAS,GAAG,CAAC,CAAC;IACd,cAAc,GAAiC,IAAI,CAAC;IAC3C,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM;IAE1C;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,sCAAsC;QACtC,IAAI,IAAI,CAAC,WAAW,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,WAAW,GAAiB,EAAE,CAAC;QAEnC,8CAA8C;QAC9C,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,oCAAoC;gBACpC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,yCAAyC;gBACrF,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzD,OAAO,CAAC,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,eAAe,UAAU,EAAE,CAAC,CAAC;oBACvE,WAAW,GAAG,WAA2B,CAAC;oBAC1C,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;gBACtD,SAAS;YACX,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAiB,CAAC;oBACrD,OAAO,CAAC,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,sCAAsC,CAAC,CAAC;gBACpF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAK,EAAE;wBACd,SAAS,EAAE,iBAAiB;wBAC5B,QAAQ,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE;qBAC7C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,wBAAwB,CAAC,CAAC;QAC5E,CAAC;QAED,+CAA+C;QAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEtD,qDAAqD;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO;gBACL;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,MAAM;oBAChB,gBAAgB,EAAE,qBAAqB;iBACxC;aACF,CAAC;QACJ,CAAC;QAED,wDAAwD;QACxD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;CACF;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,+EAA+E;IAC/E,8DAA8D;IAC9D,OAAO,CAAC,IAAI,CACV,qGAAqG,CACtG,CAAC;IAEF,IAAI,WAAW,GAAiB,EAAE,CAAC;IAEnC,kCAAkC;IAClC,iEAAiE;IACjE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC;gBAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzD,OAAO,CAAC,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,eAAe,UAAU,EAAE,CAAC,CAAC;oBACvE,WAAW,GAAG,WAA2B,CAAC;oBAC1C,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,KAAK,EAAE;oBACd,SAAS,EAAE,iBAAiB;oBAC5B,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;iBACzC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAiB,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,sCAAsC,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,KAAK,EAAE;oBACd,SAAS,EAAE,iBAAiB;oBAC5B,QAAQ,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE;iBAC7C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,wBAAwB,CAAC,CAAC;IAC5E,CAAC;IAED,+CAA+C;IAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEtD,qDAAqD;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,gBAAgB,EAAE,qBAAqB;aACxC;SACF,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { DockerRawContainerInfo, HostConfig } from "../types.js";
|
|
2
|
+
import type { IDockerClientProvider } from "./interfaces.js";
|
|
3
|
+
/**
|
|
4
|
+
* Container to host mapping entry with multiple index keys.
|
|
5
|
+
* Supports lookup by full ID, short ID (12 chars), and container name.
|
|
6
|
+
*
|
|
7
|
+
* @internal This is an internal cache structure; external callers should use findContainerHost()
|
|
8
|
+
*/
|
|
9
|
+
export interface ContainerHostMapping {
|
|
10
|
+
containerId: string;
|
|
11
|
+
shortId: string;
|
|
12
|
+
containerName: string;
|
|
13
|
+
hostName: string;
|
|
14
|
+
host: HostConfig;
|
|
15
|
+
container: DockerRawContainerInfo;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Cache for container-to-host mappings.
|
|
20
|
+
* Optimizes findContainerHost() by eliminating N+1 queries.
|
|
21
|
+
*
|
|
22
|
+
* Key features:
|
|
23
|
+
* - Parallel host scanning with configurable concurrency
|
|
24
|
+
* - Multiple index keys per container (ID, name, ID prefix)
|
|
25
|
+
* - TTL-based expiration (default: 5 minutes)
|
|
26
|
+
* - Automatic cache rebuild on miss
|
|
27
|
+
* - LRU eviction policy
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const cache = new ContainerHostMapCache();
|
|
32
|
+
* await cache.buildMapping(hosts, dockerService);
|
|
33
|
+
*
|
|
34
|
+
* const result = await cache.findContainerHost("my-container", hosts, dockerService);
|
|
35
|
+
* // Returns { host, container } immediately without scanning all hosts
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare class ContainerHostMapCache {
|
|
39
|
+
private cache;
|
|
40
|
+
private concurrency;
|
|
41
|
+
/**
|
|
42
|
+
* Create a new container-to-host mapping cache.
|
|
43
|
+
*
|
|
44
|
+
* @param ttlMs - Time-to-live for cache entries in milliseconds (default: 5 minutes)
|
|
45
|
+
* @param maxSize - Maximum number of cache entries (default: 500)
|
|
46
|
+
* @param concurrency - Number of parallel host scans (default from constants)
|
|
47
|
+
*/
|
|
48
|
+
constructor(ttlMs?: number, maxSize?: number, concurrency?: number);
|
|
49
|
+
/**
|
|
50
|
+
* Build container-to-host mapping for all hosts in parallel.
|
|
51
|
+
* Uses concurrency control to avoid overwhelming the network.
|
|
52
|
+
*
|
|
53
|
+
* @param hosts - List of hosts to scan
|
|
54
|
+
* @param dockerService - Docker service to query containers
|
|
55
|
+
* @returns Promise that resolves when mapping is complete
|
|
56
|
+
*/
|
|
57
|
+
buildMapping(hosts: HostConfig[], dockerService: IDockerClientProvider): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Scan a single host and cache its containers.
|
|
60
|
+
* Returns true if the target container was found on this host.
|
|
61
|
+
*
|
|
62
|
+
* @param host - Host to scan
|
|
63
|
+
* @param dockerService - Docker service to query containers
|
|
64
|
+
* @param targetContainerId - Optional container ID/name to search for
|
|
65
|
+
* @returns Whether the target container was found on this host
|
|
66
|
+
*/
|
|
67
|
+
private scanSingleHost;
|
|
68
|
+
/**
|
|
69
|
+
* Find which host a container is on, using cache with fallback.
|
|
70
|
+
* Supports full ID, short ID, or container name lookups.
|
|
71
|
+
*
|
|
72
|
+
* On cache miss, scans hosts incrementally (one at a time) instead of
|
|
73
|
+
* rebuilding the entire mapping. Stops as soon as the container is found,
|
|
74
|
+
* avoiding unnecessary network calls to remaining hosts.
|
|
75
|
+
*
|
|
76
|
+
* @param containerId - Container ID (full/short) or name
|
|
77
|
+
* @param hosts - Array of host configurations to search
|
|
78
|
+
* @param dockerService - Docker service for fallback queries
|
|
79
|
+
* @returns Host config and container info if found, null otherwise
|
|
80
|
+
*/
|
|
81
|
+
findContainerHost(containerId: string, hosts: HostConfig[], dockerService: IDockerClientProvider): Promise<{
|
|
82
|
+
host: HostConfig;
|
|
83
|
+
container: DockerRawContainerInfo;
|
|
84
|
+
} | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Invalidate entire cache after container lifecycle changes.
|
|
87
|
+
* Call this after container state changes (start, stop, pause, resume, remove, create).
|
|
88
|
+
*
|
|
89
|
+
* Note: Clears the ENTIRE cache for all hosts. This is simpler than selective
|
|
90
|
+
* per-host invalidation and the cache will rebuild automatically on next query.
|
|
91
|
+
* For production use with many hosts, consider implementing per-host invalidation.
|
|
92
|
+
*/
|
|
93
|
+
invalidateCache(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Warm cache by pre-populating with all containers on startup.
|
|
96
|
+
* Reduces initial query latency.
|
|
97
|
+
*
|
|
98
|
+
* @param hosts - Array of host configurations
|
|
99
|
+
* @param dockerService - Docker service for API calls
|
|
100
|
+
*/
|
|
101
|
+
warmCache(hosts: HostConfig[], dockerService: IDockerClientProvider): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Get cache statistics for monitoring and debugging.
|
|
104
|
+
* Returns metrics on hits, misses, size, and evictions.
|
|
105
|
+
*
|
|
106
|
+
* @returns Cache statistics object
|
|
107
|
+
*/
|
|
108
|
+
getStats(): {
|
|
109
|
+
hits: number;
|
|
110
|
+
misses: number;
|
|
111
|
+
size: number;
|
|
112
|
+
maxSize: number;
|
|
113
|
+
evictions: number;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Log cache statistics to console.error for observability.
|
|
117
|
+
* Outputs formatted stats with hit rate calculation.
|
|
118
|
+
*/
|
|
119
|
+
logStats(): void;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=container-host-map-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-host-map-cache.d.ts","sourceRoot":"","sources":["../../src/services/container-host-map-cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,sBAAsB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;;OAMG;gBAED,KAAK,GAAE,MAAsB,EAC7B,OAAO,GAAE,MAAY,EACrB,WAAW,GAAE,MAA0C;IAMzD;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5F;;;;;;;;OAQG;YACW,cAAc;IA8C5B;;;;;;;;;;;;OAYG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,aAAa,EAAE,qBAAqB,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,sBAAsB,CAAA;KAAE,GAAG,IAAI,CAAC;IA6B1E;;;;;;;OAOG;IACH,eAAe,IAAI,IAAI;IAWvB;;;;;;OAMG;IACG,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzF;;;;;OAKG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAI9F;;;OAGG;IACH,QAAQ,IAAI,IAAI;CAYjB"}
|