synapse-mcp 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1820 -147
- package/dist/constants.d.ts +10 -4
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -8
- package/dist/constants.js.map +1 -1
- package/dist/events/emitter.d.ts +63 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +112 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +51 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +3 -0
- package/dist/events/types.js.map +1 -0
- package/dist/formatters/compose.d.ts +185 -0
- package/dist/formatters/compose.d.ts.map +1 -0
- package/dist/formatters/compose.js +397 -0
- package/dist/formatters/compose.js.map +1 -0
- package/dist/formatters/container.d.ts +84 -0
- package/dist/formatters/container.d.ts.map +1 -0
- package/dist/formatters/container.js +323 -0
- package/dist/formatters/container.js.map +1 -0
- package/dist/formatters/diagnostics.d.ts +20 -0
- package/dist/formatters/diagnostics.d.ts.map +1 -0
- package/dist/formatters/diagnostics.js +73 -0
- package/dist/formatters/diagnostics.js.map +1 -0
- package/dist/formatters/docker.d.ts +139 -0
- package/dist/formatters/docker.d.ts.map +1 -0
- package/dist/formatters/docker.js +216 -0
- package/dist/formatters/docker.js.map +1 -0
- package/dist/formatters/host.d.ts +137 -0
- package/dist/formatters/host.d.ts.map +1 -0
- package/dist/formatters/host.js +198 -0
- package/dist/formatters/host.js.map +1 -0
- package/dist/formatters/index.d.ts +17 -270
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +21 -456
- package/dist/formatters/index.js.map +1 -1
- package/dist/formatters/scout.d.ts +424 -0
- package/dist/formatters/scout.d.ts.map +1 -0
- package/dist/formatters/scout.js +687 -0
- package/dist/formatters/scout.js.map +1 -0
- package/dist/formatters/strategy.d.ts +105 -0
- package/dist/formatters/strategy.d.ts.map +1 -0
- package/dist/formatters/strategy.js +120 -0
- package/dist/formatters/strategy.js.map +1 -0
- package/dist/formatters/utils.d.ts +84 -0
- package/dist/formatters/utils.d.ts.map +1 -0
- package/dist/formatters/utils.js +129 -0
- package/dist/formatters/utils.js.map +1 -0
- package/dist/health-rate-limiter.d.ts +59 -0
- package/dist/health-rate-limiter.d.ts.map +1 -0
- package/dist/health-rate-limiter.js +159 -0
- package/dist/health-rate-limiter.js.map +1 -0
- package/dist/index.js +61 -100
- package/dist/index.js.map +1 -1
- package/dist/middleware/async-handler.d.ts +62 -0
- package/dist/middleware/async-handler.d.ts.map +1 -0
- package/dist/middleware/async-handler.js +58 -0
- package/dist/middleware/async-handler.js.map +1 -0
- package/dist/middleware/auth.d.ts +32 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +63 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/csrf-protection.d.ts +58 -0
- package/dist/middleware/csrf-protection.d.ts.map +1 -0
- package/dist/middleware/csrf-protection.js +123 -0
- package/dist/middleware/csrf-protection.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +49 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +90 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/error-mapper.d.ts +44 -0
- package/dist/middleware/error-mapper.d.ts.map +1 -0
- package/dist/middleware/error-mapper.js +127 -0
- package/dist/middleware/error-mapper.js.map +1 -0
- package/dist/middleware/index.d.ts +13 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +13 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-id.d.ts +22 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +31 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/types.d.ts +33 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +2 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/schemas/common.d.ts +205 -8
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +290 -17
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/flux/compose.d.ts +307 -44
- package/dist/schemas/flux/compose.d.ts.map +1 -1
- package/dist/schemas/flux/compose.js +74 -48
- package/dist/schemas/flux/compose.js.map +1 -1
- package/dist/schemas/flux/container.d.ts +423 -56
- package/dist/schemas/flux/container.d.ts.map +1 -1
- package/dist/schemas/flux/container.js +83 -61
- package/dist/schemas/flux/container.js.map +1 -1
- package/dist/schemas/flux/docker.d.ts +254 -37
- package/dist/schemas/flux/docker.d.ts.map +1 -1
- package/dist/schemas/flux/docker.js +69 -39
- package/dist/schemas/flux/docker.js.map +1 -1
- package/dist/schemas/flux/host.d.ts +312 -29
- package/dist/schemas/flux/host.d.ts.map +1 -1
- package/dist/schemas/flux/host.js +74 -31
- package/dist/schemas/flux/host.js.map +1 -1
- package/dist/schemas/flux/index.d.ts +503 -11
- package/dist/schemas/flux/index.d.ts.map +1 -1
- package/dist/schemas/flux/index.js +34 -70
- package/dist/schemas/flux/index.js.map +1 -1
- package/dist/schemas/host-config.d.ts +76 -0
- package/dist/schemas/host-config.d.ts.map +1 -0
- package/dist/schemas/host-config.js +105 -0
- package/dist/schemas/host-config.js.map +1 -0
- package/dist/schemas/scout/index.d.ts +80 -23
- package/dist/schemas/scout/index.d.ts.map +1 -1
- package/dist/schemas/scout/index.js +26 -11
- package/dist/schemas/scout/index.js.map +1 -1
- package/dist/schemas/scout/logs.d.ts +17 -5
- package/dist/schemas/scout/logs.d.ts.map +1 -1
- package/dist/schemas/scout/logs.js +41 -31
- package/dist/schemas/scout/logs.js.map +1 -1
- package/dist/schemas/scout/simple.d.ts +126 -11
- package/dist/schemas/scout/simple.d.ts.map +1 -1
- package/dist/schemas/scout/simple.js +112 -57
- package/dist/schemas/scout/simple.js.map +1 -1
- package/dist/schemas/scout/zfs.d.ts +17 -5
- package/dist/schemas/scout/zfs.d.ts.map +1 -1
- package/dist/schemas/scout/zfs.js +34 -25
- package/dist/schemas/scout/zfs.js.map +1 -1
- package/dist/services/cache-layer.d.ts +160 -0
- package/dist/services/cache-layer.d.ts.map +1 -0
- package/dist/services/cache-layer.js +138 -0
- package/dist/services/cache-layer.js.map +1 -0
- package/dist/services/compose-cache.d.ts +75 -0
- package/dist/services/compose-cache.d.ts.map +1 -0
- package/dist/services/compose-cache.js +178 -0
- package/dist/services/compose-cache.js.map +1 -0
- package/dist/services/compose-discovery.d.ts +46 -0
- package/dist/services/compose-discovery.d.ts.map +1 -0
- package/dist/services/compose-discovery.js +219 -0
- package/dist/services/compose-discovery.js.map +1 -0
- package/dist/services/compose-project-lister.d.ts +27 -0
- package/dist/services/compose-project-lister.d.ts.map +1 -0
- package/dist/services/compose-project-lister.js +71 -0
- package/dist/services/compose-project-lister.js.map +1 -0
- package/dist/services/compose-scanner.d.ts +63 -0
- package/dist/services/compose-scanner.d.ts.map +1 -0
- package/dist/services/compose-scanner.js +253 -0
- package/dist/services/compose-scanner.js.map +1 -0
- package/dist/services/compose.d.ts +64 -28
- package/dist/services/compose.d.ts.map +1 -1
- package/dist/services/compose.js +220 -98
- package/dist/services/compose.js.map +1 -1
- package/dist/services/config-loader.d.ts +23 -0
- package/dist/services/config-loader.d.ts.map +1 -0
- package/dist/services/config-loader.js +124 -0
- package/dist/services/config-loader.js.map +1 -0
- package/dist/services/config-service.d.ts +38 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +225 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/container-host-map-cache.d.ts +121 -0
- package/dist/services/container-host-map-cache.d.ts.map +1 -0
- package/dist/services/container-host-map-cache.js +188 -0
- package/dist/services/container-host-map-cache.js.map +1 -0
- package/dist/services/container.d.ts +194 -6
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +386 -11
- package/dist/services/container.js.map +1 -1
- package/dist/services/diagnostics.d.ts +57 -0
- package/dist/services/diagnostics.d.ts.map +1 -0
- package/dist/services/diagnostics.js +271 -0
- package/dist/services/diagnostics.js.map +1 -0
- package/dist/services/docker/container-service.d.ts +123 -0
- package/dist/services/docker/container-service.d.ts.map +1 -0
- package/dist/services/docker/container-service.js +347 -0
- package/dist/services/docker/container-service.js.map +1 -0
- package/dist/services/docker/image-service.d.ts +82 -0
- package/dist/services/docker/image-service.d.ts.map +1 -0
- package/dist/services/docker/image-service.js +193 -0
- package/dist/services/docker/image-service.js.map +1 -0
- package/dist/services/docker/index.d.ts +80 -0
- package/dist/services/docker/index.d.ts.map +1 -0
- package/dist/services/docker/index.js +103 -0
- package/dist/services/docker/index.js.map +1 -0
- package/dist/services/docker/network-service.d.ts +22 -0
- package/dist/services/docker/network-service.d.ts.map +1 -0
- package/dist/services/docker/network-service.js +43 -0
- package/dist/services/docker/network-service.js.map +1 -0
- package/dist/services/docker/system-service.d.ts +49 -0
- package/dist/services/docker/system-service.d.ts.map +1 -0
- package/dist/services/docker/system-service.js +215 -0
- package/dist/services/docker/system-service.js.map +1 -0
- package/dist/services/docker/utils/client-factory.d.ts +56 -0
- package/dist/services/docker/utils/client-factory.d.ts.map +1 -0
- package/dist/services/docker/utils/client-factory.js +139 -0
- package/dist/services/docker/utils/client-factory.js.map +1 -0
- package/dist/services/docker/utils/client-manager.d.ts +88 -0
- package/dist/services/docker/utils/client-manager.d.ts.map +1 -0
- package/dist/services/docker/utils/client-manager.js +124 -0
- package/dist/services/docker/utils/client-manager.js.map +1 -0
- package/dist/services/docker/utils/exec-handler.d.ts +94 -0
- package/dist/services/docker/utils/exec-handler.d.ts.map +1 -0
- package/dist/services/docker/utils/exec-handler.js +197 -0
- package/dist/services/docker/utils/exec-handler.js.map +1 -0
- package/dist/services/docker/utils/formatters.d.ts +13 -0
- package/dist/services/docker/utils/formatters.d.ts.map +1 -0
- package/dist/services/docker/utils/formatters.js +33 -0
- package/dist/services/docker/utils/formatters.js.map +1 -0
- package/dist/services/docker/utils/log-parser.d.ts +10 -0
- package/dist/services/docker/utils/log-parser.d.ts.map +1 -0
- package/dist/services/docker/utils/log-parser.js +48 -0
- package/dist/services/docker/utils/log-parser.js.map +1 -0
- package/dist/services/docker/utils/stats-calculator.d.ts +68 -0
- package/dist/services/docker/utils/stats-calculator.d.ts.map +1 -0
- package/dist/services/docker/utils/stats-calculator.js +61 -0
- package/dist/services/docker/utils/stats-calculator.js.map +1 -0
- package/dist/services/docker/volume-service.d.ts +22 -0
- package/dist/services/docker/volume-service.d.ts.map +1 -0
- package/dist/services/docker/volume-service.js +48 -0
- package/dist/services/docker/volume-service.js.map +1 -0
- package/dist/services/docker-interfaces.d.ts +283 -0
- package/dist/services/docker-interfaces.d.ts.map +1 -0
- package/dist/services/docker-interfaces.js +13 -0
- package/dist/services/docker-interfaces.js.map +1 -0
- package/dist/services/docker.d.ts +42 -5
- package/dist/services/docker.d.ts.map +1 -1
- package/dist/services/docker.js +335 -127
- package/dist/services/docker.js.map +1 -1
- package/dist/services/file-service.d.ts +6 -2
- package/dist/services/file-service.d.ts.map +1 -1
- package/dist/services/file-service.js +156 -52
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/host-config-repository.d.ts +133 -0
- package/dist/services/host-config-repository.d.ts.map +1 -0
- package/dist/services/host-config-repository.js +323 -0
- package/dist/services/host-config-repository.js.map +1 -0
- package/dist/services/host-resolver.d.ts +49 -0
- package/dist/services/host-resolver.d.ts.map +1 -0
- package/dist/services/host-resolver.js +176 -0
- package/dist/services/host-resolver.js.map +1 -0
- package/dist/services/interfaces.d.ts +61 -194
- package/dist/services/interfaces.d.ts.map +1 -1
- package/dist/services/local-executor.d.ts +31 -0
- package/dist/services/local-executor.d.ts.map +1 -0
- package/dist/services/local-executor.js +71 -0
- package/dist/services/local-executor.js.map +1 -0
- package/dist/services/ssh-config-loader.d.ts +35 -0
- package/dist/services/ssh-config-loader.d.ts.map +1 -0
- package/dist/services/ssh-config-loader.js +218 -0
- package/dist/services/ssh-config-loader.js.map +1 -0
- package/dist/services/ssh-pool.d.ts +26 -1
- package/dist/services/ssh-pool.d.ts.map +1 -1
- package/dist/services/ssh-pool.js +166 -25
- package/dist/services/ssh-pool.js.map +1 -1
- package/dist/services/ssh-service.d.ts +3 -0
- package/dist/services/ssh-service.d.ts.map +1 -1
- package/dist/services/ssh-service.js +53 -31
- package/dist/services/ssh-service.js.map +1 -1
- package/dist/services/ssh.d.ts +2 -6
- package/dist/services/ssh.d.ts.map +1 -1
- package/dist/services/ssh.js +9 -40
- package/dist/services/ssh.js.map +1 -1
- package/dist/tools/definitions/flux.d.ts +13 -0
- package/dist/tools/definitions/flux.d.ts.map +1 -0
- package/dist/tools/definitions/flux.js +101 -0
- package/dist/tools/definitions/flux.js.map +1 -0
- package/dist/tools/definitions/index.d.ts +8 -0
- package/dist/tools/definitions/index.d.ts.map +1 -0
- package/dist/tools/definitions/index.js +8 -0
- package/dist/tools/definitions/index.js.map +1 -0
- package/dist/tools/definitions/scout.d.ts +13 -0
- package/dist/tools/definitions/scout.d.ts.map +1 -0
- package/dist/tools/definitions/scout.js +78 -0
- package/dist/tools/definitions/scout.js.map +1 -0
- package/dist/tools/flux.d.ts +16 -8
- package/dist/tools/flux.d.ts.map +1 -1
- package/dist/tools/flux.js +27 -66
- package/dist/tools/flux.js.map +1 -1
- package/dist/tools/handlers/base-handler.d.ts +172 -0
- package/dist/tools/handlers/base-handler.d.ts.map +1 -0
- package/dist/tools/handlers/base-handler.js +234 -0
- package/dist/tools/handlers/base-handler.js.map +1 -0
- package/dist/tools/handlers/compose-handlers.d.ts +108 -0
- package/dist/tools/handlers/compose-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/compose-handlers.js +293 -0
- package/dist/tools/handlers/compose-handlers.js.map +1 -0
- package/dist/tools/handlers/compose-utils.d.ts +35 -0
- package/dist/tools/handlers/compose-utils.d.ts.map +1 -0
- package/dist/tools/handlers/compose-utils.js +76 -0
- package/dist/tools/handlers/compose-utils.js.map +1 -0
- package/dist/tools/handlers/compose.d.ts +23 -0
- package/dist/tools/handlers/compose.d.ts.map +1 -0
- package/dist/tools/handlers/compose.js +125 -0
- package/dist/tools/handlers/compose.js.map +1 -0
- package/dist/tools/handlers/container.d.ts +23 -0
- package/dist/tools/handlers/container.d.ts.map +1 -0
- package/dist/tools/handlers/container.js +333 -0
- package/dist/tools/handlers/container.js.map +1 -0
- package/dist/tools/handlers/docker.d.ts +24 -0
- package/dist/tools/handlers/docker.d.ts.map +1 -0
- package/dist/tools/handlers/docker.js +155 -0
- package/dist/tools/handlers/docker.js.map +1 -0
- package/dist/tools/handlers/host.d.ts +23 -0
- package/dist/tools/handlers/host.d.ts.map +1 -0
- package/dist/tools/handlers/host.js +196 -0
- package/dist/tools/handlers/host.js.map +1 -0
- package/dist/tools/handlers/scout-logs.d.ts +24 -0
- package/dist/tools/handlers/scout-logs.d.ts.map +1 -0
- package/dist/tools/handlers/scout-logs.js +119 -0
- package/dist/tools/handlers/scout-logs.js.map +1 -0
- package/dist/tools/handlers/scout-simple.d.ts +23 -0
- package/dist/tools/handlers/scout-simple.d.ts.map +1 -0
- package/dist/tools/handlers/scout-simple.js +286 -0
- package/dist/tools/handlers/scout-simple.js.map +1 -0
- package/dist/tools/handlers/scout-zfs.d.ts +23 -0
- package/dist/tools/handlers/scout-zfs.d.ts.map +1 -0
- package/dist/tools/handlers/scout-zfs.js +82 -0
- package/dist/tools/handlers/scout-zfs.js.map +1 -0
- package/dist/tools/index.d.ts +32 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +41 -35
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +135 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +151 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/scout.d.ts +16 -8
- package/dist/tools/scout.d.ts.map +1 -1
- package/dist/tools/scout.js +36 -78
- package/dist/tools/scout.js.map +1 -1
- package/dist/types.d.ts +629 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/command-security.d.ts +82 -0
- package/dist/utils/command-security.d.ts.map +1 -0
- package/dist/utils/command-security.js +122 -0
- package/dist/utils/command-security.js.map +1 -0
- package/dist/utils/error-sanitization.d.ts +77 -0
- package/dist/utils/error-sanitization.d.ts.map +1 -0
- package/dist/utils/error-sanitization.js +107 -0
- package/dist/utils/error-sanitization.js.map +1 -0
- package/dist/utils/errors.d.ts +30 -6
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +91 -12
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/help-handler.d.ts +23 -0
- package/dist/utils/help-handler.d.ts.map +1 -0
- package/dist/utils/help-handler.js +21 -0
- package/dist/utils/help-handler.js.map +1 -0
- package/dist/utils/help.d.ts +1 -1
- package/dist/utils/help.d.ts.map +1 -1
- package/dist/utils/help.js +57 -16
- package/dist/utils/help.js.map +1 -1
- package/dist/utils/host-utils.d.ts +31 -0
- package/dist/utils/host-utils.d.ts.map +1 -0
- package/dist/utils/host-utils.js +80 -0
- package/dist/utils/host-utils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/init-detection.d.ts +36 -0
- package/dist/utils/init-detection.d.ts.map +1 -0
- package/dist/utils/init-detection.js +79 -0
- package/dist/utils/init-detection.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pagination.d.ts +20 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +29 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/path-security.d.ts +132 -18
- package/dist/utils/path-security.d.ts.map +1 -1
- package/dist/utils/path-security.js +164 -35
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/sorting.d.ts +33 -0
- package/dist/utils/sorting.d.ts.map +1 -0
- package/dist/utils/sorting.js +57 -0
- package/dist/utils/sorting.js.map +1 -0
- package/dist/utils/text-filters.d.ts +13 -0
- package/dist/utils/text-filters.d.ts.map +1 -0
- package/dist/utils/text-filters.js +18 -0
- package/dist/utils/text-filters.js.map +1 -0
- package/dist/utils/time.d.ts +11 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +13 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/validation.d.ts +25 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +45 -19
- package/dist/schemas/discriminator.d.ts +0 -20
- package/dist/schemas/discriminator.d.ts.map +0 -1
- package/dist/schemas/discriminator.js +0 -25
- package/dist/schemas/discriminator.js.map +0 -1
- package/dist/schemas/unified.d.ts +0 -674
- package/dist/schemas/unified.d.ts.map +0 -1
- package/dist/schemas/unified.js +0 -453
- package/dist/schemas/unified.js.map +0 -1
- package/dist/tools/unified.d.ts +0 -7
- package/dist/tools/unified.d.ts.map +0 -1
- package/dist/tools/unified.js +0 -827
- package/dist/tools/unified.js.map +0 -1
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
// src/tools/handlers/container.ts
|
|
2
|
+
import pLimit from "p-limit";
|
|
3
|
+
import { formatContainerExecMarkdown, formatContainerPauseMarkdown, formatContainerRestartMarkdown, formatContainerResumeMarkdown, formatContainerStartMarkdown, formatContainerStopMarkdown, formatContainersMarkdown, formatContainerTopMarkdown, formatInspectMarkdown, formatInspectSummaryMarkdown, formatLogsMarkdown, formatMultiStatsMarkdown, formatSearchResultsMarkdown, formatStatsMarkdown, } from "../../formatters/index.js";
|
|
4
|
+
import { logError } from "../../utils/errors.js";
|
|
5
|
+
import { CONTAINER_SEVERITY, sortBySeverity } from "../../utils/sorting.js";
|
|
6
|
+
import { getCurrentTimestamp } from "../../utils/time.js";
|
|
7
|
+
import { createExhaustiveError, formatResponse, initializeHandler, paginateItems, resolveNonEmptyString, resolveTargetHosts, } from "./base-handler.js";
|
|
8
|
+
/**
|
|
9
|
+
* Handle all container subactions for Docker container management.
|
|
10
|
+
*
|
|
11
|
+
* Supports 14 subactions: list, start, stop, restart, pause, resume, logs, stats,
|
|
12
|
+
* inspect, search, pull, recreate, exec, top.
|
|
13
|
+
*
|
|
14
|
+
* @param validatedut - Validated Flux input with container action
|
|
15
|
+
* @param container - Service container with Docker service
|
|
16
|
+
* @returns Formatted response string (markdown or JSON)
|
|
17
|
+
* @throws {Error} When container not found or operation fails
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const result = await handleContainerAction(
|
|
22
|
+
* { action: 'container', subaction: 'list', state: 'running' },
|
|
23
|
+
* container
|
|
24
|
+
* );
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export async function handleContainerAction(input, container) {
|
|
28
|
+
const validated = input;
|
|
29
|
+
const { service: dockerService, hosts, format, } = await initializeHandler(validated, container, (c) => c.getDockerService());
|
|
30
|
+
const targetHosts = resolveTargetHosts(hosts, validated.host);
|
|
31
|
+
switch (validated.subaction) {
|
|
32
|
+
case "list": {
|
|
33
|
+
const listInput = validated;
|
|
34
|
+
// Map schema state values to service state values
|
|
35
|
+
// Schema uses 'exited'/'restarting' but service uses 'stopped'
|
|
36
|
+
const stateMap = {
|
|
37
|
+
all: undefined,
|
|
38
|
+
running: "running",
|
|
39
|
+
exited: "stopped",
|
|
40
|
+
paused: "paused",
|
|
41
|
+
restarting: "running", // restarting containers are treated as running
|
|
42
|
+
};
|
|
43
|
+
const containers = await dockerService.listContainers(targetHosts, {
|
|
44
|
+
state: stateMap[listInput.state] ?? undefined,
|
|
45
|
+
nameFilter: listInput.name_filter,
|
|
46
|
+
imageFilter: listInput.image_filter,
|
|
47
|
+
labelFilter: listInput.label_filter,
|
|
48
|
+
});
|
|
49
|
+
// Sort by severity BEFORE pagination to ensure critical containers appear on page 1
|
|
50
|
+
// exited/dead → stopped → paused/restarting → running
|
|
51
|
+
const sortedContainers = sortBySeverity(containers, (c) => c.state, CONTAINER_SEVERITY, (c) => c.name);
|
|
52
|
+
// Apply pagination
|
|
53
|
+
const { items: paginatedContainers, total, offset, hasMore, } = paginateItems(sortedContainers, { offset: listInput.offset, limit: listInput.limit });
|
|
54
|
+
return formatResponse(paginatedContainers, format, () => formatContainersMarkdown(paginatedContainers, total, offset, hasMore));
|
|
55
|
+
}
|
|
56
|
+
case "start":
|
|
57
|
+
case "stop":
|
|
58
|
+
case "restart":
|
|
59
|
+
case "pause": {
|
|
60
|
+
const lifecycleInput = validated;
|
|
61
|
+
const found = await dockerService.findContainerHost(lifecycleInput.container_id, targetHosts);
|
|
62
|
+
if (!found) {
|
|
63
|
+
throw new Error(`Container not found: ${lifecycleInput.container_id}`);
|
|
64
|
+
}
|
|
65
|
+
await dockerService.containerAction(lifecycleInput.container_id, lifecycleInput.subaction, found.host);
|
|
66
|
+
// CRITICAL: Invalidate cache after state change
|
|
67
|
+
container.getContainerHostMapCache().invalidateCache();
|
|
68
|
+
// Emit events for audit trail and cross-cutting concerns
|
|
69
|
+
container.getEventEmitter().emit({
|
|
70
|
+
type: "container_state_changed",
|
|
71
|
+
containerId: lifecycleInput.container_id,
|
|
72
|
+
action: lifecycleInput.subaction,
|
|
73
|
+
host: found.host.name,
|
|
74
|
+
timestamp: getCurrentTimestamp(),
|
|
75
|
+
});
|
|
76
|
+
container.getEventEmitter().emit({
|
|
77
|
+
type: "cache_invalidated",
|
|
78
|
+
cache: "container_host_map",
|
|
79
|
+
reason: `Container ${lifecycleInput.subaction} operation`,
|
|
80
|
+
timestamp: getCurrentTimestamp(),
|
|
81
|
+
});
|
|
82
|
+
// Use proper formatter for each lifecycle action
|
|
83
|
+
const formatters = {
|
|
84
|
+
start: formatContainerStartMarkdown,
|
|
85
|
+
stop: formatContainerStopMarkdown,
|
|
86
|
+
restart: formatContainerRestartMarkdown,
|
|
87
|
+
pause: formatContainerPauseMarkdown,
|
|
88
|
+
};
|
|
89
|
+
const formatter = formatters[lifecycleInput.subaction];
|
|
90
|
+
return formatter(lifecycleInput.container_id, found.host.name);
|
|
91
|
+
}
|
|
92
|
+
case "resume": {
|
|
93
|
+
const resumeInput = validated;
|
|
94
|
+
const found = await dockerService.findContainerHost(resumeInput.container_id, targetHosts);
|
|
95
|
+
if (!found) {
|
|
96
|
+
throw new Error(`Container not found: ${resumeInput.container_id}`);
|
|
97
|
+
}
|
|
98
|
+
// Resume maps to unpause in Docker API
|
|
99
|
+
await dockerService.containerAction(resumeInput.container_id, "unpause", found.host);
|
|
100
|
+
// CRITICAL: Invalidate cache after state change
|
|
101
|
+
container.getContainerHostMapCache().invalidateCache();
|
|
102
|
+
// Emit events for audit trail and cross-cutting concerns
|
|
103
|
+
container.getEventEmitter().emit({
|
|
104
|
+
type: "container_state_changed",
|
|
105
|
+
containerId: resumeInput.container_id,
|
|
106
|
+
action: "unpause",
|
|
107
|
+
host: found.host.name,
|
|
108
|
+
timestamp: getCurrentTimestamp(),
|
|
109
|
+
});
|
|
110
|
+
container.getEventEmitter().emit({
|
|
111
|
+
type: "cache_invalidated",
|
|
112
|
+
cache: "container_host_map",
|
|
113
|
+
reason: "Container resume operation",
|
|
114
|
+
timestamp: getCurrentTimestamp(),
|
|
115
|
+
});
|
|
116
|
+
return formatContainerResumeMarkdown(resumeInput.container_id, found.host.name);
|
|
117
|
+
}
|
|
118
|
+
case "logs": {
|
|
119
|
+
const logsInput = validated;
|
|
120
|
+
const found = await dockerService.findContainerHost(logsInput.container_id, targetHosts);
|
|
121
|
+
if (!found) {
|
|
122
|
+
throw new Error(`Container not found: ${logsInput.container_id}`);
|
|
123
|
+
}
|
|
124
|
+
const logs = await dockerService.getContainerLogs(logsInput.container_id, found.host, {
|
|
125
|
+
lines: logsInput.lines,
|
|
126
|
+
since: logsInput.since,
|
|
127
|
+
until: logsInput.until,
|
|
128
|
+
stream: logsInput.stream === "both" ? "all" : logsInput.stream,
|
|
129
|
+
});
|
|
130
|
+
// Apply grep filter if specified
|
|
131
|
+
const grepFilter = logsInput.grep;
|
|
132
|
+
const filteredLogs = grepFilter
|
|
133
|
+
? logs.filter((log) => log.message.includes(grepFilter))
|
|
134
|
+
: logs;
|
|
135
|
+
return formatResponse(filteredLogs, format, (data) => formatLogsMarkdown(data, logsInput.container_id, found.host.name, logsInput.lines, false, // truncated - not currently implemented
|
|
136
|
+
false // follow - not currently implemented
|
|
137
|
+
));
|
|
138
|
+
}
|
|
139
|
+
case "stats": {
|
|
140
|
+
const statsInput = validated;
|
|
141
|
+
// If container_id is provided, get stats for specific container
|
|
142
|
+
if (statsInput.container_id) {
|
|
143
|
+
const found = await dockerService.findContainerHost(statsInput.container_id, targetHosts);
|
|
144
|
+
if (!found) {
|
|
145
|
+
throw new Error(`Container not found: ${statsInput.container_id}`);
|
|
146
|
+
}
|
|
147
|
+
const stats = await dockerService.getContainerStats(statsInput.container_id, found.host);
|
|
148
|
+
return formatResponse(stats, format, (data) => formatStatsMarkdown([data], found.host.name));
|
|
149
|
+
}
|
|
150
|
+
// Otherwise, get stats for all running containers with cache optimization
|
|
151
|
+
// Get cache from ServiceContainer for proper lifecycle management
|
|
152
|
+
const containerHostCache = container.getContainerHostMapCache();
|
|
153
|
+
// Build mapping ONCE upfront (eliminates N+1)
|
|
154
|
+
await containerHostCache.buildMapping(targetHosts, dockerService);
|
|
155
|
+
const allContainers = await dockerService.listContainers(targetHosts, { state: "running" });
|
|
156
|
+
// Limit concurrent stats calls to prevent Docker daemon overload
|
|
157
|
+
// For 50 containers, this prevents 100 simultaneous API calls (2 per container)
|
|
158
|
+
const limit = pLimit(10);
|
|
159
|
+
const statsPromises = allContainers.map((c) => limit(async () => {
|
|
160
|
+
try {
|
|
161
|
+
// O(1) cache lookup instead of N queries!
|
|
162
|
+
const mapping = await containerHostCache.findContainerHost(c.id, targetHosts, dockerService);
|
|
163
|
+
if (!mapping) {
|
|
164
|
+
console.error(`Container ${c.id} not found in mapping`);
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const stats = await dockerService.getContainerStats(c.id, mapping.host);
|
|
168
|
+
return { stats, host: mapping.host.name };
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
logError(error, { operation: `getContainerStats:${c.id}` });
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}));
|
|
175
|
+
const allStats = (await Promise.all(statsPromises)).filter((s) => s !== null);
|
|
176
|
+
return formatResponse(allStats, format, formatMultiStatsMarkdown);
|
|
177
|
+
}
|
|
178
|
+
case "inspect": {
|
|
179
|
+
const inspectInput = validated;
|
|
180
|
+
const found = await dockerService.findContainerHost(inspectInput.container_id, targetHosts);
|
|
181
|
+
if (!found) {
|
|
182
|
+
throw new Error(`Container not found: ${inspectInput.container_id}`);
|
|
183
|
+
}
|
|
184
|
+
const inspection = await dockerService.inspectContainer(inspectInput.container_id, found.host);
|
|
185
|
+
const summary = inspectInput.summary
|
|
186
|
+
? {
|
|
187
|
+
id: inspection.Id.slice(0, 12),
|
|
188
|
+
name: inspection.Name.replace(/^\//, ""),
|
|
189
|
+
image: inspection.Config.Image,
|
|
190
|
+
state: inspection.State.Status,
|
|
191
|
+
created: inspection.Created,
|
|
192
|
+
started: inspection.State.StartedAt,
|
|
193
|
+
restartCount: inspection.RestartCount,
|
|
194
|
+
ports: Object.entries(inspection.NetworkSettings.Ports || {})
|
|
195
|
+
.map(([containerPort, bindings]) => {
|
|
196
|
+
// Filter out null/undefined bindings, keep only valid ones
|
|
197
|
+
if (!Array.isArray(bindings) || bindings.length === 0) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
const validBindings = bindings.filter((b) => b !== null &&
|
|
201
|
+
b !== undefined &&
|
|
202
|
+
typeof b === "object" &&
|
|
203
|
+
"HostIp" in b &&
|
|
204
|
+
typeof b.HostIp === "string" &&
|
|
205
|
+
"HostPort" in b &&
|
|
206
|
+
typeof b.HostPort === "string");
|
|
207
|
+
if (validBindings.length === 0) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const binding = validBindings[0];
|
|
211
|
+
return `${binding.HostIp || "0.0.0.0"}:${binding.HostPort} → ${containerPort}`;
|
|
212
|
+
})
|
|
213
|
+
.filter((port) => port !== null),
|
|
214
|
+
mounts: (inspection.Mounts || []).map((m) => ({
|
|
215
|
+
src: m.Source,
|
|
216
|
+
dst: m.Destination,
|
|
217
|
+
type: m.Type,
|
|
218
|
+
})),
|
|
219
|
+
networks: Object.keys(inspection.NetworkSettings.Networks || {}),
|
|
220
|
+
env_count: inspection.Config.Env?.length || 0,
|
|
221
|
+
labels_count: Object.keys(inspection.Config.Labels || {}).length,
|
|
222
|
+
host: found.host.name,
|
|
223
|
+
}
|
|
224
|
+
: null;
|
|
225
|
+
if (summary) {
|
|
226
|
+
return formatResponse(summary, format, (data) => formatInspectSummaryMarkdown(data));
|
|
227
|
+
}
|
|
228
|
+
return formatResponse(inspection, format, () => formatInspectMarkdown(inspection, found.host.name));
|
|
229
|
+
}
|
|
230
|
+
case "search": {
|
|
231
|
+
const searchInput = validated;
|
|
232
|
+
const containers = await dockerService.listContainers(targetHosts, {
|
|
233
|
+
nameFilter: searchInput.query,
|
|
234
|
+
});
|
|
235
|
+
// Apply pagination
|
|
236
|
+
const { items: paginatedContainers, total } = paginateItems(containers, {
|
|
237
|
+
offset: searchInput.offset,
|
|
238
|
+
limit: searchInput.limit,
|
|
239
|
+
});
|
|
240
|
+
return formatResponse(paginatedContainers, format, () => formatSearchResultsMarkdown(paginatedContainers, searchInput.query, total));
|
|
241
|
+
}
|
|
242
|
+
case "pull": {
|
|
243
|
+
const pullInput = validated;
|
|
244
|
+
const found = await dockerService.findContainerHost(pullInput.container_id, targetHosts);
|
|
245
|
+
if (!found) {
|
|
246
|
+
throw new Error(`Container not found: ${pullInput.container_id}`);
|
|
247
|
+
}
|
|
248
|
+
const inputImage = resolveNonEmptyString(pullInput.image);
|
|
249
|
+
let image = resolveNonEmptyString(found.container?.Image);
|
|
250
|
+
if (!image) {
|
|
251
|
+
try {
|
|
252
|
+
const inspection = await dockerService.inspectContainer(pullInput.container_id, found.host);
|
|
253
|
+
image = resolveNonEmptyString(inspection?.Config?.Image);
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
logError(error, {
|
|
257
|
+
operation: `inspectContainer:${pullInput.container_id}`,
|
|
258
|
+
metadata: {
|
|
259
|
+
host: found.host.name,
|
|
260
|
+
context: "Falling back to inputImage for pull operation",
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
if (!inputImage) {
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
image = image ?? inputImage;
|
|
269
|
+
if (!image) {
|
|
270
|
+
throw new Error(`Cannot determine image for container: ${pullInput.container_id}`);
|
|
271
|
+
}
|
|
272
|
+
const result = await dockerService.pullImage(image, found.host);
|
|
273
|
+
return `Pulled image ${image}: ${result.status}`;
|
|
274
|
+
}
|
|
275
|
+
case "recreate": {
|
|
276
|
+
const recreateInput = validated;
|
|
277
|
+
const found = await dockerService.findContainerHost(recreateInput.container_id, targetHosts);
|
|
278
|
+
if (!found) {
|
|
279
|
+
throw new Error(`Container not found: ${recreateInput.container_id}`);
|
|
280
|
+
}
|
|
281
|
+
const result = await dockerService.recreateContainer(recreateInput.container_id, found.host, {
|
|
282
|
+
pull: recreateInput.pull,
|
|
283
|
+
});
|
|
284
|
+
return `Container recreated: ${result.containerId} (${result.status})`;
|
|
285
|
+
}
|
|
286
|
+
case "exec": {
|
|
287
|
+
const execInput = validated;
|
|
288
|
+
const found = await dockerService.findContainerHost(execInput.container_id, targetHosts);
|
|
289
|
+
if (!found) {
|
|
290
|
+
throw new Error(`Container not found: ${execInput.container_id}`);
|
|
291
|
+
}
|
|
292
|
+
const result = await dockerService.execContainer(execInput.container_id, found.host, {
|
|
293
|
+
command: execInput.command,
|
|
294
|
+
user: execInput.user,
|
|
295
|
+
workdir: execInput.workdir,
|
|
296
|
+
});
|
|
297
|
+
const execResult = {
|
|
298
|
+
host: found.host.name,
|
|
299
|
+
container: execInput.container_id,
|
|
300
|
+
...result,
|
|
301
|
+
};
|
|
302
|
+
return formatResponse(execResult, format, () => {
|
|
303
|
+
// Combine stdout and stderr for output parameter
|
|
304
|
+
const output = result.stderr
|
|
305
|
+
? `${result.stdout}\n\nstderr:\n${result.stderr}`
|
|
306
|
+
: result.stdout;
|
|
307
|
+
return formatContainerExecMarkdown(execInput.container_id, found.host.name, execInput.command, output, result.exitCode);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
case "top": {
|
|
311
|
+
const topInput = validated;
|
|
312
|
+
const found = await dockerService.findContainerHost(topInput.container_id, targetHosts);
|
|
313
|
+
if (!found) {
|
|
314
|
+
throw new Error(`Container not found: ${topInput.container_id}`);
|
|
315
|
+
}
|
|
316
|
+
const result = await dockerService.getContainerProcesses(topInput.container_id, found.host);
|
|
317
|
+
const topResult = {
|
|
318
|
+
host: found.host.name,
|
|
319
|
+
container: topInput.container_id,
|
|
320
|
+
...result,
|
|
321
|
+
};
|
|
322
|
+
return formatResponse(topResult, format, () => {
|
|
323
|
+
const header = result.titles.join(" ");
|
|
324
|
+
const rows = result.processes.map((row) => row.join(" "));
|
|
325
|
+
const processes = [header, ...rows].join("\n").trim();
|
|
326
|
+
return formatContainerTopMarkdown(topInput.container_id, found.host.name, processes);
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
default:
|
|
330
|
+
throw createExhaustiveError(validated, "container subaction");
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/tools/handlers/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DockerActionInput } from "../../schemas/flux/docker.js";
|
|
2
|
+
import type { ServiceContainer } from "../../services/container.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle all docker subactions for Docker daemon operations.
|
|
5
|
+
*
|
|
6
|
+
* Supports 9 subactions: info, df, prune, images, pull, build, rmi, networks, volumes.
|
|
7
|
+
* Most operations require a specific host, while some (images, networks, volumes) can
|
|
8
|
+
* query all hosts.
|
|
9
|
+
*
|
|
10
|
+
* @param input - Validated Flux input with docker action
|
|
11
|
+
* @param container - Service container with Docker service
|
|
12
|
+
* @returns Formatted response string (markdown or JSON)
|
|
13
|
+
* @throws {Error} When host not found, operation fails, or required parameters missing
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const result = await handleDockerAction(
|
|
18
|
+
* { action: 'docker', subaction: 'info', host: 'host1' },
|
|
19
|
+
* container
|
|
20
|
+
* );
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function handleDockerAction(input: DockerActionInput, container: ServiceContainer): Promise<string>;
|
|
24
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/docker.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAWpE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAiNjB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// src/tools/handlers/docker.ts
|
|
2
|
+
import { formatDockerDfMarkdown, formatDockerInfoMarkdown, formatImagesMarkdown, formatNetworksMarkdown, formatPruneMarkdown, formatVolumesMarkdown, } from "../../formatters/index.js";
|
|
3
|
+
import { getCurrentTimestamp } from "../../utils/time.js";
|
|
4
|
+
import { createExhaustiveError, formatResponse, getHostConfigOptional, initializeHandler, paginateItems, resolveTargetHosts, } from "./base-handler.js";
|
|
5
|
+
/**
|
|
6
|
+
* Handle all docker subactions for Docker daemon operations.
|
|
7
|
+
*
|
|
8
|
+
* Supports 9 subactions: info, df, prune, images, pull, build, rmi, networks, volumes.
|
|
9
|
+
* Most operations require a specific host, while some (images, networks, volumes) can
|
|
10
|
+
* query all hosts.
|
|
11
|
+
*
|
|
12
|
+
* @param input - Validated Flux input with docker action
|
|
13
|
+
* @param container - Service container with Docker service
|
|
14
|
+
* @returns Formatted response string (markdown or JSON)
|
|
15
|
+
* @throws {Error} When host not found, operation fails, or required parameters missing
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const result = await handleDockerAction(
|
|
20
|
+
* { action: 'docker', subaction: 'info', host: 'host1' },
|
|
21
|
+
* container
|
|
22
|
+
* );
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export async function handleDockerAction(input, container) {
|
|
26
|
+
const validated = input;
|
|
27
|
+
const { service: dockerService, hosts, format, } = await initializeHandler(validated, container, (c) => c.getDockerService());
|
|
28
|
+
// Find the target host (some docker subactions may query all hosts if not specified)
|
|
29
|
+
const hostName = validated.host;
|
|
30
|
+
const hostConfig = getHostConfigOptional(hosts, hostName);
|
|
31
|
+
// For single-host operations, require the host
|
|
32
|
+
if (hostName && !hostConfig) {
|
|
33
|
+
throw new Error(`Host not found: ${hostName}`);
|
|
34
|
+
}
|
|
35
|
+
switch (validated.subaction) {
|
|
36
|
+
case "info": {
|
|
37
|
+
if (!hostConfig) {
|
|
38
|
+
throw new Error("Host is required for docker:info");
|
|
39
|
+
}
|
|
40
|
+
const info = await dockerService.getDockerInfo(hostConfig);
|
|
41
|
+
return formatResponse(info, format, (data) => formatDockerInfoMarkdown([
|
|
42
|
+
{ host: hostConfig.name, info: { status: "success", ...data } },
|
|
43
|
+
]));
|
|
44
|
+
}
|
|
45
|
+
case "df": {
|
|
46
|
+
if (!hostConfig) {
|
|
47
|
+
throw new Error("Host is required for docker:df");
|
|
48
|
+
}
|
|
49
|
+
const usage = await dockerService.getDockerDiskUsage(hostConfig);
|
|
50
|
+
return formatResponse(usage, format, (data) => formatDockerDfMarkdown([{ host: hostConfig.name, usage: data }]));
|
|
51
|
+
}
|
|
52
|
+
case "prune": {
|
|
53
|
+
if (!hostConfig) {
|
|
54
|
+
throw new Error("Host is required for docker:prune");
|
|
55
|
+
}
|
|
56
|
+
// Require force flag for prune operations
|
|
57
|
+
if (!validated.force) {
|
|
58
|
+
throw new Error("Prune requires force=true to prevent accidental data loss");
|
|
59
|
+
}
|
|
60
|
+
const target = validated.prune_target;
|
|
61
|
+
// Emit destructive operation event BEFORE execution for audit trail
|
|
62
|
+
container.getEventEmitter().emit({
|
|
63
|
+
type: "destructive_operation",
|
|
64
|
+
operation: `docker_prune_${target}`,
|
|
65
|
+
target: target,
|
|
66
|
+
host: hostConfig.name,
|
|
67
|
+
confirmed: validated.force === true,
|
|
68
|
+
timestamp: getCurrentTimestamp(),
|
|
69
|
+
});
|
|
70
|
+
const results = await dockerService.pruneDocker(hostConfig, target, { force: true });
|
|
71
|
+
const pruneResult = { host: hostConfig.name, results };
|
|
72
|
+
return formatResponse(pruneResult, format, (data) => formatPruneMarkdown([data]));
|
|
73
|
+
}
|
|
74
|
+
case "images": {
|
|
75
|
+
// Can query all hosts or specific host
|
|
76
|
+
const targetHosts = resolveTargetHosts(hosts, hostName);
|
|
77
|
+
const options = {};
|
|
78
|
+
if (validated.dangling_only) {
|
|
79
|
+
options.danglingOnly = true;
|
|
80
|
+
}
|
|
81
|
+
const images = await dockerService.listImages(targetHosts, options);
|
|
82
|
+
// Sort by hostName BEFORE pagination to ensure correct ordering
|
|
83
|
+
const sortedImages = [...images].sort((a, b) => {
|
|
84
|
+
const hostA = a.hostName ?? "";
|
|
85
|
+
const hostB = b.hostName ?? "";
|
|
86
|
+
return hostA.localeCompare(hostB);
|
|
87
|
+
});
|
|
88
|
+
// Apply pagination
|
|
89
|
+
const { items: paginatedImages, total, offset, } = paginateItems(sortedImages, { offset: validated.offset, limit: validated.limit });
|
|
90
|
+
return formatResponse(paginatedImages, format, () => formatImagesMarkdown(paginatedImages, total, offset));
|
|
91
|
+
}
|
|
92
|
+
case "networks": {
|
|
93
|
+
// Can query all hosts or specific host
|
|
94
|
+
const targetHosts = resolveTargetHosts(hosts, hostName);
|
|
95
|
+
const networks = await dockerService.listNetworks(targetHosts);
|
|
96
|
+
// Sort by hostName BEFORE pagination to ensure correct ordering
|
|
97
|
+
const sortedNetworks = [...networks].sort((a, b) => {
|
|
98
|
+
const hostA = a.hostName ?? "";
|
|
99
|
+
const hostB = b.hostName ?? "";
|
|
100
|
+
return hostA.localeCompare(hostB);
|
|
101
|
+
});
|
|
102
|
+
const { items: paginatedNetworks, total, offset, } = paginateItems(sortedNetworks, { offset: validated.offset, limit: validated.limit });
|
|
103
|
+
return formatResponse(paginatedNetworks, format, () => formatNetworksMarkdown(paginatedNetworks, total, offset));
|
|
104
|
+
}
|
|
105
|
+
case "volumes": {
|
|
106
|
+
// Can query all hosts or specific host
|
|
107
|
+
const targetHosts = resolveTargetHosts(hosts, hostName);
|
|
108
|
+
const volumes = await dockerService.listVolumes(targetHosts);
|
|
109
|
+
// Sort by hostName BEFORE pagination to ensure correct ordering
|
|
110
|
+
const sortedVolumes = [...volumes].sort((a, b) => {
|
|
111
|
+
const hostA = a.hostName ?? "";
|
|
112
|
+
const hostB = b.hostName ?? "";
|
|
113
|
+
return hostA.localeCompare(hostB);
|
|
114
|
+
});
|
|
115
|
+
const { items: paginatedVolumes, total, offset, } = paginateItems(sortedVolumes, { offset: validated.offset, limit: validated.limit });
|
|
116
|
+
return formatResponse(paginatedVolumes, format, () => formatVolumesMarkdown(paginatedVolumes, total, offset));
|
|
117
|
+
}
|
|
118
|
+
case "pull": {
|
|
119
|
+
if (!hostConfig) {
|
|
120
|
+
throw new Error("Host is required for docker:pull");
|
|
121
|
+
}
|
|
122
|
+
const imageName = validated.image;
|
|
123
|
+
const result = await dockerService.pullImage(imageName, hostConfig);
|
|
124
|
+
const pullResult = { host: hostConfig.name, image: imageName, ...result };
|
|
125
|
+
return formatResponse(pullResult, format, (data) => `Image '${data.image}' pull completed on ${data.host}: ${data.status}`);
|
|
126
|
+
}
|
|
127
|
+
case "build": {
|
|
128
|
+
if (!hostConfig) {
|
|
129
|
+
throw new Error("Host is required for docker:build");
|
|
130
|
+
}
|
|
131
|
+
const options = {
|
|
132
|
+
context: validated.context,
|
|
133
|
+
tag: validated.tag,
|
|
134
|
+
dockerfile: validated.dockerfile,
|
|
135
|
+
noCache: validated.no_cache,
|
|
136
|
+
};
|
|
137
|
+
const result = await dockerService.buildImage(hostConfig, options);
|
|
138
|
+
const buildResult = { host: hostConfig.name, ...options, ...result };
|
|
139
|
+
return formatResponse(buildResult, format, (data) => `Image '${options.tag}' build completed on ${data.host}: ${data.status}`);
|
|
140
|
+
}
|
|
141
|
+
case "rmi": {
|
|
142
|
+
if (!hostConfig) {
|
|
143
|
+
throw new Error("Host is required for docker:rmi");
|
|
144
|
+
}
|
|
145
|
+
const imageName = validated.image;
|
|
146
|
+
const force = validated.force ?? false;
|
|
147
|
+
const result = await dockerService.removeImage(imageName, hostConfig, { force });
|
|
148
|
+
const rmiResult = { host: hostConfig.name, image: imageName, ...result };
|
|
149
|
+
return formatResponse(rmiResult, format, (data) => `Image '${data.image}' removed from ${data.host}: ${data.status}`);
|
|
150
|
+
}
|
|
151
|
+
default:
|
|
152
|
+
throw createExhaustiveError(validated, "docker subaction");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/tools/handlers/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FluxHostActionInput } from "../../schemas/flux/index.js";
|
|
2
|
+
import type { ServiceContainer } from "../../services/container.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle all host subactions for system-level operations.
|
|
5
|
+
*
|
|
6
|
+
* Supports 7 subactions: status, resources, info, uptime, services, network, mounts.
|
|
7
|
+
* Can query all hosts (status, resources) or require specific host (others).
|
|
8
|
+
*
|
|
9
|
+
* @param input - Validated Flux input with host action
|
|
10
|
+
* @param container - Service container with SSH and Docker services
|
|
11
|
+
* @returns Formatted response string (markdown or JSON)
|
|
12
|
+
* @throws {Error} When host not found or command fails
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const result = await handleHostAction(
|
|
17
|
+
* { action: 'host', subaction: 'status' },
|
|
18
|
+
* container
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleHostAction(input: FluxHostActionInput, container: ServiceContainer): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/host.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AA6CpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA+MjB"}
|