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
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
import { SSHCommandError } from "../utils/errors.js";
|
|
2
|
+
import { escapeShellArg } from "../utils/path-security.js";
|
|
3
|
+
/**
|
|
4
|
+
* Hardcoded shell script for collecting host resource information.
|
|
5
|
+
*
|
|
6
|
+
* Security (S-H4): This multi-command script is SAFE because it is fully hardcoded
|
|
7
|
+
* with no user input. The script pattern (joining with semicolons) is only safe
|
|
8
|
+
* for hardcoded commands.
|
|
9
|
+
*
|
|
10
|
+
* WARNING: Do NOT copy this pattern for user-influenced commands. User input
|
|
11
|
+
* must be validated and escaped per command using escapeShellArg().
|
|
12
|
+
*
|
|
13
|
+
* @see https://cwe.mitre.org/data/definitions/78.html
|
|
14
|
+
*/
|
|
15
|
+
const HOST_RESOURCES_SCRIPT = `
|
|
16
|
+
hostname
|
|
17
|
+
echo "---"
|
|
18
|
+
uptime -p 2>/dev/null || uptime | sed 's/.*up/up/'
|
|
19
|
+
echo "---"
|
|
20
|
+
cat /proc/loadavg | awk '{print $1,$2,$3}'
|
|
21
|
+
echo "---"
|
|
22
|
+
nproc
|
|
23
|
+
echo "---"
|
|
24
|
+
top -bn1 | grep "Cpu(s)" | awk '{print 100-$8}' 2>/dev/null || echo "0"
|
|
25
|
+
echo "---"
|
|
26
|
+
free -m | awk '/^Mem:/ {print $2,$3,$4}'
|
|
27
|
+
echo "---"
|
|
28
|
+
df -BG --output=source,target,size,used,avail,pcent 2>/dev/null | grep -E '^/dev' || df -h | grep -E '^/dev'
|
|
29
|
+
`
|
|
30
|
+
.trim()
|
|
31
|
+
.replace(/\n/g, "; ");
|
|
2
32
|
/**
|
|
3
33
|
* SSH service implementation using connection pool for command execution.
|
|
4
34
|
* Provides secure command execution and resource monitoring via SSH connections.
|
|
@@ -25,12 +55,13 @@ export class SSHService {
|
|
|
25
55
|
const timeoutMs = options.timeoutMs || 30000;
|
|
26
56
|
// Get connection from pool
|
|
27
57
|
const connection = await this.pool.getConnection(host);
|
|
28
|
-
// Build full command
|
|
29
|
-
const fullCommand = args.length > 0 ? `${command} ${args.join(" ")}` : command;
|
|
58
|
+
// Build full command with escaped arguments to prevent shell injection
|
|
59
|
+
const fullCommand = args.length > 0 ? `${command} ${args.map((a) => escapeShellArg(a)).join(" ")}` : command;
|
|
60
|
+
let timeoutId = null;
|
|
30
61
|
try {
|
|
31
62
|
// Execute with timeout
|
|
32
63
|
const timeoutPromise = new Promise((_, reject) => {
|
|
33
|
-
setTimeout(() => {
|
|
64
|
+
timeoutId = setTimeout(() => {
|
|
34
65
|
reject(new Error(`SSH command timeout after ${timeoutMs}ms: ${command}`));
|
|
35
66
|
}, timeoutMs);
|
|
36
67
|
});
|
|
@@ -53,6 +84,10 @@ export class SSHService {
|
|
|
53
84
|
throw new SSHCommandError("SSH command execution failed", host.name, fullCommand, undefined, undefined, undefined, error);
|
|
54
85
|
}
|
|
55
86
|
finally {
|
|
87
|
+
// Clear timeout to prevent resource leak
|
|
88
|
+
if (timeoutId !== null) {
|
|
89
|
+
clearTimeout(timeoutId);
|
|
90
|
+
}
|
|
56
91
|
// Always release connection back to pool
|
|
57
92
|
await this.pool.releaseConnection(host, connection);
|
|
58
93
|
}
|
|
@@ -60,29 +95,16 @@ export class SSHService {
|
|
|
60
95
|
/**
|
|
61
96
|
* Get host resource usage via SSH using connection pool
|
|
62
97
|
*
|
|
98
|
+
* Security (S-H4): Uses hardcoded HOST_RESOURCES_SCRIPT constant for safety.
|
|
99
|
+
* See constant definition for security documentation.
|
|
100
|
+
*
|
|
63
101
|
* @param host - Host configuration to query
|
|
64
102
|
* @returns Resource information including CPU, memory, disk, and uptime
|
|
65
103
|
*/
|
|
66
104
|
async getHostResources(host) {
|
|
67
105
|
// Run all commands in one SSH session for efficiency
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
echo "---"
|
|
71
|
-
uptime -p 2>/dev/null || uptime | sed 's/.*up/up/'
|
|
72
|
-
echo "---"
|
|
73
|
-
cat /proc/loadavg | awk '{print $1,$2,$3}'
|
|
74
|
-
echo "---"
|
|
75
|
-
nproc
|
|
76
|
-
echo "---"
|
|
77
|
-
top -bn1 | grep "Cpu(s)" | awk '{print 100-$8}' 2>/dev/null || echo "0"
|
|
78
|
-
echo "---"
|
|
79
|
-
free -m | awk '/^Mem:/ {print $2,$3,$4}'
|
|
80
|
-
echo "---"
|
|
81
|
-
df -BG --output=source,target,size,used,avail,pcent 2>/dev/null | grep -E '^/dev' || df -h | grep -E '^/dev'
|
|
82
|
-
`
|
|
83
|
-
.trim()
|
|
84
|
-
.replace(/\n/g, "; ");
|
|
85
|
-
const output = await this.executeSSHCommand(host, script);
|
|
106
|
+
// SECURITY (S-H4): Script is hardcoded constant - safe for semicolon joining
|
|
107
|
+
const output = await this.executeSSHCommand(host, HOST_RESOURCES_SCRIPT);
|
|
86
108
|
const sections = output.split("---").map((s) => s.trim());
|
|
87
109
|
// Parse hostname
|
|
88
110
|
const hostname = sections[0] || host.name;
|
|
@@ -93,11 +115,11 @@ export class SSHService {
|
|
|
93
115
|
const loadAverage = [
|
|
94
116
|
loadParts[0] || 0,
|
|
95
117
|
loadParts[1] || 0,
|
|
96
|
-
loadParts[2] || 0
|
|
118
|
+
loadParts[2] || 0,
|
|
97
119
|
];
|
|
98
120
|
// Parse CPU
|
|
99
|
-
const cores = parseInt(sections[3] || "1", 10);
|
|
100
|
-
const cpuUsage = parseFloat(sections[4] || "0");
|
|
121
|
+
const cores = Number.parseInt(sections[3] || "1", 10);
|
|
122
|
+
const cpuUsage = Number.parseFloat(sections[4] || "0");
|
|
101
123
|
// Parse memory
|
|
102
124
|
const memParts = (sections[5] || "0 0 0").split(" ").map(Number);
|
|
103
125
|
const totalMB = memParts[0] || 0;
|
|
@@ -113,10 +135,10 @@ export class SSHService {
|
|
|
113
135
|
return {
|
|
114
136
|
filesystem: parts[0],
|
|
115
137
|
mount: parts[1],
|
|
116
|
-
totalGB: parseFloat(parts[2].replace("G", "")) || 0,
|
|
117
|
-
usedGB: parseFloat(parts[3].replace("G", "")) || 0,
|
|
118
|
-
availGB: parseFloat(parts[4].replace("G", "")) || 0,
|
|
119
|
-
usagePercent: parseFloat(parts[5].replace("%", "")) || 0
|
|
138
|
+
totalGB: Number.parseFloat(parts[2].replace("G", "")) || 0,
|
|
139
|
+
usedGB: Number.parseFloat(parts[3].replace("G", "")) || 0,
|
|
140
|
+
availGB: Number.parseFloat(parts[4].replace("G", "")) || 0,
|
|
141
|
+
usagePercent: Number.parseFloat(parts[5].replace("%", "")) || 0,
|
|
120
142
|
};
|
|
121
143
|
}
|
|
122
144
|
return null;
|
|
@@ -128,15 +150,15 @@ export class SSHService {
|
|
|
128
150
|
loadAverage,
|
|
129
151
|
cpu: {
|
|
130
152
|
cores,
|
|
131
|
-
usagePercent: Math.round(cpuUsage * 10) / 10
|
|
153
|
+
usagePercent: Math.round(cpuUsage * 10) / 10,
|
|
132
154
|
},
|
|
133
155
|
memory: {
|
|
134
156
|
totalMB,
|
|
135
157
|
usedMB,
|
|
136
158
|
freeMB,
|
|
137
|
-
usagePercent: Math.round(memUsagePercent * 10) / 10
|
|
159
|
+
usagePercent: Math.round(memUsagePercent * 10) / 10,
|
|
138
160
|
},
|
|
139
|
-
disk
|
|
161
|
+
disk,
|
|
140
162
|
};
|
|
141
163
|
}
|
|
142
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-service.js","sourceRoot":"","sources":["../../src/services/ssh-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ssh-service.js","sourceRoot":"","sources":["../../src/services/ssh-service.ts"],"names":[],"mappings":"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"}
|
package/dist/services/ssh.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { HostConfig } from "../types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Sanitize string for safe shell usage
|
|
4
|
-
* Rejects any potentially dangerous characters
|
|
5
|
-
*/
|
|
6
|
-
export declare function sanitizeForShell(input: string): string;
|
|
1
|
+
import type { HostConfig } from "../types.js";
|
|
7
2
|
/**
|
|
8
3
|
* Validate host configuration for SSH
|
|
4
|
+
* SECURITY: Validates host before shell interpolation to prevent command injection
|
|
9
5
|
*/
|
|
10
6
|
export declare function validateHostForSsh(host: HostConfig): void;
|
|
11
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/services/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/services/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAazD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,KAAK,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ"}
|
package/dist/services/ssh.js
CHANGED
|
@@ -1,50 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
/**
|
|
4
|
-
* Temporary global SSH service for backward compatibility
|
|
5
|
-
* @deprecated Use ServiceContainer.getSSHService() instead
|
|
6
|
-
*/
|
|
7
|
-
let globalSSHService = null;
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
9
|
-
function getGlobalSSHService() {
|
|
10
|
-
if (!globalSSHService) {
|
|
11
|
-
const pool = new SSHConnectionPoolImpl({
|
|
12
|
-
maxConnections: parseInt(process.env.HOMELAB_SSH_MAX_CONNECTIONS || "5", 10),
|
|
13
|
-
idleTimeoutMs: parseInt(process.env.HOMELAB_SSH_IDLE_TIMEOUT_MS || "60000", 10),
|
|
14
|
-
connectionTimeoutMs: parseInt(process.env.HOMELAB_SSH_CONNECTION_TIMEOUT_MS || "5000", 10),
|
|
15
|
-
enableHealthChecks: process.env.HOMELAB_SSH_ENABLE_HEALTH_CHECKS !== "false",
|
|
16
|
-
healthCheckIntervalMs: parseInt(process.env.HOMELAB_SSH_HEALTH_CHECK_INTERVAL_MS || "30000", 10)
|
|
17
|
-
});
|
|
18
|
-
globalSSHService = new SSHService(pool);
|
|
19
|
-
}
|
|
20
|
-
return globalSSHService;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Sanitize string for safe shell usage
|
|
24
|
-
* Rejects any potentially dangerous characters
|
|
25
|
-
*/
|
|
26
|
-
export function sanitizeForShell(input) {
|
|
27
|
-
// Only allow alphanumeric, dots, hyphens, underscores, and forward slashes (for paths)
|
|
28
|
-
if (!/^[a-zA-Z0-9._\-/]+$/.test(input)) {
|
|
29
|
-
throw new Error(`Invalid characters in input: ${input}`);
|
|
30
|
-
}
|
|
31
|
-
return input;
|
|
32
|
-
}
|
|
1
|
+
import { validateHostname } from "../utils/path-security.js";
|
|
2
|
+
import { validateAlphanumeric } from "../utils/validation.js";
|
|
33
3
|
/**
|
|
34
4
|
* Validate host configuration for SSH
|
|
5
|
+
* SECURITY: Validates host before shell interpolation to prevent command injection
|
|
35
6
|
*/
|
|
36
7
|
export function validateHostForSsh(host) {
|
|
37
|
-
// Validate hostname
|
|
38
|
-
|
|
39
|
-
throw new Error(`Invalid host format: ${host.host}`);
|
|
40
|
-
}
|
|
8
|
+
// Validate hostname using centralized validation
|
|
9
|
+
validateHostname(host.host);
|
|
41
10
|
// Validate SSH user if provided
|
|
42
|
-
if (host.sshUser
|
|
43
|
-
|
|
11
|
+
if (host.sshUser) {
|
|
12
|
+
validateAlphanumeric(host.sshUser, "SSH user");
|
|
44
13
|
}
|
|
45
14
|
// Validate key path if provided
|
|
46
|
-
if (host.sshKeyPath
|
|
47
|
-
|
|
15
|
+
if (host.sshKeyPath) {
|
|
16
|
+
validateAlphanumeric(host.sshKeyPath, "SSH key path", { allowSlash: true, allowTilde: true });
|
|
48
17
|
}
|
|
49
18
|
}
|
|
50
19
|
//# sourceMappingURL=ssh.js.map
|
package/dist/services/ssh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/services/ssh.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/services/ssh.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,iDAAiD;IACjD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5B,gCAAgC;IAChC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flux tool definition
|
|
3
|
+
*
|
|
4
|
+
* Docker infrastructure management tool for containers, compose, images, and hosts.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolDefinition } from "../registry.js";
|
|
7
|
+
/**
|
|
8
|
+
* Flux tool - Docker infrastructure management
|
|
9
|
+
*
|
|
10
|
+
* Supports: container, compose, docker, and host operations
|
|
11
|
+
*/
|
|
12
|
+
export declare const FluxTool: ToolDefinition;
|
|
13
|
+
//# sourceMappingURL=flux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flux.d.ts","sourceRoot":"","sources":["../../../src/tools/definitions/flux.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,cAuFtB,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flux tool definition
|
|
3
|
+
*
|
|
4
|
+
* Docker infrastructure management tool for containers, compose, images, and hosts.
|
|
5
|
+
*/
|
|
6
|
+
import { FluxSchema } from "../../schemas/flux/index.js";
|
|
7
|
+
import { handleFluxTool } from "../flux.js";
|
|
8
|
+
/**
|
|
9
|
+
* Flux tool - Docker infrastructure management
|
|
10
|
+
*
|
|
11
|
+
* Supports: container, compose, docker, and host operations
|
|
12
|
+
*/
|
|
13
|
+
export const FluxTool = {
|
|
14
|
+
name: "flux",
|
|
15
|
+
title: "Flux Tool",
|
|
16
|
+
description: `Docker infrastructure management - container, compose, docker, and host operations
|
|
17
|
+
|
|
18
|
+
HOW TO USE:
|
|
19
|
+
{
|
|
20
|
+
"action": "container", // Required: action family
|
|
21
|
+
"subaction": "list", // Required: operation within action
|
|
22
|
+
"host": "hostname", // Optional: target specific host
|
|
23
|
+
"response_format": "markdown", // Optional: markdown (default) or json
|
|
24
|
+
"force": true // Required for destructive operations (⚠️)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
• List containers: {"action": "container", "subaction": "list"}
|
|
29
|
+
• Stop container: {"action": "container", "subaction": "stop", "container_id": "container-id"}
|
|
30
|
+
• Docker info: {"action": "docker", "subaction": "info", "host": "myhost"}
|
|
31
|
+
• Help: {"action": "help"}
|
|
32
|
+
|
|
33
|
+
FLUX OPERATIONS:
|
|
34
|
+
|
|
35
|
+
Container (14 operations)
|
|
36
|
+
● exec - Execute command in running container
|
|
37
|
+
● inspect - Detailed container information
|
|
38
|
+
● list - List containers across all hosts
|
|
39
|
+
● logs - Container logs with streaming
|
|
40
|
+
● pause - Pause container execution
|
|
41
|
+
● pull - Pull latest image for a container
|
|
42
|
+
⚠️ recreate - Recreate a container
|
|
43
|
+
● restart - Restart one or more containers
|
|
44
|
+
● resume - Resume paused container
|
|
45
|
+
● search - Search containers across hosts
|
|
46
|
+
● start - Start stopped containers
|
|
47
|
+
● stats - Container resource usage statistics
|
|
48
|
+
● stop - Stop running containers
|
|
49
|
+
● top - Display running processes in container
|
|
50
|
+
|
|
51
|
+
Compose (10 operations)
|
|
52
|
+
● build - Build compose project images
|
|
53
|
+
⚠️ down - Stop compose project
|
|
54
|
+
● list - List compose projects across all hosts
|
|
55
|
+
● logs - View compose project logs
|
|
56
|
+
● pull - Pull compose project images
|
|
57
|
+
● refresh - Refresh compose project discovery cache
|
|
58
|
+
⚠️ recreate - Recreate compose containers
|
|
59
|
+
● restart - Restart compose services
|
|
60
|
+
● status - Show compose project status
|
|
61
|
+
● up - Create and start compose services
|
|
62
|
+
|
|
63
|
+
Docker (9 operations)
|
|
64
|
+
⚠️ build - Build image from Dockerfile
|
|
65
|
+
● df - Show docker disk usage
|
|
66
|
+
● images - List images across all hosts
|
|
67
|
+
● info - Display system-wide information
|
|
68
|
+
● networks - List networks across all hosts
|
|
69
|
+
● pull - Pull a Docker image
|
|
70
|
+
⚠️ prune - Remove unused Docker objects
|
|
71
|
+
⚠️ rmi - Remove one or more images
|
|
72
|
+
● volumes - List volumes across all hosts
|
|
73
|
+
|
|
74
|
+
Host (9 operations)
|
|
75
|
+
✓ doctor - Run diagnostic checks
|
|
76
|
+
✓ info - Host system information
|
|
77
|
+
● mounts - List filesystem mounts
|
|
78
|
+
● network - Network interface details
|
|
79
|
+
● ports - List and filter host/container port mappings
|
|
80
|
+
● resources - CPU, memory, and disk usage
|
|
81
|
+
● services - List systemd services
|
|
82
|
+
✓ status - Quick host health check
|
|
83
|
+
● uptime - System uptime and load
|
|
84
|
+
|
|
85
|
+
Help (1 operation)
|
|
86
|
+
● help - Show available operations
|
|
87
|
+
|
|
88
|
+
Legend:
|
|
89
|
+
● State-changing operation
|
|
90
|
+
⚠️ Destructive operation (requires force: true)
|
|
91
|
+
✓ Diagnostic/health check`,
|
|
92
|
+
inputSchema: FluxSchema,
|
|
93
|
+
annotations: {
|
|
94
|
+
readOnlyHint: false,
|
|
95
|
+
destructiveHint: true, // Can prune containers, remove images, recreate containers
|
|
96
|
+
idempotentHint: false,
|
|
97
|
+
openWorldHint: true,
|
|
98
|
+
},
|
|
99
|
+
handler: handleFluxTool,
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=flux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flux.js","sourceRoot":"","sources":["../../../src/tools/definitions/flux.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA2Ea;IAC1B,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE;QACX,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,IAAI,EAAE,2DAA2D;QAClF,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,IAAI;KACpB;IACD,OAAO,EAAE,cAAc;CACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout tool definition
|
|
3
|
+
*
|
|
4
|
+
* SSH remote operations tool for file, process, and system inspection.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolDefinition } from "../registry.js";
|
|
7
|
+
/**
|
|
8
|
+
* Scout tool - SSH remote operations
|
|
9
|
+
*
|
|
10
|
+
* Supports: file operations, process inspection, system information
|
|
11
|
+
*/
|
|
12
|
+
export declare const ScoutTool: ToolDefinition;
|
|
13
|
+
//# sourceMappingURL=scout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout.d.ts","sourceRoot":"","sources":["../../../src/tools/definitions/scout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,cAgEvB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout tool definition
|
|
3
|
+
*
|
|
4
|
+
* SSH remote operations tool for file, process, and system inspection.
|
|
5
|
+
*/
|
|
6
|
+
import { ScoutSchema } from "../../schemas/scout/index.js";
|
|
7
|
+
import { handleScoutTool } from "../scout.js";
|
|
8
|
+
/**
|
|
9
|
+
* Scout tool - SSH remote operations
|
|
10
|
+
*
|
|
11
|
+
* Supports: file operations, process inspection, system information
|
|
12
|
+
*/
|
|
13
|
+
export const ScoutTool = {
|
|
14
|
+
name: "scout",
|
|
15
|
+
title: "Scout Tool",
|
|
16
|
+
description: `SSH remote operations - file, process, and system inspection
|
|
17
|
+
|
|
18
|
+
HOW TO USE:
|
|
19
|
+
{
|
|
20
|
+
"action": "peek", // Simple actions
|
|
21
|
+
"host": "hostname", // Required for most operations
|
|
22
|
+
"path": "/path/to/file" // Operation-specific parameters
|
|
23
|
+
}
|
|
24
|
+
{
|
|
25
|
+
"action": "zfs", // ZFS operations
|
|
26
|
+
"subaction": "pools", // Subaction: pools, datasets, snapshots
|
|
27
|
+
"host": "hostname"
|
|
28
|
+
}
|
|
29
|
+
{
|
|
30
|
+
"action": "logs", // Log operations
|
|
31
|
+
"subaction": "journal", // Subaction: syslog, journal, dmesg, auth
|
|
32
|
+
"host": "hostname",
|
|
33
|
+
"lines": 50 // Optional: number of lines
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
• List hosts: {"action": "nodes"}
|
|
38
|
+
• Read file: {"action": "peek", "host": "myhost", "path": "/etc/hostname"}
|
|
39
|
+
• ZFS pools: {"action": "zfs", "subaction": "pools", "host": "myhost"}
|
|
40
|
+
• System logs: {"action": "logs", "subaction": "journal", "host": "myhost"}
|
|
41
|
+
|
|
42
|
+
SCOUT OPERATIONS:
|
|
43
|
+
|
|
44
|
+
Simple Actions (9 operations)
|
|
45
|
+
● beam - File transfer between local and remote hosts
|
|
46
|
+
● delta - Compare files or content between locations
|
|
47
|
+
● df - Disk usage information for a remote host
|
|
48
|
+
● emit - Multi-host operations
|
|
49
|
+
● exec - Execute command on a remote host
|
|
50
|
+
● find - Find files by glob pattern on a remote host
|
|
51
|
+
● nodes - List all configured SSH hosts
|
|
52
|
+
● peek - Read file or directory contents on a remote host
|
|
53
|
+
● ps - List and search processes on a remote host
|
|
54
|
+
|
|
55
|
+
ZFS (3 operations)
|
|
56
|
+
● pools - List ZFS storage pools
|
|
57
|
+
● datasets - List ZFS datasets
|
|
58
|
+
● snapshots - List ZFS snapshots
|
|
59
|
+
|
|
60
|
+
Logs (4 operations)
|
|
61
|
+
● syslog - Access system log files (/var/log)
|
|
62
|
+
● journal - Access systemd journal logs
|
|
63
|
+
● dmesg - Access kernel ring buffer logs
|
|
64
|
+
● auth - Access authentication logs
|
|
65
|
+
|
|
66
|
+
Legend:
|
|
67
|
+
● State-changing operation
|
|
68
|
+
✓ Diagnostic/health check`,
|
|
69
|
+
inputSchema: ScoutSchema,
|
|
70
|
+
annotations: {
|
|
71
|
+
readOnlyHint: false, // Can write files, execute commands
|
|
72
|
+
destructiveHint: true, // exec and emit can run arbitrary commands
|
|
73
|
+
idempotentHint: false,
|
|
74
|
+
openWorldHint: true,
|
|
75
|
+
},
|
|
76
|
+
handler: handleScoutTool,
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=scout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../../../src/tools/definitions/scout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAoDa;IAC1B,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE;QACX,YAAY,EAAE,KAAK,EAAE,oCAAoC;QACzD,eAAe,EAAE,IAAI,EAAE,2CAA2C;QAClE,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,IAAI;KACpB;IACD,OAAO,EAAE,eAAe;CACzB,CAAC"}
|
package/dist/tools/flux.d.ts
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import type { ServiceContainer } from
|
|
1
|
+
import type { ServiceContainer } from "../services/container.js";
|
|
2
2
|
/**
|
|
3
|
-
* Flux tool
|
|
3
|
+
* Handle all Flux tool requests - Docker infrastructure management.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - compose: 9 subactions (list, status, up, down, restart, logs, build, pull, recreate)
|
|
8
|
-
* - docker: 9 subactions (info, df, prune, images, pull, build, rmi, networks, volumes)
|
|
9
|
-
* - host: 7 subactions (status, resources, info, uptime, services, network, mounts)
|
|
5
|
+
* Routes incoming requests to specialized handlers based on action type.
|
|
6
|
+
* Validates input against Flux schema before dispatching.
|
|
10
7
|
*
|
|
11
|
-
*
|
|
8
|
+
* @param input - Unvalidated user input to process
|
|
9
|
+
* @param container - Service container with dependencies
|
|
10
|
+
* @returns Formatted response string (markdown or JSON)
|
|
11
|
+
* @throws {Error} When validation fails or action is unknown
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const result = await handleFluxTool(
|
|
16
|
+
* { action: 'container', subaction: 'list', state: 'running' },
|
|
17
|
+
* container
|
|
18
|
+
* );
|
|
19
|
+
* ```
|
|
12
20
|
*/
|
|
13
21
|
export declare function handleFluxTool(input: unknown, container: ServiceContainer): Promise<string>;
|
|
14
22
|
//# sourceMappingURL=flux.d.ts.map
|
package/dist/tools/flux.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flux.d.ts","sourceRoot":"","sources":["../../src/tools/flux.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flux.d.ts","sourceRoot":"","sources":["../../src/tools/flux.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAOjE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjG"}
|