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,293 @@
|
|
|
1
|
+
import { DEFAULT_COMPOSE_SCAN_CONCURRENCY } from "../../constants.js";
|
|
2
|
+
import { HostResolver } from "../../services/host-resolver.js";
|
|
3
|
+
import { getCurrentTimestamp } from "../../utils/time.js";
|
|
4
|
+
import { withCacheInvalidation } from "./compose-utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* Cache for HostResolver instances keyed by ComposeDiscovery.
|
|
7
|
+
* Avoids creating 7+ HostResolver instances per compose request when
|
|
8
|
+
* the same discovery and hosts are used repeatedly.
|
|
9
|
+
*
|
|
10
|
+
* Uses WeakMap so resolvers are garbage-collected when their discovery
|
|
11
|
+
* instance is no longer referenced.
|
|
12
|
+
*/
|
|
13
|
+
const resolverCache = new WeakMap();
|
|
14
|
+
/**
|
|
15
|
+
* Get or create a shared HostResolver for the given discovery and hosts.
|
|
16
|
+
* Returns a cached instance if the discovery and hosts array are the same.
|
|
17
|
+
*
|
|
18
|
+
* @param discovery - ComposeDiscovery instance
|
|
19
|
+
* @param hosts - Array of host configurations
|
|
20
|
+
* @returns Shared HostResolver instance
|
|
21
|
+
*/
|
|
22
|
+
function getResolver(discovery, hosts) {
|
|
23
|
+
const cached = resolverCache.get(discovery);
|
|
24
|
+
if (cached && cached.hosts === hosts) {
|
|
25
|
+
return cached.resolver;
|
|
26
|
+
}
|
|
27
|
+
const resolver = new HostResolver(discovery, hosts);
|
|
28
|
+
resolverCache.set(discovery, { resolver, hosts });
|
|
29
|
+
return resolver;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Format compose operation result as markdown.
|
|
33
|
+
*
|
|
34
|
+
* @param operation - Operation performed (e.g., 'started', 'stopped')
|
|
35
|
+
* @param hostName - Name of the host
|
|
36
|
+
* @param projectName - Name of the compose project
|
|
37
|
+
* @param result - Optional additional result text
|
|
38
|
+
* @returns Formatted markdown string
|
|
39
|
+
*/
|
|
40
|
+
function formatComposeResult(operation, hostName, projectName, result) {
|
|
41
|
+
return `Project '${projectName}' ${operation} completed on ${hostName}${result ? `\n${result}` : ""}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Handle compose up operation with cache invalidation.
|
|
45
|
+
*
|
|
46
|
+
* Starts services in a compose project with auto-discovery support.
|
|
47
|
+
* Invalidates compose cache after successful operation.
|
|
48
|
+
*
|
|
49
|
+
* @param input - Validated compose up input with project and detach options
|
|
50
|
+
* @param hosts - Array of available host configurations
|
|
51
|
+
* @param container - Service container with compose service
|
|
52
|
+
* @returns Success message
|
|
53
|
+
* @throws {Error} When project/host not found or operation fails
|
|
54
|
+
*/
|
|
55
|
+
export async function handleComposeUp(input, hosts, container) {
|
|
56
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
57
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
58
|
+
const eventEmitter = container.getEventEmitter();
|
|
59
|
+
const result = await withCacheInvalidation(async () => {
|
|
60
|
+
await container.getComposeService().composeUp(host, input.project, input.detach ?? true);
|
|
61
|
+
return formatComposeResult("started", host.name, input.project);
|
|
62
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposeUp", eventEmitter);
|
|
63
|
+
// Emit operation event for audit trail
|
|
64
|
+
eventEmitter.emit({
|
|
65
|
+
type: "compose_operation",
|
|
66
|
+
operation: "up",
|
|
67
|
+
project: input.project,
|
|
68
|
+
host: host.name,
|
|
69
|
+
timestamp: getCurrentTimestamp(),
|
|
70
|
+
});
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Handle compose down operation with cache invalidation.
|
|
75
|
+
*
|
|
76
|
+
* Stops services in a compose project with optional volume removal.
|
|
77
|
+
* Requires force flag when removing volumes to prevent accidental data loss.
|
|
78
|
+
*
|
|
79
|
+
* @param input - Validated compose down input with project and volume options
|
|
80
|
+
* @param hosts - Array of available host configurations
|
|
81
|
+
* @param container - Service container with compose service
|
|
82
|
+
* @returns Success message
|
|
83
|
+
* @throws {Error} When project/host not found, force required, or operation fails
|
|
84
|
+
*/
|
|
85
|
+
export async function handleComposeDown(input, hosts, container) {
|
|
86
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
87
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
88
|
+
// Validate force requirement for remove_volumes
|
|
89
|
+
if (input.remove_volumes && !input.force) {
|
|
90
|
+
throw new Error("Compose down with remove_volumes requires force=true to prevent accidental data loss");
|
|
91
|
+
}
|
|
92
|
+
const eventEmitter = container.getEventEmitter();
|
|
93
|
+
// Emit destructive operation event BEFORE execution for audit trail
|
|
94
|
+
if (input.remove_volumes) {
|
|
95
|
+
eventEmitter.emit({
|
|
96
|
+
type: "destructive_operation",
|
|
97
|
+
operation: "compose_down_with_volumes",
|
|
98
|
+
target: input.project,
|
|
99
|
+
host: host.name,
|
|
100
|
+
confirmed: input.force === true,
|
|
101
|
+
timestamp: getCurrentTimestamp(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const result = await withCacheInvalidation(async () => {
|
|
105
|
+
await container
|
|
106
|
+
.getComposeService()
|
|
107
|
+
.composeDown(host, input.project, input.remove_volumes ?? false);
|
|
108
|
+
return formatComposeResult("stopped", host.name, input.project);
|
|
109
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposeDown", eventEmitter);
|
|
110
|
+
// Emit operation event for audit trail
|
|
111
|
+
eventEmitter.emit({
|
|
112
|
+
type: "compose_operation",
|
|
113
|
+
operation: "down",
|
|
114
|
+
project: input.project,
|
|
115
|
+
host: host.name,
|
|
116
|
+
timestamp: getCurrentTimestamp(),
|
|
117
|
+
});
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handle compose restart operation with cache invalidation.
|
|
122
|
+
*
|
|
123
|
+
* Restarts all services in a compose project.
|
|
124
|
+
* Invalidates compose cache after successful operation.
|
|
125
|
+
*
|
|
126
|
+
* @param input - Validated compose restart input with project
|
|
127
|
+
* @param hosts - Array of available host configurations
|
|
128
|
+
* @param container - Service container with compose service
|
|
129
|
+
* @returns Success message
|
|
130
|
+
* @throws {Error} When project/host not found or operation fails
|
|
131
|
+
*/
|
|
132
|
+
export async function handleComposeRestart(input, hosts, container) {
|
|
133
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
134
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
135
|
+
return withCacheInvalidation(async () => {
|
|
136
|
+
await container.getComposeService().composeRestart(host, input.project);
|
|
137
|
+
return formatComposeResult("restarted", host.name, input.project);
|
|
138
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposeRestart");
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Handle compose logs operation with cache invalidation.
|
|
142
|
+
*
|
|
143
|
+
* Retrieves logs from compose project services with optional filtering.
|
|
144
|
+
* Supports time range, service filtering, and grep patterns.
|
|
145
|
+
*
|
|
146
|
+
* @param input - Validated compose logs input with project and filter options
|
|
147
|
+
* @param hosts - Array of available host configurations
|
|
148
|
+
* @param container - Service container with compose service
|
|
149
|
+
* @returns Formatted logs in markdown
|
|
150
|
+
* @throws {Error} When project/host not found or operation fails
|
|
151
|
+
*/
|
|
152
|
+
export async function handleComposeLogs(input, hosts, container) {
|
|
153
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
154
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
155
|
+
return withCacheInvalidation(async () => {
|
|
156
|
+
const options = {};
|
|
157
|
+
if (input.lines !== undefined) {
|
|
158
|
+
options.tail = input.lines;
|
|
159
|
+
}
|
|
160
|
+
if (input.since) {
|
|
161
|
+
options.since = input.since;
|
|
162
|
+
}
|
|
163
|
+
if (input.until) {
|
|
164
|
+
options.until = input.until;
|
|
165
|
+
}
|
|
166
|
+
if (input.service) {
|
|
167
|
+
options.services = [input.service];
|
|
168
|
+
}
|
|
169
|
+
let logs = await container.getComposeService().composeLogs(host, input.project, options);
|
|
170
|
+
// Apply grep filter if specified
|
|
171
|
+
if (input.grep) {
|
|
172
|
+
const grepPattern = input.grep;
|
|
173
|
+
const lines = logs.split("\n");
|
|
174
|
+
const filtered = lines.filter((line) => line.includes(grepPattern));
|
|
175
|
+
logs = filtered.join("\n");
|
|
176
|
+
}
|
|
177
|
+
return `## Logs: ${input.project} (${host.name})\n\n\`\`\`\n${logs}\n\`\`\``;
|
|
178
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposeLogs");
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Handle compose build operation with cache invalidation.
|
|
182
|
+
*
|
|
183
|
+
* Builds or rebuilds service images in a compose project.
|
|
184
|
+
* Supports no-cache builds and service-specific builds.
|
|
185
|
+
*
|
|
186
|
+
* @param input - Validated compose build input with project and build options
|
|
187
|
+
* @param hosts - Array of available host configurations
|
|
188
|
+
* @param container - Service container with compose service
|
|
189
|
+
* @returns Success message
|
|
190
|
+
* @throws {Error} When project/host not found or operation fails
|
|
191
|
+
*/
|
|
192
|
+
export async function handleComposeBuild(input, hosts, container) {
|
|
193
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
194
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
195
|
+
return withCacheInvalidation(async () => {
|
|
196
|
+
const options = {};
|
|
197
|
+
if (input.service) {
|
|
198
|
+
options.service = input.service;
|
|
199
|
+
}
|
|
200
|
+
if (input.no_cache) {
|
|
201
|
+
options.noCache = input.no_cache;
|
|
202
|
+
}
|
|
203
|
+
await container.getComposeService().composeBuild(host, input.project, options);
|
|
204
|
+
return formatComposeResult("build", host.name, input.project);
|
|
205
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposeBuild");
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Handle compose pull operation with cache invalidation.
|
|
209
|
+
*
|
|
210
|
+
* Pulls service images defined in a compose project.
|
|
211
|
+
* Supports service-specific pulls.
|
|
212
|
+
*
|
|
213
|
+
* @param input - Validated compose pull input with project and service options
|
|
214
|
+
* @param hosts - Array of available host configurations
|
|
215
|
+
* @param container - Service container with compose service
|
|
216
|
+
* @returns Success message
|
|
217
|
+
* @throws {Error} When project/host not found or operation fails
|
|
218
|
+
*/
|
|
219
|
+
export async function handleComposePull(input, hosts, container) {
|
|
220
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
221
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
222
|
+
return withCacheInvalidation(async () => {
|
|
223
|
+
const options = {};
|
|
224
|
+
if (input.service) {
|
|
225
|
+
options.service = input.service;
|
|
226
|
+
}
|
|
227
|
+
await container.getComposeService().composePull(host, input.project, options);
|
|
228
|
+
return formatComposeResult("pull", host.name, input.project);
|
|
229
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposePull");
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handle compose recreate operation with cache invalidation.
|
|
233
|
+
*
|
|
234
|
+
* Recreates containers in a compose project without rebuilding images.
|
|
235
|
+
* Supports service-specific recreation and force-recreate option.
|
|
236
|
+
*
|
|
237
|
+
* @param input - Validated compose recreate input with project and recreate options
|
|
238
|
+
* @param hosts - Array of available host configurations
|
|
239
|
+
* @param container - Service container with compose service
|
|
240
|
+
* @returns Success message
|
|
241
|
+
* @throws {Error} When project/host not found or operation fails
|
|
242
|
+
*/
|
|
243
|
+
export async function handleComposeRecreate(input, hosts, container) {
|
|
244
|
+
const resolver = getResolver(container.getComposeDiscovery(), hosts);
|
|
245
|
+
const host = await resolver.resolveHost(input.project, input.host);
|
|
246
|
+
return withCacheInvalidation(async () => {
|
|
247
|
+
const options = {};
|
|
248
|
+
if (input.service) {
|
|
249
|
+
options.service = input.service;
|
|
250
|
+
}
|
|
251
|
+
await container.getComposeService().composeRecreate(host, input.project, options);
|
|
252
|
+
return formatComposeResult("recreated", host.name, input.project);
|
|
253
|
+
}, input.project, host.name, container.getComposeDiscovery(), "handleComposeRecreate");
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Handle compose refresh operation - scans filesystem and updates cache.
|
|
257
|
+
*
|
|
258
|
+
* Scans host for compose files and updates discovery cache.
|
|
259
|
+
* Uses host's configured compose search paths.
|
|
260
|
+
*
|
|
261
|
+
* @param input - Validated compose refresh input with host
|
|
262
|
+
* @param hosts - Array of available host configurations
|
|
263
|
+
* @param container - Service container with compose scanner and discovery
|
|
264
|
+
* @returns Summary of discovered projects
|
|
265
|
+
* @throws {Error} When host not found or scan fails
|
|
266
|
+
*/
|
|
267
|
+
export async function handleComposeRefresh(input, hosts, container) {
|
|
268
|
+
const host = hosts.find((h) => h.name === input.host);
|
|
269
|
+
if (!host) {
|
|
270
|
+
throw new Error(`Host '${input.host}' not found`);
|
|
271
|
+
}
|
|
272
|
+
const discovery = container.getComposeDiscovery();
|
|
273
|
+
const scanner = container.getComposeScanner();
|
|
274
|
+
// Scan filesystem for compose files (scanner uses host.composeSearchPaths internally)
|
|
275
|
+
const composePaths = await scanner.findComposeFiles(host);
|
|
276
|
+
// Batch parse all files at once (uses DEFAULT_COMPOSE_SCAN_CONCURRENCY)
|
|
277
|
+
const nameMap = await scanner.batchParseComposeNames(host, composePaths, DEFAULT_COMPOSE_SCAN_CONCURRENCY);
|
|
278
|
+
const projects = [];
|
|
279
|
+
for (const composePath of composePaths) {
|
|
280
|
+
const explicitName = nameMap.get(composePath);
|
|
281
|
+
const projectName = explicitName ?? scanner.extractProjectName(composePath);
|
|
282
|
+
// Update cache with discovered project
|
|
283
|
+
await discovery.cache.updateProject(host.name, projectName, {
|
|
284
|
+
name: projectName,
|
|
285
|
+
path: composePath,
|
|
286
|
+
discoveredFrom: "scan",
|
|
287
|
+
lastSeen: getCurrentTimestamp(),
|
|
288
|
+
});
|
|
289
|
+
projects.push(`${projectName} (${composePath})`);
|
|
290
|
+
}
|
|
291
|
+
return `Cache refreshed for host '${host.name}'\nDiscovered ${projects.length} project(s):\n${projects.join("\n")}`;
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=compose-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-handlers.js","sourceRoot":"","sources":["../../../src/tools/handlers/compose-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EventEmitter } from "../../events/index.js";
|
|
2
|
+
import type { ComposeDiscovery } from "../../services/compose-discovery.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if an error is a file-not-found error
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - ENOENT error code (Node.js file system errors)
|
|
8
|
+
* - Error messages containing file-not-found indicators
|
|
9
|
+
*
|
|
10
|
+
* @param error - The error to check
|
|
11
|
+
* @returns True if this is a file-not-found error
|
|
12
|
+
*/
|
|
13
|
+
export declare function isFileNotFoundError(error: unknown): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Wrap a compose operation with cache invalidation on file-not-found errors
|
|
16
|
+
*
|
|
17
|
+
* When a compose operation fails due to a stale cached path, this wrapper:
|
|
18
|
+
* 1. Detects the file-not-found error
|
|
19
|
+
* 2. Invalidates the cache for that project
|
|
20
|
+
* 3. Emits cache invalidation event
|
|
21
|
+
* 4. Re-throws the error for normal error handling
|
|
22
|
+
*
|
|
23
|
+
* The cache invalidation ensures the next operation will re-discover the project.
|
|
24
|
+
*
|
|
25
|
+
* @param operation - The async operation to execute
|
|
26
|
+
* @param projectName - The compose project name
|
|
27
|
+
* @param hostName - The host name
|
|
28
|
+
* @param discovery - The discovery service (for cache access)
|
|
29
|
+
* @param operationName - Name of the operation (for logging)
|
|
30
|
+
* @param eventEmitter - Optional event emitter for cross-cutting concerns
|
|
31
|
+
* @returns The result of the operation
|
|
32
|
+
* @throws Re-throws any errors from the operation
|
|
33
|
+
*/
|
|
34
|
+
export declare function withCacheInvalidation<T>(operation: () => Promise<T>, projectName: string, hostName: string, discovery: ComposeDiscovery, operationName: string, eventEmitter?: EventEmitter): Promise<T>;
|
|
35
|
+
//# sourceMappingURL=compose-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-utils.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/compose-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqB3D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,CAAC,CAAC,CA0BZ"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { logError } from "../../utils/errors.js";
|
|
2
|
+
import { getCurrentTimestamp } from "../../utils/time.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if an error is a file-not-found error
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - ENOENT error code (Node.js file system errors)
|
|
8
|
+
* - Error messages containing file-not-found indicators
|
|
9
|
+
*
|
|
10
|
+
* @param error - The error to check
|
|
11
|
+
* @returns True if this is a file-not-found error
|
|
12
|
+
*/
|
|
13
|
+
export function isFileNotFoundError(error) {
|
|
14
|
+
if (!error || typeof error !== "object") {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
// Check for ENOENT error code
|
|
18
|
+
if ("code" in error && error.code === "ENOENT") {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
// Check error message for file-not-found indicators
|
|
22
|
+
if ("message" in error && typeof error.message === "string") {
|
|
23
|
+
const message = error.message.toLowerCase();
|
|
24
|
+
return (message.includes("no such file or directory") ||
|
|
25
|
+
message.includes("does not exist") ||
|
|
26
|
+
message.includes("cannot find"));
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Wrap a compose operation with cache invalidation on file-not-found errors
|
|
32
|
+
*
|
|
33
|
+
* When a compose operation fails due to a stale cached path, this wrapper:
|
|
34
|
+
* 1. Detects the file-not-found error
|
|
35
|
+
* 2. Invalidates the cache for that project
|
|
36
|
+
* 3. Emits cache invalidation event
|
|
37
|
+
* 4. Re-throws the error for normal error handling
|
|
38
|
+
*
|
|
39
|
+
* The cache invalidation ensures the next operation will re-discover the project.
|
|
40
|
+
*
|
|
41
|
+
* @param operation - The async operation to execute
|
|
42
|
+
* @param projectName - The compose project name
|
|
43
|
+
* @param hostName - The host name
|
|
44
|
+
* @param discovery - The discovery service (for cache access)
|
|
45
|
+
* @param operationName - Name of the operation (for logging)
|
|
46
|
+
* @param eventEmitter - Optional event emitter for cross-cutting concerns
|
|
47
|
+
* @returns The result of the operation
|
|
48
|
+
* @throws Re-throws any errors from the operation
|
|
49
|
+
*/
|
|
50
|
+
export async function withCacheInvalidation(operation, projectName, hostName, discovery, operationName, eventEmitter) {
|
|
51
|
+
try {
|
|
52
|
+
return await operation();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// If this is a file-not-found error, invalidate cache and re-throw
|
|
56
|
+
if (isFileNotFoundError(error)) {
|
|
57
|
+
await discovery.cache.removeProject(hostName, projectName);
|
|
58
|
+
logError(error, {
|
|
59
|
+
operation: operationName,
|
|
60
|
+
metadata: { host: hostName, project: projectName, reason: "stale path, cache invalidated" },
|
|
61
|
+
});
|
|
62
|
+
// Emit cache invalidation event
|
|
63
|
+
if (eventEmitter) {
|
|
64
|
+
eventEmitter.emit({
|
|
65
|
+
type: "cache_invalidated",
|
|
66
|
+
cache: "compose_project",
|
|
67
|
+
reason: `Stale path for project ${projectName} on ${hostName}`,
|
|
68
|
+
timestamp: getCurrentTimestamp(),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Always re-throw the error
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=compose-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-utils.js","sourceRoot":"","sources":["../../../src/tools/handlers/compose-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAChC,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAA2B,EAC3B,WAAmB,EACnB,QAAgB,EAChB,SAA2B,EAC3B,aAAqB,EACrB,YAA2B;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mEAAmE;QACnE,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC3D,QAAQ,CAAC,KAAK,EAAE;gBACd,SAAS,EAAE,aAAa;gBACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,+BAA+B,EAAE;aAC5F,CAAC,CAAC;YAEH,gCAAgC;YAChC,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,mBAAmB;oBACzB,KAAK,EAAE,iBAAiB;oBACxB,MAAM,EAAE,0BAA0B,WAAW,OAAO,QAAQ,EAAE;oBAC9D,SAAS,EAAE,mBAAmB,EAAE;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ComposeActionInput } from "../../schemas/flux/compose.js";
|
|
2
|
+
import type { ServiceContainer } from "../../services/container.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle all compose subactions for Docker Compose project management.
|
|
5
|
+
*
|
|
6
|
+
* Supports 10 subactions: list, status, up, down, restart, logs, build, pull,
|
|
7
|
+
* recreate, refresh. Uses auto-discovery to find projects across hosts.
|
|
8
|
+
*
|
|
9
|
+
* @param input - Validated Flux input with compose action
|
|
10
|
+
* @param container - Service container with Compose service
|
|
11
|
+
* @returns Formatted response string (markdown or JSON)
|
|
12
|
+
* @throws {Error} When project/host not found or operation fails
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const result = await handleComposeAction(
|
|
17
|
+
* { action: 'compose', subaction: 'status', project: 'myapp' },
|
|
18
|
+
* container
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleComposeAction(input: ComposeActionInput, container: ServiceContainer): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=compose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/compose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAWnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAsBpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA+IjB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// src/tools/handlers/compose.ts
|
|
2
|
+
import { formatComposeListMarkdown, formatComposeStatusMarkdown } from "../../formatters/index.js";
|
|
3
|
+
import { HostResolver } from "../../services/host-resolver.js";
|
|
4
|
+
import { logError } from "../../utils/errors.js";
|
|
5
|
+
import { createExhaustiveError, formatResponse, initializeHandler, paginateItems, resolveTargetHosts, } from "./base-handler.js";
|
|
6
|
+
import { handleComposeBuild, handleComposeDown, handleComposeLogs, handleComposePull, handleComposeRecreate, handleComposeRefresh, handleComposeRestart, handleComposeUp, } from "./compose-handlers.js";
|
|
7
|
+
/**
|
|
8
|
+
* Handle all compose subactions for Docker Compose project management.
|
|
9
|
+
*
|
|
10
|
+
* Supports 10 subactions: list, status, up, down, restart, logs, build, pull,
|
|
11
|
+
* recreate, refresh. Uses auto-discovery to find projects across hosts.
|
|
12
|
+
*
|
|
13
|
+
* @param input - Validated Flux input with compose action
|
|
14
|
+
* @param container - Service container with Compose service
|
|
15
|
+
* @returns Formatted response string (markdown or JSON)
|
|
16
|
+
* @throws {Error} When project/host not found or operation fails
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const result = await handleComposeAction(
|
|
21
|
+
* { action: 'compose', subaction: 'status', project: 'myapp' },
|
|
22
|
+
* container
|
|
23
|
+
* );
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export async function handleComposeAction(input, container) {
|
|
27
|
+
const validated = input;
|
|
28
|
+
const { service: composeService, hosts, format, } = await initializeHandler(validated, container, (c) => c.getComposeService());
|
|
29
|
+
switch (validated.subaction) {
|
|
30
|
+
case "list": {
|
|
31
|
+
const listInput = validated;
|
|
32
|
+
const targetHosts = resolveTargetHosts(hosts, listInput.host);
|
|
33
|
+
// For single-host queries, propagate errors. For multi-host aggregation, catch and continue.
|
|
34
|
+
const isSingleHost = targetHosts.length === 1;
|
|
35
|
+
const allProjects = await Promise.all(targetHosts.map(async (h) => {
|
|
36
|
+
try {
|
|
37
|
+
const projects = await composeService.listComposeProjects(h);
|
|
38
|
+
return projects.map((p) => ({ ...p, host: h.name }));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (isSingleHost) {
|
|
42
|
+
// Propagate errors when targeting a specific host
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
// Log and continue when aggregating across multiple hosts
|
|
46
|
+
logError(error, { operation: "compose:list", metadata: { host: h.name } });
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
let projects = allProjects.flat();
|
|
51
|
+
// Apply name filter
|
|
52
|
+
if (listInput.name_filter) {
|
|
53
|
+
const nameFilter = listInput.name_filter;
|
|
54
|
+
projects = projects.filter((p) => p.name.toLowerCase().includes(nameFilter.toLowerCase()));
|
|
55
|
+
}
|
|
56
|
+
// Apply pagination
|
|
57
|
+
const { items: paginatedProjects, total, offset, hasMore, } = paginateItems(projects, { offset: listInput.offset, limit: listInput.limit });
|
|
58
|
+
const label = targetHosts.length === 1 ? (targetHosts[0]?.name ?? "all-hosts") : "all-hosts";
|
|
59
|
+
return formatResponse(paginatedProjects, format, () => formatComposeListMarkdown(paginatedProjects, label, total, offset, hasMore));
|
|
60
|
+
}
|
|
61
|
+
case "status": {
|
|
62
|
+
const statusInput = validated;
|
|
63
|
+
let hostConfig;
|
|
64
|
+
// Use HostResolver for auto-discovery if no host specified
|
|
65
|
+
if (!statusInput.host) {
|
|
66
|
+
const resolver = new HostResolver(container.getComposeDiscovery(), hosts);
|
|
67
|
+
hostConfig = await resolver.resolveHost(statusInput.project, undefined);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const found = hosts.find((h) => h.name === statusInput.host);
|
|
71
|
+
if (!found) {
|
|
72
|
+
throw new Error(`Host not found: ${statusInput.host}`);
|
|
73
|
+
}
|
|
74
|
+
hostConfig = found;
|
|
75
|
+
}
|
|
76
|
+
const project = await composeService.getComposeStatus(hostConfig, statusInput.project);
|
|
77
|
+
// Apply service filter if specified
|
|
78
|
+
let services = project.services;
|
|
79
|
+
if (statusInput.service_filter) {
|
|
80
|
+
const serviceFilter = statusInput.service_filter;
|
|
81
|
+
services = services.filter((s) => s.name.toLowerCase().includes(serviceFilter.toLowerCase()));
|
|
82
|
+
project.services = services;
|
|
83
|
+
}
|
|
84
|
+
// Apply pagination to services
|
|
85
|
+
const { items: paginatedServices, total: totalServices, offset, hasMore, } = paginateItems(services, { offset: statusInput.offset, limit: statusInput.limit });
|
|
86
|
+
const paginatedProject = { ...project, services: paginatedServices };
|
|
87
|
+
return formatResponse(paginatedProject, format, () => formatComposeStatusMarkdown(paginatedProject, totalServices, offset, hasMore));
|
|
88
|
+
}
|
|
89
|
+
case "up": {
|
|
90
|
+
const upInput = validated;
|
|
91
|
+
return handleComposeUp(upInput, hosts, container);
|
|
92
|
+
}
|
|
93
|
+
case "down": {
|
|
94
|
+
const downInput = validated;
|
|
95
|
+
return handleComposeDown(downInput, hosts, container);
|
|
96
|
+
}
|
|
97
|
+
case "restart": {
|
|
98
|
+
const restartInput = validated;
|
|
99
|
+
return handleComposeRestart(restartInput, hosts, container);
|
|
100
|
+
}
|
|
101
|
+
case "logs": {
|
|
102
|
+
const logsInput = validated;
|
|
103
|
+
return handleComposeLogs(logsInput, hosts, container);
|
|
104
|
+
}
|
|
105
|
+
case "build": {
|
|
106
|
+
const buildInput = validated;
|
|
107
|
+
return handleComposeBuild(buildInput, hosts, container);
|
|
108
|
+
}
|
|
109
|
+
case "pull": {
|
|
110
|
+
const pullInput = validated;
|
|
111
|
+
return handleComposePull(pullInput, hosts, container);
|
|
112
|
+
}
|
|
113
|
+
case "recreate": {
|
|
114
|
+
const recreateInput = validated;
|
|
115
|
+
return handleComposeRecreate(recreateInput, hosts, container);
|
|
116
|
+
}
|
|
117
|
+
case "refresh": {
|
|
118
|
+
const refreshInput = validated;
|
|
119
|
+
return handleComposeRefresh(refreshInput, hosts, container);
|
|
120
|
+
}
|
|
121
|
+
default:
|
|
122
|
+
throw createExhaustiveError(validated, "compose subaction");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/tools/handlers/compose.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAenG,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAyB,EACzB,SAA2B;IAE3B,MAAM,SAAS,GAAG,KAAK,CAAC;IAExB,MAAM,EACJ,OAAO,EAAE,cAAc,EACvB,KAAK,EACL,MAAM,GACP,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEhF,QAAQ,SAAS,CAAC,SAAS,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,SAA6B,CAAC;YAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAE9D,6FAA6F;YAC7F,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;YAE9C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;oBAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,YAAY,EAAE,CAAC;wBACjB,kDAAkD;wBAClD,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,0DAA0D;oBAC1D,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3E,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YAEF,IAAI,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;YAElC,oBAAoB;YACpB,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC;gBACzC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7F,CAAC;YAED,mBAAmB;YACnB,MAAM,EACJ,KAAK,EAAE,iBAAiB,EACxB,KAAK,EACL,MAAM,EACN,OAAO,GACR,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;YAElF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAC7F,OAAO,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,CACpD,yBAAyB,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAC5E,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,WAAW,GAAG,SAA+B,CAAC;YAEpD,IAAI,UAAsB,CAAC;YAE3B,2DAA2D;YAC3D,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC1E,UAAU,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAEvF,oCAAoC;YACpC,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YAChC,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;gBAC/B,MAAM,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC;gBACjD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAC3D,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC9B,CAAC;YAED,+BAA+B;YAC/B,MAAM,EACJ,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,aAAa,EACpB,MAAM,EACN,OAAO,GACR,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YAEtF,MAAM,gBAAgB,GAAG,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;YAErE,OAAO,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,CACnD,2BAA2B,CAAC,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAC9E,CAAC;QACJ,CAAC;QAED,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,SAA2B,CAAC;YAC5C,OAAO,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,SAA6B,CAAC;YAChD,OAAO,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,YAAY,GAAG,SAAgC,CAAC;YACtD,OAAO,oBAAoB,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,SAA6B,CAAC;YAChD,OAAO,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,SAA8B,CAAC;YAClD,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,SAA6B,CAAC;YAChD,OAAO,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,aAAa,GAAG,SAAiC,CAAC;YACxD,OAAO,qBAAqB,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,YAAY,GAAG,SAAgC,CAAC;YACtD,OAAO,oBAAoB,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,CAAC;QAED;YACE,MAAM,qBAAqB,CAAC,SAAkB,EAAE,mBAAmB,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ContainerActionInput } from "../../schemas/flux/container.js";
|
|
2
|
+
import type { ServiceContainer } from "../../services/container.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle all container subactions for Docker container management.
|
|
5
|
+
*
|
|
6
|
+
* Supports 14 subactions: list, start, stop, restart, pause, resume, logs, stats,
|
|
7
|
+
* inspect, search, pull, recreate, exec, top.
|
|
8
|
+
*
|
|
9
|
+
* @param validatedut - Validated Flux input with container action
|
|
10
|
+
* @param container - Service container with Docker service
|
|
11
|
+
* @returns Formatted response string (markdown or JSON)
|
|
12
|
+
* @throws {Error} When container not found or operation fails
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const result = await handleContainerAction(
|
|
17
|
+
* { action: 'container', subaction: 'list', state: 'running' },
|
|
18
|
+
* container
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleContainerAction(input: ContainerActionInput, container: ServiceContainer): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/container.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,oBAAoB,EAUrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAcpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA0ZjB"}
|