@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 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/scanners/engine/lifecycle.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PersistencePolicy } from "../scanner-definition.js";
|
|
2
|
+
import type { ScanResult, ScannerScanOutput, ScanStatus, ScannerId, Signal } from "../types.js";
|
|
3
|
+
import type { ScanContext } from "../protocol/context.js";
|
|
4
|
+
import type { StrategyScannerRegistration } from "./strategy-registry.js";
|
|
5
|
+
/**
|
|
6
|
+
* Builds a normalized ScanResult from raw scanner output.
|
|
7
|
+
* Handles signal normalization, score enforcement, and actionability checks.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildRunResult(entry: StrategyScannerRegistration, context: ScanContext<unknown, unknown>, output: ScannerScanOutput, now: () => number, logger?: {
|
|
10
|
+
warn?: (message: string, meta?: Record<string, unknown>) => void;
|
|
11
|
+
}): ScanResult;
|
|
12
|
+
/** Determines whether a scan result should be persisted based on the scanner's persistence policy. */
|
|
13
|
+
export declare function shouldPersist(policy: PersistencePolicy, result: ScanResult): boolean;
|
|
14
|
+
/** Constructs a ScanResult with default values for optional fields. */
|
|
15
|
+
export declare function buildResult(params: {
|
|
16
|
+
address: string;
|
|
17
|
+
scannerId: ScannerId;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
status: ScanStatus;
|
|
20
|
+
signals?: Signal[];
|
|
21
|
+
actionableCount?: number;
|
|
22
|
+
scannedCount?: number;
|
|
23
|
+
reason?: string;
|
|
24
|
+
summary: Record<string, unknown>;
|
|
25
|
+
}): ScanResult;
|
|
26
|
+
export declare function coerceTimestamp(value: number, fallback: number): number;
|
|
27
|
+
export declare function coerceCount(value: number, fallback: number): number;
|
|
28
|
+
export declare function formatError(error: unknown): string;
|
|
29
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
30
|
+
//# sourceMappingURL=result-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-builder.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/result-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,MAAM,EACP,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,2BAA2B,EAClC,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,MAAM,MAAM,EACjB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAAE,GAC5E,UAAU,CAqBZ;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAWpF;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,GAAG,UAAU,CAYb;AA4DD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKnE;AAcD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { PersistencePolicy as PersistencePolicyEnum } from "../scanner-definition.js";
|
|
2
|
+
import { enforceScoreRange } from "../score-utils.js";
|
|
3
|
+
import { ScanStatus as ScanStatusEnum } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Builds a normalized ScanResult from raw scanner output.
|
|
6
|
+
* Handles signal normalization, score enforcement, and actionability checks.
|
|
7
|
+
*/
|
|
8
|
+
export function buildRunResult(entry, context, output, now, logger) {
|
|
9
|
+
const fallbackTimestamp = now();
|
|
10
|
+
const outputTimestamp = coerceTimestamp(output.timestamp, fallbackTimestamp);
|
|
11
|
+
const signals = output.signals.map((signal) => normalizeSignal(signal, entry, outputTimestamp, logger));
|
|
12
|
+
const actionableCount = signals.filter((signal) => isActionable(entry, signal, context, logger)).length;
|
|
13
|
+
return buildResult({
|
|
14
|
+
address: entry.address,
|
|
15
|
+
scannerId: entry.scanner.definition.id,
|
|
16
|
+
timestamp: outputTimestamp,
|
|
17
|
+
status: signals.length > 0 ? ScanStatusEnum.OK : ScanStatusEnum.HEARTBEAT,
|
|
18
|
+
signals,
|
|
19
|
+
actionableCount,
|
|
20
|
+
scannedCount: coerceCount(output.scannedCount, signals.length),
|
|
21
|
+
reason: output.reason,
|
|
22
|
+
summary: isRecord(output.summary) ? output.summary : {},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Determines whether a scan result should be persisted based on the scanner's persistence policy. */
|
|
26
|
+
export function shouldPersist(policy, result) {
|
|
27
|
+
switch (policy) {
|
|
28
|
+
case PersistencePolicyEnum.ALWAYS:
|
|
29
|
+
return true;
|
|
30
|
+
case PersistencePolicyEnum.ACTIONABLE_ONLY:
|
|
31
|
+
return result.actionableCount > 0;
|
|
32
|
+
case PersistencePolicyEnum.NEVER:
|
|
33
|
+
return false;
|
|
34
|
+
default:
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Constructs a ScanResult with default values for optional fields. */
|
|
39
|
+
export function buildResult(params) {
|
|
40
|
+
return {
|
|
41
|
+
address: params.address,
|
|
42
|
+
scannerId: params.scannerId,
|
|
43
|
+
timestamp: params.timestamp,
|
|
44
|
+
status: params.status,
|
|
45
|
+
signals: params.signals ?? [],
|
|
46
|
+
actionableCount: params.actionableCount ?? 0,
|
|
47
|
+
scannedCount: params.scannedCount ?? 0,
|
|
48
|
+
reason: params.reason,
|
|
49
|
+
summary: params.summary,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Normalizes a raw scanner signal: enforces score range, defaults fields. */
|
|
53
|
+
function normalizeSignal(signal, entry, fallbackTimestamp, logger) {
|
|
54
|
+
return {
|
|
55
|
+
...signal,
|
|
56
|
+
address: entry.address,
|
|
57
|
+
scannerId: entry.scanner.definition.id,
|
|
58
|
+
signalType: signal.signalType || entry.scanner.definition.signalType,
|
|
59
|
+
timestamp: coerceTimestamp(signal.timestamp, fallbackTimestamp),
|
|
60
|
+
score: enforceScoreRange(signal.score, scoreLogger(logger), {
|
|
61
|
+
address: entry.address,
|
|
62
|
+
scannerId: entry.scanner.definition.id,
|
|
63
|
+
asset: signal.asset,
|
|
64
|
+
}),
|
|
65
|
+
factors: normalizeFactors(signal.factors),
|
|
66
|
+
meta: isRecord(signal.meta) ? signal.meta : {},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Checks whether a signal is actionable via hooks or default behavior. */
|
|
70
|
+
function isActionable(entry, signal, context, logger) {
|
|
71
|
+
if (!entry.scanner.hooks?.isActionable) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
return entry.scanner.hooks.isActionable(signal, context);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger?.warn?.("isActionable hook failed; treating signal as non-actionable.", {
|
|
79
|
+
address: entry.address,
|
|
80
|
+
scannerId: entry.scanner.definition.id,
|
|
81
|
+
error,
|
|
82
|
+
});
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function scoreLogger(logger) {
|
|
87
|
+
const warn = logger?.warn;
|
|
88
|
+
if (!warn) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
warn: (message, meta) => warn(message, meta),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export function coerceTimestamp(value, fallback) {
|
|
96
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
97
|
+
return fallback;
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
export function coerceCount(value, fallback) {
|
|
102
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
103
|
+
return fallback;
|
|
104
|
+
}
|
|
105
|
+
return Math.floor(value);
|
|
106
|
+
}
|
|
107
|
+
function normalizeFactors(value) {
|
|
108
|
+
if (!isRecord(value)) {
|
|
109
|
+
return {};
|
|
110
|
+
}
|
|
111
|
+
const factors = {};
|
|
112
|
+
for (const [key, factorValue] of Object.entries(value)) {
|
|
113
|
+
factors[key] = Boolean(factorValue);
|
|
114
|
+
}
|
|
115
|
+
return factors;
|
|
116
|
+
}
|
|
117
|
+
export function formatError(error) {
|
|
118
|
+
if (error instanceof Error) {
|
|
119
|
+
return error.message;
|
|
120
|
+
}
|
|
121
|
+
if (typeof error === "string") {
|
|
122
|
+
return error;
|
|
123
|
+
}
|
|
124
|
+
return "Unknown scanner error.";
|
|
125
|
+
}
|
|
126
|
+
export function isRecord(value) {
|
|
127
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=result-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-builder.js","sourceRoot":"","sources":["../../../src/scanners/engine/result-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Scanner } from "../protocol/scanner.js";
|
|
2
|
+
import type { ScannerId, StrategyRegistration } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* One scanner runtime registration scoped to one strategy.
|
|
5
|
+
* PoC constraint: one instance per scanner id within a strategy.
|
|
6
|
+
*/
|
|
7
|
+
export interface StrategyScannerRegistration<Cfg = unknown, St = unknown> {
|
|
8
|
+
address: string;
|
|
9
|
+
strategy: StrategyRegistration;
|
|
10
|
+
scanner: Scanner<Cfg, St>;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
initialized: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Start timestamp for the current in-flight run.
|
|
15
|
+
* Null means no active run for this strategy/scanner key.
|
|
16
|
+
*/
|
|
17
|
+
lastScanTime: number | null;
|
|
18
|
+
intervalSeconds: number;
|
|
19
|
+
initialConfig: Cfg;
|
|
20
|
+
timer: NodeJS.Timeout | null;
|
|
21
|
+
}
|
|
22
|
+
/** In-memory registry for strategy and scanner runtime registrations. */
|
|
23
|
+
export declare class StrategyRegistry {
|
|
24
|
+
private readonly strategies;
|
|
25
|
+
private readonly scanners;
|
|
26
|
+
/** Registers or updates strategy metadata. */
|
|
27
|
+
registerStrategy(strategy: StrategyRegistration): void;
|
|
28
|
+
/** Registers one scanner instance for a strategy. */
|
|
29
|
+
registerScanner<Cfg = unknown, St = unknown>(address: string, scanner: Scanner<Cfg, St>): StrategyScannerRegistration<Cfg, St>;
|
|
30
|
+
/** Looks up one scanner registration by strategy address and scanner id. */
|
|
31
|
+
get<Cfg = unknown, St = unknown>(address: string, scannerId: ScannerId): StrategyScannerRegistration<Cfg, St> | undefined;
|
|
32
|
+
/** Lists scanner registrations, optionally constrained to one strategy. */
|
|
33
|
+
list(address?: string): StrategyScannerRegistration[];
|
|
34
|
+
/** Enables/disables one scanner registration. */
|
|
35
|
+
setEnabled(address: string, scannerId: ScannerId, enabled: boolean): void;
|
|
36
|
+
/** Marks whether initialize() has been completed for one scanner registration. */
|
|
37
|
+
setInitialized(address: string, scannerId: ScannerId, initialized: boolean): void;
|
|
38
|
+
/** Stores/clears current in-flight run start time for one scanner registration. */
|
|
39
|
+
setLastScanTime(address: string, scannerId: ScannerId, lastScanTime: number | null): void;
|
|
40
|
+
/** Stores scheduler handle for one scanner registration. */
|
|
41
|
+
setTimer(address: string, scannerId: ScannerId, timer: NodeJS.Timeout | null): void;
|
|
42
|
+
/** Clears and forgets all active scanner timers. */
|
|
43
|
+
clearAllTimers(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=strategy-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-registry.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/strategy-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAc,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE/E;;;GAGG;AACH,MAAM,WAAW,2BAA2B,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,GAAG,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED,yEAAyE;AACzE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;IAC1E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkD;IAE3E,8CAA8C;IAC9C,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAItD,qDAAqD;IACrD,eAAe,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,EACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GACxB,2BAA2B,CAAC,GAAG,EAAE,EAAE,CAAC;IAmCvC,4EAA4E;IAC5E,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,EAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,GACnB,2BAA2B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,SAAS;IAMnD,2EAA2E;IAC3E,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,2BAA2B,EAAE;IAOrD,iDAAiD;IACjD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAUzE,kFAAkF;IAClF,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,OAAO,GACnB,IAAI;IAUP,mFAAmF;IACnF,eAAe,CACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,IAAI;IAUP,4DAA4D;IAC5D,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,GAC3B,IAAI;IAUP,oDAAoD;IACpD,cAAc,IAAI,IAAI;CAQvB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** In-memory registry for strategy and scanner runtime registrations. */
|
|
2
|
+
export class StrategyRegistry {
|
|
3
|
+
strategies = new Map();
|
|
4
|
+
scanners = new Map();
|
|
5
|
+
/** Registers or updates strategy metadata. */
|
|
6
|
+
registerStrategy(strategy) {
|
|
7
|
+
this.strategies.set(strategy.id, strategy);
|
|
8
|
+
}
|
|
9
|
+
/** Registers one scanner instance for a strategy. */
|
|
10
|
+
registerScanner(address, scanner) {
|
|
11
|
+
const strategy = this.strategies.get(address);
|
|
12
|
+
if (!strategy) {
|
|
13
|
+
throw new Error(`Strategy '${address}' is not registered.`);
|
|
14
|
+
}
|
|
15
|
+
const key = compositeKey(address, scanner.definition.id);
|
|
16
|
+
if (this.scanners.has(key)) {
|
|
17
|
+
throw new Error(`Scanner '${scanner.definition.id}' is already registered for strategy '${address}'.`);
|
|
18
|
+
}
|
|
19
|
+
const override = strategy.scannerOverrides?.[scanner.definition.id];
|
|
20
|
+
const enabled = strategy.defaultEnabledScanners === undefined
|
|
21
|
+
? true
|
|
22
|
+
: strategy.defaultEnabledScanners.includes(scanner.definition.id);
|
|
23
|
+
const entry = {
|
|
24
|
+
address,
|
|
25
|
+
strategy,
|
|
26
|
+
scanner,
|
|
27
|
+
enabled,
|
|
28
|
+
initialized: false,
|
|
29
|
+
lastScanTime: null,
|
|
30
|
+
intervalSeconds: override?.intervalSeconds ?? scanner.definition.intervalSeconds,
|
|
31
|
+
initialConfig: (override?.config ?? scanner.definition.defaultConfig),
|
|
32
|
+
timer: null,
|
|
33
|
+
};
|
|
34
|
+
this.scanners.set(key, entry);
|
|
35
|
+
return entry;
|
|
36
|
+
}
|
|
37
|
+
/** Looks up one scanner registration by strategy address and scanner id. */
|
|
38
|
+
get(address, scannerId) {
|
|
39
|
+
return this.scanners.get(compositeKey(address, scannerId));
|
|
40
|
+
}
|
|
41
|
+
/** Lists scanner registrations, optionally constrained to one strategy. */
|
|
42
|
+
list(address) {
|
|
43
|
+
if (!address) {
|
|
44
|
+
return [...this.scanners.values()];
|
|
45
|
+
}
|
|
46
|
+
return [...this.scanners.values()].filter((entry) => entry.address === address);
|
|
47
|
+
}
|
|
48
|
+
/** Enables/disables one scanner registration. */
|
|
49
|
+
setEnabled(address, scannerId, enabled) {
|
|
50
|
+
const entry = this.get(address, scannerId);
|
|
51
|
+
if (!entry) {
|
|
52
|
+
throw new Error(`Scanner '${scannerId}' is not registered for strategy '${address}'.`);
|
|
53
|
+
}
|
|
54
|
+
entry.enabled = enabled;
|
|
55
|
+
}
|
|
56
|
+
/** Marks whether initialize() has been completed for one scanner registration. */
|
|
57
|
+
setInitialized(address, scannerId, initialized) {
|
|
58
|
+
const entry = this.get(address, scannerId);
|
|
59
|
+
if (!entry) {
|
|
60
|
+
throw new Error(`Scanner '${scannerId}' is not registered for strategy '${address}'.`);
|
|
61
|
+
}
|
|
62
|
+
entry.initialized = initialized;
|
|
63
|
+
}
|
|
64
|
+
/** Stores/clears current in-flight run start time for one scanner registration. */
|
|
65
|
+
setLastScanTime(address, scannerId, lastScanTime) {
|
|
66
|
+
const entry = this.get(address, scannerId);
|
|
67
|
+
if (!entry) {
|
|
68
|
+
throw new Error(`Scanner '${scannerId}' is not registered for strategy '${address}'.`);
|
|
69
|
+
}
|
|
70
|
+
entry.lastScanTime = lastScanTime;
|
|
71
|
+
}
|
|
72
|
+
/** Stores scheduler handle for one scanner registration. */
|
|
73
|
+
setTimer(address, scannerId, timer) {
|
|
74
|
+
const entry = this.get(address, scannerId);
|
|
75
|
+
if (!entry) {
|
|
76
|
+
throw new Error(`Scanner '${scannerId}' is not registered for strategy '${address}'.`);
|
|
77
|
+
}
|
|
78
|
+
entry.timer = timer;
|
|
79
|
+
}
|
|
80
|
+
/** Clears and forgets all active scanner timers. */
|
|
81
|
+
clearAllTimers() {
|
|
82
|
+
for (const entry of this.scanners.values()) {
|
|
83
|
+
if (entry.timer) {
|
|
84
|
+
clearInterval(entry.timer);
|
|
85
|
+
entry.timer = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function compositeKey(address, scannerId) {
|
|
91
|
+
return `${address}::${scannerId}`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=strategy-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-registry.js","sourceRoot":"","sources":["../../../src/scanners/engine/strategy-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ScanStatus, type ScanResult, type ScannerId } from "./types.js";
|
|
2
|
+
/** Emitted when one scanner execution attempt starts. */
|
|
3
|
+
export interface ScannerRunStartEvent {
|
|
4
|
+
address: string;
|
|
5
|
+
scannerId: ScannerId;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
/** Emitted when one scanner execution attempt completes without skip/error status. */
|
|
9
|
+
export interface ScannerRunCompleteEvent {
|
|
10
|
+
address: string;
|
|
11
|
+
scannerId: ScannerId;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
result: ScanResult;
|
|
14
|
+
}
|
|
15
|
+
/** Emitted when one scanner execution attempt terminates with a skip-like status. */
|
|
16
|
+
export interface ScannerRunSkipEvent {
|
|
17
|
+
address: string;
|
|
18
|
+
scannerId: ScannerId;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
status: ScanStatus;
|
|
21
|
+
reason: string;
|
|
22
|
+
}
|
|
23
|
+
/** Emitted when one scanner execution attempt fails with an error status. */
|
|
24
|
+
export interface ScannerRunErrorEvent {
|
|
25
|
+
address: string;
|
|
26
|
+
scannerId: ScannerId;
|
|
27
|
+
timestamp: number;
|
|
28
|
+
error: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** Scanner runtime pub/sub event map. */
|
|
31
|
+
export interface ScannerRuntimeEventMap {
|
|
32
|
+
"scanner:run:start": ScannerRunStartEvent;
|
|
33
|
+
"scanner:run:complete": ScannerRunCompleteEvent;
|
|
34
|
+
"scanner:run:skip": ScannerRunSkipEvent;
|
|
35
|
+
"scanner:run:error": ScannerRunErrorEvent;
|
|
36
|
+
}
|
|
37
|
+
/** Supported runtime event names for scanner execution lifecycle. */
|
|
38
|
+
export type ScannerRuntimeEventName = keyof ScannerRuntimeEventMap;
|
|
39
|
+
/** Emits the terminal event (`complete|skip|error`) corresponding to a run result. */
|
|
40
|
+
export declare function emitTerminalScannerRunEvent(emit: (eventName: ScannerRuntimeEventName, event: ScannerRuntimeEventMap[ScannerRuntimeEventName]) => void, result: ScanResult): void;
|
|
41
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/scanners/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzE,yDAAyD;AACzD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,sBAAsB,EAAE,uBAAuB,CAAC;IAChD,kBAAkB,EAAE,mBAAmB,CAAC;IACxC,mBAAmB,EAAE,oBAAoB,CAAC;CAC3C;AAED,qEAAqE;AACrE,MAAM,MAAM,uBAAuB,GAAG,MAAM,sBAAsB,CAAC;AAEnE,sFAAsF;AACtF,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,CAAC,SAAS,EAAE,uBAAuB,EAAE,KAAK,EAAE,sBAAsB,CAAC,uBAAuB,CAAC,KAAK,IAAI,EAC1G,MAAM,EAAE,UAAU,GACjB,IAAI,CAiCN"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ScanStatus } from "./types.js";
|
|
2
|
+
/** Emits the terminal event (`complete|skip|error`) corresponding to a run result. */
|
|
3
|
+
export function emitTerminalScannerRunEvent(emit, result) {
|
|
4
|
+
const timestamp = result.timestamp;
|
|
5
|
+
if (result.status === ScanStatus.ERROR) {
|
|
6
|
+
emit("scanner:run:error", {
|
|
7
|
+
address: result.address,
|
|
8
|
+
scannerId: result.scannerId,
|
|
9
|
+
timestamp,
|
|
10
|
+
error: result.reason ?? "Unknown scanner error.",
|
|
11
|
+
});
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (result.status === ScanStatus.SKIPPED ||
|
|
15
|
+
result.status === ScanStatus.HALTED ||
|
|
16
|
+
result.status === ScanStatus.DISABLED) {
|
|
17
|
+
emit("scanner:run:skip", {
|
|
18
|
+
address: result.address,
|
|
19
|
+
scannerId: result.scannerId,
|
|
20
|
+
timestamp,
|
|
21
|
+
status: result.status,
|
|
22
|
+
reason: result.reason ?? "Scanner run skipped.",
|
|
23
|
+
});
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
emit("scanner:run:complete", {
|
|
27
|
+
address: result.address,
|
|
28
|
+
scannerId: result.scannerId,
|
|
29
|
+
timestamp,
|
|
30
|
+
result,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/scanners/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AA6CzE,sFAAsF;AACtF,MAAM,UAAU,2BAA2B,CACzC,IAA0G,EAC1G,MAAkB;IAElB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,mBAAmB,EAAE;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS;YACT,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,wBAAwB;SACjD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IACE,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO;QACpC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;QACnC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,QAAQ,EACrC,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,sBAAsB;SAChD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,CAAC,sBAAsB,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS;QACT,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
/**
|
|
3
|
+
* Discrete signal types emitted by the emerging-movers scanner (v4).
|
|
4
|
+
*
|
|
5
|
+
* Each type corresponds to a distinct market behaviour pattern detected in
|
|
6
|
+
* the SM (smart-money) leaderboard. They are listed in priority order — when
|
|
7
|
+
* multiple patterns fire for the same token, the highest-priority type wins.
|
|
8
|
+
*
|
|
9
|
+
* - **FIRST_JUMP** — Token rockets 10+ ranks from deep in the list and was
|
|
10
|
+
* either absent from the previous scan or ranked >= 30. This is the earliest
|
|
11
|
+
* possible entry signal; it fires before confirmation to catch moves early.
|
|
12
|
+
*
|
|
13
|
+
* - **CONTRIB_EXPLOSION** — Top-trader contribution increased 3x+ in a single
|
|
14
|
+
* scan, indicating a sudden concentration of smart-money interest.
|
|
15
|
+
*
|
|
16
|
+
* - **IMMEDIATE_MOVER** — 10+ rank jump from >= #25 in one scan, but the token
|
|
17
|
+
* was already tracked in the previous top-N (ruling out FIRST_JUMP).
|
|
18
|
+
*
|
|
19
|
+
* - **NEW_ENTRY_DEEP** — Token appears in the top-N for the first time and
|
|
20
|
+
* lands directly in the top 20, suggesting strong initial positioning.
|
|
21
|
+
*
|
|
22
|
+
* - **DEEP_CLIMBER** — Moderate rank improvement (>= minRankJump) from a deep
|
|
23
|
+
* starting position (>= #25). Catch-all for significant but non-explosive moves.
|
|
24
|
+
*/
|
|
25
|
+
export type EmergingMoverSignalType = "FIRST_JUMP" | "CONTRIB_EXPLOSION" | "IMMEDIATE_MOVER" | "NEW_ENTRY_DEEP" | "DEEP_CLIMBER";
|
|
26
|
+
declare const emergingMoversConfigSchema: import("@sinclair/typebox").TObject<{
|
|
27
|
+
topN: import("@sinclair/typebox").TNumber;
|
|
28
|
+
minRankJump: import("@sinclair/typebox").TNumber;
|
|
29
|
+
minTopTradersGain: import("@sinclair/typebox").TNumber;
|
|
30
|
+
minScansBeforeSignals: import("@sinclair/typebox").TNumber;
|
|
31
|
+
historyLimit: import("@sinclair/typebox").TNumber;
|
|
32
|
+
immediateJumpThreshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
33
|
+
deepClimbRankThreshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
34
|
+
contribExplosionMultiplier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
35
|
+
contribAccelThreshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
36
|
+
minVelocityForDeepClimber: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
37
|
+
erraticReversalThreshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
38
|
+
climbStreakScans: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
39
|
+
rankClimbThreshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
40
|
+
newEntryDeepMaxRank: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
41
|
+
newEntryMaxRank: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
42
|
+
firstJumpMinPrevRank: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
43
|
+
/** Enable regime-aware score gating via market-regime artifact. Default: false (disabled). */
|
|
44
|
+
regimeScoreGating: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
45
|
+
/** Score threshold when market regime is NEUTRAL. Only used when regimeScoreGating is true. */
|
|
46
|
+
regimeScoreNeutral: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
47
|
+
/** Score threshold when market regime is BULLISH or BEARISH. Only used when regimeScoreGating is true. */
|
|
48
|
+
regimeScoreDefault: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
49
|
+
/** Minimum asset max leverage to emit signals. 0 = disabled (no filtering). */
|
|
50
|
+
minLeverage: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
51
|
+
}>;
|
|
52
|
+
export type EmergingMoversConfig = Static<typeof emergingMoversConfigSchema>;
|
|
53
|
+
/**
|
|
54
|
+
* Config with all optional v4 fields guaranteed present.
|
|
55
|
+
* Created by {@link resolveConfig} at the start of each scan so detection
|
|
56
|
+
* rules never need to handle `undefined`.
|
|
57
|
+
*/
|
|
58
|
+
export type ResolvedEmergingMoversConfig = Required<EmergingMoversConfig>;
|
|
59
|
+
/**
|
|
60
|
+
* Persisted state carried across scan runs.
|
|
61
|
+
*
|
|
62
|
+
* The scanner is stateful: it must compare the current leaderboard snapshot
|
|
63
|
+
* against previous ones to detect rank movements and contribution trends.
|
|
64
|
+
* This state is saved to disk via `ctx.setState()` after every scan.
|
|
65
|
+
*/
|
|
66
|
+
export interface EmergingMoversState {
|
|
67
|
+
/** Total number of completed scans. Used to enforce the warm-up gate
|
|
68
|
+
* (`minScansBeforeSignals`) — no signals are emitted until enough
|
|
69
|
+
* history has accumulated to make comparisons meaningful. */
|
|
70
|
+
scans: number;
|
|
71
|
+
/** Per-token rank history (keyed by {@link tokenKey}).
|
|
72
|
+
* Each entry is a sliding window of the token's leaderboard rank
|
|
73
|
+
* across recent scans, capped at `historyLimit`. Enables multi-scan
|
|
74
|
+
* climb detection, streak analysis, and erratic-history filtering. */
|
|
75
|
+
rankHistory: Record<string, number[]>;
|
|
76
|
+
/** Per-token contribution history (keyed by {@link tokenKey}).
|
|
77
|
+
* Mirrors `rankHistory` but tracks `pctOfTopTradersGain` values.
|
|
78
|
+
* Used for contribution velocity, acceleration, and explosion detection. */
|
|
79
|
+
contribHistory: Record<string, number[]>;
|
|
80
|
+
/** Token keys present in the previous scan's top-N.
|
|
81
|
+
* Compared against the current scan to distinguish "first appearance"
|
|
82
|
+
* signals (FIRST_JUMP, NEW_ENTRY_DEEP) from rank movements within
|
|
83
|
+
* an already-tracked set. */
|
|
84
|
+
prevTopTokens: string[];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fully enriched alert candidate produced by {@link analyzeMarket}.
|
|
88
|
+
*
|
|
89
|
+
* Combines the market's raw data, accumulated detection flags, computed
|
|
90
|
+
* velocity, and history windows. Passed to {@link classifySignal} for
|
|
91
|
+
* type resolution and to {@link alertToSignal} for Signal construction.
|
|
92
|
+
*/
|
|
93
|
+
interface AlertCandidate {
|
|
94
|
+
/** Token symbol (e.g. "SOL", "WIF"). */
|
|
95
|
+
token: string;
|
|
96
|
+
/** Optional DEX identifier (e.g. "xyz"). When present, the token is
|
|
97
|
+
* qualified as `xyz:<token>` in the emitted signal's `asset` field. */
|
|
98
|
+
dex: string | undefined;
|
|
99
|
+
/** Market direction string from the SM data (e.g. "up", "short"). */
|
|
100
|
+
direction: string;
|
|
101
|
+
/** 1-based rank in the current scan's top-N. */
|
|
102
|
+
currentRank: number;
|
|
103
|
+
/** Raw `pctOfTopTradersGain` in the current scan. */
|
|
104
|
+
currentContrib: number;
|
|
105
|
+
/** 4-hour token price change percentage from the SM data source. */
|
|
106
|
+
priceChg4h: number;
|
|
107
|
+
/** Number of tracked traders for this token. */
|
|
108
|
+
traderCount: number;
|
|
109
|
+
/** Human-readable reason strings from every triggered detection rule. */
|
|
110
|
+
reasons: string[];
|
|
111
|
+
/** See {@link DetectionFlags.isDeepClimber}. */
|
|
112
|
+
isDeepClimber: boolean;
|
|
113
|
+
/** See {@link DetectionFlags.isImmediate}. */
|
|
114
|
+
isImmediate: boolean;
|
|
115
|
+
/** See {@link DetectionFlags.isFirstJump}. */
|
|
116
|
+
isFirstJump: boolean;
|
|
117
|
+
/** See {@link DetectionFlags.isContribExplosion}. */
|
|
118
|
+
isContribExplosion: boolean;
|
|
119
|
+
/** See {@link DetectionFlags.rankJumpThisScan}. */
|
|
120
|
+
rankJumpThisScan: number;
|
|
121
|
+
/** Average contribution change per scan over the recent window.
|
|
122
|
+
* Positive = contribution is accelerating; used by the velocity gate. */
|
|
123
|
+
contribVelocity: number;
|
|
124
|
+
/** Last <=5 rank values plus the current rank (for metadata / erratic check). */
|
|
125
|
+
rankHistoryWindow: (number | null)[];
|
|
126
|
+
/** Last <=5 contribution values plus the current one (as percentages, for metadata). */
|
|
127
|
+
contribHistoryWindow: (number | null)[];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Detects zigzag rank patterns that indicate market noise rather than a
|
|
131
|
+
* genuine trend.
|
|
132
|
+
*
|
|
133
|
+
* Scans consecutive rank deltas for direction reversals that exceed the
|
|
134
|
+
* threshold (e.g. improving 10 ranks then dropping 8). Such zigzags suggest
|
|
135
|
+
* the token is bouncing rather than sustainably climbing, and are used to
|
|
136
|
+
* downgrade IMMEDIATE_MOVER signals to the lower-priority DEEP_CLIMBER.
|
|
137
|
+
*
|
|
138
|
+
* @param excludeLast - When `true`, the final entry (this scan's rank) is
|
|
139
|
+
* removed before checking. This is critical for big-jump signals: the
|
|
140
|
+
* jump itself is the signal, not noise, so only the *pre-jump* history
|
|
141
|
+
* should be evaluated for erratic behaviour.
|
|
142
|
+
*/
|
|
143
|
+
export declare function isErraticHistory(rankHistory: (number | null)[], erraticReversalThreshold: number, excludeLast?: boolean): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Computes average contribution change per scan over the given window.
|
|
146
|
+
*
|
|
147
|
+
* Uses (last - first) / (length - 1) rather than summing individual deltas,
|
|
148
|
+
* which is algebraically identical but avoids floating-point accumulation.
|
|
149
|
+
* A positive result means contribution is trending up; the velocity gate
|
|
150
|
+
* uses this to filter out tokens whose rank improvement is not backed by
|
|
151
|
+
* growing smart-money concentration.
|
|
152
|
+
*/
|
|
153
|
+
export declare function computeContribVelocity(contribs: number[]): number;
|
|
154
|
+
/**
|
|
155
|
+
* Classifies an alert candidate into a signal type and applies quality
|
|
156
|
+
* filters (erratic history, velocity gate).
|
|
157
|
+
*
|
|
158
|
+
* The classification pipeline is:
|
|
159
|
+
* 1. **Resolve signal type** from detection flags (priority order).
|
|
160
|
+
* 2. **Check erratic history** — zigzag rank patterns indicate noise.
|
|
161
|
+
* 3. **Check velocity gate** — contribution velocity must be positive
|
|
162
|
+
* (IMMEDIATE/FIRST_JUMP) or above a minimum (DEEP_CLIMBER).
|
|
163
|
+
* 4. **Apply downgrades** — IMMEDIATE_MOVER is demoted to DEEP_CLIMBER
|
|
164
|
+
* when erratic or low-velocity. FIRST_JUMP and CONTRIB_EXPLOSION are
|
|
165
|
+
* immune to downgrades because they represent decisive, one-scan events
|
|
166
|
+
* where historical noise is irrelevant.
|
|
167
|
+
*
|
|
168
|
+
* @returns Classification result, or `null` if the candidate has no reasons
|
|
169
|
+
* (should not happen if called from {@link analyzeMarket}).
|
|
170
|
+
*/
|
|
171
|
+
export declare function classifySignal(alert: AlertCandidate, config: ResolvedEmergingMoversConfig): {
|
|
172
|
+
signalType: EmergingMoverSignalType;
|
|
173
|
+
priority: number;
|
|
174
|
+
conviction: number;
|
|
175
|
+
erratic: boolean;
|
|
176
|
+
lowVelocity: boolean;
|
|
177
|
+
} | null;
|
|
178
|
+
/**
|
|
179
|
+
* Creates the emerging-movers scanner instance (v4).
|
|
180
|
+
*
|
|
181
|
+
* This is the entry point registered in the scanner registry. It produces a
|
|
182
|
+
* stateful scanner that:
|
|
183
|
+
* 1. Ranks markets by `pctOfTopTradersGain` and tracks the top N.
|
|
184
|
+
* 2. Maintains per-token rank and contribution history across scans.
|
|
185
|
+
* 3. Runs 7 detection rules per market to identify emerging movers.
|
|
186
|
+
* 4. Classifies alerts into 5 signal types with conviction scoring.
|
|
187
|
+
* 5. Applies erratic-history and velocity-gate filters to reduce noise.
|
|
188
|
+
*/
|
|
189
|
+
export declare function emergingMoversScanner(): import("../index.js").Scanner<{
|
|
190
|
+
immediateJumpThreshold?: number | undefined;
|
|
191
|
+
deepClimbRankThreshold?: number | undefined;
|
|
192
|
+
contribExplosionMultiplier?: number | undefined;
|
|
193
|
+
contribAccelThreshold?: number | undefined;
|
|
194
|
+
minVelocityForDeepClimber?: number | undefined;
|
|
195
|
+
erraticReversalThreshold?: number | undefined;
|
|
196
|
+
climbStreakScans?: number | undefined;
|
|
197
|
+
rankClimbThreshold?: number | undefined;
|
|
198
|
+
newEntryDeepMaxRank?: number | undefined;
|
|
199
|
+
newEntryMaxRank?: number | undefined;
|
|
200
|
+
firstJumpMinPrevRank?: number | undefined;
|
|
201
|
+
regimeScoreGating?: boolean | undefined;
|
|
202
|
+
regimeScoreNeutral?: number | undefined;
|
|
203
|
+
regimeScoreDefault?: number | undefined;
|
|
204
|
+
minLeverage?: number | undefined;
|
|
205
|
+
topN: number;
|
|
206
|
+
minRankJump: number;
|
|
207
|
+
minTopTradersGain: number;
|
|
208
|
+
minScansBeforeSignals: number;
|
|
209
|
+
historyLimit: number;
|
|
210
|
+
}, EmergingMoversState>;
|
|
211
|
+
export {};
|
|
212
|
+
//# sourceMappingURL=emerging-movers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emerging-movers.d.ts","sourceRoot":"","sources":["../../../src/scanners/implementations/emerging-movers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAUtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,uBAAuB,GAC/B,YAAY,GACZ,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,CAAC;AA8BnB,QAAA,MAAM,0BAA0B;;;;;;;;;;;;;;;;;IAiB9B,8FAA8F;;IAE9F,+FAA+F;;IAE/F,0GAA0G;;IAE1G,+EAA+E;;EAE/E,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE7E;;;;GAIG;AACH,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAI1E;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC;;kEAE8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IAEd;;;2EAGuE;IACvE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtC;;iFAE6E;IAC7E,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC;;;kCAG8B;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAmHD;;;;;;GAMG;AACH,UAAU,cAAc;IACtB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IAEd;4EACwE;IACxE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAExB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAElB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IAEvB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,gDAAgD;IAChD,aAAa,EAAE,OAAO,CAAC;IAEvB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IAErB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IAErB,qDAAqD;IACrD,kBAAkB,EAAE,OAAO,CAAC;IAE5B,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,CAAC;IAEzB;8EAC0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IAExB,iFAAiF;IACjF,iBAAiB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAErC,wFAAwF;IACxF,oBAAoB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CACzC;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAC9B,wBAAwB,EAAE,MAAM,EAChC,WAAW,UAAQ,GAClB,OAAO,CAcT;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAIjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,4BAA4B,GACnC;IACD,UAAU,EAAE,uBAAuB,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,IAAI,CAmBP;AA8dD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB;;;;;;;;;;;;;;;;;;;;;wBAoHpC"}
|