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,286 @@
|
|
|
1
|
+
import { DEFAULT_COMMAND_TIMEOUT, DEFAULT_MAX_FILE_SIZE } from "../../constants.js";
|
|
2
|
+
import { scoutSimpleUnionSchema } from "../../schemas/scout/simple.js";
|
|
3
|
+
import { escapeShellArg } from "../../utils/path-security.js";
|
|
4
|
+
import { createExhaustiveError, formatResponse, getHostConfigOrThrow, initializeHandler, validateInput, } from "./base-handler.js";
|
|
5
|
+
/**
|
|
6
|
+
* Valid sort options for 'ps' command.
|
|
7
|
+
* SECURITY NOTE: These values are passed directly to `ps --sort -${sort}`.
|
|
8
|
+
* The Zod schema (scoutPsSchema) validates against z.enum(['cpu', 'mem', 'pid', 'time']),
|
|
9
|
+
* but we maintain this const array as defense-in-depth in case the enum is extended
|
|
10
|
+
* with values that could be interpreted differently by the shell or ps command.
|
|
11
|
+
* Any new sort options MUST be alphanumeric and safe for shell arguments.
|
|
12
|
+
*/
|
|
13
|
+
const VALID_PS_SORTS = ["cpu", "mem", "pid", "time"];
|
|
14
|
+
/**
|
|
15
|
+
* Parse target string in format 'hostname:/path'.
|
|
16
|
+
*
|
|
17
|
+
* @param target - Target string to parse
|
|
18
|
+
* @returns Object with host and path components
|
|
19
|
+
* @throws {Error} When target format is invalid
|
|
20
|
+
*/
|
|
21
|
+
function parseTarget(target) {
|
|
22
|
+
const colonIndex = target.indexOf(":");
|
|
23
|
+
if (colonIndex === -1) {
|
|
24
|
+
throw new Error(`Invalid target format: ${target}. Expected hostname:/path`);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
host: target.slice(0, colonIndex),
|
|
28
|
+
path: target.slice(colonIndex + 1),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Handle all Scout simple actions for SSH file and process operations.
|
|
33
|
+
*
|
|
34
|
+
* Supports 9 actions: nodes, peek, exec, find, delta, emit, beam, ps, df.
|
|
35
|
+
* These actions operate directly without subactions.
|
|
36
|
+
*
|
|
37
|
+
* @param input - Validated Scout input with simple action
|
|
38
|
+
* @param container - Service container with SSH and file services
|
|
39
|
+
* @returns Formatted response string (markdown or JSON)
|
|
40
|
+
* @throws {Error} When host not found, target invalid, or operation fails
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const result = await handleScoutSimpleAction(
|
|
45
|
+
* { action: 'peek', target: 'host1:/etc/hosts' },
|
|
46
|
+
* container
|
|
47
|
+
* );
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export async function handleScoutSimpleAction(input, container) {
|
|
51
|
+
// Validate at handler boundary
|
|
52
|
+
const validated = validateInput(input, scoutSimpleUnionSchema, "scout-simple");
|
|
53
|
+
const { hosts, format } = await initializeHandler(validated, container, (c) => c.getSSHService());
|
|
54
|
+
const sshService = container.getSSHService();
|
|
55
|
+
const fileService = container.getFileService();
|
|
56
|
+
// Use shared utility for host lookup
|
|
57
|
+
const findHost = (name) => getHostConfigOrThrow(hosts, name);
|
|
58
|
+
switch (validated.action) {
|
|
59
|
+
case "nodes": {
|
|
60
|
+
// List all configured SSH hosts
|
|
61
|
+
const hostList = hosts.map((h) => ({
|
|
62
|
+
name: h.name,
|
|
63
|
+
host: h.host,
|
|
64
|
+
protocol: h.protocol,
|
|
65
|
+
port: h.port,
|
|
66
|
+
}));
|
|
67
|
+
return formatResponse(hostList, format, (data) => {
|
|
68
|
+
const lines = ["## Configured Hosts", ""];
|
|
69
|
+
for (const h of data) {
|
|
70
|
+
lines.push(`- **${h.name}**: ${h.host} (${h.protocol}:${h.port})`);
|
|
71
|
+
}
|
|
72
|
+
return lines.join("\n");
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
case "peek": {
|
|
76
|
+
const { host: hostName, path } = parseTarget(validated.target);
|
|
77
|
+
const hostConfig = findHost(hostName);
|
|
78
|
+
if (validated.tree) {
|
|
79
|
+
// Show directory tree
|
|
80
|
+
const treeOutput = await fileService.treeDirectory(hostConfig, path, validated.depth ?? 3);
|
|
81
|
+
return formatResponse({ host: hostName, path, tree: treeOutput }, format, (data) => `## Tree - ${data.host}:${data.path}\n\n\`\`\`\n${data.tree}\n\`\`\``);
|
|
82
|
+
}
|
|
83
|
+
// Try reading as file first
|
|
84
|
+
try {
|
|
85
|
+
const result = await fileService.readFile(hostConfig, path, DEFAULT_MAX_FILE_SIZE);
|
|
86
|
+
const fileData = {
|
|
87
|
+
host: hostName,
|
|
88
|
+
path,
|
|
89
|
+
content: result.content,
|
|
90
|
+
size: result.size,
|
|
91
|
+
truncated: result.truncated,
|
|
92
|
+
};
|
|
93
|
+
return formatResponse(fileData, format, (data) => {
|
|
94
|
+
const truncNote = data.truncated ? `\n\n*Truncated (showing ${data.size} bytes)*` : "";
|
|
95
|
+
return `## ${data.host}:${data.path}\n\n\`\`\`\n${data.content}\n\`\`\`${truncNote}`;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
// If file read fails, try listing as directory
|
|
100
|
+
if (err instanceof Error && err.message.toLowerCase().includes("directory")) {
|
|
101
|
+
const listing = await fileService.listDirectory(hostConfig, path, false);
|
|
102
|
+
return formatResponse({ host: hostName, path, listing }, format, (data) => `## Directory - ${data.host}:${data.path}\n\n\`\`\`\n${data.listing}\n\`\`\``);
|
|
103
|
+
}
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
case "exec": {
|
|
108
|
+
const { host: hostName, path } = parseTarget(validated.target);
|
|
109
|
+
const hostConfig = findHost(hostName);
|
|
110
|
+
const result = await fileService.executeCommand(hostConfig, path, validated.command, validated.timeout);
|
|
111
|
+
const execData = {
|
|
112
|
+
host: hostName,
|
|
113
|
+
path,
|
|
114
|
+
command: validated.command,
|
|
115
|
+
stdout: result.stdout,
|
|
116
|
+
exitCode: result.exitCode,
|
|
117
|
+
};
|
|
118
|
+
return formatResponse(execData, format, (data) => {
|
|
119
|
+
const exitNote = data.exitCode !== 0 ? `\n\n*Exit code: ${data.exitCode}*` : "";
|
|
120
|
+
return `## Command Output - ${data.host}:${data.path}\n\n\`\`\`\n${data.stdout}\n\`\`\`${exitNote}`;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
case "find": {
|
|
124
|
+
const { host: hostName, path } = parseTarget(validated.target);
|
|
125
|
+
const hostConfig = findHost(hostName);
|
|
126
|
+
const results = await fileService.findFiles(hostConfig, path, validated.pattern, {
|
|
127
|
+
maxDepth: validated.depth,
|
|
128
|
+
limit: validated.limit,
|
|
129
|
+
});
|
|
130
|
+
const files = results.trim().split("\n").filter(Boolean);
|
|
131
|
+
const findData = { host: hostName, path, pattern: validated.pattern, files };
|
|
132
|
+
return formatResponse(findData, format, (data) => `## Find Results - ${data.host}:${data.path}\n\nPattern: \`${data.pattern}\`\n\n\`\`\`\n${results}\n\`\`\``);
|
|
133
|
+
}
|
|
134
|
+
case "delta": {
|
|
135
|
+
// Source is always a remote file
|
|
136
|
+
const { host: sourceHostName, path: sourcePath } = parseTarget(validated.source);
|
|
137
|
+
const sourceHost = findHost(sourceHostName);
|
|
138
|
+
if (validated.content !== undefined) {
|
|
139
|
+
// Compare file against provided content
|
|
140
|
+
const fileResult = await fileService.readFile(sourceHost, sourcePath, DEFAULT_MAX_FILE_SIZE);
|
|
141
|
+
if (fileResult.content === validated.content) {
|
|
142
|
+
return formatResponse({ identical: true, source: validated.source }, format, () => "Files are identical");
|
|
143
|
+
}
|
|
144
|
+
return formatResponse({
|
|
145
|
+
identical: false,
|
|
146
|
+
source: validated.source,
|
|
147
|
+
sourceContent: fileResult.content,
|
|
148
|
+
providedContent: validated.content,
|
|
149
|
+
}, format, (data) => `## File Comparison\n\nFiles differ between ${data.source} and provided content`);
|
|
150
|
+
}
|
|
151
|
+
if (validated.target) {
|
|
152
|
+
// Compare two remote files
|
|
153
|
+
const { host: targetHostName, path: targetPath } = parseTarget(validated.target);
|
|
154
|
+
const targetHost = findHost(targetHostName);
|
|
155
|
+
const diff = await fileService.diffFiles(sourceHost, sourcePath, targetHost, targetPath, 3);
|
|
156
|
+
const diffData = {
|
|
157
|
+
source: validated.source,
|
|
158
|
+
target: validated.target,
|
|
159
|
+
diff,
|
|
160
|
+
};
|
|
161
|
+
return formatResponse(diffData, format, (data) => {
|
|
162
|
+
if (!data.diff || data.diff.trim() === "") {
|
|
163
|
+
return "Files are identical";
|
|
164
|
+
}
|
|
165
|
+
return `## Diff\n\n\`\`\`diff\n${data.diff}\n\`\`\``;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
throw new Error("delta requires either target or content parameter");
|
|
169
|
+
}
|
|
170
|
+
case "emit": {
|
|
171
|
+
if (!validated.command) {
|
|
172
|
+
throw new Error("emit requires a command parameter");
|
|
173
|
+
}
|
|
174
|
+
const command = validated.command;
|
|
175
|
+
const timeout = validated.timeout ?? DEFAULT_COMMAND_TIMEOUT;
|
|
176
|
+
// Execute command on all targets in parallel
|
|
177
|
+
const results = await Promise.all(validated.targets.map(async (target) => {
|
|
178
|
+
const { host: hostName, path } = parseTarget(target);
|
|
179
|
+
const hostConfig = findHost(hostName);
|
|
180
|
+
try {
|
|
181
|
+
const result = await fileService.executeCommand(hostConfig, path, command, timeout);
|
|
182
|
+
return {
|
|
183
|
+
host: hostName,
|
|
184
|
+
path,
|
|
185
|
+
stdout: result.stdout,
|
|
186
|
+
exitCode: result.exitCode,
|
|
187
|
+
error: undefined,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
return {
|
|
192
|
+
host: hostName,
|
|
193
|
+
path,
|
|
194
|
+
stdout: "",
|
|
195
|
+
exitCode: -1,
|
|
196
|
+
error: err instanceof Error ? err.message : "Unknown error",
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}));
|
|
200
|
+
return formatResponse(results, format, (data) => {
|
|
201
|
+
const lines = [
|
|
202
|
+
"## Multi-Host Command Results",
|
|
203
|
+
"",
|
|
204
|
+
`Command: \`${validated.command}\``,
|
|
205
|
+
"",
|
|
206
|
+
];
|
|
207
|
+
for (const r of data) {
|
|
208
|
+
lines.push(`### ${r.host}:${r.path}`);
|
|
209
|
+
if (r.error) {
|
|
210
|
+
lines.push(`\n**Error:** ${r.error}\n`);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
lines.push(`\n\`\`\`\n${r.stdout}\n\`\`\`\n`);
|
|
214
|
+
if (r.exitCode !== 0) {
|
|
215
|
+
lines.push(`*Exit code: ${r.exitCode}*\n`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return lines.join("\n");
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
case "beam": {
|
|
223
|
+
const { host: sourceHostName, path: sourcePath } = parseTarget(validated.source);
|
|
224
|
+
const { host: destHostName, path: destPath } = parseTarget(validated.destination);
|
|
225
|
+
const sourceHost = findHost(sourceHostName);
|
|
226
|
+
const destHost = findHost(destHostName);
|
|
227
|
+
const result = await fileService.transferFile(sourceHost, sourcePath, destHost, destPath);
|
|
228
|
+
const beamData = {
|
|
229
|
+
source: validated.source,
|
|
230
|
+
destination: validated.destination,
|
|
231
|
+
bytesTransferred: result.bytesTransferred,
|
|
232
|
+
warning: result.warning,
|
|
233
|
+
};
|
|
234
|
+
return formatResponse(beamData, format, (data) => {
|
|
235
|
+
const warningNote = data.warning ? `\n\n**Warning:** ${data.warning}` : "";
|
|
236
|
+
return `## File Transfer Complete\n\n- **From:** ${data.source}\n- **To:** ${data.destination}\n- **Bytes:** ${data.bytesTransferred}${warningNote}`;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
case "ps": {
|
|
240
|
+
const hostConfig = findHost(validated.host);
|
|
241
|
+
// Build ps command with options
|
|
242
|
+
// SECURITY: Defense-in-depth validation - sort is already validated by Zod enum in scoutPsSchema,
|
|
243
|
+
// but we verify here to guard against schema changes that might introduce unsafe values.
|
|
244
|
+
const sortValue = validated.sort || "cpu";
|
|
245
|
+
if (!VALID_PS_SORTS.includes(sortValue)) {
|
|
246
|
+
throw new Error(`Invalid sort option: ${sortValue}. Must be one of: ${VALID_PS_SORTS.join(", ")}`);
|
|
247
|
+
}
|
|
248
|
+
const args = ["aux", "--sort", `-${sortValue}`];
|
|
249
|
+
let output = await sshService.executeSSHCommand(hostConfig, "ps", args);
|
|
250
|
+
// Apply filters
|
|
251
|
+
const grepFilter = validated.grep;
|
|
252
|
+
const userFilter = validated.user;
|
|
253
|
+
const lines = output.split("\n");
|
|
254
|
+
const header = lines[0] || "";
|
|
255
|
+
let filtered = lines.slice(1);
|
|
256
|
+
if (userFilter) {
|
|
257
|
+
filtered = filtered.filter((line) => line.startsWith(userFilter));
|
|
258
|
+
}
|
|
259
|
+
if (grepFilter) {
|
|
260
|
+
filtered = filtered.filter((line) => line.includes(grepFilter));
|
|
261
|
+
}
|
|
262
|
+
if (validated.limit) {
|
|
263
|
+
filtered = filtered.slice(0, validated.limit);
|
|
264
|
+
}
|
|
265
|
+
output = [header, ...filtered].join("\n");
|
|
266
|
+
return formatResponse({ host: validated.host, processes: output }, format, (data) => `## Processes - ${data.host}\n\n\`\`\`\n${data.processes}\n\`\`\``);
|
|
267
|
+
}
|
|
268
|
+
case "df": {
|
|
269
|
+
const hostConfig = findHost(validated.host);
|
|
270
|
+
const args = [];
|
|
271
|
+
if (validated.human_readable !== false) {
|
|
272
|
+
args.push("-h");
|
|
273
|
+
}
|
|
274
|
+
if (validated.path) {
|
|
275
|
+
// SECURITY: Path is already validated by safePathSchema in scoutDfSchema,
|
|
276
|
+
// but we escape it here as defense-in-depth against any schema bypass.
|
|
277
|
+
args.push(escapeShellArg(validated.path));
|
|
278
|
+
}
|
|
279
|
+
const output = await sshService.executeSSHCommand(hostConfig, "df", args);
|
|
280
|
+
return formatResponse({ host: validated.host, diskUsage: output }, format, (data) => `## Disk Usage - ${data.host}\n\n\`\`\`\n${data.diskUsage}\n\`\`\``);
|
|
281
|
+
}
|
|
282
|
+
default:
|
|
283
|
+
throw createExhaustiveError(validated, "scout action");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=scout-simple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout-simple.js","sourceRoot":"","sources":["../../../src/tools/handlers/scout-simple.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ScoutInput } from "../../schemas/scout/index.js";
|
|
2
|
+
import type { ServiceContainer } from "../../services/container.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle all Scout ZFS subactions for ZFS filesystem operations.
|
|
5
|
+
*
|
|
6
|
+
* Supports 3 subactions: pools, datasets, snapshots.
|
|
7
|
+
* Requires specific host for ZFS operations.
|
|
8
|
+
*
|
|
9
|
+
* @param input - Validated Scout input with zfs action
|
|
10
|
+
* @param container - Service container with SSH service
|
|
11
|
+
* @returns Formatted response string (markdown or JSON)
|
|
12
|
+
* @throws {Error} When host not found or ZFS operation fails
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const result = await handleZfsAction(
|
|
17
|
+
* { action: 'zfs', subaction: 'pools', host: 'host1' },
|
|
18
|
+
* container
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleZfsAction(input: ScoutInput, container: ServiceContainer): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=scout-zfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout-zfs.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/scout-zfs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAUpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA0FjB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { scoutZfsSchema } from "../../schemas/scout/zfs.js";
|
|
2
|
+
import { assertValidAction, createExhaustiveError, formatResponse, getHostConfigOrThrow, initializeHandler, validateInput, } from "./base-handler.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle all Scout ZFS subactions for ZFS filesystem operations.
|
|
5
|
+
*
|
|
6
|
+
* Supports 3 subactions: pools, datasets, snapshots.
|
|
7
|
+
* Requires specific host for ZFS operations.
|
|
8
|
+
*
|
|
9
|
+
* @param input - Validated Scout input with zfs action
|
|
10
|
+
* @param container - Service container with SSH service
|
|
11
|
+
* @returns Formatted response string (markdown or JSON)
|
|
12
|
+
* @throws {Error} When host not found or ZFS operation fails
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const result = await handleZfsAction(
|
|
17
|
+
* { action: 'zfs', subaction: 'pools', host: 'host1' },
|
|
18
|
+
* container
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export async function handleZfsAction(input, container) {
|
|
23
|
+
assertValidAction(input, "zfs", "zfs");
|
|
24
|
+
// Validate pool/dataset inputs at the handler boundary before SSH execution.
|
|
25
|
+
const validated = validateInput(input, scoutZfsSchema, "scout-zfs");
|
|
26
|
+
const { hosts, format } = await initializeHandler(validated, container, (c) => c.getSSHService());
|
|
27
|
+
const sshService = container.getSSHService();
|
|
28
|
+
// Find the target host
|
|
29
|
+
const hostConfig = getHostConfigOrThrow(hosts, validated.host);
|
|
30
|
+
switch (validated.subaction) {
|
|
31
|
+
case "pools": {
|
|
32
|
+
const { pool } = validated;
|
|
33
|
+
// Build zpool list command
|
|
34
|
+
const args = ["list"];
|
|
35
|
+
if (pool) {
|
|
36
|
+
args.push(pool);
|
|
37
|
+
}
|
|
38
|
+
const output = await sshService.executeSSHCommand(hostConfig, "zpool", args);
|
|
39
|
+
return formatResponse({ host: validated.host, subaction: "pools", output: output.trim() }, format, (data) => `## ZFS Pools - ${data.host}\n\n\`\`\`\n${data.output}\n\`\`\``);
|
|
40
|
+
}
|
|
41
|
+
case "datasets": {
|
|
42
|
+
const { pool, type, recursive } = validated;
|
|
43
|
+
// Build zfs list command
|
|
44
|
+
const args = ["list"];
|
|
45
|
+
if (type) {
|
|
46
|
+
args.push("-t", type);
|
|
47
|
+
}
|
|
48
|
+
if (recursive || pool) {
|
|
49
|
+
args.push("-r");
|
|
50
|
+
}
|
|
51
|
+
if (pool) {
|
|
52
|
+
args.push(pool);
|
|
53
|
+
}
|
|
54
|
+
const output = await sshService.executeSSHCommand(hostConfig, "zfs", args);
|
|
55
|
+
return formatResponse({ host: validated.host, subaction: "datasets", output: output.trim() }, format, (data) => `## ZFS Datasets - ${data.host}\n\n\`\`\`\n${data.output}\n\`\`\``);
|
|
56
|
+
}
|
|
57
|
+
case "snapshots": {
|
|
58
|
+
const { pool, dataset, limit } = validated;
|
|
59
|
+
// Build zfs list command for snapshots
|
|
60
|
+
const args = ["list", "-t", "snapshot"];
|
|
61
|
+
// If dataset is specified, list recursively under that dataset
|
|
62
|
+
if (dataset) {
|
|
63
|
+
args.push("-r", dataset);
|
|
64
|
+
}
|
|
65
|
+
else if (pool) {
|
|
66
|
+
args.push("-r", pool);
|
|
67
|
+
}
|
|
68
|
+
let output = await sshService.executeSSHCommand(hostConfig, "zfs", args);
|
|
69
|
+
// Apply limit if specified
|
|
70
|
+
if (limit !== undefined) {
|
|
71
|
+
const lines = output.split("\n");
|
|
72
|
+
const header = lines[0] || "";
|
|
73
|
+
const snapshotLines = lines.slice(1, limit + 1);
|
|
74
|
+
output = [header, ...snapshotLines].join("\n");
|
|
75
|
+
}
|
|
76
|
+
return formatResponse({ host: validated.host, subaction: "snapshots", output: output.trim() }, format, (data) => `## ZFS Snapshots - ${data.host}\n\n\`\`\`\n${data.output}\n\`\`\``);
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
throw createExhaustiveError(validated, "zfs subaction");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=scout-zfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout-zfs.js","sourceRoot":"","sources":["../../../src/tools/handlers/scout-zfs.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,7 +1,37 @@
|
|
|
1
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { ServiceContainer } from "../services/container.js";
|
|
3
3
|
/**
|
|
4
|
-
* Register
|
|
4
|
+
* Register all tools with the MCP server using the ToolRegistry pattern
|
|
5
|
+
*
|
|
6
|
+
* Uses the registry pattern to enable plugin-style tool additions without
|
|
7
|
+
* modifying this file. To add a new tool:
|
|
8
|
+
*
|
|
9
|
+
* 1. Create a ToolDefinition (see src/tools/registry.ts)
|
|
10
|
+
* 2. Import your tool definition here
|
|
11
|
+
* 3. Call registry.register(YourTool)
|
|
12
|
+
*
|
|
13
|
+
* @param server - MCP server instance
|
|
14
|
+
* @param container - Service container for dependency injection
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Add custom tool
|
|
19
|
+
* import { MyCustomTool } from "./definitions/my-custom-tool.js";
|
|
20
|
+
*
|
|
21
|
+
* export function registerTools(server: McpServer, container?: ServiceContainer) {
|
|
22
|
+
* if (!container) {
|
|
23
|
+
* throw new Error("ServiceContainer is required for tool registration");
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* const registry = new ToolRegistry(container);
|
|
27
|
+
* registry.register(FluxTool);
|
|
28
|
+
* registry.register(ScoutTool);
|
|
29
|
+
* registry.register(MyCustomTool); // Add your tool here
|
|
30
|
+
* registry.registerAll(server);
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
5
33
|
*/
|
|
6
34
|
export declare function registerTools(server: McpServer, container?: ServiceContainer): void;
|
|
35
|
+
export { FluxTool, ScoutTool } from "./definitions/index.js";
|
|
36
|
+
export { type ToolDefinition, ToolRegistry } from "./registry.js";
|
|
7
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAcnF;AAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,KAAK,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,43 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { FluxSchema } from '../schemas/flux/index.js';
|
|
4
|
-
import { ScoutSchema } from '../schemas/scout/index.js';
|
|
1
|
+
import { FluxTool, ScoutTool } from "./definitions/index.js";
|
|
2
|
+
import { ToolRegistry } from "./registry.js";
|
|
5
3
|
/**
|
|
6
|
-
* Register
|
|
4
|
+
* Register all tools with the MCP server using the ToolRegistry pattern
|
|
5
|
+
*
|
|
6
|
+
* Uses the registry pattern to enable plugin-style tool additions without
|
|
7
|
+
* modifying this file. To add a new tool:
|
|
8
|
+
*
|
|
9
|
+
* 1. Create a ToolDefinition (see src/tools/registry.ts)
|
|
10
|
+
* 2. Import your tool definition here
|
|
11
|
+
* 3. Call registry.register(YourTool)
|
|
12
|
+
*
|
|
13
|
+
* @param server - MCP server instance
|
|
14
|
+
* @param container - Service container for dependency injection
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Add custom tool
|
|
19
|
+
* import { MyCustomTool } from "./definitions/my-custom-tool.js";
|
|
20
|
+
*
|
|
21
|
+
* export function registerTools(server: McpServer, container?: ServiceContainer) {
|
|
22
|
+
* if (!container) {
|
|
23
|
+
* throw new Error("ServiceContainer is required for tool registration");
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* const registry = new ToolRegistry(container);
|
|
27
|
+
* registry.register(FluxTool);
|
|
28
|
+
* registry.register(ScoutTool);
|
|
29
|
+
* registry.register(MyCustomTool); // Add your tool here
|
|
30
|
+
* registry.registerAll(server);
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
7
33
|
*/
|
|
8
34
|
export function registerTools(server, container) {
|
|
9
35
|
if (!container) {
|
|
10
36
|
throw new Error("ServiceContainer is required for tool registration");
|
|
11
37
|
}
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
destructiveHint: false,
|
|
20
|
-
idempotentHint: false,
|
|
21
|
-
openWorldHint: true
|
|
22
|
-
}
|
|
23
|
-
}, async (params) => {
|
|
24
|
-
const result = await handleFluxTool(params, container);
|
|
25
|
-
return { content: [{ type: 'text', text: result }] };
|
|
26
|
-
});
|
|
27
|
-
// Register Scout tool using MCP SDK 1.25.1 API
|
|
28
|
-
server.registerTool('scout', {
|
|
29
|
-
title: 'Scout Tool',
|
|
30
|
-
description: 'SSH remote operations - file, process, and system inspection',
|
|
31
|
-
inputSchema: ScoutSchema,
|
|
32
|
-
annotations: {
|
|
33
|
-
readOnlyHint: true,
|
|
34
|
-
destructiveHint: false,
|
|
35
|
-
idempotentHint: true,
|
|
36
|
-
openWorldHint: true
|
|
37
|
-
}
|
|
38
|
-
}, async (params) => {
|
|
39
|
-
const result = await handleScoutTool(params, container);
|
|
40
|
-
return { content: [{ type: 'text', text: result }] };
|
|
41
|
-
});
|
|
38
|
+
// Create registry with service container
|
|
39
|
+
const registry = new ToolRegistry(container);
|
|
40
|
+
// Register built-in tools
|
|
41
|
+
registry.register(FluxTool);
|
|
42
|
+
registry.register(ScoutTool);
|
|
43
|
+
// Register all tools with MCP server
|
|
44
|
+
registry.registerAll(server);
|
|
42
45
|
}
|
|
46
|
+
export { FluxTool, ScoutTool } from "./definitions/index.js";
|
|
47
|
+
// Export registry and definitions for external use
|
|
48
|
+
export { ToolRegistry } from "./registry.js";
|
|
43
49
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,SAA4B;IAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;IAE7C,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAE7B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7D,mDAAmD;AACnD,OAAO,EAAuB,YAAY,EAAE,MAAM,eAAe,CAAC"}
|