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 @@
|
|
|
1
|
+
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../../src/formatters/scout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,IAAY,EACZ,SAAkB;IAElB,MAAM,KAAK,GAAG;QACZ,cAAc,IAAI,IAAI,IAAI,EAAE;QAC5B,SAAS,WAAW,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACrE,EAAE;QACF,KAAK;QACL,OAAO;QACP,KAAK;KACN,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;IACjF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACjE,OAAO,gBAAgB,CACrB,CAAC,sBAAsB,IAAI,IAAI,IAAI,EAAE,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAChG,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,KAAa;IAEb,OAAO,gBAAgB,CACrB,CAAC,mBAAmB,IAAI,IAAI,IAAI,EAAE,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,MAAc,EACd,QAAgB;IAEhB,MAAM,YAAY,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEhD,OAAO,gBAAgB,CACrB;QACE,GAAG,YAAY,uBAAuB,IAAI,IAAI,IAAI,EAAE;QACpD,SAAS,QAAQ,EAAE;QACnB,YAAY,EAAE;QACd,EAAE;QACF,kBAAkB,OAAO,IAAI;QAC7B,aAAa,QAAQ,EAAE;QACvB,EAAE;QACF,aAAa;QACb,KAAK;QACL,MAAM;QACN,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,OAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE1D,OAAO,gBAAgB,CACrB;QACE,iBAAiB,IAAI,IAAI,IAAI,EAAE;QAC/B,YAAY,OAAO,eAAe,KAAK,CAAC,MAAM,EAAE;QAChD,EAAE;QACF,kBAAkB,OAAO,IAAI;QAC7B,gBAAgB,KAAK,CAAC,MAAM,QAAQ;QACpC,EAAE;QACF,KAAK;QACL,OAAO;QACP,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,gBAAwB,EACxB,OAAgB;IAEhB,MAAM,KAAK,GAAG;QACZ,wBAAwB;QACxB,SAAS,UAAU,UAAU,UAAU,YAAY,WAAW,CAAC,gBAAgB,CAAC,EAAE;QAClF,EAAE;QACF,aAAa,UAAU,IAAI,UAAU,EAAE;QACvC,WAAW,UAAU,IAAI,UAAU,EAAE;QACrC,aAAa,WAAW,CAAC,gBAAgB,CAAC,EAAE;KAC7C,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAa,EACb,KAAa,EACb,KAAa,EACb,KAAa,EACb,IAAY;IAEZ,OAAO,gBAAgB,CACrB;QACE,WAAW;QACX,WAAW,KAAK,IAAI,KAAK,cAAc,KAAK,IAAI,KAAK,EAAE;QACvD,EAAE;QACF,eAAe,KAAK,IAAI,KAAK,EAAE;QAC/B,eAAe,KAAK,IAAI,KAAK,EAAE;QAC/B,EAAE;QACF,SAAS;QACT,IAAI;QACJ,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAe;IACtD,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAEpF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IAErF,OAAO,gBAAgB,CACrB;QACE,oBAAoB,IAAI,EAAE;QAC1B,cAAc,YAAY,EAAE;QAC5B,YAAY,EAAE;QACd,EAAE;QACF,KAAK;QACL,SAAS;QACT,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IAEhF,uCAAuC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG;QAClB,eAAe,IAAI,EAAE;QACrB,gBAAgB,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACnD,YAAY,EAAE;QACd,EAAE;QACF,KAAK;QACL,SAAS;QACT,KAAK;KACN,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAY,EACZ,cAAsB,EACtB,IAAY,EACZ,UAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjC,MAAM,WAAW,GAAG;QAClB,WAAW,IAAI,EAAE;QACjB,oBAAoB,cAAc,gBAAgB,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9G,YAAY,EAAE;QACd,EAAE;QACF,KAAK;QACL,IAAI;QACJ,KAAK;KACN,CAAC;IAEF,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAAY,EACZ,cAAsB,EACtB,IAAY,EACZ,UAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjC,MAAM,WAAW,GAAG;QAClB,YAAY,IAAI,EAAE;QAClB,oBAAoB,cAAc,gBAAgB,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9G,YAAY,EAAE;QACd,EAAE;QACF,KAAK;QACL,IAAI;QACJ,KAAK;KACN,CAAC;IAEF,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAY,EACZ,cAAsB,EACtB,IAAY,EACZ,UAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjC,MAAM,WAAW,GAAG;QAClB,UAAU,IAAI,EAAE;QAChB,oBAAoB,cAAc,gBAAgB,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9G,YAAY,EAAE;QACd,EAAE;QACF,KAAK;QACL,IAAI;QACJ,KAAK;KACN,CAAC;IAEF,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,cAAsB,EACtB,IAAY,EACZ,UAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjC,MAAM,WAAW,GAAG;QAClB,cAAc,IAAI,EAAE;QACpB,oBAAoB,cAAc,gBAAgB,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9G,YAAY,EAAE;QACd,EAAE;QACF,KAAK;QACL,IAAI;QACJ,KAAK;KACN,CAAC;IAEF,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAE,KAAa;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;IAChD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;IAEnC,uCAAuC;IACvC,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,MAAM,GAAG,GAAG,CAAC;QACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,GAAG,GAAG,CAAC;aACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,MAAM,GAAG,GAAG,CAAC;aACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvF,MAAM,GAAG,GAAG,CAAC;QACf,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,cAAc,IAAI,EAAE;QACpB,UAAU,SAAS,EAAE;QACrB,EAAE;QACF,KAAK;QACL,GAAG,cAAc;QACjB,KAAK;KACN,CAAC;IAEF,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAAY,EAAE,QAAgB;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;IACnD,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;IAEzC,8BAA8B;IAC9B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,wCAAwC;YACxC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC5D,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;oBACtB,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,iBAAiB,IAAI,EAAE;QACvB,aAAa,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACrD,EAAE;QACF,KAAK;QACL,QAAQ;QACR,KAAK;KACN,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAAY,EAAE,SAAiB;IAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;IACpD,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC;IAE3C,MAAM,WAAW,GAAG;QAClB,kBAAkB,IAAI,EAAE;QACxB,cAAc,aAAa,EAAE;QAC7B,EAAE;QACF,KAAK;QACL,SAAS;QACT,KAAK;KACN,CAAC;IAEF,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,WAAW,GAA2B;QAC1C,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI,IAAI,CAAC;QACZ,CAAC,EAAE,IAAI,IAAI,CAAC;QACZ,CAAC,EAAE,IAAI,IAAI,CAAC;QACZ,CAAC,EAAE,IAAI,IAAI,CAAC;QACZ,CAAC,EAAE,IAAI,IAAI,CAAC;QACZ,CAAC,EAAE,IAAI,IAAI,CAAC;KACb,CAAC;IACF,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting strategy pattern
|
|
3
|
+
*
|
|
4
|
+
* Provides abstraction for output formatting, enabling support for multiple
|
|
5
|
+
* formats (markdown, JSON) without modifying handler code.
|
|
6
|
+
*
|
|
7
|
+
* To add a new format:
|
|
8
|
+
* 1. Implement IFormatter interface
|
|
9
|
+
* 2. Add format type to createFormatter function signature
|
|
10
|
+
* 3. Add case in createFormatter() switch statement
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const formatter = createFormatter('json');
|
|
15
|
+
* const output = formatter.format(data);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Options for controlling formatting behavior
|
|
20
|
+
*/
|
|
21
|
+
export interface FormatterOptions {
|
|
22
|
+
/** Use compact output (no indentation). Defaults to true for JSON, false for Markdown. */
|
|
23
|
+
compact?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Formatter interface - implement this to add new output formats
|
|
27
|
+
*/
|
|
28
|
+
export interface IFormatter {
|
|
29
|
+
/**
|
|
30
|
+
* Format data for output
|
|
31
|
+
* @param data - Data to format (any serializable type)
|
|
32
|
+
* @returns Formatted string ready for output
|
|
33
|
+
*/
|
|
34
|
+
format(data: unknown): string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Markdown formatter - wraps existing markdown formatting functions
|
|
38
|
+
*
|
|
39
|
+
* This is the default formatter and maintains backward compatibility
|
|
40
|
+
* with existing markdown formatting behavior.
|
|
41
|
+
*/
|
|
42
|
+
export declare class MarkdownFormatter implements IFormatter {
|
|
43
|
+
private readonly indent;
|
|
44
|
+
constructor(options?: FormatterOptions);
|
|
45
|
+
/**
|
|
46
|
+
* Format data as markdown
|
|
47
|
+
*
|
|
48
|
+
* If data is already a string (from existing formatters), return as-is.
|
|
49
|
+
* Otherwise, serialize as JSON within a code block.
|
|
50
|
+
*
|
|
51
|
+
* @param data - Data to format
|
|
52
|
+
* @returns Markdown formatted string
|
|
53
|
+
*/
|
|
54
|
+
format(data: unknown): string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* JSON formatter - outputs data as JSON
|
|
58
|
+
*
|
|
59
|
+
* Useful for programmatic consumption, API responses, or integration
|
|
60
|
+
* with other tools. Defaults to compact output (no indentation) for
|
|
61
|
+
* lower CPU and payload overhead.
|
|
62
|
+
*/
|
|
63
|
+
export declare class JSONFormatter implements IFormatter {
|
|
64
|
+
private readonly indent;
|
|
65
|
+
constructor(options?: FormatterOptions);
|
|
66
|
+
/**
|
|
67
|
+
* Format data as JSON
|
|
68
|
+
*
|
|
69
|
+
* If data is already a string (from markdown formatters), wrap in object.
|
|
70
|
+
* Otherwise, serialize directly as JSON.
|
|
71
|
+
*
|
|
72
|
+
* @param data - Data to format
|
|
73
|
+
* @returns JSON formatted string
|
|
74
|
+
*/
|
|
75
|
+
format(data: unknown): string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create formatter for specified format
|
|
79
|
+
*
|
|
80
|
+
* Factory function that creates formatters based on format type.
|
|
81
|
+
* Provides extension point for adding new formats.
|
|
82
|
+
*
|
|
83
|
+
* @param format - Format type ('markdown' or 'json')
|
|
84
|
+
* @param options - Formatting options (compact mode, etc.)
|
|
85
|
+
* @returns Formatter instance
|
|
86
|
+
* @throws {Error} If format is not supported
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* const formatter = createFormatter('json');
|
|
91
|
+
* const output = formatter.format({ key: 'value' });
|
|
92
|
+
* // Pretty-print explicitly:
|
|
93
|
+
* const pretty = createFormatter('json', { compact: false });
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function createFormatter(format: "markdown" | "json", options?: FormatterOptions): IFormatter;
|
|
97
|
+
/**
|
|
98
|
+
* @deprecated Use createFormatter() instead. This class will be removed in a future version.
|
|
99
|
+
* Factory for creating formatters based on format type (backward compatibility wrapper)
|
|
100
|
+
*/
|
|
101
|
+
export declare const FormatterFactory: {
|
|
102
|
+
/** @deprecated Use createFormatter() instead */
|
|
103
|
+
readonly create: typeof createFormatter;
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../src/formatters/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,UAAU;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,CAAC,EAAE,gBAAgB;IAKtC;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;CAS9B;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,CAAC,EAAE,gBAAgB;IAKtC;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;CAU9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,GAAG,MAAM,EAC3B,OAAO,CAAC,EAAE,gBAAgB,GACzB,UAAU,CAYZ;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;IAC3B,gDAAgD;;CAExC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting strategy pattern
|
|
3
|
+
*
|
|
4
|
+
* Provides abstraction for output formatting, enabling support for multiple
|
|
5
|
+
* formats (markdown, JSON) without modifying handler code.
|
|
6
|
+
*
|
|
7
|
+
* To add a new format:
|
|
8
|
+
* 1. Implement IFormatter interface
|
|
9
|
+
* 2. Add format type to createFormatter function signature
|
|
10
|
+
* 3. Add case in createFormatter() switch statement
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const formatter = createFormatter('json');
|
|
15
|
+
* const output = formatter.format(data);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Markdown formatter - wraps existing markdown formatting functions
|
|
20
|
+
*
|
|
21
|
+
* This is the default formatter and maintains backward compatibility
|
|
22
|
+
* with existing markdown formatting behavior.
|
|
23
|
+
*/
|
|
24
|
+
export class MarkdownFormatter {
|
|
25
|
+
indent;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
// Markdown code blocks default to pretty-print for readability
|
|
28
|
+
this.indent = options?.compact ? undefined : 2;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format data as markdown
|
|
32
|
+
*
|
|
33
|
+
* If data is already a string (from existing formatters), return as-is.
|
|
34
|
+
* Otherwise, serialize as JSON within a code block.
|
|
35
|
+
*
|
|
36
|
+
* @param data - Data to format
|
|
37
|
+
* @returns Markdown formatted string
|
|
38
|
+
*/
|
|
39
|
+
format(data) {
|
|
40
|
+
// If data is already a formatted markdown string from existing formatters, return as-is
|
|
41
|
+
if (typeof data === "string") {
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
// For non-string data, serialize as JSON within markdown code block
|
|
45
|
+
return `\`\`\`json\n${JSON.stringify(data, null, this.indent)}\n\`\`\``;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* JSON formatter - outputs data as JSON
|
|
50
|
+
*
|
|
51
|
+
* Useful for programmatic consumption, API responses, or integration
|
|
52
|
+
* with other tools. Defaults to compact output (no indentation) for
|
|
53
|
+
* lower CPU and payload overhead.
|
|
54
|
+
*/
|
|
55
|
+
export class JSONFormatter {
|
|
56
|
+
indent;
|
|
57
|
+
constructor(options) {
|
|
58
|
+
// Default to compact (no indentation) for performance
|
|
59
|
+
this.indent = options?.compact === false ? 2 : undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format data as JSON
|
|
63
|
+
*
|
|
64
|
+
* If data is already a string (from markdown formatters), wrap in object.
|
|
65
|
+
* Otherwise, serialize directly as JSON.
|
|
66
|
+
*
|
|
67
|
+
* @param data - Data to format
|
|
68
|
+
* @returns JSON formatted string
|
|
69
|
+
*/
|
|
70
|
+
format(data) {
|
|
71
|
+
// If data is already a formatted string from markdown formatters,
|
|
72
|
+
// wrap it in a structured object for JSON consumers
|
|
73
|
+
if (typeof data === "string") {
|
|
74
|
+
return JSON.stringify({ output: data, format: "text" }, null, this.indent);
|
|
75
|
+
}
|
|
76
|
+
// For structured data, serialize directly
|
|
77
|
+
return JSON.stringify(data, null, this.indent);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create formatter for specified format
|
|
82
|
+
*
|
|
83
|
+
* Factory function that creates formatters based on format type.
|
|
84
|
+
* Provides extension point for adding new formats.
|
|
85
|
+
*
|
|
86
|
+
* @param format - Format type ('markdown' or 'json')
|
|
87
|
+
* @param options - Formatting options (compact mode, etc.)
|
|
88
|
+
* @returns Formatter instance
|
|
89
|
+
* @throws {Error} If format is not supported
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const formatter = createFormatter('json');
|
|
94
|
+
* const output = formatter.format({ key: 'value' });
|
|
95
|
+
* // Pretty-print explicitly:
|
|
96
|
+
* const pretty = createFormatter('json', { compact: false });
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export function createFormatter(format, options) {
|
|
100
|
+
switch (format) {
|
|
101
|
+
case "markdown":
|
|
102
|
+
return new MarkdownFormatter(options);
|
|
103
|
+
case "json":
|
|
104
|
+
return new JSONFormatter(options);
|
|
105
|
+
default: {
|
|
106
|
+
// Exhaustive check - TypeScript ensures all formats are handled
|
|
107
|
+
const exhaustiveCheck = format;
|
|
108
|
+
throw new Error(`Unsupported format: ${exhaustiveCheck}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @deprecated Use createFormatter() instead. This class will be removed in a future version.
|
|
114
|
+
* Factory for creating formatters based on format type (backward compatibility wrapper)
|
|
115
|
+
*/
|
|
116
|
+
export const FormatterFactory = {
|
|
117
|
+
/** @deprecated Use createFormatter() instead */
|
|
118
|
+
create: createFormatter,
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../src/formatters/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsBH;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAqB;IAE5C,YAAY,OAA0B;QACpC,+DAA+D;QAC/D,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAa;QAClB,wFAAwF;QACxF,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oEAAoE;QACpE,OAAO,eAAe,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAC1E,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACP,MAAM,CAAqB;IAE5C,YAAY,OAA0B;QACpC,sDAAsD;QACtD,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAa;QAClB,kEAAkE;QAClE,oDAAoD;QACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7E,CAAC;QAED,0CAA0C;QAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA2B,EAC3B,OAA0B;IAE1B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,KAAK,MAAM;YACT,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC;YACR,gEAAgE;YAChE,MAAM,eAAe,GAAU,MAAM,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,eAAe,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gDAAgD;IAChD,MAAM,EAAE,eAAe;CACf,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared formatting utilities for safe data transformation and display
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Truncate text if it exceeds CHARACTER_LIMIT.
|
|
6
|
+
*
|
|
7
|
+
* Ensures output stays within bounds while preserving readability by adding
|
|
8
|
+
* a clear truncation notice.
|
|
9
|
+
*
|
|
10
|
+
* @param text - Text to potentially truncate
|
|
11
|
+
* @returns Original text if within limit, otherwise truncated text with notice
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* truncateIfNeeded("short text"); // returns "short text"
|
|
16
|
+
* truncateIfNeeded(veryLongText); // returns truncated with "... [Output truncated...]"
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function truncateIfNeeded(text: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Safely format data with fallback for null/undefined and error handling.
|
|
22
|
+
*
|
|
23
|
+
* Wraps formatter functions to gracefully handle null/undefined inputs and
|
|
24
|
+
* catch formatting errors, ensuring output never fails catastrophically.
|
|
25
|
+
*
|
|
26
|
+
* @template T - Type of data being formatted
|
|
27
|
+
* @param data - Data to format (may be null/undefined)
|
|
28
|
+
* @param formatter - Pure function that transforms data to string
|
|
29
|
+
* @param fallback - String to return for null/undefined (default: "—")
|
|
30
|
+
* @returns Formatted string, fallback for null/undefined, or error symbol on exception
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // Handle null/undefined
|
|
35
|
+
* formatSafely(null, (x) => `Value: ${x}`); // returns "—"
|
|
36
|
+
* formatSafely(undefined, (x) => `Value: ${x}`, "N/A"); // returns "N/A"
|
|
37
|
+
*
|
|
38
|
+
* // Format valid data
|
|
39
|
+
* formatSafely("test", (x) => x.toUpperCase()); // returns "TEST"
|
|
40
|
+
*
|
|
41
|
+
* // Handle formatter errors
|
|
42
|
+
* formatSafely({}, (x) => x.nonExistent.property); // returns "✗ Format error"
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatSafely<T>(data: T | null | undefined, formatter: (data: T) => string, fallback?: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get value or fallback for null/undefined.
|
|
48
|
+
*
|
|
49
|
+
* Provides consistent null-handling across the codebase using nullish
|
|
50
|
+
* coalescing. Preserves falsy values like 0, false, and empty strings.
|
|
51
|
+
*
|
|
52
|
+
* @template T - Type of value being checked
|
|
53
|
+
* @param value - Value to check for null/undefined
|
|
54
|
+
* @param fallback - String to return for null/undefined (default: "—")
|
|
55
|
+
* @returns Original value if not null/undefined, otherwise fallback
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* getValueOrFallback(null); // returns "—"
|
|
60
|
+
* getValueOrFallback(undefined); // returns "—"
|
|
61
|
+
* getValueOrFallback(0); // returns 0 (preserves falsy)
|
|
62
|
+
* getValueOrFallback(false); // returns false (preserves falsy)
|
|
63
|
+
* getValueOrFallback(""); // returns "" (preserves empty string)
|
|
64
|
+
* getValueOrFallback("test"); // returns "test"
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function getValueOrFallback<T>(value: T | null | undefined, fallback?: string): T | string;
|
|
68
|
+
/**
|
|
69
|
+
* Generate freshness timestamp for volatile data output.
|
|
70
|
+
*
|
|
71
|
+
* Per STYLE.md Section 3.6, volatile data (logs, stats, resources, uptime,
|
|
72
|
+
* discovery scans) must include a freshness timestamp to indicate when the
|
|
73
|
+
* data was captured.
|
|
74
|
+
*
|
|
75
|
+
* @param timezone - IANA timezone identifier (default: "America/New_York")
|
|
76
|
+
* @returns Formatted timestamp string: "As of (<TZ>): HH:MM:SS | MM/DD/YYYY"
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* getTimestamp(); // returns "As of (EST): 14:42:10 | 02/13/2026" or "As of (EDT): ..."
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function getTimestamp(timezone?: string): string;
|
|
84
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/formatters/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC9B,QAAQ,GAAE,MAAyB,GAClC,MAAM,CAWR;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3B,QAAQ,GAAE,MAAyB,GAClC,CAAC,GAAG,MAAM,CAEZ;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,QAAQ,SAAqB,GAAG,MAAM,CAsBlE"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared formatting utilities for safe data transformation and display
|
|
3
|
+
*/
|
|
4
|
+
import { CHARACTER_LIMIT } from "../constants.js";
|
|
5
|
+
import { logError } from "../utils/errors.js";
|
|
6
|
+
// Formatting constants
|
|
7
|
+
const DEFAULT_FALLBACK = "—";
|
|
8
|
+
const FORMAT_ERROR_SYMBOL = "✗ Format error";
|
|
9
|
+
const TRUNCATION_SUFFIX = "\n\n... [Output truncated. Use pagination or filters to reduce results.]";
|
|
10
|
+
const TRUNCATION_BUFFER = 100;
|
|
11
|
+
/**
|
|
12
|
+
* Truncate text if it exceeds CHARACTER_LIMIT.
|
|
13
|
+
*
|
|
14
|
+
* Ensures output stays within bounds while preserving readability by adding
|
|
15
|
+
* a clear truncation notice.
|
|
16
|
+
*
|
|
17
|
+
* @param text - Text to potentially truncate
|
|
18
|
+
* @returns Original text if within limit, otherwise truncated text with notice
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* truncateIfNeeded("short text"); // returns "short text"
|
|
23
|
+
* truncateIfNeeded(veryLongText); // returns truncated with "... [Output truncated...]"
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function truncateIfNeeded(text) {
|
|
27
|
+
if (text.length <= CHARACTER_LIMIT) {
|
|
28
|
+
return text;
|
|
29
|
+
}
|
|
30
|
+
const truncationPoint = CHARACTER_LIMIT - TRUNCATION_BUFFER;
|
|
31
|
+
return `${text.slice(0, truncationPoint)}${TRUNCATION_SUFFIX}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Safely format data with fallback for null/undefined and error handling.
|
|
35
|
+
*
|
|
36
|
+
* Wraps formatter functions to gracefully handle null/undefined inputs and
|
|
37
|
+
* catch formatting errors, ensuring output never fails catastrophically.
|
|
38
|
+
*
|
|
39
|
+
* @template T - Type of data being formatted
|
|
40
|
+
* @param data - Data to format (may be null/undefined)
|
|
41
|
+
* @param formatter - Pure function that transforms data to string
|
|
42
|
+
* @param fallback - String to return for null/undefined (default: "—")
|
|
43
|
+
* @returns Formatted string, fallback for null/undefined, or error symbol on exception
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* // Handle null/undefined
|
|
48
|
+
* formatSafely(null, (x) => `Value: ${x}`); // returns "—"
|
|
49
|
+
* formatSafely(undefined, (x) => `Value: ${x}`, "N/A"); // returns "N/A"
|
|
50
|
+
*
|
|
51
|
+
* // Format valid data
|
|
52
|
+
* formatSafely("test", (x) => x.toUpperCase()); // returns "TEST"
|
|
53
|
+
*
|
|
54
|
+
* // Handle formatter errors
|
|
55
|
+
* formatSafely({}, (x) => x.nonExistent.property); // returns "✗ Format error"
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export function formatSafely(data, formatter, fallback = DEFAULT_FALLBACK) {
|
|
59
|
+
if (data == null) {
|
|
60
|
+
return fallback;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
return formatter(data);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logError(error, { operation: "safeFormat" });
|
|
67
|
+
return FORMAT_ERROR_SYMBOL;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get value or fallback for null/undefined.
|
|
72
|
+
*
|
|
73
|
+
* Provides consistent null-handling across the codebase using nullish
|
|
74
|
+
* coalescing. Preserves falsy values like 0, false, and empty strings.
|
|
75
|
+
*
|
|
76
|
+
* @template T - Type of value being checked
|
|
77
|
+
* @param value - Value to check for null/undefined
|
|
78
|
+
* @param fallback - String to return for null/undefined (default: "—")
|
|
79
|
+
* @returns Original value if not null/undefined, otherwise fallback
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* getValueOrFallback(null); // returns "—"
|
|
84
|
+
* getValueOrFallback(undefined); // returns "—"
|
|
85
|
+
* getValueOrFallback(0); // returns 0 (preserves falsy)
|
|
86
|
+
* getValueOrFallback(false); // returns false (preserves falsy)
|
|
87
|
+
* getValueOrFallback(""); // returns "" (preserves empty string)
|
|
88
|
+
* getValueOrFallback("test"); // returns "test"
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export function getValueOrFallback(value, fallback = DEFAULT_FALLBACK) {
|
|
92
|
+
return value ?? fallback;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Generate freshness timestamp for volatile data output.
|
|
96
|
+
*
|
|
97
|
+
* Per STYLE.md Section 3.6, volatile data (logs, stats, resources, uptime,
|
|
98
|
+
* discovery scans) must include a freshness timestamp to indicate when the
|
|
99
|
+
* data was captured.
|
|
100
|
+
*
|
|
101
|
+
* @param timezone - IANA timezone identifier (default: "America/New_York")
|
|
102
|
+
* @returns Formatted timestamp string: "As of (<TZ>): HH:MM:SS | MM/DD/YYYY"
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* getTimestamp(); // returns "As of (EST): 14:42:10 | 02/13/2026" or "As of (EDT): ..."
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export function getTimestamp(timezone = "America/New_York") {
|
|
110
|
+
const now = new Date();
|
|
111
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
112
|
+
timeZone: timezone,
|
|
113
|
+
hour12: false,
|
|
114
|
+
hour: "2-digit",
|
|
115
|
+
minute: "2-digit",
|
|
116
|
+
second: "2-digit",
|
|
117
|
+
month: "2-digit",
|
|
118
|
+
day: "2-digit",
|
|
119
|
+
year: "numeric",
|
|
120
|
+
timeZoneName: "short",
|
|
121
|
+
});
|
|
122
|
+
const parts = formatter.formatToParts(now);
|
|
123
|
+
const getPart = (type) => parts.find((p) => p.type === type)?.value || "";
|
|
124
|
+
const time = `${getPart("hour")}:${getPart("minute")}:${getPart("second")}`;
|
|
125
|
+
const date = `${getPart("month")}/${getPart("day")}/${getPart("year")}`;
|
|
126
|
+
const label = getPart("timeZoneName") || timezone;
|
|
127
|
+
return `As of (${label}): ${time} | ${date}`;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/formatters/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,uBAAuB;AACvB,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAC7C,MAAM,iBAAiB,GACrB,0EAA0E,CAAC;AAC7E,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,eAAe,GAAG,iBAAiB,CAAC;IAC5D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,iBAAiB,EAAE,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,YAAY,CAC1B,IAA0B,EAC1B,SAA8B,EAC9B,WAAmB,gBAAgB;IAEnC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA2B,EAC3B,WAAmB,gBAAgB;IAEnC,OAAO,KAAK,IAAI,QAAQ,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,QAAQ,GAAG,kBAAkB;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACjD,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,YAAY,EAAE,OAAO;KACtB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAElF,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5E,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC;IAElD,OAAO,UAAU,KAAK,MAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { NextFunction, Request, Response } from "express";
|
|
2
|
+
import rateLimit from "express-rate-limit";
|
|
3
|
+
/**
|
|
4
|
+
* Determine whether an MCP request body represents a destructive operation.
|
|
5
|
+
*
|
|
6
|
+
* Inspects the JSON-RPC payload for `tools/call` method and checks whether
|
|
7
|
+
* the tool arguments indicate a destructive subaction.
|
|
8
|
+
*
|
|
9
|
+
* @param body - Parsed JSON-RPC request body
|
|
10
|
+
* @returns true if the operation is destructive
|
|
11
|
+
*/
|
|
12
|
+
export declare function isDestructiveOperation(body: unknown): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a rate limiter middleware for the health endpoint.
|
|
15
|
+
*
|
|
16
|
+
* Health endpoints should be accessible for monitoring but protected from DDoS.
|
|
17
|
+
* Default: 30 requests per 60 seconds per IP.
|
|
18
|
+
*
|
|
19
|
+
* @returns Express rate limiter middleware
|
|
20
|
+
*/
|
|
21
|
+
export declare function createHealthRateLimiter(): ReturnType<typeof rateLimit>;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a rate limiter middleware for the MCP endpoint.
|
|
24
|
+
*
|
|
25
|
+
* Protects against DoS attacks on the MCP endpoint which can trigger
|
|
26
|
+
* expensive operations (SSH commands, Docker API calls, filesystem scans).
|
|
27
|
+
*
|
|
28
|
+
* CWE-770: Allocation of Resources Without Limits or Throttling
|
|
29
|
+
* CVSS 7.5 (High) - DoS vulnerability if unprotected
|
|
30
|
+
*
|
|
31
|
+
* Default: 60 requests per 60 seconds per IP (general operations)
|
|
32
|
+
*
|
|
33
|
+
* @returns Express rate limiter middleware
|
|
34
|
+
*/
|
|
35
|
+
export declare function createMcpRateLimiter(): ReturnType<typeof rateLimit>;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a stricter rate limiter for destructive MCP operations.
|
|
38
|
+
*
|
|
39
|
+
* Destructive operations (prune, remove, down, exec, etc.) are expensive
|
|
40
|
+
* and potentially dangerous. This limiter is tighter than the general MCP limiter:
|
|
41
|
+
* 10 requests per 60 seconds per IP.
|
|
42
|
+
*
|
|
43
|
+
* Applied conditionally via createDestructiveRateLimitMiddleware.
|
|
44
|
+
*
|
|
45
|
+
* @returns Express rate limiter middleware
|
|
46
|
+
*/
|
|
47
|
+
export declare function createDestructiveOperationRateLimiter(): ReturnType<typeof rateLimit>;
|
|
48
|
+
/**
|
|
49
|
+
* Creates middleware that conditionally applies destructive rate limiting.
|
|
50
|
+
*
|
|
51
|
+
* Inspects each MCP request body to determine if it's a destructive operation.
|
|
52
|
+
* If so, applies the stricter destructive rate limiter (10 req/min/IP).
|
|
53
|
+
* Non-destructive requests pass through without additional limiting
|
|
54
|
+
* (they are still subject to the general 60 req/min/IP MCP limiter).
|
|
55
|
+
*
|
|
56
|
+
* @returns Express middleware
|
|
57
|
+
*/
|
|
58
|
+
export declare function createDestructiveRateLimitMiddleware(): (req: Request, res: Response, next: NextFunction) => void;
|
|
59
|
+
//# sourceMappingURL=health-rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-rate-limiter.d.ts","sourceRoot":"","sources":["../src/health-rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,SAAS,MAAM,oBAAoB,CAAC;AA+B3C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CA8B7D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAAC,OAAO,SAAS,CAAC,CAYtE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,CAAC,OAAO,SAAS,CAAC,CAYnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qCAAqC,IAAI,UAAU,CAAC,OAAO,SAAS,CAAC,CAYpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,oCAAoC,IAAI,CACtD,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,IAAI,CAUR"}
|