@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,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* senpi guide subcommands — in-shell reference for @senpi/trading-runtime.
|
|
3
|
+
*
|
|
4
|
+
* All reference text is static string constants. This is intentional: the
|
|
5
|
+
* scanner registry does not expose configSchema or description metadata at
|
|
6
|
+
* runtime (ScannerEngine.list() only returns id/enabled/intervalSeconds).
|
|
7
|
+
*
|
|
8
|
+
* TODO: replace static strings with dynamic registry metadata once
|
|
9
|
+
* ScannerEngine exposes configSchema per scanner type. Relevant type is
|
|
10
|
+
* ScannerRegistrationSummary in src/scanners/engine/engine.ts.
|
|
11
|
+
*/
|
|
12
|
+
const CHANGELOG_URL = "https://github.com/Senpi-ai/senpi-trading-runtime/blob/main/CHANGELOG.md";
|
|
13
|
+
// ── Reference text constants ────────────────────────────────────────────────
|
|
14
|
+
const OVERVIEW_TEXT = (version) => `
|
|
15
|
+
@senpi/trading-runtime v${version}
|
|
16
|
+
|
|
17
|
+
Event-driven automated trading plugin for OpenClaw. Orchestrates scanners,
|
|
18
|
+
LLM-based trade decisions, and a DSL trailing stop-loss exit engine.
|
|
19
|
+
|
|
20
|
+
Flow: Scanner → signal queue → Action (optional LLM) → position → DSL exit
|
|
21
|
+
|
|
22
|
+
Quick commands:
|
|
23
|
+
senpi guide scanners Scanner types and config fields
|
|
24
|
+
senpi guide actions Action types and decision modes
|
|
25
|
+
senpi guide dsl Two-phase exit engine reference
|
|
26
|
+
senpi guide examples Print minimal strategy YAML
|
|
27
|
+
senpi guide schema Full YAML schema field reference
|
|
28
|
+
senpi guide version Plugin version and changelog URL
|
|
29
|
+
|
|
30
|
+
Docs: docs/runtime-docs/
|
|
31
|
+
`.trim();
|
|
32
|
+
const SCANNERS_TEXT = `
|
|
33
|
+
Scanner types
|
|
34
|
+
─────────────────────────────────────────────────────────────────────────────
|
|
35
|
+
|
|
36
|
+
emerging_movers
|
|
37
|
+
Watches the Senpi smart-money leaderboard for rank and contribution
|
|
38
|
+
movements. Stateful — compares each scan to stored history.
|
|
39
|
+
Typical interval: 20s–60s
|
|
40
|
+
|
|
41
|
+
Signal types (priority order):
|
|
42
|
+
FIRST_JUMP (score 0.95) 10+ rank jump from deep, first appearance
|
|
43
|
+
CONTRIB_EXPLOSION (score 0.90) 3x+ contribution spike in one scan
|
|
44
|
+
IMMEDIATE_MOVER (score 0.85) 10+ rank jump, token was already tracked
|
|
45
|
+
NEW_ENTRY_DEEP (score 0.80) New entry landing directly in top 20
|
|
46
|
+
DEEP_CLIMBER (score 0.60) Moderate rank gain from a deep position
|
|
47
|
+
|
|
48
|
+
Config fields:
|
|
49
|
+
topN number 50 Track top N by SM contribution
|
|
50
|
+
minRankJump number 5 Min rank improvement for DEEP_CLIMBER
|
|
51
|
+
minTopTradersGain number 0.1 Min contribution threshold
|
|
52
|
+
minScansBeforeSignals number 2 Warm-up scans before emitting signals
|
|
53
|
+
historyLimit number 60 Max history entries per token
|
|
54
|
+
immediateJumpThreshold number 10 Rank jump for IMMEDIATE_MOVER/FIRST_JUMP
|
|
55
|
+
deepClimbRankThreshold number 25 Starting rank for deep-climb detection
|
|
56
|
+
contribExplosionMultiplier number 3.0 Ratio for CONTRIB_EXPLOSION
|
|
57
|
+
firstJumpMinPrevRank number 30 Prev-rank floor for FIRST_JUMP
|
|
58
|
+
|
|
59
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
momentum
|
|
62
|
+
Emits directional breakout signals based on candle price movement.
|
|
63
|
+
Works best paired with the prescreener scanner.
|
|
64
|
+
Typical interval: 1m
|
|
65
|
+
|
|
66
|
+
Signal types: MOMENTUM_BREAKOUT (LONG or SHORT)
|
|
67
|
+
|
|
68
|
+
Config fields:
|
|
69
|
+
timeframe string "1h" Candle timeframe to analyze
|
|
70
|
+
minMovePct number 1.5 Min price change % to emit a signal
|
|
71
|
+
maxCandidates number 20 Max assets evaluated per scan
|
|
72
|
+
minDayVolume number 1e6 Min 24h volume filter (fallback only)
|
|
73
|
+
minSignalScore number 0.2 Min signal score threshold (0–1)
|
|
74
|
+
requirePrescreened boolean true Only scan assets from the prescreener
|
|
75
|
+
|
|
76
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
prescreener
|
|
79
|
+
Infrastructure scanner. Ranks liquid instruments by a composite
|
|
80
|
+
liquidity/momentum/OI score and publishes a shared artifact consumed
|
|
81
|
+
by momentum and oi_tracker. Add this scanner before those in your YAML.
|
|
82
|
+
Typical interval: 5m
|
|
83
|
+
|
|
84
|
+
Signal types: none (artifact producer only)
|
|
85
|
+
|
|
86
|
+
Config fields:
|
|
87
|
+
topN number 30 Assets passed through to downstream scanners
|
|
88
|
+
minDayVolume number 1e6 Min 24h notional volume
|
|
89
|
+
minLeverage number 2 Min max-leverage (filters illiquid markets)
|
|
90
|
+
minOpenInterest number 0 Min open interest
|
|
91
|
+
|
|
92
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
oi_tracker
|
|
95
|
+
Infrastructure scanner. Samples open interest per instrument and writes
|
|
96
|
+
an oi-history artifact. Used by downstream scanners that need OI trend data.
|
|
97
|
+
Typical interval: 1m
|
|
98
|
+
|
|
99
|
+
Signal types: none (artifact producer only)
|
|
100
|
+
|
|
101
|
+
Config fields:
|
|
102
|
+
minDayVolume number 1e6 Min 24h volume; instruments below are skipped
|
|
103
|
+
maxHistory number 60 Max OI snapshots retained per instrument
|
|
104
|
+
`.trim();
|
|
105
|
+
const ACTIONS_TEXT = `
|
|
106
|
+
Action types
|
|
107
|
+
─────────────────────────────────────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
OPEN_POSITION
|
|
110
|
+
Opens a new position on Senpi. Checks slot availability before executing.
|
|
111
|
+
|
|
112
|
+
Required YAML fields:
|
|
113
|
+
action_type OPEN_POSITION
|
|
114
|
+
decision_mode llm | no_decision
|
|
115
|
+
scanners list of scanner names that feed this action
|
|
116
|
+
min_confidence 0–10; signals below this score are skipped
|
|
117
|
+
|
|
118
|
+
Optional fields:
|
|
119
|
+
decision_model Claude model id (required when decision_mode: llm)
|
|
120
|
+
context list of context fields injected into the prompt
|
|
121
|
+
currently supported: signal
|
|
122
|
+
decision_prompt system prompt template; use {{signal}} for signal JSON
|
|
123
|
+
|
|
124
|
+
Decision modes:
|
|
125
|
+
llm Claude evaluates each signal. Prompt receives {{signal}} as JSON.
|
|
126
|
+
Claude must respond with:
|
|
127
|
+
{
|
|
128
|
+
"execute": true | false,
|
|
129
|
+
"actionType": "OPEN_POSITION",
|
|
130
|
+
"confidence": 1–10,
|
|
131
|
+
"reasoning": "one sentence",
|
|
132
|
+
"payload": { "asset": "SOL", "direction": "LONG" | "SHORT" }
|
|
133
|
+
}
|
|
134
|
+
Trades are skipped when execute=false or confidence < min_confidence.
|
|
135
|
+
|
|
136
|
+
no_decision Opens a position for every qualifying signal immediately.
|
|
137
|
+
No LLM call. Use with tight DSL stops to manage risk.
|
|
138
|
+
`.trim();
|
|
139
|
+
const DSL_TEXT = `
|
|
140
|
+
DSL exit engine — two-phase trailing stop-loss
|
|
141
|
+
─────────────────────────────────────────────────────────────────────────────
|
|
142
|
+
|
|
143
|
+
The DSL monitors open positions on a configurable interval and closes them
|
|
144
|
+
when price breaches the computed floor.
|
|
145
|
+
|
|
146
|
+
exit:
|
|
147
|
+
engine: dsl
|
|
148
|
+
interval_seconds: 30 # how often the price monitor runs
|
|
149
|
+
|
|
150
|
+
dsl_presets:
|
|
151
|
+
<preset_name>:
|
|
152
|
+
phase1: ...
|
|
153
|
+
phase2_trigger_tier: 0
|
|
154
|
+
phase2: ...
|
|
155
|
+
|
|
156
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
157
|
+
Phase 1 — Fixed floor
|
|
158
|
+
Active from entry until the tier at phase2_trigger_tier is crossed.
|
|
159
|
+
Floor = entry_price × (1 − max_loss_pct / 100)
|
|
160
|
+
|
|
161
|
+
phase1:
|
|
162
|
+
enabled: true
|
|
163
|
+
max_loss_pct: 3.0 # exit if price drops 3% below entry
|
|
164
|
+
consecutive_breaches_required: 3 # ticks below floor before exit fires
|
|
165
|
+
|
|
166
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
167
|
+
Phase 2 — Dynamic trailing floor (high-water mark retrace)
|
|
168
|
+
Replaces Phase 1 once the position gains enough. The floor tracks the
|
|
169
|
+
high-water mark and never moves down.
|
|
170
|
+
|
|
171
|
+
phase2_trigger_tier: 0 # 0 = phase2 starts when the first tier is hit
|
|
172
|
+
|
|
173
|
+
phase2:
|
|
174
|
+
enabled: true
|
|
175
|
+
retrace_threshold: 1.5 # default: exit if 1.5% below HWM
|
|
176
|
+
consecutive_breaches_required: 1
|
|
177
|
+
|
|
178
|
+
tiers:
|
|
179
|
+
# Each tier: trigger_pct = gain from entry that activates this tier
|
|
180
|
+
# lock_pct = floor locked at entry × (1 + lock_pct%)
|
|
181
|
+
# retrace = overrides retrace_threshold for this tier
|
|
182
|
+
- { trigger_pct: 10, lock_pct: 5 }
|
|
183
|
+
- { trigger_pct: 20, lock_pct: 14 }
|
|
184
|
+
- { trigger_pct: 30, lock_pct: 22, retrace: 1.2 }
|
|
185
|
+
- { trigger_pct: 50, lock_pct: 40, retrace: 1.0 }
|
|
186
|
+
- { trigger_pct: 75, lock_pct: 60, retrace: 0.8 }
|
|
187
|
+
- { trigger_pct: 100, lock_pct: 80, retrace: 0.6 }
|
|
188
|
+
|
|
189
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
190
|
+
State and events
|
|
191
|
+
Per-position state is persisted at {stateDir}/strategies/{id}/... as JSON.
|
|
192
|
+
Events emitted: dsl.created, dsl.tier_advanced, dsl.sl_updated,
|
|
193
|
+
dsl.phase_changed, position.closed
|
|
194
|
+
`.trim();
|
|
195
|
+
const SCHEMA_TEXT = `
|
|
196
|
+
YAML schema — top-level keys
|
|
197
|
+
─────────────────────────────────────────────────────────────────────────────
|
|
198
|
+
Key Type Req Description
|
|
199
|
+
name string Yes Strategy name
|
|
200
|
+
version string No Version identifier
|
|
201
|
+
description string No Human-readable description
|
|
202
|
+
strategies object Yes Keyed strategy configs (non-empty)
|
|
203
|
+
scanners array * Scanner definitions (* required when actions
|
|
204
|
+
have OPEN_POSITION or a scanners list)
|
|
205
|
+
actions array No Action definitions
|
|
206
|
+
exit object No Exit / DSL block
|
|
207
|
+
health object No Health check config
|
|
208
|
+
hooks array No Hook definitions
|
|
209
|
+
notifications object No e.g. telegram_chat_id
|
|
210
|
+
advanced object No Extra options
|
|
211
|
+
|
|
212
|
+
strategies.<name>
|
|
213
|
+
wallet string Yes Wallet address; supports \${VAR} substitution
|
|
214
|
+
budget number No Total budget
|
|
215
|
+
slots number No Max concurrent positions
|
|
216
|
+
margin_per_slot number No Margin per slot
|
|
217
|
+
trading_risk string No conservative | moderate | aggressive
|
|
218
|
+
enabled boolean No Default true
|
|
219
|
+
|
|
220
|
+
scanners[]
|
|
221
|
+
name string Yes Unique name referenced in actions.scanners
|
|
222
|
+
type string Yes emerging_movers | momentum | prescreener | oi_tracker
|
|
223
|
+
interval string Yes e.g. "30s", "2m", "1h"
|
|
224
|
+
blocked_assets array No
|
|
225
|
+
config object No Scanner-specific config (see: senpi guide scanners)
|
|
226
|
+
advanced object No
|
|
227
|
+
|
|
228
|
+
actions[]
|
|
229
|
+
name string Yes
|
|
230
|
+
action_type string Yes OPEN_POSITION
|
|
231
|
+
decision_mode string Yes llm | no_decision
|
|
232
|
+
decision_model string No Required when decision_mode: llm
|
|
233
|
+
scanners string[] No Scanner names this action listens to
|
|
234
|
+
min_confidence number No 0–10
|
|
235
|
+
context string[] No [signal]
|
|
236
|
+
decision_prompt string No Prompt template with {{signal}}
|
|
237
|
+
params object No
|
|
238
|
+
|
|
239
|
+
exit
|
|
240
|
+
engine string No dsl
|
|
241
|
+
interval_seconds number No Default 30
|
|
242
|
+
dsl_presets object No Presets keyed by name (preferred)
|
|
243
|
+
dsl object No Legacy alias for dsl_presets
|
|
244
|
+
|
|
245
|
+
Environment substitution: \${VAR} and \${VAR:-default} resolved at load time.
|
|
246
|
+
`.trim();
|
|
247
|
+
const MINIMAL_YAML = `
|
|
248
|
+
name: minimal
|
|
249
|
+
version: 1.0.0
|
|
250
|
+
description: Watch-only strategy — logs signals, opens no positions.
|
|
251
|
+
|
|
252
|
+
strategies:
|
|
253
|
+
watch-only:
|
|
254
|
+
wallet: "\${WALLET_ADDRESS}"
|
|
255
|
+
budget: "0"
|
|
256
|
+
slots: 1
|
|
257
|
+
margin_per_slot: 0
|
|
258
|
+
trading_risk: conservative
|
|
259
|
+
enabled: true
|
|
260
|
+
|
|
261
|
+
scanners:
|
|
262
|
+
- name: emerging_movers
|
|
263
|
+
type: emerging_movers
|
|
264
|
+
interval: 60s
|
|
265
|
+
config:
|
|
266
|
+
topN: 20
|
|
267
|
+
minRankJump: 5
|
|
268
|
+
minScansBeforeSignals: 2
|
|
269
|
+
|
|
270
|
+
actions:
|
|
271
|
+
- name: log_signals
|
|
272
|
+
action_type: OPEN_POSITION
|
|
273
|
+
decision_mode: no_decision
|
|
274
|
+
scanners: [emerging_movers]
|
|
275
|
+
min_confidence: 0
|
|
276
|
+
|
|
277
|
+
exit:
|
|
278
|
+
engine: dsl
|
|
279
|
+
interval_seconds: 60
|
|
280
|
+
dsl_presets:
|
|
281
|
+
default:
|
|
282
|
+
phase1:
|
|
283
|
+
enabled: true
|
|
284
|
+
consecutive_breaches_required: 3
|
|
285
|
+
max_loss_pct: 5.0
|
|
286
|
+
phase2_trigger_tier: 0
|
|
287
|
+
phase2:
|
|
288
|
+
enabled: false
|
|
289
|
+
`.trim();
|
|
290
|
+
/**
|
|
291
|
+
* Register `senpi guide [subcommand]` on the senpi Commander subprogram.
|
|
292
|
+
* @param senpi - the `senpi` Commander command object
|
|
293
|
+
* @param version - plugin version string (from src/version.ts)
|
|
294
|
+
*/
|
|
295
|
+
export function registerGuideCommands(senpi, version) {
|
|
296
|
+
const guide = senpi.command("guide")
|
|
297
|
+
.description("In-shell reference for @senpi/trading-runtime");
|
|
298
|
+
guide.action(() => {
|
|
299
|
+
process.stdout.write(OVERVIEW_TEXT(version) + "\n");
|
|
300
|
+
});
|
|
301
|
+
guide.command("scanners")
|
|
302
|
+
.description("Scanner types and config fields")
|
|
303
|
+
.action(() => {
|
|
304
|
+
process.stdout.write(SCANNERS_TEXT + "\n");
|
|
305
|
+
});
|
|
306
|
+
guide.command("actions")
|
|
307
|
+
.description("Action types and decision modes")
|
|
308
|
+
.action(() => {
|
|
309
|
+
process.stdout.write(ACTIONS_TEXT + "\n");
|
|
310
|
+
});
|
|
311
|
+
guide.command("dsl")
|
|
312
|
+
.description("DSL two-phase exit engine reference")
|
|
313
|
+
.action(() => {
|
|
314
|
+
process.stdout.write(DSL_TEXT + "\n");
|
|
315
|
+
});
|
|
316
|
+
guide.command("examples")
|
|
317
|
+
.description("Print minimal strategy YAML to stdout")
|
|
318
|
+
.action(() => {
|
|
319
|
+
process.stdout.write(MINIMAL_YAML + "\n");
|
|
320
|
+
});
|
|
321
|
+
guide.command("schema")
|
|
322
|
+
.description("Full YAML schema field reference")
|
|
323
|
+
.action(() => {
|
|
324
|
+
process.stdout.write(SCHEMA_TEXT + "\n");
|
|
325
|
+
});
|
|
326
|
+
guide.command("version")
|
|
327
|
+
.description("Plugin version and changelog URL")
|
|
328
|
+
.action(() => {
|
|
329
|
+
process.stdout.write(`@senpi/trading-runtime v${version}\n${CHANGELOG_URL}\n`);
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=guide-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,aAAa,GACjB,0EAA0E,CAAC;AAE7E,+EAA+E;AAE/E,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;0BACjB,OAAO;;;;;;;;;;;;;;;;CAgBhC,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCpB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CpB,CAAC,IAAI,EAAE,CAAC;AAYT;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,OAAe;IAEf,MAAM,KAAK,GAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAsB;SACvD,WAAW,CAAC,+CAA+C,CAAC,CAAC;IAEhE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAsB;SACvC,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAsB;SAC1C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw CLI commands: openclaw senpi trading-strategy create | list | uninstallStrategy.
|
|
3
|
+
* create hot-loads via gateway RPC; list/uninstallStrategy operate on the registry.
|
|
4
|
+
*/
|
|
5
|
+
export type GetStateDir = () => string;
|
|
6
|
+
/**
|
|
7
|
+
* Register senpi subcommands on the given Commander program.
|
|
8
|
+
* getStateDir: returns the plugin state dir (e.g. from config or default).
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerSenpiCli(program: {
|
|
11
|
+
command: (name: string, desc?: string) => CommanderCommand | unknown;
|
|
12
|
+
}, getStateDir: GetStateDir): void;
|
|
13
|
+
/** Minimal Commander command type for subcommands and options. */
|
|
14
|
+
interface CommanderCommand {
|
|
15
|
+
command(name: string, desc?: string): CommanderCommand;
|
|
16
|
+
description(desc: string): CommanderCommand;
|
|
17
|
+
option(flags: string, description?: string): CommanderCommand;
|
|
18
|
+
requiredOption(flags: string, description?: string): CommanderCommand;
|
|
19
|
+
action(fn: (opts: Record<string, unknown>) => void | Promise<void>): CommanderCommand;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=senpi-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"senpi-commands.d.ts","sourceRoot":"","sources":["../../src/cli/senpi-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAA;CAAE,EACjF,WAAW,EAAE,WAAW,GACvB,IAAI,CA4HN;AAED,kEAAkE;AAClE,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACtE,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACvF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw CLI commands: openclaw senpi trading-strategy create | list | uninstallStrategy.
|
|
3
|
+
* create hot-loads via gateway RPC; list/uninstallStrategy operate on the registry.
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { registerGuideCommands } from "./guide-commands.js";
|
|
8
|
+
import { VERSION } from "../version.js";
|
|
9
|
+
import { loadTradingStrategy } from "../runtime/load-trading-strategy.js";
|
|
10
|
+
import { readRegistry, writeRegistry, validateEntry, hasId, deriveIdFromPath, deriveIdForContent, sanitizeId, } from "../runtime/strategy-registry.js";
|
|
11
|
+
/**
|
|
12
|
+
* Register senpi subcommands on the given Commander program.
|
|
13
|
+
* getStateDir: returns the plugin state dir (e.g. from config or default).
|
|
14
|
+
*/
|
|
15
|
+
export function registerSenpiCli(program, getStateDir) {
|
|
16
|
+
const senpi = program.command("senpi");
|
|
17
|
+
senpi.description("Senpi trading runtime: trading-strategy create, list, uninstallStrategy");
|
|
18
|
+
const tradingStrategy = senpi.command("trading-strategy");
|
|
19
|
+
tradingStrategy.description("Manage trading strategies");
|
|
20
|
+
tradingStrategy
|
|
21
|
+
.command("create")
|
|
22
|
+
.description("Create and hot-load a strategy from a YAML file or inline content (no gateway restart)")
|
|
23
|
+
.option("-p, --path <path>", "Path to trading strategy YAML file")
|
|
24
|
+
.option("-c, --content <content>", "Inline YAML content")
|
|
25
|
+
.option("--strategy-id <id>", "Strategy id (default: derived from path or content-N)")
|
|
26
|
+
.option("--state-dir <dir>", "Override state directory (default: from config or ~/.openclaw/senpi-state)")
|
|
27
|
+
.action(async (opts) => {
|
|
28
|
+
const stateDir = opts.stateDir ?? getStateDir();
|
|
29
|
+
const hasPath = typeof opts.path === "string" && opts.path.length > 0;
|
|
30
|
+
const hasContent = typeof opts.content === "string";
|
|
31
|
+
if (hasPath && hasContent) {
|
|
32
|
+
console.error("Error: provide exactly one of --path or --content");
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (!hasPath && !hasContent) {
|
|
37
|
+
console.error("Error: provide --path or --content");
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const registry = await readRegistry(stateDir);
|
|
42
|
+
let id;
|
|
43
|
+
if (typeof opts.strategyId === "string" && opts.strategyId.length > 0) {
|
|
44
|
+
id = sanitizeId(opts.strategyId);
|
|
45
|
+
if (id.length === 0)
|
|
46
|
+
id = "strategy";
|
|
47
|
+
if (hasId(registry, id)) {
|
|
48
|
+
console.error(`Error: id '${id}' already exists`);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
id =
|
|
55
|
+
hasPath
|
|
56
|
+
? deriveIdFromPath(opts.path, registry.strategies.map((s) => s.id))
|
|
57
|
+
: deriveIdForContent(registry.strategies.map((s) => s.id));
|
|
58
|
+
}
|
|
59
|
+
const tradingStrategyYamlPath = hasPath ? path.resolve(process.cwd(), opts.path) : undefined;
|
|
60
|
+
const tradingStrategyYamlContent = hasContent ? opts.content : undefined;
|
|
61
|
+
const entry = hasPath
|
|
62
|
+
? { id, tradingStrategyYamlPath: opts.path }
|
|
63
|
+
: { id, tradingStrategyYamlContent: opts.content };
|
|
64
|
+
const valid = validateEntry(entry);
|
|
65
|
+
if (!valid.ok) {
|
|
66
|
+
console.error("Error:", valid.error);
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const pathOrContent = hasPath ? tradingStrategyYamlPath : tradingStrategyYamlContent;
|
|
71
|
+
try {
|
|
72
|
+
await loadTradingStrategy(pathOrContent, { fromPath: hasPath });
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const params = tradingStrategyYamlPath
|
|
80
|
+
? { tradingStrategyYamlPath, id }
|
|
81
|
+
: { tradingStrategyYamlContent: tradingStrategyYamlContent, id };
|
|
82
|
+
const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.installStrategy", "--params", JSON.stringify(params)], {
|
|
83
|
+
stdio: "inherit",
|
|
84
|
+
cwd: process.cwd(),
|
|
85
|
+
});
|
|
86
|
+
if (result.status === 0) {
|
|
87
|
+
process.exitCode = 0;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const fallbackRegistry = await readRegistry(stateDir);
|
|
91
|
+
if (!hasId(fallbackRegistry, id)) {
|
|
92
|
+
fallbackRegistry.strategies.push(entry);
|
|
93
|
+
await writeRegistry(stateDir, fallbackRegistry);
|
|
94
|
+
console.error("Gateway unreachable. Strategy added to registry. Start or restart the gateway to load it.");
|
|
95
|
+
}
|
|
96
|
+
process.exitCode = result.status ?? 1;
|
|
97
|
+
});
|
|
98
|
+
tradingStrategy
|
|
99
|
+
.command("uninstallStrategy")
|
|
100
|
+
.description("Remove a strategy by id")
|
|
101
|
+
.option("--strategy-id <id>", "Strategy id to remove")
|
|
102
|
+
.option("--state-dir <dir>", "Override state directory")
|
|
103
|
+
.action(async (opts) => {
|
|
104
|
+
if (typeof opts.strategyId !== "string" || opts.strategyId.length === 0) {
|
|
105
|
+
console.error("Error: --strategy-id is required");
|
|
106
|
+
process.exitCode = 1;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const stateDir = opts.stateDir ?? getStateDir();
|
|
110
|
+
const registry = await readRegistry(stateDir);
|
|
111
|
+
const next = registry.strategies.filter((e) => e.id !== opts.strategyId);
|
|
112
|
+
if (next.length === registry.strategies.length) {
|
|
113
|
+
console.log(`No strategy with id '${opts.strategyId}' in registry.`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
await writeRegistry(stateDir, { ...registry, strategies: next });
|
|
117
|
+
console.log(`Strategy '${opts.strategyId}' removed from registry. Restart the gateway or call senpi.uninstallStrategy RPC to stop it.`);
|
|
118
|
+
});
|
|
119
|
+
tradingStrategy
|
|
120
|
+
.command("list")
|
|
121
|
+
.description("List installed strategies")
|
|
122
|
+
.option("--state-dir <dir>", "Override state directory")
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
const stateDir = opts.stateDir ?? getStateDir();
|
|
125
|
+
const registry = await readRegistry(stateDir);
|
|
126
|
+
if (registry.strategies.length === 0) {
|
|
127
|
+
console.log("No strategies installed.");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
console.log("id\t\tsource");
|
|
131
|
+
for (const e of registry.strategies) {
|
|
132
|
+
const source = e.tradingStrategyYamlPath ?? "(inline)";
|
|
133
|
+
console.log(`${e.id}\t\t${source}`);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
registerGuideCommands(senpi, VERSION);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=senpi-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"senpi-commands.js","sourceRoot":"","sources":["../../src/cli/senpi-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized constants for the DSL feature.
|
|
3
|
+
*/
|
|
4
|
+
export declare const COMPONENT_TYPE_EXIT_DSL: "exit/dsl";
|
|
5
|
+
/** DSL subscribes to the same hook event names as the rest of the runtime. */
|
|
6
|
+
export declare const EVENTS: {
|
|
7
|
+
readonly POSITION_OPENED: "on_position_opened";
|
|
8
|
+
readonly POSITION_CLOSED: "on_position_closed";
|
|
9
|
+
readonly POSITION_FLIPPED: "on_position_flipped";
|
|
10
|
+
};
|
|
11
|
+
export declare const DSL_EVENTS: {
|
|
12
|
+
readonly CREATED: "dsl.created";
|
|
13
|
+
readonly PHASE_CHANGED: "dsl.phase_changed";
|
|
14
|
+
readonly TIER_ADVANCED: "dsl.tier_advanced";
|
|
15
|
+
readonly SL_UPDATED: "dsl.sl_updated";
|
|
16
|
+
readonly CLOSED: "dsl.closed";
|
|
17
|
+
readonly CLOSE_PENDING: "dsl.close_pending";
|
|
18
|
+
readonly SETTINGS_UPDATED: "dsl.settings_updated";
|
|
19
|
+
};
|
|
20
|
+
export declare const DEFAULT_STATE_DIR = ".dsl-state";
|
|
21
|
+
export declare const DSL_STATE_VERSION = 2;
|
|
22
|
+
/** Close reasons for DSL state (closeReason) and position.closed (reason). */
|
|
23
|
+
export declare const CLOSE_REASON: {
|
|
24
|
+
readonly MANUAL_CLOSE: "manual_close";
|
|
25
|
+
readonly CLOSED_EXTERNALLY: "closed_externally";
|
|
26
|
+
readonly SL_HIT: "sl_hit";
|
|
27
|
+
readonly DSL_BREACH: "dsl_breach";
|
|
28
|
+
readonly FLIPPED: "flipped";
|
|
29
|
+
readonly CLOSE_POSITION_FAILED: "close_position_failed";
|
|
30
|
+
};
|
|
31
|
+
export type CloseReason = (typeof CLOSE_REASON)[keyof typeof CLOSE_REASON];
|
|
32
|
+
export declare const MIN_INTERVAL_SECONDS = 5;
|
|
33
|
+
export declare const DEFAULT_INTERVAL_MS = 30000;
|
|
34
|
+
export declare const MAX_CONSECUTIVE_CLOSE_FAILURES = 3;
|
|
35
|
+
export declare const MCP_TOOL_PREFIX = "senpi.";
|
|
36
|
+
export declare const PHASE1_DEFAULT_BREACHES = 3;
|
|
37
|
+
export declare const PHASE2_DEFAULT_BREACHES = 1;
|
|
38
|
+
export declare const PRICE_DECIMALS = 4;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,uBAAuB,EAAG,UAAmB,CAAC;AAE3D,8EAA8E;AAC9E,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,8EAA8E;AAC9E,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC3E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,cAAc,IAAI,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized constants for the DSL feature.
|
|
3
|
+
*/
|
|
4
|
+
import { HOOK_EVENT } from "../../types/hooks.js";
|
|
5
|
+
export const COMPONENT_TYPE_EXIT_DSL = "exit/dsl";
|
|
6
|
+
/** DSL subscribes to the same hook event names as the rest of the runtime. */
|
|
7
|
+
export const EVENTS = {
|
|
8
|
+
POSITION_OPENED: HOOK_EVENT.ON_POSITION_OPENED,
|
|
9
|
+
POSITION_CLOSED: HOOK_EVENT.ON_POSITION_CLOSED,
|
|
10
|
+
POSITION_FLIPPED: HOOK_EVENT.ON_POSITION_FLIPPED,
|
|
11
|
+
};
|
|
12
|
+
export const DSL_EVENTS = {
|
|
13
|
+
CREATED: "dsl.created",
|
|
14
|
+
PHASE_CHANGED: "dsl.phase_changed",
|
|
15
|
+
TIER_ADVANCED: "dsl.tier_advanced",
|
|
16
|
+
SL_UPDATED: "dsl.sl_updated",
|
|
17
|
+
CLOSED: "dsl.closed",
|
|
18
|
+
CLOSE_PENDING: "dsl.close_pending",
|
|
19
|
+
SETTINGS_UPDATED: "dsl.settings_updated",
|
|
20
|
+
};
|
|
21
|
+
export const DEFAULT_STATE_DIR = ".dsl-state";
|
|
22
|
+
export const DSL_STATE_VERSION = 2;
|
|
23
|
+
/** Close reasons for DSL state (closeReason) and position.closed (reason). */
|
|
24
|
+
export const CLOSE_REASON = {
|
|
25
|
+
MANUAL_CLOSE: "manual_close",
|
|
26
|
+
CLOSED_EXTERNALLY: "closed_externally",
|
|
27
|
+
SL_HIT: "sl_hit",
|
|
28
|
+
DSL_BREACH: "dsl_breach",
|
|
29
|
+
FLIPPED: "flipped",
|
|
30
|
+
CLOSE_POSITION_FAILED: "close_position_failed",
|
|
31
|
+
};
|
|
32
|
+
export const MIN_INTERVAL_SECONDS = 5;
|
|
33
|
+
export const DEFAULT_INTERVAL_MS = 30_000;
|
|
34
|
+
export const MAX_CONSECUTIVE_CLOSE_FAILURES = 3;
|
|
35
|
+
export const MCP_TOOL_PREFIX = "senpi.";
|
|
36
|
+
export const PHASE1_DEFAULT_BREACHES = 3;
|
|
37
|
+
export const PHASE2_DEFAULT_BREACHES = 1;
|
|
38
|
+
export const PRICE_DECIMALS = 4;
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAmB,CAAC;AAE3D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,gBAAgB,EAAE,UAAU,CAAC,mBAAmB;CACxC,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,mBAAmB;IAClC,gBAAgB,EAAE,sBAAsB;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,uBAAuB;CACtC,CAAC;AAGX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeContextBuilder: resolves context variables for LLM decision prompts.
|
|
3
|
+
*
|
|
4
|
+
* Each context type (e.g. "signal", "strategy") is backed by a ContextProvider
|
|
5
|
+
* that knows how to extract/compute its data from the event and runtime state.
|
|
6
|
+
*/
|
|
7
|
+
import type { ContextBuilder as IContextBuilder, ContextEntry, ContextProvider, ContextProviderRequest } from "./types.js";
|
|
8
|
+
export declare class RuntimeContextBuilder implements IContextBuilder {
|
|
9
|
+
private providers;
|
|
10
|
+
register(provider: ContextProvider): void;
|
|
11
|
+
build(entries: ContextEntry[], request: ContextProviderRequest): Promise<Record<string, unknown>>;
|
|
12
|
+
}
|
|
13
|
+
export declare function createContextBuilder(): RuntimeContextBuilder;
|
|
14
|
+
//# sourceMappingURL=context-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/context/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,IAAI,eAAe,EACjC,YAAY,EACZ,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAQpB,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,OAAO,CAAC,SAAS,CAAsC;IAEvD,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInC,KAAK,CACT,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAUpC;AAID,wBAAgB,oBAAoB,IAAI,qBAAqB,CAO5D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuntimeContextBuilder: resolves context variables for LLM decision prompts.
|
|
3
|
+
*
|
|
4
|
+
* Each context type (e.g. "signal", "strategy") is backed by a ContextProvider
|
|
5
|
+
* that knows how to extract/compute its data from the event and runtime state.
|
|
6
|
+
*/
|
|
7
|
+
import { signalProvider } from "./providers/signal.provider.js";
|
|
8
|
+
import { strategyProvider } from "./providers/strategy.provider.js";
|
|
9
|
+
import { regimeProvider } from "./providers/regime.provider.js";
|
|
10
|
+
import { assetTrendProvider } from "./providers/asset-trend.provider.js";
|
|
11
|
+
// ─── RuntimeContextBuilder ──────────────────────────────────────────────────
|
|
12
|
+
export class RuntimeContextBuilder {
|
|
13
|
+
providers = new Map();
|
|
14
|
+
register(provider) {
|
|
15
|
+
this.providers.set(provider.type, provider);
|
|
16
|
+
}
|
|
17
|
+
async build(entries, request) {
|
|
18
|
+
const results = await Promise.all(entries.map(async (entry) => {
|
|
19
|
+
const provider = this.providers.get(entry.type);
|
|
20
|
+
if (!provider)
|
|
21
|
+
return [entry.value, null];
|
|
22
|
+
return [entry.value, await provider.resolve(request, entry)];
|
|
23
|
+
}));
|
|
24
|
+
return Object.fromEntries(results);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// ─── Factory ────────────────────────────────────────────────────────────────
|
|
28
|
+
export function createContextBuilder() {
|
|
29
|
+
const builder = new RuntimeContextBuilder();
|
|
30
|
+
builder.register(signalProvider);
|
|
31
|
+
builder.register(strategyProvider);
|
|
32
|
+
builder.register(regimeProvider);
|
|
33
|
+
builder.register(assetTrendProvider);
|
|
34
|
+
return builder;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=context-builder.js.map
|