@senpi/trading-recipe 1.0.21
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/close-position/close-position.action.d.ts +16 -0
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -0
- package/dist/actions/close-position/close-position.action.js +215 -0
- package/dist/actions/close-position/close-position.action.js.map +1 -0
- package/dist/actions/decision-engine.d.ts +32 -0
- package/dist/actions/decision-engine.d.ts.map +1 -0
- package/dist/actions/decision-engine.js +103 -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 +16 -0
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -0
- package/dist/actions/open-position/open-position.action.js +275 -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 +345 -0
- package/dist/cli/guide-commands.js.map +1 -0
- package/dist/cli/senpi-commands.d.ts +20 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -0
- package/dist/cli/senpi-commands.js +115 -0
- package/dist/cli/senpi-commands.js.map +1 -0
- package/dist/constants/dsl/index.d.ts +45 -0
- package/dist/constants/dsl/index.d.ts.map +1 -0
- package/dist/constants/dsl/index.js +45 -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 +59 -0
- package/dist/dsl/config/index.d.ts.map +1 -0
- package/dist/dsl/config/index.js +171 -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 +310 -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 +252 -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 +310 -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 +95 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +235 -0
- package/dist/index.js.map +1 -0
- package/dist/leverage/max-leverage-cache.d.ts +10 -0
- package/dist/leverage/max-leverage-cache.d.ts.map +1 -0
- package/dist/leverage/max-leverage-cache.js +51 -0
- package/dist/leverage/max-leverage-cache.js.map +1 -0
- package/dist/leverage/resolve-leverage.d.ts +9 -0
- package/dist/leverage/resolve-leverage.d.ts.map +1 -0
- package/dist/leverage/resolve-leverage.js +15 -0
- package/dist/leverage/resolve-leverage.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 +20 -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 +40 -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 +71 -0
- package/dist/runtime/create-actions.js.map +1 -0
- package/dist/runtime/create-runtime-context.d.ts +35 -0
- package/dist/runtime/create-runtime-context.d.ts.map +1 -0
- package/dist/runtime/create-runtime-context.js +33 -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 +23 -0
- package/dist/runtime/load-trading-strategy.d.ts.map +1 -0
- package/dist/runtime/load-trading-strategy.js +130 -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 +91 -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 +66 -0
- package/dist/runtime/map-strategies.js.map +1 -0
- package/dist/runtime/notifications.d.ts +12 -0
- package/dist/runtime/notifications.d.ts.map +1 -0
- package/dist/runtime/notifications.js +83 -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 +112 -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 +35 -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 +251 -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 +83 -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 +156 -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 +20093 -0
- package/dist/runtime/trading-strategy-schema.d.ts.map +1 -0
- package/dist/runtime/trading-strategy-schema.js +115 -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 +47 -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 +149 -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 +215 -0
- package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
- package/dist/scanners/implementations/emerging-movers.js +709 -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/liquidation-watchdog.d.ts +74 -0
- package/dist/scanners/implementations/liquidation-watchdog.d.ts.map +1 -0
- package/dist/scanners/implementations/liquidation-watchdog.js +268 -0
- package/dist/scanners/implementations/liquidation-watchdog.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 +25 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +18 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/input-descriptors.d.ts +61 -0
- package/dist/scanners/input-descriptors.d.ts.map +1 -0
- package/dist/scanners/input-descriptors.js +43 -0
- package/dist/scanners/input-descriptors.js.map +1 -0
- package/dist/scanners/protocol/context.d.ts +75 -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 +43 -0
- package/dist/scanners/providers/factory.d.ts.map +1 -0
- package/dist/scanners/providers/factory.js +192 -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 +90 -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 +77 -0
- package/dist/senpi/client.d.ts.map +1 -0
- package/dist/senpi/client.js +523 -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 +58 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +221 -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 +48 -0
- package/dist/strategy/strategy-state.d.ts.map +1 -0
- package/dist/strategy/strategy-state.js +185 -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 +215 -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 +18 -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 +100 -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-liquidation-watchdog.mjs +331 -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 +60 -0
- package/examples/strategies/fox-minimal-loosened.yaml +201 -0
- package/examples/strategies/fox-minimal.yaml +209 -0
- package/examples/strategies/minimal.yaml +49 -0
- package/examples/strategies/viper.yaml +64 -0
- package/examples/strategies/wolf.yaml +62 -0
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +116 -0
- package/openclaw.plugin.json +15 -0
- package/package.json +52 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load and validate trading strategy YAML. Resolves env vars and validates with Zod.
|
|
3
|
+
* SECURITY: Do not log the resolved config or pathOrContent; they may contain
|
|
4
|
+
* secrets substituted from environment variables.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { parse } from "yaml";
|
|
8
|
+
import { tradingStrategyConfigSchema } from "./trading-strategy-schema.js";
|
|
9
|
+
import { resolveEnvInObject } from "./env-resolve.js";
|
|
10
|
+
/**
|
|
11
|
+
* Minimal valid YAML structure shown in validation errors so users can fix their file.
|
|
12
|
+
* Keep this in sync with tradingStrategyConfigSchema (name + non-empty strategies with wallet).
|
|
13
|
+
*/
|
|
14
|
+
export const MINIMAL_STRATEGY_YAML_SAMPLE = `# Required: name and at least one strategy with a wallet
|
|
15
|
+
name: my-strategy
|
|
16
|
+
strategies:
|
|
17
|
+
my-first-strategy:
|
|
18
|
+
wallet: "your-wallet-address"
|
|
19
|
+
# optional: budget, slots, enabled, etc.
|
|
20
|
+
|
|
21
|
+
# Optional: scanners, actions, exit. Run: openclaw senpi guide examples
|
|
22
|
+
`;
|
|
23
|
+
const HINTS = [
|
|
24
|
+
{
|
|
25
|
+
pathMatch: /\.context(\.|$)/,
|
|
26
|
+
messageMatch: /Expected object|Required/,
|
|
27
|
+
hint: "Each context entry must be an object with 'type' and 'value'. Example: context: [{ type: 'portfolio', value: 'default' }]",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
pathMatch: /^strategies\.\w+\.wallet$|\.strategies\.\w+\.wallet$/,
|
|
31
|
+
messageMatch: /Expected string|Required|min/,
|
|
32
|
+
hint: "Each strategy must have wallet as a string (e.g. wallet: \"0x...\" or wallet: \"your-address\").",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
pathMatch: /\.scanners(\.\d+)?(\.|$)/,
|
|
36
|
+
messageMatch: /Expected array|Expected string|Required/,
|
|
37
|
+
hint: "In an action, scanners must be an array of scanner names from your scanners block (e.g. scanners: [emerging_movers]).",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
pathMatch: /^scanners\.\d+/,
|
|
41
|
+
messageMatch: /Required|Expected/,
|
|
42
|
+
hint: "Each scanner must have 'name' and 'type'; 'interval' is optional (e.g. interval: 20s).",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
pathMatch: /^name$|^name\./,
|
|
46
|
+
messageMatch: /Required|Expected string/,
|
|
47
|
+
hint: "Top-level 'name' is required and must be a non-empty string (e.g. name: my-strategy).",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
pathMatch: /^exit\.|\.exit\.|dsl_presets|\.dsl\./,
|
|
51
|
+
messageMatch: /required|Expected|derivable/,
|
|
52
|
+
hint: "exit.dsl_presets: each preset needs max_loss_pct (in phase1 or at preset level) or tiers with lock_pct. Run: openclaw senpi guide exit",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
pathMatch: /^actions\.\d+\./,
|
|
56
|
+
messageMatch: /Required|Expected/,
|
|
57
|
+
hint: "Each action must have name, action_type (e.g. OPEN_POSITION), and for LLM decisions: decision_mode, decision_model, scanners, min_confidence.",
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Turn a path like ["actions", 0, "context", 0] into a readable label (e.g. "actions.0.context.0").
|
|
62
|
+
*/
|
|
63
|
+
function formatPath(path) {
|
|
64
|
+
if (path.length === 0)
|
|
65
|
+
return "root";
|
|
66
|
+
return path.join(".");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Return a clearer message for known validation paths; otherwise return the original.
|
|
70
|
+
*/
|
|
71
|
+
function clarifyMessage(path, message) {
|
|
72
|
+
const pathStr = path.length > 0 ? path.join(".") : "root";
|
|
73
|
+
for (const { pathMatch, messageMatch, hint } of HINTS) {
|
|
74
|
+
if (pathMatch.test(pathStr) && messageMatch.test(message)) {
|
|
75
|
+
return `${message}. ${hint}`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return message;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format ZodError into a readable, path-based message and append a minimal YAML sample.
|
|
82
|
+
*/
|
|
83
|
+
function formatZodError(message, issues) {
|
|
84
|
+
if (issues.length === 0)
|
|
85
|
+
return message;
|
|
86
|
+
const lines = issues.map((i) => {
|
|
87
|
+
const pathLabel = formatPath(i.path);
|
|
88
|
+
const msg = clarifyMessage(i.path, i.message);
|
|
89
|
+
return ` • ${pathLabel}: ${msg}`;
|
|
90
|
+
});
|
|
91
|
+
const pathTip = "Tip: Paths use dot notation; a number is the 0-based index (e.g. strategies.alpha = strategy id 'alpha', actions.0 = first action).";
|
|
92
|
+
return `${message}\n${lines.join("\n")}\n\n${pathTip}\n\nExample of required structure:\n${MINIMAL_STRATEGY_YAML_SAMPLE}`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Load trading strategy from a file path or YAML string.
|
|
96
|
+
* - If fromPath is true, pathOrContent is a file path.
|
|
97
|
+
* - Otherwise pathOrContent is the YAML string.
|
|
98
|
+
* After parse, env vars are resolved and the result is validated with the Zod schema.
|
|
99
|
+
* Throws with path-based error messages on validation failure.
|
|
100
|
+
*/
|
|
101
|
+
export async function loadTradingStrategy(pathOrContent, options) {
|
|
102
|
+
const fromPath = options?.fromPath === true;
|
|
103
|
+
let raw;
|
|
104
|
+
try {
|
|
105
|
+
if (fromPath) {
|
|
106
|
+
const content = await readFile(pathOrContent, "utf-8");
|
|
107
|
+
raw = parse(content);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
raw = parse(pathOrContent);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (parseErr) {
|
|
114
|
+
const detail = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
115
|
+
throw new Error(`Invalid YAML syntax. Please check indentation, colons, and quotes.\nDetails: ${detail}\n\nExample of valid structure:\n${MINIMAL_STRATEGY_YAML_SAMPLE}`);
|
|
116
|
+
}
|
|
117
|
+
if (raw === null || raw === undefined || typeof raw !== "object") {
|
|
118
|
+
throw new Error("The YAML file must define an object (e.g. name and strategies at the top level).\n\nExample of required structure:\n" +
|
|
119
|
+
MINIMAL_STRATEGY_YAML_SAMPLE);
|
|
120
|
+
}
|
|
121
|
+
const resolved = resolveEnvInObject(raw);
|
|
122
|
+
const result = tradingStrategyConfigSchema.safeParse(resolved);
|
|
123
|
+
if (result.success) {
|
|
124
|
+
return result.data;
|
|
125
|
+
}
|
|
126
|
+
const err = result.error;
|
|
127
|
+
const message = formatZodError("Trading strategy validation failed:", err.issues.map((issue) => ({ path: issue.path, message: issue.message })));
|
|
128
|
+
throw new Error(message);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=load-trading-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-trading-strategy.js","sourceRoot":"","sources":["../../src/runtime/load-trading-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
import type { ExitBlockConfig } from "../dsl/config/index.js";
|
|
6
|
+
import type { TradingStrategyExit } from "./trading-strategy-schema.js";
|
|
7
|
+
/**
|
|
8
|
+
* Adapt playbook exit to ExitBlockConfig for parseDslPluginConfig.
|
|
9
|
+
* Uses exit.dsl_presets if present, else exit.dsl. Passes exit.interval_seconds and exit.engine.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mapTradingStrategyExitToDslConfig(exit: TradingStrategyExit | undefined): ExitBlockConfig;
|
|
12
|
+
//# sourceMappingURL=map-exit-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-exit-config.d.ts","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AA4FxE;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,mBAAmB,GAAG,SAAS,GAAG,eAAe,CAoBxG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 (rawObj.lock_mode != null)
|
|
22
|
+
preset.lock_mode = String(rawObj.lock_mode);
|
|
23
|
+
if (Array.isArray(rawObj.tiers)) {
|
|
24
|
+
preset.tiers = rawObj.tiers.map((t) => ({
|
|
25
|
+
trigger_pct: t.trigger_pct,
|
|
26
|
+
triggerPct: t.triggerPct,
|
|
27
|
+
lock_pct: t.lock_pct,
|
|
28
|
+
lockPct: t.lockPct,
|
|
29
|
+
breaches: t.breaches,
|
|
30
|
+
retrace: t.retrace,
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
const maxLoss = deriveMaxLossPct(rawObj);
|
|
34
|
+
if (maxLoss == null || !(maxLoss > 0)) {
|
|
35
|
+
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. Add one of these to your YAML preset. Run: openclaw senpi guide exit`);
|
|
36
|
+
}
|
|
37
|
+
preset.max_loss_pct = maxLoss;
|
|
38
|
+
if (rawObj.phase1 && typeof rawObj.phase1 === "object") {
|
|
39
|
+
const phase1 = rawObj.phase1;
|
|
40
|
+
preset.phase1 = {
|
|
41
|
+
consecutive_breaches_required: phase1.consecutive_breaches_required,
|
|
42
|
+
consecutiveBreachesRequired: phase1.consecutiveBreachesRequired,
|
|
43
|
+
max_loss_pct: phase1.max_loss_pct,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (typeof rawObj.phase2_trigger_tier === "number") {
|
|
47
|
+
preset.phase2_trigger_tier = rawObj.phase2_trigger_tier;
|
|
48
|
+
}
|
|
49
|
+
if (rawObj.phase2 && typeof rawObj.phase2 === "object") {
|
|
50
|
+
const p2 = rawObj.phase2;
|
|
51
|
+
preset.phase2 = {
|
|
52
|
+
retrace_threshold: p2.retrace_threshold,
|
|
53
|
+
retraceThreshold: p2.retraceThreshold,
|
|
54
|
+
retrace_from_hw: p2.retrace_from_hw,
|
|
55
|
+
consecutive_breaches_required: p2.consecutive_breaches_required,
|
|
56
|
+
consecutiveBreachesRequired: p2.consecutiveBreachesRequired,
|
|
57
|
+
tiers: Array.isArray(p2.tiers) ? p2.tiers : undefined,
|
|
58
|
+
};
|
|
59
|
+
if (preset.phase2.retrace_from_hw != null && preset.phase2.retrace_threshold == null) {
|
|
60
|
+
preset.phase2.retrace_threshold = preset.phase2.retrace_from_hw;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return preset;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Adapt playbook exit to ExitBlockConfig for parseDslPluginConfig.
|
|
67
|
+
* Uses exit.dsl_presets if present, else exit.dsl. Passes exit.interval_seconds and exit.engine.
|
|
68
|
+
*/
|
|
69
|
+
export function mapTradingStrategyExitToDslConfig(exit) {
|
|
70
|
+
const presetsSource = exit?.dsl_presets ?? exit?.dsl;
|
|
71
|
+
const sourceKey = exit?.dsl_presets != null ? "dsl_presets" : "dsl";
|
|
72
|
+
if (!presetsSource || typeof presetsSource !== "object") {
|
|
73
|
+
return {
|
|
74
|
+
interval_seconds: exit?.interval_seconds ?? 30,
|
|
75
|
+
...(exit?.engine != null && { engine: exit.engine }),
|
|
76
|
+
dsl_presets: {},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const dsl_presets = {};
|
|
80
|
+
for (const [name, raw] of Object.entries(presetsSource)) {
|
|
81
|
+
if (!raw || typeof raw !== "object")
|
|
82
|
+
continue;
|
|
83
|
+
dsl_presets[name] = buildPreset(name, raw, sourceKey);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
interval_seconds: exit?.interval_seconds ?? 30,
|
|
87
|
+
...(exit?.engine != null && { engine: exit.engine }),
|
|
88
|
+
dsl_presets: dsl_presets,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# 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;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAa1E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CA0ChG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
const VALID_TRADING_RISKS = ['conservative', 'moderate', 'aggressive'];
|
|
6
|
+
function coerceNumber(v) {
|
|
7
|
+
if (typeof v === "number" && Number.isFinite(v))
|
|
8
|
+
return v;
|
|
9
|
+
if (typeof v === "string") {
|
|
10
|
+
const n = Number(v);
|
|
11
|
+
if (Number.isFinite(n))
|
|
12
|
+
return n;
|
|
13
|
+
}
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Convert skills.strategies to a Map of address (wallet) → StrategyConfig.
|
|
18
|
+
* One entry per strategy; key is resolved wallet so runtime/state stay per-wallet.
|
|
19
|
+
*/
|
|
20
|
+
export function mapStrategiesToConfig(config) {
|
|
21
|
+
const map = new Map();
|
|
22
|
+
const strategies = config.strategies;
|
|
23
|
+
if (!strategies || typeof strategies !== "object")
|
|
24
|
+
return map;
|
|
25
|
+
for (const [_name, entry] of Object.entries(strategies)) {
|
|
26
|
+
if (!entry || typeof entry !== "object")
|
|
27
|
+
continue;
|
|
28
|
+
const address = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
|
|
29
|
+
if (!address)
|
|
30
|
+
continue;
|
|
31
|
+
const rawRisk = typeof entry.trading_risk === "string" ? entry.trading_risk : "";
|
|
32
|
+
const tradingRisk = VALID_TRADING_RISKS.includes(rawRisk)
|
|
33
|
+
? rawRisk
|
|
34
|
+
: 'moderate';
|
|
35
|
+
const config = {
|
|
36
|
+
address,
|
|
37
|
+
budget: coerceNumber(entry.budget),
|
|
38
|
+
slots: coerceNumber(entry.slots) || 1,
|
|
39
|
+
tradingRisk,
|
|
40
|
+
};
|
|
41
|
+
if (typeof entry.margin_per_slot === "number" || (typeof entry.margin_per_slot === "string" && entry.margin_per_slot !== "")) {
|
|
42
|
+
config.marginPerSlot = coerceNumber(entry.margin_per_slot);
|
|
43
|
+
}
|
|
44
|
+
if (typeof entry.default_leverage === "number") {
|
|
45
|
+
config.defaultLeverage = entry.default_leverage;
|
|
46
|
+
}
|
|
47
|
+
if (entry.leverage_multipliers != null && typeof entry.leverage_multipliers === "object") {
|
|
48
|
+
const lm = entry.leverage_multipliers;
|
|
49
|
+
const multipliers = {};
|
|
50
|
+
for (const key of VALID_TRADING_RISKS) {
|
|
51
|
+
if (typeof lm[key] === "number") {
|
|
52
|
+
multipliers[key] = lm[key];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (Object.keys(multipliers).length > 0) {
|
|
56
|
+
config.leverageMultipliers = multipliers;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (typeof entry.enabled === "boolean") {
|
|
60
|
+
config.enabled = entry.enabled;
|
|
61
|
+
}
|
|
62
|
+
map.set(address, config);
|
|
63
|
+
}
|
|
64
|
+
return map;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=map-strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { McpTransport } from "../senpi/types.js";
|
|
2
|
+
import type { NotificationService } from "../types/notification.js";
|
|
3
|
+
export interface NotificationServiceOptions {
|
|
4
|
+
telegram_chat_id?: string;
|
|
5
|
+
mcpTransport?: McpTransport;
|
|
6
|
+
gateway_url?: string;
|
|
7
|
+
gateway_token?: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatDecisionErrorNotification(rawMessage: string): string;
|
|
11
|
+
export declare function createNotificationService(options?: NotificationServiceOptions): NotificationService;
|
|
12
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/runtime/notifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAKpE,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO1E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,mBAAmB,CA0EnG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createLogger } from "../utils/logger.js";
|
|
3
|
+
const logger = createLogger("[senpi-core][notifications]");
|
|
4
|
+
export function formatDecisionErrorNotification(rawMessage) {
|
|
5
|
+
const s = rawMessage;
|
|
6
|
+
if (/OpenClaw gateway error \(404\)/.test(s))
|
|
7
|
+
return "Senpi: OpenClaw gateway returned 404. Endpoint missing.";
|
|
8
|
+
if (/OpenClaw gateway error \(401\)|OpenClaw gateway error \(403\)/.test(s))
|
|
9
|
+
return "Senpi: OpenClaw gateway rejected (auth). Check OPENCLAW_GATEWAY_TOKEN.";
|
|
10
|
+
if (/OpenClaw gateway error \(5\d\d\)/.test(s))
|
|
11
|
+
return "Senpi: OpenClaw gateway error (5xx). Try again later.";
|
|
12
|
+
if (/gateway token not configured|OPENCLAW_GATEWAY_TOKEN/.test(s))
|
|
13
|
+
return "Senpi: OpenClaw gateway token not configured. Set OPENCLAW_GATEWAY_TOKEN.";
|
|
14
|
+
return `Senpi: Trading decision failed — ${s}`;
|
|
15
|
+
}
|
|
16
|
+
export function createNotificationService(options) {
|
|
17
|
+
const chatId = typeof options?.telegram_chat_id === "string" ? options.telegram_chat_id.trim() : undefined;
|
|
18
|
+
const mcpTransport = options?.mcpTransport;
|
|
19
|
+
const gatewayUrl = options?.gateway_url || process.env.OPENCLAW_GATEWAY_URL || "http://127.0.0.1:18789";
|
|
20
|
+
const gatewayToken = options?.gateway_token || process.env.OPENCLAW_GATEWAY_TOKEN;
|
|
21
|
+
if (chatId) {
|
|
22
|
+
logger.info(`Notifications enabled for ${chatId}; routing via OpenClaw /tools/invoke`);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
async notify(message) {
|
|
26
|
+
if (typeof message !== "string" || message.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
const preview = message.length > 120 ? message.slice(0, 120) + "…" : message;
|
|
29
|
+
logger.info("Notification service invoked", { messagePreview: preview });
|
|
30
|
+
if (!chatId) {
|
|
31
|
+
logger.warn("Notification not sent: no telegram_chat_id in runtime config.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// 1. Prefer MCP transport if host injects it in the future
|
|
35
|
+
if (mcpTransport) {
|
|
36
|
+
try {
|
|
37
|
+
await mcpTransport("send_telegram_notification", { target: `telegram:${chatId}`, message });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
logger.warn(`MCP transport failed: ${err instanceof Error ? err.message : String(err)}. Falling back to Gateway HTTP.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 2. HTTP Gateway Tool Invocation (Matches your LLM Engine)
|
|
45
|
+
if (gatewayToken) {
|
|
46
|
+
try {
|
|
47
|
+
const baseUrl = gatewayUrl.endsWith("/") ? gatewayUrl.slice(0, -1) : gatewayUrl;
|
|
48
|
+
const res = await fetch(`${baseUrl}/tools/invoke`, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: {
|
|
51
|
+
"Content-Type": "application/json",
|
|
52
|
+
"Authorization": `Bearer ${gatewayToken}`
|
|
53
|
+
},
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
tool: "message",
|
|
56
|
+
args: {
|
|
57
|
+
channel: "telegram",
|
|
58
|
+
to: chatId,
|
|
59
|
+
message: message,
|
|
60
|
+
idempotencyKey: randomUUID()
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok) {
|
|
65
|
+
const errText = await res.text().catch(() => "No response body");
|
|
66
|
+
throw new Error(`HTTP ${res.status}: ${errText}`);
|
|
67
|
+
}
|
|
68
|
+
const body = await res.json();
|
|
69
|
+
if (!body.ok) {
|
|
70
|
+
throw new Error(`Gateway rejected message tool: ${body.error ?? JSON.stringify(body)}`);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
logger.warn(`Gateway tool invocation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
logger.warn("Notification dropped: Missing OPENCLAW_GATEWAY_TOKEN in environment.");
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/runtime/notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CAwEf"}
|