@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,115 @@
|
|
|
1
|
+
export type { ScannerId, StrategyId, Signal, ScanResult, } from '../types/scanner.js';
|
|
2
|
+
export { ScanStatus } from '../types/scanner.js';
|
|
3
|
+
import type { ScannerId, StrategyId, Signal } from '../types/scanner.js';
|
|
4
|
+
/** Market snapshot values associated with an instrument. */
|
|
5
|
+
export interface InstrumentContext {
|
|
6
|
+
markPx: number;
|
|
7
|
+
prevDayPx: number;
|
|
8
|
+
midPx: number;
|
|
9
|
+
dayNtlVlm: number;
|
|
10
|
+
openInterest: number;
|
|
11
|
+
funding: number;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
/** Tradable instrument used as scanner candidate input. */
|
|
15
|
+
export interface Instrument {
|
|
16
|
+
name: string;
|
|
17
|
+
isDelisted: boolean;
|
|
18
|
+
maxLeverage: number;
|
|
19
|
+
context: InstrumentContext;
|
|
20
|
+
}
|
|
21
|
+
/** Single OHLCV candle point. */
|
|
22
|
+
export interface Candle {
|
|
23
|
+
timestamp: number;
|
|
24
|
+
open: number;
|
|
25
|
+
high: number;
|
|
26
|
+
low: number;
|
|
27
|
+
close: number;
|
|
28
|
+
volume: number;
|
|
29
|
+
}
|
|
30
|
+
/** Candles indexed by timeframe label (for example 1h, 4h). */
|
|
31
|
+
export interface CandleResult {
|
|
32
|
+
candles: Record<string, Candle[]>;
|
|
33
|
+
/** Optional provider-side error message when data is incomplete/unavailable. */
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Columnar candle representation used by indicator functions. */
|
|
37
|
+
export interface ParsedCandles {
|
|
38
|
+
open: number[];
|
|
39
|
+
high: number[];
|
|
40
|
+
low: number[];
|
|
41
|
+
close: number[];
|
|
42
|
+
volume: number[];
|
|
43
|
+
}
|
|
44
|
+
/** Open-interest sample used by OI history and related scanners. */
|
|
45
|
+
export interface OiSnapshot {
|
|
46
|
+
oi: number;
|
|
47
|
+
price: number;
|
|
48
|
+
timestamp: number;
|
|
49
|
+
}
|
|
50
|
+
/** Simplified market row from SM/top-trader sources. */
|
|
51
|
+
export interface SmMarket {
|
|
52
|
+
token: string;
|
|
53
|
+
dex?: string;
|
|
54
|
+
direction: string;
|
|
55
|
+
pctOfTopTradersGain: number;
|
|
56
|
+
traderCount: number;
|
|
57
|
+
tokenPriceChangePct4h: number;
|
|
58
|
+
[key: string]: unknown;
|
|
59
|
+
}
|
|
60
|
+
/** Common candidate shape scanners iterate over after prefiltering. */
|
|
61
|
+
export interface Candidate {
|
|
62
|
+
name: string;
|
|
63
|
+
context: InstrumentContext;
|
|
64
|
+
maxLeverage: number;
|
|
65
|
+
}
|
|
66
|
+
/** Raw scanner execution payload before engine wraps into a ScanResult. */
|
|
67
|
+
export interface ScannerScanOutput {
|
|
68
|
+
/** Scan timestamp in unix milliseconds. */
|
|
69
|
+
timestamp: number;
|
|
70
|
+
/** Signals produced by the scanner in this run. */
|
|
71
|
+
signals: Signal[];
|
|
72
|
+
/** Number of candidates evaluated by scanner logic. */
|
|
73
|
+
scannedCount: number;
|
|
74
|
+
/** Optional status/reason message for heartbeat/skips. */
|
|
75
|
+
reason?: string;
|
|
76
|
+
/** Scanner-defined execution summary values. */
|
|
77
|
+
summary: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
/** Strategy-scoped shared artifact channels between scanners. */
|
|
80
|
+
export type SharedArtifactKey = "prescreened" | "oi-history" | "btc-cache" | "market-regime";
|
|
81
|
+
/** Lightweight shared artifact wrapper with freshness timestamp. */
|
|
82
|
+
export interface ArtifactEnvelope<T> {
|
|
83
|
+
/** Last update time in unix milliseconds. */
|
|
84
|
+
updatedAt: number;
|
|
85
|
+
/** Artifact payload. */
|
|
86
|
+
data: T;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Strategy registration bootstrap metadata.
|
|
90
|
+
* A given scanner id is expected to have one runtime instance per strategy.
|
|
91
|
+
*/
|
|
92
|
+
export interface StrategyRegistration {
|
|
93
|
+
id: StrategyId;
|
|
94
|
+
name: string;
|
|
95
|
+
wallet?: string;
|
|
96
|
+
defaultEnabledScanners?: ScannerId[];
|
|
97
|
+
scannerOverrides?: Record<ScannerId, {
|
|
98
|
+
intervalSeconds?: number;
|
|
99
|
+
config?: unknown;
|
|
100
|
+
}>;
|
|
101
|
+
}
|
|
102
|
+
/** Options for reading a scanner history window. */
|
|
103
|
+
export interface ReadHistoryOptions {
|
|
104
|
+
/** Maximum number of recent history entries to return. */
|
|
105
|
+
limit?: number;
|
|
106
|
+
}
|
|
107
|
+
/** Cross-scanner signal query filters for read APIs/tools. */
|
|
108
|
+
export interface ReadSignalsFilter {
|
|
109
|
+
address?: string;
|
|
110
|
+
scannerId?: ScannerId;
|
|
111
|
+
minScore?: number;
|
|
112
|
+
asset?: string;
|
|
113
|
+
limit?: number;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanners/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scanners/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAS/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone DSL runner — LIVE: real MCP (prices, editPosition, getOrderStatus, closePosition).
|
|
3
|
+
* You open the position manually; this script registers it with the DSL and runs the monitor.
|
|
4
|
+
*
|
|
5
|
+
* Required in .env or env (for testing live flow):
|
|
6
|
+
* SENPI_API_KEY
|
|
7
|
+
* DSL_POSITION_WALLET wallet holding the position
|
|
8
|
+
* DSL_POSITION_COIN asset, e.g. SOL, BTC
|
|
9
|
+
* DSL_STATE_DIR directory for persisted DSL state
|
|
10
|
+
*
|
|
11
|
+
* Optional: DSL_POSITION_ADDRESS (defaults to DSL_POSITION_WALLET — strategy id used for state paths).
|
|
12
|
+
* SZI and entry price come from MCP getClearingHouseState (main + xyz positions) when not set; set DSL_POSITION_DEX (e.g. "xyz") to disambiguate if the same coin is on multiple DEXes. Optional overrides:
|
|
13
|
+
* DSL_POSITION_SZI size with sign (positive = LONG), e.g. "1.5"
|
|
14
|
+
* DSL_POSITION_ENTRY_PX entry price, e.g. "145.0"
|
|
15
|
+
* Optional: DSL_POSITION_LEVERAGE, DSL_PRESET (default "default")
|
|
16
|
+
*
|
|
17
|
+
* Optional for testing close/flip (simulates external close or flip; no exchange call):
|
|
18
|
+
* DSL_NEW_COIN, DSL_NEW_SZI, DSL_NEW_ENTRY_PX, DSL_NEW_LEVERAGE when using --flip-after
|
|
19
|
+
*
|
|
20
|
+
* Usage (after build):
|
|
21
|
+
* npm run run:dsl:live
|
|
22
|
+
* node dist/scripts/run-dsl-standalone-live.js --seconds 3600
|
|
23
|
+
* node dist/scripts/run-dsl-standalone-live.js --seconds 120 --close-after 30 # emit position.closed after 30s
|
|
24
|
+
* node dist/scripts/run-dsl-standalone-live.js --seconds 120 --flip-after 30 # emit position.flipped (set DSL_NEW_*)
|
|
25
|
+
*/
|
|
26
|
+
import "dotenv/config";
|
|
27
|
+
//# sourceMappingURL=run-dsl-standalone-live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-dsl-standalone-live.d.ts","sourceRoot":"","sources":["../../src/scripts/run-dsl-standalone-live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone DSL runner — LIVE: real MCP (prices, editPosition, getOrderStatus, closePosition).
|
|
3
|
+
* You open the position manually; this script registers it with the DSL and runs the monitor.
|
|
4
|
+
*
|
|
5
|
+
* Required in .env or env (for testing live flow):
|
|
6
|
+
* SENPI_API_KEY
|
|
7
|
+
* DSL_POSITION_WALLET wallet holding the position
|
|
8
|
+
* DSL_POSITION_COIN asset, e.g. SOL, BTC
|
|
9
|
+
* DSL_STATE_DIR directory for persisted DSL state
|
|
10
|
+
*
|
|
11
|
+
* Optional: DSL_POSITION_ADDRESS (defaults to DSL_POSITION_WALLET — strategy id used for state paths).
|
|
12
|
+
* SZI and entry price come from MCP getClearingHouseState (main + xyz positions) when not set; set DSL_POSITION_DEX (e.g. "xyz") to disambiguate if the same coin is on multiple DEXes. Optional overrides:
|
|
13
|
+
* DSL_POSITION_SZI size with sign (positive = LONG), e.g. "1.5"
|
|
14
|
+
* DSL_POSITION_ENTRY_PX entry price, e.g. "145.0"
|
|
15
|
+
* Optional: DSL_POSITION_LEVERAGE, DSL_PRESET (default "default")
|
|
16
|
+
*
|
|
17
|
+
* Optional for testing close/flip (simulates external close or flip; no exchange call):
|
|
18
|
+
* DSL_NEW_COIN, DSL_NEW_SZI, DSL_NEW_ENTRY_PX, DSL_NEW_LEVERAGE when using --flip-after
|
|
19
|
+
*
|
|
20
|
+
* Usage (after build):
|
|
21
|
+
* npm run run:dsl:live
|
|
22
|
+
* node dist/scripts/run-dsl-standalone-live.js --seconds 3600
|
|
23
|
+
* node dist/scripts/run-dsl-standalone-live.js --seconds 120 --close-after 30 # emit position.closed after 30s
|
|
24
|
+
* node dist/scripts/run-dsl-standalone-live.js --seconds 120 --flip-after 30 # emit position.flipped (set DSL_NEW_*)
|
|
25
|
+
*/
|
|
26
|
+
import "dotenv/config";
|
|
27
|
+
import { mkdirSync } from "node:fs";
|
|
28
|
+
import { createRuntimeBus } from "../runtime/bus.js";
|
|
29
|
+
import { StateManager } from "../state/index.js";
|
|
30
|
+
import { SenpiClient } from "../senpi/client.js";
|
|
31
|
+
import { DslPlugin } from "../dsl/plugin/index.js";
|
|
32
|
+
import { EVENTS, DSL_EVENTS } from "../constants/dsl/index.js";
|
|
33
|
+
const args = process.argv.slice(2);
|
|
34
|
+
const secondsIdx = args.indexOf("--seconds");
|
|
35
|
+
const runSeconds = secondsIdx >= 0 && args[secondsIdx + 1] ? Number(args[secondsIdx + 1]) : 90;
|
|
36
|
+
function parseArg(name) {
|
|
37
|
+
const i = args.indexOf(name);
|
|
38
|
+
if (i >= 0 && args[i + 1] != null) {
|
|
39
|
+
const n = Number(args[i + 1]);
|
|
40
|
+
return Number.isFinite(n) && n >= 0 ? n : null;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const closeAfterSeconds = parseArg("--close-after");
|
|
45
|
+
const flipAfterSeconds = parseArg("--flip-after");
|
|
46
|
+
const exitConfig = {
|
|
47
|
+
engine: "dsl",
|
|
48
|
+
interval_seconds: 15,
|
|
49
|
+
preset: "default",
|
|
50
|
+
dsl_presets: {
|
|
51
|
+
default: {
|
|
52
|
+
tiers: [
|
|
53
|
+
{ trigger_pct: 10, lock_pct: 5, breaches: 3 },
|
|
54
|
+
{ trigger_pct: 20, lock_pct: 14, breaches: 1 },
|
|
55
|
+
],
|
|
56
|
+
max_loss_pct: 3,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
function requirePositionEnv() {
|
|
61
|
+
const wallet = process.env.DSL_POSITION_WALLET?.trim();
|
|
62
|
+
const coin = process.env.DSL_POSITION_COIN?.trim();
|
|
63
|
+
if (!wallet || !coin) {
|
|
64
|
+
console.error("[run-dsl-live] Missing required env for live flow. Set:");
|
|
65
|
+
console.error(" DSL_POSITION_WALLET, DSL_POSITION_COIN");
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const address = process.env.DSL_POSITION_ADDRESS?.trim() || wallet;
|
|
69
|
+
return { address, wallet, coin };
|
|
70
|
+
}
|
|
71
|
+
async function buildPositionEvent(address, wallet, coin, senpiClient) {
|
|
72
|
+
const sziEnv = process.env.DSL_POSITION_SZI?.trim();
|
|
73
|
+
const entryPxEnv = process.env.DSL_POSITION_ENTRY_PX?.trim();
|
|
74
|
+
const leverageStr = process.env.DSL_POSITION_LEVERAGE?.trim();
|
|
75
|
+
let szi;
|
|
76
|
+
let entryPx;
|
|
77
|
+
let leverage = leverageStr ? Number(leverageStr) : 1;
|
|
78
|
+
if (sziEnv != null && sziEnv !== "" && entryPxEnv != null && entryPxEnv !== "") {
|
|
79
|
+
szi = sziEnv;
|
|
80
|
+
entryPx = entryPxEnv;
|
|
81
|
+
if (!Number.isFinite(leverage))
|
|
82
|
+
leverage = 1;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const dex = process.env.DSL_POSITION_DEX?.trim() ?? "";
|
|
86
|
+
const position = await senpiClient.getPosition(wallet, coin, dex || undefined);
|
|
87
|
+
if (!position) {
|
|
88
|
+
console.error("[run-dsl-live] No position found for wallet/coin in clearing house state" + (dex ? ` (dex=${dex})` : "") + ". Set DSL_POSITION_SZI and DSL_POSITION_ENTRY_PX to override.");
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
szi = String(position.szi);
|
|
92
|
+
entryPx = String(position.entryPx);
|
|
93
|
+
if (position.leverage != null && Number.isFinite(position.leverage))
|
|
94
|
+
leverage = position.leverage;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
address,
|
|
98
|
+
wallet,
|
|
99
|
+
dex: process.env.DSL_POSITION_DEX?.trim() ?? "",
|
|
100
|
+
preset: process.env.DSL_PRESET?.trim() ?? "default",
|
|
101
|
+
coin,
|
|
102
|
+
szi,
|
|
103
|
+
entryPx,
|
|
104
|
+
leverage: Number.isFinite(leverage) ? leverage : 1,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async function main() {
|
|
108
|
+
const apiKey = process.env.SENPI_API_KEY?.trim();
|
|
109
|
+
if (!apiKey) {
|
|
110
|
+
console.error("[run-dsl-live] SENPI_API_KEY is required (e.g. in .env)");
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
const stateDir = process.env.DSL_STATE_DIR?.trim();
|
|
114
|
+
if (!stateDir) {
|
|
115
|
+
console.error("[run-dsl-live] DSL_STATE_DIR is required for live run (state is persisted)");
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
mkdirSync(stateDir, { recursive: true });
|
|
119
|
+
console.log("[run-dsl-live] stateDir:", stateDir);
|
|
120
|
+
console.log("[run-dsl-live] run for", runSeconds, "seconds");
|
|
121
|
+
if (closeAfterSeconds != null)
|
|
122
|
+
console.log("[run-dsl-live] will emit position.closed after", closeAfterSeconds, "s");
|
|
123
|
+
if (flipAfterSeconds != null) {
|
|
124
|
+
const newCoin = process.env.DSL_NEW_COIN?.trim();
|
|
125
|
+
const newSzi = process.env.DSL_NEW_SZI?.trim();
|
|
126
|
+
const newEntryPx = process.env.DSL_NEW_ENTRY_PX?.trim();
|
|
127
|
+
if (!newCoin || !newSzi || !newEntryPx) {
|
|
128
|
+
console.error("[run-dsl-live] --flip-after requires DSL_NEW_COIN, DSL_NEW_SZI, DSL_NEW_ENTRY_PX");
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
console.log("[run-dsl-live] will emit position.flipped after", flipAfterSeconds, "s →", newCoin, newSzi, newEntryPx);
|
|
132
|
+
}
|
|
133
|
+
const bus = createRuntimeBus();
|
|
134
|
+
bus.on(DSL_EVENTS.CREATED, (p) => console.log("[dsl.created]", p));
|
|
135
|
+
bus.on(DSL_EVENTS.PHASE_CHANGED, (p) => console.log("[dsl.phase_changed]", p));
|
|
136
|
+
bus.on(DSL_EVENTS.TIER_ADVANCED, (p) => console.log("[dsl.tier_advanced]", p));
|
|
137
|
+
bus.on(DSL_EVENTS.SL_UPDATED, (p) => console.log("[dsl.sl_updated]", p));
|
|
138
|
+
bus.on(DSL_EVENTS.CLOSE_PENDING, (p) => console.log("[dsl.close_pending]", p));
|
|
139
|
+
bus.on(DSL_EVENTS.CLOSED, (p) => console.log("[dsl.closed]", p));
|
|
140
|
+
bus.on(EVENTS.POSITION_CLOSED, (p) => console.log("[position.closed]", p));
|
|
141
|
+
bus.on(EVENTS.POSITION_FLIPPED, (p) => console.log("[position.flipped]", p));
|
|
142
|
+
const stateManager = new StateManager(stateDir);
|
|
143
|
+
await stateManager.hydrate();
|
|
144
|
+
const senpiClient = new SenpiClient({ apiKey });
|
|
145
|
+
await senpiClient.connect();
|
|
146
|
+
const { address, wallet, coin } = requirePositionEnv();
|
|
147
|
+
const position = await buildPositionEvent(address, wallet, coin, senpiClient);
|
|
148
|
+
const plugin = await DslPlugin.create({
|
|
149
|
+
config: exitConfig,
|
|
150
|
+
bus,
|
|
151
|
+
stateDir,
|
|
152
|
+
stateManager,
|
|
153
|
+
senpiClient,
|
|
154
|
+
});
|
|
155
|
+
console.log("[run-dsl-live] emitting position.opened", position);
|
|
156
|
+
bus.emit(EVENTS.POSITION_OPENED, position);
|
|
157
|
+
if (closeAfterSeconds != null) {
|
|
158
|
+
setTimeout(() => {
|
|
159
|
+
const payload = {
|
|
160
|
+
address: position.address,
|
|
161
|
+
asset: position.coin,
|
|
162
|
+
wallet: position.wallet,
|
|
163
|
+
};
|
|
164
|
+
console.log("[run-dsl-live] emitting position.closed (test)", payload);
|
|
165
|
+
bus.emit(EVENTS.POSITION_CLOSED, payload);
|
|
166
|
+
}, closeAfterSeconds * 1000);
|
|
167
|
+
}
|
|
168
|
+
if (flipAfterSeconds != null) {
|
|
169
|
+
const newCoin = process.env.DSL_NEW_COIN?.trim() ?? "";
|
|
170
|
+
const newSzi = process.env.DSL_NEW_SZI?.trim() ?? "";
|
|
171
|
+
const newEntryPx = process.env.DSL_NEW_ENTRY_PX?.trim() ?? "";
|
|
172
|
+
const newLeverageStr = process.env.DSL_NEW_LEVERAGE?.trim();
|
|
173
|
+
const newLeverage = newLeverageStr && Number.isFinite(Number(newLeverageStr)) ? Number(newLeverageStr) : position.leverage;
|
|
174
|
+
setTimeout(() => {
|
|
175
|
+
const payload = {
|
|
176
|
+
address: position.address,
|
|
177
|
+
wallet: position.wallet,
|
|
178
|
+
dex: position.dex ?? "",
|
|
179
|
+
asset: position.coin,
|
|
180
|
+
coin: newCoin,
|
|
181
|
+
szi: newSzi,
|
|
182
|
+
entryPx: newEntryPx,
|
|
183
|
+
leverage: newLeverage,
|
|
184
|
+
};
|
|
185
|
+
console.log("[run-dsl-live] emitting position.flipped (test)", payload);
|
|
186
|
+
bus.emit(EVENTS.POSITION_FLIPPED, payload);
|
|
187
|
+
}, flipAfterSeconds * 1000);
|
|
188
|
+
}
|
|
189
|
+
const tickIntervalMs = 15_000;
|
|
190
|
+
let ticks = 0;
|
|
191
|
+
const heartbeat = setInterval(() => {
|
|
192
|
+
ticks += 1;
|
|
193
|
+
console.log("[run-dsl-live] monitor tick #" + ticks);
|
|
194
|
+
}, tickIntervalMs);
|
|
195
|
+
await new Promise((r) => setTimeout(r, runSeconds * 1000));
|
|
196
|
+
clearInterval(heartbeat);
|
|
197
|
+
plugin.stop();
|
|
198
|
+
if (bus.removeAllListeners)
|
|
199
|
+
bus.removeAllListeners();
|
|
200
|
+
console.log("[run-dsl-live] done");
|
|
201
|
+
process.exit(0);
|
|
202
|
+
}
|
|
203
|
+
main().catch((err) => {
|
|
204
|
+
console.error(err);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=run-dsl-standalone-live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-dsl-standalone-live.js","sourceRoot":"","sources":["../../src/scripts/run-dsl-standalone-live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone DSL runner — MOCK: no API key; fake prices and no-op SL/close.
|
|
3
|
+
* Runs with 10 strategies, 3–4 positions per strategy, and random close/flip events.
|
|
4
|
+
*
|
|
5
|
+
* Optional: DSL_STATE_DIR to persist state; otherwise uses a temp dir (removed on exit).
|
|
6
|
+
*
|
|
7
|
+
* Usage (after build):
|
|
8
|
+
* npm run run:dsl:mock
|
|
9
|
+
* node dist/scripts/run-dsl-standalone-mock.js --seconds 120
|
|
10
|
+
* node dist/scripts/run-dsl-standalone-mock.js --seconds 60 --seed 42 # reproducible randomness
|
|
11
|
+
*/
|
|
12
|
+
import "dotenv/config";
|
|
13
|
+
//# sourceMappingURL=run-dsl-standalone-mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-dsl-standalone-mock.d.ts","sourceRoot":"","sources":["../../src/scripts/run-dsl-standalone-mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone DSL runner — MOCK: no API key; fake prices and no-op SL/close.
|
|
3
|
+
* Runs with 10 strategies, 3–4 positions per strategy, and random close/flip events.
|
|
4
|
+
*
|
|
5
|
+
* Optional: DSL_STATE_DIR to persist state; otherwise uses a temp dir (removed on exit).
|
|
6
|
+
*
|
|
7
|
+
* Usage (after build):
|
|
8
|
+
* npm run run:dsl:mock
|
|
9
|
+
* node dist/scripts/run-dsl-standalone-mock.js --seconds 120
|
|
10
|
+
* node dist/scripts/run-dsl-standalone-mock.js --seconds 60 --seed 42 # reproducible randomness
|
|
11
|
+
*/
|
|
12
|
+
import "dotenv/config";
|
|
13
|
+
import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { createRuntimeBus } from "../runtime/bus.js";
|
|
17
|
+
import { StateManager } from "../state/index.js";
|
|
18
|
+
import { SenpiClient } from "../senpi/client.js";
|
|
19
|
+
import { DslPlugin } from "../dsl/plugin/index.js";
|
|
20
|
+
import { EVENTS, DSL_EVENTS } from "../constants/dsl/index.js";
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const secondsIdx = args.indexOf("--seconds");
|
|
23
|
+
const runSeconds = secondsIdx >= 0 && args[secondsIdx + 1] ? Number(args[secondsIdx + 1]) : 90;
|
|
24
|
+
function parseArg(name) {
|
|
25
|
+
const i = args.indexOf(name);
|
|
26
|
+
if (i >= 0 && args[i + 1] != null) {
|
|
27
|
+
const n = Number(args[i + 1]);
|
|
28
|
+
return Number.isFinite(n) && n >= 0 ? n : null;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const seedArg = parseArg("--seed");
|
|
33
|
+
/** Simple seeded random: returns 0..1. If no seed, uses Math.random(). */
|
|
34
|
+
function random(seedRef) {
|
|
35
|
+
if (seedRef.state === 0)
|
|
36
|
+
return Math.random();
|
|
37
|
+
seedRef.state = (seedRef.state * 1103515245 + 12345) & 0x7fffffff;
|
|
38
|
+
return seedRef.state / 0x7fffffff;
|
|
39
|
+
}
|
|
40
|
+
const STRATEGY_COUNT = 10;
|
|
41
|
+
const ASSETS = ["SOL", "ETH", "BTC", "AVAX", "HYPE", "DOGE", "MATIC", "ARB", "OP", "SUI"];
|
|
42
|
+
const ENTRY_PRICES = {
|
|
43
|
+
SOL: 145, ETH: 3200, BTC: 67000, AVAX: 35, HYPE: 12, DOGE: 0.4, MATIC: 0.5, ARB: 1.1, OP: 2.2, SUI: 3.5,
|
|
44
|
+
};
|
|
45
|
+
function createMockTransport(basePrice) {
|
|
46
|
+
return async (toolName, args) => {
|
|
47
|
+
if (toolName === "getMarketPrices" || toolName === "market_get_prices") {
|
|
48
|
+
const assets = args.assets ?? [];
|
|
49
|
+
const toFetch = assets.length > 0 ? assets : Object.keys(ENTRY_PRICES);
|
|
50
|
+
const out = {};
|
|
51
|
+
for (const a of toFetch) {
|
|
52
|
+
const base = ENTRY_PRICES[a] ?? basePrice;
|
|
53
|
+
out[a] = base + Math.random() * 4 - 2;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
if (toolName === "edit_position" || toolName === "editPosition") {
|
|
58
|
+
return { actionsPerformed: ["stop_loss_updated"], slOrderId: Math.floor(Math.random() * 100000) };
|
|
59
|
+
}
|
|
60
|
+
if (toolName === "execution_get_order_status" || toolName === "getOrderStatus")
|
|
61
|
+
return { filled: false };
|
|
62
|
+
if (toolName === "close_position" || toolName === "closePosition")
|
|
63
|
+
return {};
|
|
64
|
+
return {};
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const exitConfig = {
|
|
68
|
+
engine: "dsl",
|
|
69
|
+
interval_seconds: 15,
|
|
70
|
+
preset: "default",
|
|
71
|
+
dsl_presets: {
|
|
72
|
+
default: {
|
|
73
|
+
tiers: [
|
|
74
|
+
{ trigger_pct: 10, lock_pct: 5, breaches: 3 },
|
|
75
|
+
{ trigger_pct: 20, lock_pct: 14, breaches: 1 },
|
|
76
|
+
],
|
|
77
|
+
max_loss_pct: 3,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
function buildStrategies() {
|
|
82
|
+
const out = [];
|
|
83
|
+
for (let i = 1; i <= STRATEGY_COUNT; i++) {
|
|
84
|
+
const id = String(i).padStart(3, "0");
|
|
85
|
+
out.push({ address: `0xstrategy-${id}`, wallet: `0xwallet-${id}` });
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
function buildPositionsForStrategy(strategy, count, r) {
|
|
90
|
+
const shuffled = [...ASSETS].sort(() => random(r) - 0.5);
|
|
91
|
+
const positions = [];
|
|
92
|
+
for (let i = 0; i < count; i++) {
|
|
93
|
+
const coin = shuffled[i];
|
|
94
|
+
const entryPx = ENTRY_PRICES[coin] ?? 100;
|
|
95
|
+
const long = random(r) > 0.3;
|
|
96
|
+
const size = (1 + random(r) * 2).toFixed(2);
|
|
97
|
+
positions.push({
|
|
98
|
+
coin,
|
|
99
|
+
szi: long ? size : `-${size}`,
|
|
100
|
+
entryPx: String(entryPx),
|
|
101
|
+
leverage: 3 + Math.floor(random(r) * 5),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return positions;
|
|
105
|
+
}
|
|
106
|
+
function toOpenedEvent(strategy, pos) {
|
|
107
|
+
return {
|
|
108
|
+
address: strategy.address,
|
|
109
|
+
wallet: strategy.wallet,
|
|
110
|
+
dex: "",
|
|
111
|
+
preset: "default",
|
|
112
|
+
coin: pos.coin,
|
|
113
|
+
szi: pos.szi,
|
|
114
|
+
entryPx: pos.entryPx,
|
|
115
|
+
leverage: pos.leverage,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function toClosedEvent(strategy, asset) {
|
|
119
|
+
return { address: strategy.address, asset, wallet: strategy.wallet };
|
|
120
|
+
}
|
|
121
|
+
function toFlippedEvent(strategy, asset, currentSzi, entryPx, leverage) {
|
|
122
|
+
const num = parseFloat(currentSzi);
|
|
123
|
+
const flippedSzi = String(-num);
|
|
124
|
+
return {
|
|
125
|
+
address: strategy.address,
|
|
126
|
+
wallet: strategy.wallet,
|
|
127
|
+
dex: "",
|
|
128
|
+
asset,
|
|
129
|
+
coin: asset,
|
|
130
|
+
szi: flippedSzi,
|
|
131
|
+
entryPx,
|
|
132
|
+
leverage,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async function main() {
|
|
136
|
+
const envStateDir = process.env.DSL_STATE_DIR?.trim();
|
|
137
|
+
const useTempDir = !envStateDir;
|
|
138
|
+
const stateDir = envStateDir ?? mkdtempSync(join(tmpdir(), "dsl-standalone-mock-"));
|
|
139
|
+
if (envStateDir)
|
|
140
|
+
mkdirSync(stateDir, { recursive: true });
|
|
141
|
+
const seedRef = { state: seedArg ?? 0 };
|
|
142
|
+
if (seedArg != null)
|
|
143
|
+
console.log("[run-dsl-mock] seed:", seedArg, "(reproducible)");
|
|
144
|
+
const strategies = buildStrategies();
|
|
145
|
+
const positionsByStrategy = [];
|
|
146
|
+
for (const s of strategies) {
|
|
147
|
+
const count = 3 + Math.floor(random(seedRef) * 2);
|
|
148
|
+
positionsByStrategy.push(buildPositionsForStrategy(s, count, seedRef));
|
|
149
|
+
}
|
|
150
|
+
const totalPositions = positionsByStrategy.reduce((n, p) => n + p.length, 0);
|
|
151
|
+
console.log("[run-dsl-mock] stateDir:", stateDir, useTempDir ? "(temp, will remove on exit)" : "(DSL_STATE_DIR, kept)");
|
|
152
|
+
console.log("[run-dsl-mock] run for", runSeconds, "seconds");
|
|
153
|
+
console.log("[run-dsl-mock] strategies:", STRATEGY_COUNT, "| positions:", totalPositions);
|
|
154
|
+
const bus = createRuntimeBus();
|
|
155
|
+
bus.on(DSL_EVENTS.CREATED, (p) => console.log("[dsl.created]", p));
|
|
156
|
+
bus.on(DSL_EVENTS.PHASE_CHANGED, (p) => console.log("[dsl.phase_changed]", p));
|
|
157
|
+
bus.on(DSL_EVENTS.TIER_ADVANCED, (p) => console.log("[dsl.tier_advanced]", p));
|
|
158
|
+
bus.on(DSL_EVENTS.SL_UPDATED, (p) => console.log("[dsl.sl_updated]", p));
|
|
159
|
+
bus.on(DSL_EVENTS.CLOSE_PENDING, (p) => console.log("[dsl.close_pending]", p));
|
|
160
|
+
bus.on(DSL_EVENTS.CLOSED, (p) => console.log("[dsl.closed]", p));
|
|
161
|
+
bus.on(EVENTS.POSITION_CLOSED, (p) => console.log("[position.closed]", p));
|
|
162
|
+
bus.on(EVENTS.POSITION_FLIPPED, (p) => console.log("[position.flipped]", p));
|
|
163
|
+
const stateManager = new StateManager(stateDir);
|
|
164
|
+
await stateManager.hydrate();
|
|
165
|
+
const senpiClient = new SenpiClient(createMockTransport(145));
|
|
166
|
+
const plugin = await DslPlugin.create({
|
|
167
|
+
config: exitConfig,
|
|
168
|
+
bus,
|
|
169
|
+
stateDir,
|
|
170
|
+
stateManager,
|
|
171
|
+
senpiClient,
|
|
172
|
+
});
|
|
173
|
+
// Emit all position.opened
|
|
174
|
+
for (let s = 0; s < strategies.length; s++) {
|
|
175
|
+
const strategy = strategies[s];
|
|
176
|
+
const positions = positionsByStrategy[s];
|
|
177
|
+
for (const pos of positions) {
|
|
178
|
+
const event = toOpenedEvent(strategy, pos);
|
|
179
|
+
console.log("[run-dsl-mock] position.opened", strategy.address, pos.coin);
|
|
180
|
+
bus.emit(EVENTS.POSITION_OPENED, event);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const slots = [];
|
|
184
|
+
for (let s = 0; s < strategies.length; s++) {
|
|
185
|
+
for (let p = 0; p < positionsByStrategy[s].length; p++)
|
|
186
|
+
slots.push({ strategyIndex: s, positionIndex: p });
|
|
187
|
+
}
|
|
188
|
+
// Schedule random close and flip events (spread over 15%..85% of run)
|
|
189
|
+
const minMs = runSeconds * 0.15 * 1000;
|
|
190
|
+
const maxMs = runSeconds * 0.85 * 1000;
|
|
191
|
+
const numEvents = Math.min(Math.floor(3 + random(seedRef) * 12), slots.length);
|
|
192
|
+
const usedSlots = new Set();
|
|
193
|
+
const events = [];
|
|
194
|
+
for (let i = 0; i < numEvents; i++) {
|
|
195
|
+
let slot;
|
|
196
|
+
let key;
|
|
197
|
+
let attempts = 0;
|
|
198
|
+
do {
|
|
199
|
+
slot = slots[Math.floor(random(seedRef) * slots.length)];
|
|
200
|
+
key = `${slot.strategyIndex}-${slot.positionIndex}`;
|
|
201
|
+
attempts++;
|
|
202
|
+
} while (usedSlots.has(key) && attempts < 50);
|
|
203
|
+
usedSlots.add(key);
|
|
204
|
+
const atMs = minMs + random(seedRef) * (maxMs - minMs);
|
|
205
|
+
const type = random(seedRef) > 0.5 ? "close" : "flip";
|
|
206
|
+
events.push({ atMs, type, slot });
|
|
207
|
+
}
|
|
208
|
+
events.sort((a, b) => a.atMs - b.atMs);
|
|
209
|
+
for (const ev of events) {
|
|
210
|
+
const { strategyIndex, positionIndex } = ev.slot;
|
|
211
|
+
const strategy = strategies[strategyIndex];
|
|
212
|
+
const pos = positionsByStrategy[strategyIndex][positionIndex];
|
|
213
|
+
const atMs = Math.round(ev.atMs);
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
if (ev.type === "close") {
|
|
216
|
+
const payload = toClosedEvent(strategy, pos.coin);
|
|
217
|
+
console.log("[run-dsl-mock] position.closed (random)", payload.address, payload.asset, "at", (atMs / 1000).toFixed(1), "s");
|
|
218
|
+
bus.emit(EVENTS.POSITION_CLOSED, payload);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const entryPx = (parseFloat(pos.entryPx) * (0.98 + random(seedRef) * 0.04)).toFixed(2);
|
|
222
|
+
const payload = toFlippedEvent(strategy, pos.coin, pos.szi, entryPx, pos.leverage);
|
|
223
|
+
console.log("[run-dsl-mock] position.flipped (random)", payload.address, payload.asset, "at", (atMs / 1000).toFixed(1), "s");
|
|
224
|
+
bus.emit(EVENTS.POSITION_FLIPPED, payload);
|
|
225
|
+
}
|
|
226
|
+
}, atMs);
|
|
227
|
+
}
|
|
228
|
+
console.log("[run-dsl-mock] scheduled", events.length, "random events (close/flip)");
|
|
229
|
+
const tickIntervalMs = 15_000;
|
|
230
|
+
let ticks = 0;
|
|
231
|
+
const heartbeat = setInterval(() => {
|
|
232
|
+
ticks += 1;
|
|
233
|
+
console.log("[run-dsl-mock] monitor tick #" + ticks);
|
|
234
|
+
}, tickIntervalMs);
|
|
235
|
+
await new Promise((r) => setTimeout(r, runSeconds * 1000));
|
|
236
|
+
clearInterval(heartbeat);
|
|
237
|
+
plugin.stop();
|
|
238
|
+
if (bus.removeAllListeners)
|
|
239
|
+
bus.removeAllListeners();
|
|
240
|
+
if (useTempDir) {
|
|
241
|
+
try {
|
|
242
|
+
rmSync(stateDir, { recursive: true });
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
/* ignore */
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
console.log("[run-dsl-mock] done");
|
|
249
|
+
process.exit(0);
|
|
250
|
+
}
|
|
251
|
+
main().catch((err) => {
|
|
252
|
+
console.error(err);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=run-dsl-standalone-mock.js.map
|