@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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map trading strategy exit (dsl_presets or dsl) to DSL plugin ExitBlockConfig.
|
|
3
|
+
* Prefers exit.dsl_presets; falls back to exit.dsl. Passes engine and interval_seconds.
|
|
4
|
+
*/
|
|
5
|
+
function deriveMaxLossPct(preset) {
|
|
6
|
+
const n = preset.max_loss_pct;
|
|
7
|
+
if (typeof n === "number" && n > 0)
|
|
8
|
+
return n;
|
|
9
|
+
const phase1 = preset.phase1;
|
|
10
|
+
if (phase1 && typeof phase1.max_loss_pct === "number" && phase1.max_loss_pct > 0) {
|
|
11
|
+
return phase1.max_loss_pct;
|
|
12
|
+
}
|
|
13
|
+
const tiers = preset.tiers;
|
|
14
|
+
if (Array.isArray(tiers) && tiers.length > 0 && typeof tiers[0].lock_pct === "number") {
|
|
15
|
+
return Number(tiers[0].lock_pct);
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
function buildPreset(name, rawObj, source) {
|
|
20
|
+
const preset = {};
|
|
21
|
+
if (Array.isArray(rawObj.tiers)) {
|
|
22
|
+
preset.tiers = rawObj.tiers.map((t) => ({
|
|
23
|
+
trigger_pct: t.trigger_pct,
|
|
24
|
+
triggerPct: t.triggerPct,
|
|
25
|
+
lock_pct: t.lock_pct,
|
|
26
|
+
lockPct: t.lockPct,
|
|
27
|
+
breaches: t.breaches,
|
|
28
|
+
retrace: t.retrace,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
const maxLoss = deriveMaxLossPct(rawObj);
|
|
32
|
+
if (maxLoss == null || !(maxLoss > 0)) {
|
|
33
|
+
throw new Error(`exit.${source}.${name}: max_loss_pct is required or must be derivable from preset.max_loss_pct, preset.phase1.max_loss_pct, or preset.tiers[].lock_pct`);
|
|
34
|
+
}
|
|
35
|
+
preset.max_loss_pct = maxLoss;
|
|
36
|
+
if (rawObj.phase1 && typeof rawObj.phase1 === "object") {
|
|
37
|
+
const phase1 = rawObj.phase1;
|
|
38
|
+
preset.phase1 = {
|
|
39
|
+
consecutive_breaches_required: phase1.consecutive_breaches_required,
|
|
40
|
+
consecutiveBreachesRequired: phase1.consecutiveBreachesRequired,
|
|
41
|
+
max_loss_pct: phase1.max_loss_pct,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (typeof rawObj.phase2_trigger_tier === "number") {
|
|
45
|
+
preset.phase2_trigger_tier = rawObj.phase2_trigger_tier;
|
|
46
|
+
}
|
|
47
|
+
if (rawObj.phase2 && typeof rawObj.phase2 === "object") {
|
|
48
|
+
const p2 = rawObj.phase2;
|
|
49
|
+
preset.phase2 = {
|
|
50
|
+
retrace_threshold: p2.retrace_threshold,
|
|
51
|
+
retraceThreshold: p2.retraceThreshold,
|
|
52
|
+
retrace_from_hw: p2.retrace_from_hw,
|
|
53
|
+
consecutive_breaches_required: p2.consecutive_breaches_required,
|
|
54
|
+
consecutiveBreachesRequired: p2.consecutiveBreachesRequired,
|
|
55
|
+
tiers: Array.isArray(p2.tiers) ? p2.tiers : undefined,
|
|
56
|
+
};
|
|
57
|
+
if (preset.phase2.retrace_from_hw != null && preset.phase2.retrace_threshold == null) {
|
|
58
|
+
preset.phase2.retrace_threshold = preset.phase2.retrace_from_hw;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return preset;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Adapt playbook exit to ExitBlockConfig for parseDslPluginConfig.
|
|
65
|
+
* Uses exit.dsl_presets if present, else exit.dsl. Passes exit.interval_seconds and exit.engine.
|
|
66
|
+
*/
|
|
67
|
+
export function mapTradingStrategyExitToDslConfig(exit) {
|
|
68
|
+
const presetsSource = exit?.dsl_presets ?? exit?.dsl;
|
|
69
|
+
const sourceKey = exit?.dsl_presets != null ? "dsl_presets" : "dsl";
|
|
70
|
+
if (!presetsSource || typeof presetsSource !== "object") {
|
|
71
|
+
return {
|
|
72
|
+
interval_seconds: exit?.interval_seconds ?? 30,
|
|
73
|
+
...(exit?.engine != null && { engine: exit.engine }),
|
|
74
|
+
dsl_presets: {},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const dsl_presets = {};
|
|
78
|
+
for (const [name, raw] of Object.entries(presetsSource)) {
|
|
79
|
+
if (!raw || typeof raw !== "object")
|
|
80
|
+
continue;
|
|
81
|
+
dsl_presets[name] = buildPreset(name, raw, sourceKey);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
interval_seconds: exit?.interval_seconds ?? 30,
|
|
85
|
+
...(exit?.engine != null && { engine: exit.engine }),
|
|
86
|
+
dsl_presets: dsl_presets,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=map-exit-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-exit-config.js","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map skills.strategies to StrategyRegistration[] with scannerOverrides (interval, config).
|
|
3
|
+
* One registration per strategy; id = wallet, name = strategy key.
|
|
4
|
+
*/
|
|
5
|
+
import type { StrategyRegistration } from "../scanners/types.js";
|
|
6
|
+
import type { TradingStrategyConfig } from "./trading-strategy-schema.js";
|
|
7
|
+
/**
|
|
8
|
+
* Convert skills.strategies to StrategyRegistration[] for the scanner runtime module.
|
|
9
|
+
* One entry per strategy; id is resolved wallet, name is strategy key (e.g. aggressive-momentum).
|
|
10
|
+
*/
|
|
11
|
+
export declare function mapStrategiesToScannerRegistration(config: TradingStrategyConfig): StrategyRegistration[];
|
|
12
|
+
//# sourceMappingURL=map-strategies-registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-strategies-registration.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAyB1E;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,EAAE,CAiBxG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map skills.strategies to StrategyRegistration[] with scannerOverrides (interval, config).
|
|
3
|
+
* One registration per strategy; id = wallet, name = strategy key.
|
|
4
|
+
*/
|
|
5
|
+
import { parseInterval } from "./parse-interval.js";
|
|
6
|
+
function buildScannerOverrides(config) {
|
|
7
|
+
const scanners = config.scanners ?? [];
|
|
8
|
+
const overrides = {};
|
|
9
|
+
for (const sc of scanners) {
|
|
10
|
+
const entry = {};
|
|
11
|
+
if (sc.interval) {
|
|
12
|
+
try {
|
|
13
|
+
entry.intervalSeconds = parseInterval(sc.interval);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// leave unset if parse fails
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (sc.config !== undefined) {
|
|
20
|
+
entry.config = sc.config;
|
|
21
|
+
}
|
|
22
|
+
if (Object.keys(entry).length > 0) {
|
|
23
|
+
overrides[sc.name] = entry;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return Object.keys(overrides).length > 0 ? overrides : undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Convert skills.strategies to StrategyRegistration[] for the scanner runtime module.
|
|
30
|
+
* One entry per strategy; id is resolved wallet, name is strategy key (e.g. aggressive-momentum).
|
|
31
|
+
*/
|
|
32
|
+
export function mapStrategiesToScannerRegistration(config) {
|
|
33
|
+
const strategies = config.strategies;
|
|
34
|
+
const registrations = [];
|
|
35
|
+
if (!strategies || typeof strategies !== "object")
|
|
36
|
+
return registrations;
|
|
37
|
+
const scannerOverrides = buildScannerOverrides(config);
|
|
38
|
+
for (const [strategyName, entry] of Object.entries(strategies)) {
|
|
39
|
+
if (!entry || typeof entry !== "object")
|
|
40
|
+
continue;
|
|
41
|
+
const id = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
|
|
42
|
+
if (!id)
|
|
43
|
+
continue;
|
|
44
|
+
registrations.push({
|
|
45
|
+
id,
|
|
46
|
+
name: strategyName,
|
|
47
|
+
scannerOverrides,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return registrations;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=map-strategies-registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-strategies-registration.js","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,SAAS,qBAAqB,CAAC,MAA6B;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAmE,EAAE,CAAC;IACrF,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAmD,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAAC,MAA6B;IAC9E,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAExE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,aAAa,CAAC,IAAI,CAAC;YACjB,EAAE;YACF,IAAI,EAAE,YAAY;YAClB,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map skills strategies (keyed record) to Map<address, StrategyConfig>.
|
|
3
|
+
* Address = wallet (env-resolved). Coerces budget and numeric fields from strings.
|
|
4
|
+
*/
|
|
5
|
+
import type { StrategyConfig } from "../types/strategy.js";
|
|
6
|
+
import type { TradingStrategyConfig } from "./trading-strategy-schema.js";
|
|
7
|
+
/**
|
|
8
|
+
* Convert skills.strategies to a Map of address (wallet) → StrategyConfig.
|
|
9
|
+
* One entry per strategy; key is resolved wallet so runtime/state stay per-wallet.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mapStrategiesToConfig(config: TradingStrategyConfig): Map<string, StrategyConfig>;
|
|
12
|
+
//# sourceMappingURL=map-strategies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-strategies.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAW1E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAuBhG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map skills strategies (keyed record) to Map<address, StrategyConfig>.
|
|
3
|
+
* Address = wallet (env-resolved). Coerces budget and numeric fields from strings.
|
|
4
|
+
*/
|
|
5
|
+
function coerceNumber(v) {
|
|
6
|
+
if (typeof v === "number" && Number.isFinite(v))
|
|
7
|
+
return v;
|
|
8
|
+
if (typeof v === "string") {
|
|
9
|
+
const n = Number(v);
|
|
10
|
+
if (Number.isFinite(n))
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert skills.strategies to a Map of address (wallet) → StrategyConfig.
|
|
17
|
+
* One entry per strategy; key is resolved wallet so runtime/state stay per-wallet.
|
|
18
|
+
*/
|
|
19
|
+
export function mapStrategiesToConfig(config) {
|
|
20
|
+
const map = new Map();
|
|
21
|
+
const strategies = config.strategies;
|
|
22
|
+
if (!strategies || typeof strategies !== "object")
|
|
23
|
+
return map;
|
|
24
|
+
for (const [_name, entry] of Object.entries(strategies)) {
|
|
25
|
+
if (!entry || typeof entry !== "object")
|
|
26
|
+
continue;
|
|
27
|
+
const address = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
|
|
28
|
+
if (!address)
|
|
29
|
+
continue;
|
|
30
|
+
const config = {
|
|
31
|
+
address,
|
|
32
|
+
budget: coerceNumber(entry.budget),
|
|
33
|
+
slots: coerceNumber(entry.slots) || 1,
|
|
34
|
+
tradingRisk: typeof entry.trading_risk === "string" ? entry.trading_risk : "",
|
|
35
|
+
};
|
|
36
|
+
if (typeof entry.margin_per_slot === "number" || (typeof entry.margin_per_slot === "string" && entry.margin_per_slot !== "")) {
|
|
37
|
+
config.marginPerSlot = coerceNumber(entry.margin_per_slot);
|
|
38
|
+
}
|
|
39
|
+
if (typeof entry.enabled === "boolean") {
|
|
40
|
+
config.enabled = entry.enabled;
|
|
41
|
+
}
|
|
42
|
+
map.set(address, config);
|
|
43
|
+
}
|
|
44
|
+
return map;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=map-strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA6B;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC9D,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,MAAM,GAAmB;YAC7B,OAAO;YACP,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACrC,WAAW,EAAE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;SAC9E,CAAC;QACF,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,eAAe,KAAK,EAAE,CAAC,EAAE,CAAC;YAC7H,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotificationService: log and/or call notification API (stub logs only).
|
|
3
|
+
*/
|
|
4
|
+
import type { NotificationService } from "../types/notification.js";
|
|
5
|
+
export interface NotificationServiceOptions {
|
|
6
|
+
telegram_chat_id?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export declare function createNotificationService(_options?: NotificationServiceOptions): NotificationService;
|
|
10
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/runtime/notifications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,0BAA0B,GAAG,mBAAmB,CASpG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotificationService: log and/or call notification API (stub logs only).
|
|
3
|
+
*/
|
|
4
|
+
export function createNotificationService(_options) {
|
|
5
|
+
return {
|
|
6
|
+
async notify(message) {
|
|
7
|
+
// Stub: log only; extend to call Telegram etc. when config present
|
|
8
|
+
if (typeof message === "string" && message.length > 0) {
|
|
9
|
+
console.log("[Notification]", message);
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/runtime/notifications.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,UAAU,yBAAyB,CAAC,QAAqC;IAC7E,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,OAAe;YAC1B,mEAAmE;YACnE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse interval strings (e.g. "500ms", "30s", "3m", "1h") to seconds.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse an interval string to seconds.
|
|
6
|
+
* Supports: Nms, Ns, Nm, Nh (e.g. "500ms" → 0.5, "30s" → 30, "3m" → 180, "1h" → 3600).
|
|
7
|
+
* Returns the value in seconds (fractional for ms).
|
|
8
|
+
* @throws if the string does not match the expected format
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseInterval(s: string): number;
|
|
11
|
+
//# sourceMappingURL=parse-interval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-interval.d.ts","sourceRoot":"","sources":["../../src/runtime/parse-interval.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAyB/C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse interval strings (e.g. "500ms", "30s", "3m", "1h") to seconds.
|
|
3
|
+
*/
|
|
4
|
+
const INTERVAL_REGEX = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h)$/i;
|
|
5
|
+
/**
|
|
6
|
+
* Parse an interval string to seconds.
|
|
7
|
+
* Supports: Nms, Ns, Nm, Nh (e.g. "500ms" → 0.5, "30s" → 30, "3m" → 180, "1h" → 3600).
|
|
8
|
+
* Returns the value in seconds (fractional for ms).
|
|
9
|
+
* @throws if the string does not match the expected format
|
|
10
|
+
*/
|
|
11
|
+
export function parseInterval(s) {
|
|
12
|
+
const trimmed = String(s).trim();
|
|
13
|
+
const match = trimmed.match(INTERVAL_REGEX);
|
|
14
|
+
if (!match) {
|
|
15
|
+
throw new Error(`Invalid interval "${s}": expected format like 500ms, 30s, 3m, 1h`);
|
|
16
|
+
}
|
|
17
|
+
const value = Number(match[1]);
|
|
18
|
+
const unit = match[2].toLowerCase();
|
|
19
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
20
|
+
throw new Error(`Invalid interval "${s}": value must be a positive number`);
|
|
21
|
+
}
|
|
22
|
+
switch (unit) {
|
|
23
|
+
case "ms":
|
|
24
|
+
return value / 1000;
|
|
25
|
+
case "s":
|
|
26
|
+
return value;
|
|
27
|
+
case "m":
|
|
28
|
+
return value * 60;
|
|
29
|
+
case "h":
|
|
30
|
+
return value * 3600;
|
|
31
|
+
default:
|
|
32
|
+
throw new Error(`Invalid interval unit "${unit}" in "${s}"`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=parse-interval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-interval.js","sourceRoot":"","sources":["../../src/runtime/parse-interval.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,qBAAqB,CAAC,4CAA4C,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,oCAAoC,CAAC,CAAC;IAC9E,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI;YACP,OAAO,KAAK,GAAG,IAAI,CAAC;QACtB,KAAK,GAAG;YACN,OAAO,KAAK,CAAC;QACf,KAAK,GAAG;YACN,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,KAAK,GAAG;YACN,OAAO,KAAK,GAAG,IAAI,CAAC;QACtB;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-hydrate reconciliation: align StateManager DSL state with backend (Senpi/MCP) open positions.
|
|
3
|
+
* Best-effort: on backend failure for an address, we skip that address entirely (do not archive).
|
|
4
|
+
*/
|
|
5
|
+
import type { StateManager } from "../state/index.js";
|
|
6
|
+
import type { SenpiClient } from "../senpi/client.js";
|
|
7
|
+
import type { StrategyConfig } from "../types/strategy.js";
|
|
8
|
+
import type { SenpiEventBus } from "../types/event-bus.js";
|
|
9
|
+
export interface ReconcileOptions {
|
|
10
|
+
/** If provided, emit POSITION_CLOSED when a position is archived (e.g. from DSL monitor). */
|
|
11
|
+
bus?: SenpiEventBus;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Reconcile state with backend: fetch open positions per address and archive local DSL state
|
|
15
|
+
* for positions that are no longer on the exchange (e.g. closed manually externally).
|
|
16
|
+
* Only archives positions for addresses where listOpenPositions succeeded; if the API throws
|
|
17
|
+
* or is unavailable for an address, we do not archive any position for that address.
|
|
18
|
+
*
|
|
19
|
+
* Call after hydrate() in Runtime.start() and periodically from the DSL monitor tick.
|
|
20
|
+
*
|
|
21
|
+
* @param addressesOrStrategiesMap - strategy addresses to reconcile, or strategies Map (uses its keys)
|
|
22
|
+
* @param options - optional bus to emit POSITION_CLOSED when archiving (e.g. from monitor)
|
|
23
|
+
*/
|
|
24
|
+
export declare function reconcileStateWithBackend(stateManager: StateManager, senpi: SenpiClient, addressesOrStrategiesMap: string[] | Map<string, StrategyConfig>, options?: ReconcileOptions): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=reconcile-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-state.d.ts","sourceRoot":"","sources":["../../src/runtime/reconcile-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA8B3D,MAAM,WAAW,gBAAgB;IAC/B,6FAA6F;IAC7F,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,WAAW,EAClB,wBAAwB,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAChE,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-hydrate reconciliation: align StateManager DSL state with backend (Senpi/MCP) open positions.
|
|
3
|
+
* Best-effort: on backend failure for an address, we skip that address entirely (do not archive).
|
|
4
|
+
*/
|
|
5
|
+
import { CLOSE_REASON } from "../constants/dsl/index.js";
|
|
6
|
+
import { EVENTS } from "../constants/dsl/index.js";
|
|
7
|
+
import { createLogger } from "../utils/logger.js";
|
|
8
|
+
const logger = createLogger("[senpi-core][reconcile]");
|
|
9
|
+
function positionKey(address, asset, dex) {
|
|
10
|
+
return `${address}:${asset}:${dex ?? ""}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse a state key "address/dsl-ASSET" or "address/dsl-xyz--ASSET" to address, asset, dex.
|
|
14
|
+
*/
|
|
15
|
+
function parseDslKey(key) {
|
|
16
|
+
const i = key.indexOf("/dsl-");
|
|
17
|
+
if (i <= 0)
|
|
18
|
+
return null;
|
|
19
|
+
const address = key.slice(0, i);
|
|
20
|
+
const suffix = key.slice(i + 5);
|
|
21
|
+
if (suffix.startsWith("xyz--")) {
|
|
22
|
+
return { address, asset: suffix.slice(5), dex: "xyz" };
|
|
23
|
+
}
|
|
24
|
+
return { address, asset: suffix, dex: "" };
|
|
25
|
+
}
|
|
26
|
+
function effectiveDex(parsed) {
|
|
27
|
+
return parsed.dex ?? "";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reconcile state with backend: fetch open positions per address and archive local DSL state
|
|
31
|
+
* for positions that are no longer on the exchange (e.g. closed manually externally).
|
|
32
|
+
* Only archives positions for addresses where listOpenPositions succeeded; if the API throws
|
|
33
|
+
* or is unavailable for an address, we do not archive any position for that address.
|
|
34
|
+
*
|
|
35
|
+
* Call after hydrate() in Runtime.start() and periodically from the DSL monitor tick.
|
|
36
|
+
*
|
|
37
|
+
* @param addressesOrStrategiesMap - strategy addresses to reconcile, or strategies Map (uses its keys)
|
|
38
|
+
* @param options - optional bus to emit POSITION_CLOSED when archiving (e.g. from monitor)
|
|
39
|
+
*/
|
|
40
|
+
export async function reconcileStateWithBackend(stateManager, senpi, addressesOrStrategiesMap, options) {
|
|
41
|
+
const { bus } = options ?? {};
|
|
42
|
+
const addresses = addressesOrStrategiesMap instanceof Map
|
|
43
|
+
? Array.from(addressesOrStrategiesMap.keys())
|
|
44
|
+
: addressesOrStrategiesMap;
|
|
45
|
+
logger.debug("reconcile begin", { addresses, count: addresses.length });
|
|
46
|
+
const backendPositionKeys = new Set();
|
|
47
|
+
const successfullyFetchedAddresses = new Set();
|
|
48
|
+
for (const address of addresses) {
|
|
49
|
+
try {
|
|
50
|
+
const positions = await senpi.listOpenPositions(address);
|
|
51
|
+
successfullyFetchedAddresses.add(address);
|
|
52
|
+
for (const p of positions) {
|
|
53
|
+
const coin = p.coin ?? "";
|
|
54
|
+
const dex = p.dex ?? "";
|
|
55
|
+
if (coin)
|
|
56
|
+
backendPositionKeys.add(positionKey(address, coin, dex));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
logger.warn("reconcile: listOpenPositions failed, skipping wallet (no positions archived)", {
|
|
61
|
+
address,
|
|
62
|
+
err,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
logger.debug("reconcile: backend positions collected", {
|
|
67
|
+
backendPositionKeysCount: backendPositionKeys.size,
|
|
68
|
+
successfullyFetchedCount: successfullyFetchedAddresses.size,
|
|
69
|
+
});
|
|
70
|
+
const dslKeys = stateManager.listDslKeys("");
|
|
71
|
+
const ts = new Date().toISOString();
|
|
72
|
+
for (const key of dslKeys) {
|
|
73
|
+
const parsed = parseDslKey(key);
|
|
74
|
+
if (!parsed)
|
|
75
|
+
continue;
|
|
76
|
+
if (!successfullyFetchedAddresses.has(parsed.address))
|
|
77
|
+
continue;
|
|
78
|
+
const state = stateManager.get(key);
|
|
79
|
+
if (!state || !state.active)
|
|
80
|
+
continue;
|
|
81
|
+
const pk = positionKey(parsed.address, parsed.asset, parsed.dex);
|
|
82
|
+
if (backendPositionKeys.has(pk))
|
|
83
|
+
continue;
|
|
84
|
+
try {
|
|
85
|
+
const closedState = {
|
|
86
|
+
...state,
|
|
87
|
+
active: false,
|
|
88
|
+
closedAt: ts,
|
|
89
|
+
closeReason: CLOSE_REASON.CLOSED_EXTERNALLY,
|
|
90
|
+
};
|
|
91
|
+
await stateManager.archiveAndDeleteDslState(parsed.address, parsed.asset, effectiveDex(parsed), closedState);
|
|
92
|
+
logger.info("reconcile: archived DSL state (position no longer on backend)", {
|
|
93
|
+
address: parsed.address,
|
|
94
|
+
asset: parsed.asset,
|
|
95
|
+
});
|
|
96
|
+
if (bus) {
|
|
97
|
+
const tsEmit = new Date().toISOString();
|
|
98
|
+
bus.emit(EVENTS.POSITION_CLOSED, {
|
|
99
|
+
address: parsed.address,
|
|
100
|
+
asset: parsed.asset,
|
|
101
|
+
wallet: state.wallet,
|
|
102
|
+
reason: CLOSE_REASON.CLOSED_EXTERNALLY,
|
|
103
|
+
closeReason: CLOSE_REASON.CLOSED_EXTERNALLY,
|
|
104
|
+
timestamp: tsEmit,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
logger.warn("reconcile: failed to archive state", { key, err });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
logger.debug("reconcile complete", { dslKeysChecked: dslKeys.length });
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=reconcile-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-state.js","sourceRoot":"","sources":["../../src/runtime/reconcile-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-guard.d.ts","sourceRoot":"","sources":["../../src/runtime/risk-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAmB,SAAS,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEnF,wBAAgB,eAAe,IAAI,UAAU,CAS5C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RiskGuard: gate check and record entry (stub - gate always OPEN, record no-op).
|
|
3
|
+
*/
|
|
4
|
+
export function createRiskGuard() {
|
|
5
|
+
return {
|
|
6
|
+
checkGate(_address, _guardRails) {
|
|
7
|
+
return { gate: "OPEN" };
|
|
8
|
+
},
|
|
9
|
+
recordEntry(_address, _guardRails) {
|
|
10
|
+
// no-op
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=risk-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-guard.js","sourceRoot":"","sources":["../../src/runtime/risk-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,SAAS,CAAC,QAAgB,EAAE,WAAqC;YAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,WAAW,CAAC,QAAgB,EAAE,WAAqC;YACjE,QAAQ;QACV,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic entry: load trading strategy and start runtime. Returns handle with stop().
|
|
3
|
+
*/
|
|
4
|
+
import type { McpTransport } from "../senpi/types.js";
|
|
5
|
+
import type { ScannerDataProviders } from "../scanners/engine/data-providers.js";
|
|
6
|
+
export interface RunOptions {
|
|
7
|
+
fromPath?: boolean;
|
|
8
|
+
stateDir?: string;
|
|
9
|
+
mcpTransport?: McpTransport;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
scannerProviders?: ScannerDataProviders;
|
|
12
|
+
}
|
|
13
|
+
export interface RuntimeHandle {
|
|
14
|
+
stop(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Load trading strategy from path or content, create Runtime, start it, and return a handle with stop().
|
|
18
|
+
* Programmatic API used by the OpenClaw adapter and standalone CLI.
|
|
19
|
+
*/
|
|
20
|
+
export declare function run(strategyPathOrContent: string, options?: RunOptions): Promise<RuntimeHandle>;
|
|
21
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAQjF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,GAAG,CACvB,qBAAqB,EAAE,MAAM,EAC7B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,aAAa,CAAC,CA8BxB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic entry: load trading strategy and start runtime. Returns handle with stop().
|
|
3
|
+
*/
|
|
4
|
+
import { createLogger } from "../utils/logger.js";
|
|
5
|
+
import { getDefaultStateDir } from "./default-state-dir.js";
|
|
6
|
+
import { loadTradingStrategy } from "./load-trading-strategy.js";
|
|
7
|
+
import { Runtime } from "./runtime.js";
|
|
8
|
+
const logger = createLogger("[senpi-core][run]");
|
|
9
|
+
/**
|
|
10
|
+
* Load trading strategy from path or content, create Runtime, start it, and return a handle with stop().
|
|
11
|
+
* Programmatic API used by the OpenClaw adapter and standalone CLI.
|
|
12
|
+
*/
|
|
13
|
+
export async function run(strategyPathOrContent, options) {
|
|
14
|
+
logger.debug("run() begin", { fromPath: options?.fromPath, hasStateDir: !!options?.stateDir });
|
|
15
|
+
const fromPath = options?.fromPath === true;
|
|
16
|
+
const config = await loadTradingStrategy(strategyPathOrContent, { fromPath });
|
|
17
|
+
logger.debug("run() trading strategy loaded", { name: config.name, scannersCount: config.scanners?.length ?? 0, actionsCount: config.actions?.length ?? 0 });
|
|
18
|
+
const stateDir = (typeof options?.stateDir === "string" && options.stateDir.length > 0)
|
|
19
|
+
? options.stateDir
|
|
20
|
+
: getDefaultStateDir();
|
|
21
|
+
const mcpTransport = options?.mcpTransport;
|
|
22
|
+
const apiKey = options?.apiKey;
|
|
23
|
+
if (!mcpTransport && !apiKey) {
|
|
24
|
+
throw new Error("run() requires mcpTransport or apiKey for full operation");
|
|
25
|
+
}
|
|
26
|
+
const runtime = new Runtime(config, {
|
|
27
|
+
stateDir,
|
|
28
|
+
mcpTransport,
|
|
29
|
+
apiKey,
|
|
30
|
+
scannerProviders: options?.scannerProviders,
|
|
31
|
+
});
|
|
32
|
+
logger.debug("run() runtime created, starting", { stateDir });
|
|
33
|
+
await runtime.start();
|
|
34
|
+
logger.debug("run() runtime started, returning handle");
|
|
35
|
+
return {
|
|
36
|
+
async stop() {
|
|
37
|
+
logger.debug("run() handle.stop() called");
|
|
38
|
+
await runtime.stop();
|
|
39
|
+
logger.debug("run() handle.stop() complete");
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAcjD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,qBAA6B,EAC7B,OAAoB;IAEpB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7J,MAAM,QAAQ,GACZ,CAAC,OAAO,OAAO,EAAE,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC,OAAO,CAAC,QAAQ;QAClB,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE;QAClC,QAAQ;QACR,YAAY;QACZ,MAAM;QACN,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;KAC5C,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACxD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC3C,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime: orchestrates trading strategy config, scanner module, actions, DSL, risk, health.
|
|
3
|
+
*/
|
|
4
|
+
import type { TradingStrategyConfig } from "./trading-strategy-config.js";
|
|
5
|
+
import type { McpTransport } from "../senpi/types.js";
|
|
6
|
+
import type { ScannerDataProviders } from "../scanners/engine/data-providers.js";
|
|
7
|
+
export interface RuntimeOptions {
|
|
8
|
+
stateDir: string;
|
|
9
|
+
mcpTransport?: McpTransport;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
scannerProviders?: ScannerDataProviders;
|
|
12
|
+
}
|
|
13
|
+
export declare class Runtime {
|
|
14
|
+
private readonly config;
|
|
15
|
+
private readonly options;
|
|
16
|
+
private bus;
|
|
17
|
+
private hookSystem;
|
|
18
|
+
private stateManager;
|
|
19
|
+
private scannerModule;
|
|
20
|
+
private dslPlugin;
|
|
21
|
+
private senpi;
|
|
22
|
+
private started;
|
|
23
|
+
/** Serial signal processing: queue and consumer so only one signal is handled at a time. */
|
|
24
|
+
private signalQueue;
|
|
25
|
+
private signalQueueWait;
|
|
26
|
+
private signalConsumerStopped;
|
|
27
|
+
private signalConsumerDone;
|
|
28
|
+
private runActionsForSignal;
|
|
29
|
+
private strategiesMap;
|
|
30
|
+
/** Stored so we can call off() in stop() and avoid retaining Runtime via scanner EventEmitter. */
|
|
31
|
+
private onScannerRunComplete;
|
|
32
|
+
constructor(config: TradingStrategyConfig, options: RuntimeOptions);
|
|
33
|
+
start(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Single consumer: process one scanner:run:complete at a time so slot counts stay correct.
|
|
36
|
+
*/
|
|
37
|
+
private runSignalConsumer;
|
|
38
|
+
stop(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=runtime.d.ts.map
|