@senpi/trading-runtime 1.0.0
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 +117 -0
- package/dist/actions/decision-engine.d.ts +28 -0
- package/dist/actions/decision-engine.d.ts.map +1 -0
- package/dist/actions/decision-engine.js +65 -0
- package/dist/actions/decision-engine.js.map +1 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +12 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.js +74 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -0
- package/dist/actions/llm-decision/factory.d.ts +17 -0
- package/dist/actions/llm-decision/factory.d.ts.map +1 -0
- package/dist/actions/llm-decision/factory.js +29 -0
- package/dist/actions/llm-decision/factory.js.map +1 -0
- package/dist/actions/llm-decision/index.d.ts +8 -0
- package/dist/actions/llm-decision/index.d.ts.map +1 -0
- package/dist/actions/llm-decision/index.js +5 -0
- package/dist/actions/llm-decision/index.js.map +1 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +14 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.js +58 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -0
- package/dist/actions/llm-decision/shared.d.ts +41 -0
- package/dist/actions/llm-decision/shared.d.ts.map +1 -0
- package/dist/actions/llm-decision/shared.js +117 -0
- package/dist/actions/llm-decision/shared.js.map +1 -0
- package/dist/actions/open-position/open-position.action.d.ts +15 -0
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -0
- package/dist/actions/open-position/open-position.action.js +302 -0
- package/dist/actions/open-position/open-position.action.js.map +1 -0
- package/dist/actions/types.d.ts +123 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +3 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/cli/guide-commands.d.ts +26 -0
- package/dist/cli/guide-commands.d.ts.map +1 -0
- package/dist/cli/guide-commands.js +332 -0
- package/dist/cli/guide-commands.js.map +1 -0
- package/dist/cli/senpi-commands.d.ts +22 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -0
- package/dist/cli/senpi-commands.js +138 -0
- package/dist/cli/senpi-commands.js.map +1 -0
- package/dist/constants/dsl/index.d.ts +39 -0
- package/dist/constants/dsl/index.d.ts.map +1 -0
- package/dist/constants/dsl/index.js +39 -0
- package/dist/constants/dsl/index.js.map +1 -0
- package/dist/context/context-builder.d.ts +14 -0
- package/dist/context/context-builder.d.ts.map +1 -0
- package/dist/context/context-builder.js +36 -0
- package/dist/context/context-builder.js.map +1 -0
- package/dist/context/index.d.ts +5 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +5 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/interpolate.d.ts +6 -0
- package/dist/context/interpolate.d.ts.map +1 -0
- package/dist/context/interpolate.js +15 -0
- package/dist/context/interpolate.js.map +1 -0
- package/dist/context/providers/asset-trend.provider.d.ts +42 -0
- package/dist/context/providers/asset-trend.provider.d.ts.map +1 -0
- package/dist/context/providers/asset-trend.provider.js +94 -0
- package/dist/context/providers/asset-trend.provider.js.map +1 -0
- package/dist/context/providers/index.d.ts +5 -0
- package/dist/context/providers/index.d.ts.map +1 -0
- package/dist/context/providers/index.js +5 -0
- package/dist/context/providers/index.js.map +1 -0
- package/dist/context/providers/regime.provider.d.ts +14 -0
- package/dist/context/providers/regime.provider.d.ts.map +1 -0
- package/dist/context/providers/regime.provider.js +29 -0
- package/dist/context/providers/regime.provider.js.map +1 -0
- package/dist/context/providers/signal.provider.d.ts +11 -0
- package/dist/context/providers/signal.provider.d.ts.map +1 -0
- package/dist/context/providers/signal.provider.js +27 -0
- package/dist/context/providers/signal.provider.js.map +1 -0
- package/dist/context/providers/strategy.provider.d.ts +14 -0
- package/dist/context/providers/strategy.provider.d.ts.map +1 -0
- package/dist/context/providers/strategy.provider.js +68 -0
- package/dist/context/providers/strategy.provider.js.map +1 -0
- package/dist/context/types.d.ts +30 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +2 -0
- package/dist/context/types.js.map +1 -0
- package/dist/dsl/config/index.d.ts +43 -0
- package/dist/dsl/config/index.d.ts.map +1 -0
- package/dist/dsl/config/index.js +108 -0
- package/dist/dsl/config/index.js.map +1 -0
- package/dist/dsl/constants/index.d.ts +3 -0
- package/dist/dsl/constants/index.d.ts.map +1 -0
- package/dist/dsl/constants/index.js +3 -0
- package/dist/dsl/constants/index.js.map +1 -0
- package/dist/dsl/engine/index.d.ts +7 -0
- package/dist/dsl/engine/index.d.ts.map +1 -0
- package/dist/dsl/engine/index.js +123 -0
- package/dist/dsl/engine/index.js.map +1 -0
- package/dist/dsl/events/bus-types.d.ts +7 -0
- package/dist/dsl/events/bus-types.d.ts.map +1 -0
- package/dist/dsl/events/bus-types.js +6 -0
- package/dist/dsl/events/bus-types.js.map +1 -0
- package/dist/dsl/events/guards.d.ts +17 -0
- package/dist/dsl/events/guards.d.ts.map +1 -0
- package/dist/dsl/events/guards.js +94 -0
- package/dist/dsl/events/guards.js.map +1 -0
- package/dist/dsl/events/handlers.d.ts +15 -0
- package/dist/dsl/events/handlers.d.ts.map +1 -0
- package/dist/dsl/events/handlers.js +229 -0
- package/dist/dsl/events/handlers.js.map +1 -0
- package/dist/dsl/events/index.d.ts +4 -0
- package/dist/dsl/events/index.d.ts.map +1 -0
- package/dist/dsl/events/index.js +4 -0
- package/dist/dsl/events/index.js.map +1 -0
- package/dist/dsl/index.d.ts +13 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +35 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/monitor/index.d.ts +18 -0
- package/dist/dsl/monitor/index.d.ts.map +1 -0
- package/dist/dsl/monitor/index.js +296 -0
- package/dist/dsl/monitor/index.js.map +1 -0
- package/dist/dsl/plugin/index.d.ts +29 -0
- package/dist/dsl/plugin/index.d.ts.map +1 -0
- package/dist/dsl/plugin/index.js +85 -0
- package/dist/dsl/plugin/index.js.map +1 -0
- package/dist/dsl/types/index.d.ts +3 -0
- package/dist/dsl/types/index.d.ts.map +1 -0
- package/dist/dsl/types/index.js +3 -0
- package/dist/dsl/types/index.js.map +1 -0
- package/dist/health/index.d.ts +9 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +9 -0
- package/dist/health/index.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -0
- package/dist/risk/index.d.ts +9 -0
- package/dist/risk/index.d.ts.map +1 -0
- package/dist/risk/index.js +9 -0
- package/dist/risk/index.js.map +1 -0
- package/dist/runtime/action-registry.d.ts +12 -0
- package/dist/runtime/action-registry.d.ts.map +1 -0
- package/dist/runtime/action-registry.js +18 -0
- package/dist/runtime/action-registry.js.map +1 -0
- package/dist/runtime/build-action-scan-payload.d.ts +20 -0
- package/dist/runtime/build-action-scan-payload.d.ts.map +1 -0
- package/dist/runtime/build-action-scan-payload.js +52 -0
- package/dist/runtime/build-action-scan-payload.js.map +1 -0
- package/dist/runtime/bus.d.ts +6 -0
- package/dist/runtime/bus.d.ts.map +1 -0
- package/dist/runtime/bus.js +19 -0
- package/dist/runtime/bus.js.map +1 -0
- package/dist/runtime/create-action-context.d.ts +34 -0
- package/dist/runtime/create-action-context.d.ts.map +1 -0
- package/dist/runtime/create-action-context.js +22 -0
- package/dist/runtime/create-action-context.js.map +1 -0
- package/dist/runtime/create-actions.d.ts +30 -0
- package/dist/runtime/create-actions.d.ts.map +1 -0
- package/dist/runtime/create-actions.js +78 -0
- package/dist/runtime/create-actions.js.map +1 -0
- package/dist/runtime/create-runtime-context.d.ts +33 -0
- package/dist/runtime/create-runtime-context.d.ts.map +1 -0
- package/dist/runtime/create-runtime-context.js +32 -0
- package/dist/runtime/create-runtime-context.js.map +1 -0
- package/dist/runtime/create-scanner-module.d.ts +14 -0
- package/dist/runtime/create-scanner-module.d.ts.map +1 -0
- package/dist/runtime/create-scanner-module.js +26 -0
- package/dist/runtime/create-scanner-module.js.map +1 -0
- package/dist/runtime/create-scanner-providers-for-run.d.ts +20 -0
- package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -0
- package/dist/runtime/create-scanner-providers-for-run.js +34 -0
- package/dist/runtime/create-scanner-providers-for-run.js.map +1 -0
- package/dist/runtime/default-state-dir.d.ts +10 -0
- package/dist/runtime/default-state-dir.d.ts.map +1 -0
- package/dist/runtime/default-state-dir.js +22 -0
- package/dist/runtime/default-state-dir.js.map +1 -0
- package/dist/runtime/env-resolve.d.ts +17 -0
- package/dist/runtime/env-resolve.d.ts.map +1 -0
- package/dist/runtime/env-resolve.js +45 -0
- package/dist/runtime/env-resolve.js.map +1 -0
- package/dist/runtime/hook-system.d.ts +7 -0
- package/dist/runtime/hook-system.d.ts.map +1 -0
- package/dist/runtime/hook-system.js +16 -0
- package/dist/runtime/hook-system.js.map +1 -0
- package/dist/runtime/index.d.ts +37 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +26 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/load-trading-strategy.d.ts +18 -0
- package/dist/runtime/load-trading-strategy.d.ts.map +1 -0
- package/dist/runtime/load-trading-strategy.js +51 -0
- package/dist/runtime/load-trading-strategy.js.map +1 -0
- package/dist/runtime/map-exit-config.d.ts +12 -0
- package/dist/runtime/map-exit-config.d.ts.map +1 -0
- package/dist/runtime/map-exit-config.js +89 -0
- package/dist/runtime/map-exit-config.js.map +1 -0
- package/dist/runtime/map-strategies-registration.d.ts +12 -0
- package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
- package/dist/runtime/map-strategies-registration.js +52 -0
- package/dist/runtime/map-strategies-registration.js.map +1 -0
- package/dist/runtime/map-strategies.d.ts +12 -0
- package/dist/runtime/map-strategies.d.ts.map +1 -0
- package/dist/runtime/map-strategies.js +46 -0
- package/dist/runtime/map-strategies.js.map +1 -0
- package/dist/runtime/notifications.d.ts +10 -0
- package/dist/runtime/notifications.d.ts.map +1 -0
- package/dist/runtime/notifications.js +14 -0
- package/dist/runtime/notifications.js.map +1 -0
- package/dist/runtime/parse-interval.d.ts +11 -0
- package/dist/runtime/parse-interval.d.ts.map +1 -0
- package/dist/runtime/parse-interval.js +35 -0
- package/dist/runtime/parse-interval.js.map +1 -0
- package/dist/runtime/reconcile-state.d.ts +25 -0
- package/dist/runtime/reconcile-state.d.ts.map +1 -0
- package/dist/runtime/reconcile-state.js +114 -0
- package/dist/runtime/reconcile-state.js.map +1 -0
- package/dist/runtime/risk-guard.d.ts +6 -0
- package/dist/runtime/risk-guard.d.ts.map +1 -0
- package/dist/runtime/risk-guard.js +14 -0
- package/dist/runtime/risk-guard.js.map +1 -0
- package/dist/runtime/run.d.ts +21 -0
- package/dist/runtime/run.d.ts.map +1 -0
- package/dist/runtime/run.js +43 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/runtime.d.ts +40 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +249 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scanner-registry.d.ts +22 -0
- package/dist/runtime/scanner-registry.d.ts.map +1 -0
- package/dist/runtime/scanner-registry.js +72 -0
- package/dist/runtime/scanner-registry.js.map +1 -0
- package/dist/runtime/strategy-registry.d.ts +49 -0
- package/dist/runtime/strategy-registry.d.ts.map +1 -0
- package/dist/runtime/strategy-registry.js +150 -0
- package/dist/runtime/strategy-registry.js.map +1 -0
- package/dist/runtime/trading-strategy-config.d.ts +6 -0
- package/dist/runtime/trading-strategy-config.d.ts.map +1 -0
- package/dist/runtime/trading-strategy-config.js +5 -0
- package/dist/runtime/trading-strategy-config.js.map +1 -0
- package/dist/runtime/trading-strategy-schema.d.ts +19757 -0
- package/dist/runtime/trading-strategy-schema.d.ts.map +1 -0
- package/dist/runtime/trading-strategy-schema.js +107 -0
- package/dist/runtime/trading-strategy-schema.js.map +1 -0
- package/dist/scanners/__tests__/fixtures/index.d.ts +3 -0
- package/dist/scanners/__tests__/fixtures/index.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/index.js +3 -0
- package/dist/scanners/__tests__/fixtures/index.js.map +1 -0
- package/dist/scanners/__tests__/fixtures/scan-results.d.ts +23 -0
- package/dist/scanners/__tests__/fixtures/scan-results.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/scan-results.js +128 -0
- package/dist/scanners/__tests__/fixtures/scan-results.js.map +1 -0
- package/dist/scanners/__tests__/fixtures/signals.d.ts +18 -0
- package/dist/scanners/__tests__/fixtures/signals.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/signals.js +84 -0
- package/dist/scanners/__tests__/fixtures/signals.js.map +1 -0
- package/dist/scanners/__tests__/test-helpers.d.ts +4 -0
- package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/scanners/__tests__/test-helpers.js +23 -0
- package/dist/scanners/__tests__/test-helpers.js.map +1 -0
- package/dist/scanners/artifacts.d.ts +119 -0
- package/dist/scanners/artifacts.d.ts.map +1 -0
- package/dist/scanners/artifacts.js +72 -0
- package/dist/scanners/artifacts.js.map +1 -0
- package/dist/scanners/create-scanner.d.ts +13 -0
- package/dist/scanners/create-scanner.d.ts.map +1 -0
- package/dist/scanners/create-scanner.js +11 -0
- package/dist/scanners/create-scanner.js.map +1 -0
- package/dist/scanners/engine/config-validator.d.ts +7 -0
- package/dist/scanners/engine/config-validator.d.ts.map +1 -0
- package/dist/scanners/engine/config-validator.js +16 -0
- package/dist/scanners/engine/config-validator.js.map +1 -0
- package/dist/scanners/engine/data-providers.d.ts +43 -0
- package/dist/scanners/engine/data-providers.d.ts.map +1 -0
- package/dist/scanners/engine/data-providers.js +8 -0
- package/dist/scanners/engine/data-providers.js.map +1 -0
- package/dist/scanners/engine/engine.d.ts +76 -0
- package/dist/scanners/engine/engine.d.ts.map +1 -0
- package/dist/scanners/engine/engine.js +399 -0
- package/dist/scanners/engine/engine.js.map +1 -0
- package/dist/scanners/engine/index.d.ts +9 -0
- package/dist/scanners/engine/index.d.ts.map +1 -0
- package/dist/scanners/engine/index.js +7 -0
- package/dist/scanners/engine/index.js.map +1 -0
- package/dist/scanners/engine/input-resolver.d.ts +21 -0
- package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
- package/dist/scanners/engine/input-resolver.js +140 -0
- package/dist/scanners/engine/input-resolver.js.map +1 -0
- package/dist/scanners/engine/lifecycle.d.ts +21 -0
- package/dist/scanners/engine/lifecycle.d.ts.map +1 -0
- package/dist/scanners/engine/lifecycle.js +2 -0
- package/dist/scanners/engine/lifecycle.js.map +1 -0
- package/dist/scanners/engine/result-builder.d.ts +30 -0
- package/dist/scanners/engine/result-builder.d.ts.map +1 -0
- package/dist/scanners/engine/result-builder.js +129 -0
- package/dist/scanners/engine/result-builder.js.map +1 -0
- package/dist/scanners/engine/strategy-registry.d.ts +45 -0
- package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
- package/dist/scanners/engine/strategy-registry.js +93 -0
- package/dist/scanners/engine/strategy-registry.js.map +1 -0
- package/dist/scanners/events.d.ts +41 -0
- package/dist/scanners/events.d.ts.map +1 -0
- package/dist/scanners/events.js +33 -0
- package/dist/scanners/events.js.map +1 -0
- package/dist/scanners/implementations/emerging-movers.d.ts +212 -0
- package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
- package/dist/scanners/implementations/emerging-movers.js +702 -0
- package/dist/scanners/implementations/emerging-movers.js.map +1 -0
- package/dist/scanners/implementations/index.d.ts +8 -0
- package/dist/scanners/implementations/index.d.ts.map +1 -0
- package/dist/scanners/implementations/index.js +8 -0
- package/dist/scanners/implementations/index.js.map +1 -0
- package/dist/scanners/implementations/indicators.d.ts +40 -0
- package/dist/scanners/implementations/indicators.d.ts.map +1 -0
- package/dist/scanners/implementations/indicators.js +114 -0
- package/dist/scanners/implementations/indicators.js.map +1 -0
- package/dist/scanners/implementations/market-regime.d.ts +52 -0
- package/dist/scanners/implementations/market-regime.d.ts.map +1 -0
- package/dist/scanners/implementations/market-regime.js +201 -0
- package/dist/scanners/implementations/market-regime.js.map +1 -0
- package/dist/scanners/implementations/momentum.d.ts +21 -0
- package/dist/scanners/implementations/momentum.d.ts.map +1 -0
- package/dist/scanners/implementations/momentum.js +128 -0
- package/dist/scanners/implementations/momentum.js.map +1 -0
- package/dist/scanners/implementations/oi-tracker.d.ts +13 -0
- package/dist/scanners/implementations/oi-tracker.d.ts.map +1 -0
- package/dist/scanners/implementations/oi-tracker.js +67 -0
- package/dist/scanners/implementations/oi-tracker.js.map +1 -0
- package/dist/scanners/implementations/opportunity.d.ts +104 -0
- package/dist/scanners/implementations/opportunity.d.ts.map +1 -0
- package/dist/scanners/implementations/opportunity.js +441 -0
- package/dist/scanners/implementations/opportunity.js.map +1 -0
- package/dist/scanners/implementations/prescreener.d.ts +20 -0
- package/dist/scanners/implementations/prescreener.d.ts.map +1 -0
- package/dist/scanners/implementations/prescreener.js +97 -0
- package/dist/scanners/implementations/prescreener.js.map +1 -0
- package/dist/scanners/implementations/sm-flip.d.ts +43 -0
- package/dist/scanners/implementations/sm-flip.d.ts.map +1 -0
- package/dist/scanners/implementations/sm-flip.js +200 -0
- package/dist/scanners/implementations/sm-flip.js.map +1 -0
- package/dist/scanners/index.d.ts +24 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +17 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/input-descriptors.d.ts +49 -0
- package/dist/scanners/input-descriptors.d.ts.map +1 -0
- package/dist/scanners/input-descriptors.js +35 -0
- package/dist/scanners/input-descriptors.js.map +1 -0
- package/dist/scanners/protocol/context.d.ts +71 -0
- package/dist/scanners/protocol/context.d.ts.map +1 -0
- package/dist/scanners/protocol/context.js +2 -0
- package/dist/scanners/protocol/context.js.map +1 -0
- package/dist/scanners/protocol/hooks.d.ts +18 -0
- package/dist/scanners/protocol/hooks.d.ts.map +1 -0
- package/dist/scanners/protocol/hooks.js +12 -0
- package/dist/scanners/protocol/hooks.js.map +1 -0
- package/dist/scanners/protocol/index.d.ts +5 -0
- package/dist/scanners/protocol/index.d.ts.map +1 -0
- package/dist/scanners/protocol/index.js +2 -0
- package/dist/scanners/protocol/index.js.map +1 -0
- package/dist/scanners/protocol/scanner.d.ts +47 -0
- package/dist/scanners/protocol/scanner.d.ts.map +1 -0
- package/dist/scanners/protocol/scanner.js +2 -0
- package/dist/scanners/protocol/scanner.js.map +1 -0
- package/dist/scanners/providers/adapter.d.ts +23 -0
- package/dist/scanners/providers/adapter.d.ts.map +1 -0
- package/dist/scanners/providers/adapter.js +227 -0
- package/dist/scanners/providers/adapter.js.map +1 -0
- package/dist/scanners/providers/cache.d.ts +20 -0
- package/dist/scanners/providers/cache.d.ts.map +1 -0
- package/dist/scanners/providers/cache.js +61 -0
- package/dist/scanners/providers/cache.js.map +1 -0
- package/dist/scanners/providers/client.d.ts +53 -0
- package/dist/scanners/providers/client.d.ts.map +1 -0
- package/dist/scanners/providers/client.js +174 -0
- package/dist/scanners/providers/client.js.map +1 -0
- package/dist/scanners/providers/factory.d.ts +42 -0
- package/dist/scanners/providers/factory.d.ts.map +1 -0
- package/dist/scanners/providers/factory.js +156 -0
- package/dist/scanners/providers/factory.js.map +1 -0
- package/dist/scanners/providers/types.d.ts +61 -0
- package/dist/scanners/providers/types.d.ts.map +1 -0
- package/dist/scanners/providers/types.js +6 -0
- package/dist/scanners/providers/types.js.map +1 -0
- package/dist/scanners/runtime-module.d.ts +54 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -0
- package/dist/scanners/runtime-module.js +94 -0
- package/dist/scanners/runtime-module.js.map +1 -0
- package/dist/scanners/scanner-definition.d.ts +58 -0
- package/dist/scanners/scanner-definition.d.ts.map +1 -0
- package/dist/scanners/scanner-definition.js +19 -0
- package/dist/scanners/scanner-definition.js.map +1 -0
- package/dist/scanners/schema-utils.d.ts +6 -0
- package/dist/scanners/schema-utils.d.ts.map +1 -0
- package/dist/scanners/schema-utils.js +14 -0
- package/dist/scanners/schema-utils.js.map +1 -0
- package/dist/scanners/score-utils.d.ts +19 -0
- package/dist/scanners/score-utils.d.ts.map +1 -0
- package/dist/scanners/score-utils.js +47 -0
- package/dist/scanners/score-utils.js.map +1 -0
- package/dist/scanners/store/fs-utils.d.ts +12 -0
- package/dist/scanners/store/fs-utils.d.ts.map +1 -0
- package/dist/scanners/store/fs-utils.js +47 -0
- package/dist/scanners/store/fs-utils.js.map +1 -0
- package/dist/scanners/store/index.d.ts +5 -0
- package/dist/scanners/store/index.d.ts.map +1 -0
- package/dist/scanners/store/index.js +5 -0
- package/dist/scanners/store/index.js.map +1 -0
- package/dist/scanners/store/runtime-store.d.ts +50 -0
- package/dist/scanners/store/runtime-store.d.ts.map +1 -0
- package/dist/scanners/store/runtime-store.js +91 -0
- package/dist/scanners/store/runtime-store.js.map +1 -0
- package/dist/scanners/store/shared-artifact-store.d.ts +31 -0
- package/dist/scanners/store/shared-artifact-store.d.ts.map +1 -0
- package/dist/scanners/store/shared-artifact-store.js +89 -0
- package/dist/scanners/store/shared-artifact-store.js.map +1 -0
- package/dist/scanners/store/signal-store.d.ts +36 -0
- package/dist/scanners/store/signal-store.d.ts.map +1 -0
- package/dist/scanners/store/signal-store.js +135 -0
- package/dist/scanners/store/signal-store.js.map +1 -0
- package/dist/scanners/types.d.ts +115 -0
- package/dist/scanners/types.d.ts.map +1 -0
- package/dist/scanners/types.js +3 -0
- package/dist/scanners/types.js.map +1 -0
- package/dist/scripts/run-dsl-standalone-live.d.ts +27 -0
- package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
- package/dist/scripts/run-dsl-standalone-live.js +207 -0
- package/dist/scripts/run-dsl-standalone-live.js.map +1 -0
- package/dist/scripts/run-dsl-standalone-mock.d.ts +13 -0
- package/dist/scripts/run-dsl-standalone-mock.d.ts.map +1 -0
- package/dist/scripts/run-dsl-standalone-mock.js +255 -0
- package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
- package/dist/senpi/client.d.ts +70 -0
- package/dist/senpi/client.d.ts.map +1 -0
- package/dist/senpi/client.js +482 -0
- package/dist/senpi/client.js.map +1 -0
- package/dist/senpi/constants.d.ts +7 -0
- package/dist/senpi/constants.d.ts.map +1 -0
- package/dist/senpi/constants.js +7 -0
- package/dist/senpi/constants.js.map +1 -0
- package/dist/senpi/index.d.ts +3 -0
- package/dist/senpi/index.d.ts.map +1 -0
- package/dist/senpi/index.js +2 -0
- package/dist/senpi/index.js.map +1 -0
- package/dist/senpi/types.d.ts +132 -0
- package/dist/senpi/types.d.ts.map +1 -0
- package/dist/senpi/types.js +3 -0
- package/dist/senpi/types.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +3 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/paths.d.ts +8 -0
- package/dist/state/paths.d.ts.map +1 -0
- package/dist/state/paths.js +19 -0
- package/dist/state/paths.js.map +1 -0
- package/dist/state/state-manager.d.ts +56 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +213 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/strategy/strategy-state.d.ts +47 -0
- package/dist/strategy/strategy-state.d.ts.map +1 -0
- package/dist/strategy/strategy-state.js +179 -0
- package/dist/strategy/strategy-state.js.map +1 -0
- package/dist/types/action.d.ts +15 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +2 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/dsl/index.d.ts +156 -0
- package/dist/types/dsl/index.d.ts.map +1 -0
- package/dist/types/dsl/index.js +5 -0
- package/dist/types/dsl/index.js.map +1 -0
- package/dist/types/event-bus.d.ts +11 -0
- package/dist/types/event-bus.d.ts.map +1 -0
- package/dist/types/event-bus.js +6 -0
- package/dist/types/event-bus.js.map +1 -0
- package/dist/types/hooks.d.ts +27 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +15 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/notification.d.ts +4 -0
- package/dist/types/notification.d.ts.map +1 -0
- package/dist/types/notification.js +3 -0
- package/dist/types/notification.js.map +1 -0
- package/dist/types/runtime.d.ts +16 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/scanner.d.ts +59 -0
- package/dist/types/scanner.d.ts.map +1 -0
- package/dist/types/scanner.js +13 -0
- package/dist/types/scanner.js.map +1 -0
- package/dist/types/strategy.d.ts +97 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +2 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/utils/logger/dsl.d.ts +8 -0
- package/dist/utils/logger/dsl.d.ts.map +1 -0
- package/dist/utils/logger/dsl.js +7 -0
- package/dist/utils/logger/dsl.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +65 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/response.d.ts +14 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +44 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/examples/.env.example +15 -0
- package/examples/README.md +75 -0
- package/examples/scanners-consumer-quickstart.mjs +134 -0
- package/examples/scanners-emerging-movers-v4.mjs +285 -0
- package/examples/scanners-live-mcp.mjs +208 -0
- package/examples/scanners-multi-strategy.mjs +165 -0
- package/examples/scanners-scheduled-events.mjs +95 -0
- package/examples/scanners-senpi-provider-client.mjs +182 -0
- package/examples/scanners-single-strategy.mjs +198 -0
- package/examples/strategies/README.md +45 -0
- package/examples/strategies/dsl-showcase.yaml +62 -0
- package/examples/strategies/fox.yaml +55 -0
- package/examples/strategies/minimal.yaml +41 -0
- package/examples/strategies/viper.yaml +63 -0
- package/examples/strategies/wolf.yaml +60 -0
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +111 -0
- package/openclaw.plugin.json +15 -0
- package/package.json +52 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { normalizeAssetCandles, normalizeInstrumentsWithDiagnostics, normalizeSmMarketsWithDiagnostics, } from "./adapter.js";
|
|
2
|
+
import { createConsoleProviderLogger, createProviderClient, createWinstonProviderLogger, } from "./client.js";
|
|
3
|
+
import { ProviderCache } from "./cache.js";
|
|
4
|
+
/** Creates a `ScannerDataProviders` bundle backed by Senpi MCP tools. */
|
|
5
|
+
export function createSenpiScannerProviders(options) {
|
|
6
|
+
const cache = new ProviderCache();
|
|
7
|
+
const logger = toProviderLogger(options.logger) ?? createConsoleProviderLogger();
|
|
8
|
+
const client = createProviderClient(options.client, {
|
|
9
|
+
logger,
|
|
10
|
+
logLevel: options.logLevel ?? "info",
|
|
11
|
+
retries: options.retries ?? 2,
|
|
12
|
+
timeoutMs: 10_000,
|
|
13
|
+
});
|
|
14
|
+
const candleIntervals = options.candleIntervals ?? ["1h", "4h"];
|
|
15
|
+
const maxCandleAssets = options.maxCandleAssets ?? 10;
|
|
16
|
+
const cacheTtl = {
|
|
17
|
+
instruments: options.cacheTtlMs?.instruments ?? 30_000,
|
|
18
|
+
smData: options.cacheTtlMs?.smData ?? 120_000,
|
|
19
|
+
candles: options.cacheTtlMs?.candles ?? 30_000,
|
|
20
|
+
};
|
|
21
|
+
const timeouts = {
|
|
22
|
+
marketListInstruments: options.timeouts?.marketListInstruments ?? 10_000,
|
|
23
|
+
marketGetAssetData: options.timeouts?.marketGetAssetData ?? 10_000,
|
|
24
|
+
leaderboardGetMarkets: options.timeouts?.leaderboardGetMarkets ?? 8_000,
|
|
25
|
+
};
|
|
26
|
+
const toolNames = {
|
|
27
|
+
marketListInstruments: options.toolNames?.marketListInstruments ?? "market_list_instruments",
|
|
28
|
+
marketGetAssetData: options.toolNames?.marketGetAssetData ?? "market_get_asset_data",
|
|
29
|
+
leaderboardGetMarkets: options.toolNames?.leaderboardGetMarkets ?? "leaderboard_get_markets",
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
getInstruments: async (address) => cache.getOrLoad(cacheKey("instruments", address), cacheTtl.instruments, async () => {
|
|
33
|
+
const normalized = normalizeInstrumentsWithDiagnostics(await client.callTool(toolNames.marketListInstruments, {}, {
|
|
34
|
+
address,
|
|
35
|
+
timeoutMs: timeouts.marketListInstruments,
|
|
36
|
+
}));
|
|
37
|
+
warnOnNormalizationIssues(logger, {
|
|
38
|
+
tool: toolNames.marketListInstruments,
|
|
39
|
+
address,
|
|
40
|
+
diagnostics: normalized.diagnostics,
|
|
41
|
+
});
|
|
42
|
+
return normalized.value;
|
|
43
|
+
}),
|
|
44
|
+
getCandles: async (address, instruments, requestOptions) => {
|
|
45
|
+
const assets = selectCandleAssets(instruments, requestOptions, maxCandleAssets);
|
|
46
|
+
if (assets.length === 0) {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
const result = {};
|
|
50
|
+
await Promise.all(assets.map(async (asset) => {
|
|
51
|
+
const key = cacheKey("candles", address, asset, candleIntervals.join(","));
|
|
52
|
+
const candles = await cache.getOrLoad(key, cacheTtl.candles, async () => {
|
|
53
|
+
const payload = await client.callTool(toolNames.marketGetAssetData, {
|
|
54
|
+
asset,
|
|
55
|
+
candle_intervals: candleIntervals,
|
|
56
|
+
include_order_book: false,
|
|
57
|
+
include_funding: false,
|
|
58
|
+
}, {
|
|
59
|
+
address,
|
|
60
|
+
scannerId: requestOptions?.scannerId,
|
|
61
|
+
timeoutMs: timeouts.marketGetAssetData,
|
|
62
|
+
});
|
|
63
|
+
const normalized = normalizeAssetCandles(payload);
|
|
64
|
+
if (normalized.error) {
|
|
65
|
+
logger.warn("Provider candle payload had recoverable issues.", {
|
|
66
|
+
tool: toolNames.marketGetAssetData,
|
|
67
|
+
address,
|
|
68
|
+
scannerId: requestOptions?.scannerId,
|
|
69
|
+
asset,
|
|
70
|
+
error: normalized.error,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return normalized;
|
|
74
|
+
});
|
|
75
|
+
result[asset] = candles;
|
|
76
|
+
}));
|
|
77
|
+
return result;
|
|
78
|
+
},
|
|
79
|
+
getSmData: async (address) => cache.getOrLoad(cacheKey("sm-data", address), cacheTtl.smData, async () => {
|
|
80
|
+
const normalized = normalizeSmMarketsWithDiagnostics(await client.callTool(toolNames.leaderboardGetMarkets, {
|
|
81
|
+
limit: 100,
|
|
82
|
+
}, {
|
|
83
|
+
address,
|
|
84
|
+
timeoutMs: timeouts.leaderboardGetMarkets,
|
|
85
|
+
}));
|
|
86
|
+
warnOnNormalizationIssues(logger, {
|
|
87
|
+
tool: toolNames.leaderboardGetMarkets,
|
|
88
|
+
address,
|
|
89
|
+
diagnostics: normalized.diagnostics,
|
|
90
|
+
});
|
|
91
|
+
return normalized.value;
|
|
92
|
+
}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Adapts either the provider-local logger or a winston-style logger into one provider logger surface. */
|
|
96
|
+
function toProviderLogger(logger) {
|
|
97
|
+
if (!logger) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
if (isProviderLogger(logger)) {
|
|
101
|
+
return logger;
|
|
102
|
+
}
|
|
103
|
+
return createWinstonProviderLogger(logger);
|
|
104
|
+
}
|
|
105
|
+
/** Runtime guard for objects that already satisfy the provider logger contract. */
|
|
106
|
+
function isProviderLogger(value) {
|
|
107
|
+
if (!value || typeof value !== "object") {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
const logger = value;
|
|
111
|
+
return (typeof logger.debug === "function" &&
|
|
112
|
+
typeof logger.info === "function" &&
|
|
113
|
+
typeof logger.warn === "function" &&
|
|
114
|
+
typeof logger.error === "function");
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Chooses which assets should receive candle requests for one run.
|
|
118
|
+
* Preferred assets win when they are present in the current instrument universe;
|
|
119
|
+
* otherwise the provider falls back to the deduplicated instrument list.
|
|
120
|
+
*/
|
|
121
|
+
function selectCandleAssets(instruments, requestOptions, maxCandleAssets) {
|
|
122
|
+
const preferred = requestOptions?.preferredAssets ?? [];
|
|
123
|
+
const preferredSet = new Set(preferred);
|
|
124
|
+
const validPreferred = instruments
|
|
125
|
+
.map((instrument) => instrument.name)
|
|
126
|
+
.filter((asset) => preferredSet.has(asset));
|
|
127
|
+
if (validPreferred.length > 0) {
|
|
128
|
+
return dedupeAssets(validPreferred).slice(0, maxCandleAssets);
|
|
129
|
+
}
|
|
130
|
+
return dedupeAssets(instruments.map((instrument) => instrument.name)).slice(0, maxCandleAssets);
|
|
131
|
+
}
|
|
132
|
+
/** Removes duplicate asset symbols while preserving first-seen order. */
|
|
133
|
+
function dedupeAssets(assets) {
|
|
134
|
+
return [...new Set(assets)];
|
|
135
|
+
}
|
|
136
|
+
/** Builds a stable cache key for one provider payload family. */
|
|
137
|
+
function cacheKey(prefix, ...parts) {
|
|
138
|
+
return `${prefix}:${parts.join(":")}`;
|
|
139
|
+
}
|
|
140
|
+
/** Emits one warning when normalization discarded rows or recorded parse issues. */
|
|
141
|
+
function warnOnNormalizationIssues(logger, params) {
|
|
142
|
+
const { diagnostics } = params;
|
|
143
|
+
if (diagnostics.discardedCount === 0 &&
|
|
144
|
+
Object.keys(diagnostics.issueCounts).length === 0) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
logger.warn("Provider normalization reported discarded rows.", {
|
|
148
|
+
tool: params.tool,
|
|
149
|
+
address: params.address,
|
|
150
|
+
scannerId: params.scannerId,
|
|
151
|
+
acceptedCount: diagnostics.acceptedCount,
|
|
152
|
+
discardedCount: diagnostics.discardedCount,
|
|
153
|
+
issueCounts: diagnostics.issueCounts,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/scanners/providers/factory.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,qBAAqB,EACrB,mCAAmC,EACnC,iCAAiC,GAElC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,GAI5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4C3C,yEAAyE;AACzE,MAAM,UAAU,2BAA2B,CACzC,OAA2C;IAE3C,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,2BAA2B,EAAE,CAAC;IACjF,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE;QAClD,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM;QACpC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;QAC7B,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG;QACf,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,WAAW,IAAI,MAAM;QACtD,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,IAAI,OAAO;QAC7C,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,IAAI,MAAM;KAC/C,CAAC;IACF,MAAM,QAAQ,GAAG;QACf,qBAAqB,EAAE,OAAO,CAAC,QAAQ,EAAE,qBAAqB,IAAI,MAAM;QACxE,kBAAkB,EAAE,OAAO,CAAC,QAAQ,EAAE,kBAAkB,IAAI,MAAM;QAClE,qBAAqB,EAAE,OAAO,CAAC,QAAQ,EAAE,qBAAqB,IAAI,KAAK;KACxE,CAAC;IACF,MAAM,SAAS,GAAG;QAChB,qBAAqB,EACnB,OAAO,CAAC,SAAS,EAAE,qBAAqB,IAAI,yBAAyB;QACvE,kBAAkB,EAChB,OAAO,CAAC,SAAS,EAAE,kBAAkB,IAAI,uBAAuB;QAClE,qBAAqB,EACnB,OAAO,CAAC,SAAS,EAAE,qBAAqB,IAAI,yBAAyB;KACxE,CAAC;IAEF,OAAO;QACL,cAAc,EAAE,KAAK,EAAE,OAAe,EAAyB,EAAE,CAC/D,KAAK,CAAC,SAAS,CACb,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,EAChC,QAAQ,CAAC,WAAW,EACpB,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,mCAAmC,CACpD,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,EAAE;gBACzD,OAAO;gBACP,SAAS,EAAE,QAAQ,CAAC,qBAAqB;aAC1C,CAAC,CACH,CAAC;YACF,yBAAyB,CAAC,MAAM,EAAE;gBAChC,IAAI,EAAE,SAAS,CAAC,qBAAqB;gBACrC,OAAO;gBACP,WAAW,EAAE,UAAU,CAAC,WAAW;aACpC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,CACF;QAEH,UAAU,EAAE,KAAK,EACf,OAAe,EACf,WAAyB,EACzB,cAAsC,EACb,EAAE;YAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;YAChF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,MAAM,GAAiC,EAAE,CAAC;YAChD,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACzB,MAAM,GAAG,GAAG,QAAQ,CAClB,SAAS,EACT,OAAO,EACP,KAAK,EACL,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAC1B,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;oBACtE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CACnC,SAAS,CAAC,kBAAkB,EAC5B;wBACE,KAAK;wBACL,gBAAgB,EAAE,eAAe;wBACjC,kBAAkB,EAAE,KAAK;wBACzB,eAAe,EAAE,KAAK;qBACvB,EACD;wBACE,OAAO;wBACP,SAAS,EAAE,cAAc,EAAE,SAAS;wBACpC,SAAS,EAAE,QAAQ,CAAC,kBAAkB;qBACvC,CACF,CAAC;oBACF,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;oBAClD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;wBACrB,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;4BAC7D,IAAI,EAAE,SAAS,CAAC,kBAAkB;4BAClC,OAAO;4BACP,SAAS,EAAE,cAAc,EAAE,SAAS;4BACpC,KAAK;4BACL,KAAK,EAAE,UAAU,CAAC,KAAK;yBACxB,CAAC,CAAC;oBACL,CAAC;oBACD,OAAO,UAAU,CAAC;gBACpB,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC1B,CAAC,CAAC,CACH,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,SAAS,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE,CACnC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,UAAU,GAAG,iCAAiC,CAClD,MAAM,MAAM,CAAC,QAAQ,CACnB,SAAS,CAAC,qBAAqB,EAC/B;gBACE,KAAK,EAAE,GAAG;aACX,EACD;gBACE,OAAO;gBACP,SAAS,EAAE,QAAQ,CAAC,qBAAqB;aAC1C,CACF,CACF,CAAC;YACF,yBAAyB,CAAC,MAAM,EAAE;gBAChC,IAAI,EAAE,SAAS,CAAC,qBAAqB;gBACrC,OAAO;gBACP,WAAW,EAAE,UAAU,CAAC,WAAW;aACpC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,0GAA0G;AAC1G,SAAS,gBAAgB,CACvB,MAAoD;IAEpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,mFAAmF;AACnF,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,CACL,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU;QAClC,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;QACjC,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;QACjC,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,CACnC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CACzB,WAAyB,EACzB,cAAiD,EACjD,eAAuB;IAEvB,MAAM,SAAS,GAAG,cAAc,EAAE,eAAe,IAAI,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,WAAW;SAC/B,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;SACpC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CACzE,CAAC,EACD,eAAe,CAChB,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,YAAY,CAAC,MAAgB;IACpC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,iEAAiE;AACjE,SAAS,QAAQ,CAAC,MAAc,EAAE,GAAG,KAAe;IAClD,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,oFAAoF;AACpF,SAAS,yBAAyB,CAChC,MAAsB,EACtB,MAKC;IAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC/B,IACE,WAAW,CAAC,cAAc,KAAK,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EACjD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;QAC7D,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,WAAW,EAAE,WAAW,CAAC,WAAW;KACrC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw MCP payload contracts used by scanner provider adapters.
|
|
3
|
+
* These types reflect the expected wire shape before normalization.
|
|
4
|
+
*/
|
|
5
|
+
/** Common MCP envelope shape (`{ success, data }`) returned by some clients. */
|
|
6
|
+
export interface SenpiEnvelope<T> {
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: T;
|
|
9
|
+
}
|
|
10
|
+
/** Raw instrument context payload returned by `market_list_instruments`. */
|
|
11
|
+
export interface RawInstrumentContext {
|
|
12
|
+
markPx: unknown;
|
|
13
|
+
prevDayPx: unknown;
|
|
14
|
+
midPx: unknown;
|
|
15
|
+
dayNtlVlm: unknown;
|
|
16
|
+
openInterest: unknown;
|
|
17
|
+
funding: unknown;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/** Raw instrument row returned by `market_list_instruments`. */
|
|
21
|
+
export interface RawInstrument {
|
|
22
|
+
name: unknown;
|
|
23
|
+
is_delisted: unknown;
|
|
24
|
+
max_leverage: unknown;
|
|
25
|
+
context: RawInstrumentContext | unknown;
|
|
26
|
+
}
|
|
27
|
+
/** Raw response shape for `market_list_instruments`. */
|
|
28
|
+
export interface RawMarketListInstrumentsResponse {
|
|
29
|
+
instruments: RawInstrument[] | unknown;
|
|
30
|
+
}
|
|
31
|
+
/** Raw candle row returned by `market_get_asset_data`. */
|
|
32
|
+
export interface RawCandleRow {
|
|
33
|
+
t: unknown;
|
|
34
|
+
o: unknown;
|
|
35
|
+
h: unknown;
|
|
36
|
+
l: unknown;
|
|
37
|
+
c: unknown;
|
|
38
|
+
v: unknown;
|
|
39
|
+
}
|
|
40
|
+
/** Raw response shape for `market_get_asset_data`. */
|
|
41
|
+
export interface RawMarketAssetDataResponse {
|
|
42
|
+
candles?: Record<string, RawCandleRow[] | unknown> | unknown;
|
|
43
|
+
error?: unknown;
|
|
44
|
+
}
|
|
45
|
+
/** Raw smart-money market row returned by `leaderboard_get_markets`. */
|
|
46
|
+
export interface RawSmMarket {
|
|
47
|
+
token: unknown;
|
|
48
|
+
dex?: unknown;
|
|
49
|
+
direction: unknown;
|
|
50
|
+
pct_of_top_traders_gain: unknown;
|
|
51
|
+
trader_count: unknown;
|
|
52
|
+
token_price_change_pct_4h: unknown;
|
|
53
|
+
[key: string]: unknown;
|
|
54
|
+
}
|
|
55
|
+
/** Raw response shape for `leaderboard_get_markets`. */
|
|
56
|
+
export interface RawLeaderboardMarketsResponse {
|
|
57
|
+
markets?: {
|
|
58
|
+
markets?: RawSmMarket[] | unknown;
|
|
59
|
+
} | RawSmMarket[] | unknown;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scanners/providers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gFAAgF;AAChF,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;CACT;AAED,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;CACzC;AAED,wDAAwD;AACxD,MAAM,WAAW,gCAAgC;IAC/C,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;CACxC;AAED,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;CACZ;AAED,sDAAsD;AACtD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,uBAAuB,EAAE,OAAO,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,OAAO,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wDAAwD;AACxD,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;KAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;CAC3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/scanners/providers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ScannerDataProviders } from "./engine/data-providers.js";
|
|
2
|
+
import { type ScannerRegistrationSummary } from "./engine/engine.js";
|
|
3
|
+
import { type ScannerRuntimeEventMap, type ScannerRuntimeEventName } from "./events.js";
|
|
4
|
+
import type { ScannerLogger } from "./protocol/context.js";
|
|
5
|
+
import type { Scanner } from "./protocol/scanner.js";
|
|
6
|
+
import type { ReadSignalsFilter, ScanResult, ScannerId, Signal, StrategyRegistration } from "./types.js";
|
|
7
|
+
/** Factory that creates one scanner instance for one strategy registration. */
|
|
8
|
+
export type ScannerFactory<Cfg = unknown, St = unknown> = () => Scanner<Cfg, St>;
|
|
9
|
+
/**
|
|
10
|
+
* Scanner registration input accepted by module bootstrap.
|
|
11
|
+
* Each entry must build a fresh scanner instance for each strategy registration.
|
|
12
|
+
*/
|
|
13
|
+
export type ScannerInput<Cfg = unknown, St = unknown> = ScannerFactory<Cfg, St>;
|
|
14
|
+
/** Runtime-module bootstrap options for scanner registration and state wiring. */
|
|
15
|
+
export interface ScannerRuntimeModuleOptions {
|
|
16
|
+
stateDir: string;
|
|
17
|
+
strategies: StrategyRegistration[];
|
|
18
|
+
scanners: ScannerInput[];
|
|
19
|
+
providers?: ScannerDataProviders;
|
|
20
|
+
logger?: ScannerLogger;
|
|
21
|
+
now?: () => number;
|
|
22
|
+
}
|
|
23
|
+
/** Public control surface exposed by the standalone scanner runtime module. */
|
|
24
|
+
export interface ScannerRuntimeModule {
|
|
25
|
+
/** Starts interval scheduling for all enabled strategy/scanner registrations. */
|
|
26
|
+
start(): Promise<void>;
|
|
27
|
+
/** Stops interval scheduling; in-flight runs are allowed to finish. */
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
/** Runs one scanner immediately for one strategy. */
|
|
30
|
+
runOnce(address: string, scannerId: ScannerId): Promise<ScanResult>;
|
|
31
|
+
/** Lists registered scanners and enablement state, optionally for one strategy. */
|
|
32
|
+
listScanners(address?: string): Promise<ScannerRegistrationSummary[]>;
|
|
33
|
+
/** Enables one scanner registration for future scheduled/manual runs. */
|
|
34
|
+
enableScanner(address: string, scannerId: ScannerId): Promise<void>;
|
|
35
|
+
/** Disables one scanner registration for future scheduled/manual runs. */
|
|
36
|
+
disableScanner(address: string, scannerId: ScannerId): Promise<void>;
|
|
37
|
+
/** Reads current persisted config for one scanner registration. */
|
|
38
|
+
getScannerConfig(address: string, scannerId: ScannerId): Promise<unknown>;
|
|
39
|
+
/** Writes validated config for one scanner registration. */
|
|
40
|
+
setScannerConfig(address: string, scannerId: ScannerId, config: unknown): Promise<void>;
|
|
41
|
+
/** Queries persisted latest signals across strategy/scanner boundaries. */
|
|
42
|
+
querySignals(filter?: ReadSignalsFilter): Promise<Signal[]>;
|
|
43
|
+
/** Subscribes one event listener to runtime lifecycle events. */
|
|
44
|
+
on<Name extends ScannerRuntimeEventName>(eventName: Name, listener: (event: ScannerRuntimeEventMap[Name]) => void): void;
|
|
45
|
+
/** Unsubscribes one event listener from runtime lifecycle events. */
|
|
46
|
+
off<Name extends ScannerRuntimeEventName>(eventName: Name, listener: (event: ScannerRuntimeEventMap[Name]) => void): void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates a standalone scanner runtime module with strategy-scoped scanner instances.
|
|
50
|
+
* Registered scanners are supplied as factories so the module never reuses mutable
|
|
51
|
+
* scanner objects across strategies.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createScannerRuntimeModule(options: ScannerRuntimeModuleOptions): ScannerRuntimeModule;
|
|
54
|
+
//# sourceMappingURL=runtime-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-module.d.ts","sourceRoot":"","sources":["../../src/scanners/runtime-module.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAiB,KAAK,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGpF,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,MAAM,EACN,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,MAAM,MAAM,cAAc,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAEjF;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAEhF,kFAAkF;AAClF,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,uEAAuE;IACvE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,qDAAqD;IACrD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpE,mFAAmF;IACnF,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAEtE,yEAAyE;IACzE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE,0EAA0E;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE,mEAAmE;IACnE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1E,4DAA4D;IAC5D,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,2EAA2E;IAC3E,YAAY,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5D,iEAAiE;IACjE,EAAE,CAAC,IAAI,SAAS,uBAAuB,EACrC,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,IAAI,CAAC,KAAK,IAAI,GACtD,IAAI,CAAC;IAER,qEAAqE;IACrE,GAAG,CAAC,IAAI,SAAS,uBAAuB,EACtC,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,IAAI,CAAC,KAAK,IAAI,GACtD,IAAI,CAAC;CACT;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAEtB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { createLogger } from "../utils/logger.js";
|
|
3
|
+
import { ScannerEngine } from "./engine/engine.js";
|
|
4
|
+
const logger = createLogger("[senpi-core][scanner-module]");
|
|
5
|
+
import { emitTerminalScannerRunEvent, } from "./events.js";
|
|
6
|
+
import { RuntimeStore } from "./store/runtime-store.js";
|
|
7
|
+
import { SharedArtifactStore } from "./store/shared-artifact-store.js";
|
|
8
|
+
import { SignalStore } from "./store/signal-store.js";
|
|
9
|
+
/**
|
|
10
|
+
* Creates a standalone scanner runtime module with strategy-scoped scanner instances.
|
|
11
|
+
* Registered scanners are supplied as factories so the module never reuses mutable
|
|
12
|
+
* scanner objects across strategies.
|
|
13
|
+
*/
|
|
14
|
+
export function createScannerRuntimeModule(options) {
|
|
15
|
+
return new DefaultScannerRuntimeModule(options);
|
|
16
|
+
}
|
|
17
|
+
class DefaultScannerRuntimeModule {
|
|
18
|
+
signalStore;
|
|
19
|
+
engine;
|
|
20
|
+
events = new EventEmitter();
|
|
21
|
+
constructor(options) {
|
|
22
|
+
const now = options.now ?? Date.now;
|
|
23
|
+
this.signalStore = new SignalStore(options.stateDir);
|
|
24
|
+
this.engine = new ScannerEngine({
|
|
25
|
+
now,
|
|
26
|
+
logger: options.logger ?? logger,
|
|
27
|
+
providers: options.providers,
|
|
28
|
+
stores: {
|
|
29
|
+
runtimeStore: new RuntimeStore(options.stateDir, now),
|
|
30
|
+
signalStore: this.signalStore,
|
|
31
|
+
sharedArtifactStore: new SharedArtifactStore(options.stateDir, now),
|
|
32
|
+
},
|
|
33
|
+
lifecycle: {
|
|
34
|
+
onRunStart: (event) => {
|
|
35
|
+
this.events.emit("scanner:run:start", event);
|
|
36
|
+
},
|
|
37
|
+
onRunResult: (result) => {
|
|
38
|
+
emitTerminalScannerRunEvent((eventName, event) => {
|
|
39
|
+
this.events.emit(eventName, event);
|
|
40
|
+
}, result);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
registerAll(options.strategies, options.scanners, this.engine);
|
|
45
|
+
}
|
|
46
|
+
async start() {
|
|
47
|
+
logger.info("scanner module start() entered");
|
|
48
|
+
logger.debug("scanner module start begin");
|
|
49
|
+
await this.engine.start();
|
|
50
|
+
logger.info("scanner module start() complete");
|
|
51
|
+
logger.debug("scanner module start complete");
|
|
52
|
+
}
|
|
53
|
+
async stop() {
|
|
54
|
+
logger.debug("scanner module stop begin");
|
|
55
|
+
await this.engine.stop();
|
|
56
|
+
logger.debug("scanner module stop complete");
|
|
57
|
+
}
|
|
58
|
+
async runOnce(address, scannerId) {
|
|
59
|
+
return this.engine.runOnce(address, scannerId);
|
|
60
|
+
}
|
|
61
|
+
async listScanners(address) {
|
|
62
|
+
return this.engine.list(address);
|
|
63
|
+
}
|
|
64
|
+
async enableScanner(address, scannerId) {
|
|
65
|
+
this.engine.enable(address, scannerId);
|
|
66
|
+
}
|
|
67
|
+
async disableScanner(address, scannerId) {
|
|
68
|
+
this.engine.disable(address, scannerId);
|
|
69
|
+
}
|
|
70
|
+
async getScannerConfig(address, scannerId) {
|
|
71
|
+
return this.engine.getConfig(address, scannerId);
|
|
72
|
+
}
|
|
73
|
+
async setScannerConfig(address, scannerId, config) {
|
|
74
|
+
await this.engine.setConfig(address, scannerId, config);
|
|
75
|
+
}
|
|
76
|
+
async querySignals(filter) {
|
|
77
|
+
return this.signalStore.readSignals(filter);
|
|
78
|
+
}
|
|
79
|
+
on(eventName, listener) {
|
|
80
|
+
this.events.on(eventName, listener);
|
|
81
|
+
}
|
|
82
|
+
off(eventName, listener) {
|
|
83
|
+
this.events.off(eventName, listener);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Registers every scanner factory once for every strategy so each registration gets a fresh instance. */
|
|
87
|
+
function registerAll(strategies, scanners, engine) {
|
|
88
|
+
for (const strategy of strategies) {
|
|
89
|
+
for (const scannerFactory of scanners) {
|
|
90
|
+
engine.register(strategy, scannerFactory());
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=runtime-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-module.js","sourceRoot":"","sources":["../../src/scanners/runtime-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAmC,MAAM,oBAAoB,CAAC;AAEpF,MAAM,MAAM,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5D,OAAO,EACL,2BAA2B,GAG5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA0EtD;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAoC;IAEpC,OAAO,IAAI,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,2BAA2B;IACd,WAAW,CAAc;IACzB,MAAM,CAAgB;IACtB,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAE7C,YAAY,OAAoC;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,GAAG;YACH,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE;gBACN,YAAY,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;gBACrD,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,mBAAmB,EAAE,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACpE;YACD,SAAS,EAAE;gBACT,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;oBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC;gBACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;oBACtB,2BAA2B,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;wBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBACrC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACb,CAAC;aACF;SACF,CAAC,CAAC;QAEH,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,SAAoB;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,SAAoB;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,SAAoB;QACxD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,SAAoB;QAEpB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,SAAoB,EACpB,MAAe;QAEf,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,EAAE,CACA,SAAe,EACf,QAAuD;QAEvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,QAAoC,CAAC,CAAC;IAClE,CAAC;IAED,GAAG,CACD,SAAe,EACf,QAAuD;QAEvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,QAAoC,CAAC,CAAC;IACnE,CAAC;CACF;AAED,0GAA0G;AAC1G,SAAS,WAAW,CAClB,UAAkC,EAClC,QAAwB,EACxB,MAAqB;IAErB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,KAAK,MAAM,cAAc,IAAI,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
2
|
+
import type { SharedArtifactContract } from "./artifacts.js";
|
|
3
|
+
import type { ScannerInputDescriptor } from "./input-descriptors.js";
|
|
4
|
+
import type { ScannerId } from "./types.js";
|
|
5
|
+
/** Controls how much signal history is retained on disk. */
|
|
6
|
+
export declare enum RetentionPolicy {
|
|
7
|
+
/** Keep only the latest run and remove history. */
|
|
8
|
+
LAST_ONLY = "last_only",
|
|
9
|
+
/** Keep latest plus a bounded tail of previous runs. */
|
|
10
|
+
ROLLING_WINDOW = "rolling_window"
|
|
11
|
+
}
|
|
12
|
+
/** Controls when a run result should be persisted. */
|
|
13
|
+
export declare enum PersistencePolicy {
|
|
14
|
+
/** Persist every run result. */
|
|
15
|
+
ALWAYS = "always",
|
|
16
|
+
/** Persist only when at least one signal is actionable. */
|
|
17
|
+
ACTIONABLE_ONLY = "actionable_only",
|
|
18
|
+
/** Never persist; return result in-memory only. */
|
|
19
|
+
NEVER = "never"
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Immutable scanner definition shared across all strategy runtimes.
|
|
23
|
+
* Runtime state/config for a scanner instance is kept separately in RuntimeStore.
|
|
24
|
+
*/
|
|
25
|
+
export interface ScannerDefinition<Cfg = unknown, St = unknown> {
|
|
26
|
+
/** Scanner identifier; unique per strategy runtime instance. */
|
|
27
|
+
id: ScannerId;
|
|
28
|
+
/** Domain-level signal type emitted by this scanner. */
|
|
29
|
+
signalType: string;
|
|
30
|
+
/** Human-readable purpose/behavior summary. */
|
|
31
|
+
description: string;
|
|
32
|
+
/** Default schedule interval in seconds. */
|
|
33
|
+
intervalSeconds: number;
|
|
34
|
+
/** Signal retention behavior for persisted runs. */
|
|
35
|
+
retention: RetentionPolicy;
|
|
36
|
+
/** Maximum number of history rows when using ROLLING_WINDOW. */
|
|
37
|
+
retentionMaxRuns?: number;
|
|
38
|
+
/** Persistence decision policy used by engine when hooks do not override. */
|
|
39
|
+
persistence: PersistencePolicy;
|
|
40
|
+
/** Declarative provider-backed and artifact-backed input requirements for each scan run. */
|
|
41
|
+
inputs: ScannerInputDescriptor[];
|
|
42
|
+
/**
|
|
43
|
+
* Optional metadata describing which shared artifacts the scanner produces.
|
|
44
|
+
* These artifacts are shared market intelligence between scanners, not trading signals.
|
|
45
|
+
*/
|
|
46
|
+
artifacts?: {
|
|
47
|
+
produces?: SharedArtifactContract[];
|
|
48
|
+
};
|
|
49
|
+
/** Config validation schema enforced by engine before initialization/runs. */
|
|
50
|
+
configSchema: TSchema;
|
|
51
|
+
/** Default config used when runtime config does not exist yet. */
|
|
52
|
+
defaultConfig: Cfg;
|
|
53
|
+
/** Optional state validation schema enforced by the engine before initialize()/scan(). */
|
|
54
|
+
stateSchema?: TSchema;
|
|
55
|
+
/** Default state used when runtime state is missing or must be repaired. */
|
|
56
|
+
defaultState?: St;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=scanner-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner-definition.d.ts","sourceRoot":"","sources":["../../src/scanners/scanner-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,4DAA4D;AAC5D,oBAAY,eAAe;IACzB,mDAAmD;IACnD,SAAS,cAAc;IACvB,wDAAwD;IACxD,cAAc,mBAAmB;CAClC;AAED,sDAAsD;AACtD,oBAAY,iBAAiB;IAC3B,gCAAgC;IAChC,MAAM,WAAW;IACjB,2DAA2D;IAC3D,eAAe,oBAAoB;IACnC,mDAAmD;IACnD,KAAK,UAAU;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO;IAC5D,gEAAgE;IAChE,EAAE,EAAE,SAAS,CAAC;IACd,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IAExB,oDAAoD;IACpD,SAAS,EAAE,eAAe,CAAC;IAC3B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,6EAA6E;IAC7E,WAAW,EAAE,iBAAiB,CAAC;IAE/B,4FAA4F;IAC5F,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAEjC;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;KACrC,CAAC;IAEF,8EAA8E;IAC9E,YAAY,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,aAAa,EAAE,GAAG,CAAC;IACnB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,EAAE,CAAC;CACnB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Controls how much signal history is retained on disk. */
|
|
2
|
+
export var RetentionPolicy;
|
|
3
|
+
(function (RetentionPolicy) {
|
|
4
|
+
/** Keep only the latest run and remove history. */
|
|
5
|
+
RetentionPolicy["LAST_ONLY"] = "last_only";
|
|
6
|
+
/** Keep latest plus a bounded tail of previous runs. */
|
|
7
|
+
RetentionPolicy["ROLLING_WINDOW"] = "rolling_window";
|
|
8
|
+
})(RetentionPolicy || (RetentionPolicy = {}));
|
|
9
|
+
/** Controls when a run result should be persisted. */
|
|
10
|
+
export var PersistencePolicy;
|
|
11
|
+
(function (PersistencePolicy) {
|
|
12
|
+
/** Persist every run result. */
|
|
13
|
+
PersistencePolicy["ALWAYS"] = "always";
|
|
14
|
+
/** Persist only when at least one signal is actionable. */
|
|
15
|
+
PersistencePolicy["ACTIONABLE_ONLY"] = "actionable_only";
|
|
16
|
+
/** Never persist; return result in-memory only. */
|
|
17
|
+
PersistencePolicy["NEVER"] = "never";
|
|
18
|
+
})(PersistencePolicy || (PersistencePolicy = {}));
|
|
19
|
+
//# sourceMappingURL=scanner-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner-definition.js","sourceRoot":"","sources":["../../src/scanners/scanner-definition.ts"],"names":[],"mappings":"AAKA,4DAA4D;AAC5D,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACzB,mDAAmD;IACnD,0CAAuB,CAAA;IACvB,wDAAwD;IACxD,oDAAiC,CAAA;AACnC,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B;AAED,sDAAsD;AACtD,MAAM,CAAN,IAAY,iBAOX;AAPD,WAAY,iBAAiB;IAC3B,gCAAgC;IAChC,sCAAiB,CAAA;IACjB,2DAA2D;IAC3D,wDAAmC,CAAA;IACnC,mDAAmD;IACnD,oCAAe,CAAA;AACjB,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,QAO5B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
2
|
+
/** Returns true when a value conforms to the provided TypeBox schema. */
|
|
3
|
+
export declare function isSchemaValueValid(schema: TSchema | undefined, value: unknown): boolean;
|
|
4
|
+
/** Formats the first TypeBox validation error into a compact human-readable string. */
|
|
5
|
+
export declare function describeSchemaValidationError(schema: TSchema, value: unknown): string;
|
|
6
|
+
//# sourceMappingURL=schema-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-utils.d.ts","sourceRoot":"","sources":["../../src/scanners/schema-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GAAG,SAAS,EAC3B,KAAK,EAAE,OAAO,GACb,OAAO,CAKT;AAED,uFAAuF;AACvF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,GACb,MAAM,CAGR"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Value } from "@sinclair/typebox/value";
|
|
2
|
+
/** Returns true when a value conforms to the provided TypeBox schema. */
|
|
3
|
+
export function isSchemaValueValid(schema, value) {
|
|
4
|
+
if (!schema) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
return Value.Check(schema, value);
|
|
8
|
+
}
|
|
9
|
+
/** Formats the first TypeBox validation error into a compact human-readable string. */
|
|
10
|
+
export function describeSchemaValidationError(schema, value) {
|
|
11
|
+
const firstError = Value.Errors(schema, value).First();
|
|
12
|
+
return firstError ? `${firstError.path} ${firstError.message}` : "Unknown reason";
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=schema-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-utils.js","sourceRoot":"","sources":["../../src/scanners/schema-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAChC,MAA2B,EAC3B,KAAc;IAEd,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B,CAC3C,MAAe,EACf,KAAc;IAEd,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Logger surface required by score guard utilities. */
|
|
2
|
+
export interface ScoreGuardLogger {
|
|
3
|
+
warn: (message: string, meta?: Record<string, unknown>) => void;
|
|
4
|
+
}
|
|
5
|
+
/** Clamps non-finite/out-of-range numbers into the [0, 1] interval. */
|
|
6
|
+
export declare function clamp01(value: number): number;
|
|
7
|
+
/**
|
|
8
|
+
* Coerces any non-finite/out-of-range score into the valid [0, 1] interval.
|
|
9
|
+
* Alias for clamp01 — kept for backward compatibility and semantic clarity.
|
|
10
|
+
*/
|
|
11
|
+
export declare const clampScore: typeof clamp01;
|
|
12
|
+
/** Normalizes one value into [0, 1] based on the provided range. */
|
|
13
|
+
export declare function normalizeRange(value: number, min: number, max: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* Enforces score range and emits a warning when a clamp occurs.
|
|
16
|
+
* Use this in engine output normalization before persistence.
|
|
17
|
+
*/
|
|
18
|
+
export declare function enforceScoreRange(score: number, logger?: ScoreGuardLogger, context?: Record<string, unknown>): number;
|
|
19
|
+
//# sourceMappingURL=score-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-utils.d.ts","sourceRoot":"","sources":["../../src/scanners/score-utils.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACjE;AAED,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAW7C;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,gBAAU,CAAC;AAElC,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAW9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,gBAAgB,EACzB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,MAAM,CAUR"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Clamps non-finite/out-of-range numbers into the [0, 1] interval. */
|
|
2
|
+
export function clamp01(value) {
|
|
3
|
+
if (!Number.isFinite(value)) {
|
|
4
|
+
return 0;
|
|
5
|
+
}
|
|
6
|
+
if (value < 0) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
if (value > 1) {
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Coerces any non-finite/out-of-range score into the valid [0, 1] interval.
|
|
16
|
+
* Alias for clamp01 — kept for backward compatibility and semantic clarity.
|
|
17
|
+
*/
|
|
18
|
+
export const clampScore = clamp01;
|
|
19
|
+
/** Normalizes one value into [0, 1] based on the provided range. */
|
|
20
|
+
export function normalizeRange(value, min, max) {
|
|
21
|
+
if (!Number.isFinite(value) || max <= min) {
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
if (value <= min) {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
if (value >= max) {
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
return (value - min) / (max - min);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Enforces score range and emits a warning when a clamp occurs.
|
|
34
|
+
* Use this in engine output normalization before persistence.
|
|
35
|
+
*/
|
|
36
|
+
export function enforceScoreRange(score, logger, context = {}) {
|
|
37
|
+
const clamped = clamp01(score);
|
|
38
|
+
if (clamped !== score && logger) {
|
|
39
|
+
logger.warn("Signal score out of range; clamped to [0, 1].", {
|
|
40
|
+
originalScore: score,
|
|
41
|
+
clampedScore: clamped,
|
|
42
|
+
...context,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return clamped;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=score-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-utils.js","sourceRoot":"","sources":["../../src/scanners/score-utils.ts"],"names":[],"mappings":"AAKA,uEAAuE;AACvE,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC;AAElC,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,MAAyB,EACzB,UAAmC,EAAE;IAErC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,OAAO,KAAK,KAAK,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE;YAC3D,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,OAAO;YACrB,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Returns true when a filesystem path exists and is accessible. */
|
|
2
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
3
|
+
/** Serializes JSON with stable formatting and writes atomically. */
|
|
4
|
+
export declare function writeJsonAtomic(path: string, data: unknown): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Writes text atomically by writing to a temporary file then renaming in-place.
|
|
7
|
+
* Ensures readers never observe partial content.
|
|
8
|
+
*/
|
|
9
|
+
export declare function writeTextAtomic(path: string, content: string): Promise<void>;
|
|
10
|
+
/** Reads and parses JSON; returns null when file does not exist or is invalid. */
|
|
11
|
+
export declare function readJsonFile<T>(path: string): Promise<T | null>;
|
|
12
|
+
//# sourceMappingURL=fs-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../../src/scanners/store/fs-utils.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED,oEAAoE;AACpE,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAclF;AAED,kFAAkF;AAClF,wBAAsB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOrE"}
|