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