@senpi/trading-recipe 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -0
- package/dist/actions/close-position/close-position.action.d.ts +16 -0
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -0
- package/dist/actions/close-position/close-position.action.js +215 -0
- package/dist/actions/close-position/close-position.action.js.map +1 -0
- package/dist/actions/decision-engine.d.ts +32 -0
- package/dist/actions/decision-engine.d.ts.map +1 -0
- package/dist/actions/decision-engine.js +103 -0
- package/dist/actions/decision-engine.js.map +1 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +12 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.js +74 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -0
- package/dist/actions/llm-decision/factory.d.ts +17 -0
- package/dist/actions/llm-decision/factory.d.ts.map +1 -0
- package/dist/actions/llm-decision/factory.js +29 -0
- package/dist/actions/llm-decision/factory.js.map +1 -0
- package/dist/actions/llm-decision/index.d.ts +8 -0
- package/dist/actions/llm-decision/index.d.ts.map +1 -0
- package/dist/actions/llm-decision/index.js +5 -0
- package/dist/actions/llm-decision/index.js.map +1 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +14 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.js +58 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -0
- package/dist/actions/llm-decision/shared.d.ts +41 -0
- package/dist/actions/llm-decision/shared.d.ts.map +1 -0
- package/dist/actions/llm-decision/shared.js +117 -0
- package/dist/actions/llm-decision/shared.js.map +1 -0
- package/dist/actions/open-position/open-position.action.d.ts +16 -0
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -0
- package/dist/actions/open-position/open-position.action.js +275 -0
- package/dist/actions/open-position/open-position.action.js.map +1 -0
- package/dist/actions/types.d.ts +123 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +3 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/cli/guide-commands.d.ts +26 -0
- package/dist/cli/guide-commands.d.ts.map +1 -0
- package/dist/cli/guide-commands.js +345 -0
- package/dist/cli/guide-commands.js.map +1 -0
- package/dist/cli/senpi-commands.d.ts +20 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -0
- package/dist/cli/senpi-commands.js +115 -0
- package/dist/cli/senpi-commands.js.map +1 -0
- package/dist/constants/dsl/index.d.ts +45 -0
- package/dist/constants/dsl/index.d.ts.map +1 -0
- package/dist/constants/dsl/index.js +45 -0
- package/dist/constants/dsl/index.js.map +1 -0
- package/dist/context/context-builder.d.ts +14 -0
- package/dist/context/context-builder.d.ts.map +1 -0
- package/dist/context/context-builder.js +36 -0
- package/dist/context/context-builder.js.map +1 -0
- package/dist/context/index.d.ts +5 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +5 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/interpolate.d.ts +6 -0
- package/dist/context/interpolate.d.ts.map +1 -0
- package/dist/context/interpolate.js +15 -0
- package/dist/context/interpolate.js.map +1 -0
- package/dist/context/providers/asset-trend.provider.d.ts +42 -0
- package/dist/context/providers/asset-trend.provider.d.ts.map +1 -0
- package/dist/context/providers/asset-trend.provider.js +94 -0
- package/dist/context/providers/asset-trend.provider.js.map +1 -0
- package/dist/context/providers/index.d.ts +5 -0
- package/dist/context/providers/index.d.ts.map +1 -0
- package/dist/context/providers/index.js +5 -0
- package/dist/context/providers/index.js.map +1 -0
- package/dist/context/providers/regime.provider.d.ts +14 -0
- package/dist/context/providers/regime.provider.d.ts.map +1 -0
- package/dist/context/providers/regime.provider.js +29 -0
- package/dist/context/providers/regime.provider.js.map +1 -0
- package/dist/context/providers/signal.provider.d.ts +11 -0
- package/dist/context/providers/signal.provider.d.ts.map +1 -0
- package/dist/context/providers/signal.provider.js +27 -0
- package/dist/context/providers/signal.provider.js.map +1 -0
- package/dist/context/providers/strategy.provider.d.ts +14 -0
- package/dist/context/providers/strategy.provider.d.ts.map +1 -0
- package/dist/context/providers/strategy.provider.js +68 -0
- package/dist/context/providers/strategy.provider.js.map +1 -0
- package/dist/context/types.d.ts +30 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +2 -0
- package/dist/context/types.js.map +1 -0
- package/dist/dsl/config/index.d.ts +59 -0
- package/dist/dsl/config/index.d.ts.map +1 -0
- package/dist/dsl/config/index.js +171 -0
- package/dist/dsl/config/index.js.map +1 -0
- package/dist/dsl/constants/index.d.ts +3 -0
- package/dist/dsl/constants/index.d.ts.map +1 -0
- package/dist/dsl/constants/index.js +3 -0
- package/dist/dsl/constants/index.js.map +1 -0
- package/dist/dsl/engine/index.d.ts +7 -0
- package/dist/dsl/engine/index.d.ts.map +1 -0
- package/dist/dsl/engine/index.js +310 -0
- package/dist/dsl/engine/index.js.map +1 -0
- package/dist/dsl/events/bus-types.d.ts +7 -0
- package/dist/dsl/events/bus-types.d.ts.map +1 -0
- package/dist/dsl/events/bus-types.js +6 -0
- package/dist/dsl/events/bus-types.js.map +1 -0
- package/dist/dsl/events/guards.d.ts +17 -0
- package/dist/dsl/events/guards.d.ts.map +1 -0
- package/dist/dsl/events/guards.js +94 -0
- package/dist/dsl/events/guards.js.map +1 -0
- package/dist/dsl/events/handlers.d.ts +15 -0
- package/dist/dsl/events/handlers.d.ts.map +1 -0
- package/dist/dsl/events/handlers.js +252 -0
- package/dist/dsl/events/handlers.js.map +1 -0
- package/dist/dsl/events/index.d.ts +4 -0
- package/dist/dsl/events/index.d.ts.map +1 -0
- package/dist/dsl/events/index.js +4 -0
- package/dist/dsl/events/index.js.map +1 -0
- package/dist/dsl/index.d.ts +13 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +35 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/monitor/index.d.ts +18 -0
- package/dist/dsl/monitor/index.d.ts.map +1 -0
- package/dist/dsl/monitor/index.js +310 -0
- package/dist/dsl/monitor/index.js.map +1 -0
- package/dist/dsl/plugin/index.d.ts +29 -0
- package/dist/dsl/plugin/index.d.ts.map +1 -0
- package/dist/dsl/plugin/index.js +85 -0
- package/dist/dsl/plugin/index.js.map +1 -0
- package/dist/dsl/types/index.d.ts +3 -0
- package/dist/dsl/types/index.d.ts.map +1 -0
- package/dist/dsl/types/index.js +3 -0
- package/dist/dsl/types/index.js.map +1 -0
- package/dist/health/index.d.ts +9 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +9 -0
- package/dist/health/index.js.map +1 -0
- package/dist/index.d.ts +95 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +235 -0
- package/dist/index.js.map +1 -0
- package/dist/leverage/max-leverage-cache.d.ts +10 -0
- package/dist/leverage/max-leverage-cache.d.ts.map +1 -0
- package/dist/leverage/max-leverage-cache.js +51 -0
- package/dist/leverage/max-leverage-cache.js.map +1 -0
- package/dist/leverage/resolve-leverage.d.ts +9 -0
- package/dist/leverage/resolve-leverage.d.ts.map +1 -0
- package/dist/leverage/resolve-leverage.js +15 -0
- package/dist/leverage/resolve-leverage.js.map +1 -0
- package/dist/risk/index.d.ts +9 -0
- package/dist/risk/index.d.ts.map +1 -0
- package/dist/risk/index.js +9 -0
- package/dist/risk/index.js.map +1 -0
- package/dist/runtime/action-registry.d.ts +12 -0
- package/dist/runtime/action-registry.d.ts.map +1 -0
- package/dist/runtime/action-registry.js +20 -0
- package/dist/runtime/action-registry.js.map +1 -0
- package/dist/runtime/build-action-scan-payload.d.ts +20 -0
- package/dist/runtime/build-action-scan-payload.d.ts.map +1 -0
- package/dist/runtime/build-action-scan-payload.js +40 -0
- package/dist/runtime/build-action-scan-payload.js.map +1 -0
- package/dist/runtime/bus.d.ts +6 -0
- package/dist/runtime/bus.d.ts.map +1 -0
- package/dist/runtime/bus.js +19 -0
- package/dist/runtime/bus.js.map +1 -0
- package/dist/runtime/create-action-context.d.ts +34 -0
- package/dist/runtime/create-action-context.d.ts.map +1 -0
- package/dist/runtime/create-action-context.js +22 -0
- package/dist/runtime/create-action-context.js.map +1 -0
- package/dist/runtime/create-actions.d.ts +30 -0
- package/dist/runtime/create-actions.d.ts.map +1 -0
- package/dist/runtime/create-actions.js +71 -0
- package/dist/runtime/create-actions.js.map +1 -0
- package/dist/runtime/create-runtime-context.d.ts +35 -0
- package/dist/runtime/create-runtime-context.d.ts.map +1 -0
- package/dist/runtime/create-runtime-context.js +33 -0
- package/dist/runtime/create-runtime-context.js.map +1 -0
- package/dist/runtime/create-scanner-module.d.ts +14 -0
- package/dist/runtime/create-scanner-module.d.ts.map +1 -0
- package/dist/runtime/create-scanner-module.js +26 -0
- package/dist/runtime/create-scanner-module.js.map +1 -0
- package/dist/runtime/create-scanner-providers-for-run.d.ts +20 -0
- package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -0
- package/dist/runtime/create-scanner-providers-for-run.js +34 -0
- package/dist/runtime/create-scanner-providers-for-run.js.map +1 -0
- package/dist/runtime/default-state-dir.d.ts +10 -0
- package/dist/runtime/default-state-dir.d.ts.map +1 -0
- package/dist/runtime/default-state-dir.js +22 -0
- package/dist/runtime/default-state-dir.js.map +1 -0
- package/dist/runtime/env-resolve.d.ts +17 -0
- package/dist/runtime/env-resolve.d.ts.map +1 -0
- package/dist/runtime/env-resolve.js +45 -0
- package/dist/runtime/env-resolve.js.map +1 -0
- package/dist/runtime/hook-system.d.ts +7 -0
- package/dist/runtime/hook-system.d.ts.map +1 -0
- package/dist/runtime/hook-system.js +16 -0
- package/dist/runtime/hook-system.js.map +1 -0
- package/dist/runtime/index.d.ts +37 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +26 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/load-trading-strategy.d.ts +23 -0
- package/dist/runtime/load-trading-strategy.d.ts.map +1 -0
- package/dist/runtime/load-trading-strategy.js +130 -0
- package/dist/runtime/load-trading-strategy.js.map +1 -0
- package/dist/runtime/map-exit-config.d.ts +12 -0
- package/dist/runtime/map-exit-config.d.ts.map +1 -0
- package/dist/runtime/map-exit-config.js +91 -0
- package/dist/runtime/map-exit-config.js.map +1 -0
- package/dist/runtime/map-strategies-registration.d.ts +12 -0
- package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
- package/dist/runtime/map-strategies-registration.js +52 -0
- package/dist/runtime/map-strategies-registration.js.map +1 -0
- package/dist/runtime/map-strategies.d.ts +12 -0
- package/dist/runtime/map-strategies.d.ts.map +1 -0
- package/dist/runtime/map-strategies.js +66 -0
- package/dist/runtime/map-strategies.js.map +1 -0
- package/dist/runtime/notifications.d.ts +12 -0
- package/dist/runtime/notifications.d.ts.map +1 -0
- package/dist/runtime/notifications.js +83 -0
- package/dist/runtime/notifications.js.map +1 -0
- package/dist/runtime/parse-interval.d.ts +11 -0
- package/dist/runtime/parse-interval.d.ts.map +1 -0
- package/dist/runtime/parse-interval.js +35 -0
- package/dist/runtime/parse-interval.js.map +1 -0
- package/dist/runtime/reconcile-state.d.ts +25 -0
- package/dist/runtime/reconcile-state.d.ts.map +1 -0
- package/dist/runtime/reconcile-state.js +112 -0
- package/dist/runtime/reconcile-state.js.map +1 -0
- package/dist/runtime/risk-guard.d.ts +6 -0
- package/dist/runtime/risk-guard.d.ts.map +1 -0
- package/dist/runtime/risk-guard.js +14 -0
- package/dist/runtime/risk-guard.js.map +1 -0
- package/dist/runtime/run.d.ts +21 -0
- package/dist/runtime/run.d.ts.map +1 -0
- package/dist/runtime/run.js +35 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/runtime.d.ts +40 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +251 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scanner-registry.d.ts +22 -0
- package/dist/runtime/scanner-registry.d.ts.map +1 -0
- package/dist/runtime/scanner-registry.js +83 -0
- package/dist/runtime/scanner-registry.js.map +1 -0
- package/dist/runtime/strategy-registry.d.ts +49 -0
- package/dist/runtime/strategy-registry.d.ts.map +1 -0
- package/dist/runtime/strategy-registry.js +156 -0
- package/dist/runtime/strategy-registry.js.map +1 -0
- package/dist/runtime/trading-strategy-config.d.ts +6 -0
- package/dist/runtime/trading-strategy-config.d.ts.map +1 -0
- package/dist/runtime/trading-strategy-config.js +5 -0
- package/dist/runtime/trading-strategy-config.js.map +1 -0
- package/dist/runtime/trading-strategy-schema.d.ts +20093 -0
- package/dist/runtime/trading-strategy-schema.d.ts.map +1 -0
- package/dist/runtime/trading-strategy-schema.js +115 -0
- package/dist/runtime/trading-strategy-schema.js.map +1 -0
- package/dist/scanners/__tests__/fixtures/index.d.ts +3 -0
- package/dist/scanners/__tests__/fixtures/index.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/index.js +3 -0
- package/dist/scanners/__tests__/fixtures/index.js.map +1 -0
- package/dist/scanners/__tests__/fixtures/scan-results.d.ts +23 -0
- package/dist/scanners/__tests__/fixtures/scan-results.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/scan-results.js +128 -0
- package/dist/scanners/__tests__/fixtures/scan-results.js.map +1 -0
- package/dist/scanners/__tests__/fixtures/signals.d.ts +18 -0
- package/dist/scanners/__tests__/fixtures/signals.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/signals.js +84 -0
- package/dist/scanners/__tests__/fixtures/signals.js.map +1 -0
- package/dist/scanners/__tests__/test-helpers.d.ts +4 -0
- package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/scanners/__tests__/test-helpers.js +23 -0
- package/dist/scanners/__tests__/test-helpers.js.map +1 -0
- package/dist/scanners/artifacts.d.ts +119 -0
- package/dist/scanners/artifacts.d.ts.map +1 -0
- package/dist/scanners/artifacts.js +72 -0
- package/dist/scanners/artifacts.js.map +1 -0
- package/dist/scanners/create-scanner.d.ts +13 -0
- package/dist/scanners/create-scanner.d.ts.map +1 -0
- package/dist/scanners/create-scanner.js +11 -0
- package/dist/scanners/create-scanner.js.map +1 -0
- package/dist/scanners/engine/config-validator.d.ts +7 -0
- package/dist/scanners/engine/config-validator.d.ts.map +1 -0
- package/dist/scanners/engine/config-validator.js +16 -0
- package/dist/scanners/engine/config-validator.js.map +1 -0
- package/dist/scanners/engine/data-providers.d.ts +47 -0
- package/dist/scanners/engine/data-providers.d.ts.map +1 -0
- package/dist/scanners/engine/data-providers.js +8 -0
- package/dist/scanners/engine/data-providers.js.map +1 -0
- package/dist/scanners/engine/engine.d.ts +76 -0
- package/dist/scanners/engine/engine.d.ts.map +1 -0
- package/dist/scanners/engine/engine.js +399 -0
- package/dist/scanners/engine/engine.js.map +1 -0
- package/dist/scanners/engine/index.d.ts +9 -0
- package/dist/scanners/engine/index.d.ts.map +1 -0
- package/dist/scanners/engine/index.js +7 -0
- package/dist/scanners/engine/index.js.map +1 -0
- package/dist/scanners/engine/input-resolver.d.ts +21 -0
- package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
- package/dist/scanners/engine/input-resolver.js +149 -0
- package/dist/scanners/engine/input-resolver.js.map +1 -0
- package/dist/scanners/engine/lifecycle.d.ts +21 -0
- package/dist/scanners/engine/lifecycle.d.ts.map +1 -0
- package/dist/scanners/engine/lifecycle.js +2 -0
- package/dist/scanners/engine/lifecycle.js.map +1 -0
- package/dist/scanners/engine/result-builder.d.ts +30 -0
- package/dist/scanners/engine/result-builder.d.ts.map +1 -0
- package/dist/scanners/engine/result-builder.js +129 -0
- package/dist/scanners/engine/result-builder.js.map +1 -0
- package/dist/scanners/engine/strategy-registry.d.ts +45 -0
- package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
- package/dist/scanners/engine/strategy-registry.js +93 -0
- package/dist/scanners/engine/strategy-registry.js.map +1 -0
- package/dist/scanners/events.d.ts +41 -0
- package/dist/scanners/events.d.ts.map +1 -0
- package/dist/scanners/events.js +33 -0
- package/dist/scanners/events.js.map +1 -0
- package/dist/scanners/implementations/emerging-movers.d.ts +215 -0
- package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
- package/dist/scanners/implementations/emerging-movers.js +709 -0
- package/dist/scanners/implementations/emerging-movers.js.map +1 -0
- package/dist/scanners/implementations/index.d.ts +8 -0
- package/dist/scanners/implementations/index.d.ts.map +1 -0
- package/dist/scanners/implementations/index.js +8 -0
- package/dist/scanners/implementations/index.js.map +1 -0
- package/dist/scanners/implementations/indicators.d.ts +40 -0
- package/dist/scanners/implementations/indicators.d.ts.map +1 -0
- package/dist/scanners/implementations/indicators.js +114 -0
- package/dist/scanners/implementations/indicators.js.map +1 -0
- package/dist/scanners/implementations/liquidation-watchdog.d.ts +74 -0
- package/dist/scanners/implementations/liquidation-watchdog.d.ts.map +1 -0
- package/dist/scanners/implementations/liquidation-watchdog.js +268 -0
- package/dist/scanners/implementations/liquidation-watchdog.js.map +1 -0
- package/dist/scanners/implementations/market-regime.d.ts +52 -0
- package/dist/scanners/implementations/market-regime.d.ts.map +1 -0
- package/dist/scanners/implementations/market-regime.js +201 -0
- package/dist/scanners/implementations/market-regime.js.map +1 -0
- package/dist/scanners/implementations/momentum.d.ts +21 -0
- package/dist/scanners/implementations/momentum.d.ts.map +1 -0
- package/dist/scanners/implementations/momentum.js +128 -0
- package/dist/scanners/implementations/momentum.js.map +1 -0
- package/dist/scanners/implementations/oi-tracker.d.ts +13 -0
- package/dist/scanners/implementations/oi-tracker.d.ts.map +1 -0
- package/dist/scanners/implementations/oi-tracker.js +67 -0
- package/dist/scanners/implementations/oi-tracker.js.map +1 -0
- package/dist/scanners/implementations/opportunity.d.ts +104 -0
- package/dist/scanners/implementations/opportunity.d.ts.map +1 -0
- package/dist/scanners/implementations/opportunity.js +441 -0
- package/dist/scanners/implementations/opportunity.js.map +1 -0
- package/dist/scanners/implementations/prescreener.d.ts +20 -0
- package/dist/scanners/implementations/prescreener.d.ts.map +1 -0
- package/dist/scanners/implementations/prescreener.js +97 -0
- package/dist/scanners/implementations/prescreener.js.map +1 -0
- package/dist/scanners/implementations/sm-flip.d.ts +43 -0
- package/dist/scanners/implementations/sm-flip.d.ts.map +1 -0
- package/dist/scanners/implementations/sm-flip.js +200 -0
- package/dist/scanners/implementations/sm-flip.js.map +1 -0
- package/dist/scanners/index.d.ts +25 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +18 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/input-descriptors.d.ts +61 -0
- package/dist/scanners/input-descriptors.d.ts.map +1 -0
- package/dist/scanners/input-descriptors.js +43 -0
- package/dist/scanners/input-descriptors.js.map +1 -0
- package/dist/scanners/protocol/context.d.ts +75 -0
- package/dist/scanners/protocol/context.d.ts.map +1 -0
- package/dist/scanners/protocol/context.js +2 -0
- package/dist/scanners/protocol/context.js.map +1 -0
- package/dist/scanners/protocol/hooks.d.ts +18 -0
- package/dist/scanners/protocol/hooks.d.ts.map +1 -0
- package/dist/scanners/protocol/hooks.js +12 -0
- package/dist/scanners/protocol/hooks.js.map +1 -0
- package/dist/scanners/protocol/index.d.ts +5 -0
- package/dist/scanners/protocol/index.d.ts.map +1 -0
- package/dist/scanners/protocol/index.js +2 -0
- package/dist/scanners/protocol/index.js.map +1 -0
- package/dist/scanners/protocol/scanner.d.ts +47 -0
- package/dist/scanners/protocol/scanner.d.ts.map +1 -0
- package/dist/scanners/protocol/scanner.js +2 -0
- package/dist/scanners/protocol/scanner.js.map +1 -0
- package/dist/scanners/providers/adapter.d.ts +23 -0
- package/dist/scanners/providers/adapter.d.ts.map +1 -0
- package/dist/scanners/providers/adapter.js +227 -0
- package/dist/scanners/providers/adapter.js.map +1 -0
- package/dist/scanners/providers/cache.d.ts +20 -0
- package/dist/scanners/providers/cache.d.ts.map +1 -0
- package/dist/scanners/providers/cache.js +61 -0
- package/dist/scanners/providers/cache.js.map +1 -0
- package/dist/scanners/providers/client.d.ts +53 -0
- package/dist/scanners/providers/client.d.ts.map +1 -0
- package/dist/scanners/providers/client.js +174 -0
- package/dist/scanners/providers/client.js.map +1 -0
- package/dist/scanners/providers/factory.d.ts +43 -0
- package/dist/scanners/providers/factory.d.ts.map +1 -0
- package/dist/scanners/providers/factory.js +192 -0
- package/dist/scanners/providers/factory.js.map +1 -0
- package/dist/scanners/providers/types.d.ts +61 -0
- package/dist/scanners/providers/types.d.ts.map +1 -0
- package/dist/scanners/providers/types.js +6 -0
- package/dist/scanners/providers/types.js.map +1 -0
- package/dist/scanners/runtime-module.d.ts +54 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -0
- package/dist/scanners/runtime-module.js +90 -0
- package/dist/scanners/runtime-module.js.map +1 -0
- package/dist/scanners/scanner-definition.d.ts +58 -0
- package/dist/scanners/scanner-definition.d.ts.map +1 -0
- package/dist/scanners/scanner-definition.js +19 -0
- package/dist/scanners/scanner-definition.js.map +1 -0
- package/dist/scanners/schema-utils.d.ts +6 -0
- package/dist/scanners/schema-utils.d.ts.map +1 -0
- package/dist/scanners/schema-utils.js +14 -0
- package/dist/scanners/schema-utils.js.map +1 -0
- package/dist/scanners/score-utils.d.ts +19 -0
- package/dist/scanners/score-utils.d.ts.map +1 -0
- package/dist/scanners/score-utils.js +47 -0
- package/dist/scanners/score-utils.js.map +1 -0
- package/dist/scanners/store/fs-utils.d.ts +12 -0
- package/dist/scanners/store/fs-utils.d.ts.map +1 -0
- package/dist/scanners/store/fs-utils.js +47 -0
- package/dist/scanners/store/fs-utils.js.map +1 -0
- package/dist/scanners/store/index.d.ts +5 -0
- package/dist/scanners/store/index.d.ts.map +1 -0
- package/dist/scanners/store/index.js +5 -0
- package/dist/scanners/store/index.js.map +1 -0
- package/dist/scanners/store/runtime-store.d.ts +50 -0
- package/dist/scanners/store/runtime-store.d.ts.map +1 -0
- package/dist/scanners/store/runtime-store.js +91 -0
- package/dist/scanners/store/runtime-store.js.map +1 -0
- package/dist/scanners/store/shared-artifact-store.d.ts +31 -0
- package/dist/scanners/store/shared-artifact-store.d.ts.map +1 -0
- package/dist/scanners/store/shared-artifact-store.js +89 -0
- package/dist/scanners/store/shared-artifact-store.js.map +1 -0
- package/dist/scanners/store/signal-store.d.ts +36 -0
- package/dist/scanners/store/signal-store.d.ts.map +1 -0
- package/dist/scanners/store/signal-store.js +135 -0
- package/dist/scanners/store/signal-store.js.map +1 -0
- package/dist/scanners/types.d.ts +115 -0
- package/dist/scanners/types.d.ts.map +1 -0
- package/dist/scanners/types.js +3 -0
- package/dist/scanners/types.js.map +1 -0
- package/dist/scripts/run-dsl-standalone-live.d.ts +27 -0
- package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
- package/dist/scripts/run-dsl-standalone-live.js +207 -0
- package/dist/scripts/run-dsl-standalone-live.js.map +1 -0
- package/dist/scripts/run-dsl-standalone-mock.d.ts +13 -0
- package/dist/scripts/run-dsl-standalone-mock.d.ts.map +1 -0
- package/dist/scripts/run-dsl-standalone-mock.js +255 -0
- package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
- package/dist/senpi/client.d.ts +77 -0
- package/dist/senpi/client.d.ts.map +1 -0
- package/dist/senpi/client.js +523 -0
- package/dist/senpi/client.js.map +1 -0
- package/dist/senpi/constants.d.ts +7 -0
- package/dist/senpi/constants.d.ts.map +1 -0
- package/dist/senpi/constants.js +7 -0
- package/dist/senpi/constants.js.map +1 -0
- package/dist/senpi/index.d.ts +3 -0
- package/dist/senpi/index.d.ts.map +1 -0
- package/dist/senpi/index.js +2 -0
- package/dist/senpi/index.js.map +1 -0
- package/dist/senpi/types.d.ts +132 -0
- package/dist/senpi/types.d.ts.map +1 -0
- package/dist/senpi/types.js +3 -0
- package/dist/senpi/types.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +3 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/paths.d.ts +8 -0
- package/dist/state/paths.d.ts.map +1 -0
- package/dist/state/paths.js +19 -0
- package/dist/state/paths.js.map +1 -0
- package/dist/state/state-manager.d.ts +58 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +221 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/strategy/strategy-state.d.ts +48 -0
- package/dist/strategy/strategy-state.d.ts.map +1 -0
- package/dist/strategy/strategy-state.js +185 -0
- package/dist/strategy/strategy-state.js.map +1 -0
- package/dist/types/action.d.ts +15 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +2 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/dsl/index.d.ts +215 -0
- package/dist/types/dsl/index.d.ts.map +1 -0
- package/dist/types/dsl/index.js +5 -0
- package/dist/types/dsl/index.js.map +1 -0
- package/dist/types/event-bus.d.ts +11 -0
- package/dist/types/event-bus.d.ts.map +1 -0
- package/dist/types/event-bus.js +6 -0
- package/dist/types/event-bus.js.map +1 -0
- package/dist/types/hooks.d.ts +27 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +15 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/notification.d.ts +4 -0
- package/dist/types/notification.d.ts.map +1 -0
- package/dist/types/notification.js +3 -0
- package/dist/types/notification.js.map +1 -0
- package/dist/types/runtime.d.ts +18 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/scanner.d.ts +59 -0
- package/dist/types/scanner.d.ts.map +1 -0
- package/dist/types/scanner.js +13 -0
- package/dist/types/scanner.js.map +1 -0
- package/dist/types/strategy.d.ts +100 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +2 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/utils/logger/dsl.d.ts +8 -0
- package/dist/utils/logger/dsl.d.ts.map +1 -0
- package/dist/utils/logger/dsl.js +7 -0
- package/dist/utils/logger/dsl.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +65 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/response.d.ts +14 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +44 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/examples/.env.example +15 -0
- package/examples/README.md +75 -0
- package/examples/scanners-consumer-quickstart.mjs +134 -0
- package/examples/scanners-emerging-movers-v4.mjs +285 -0
- package/examples/scanners-liquidation-watchdog.mjs +331 -0
- package/examples/scanners-live-mcp.mjs +208 -0
- package/examples/scanners-multi-strategy.mjs +165 -0
- package/examples/scanners-scheduled-events.mjs +95 -0
- package/examples/scanners-senpi-provider-client.mjs +182 -0
- package/examples/scanners-single-strategy.mjs +198 -0
- package/examples/strategies/README.md +45 -0
- package/examples/strategies/dsl-showcase.yaml +60 -0
- package/examples/strategies/fox-minimal-loosened.yaml +201 -0
- package/examples/strategies/fox-minimal.yaml +209 -0
- package/examples/strategies/minimal.yaml +49 -0
- package/examples/strategies/viper.yaml +64 -0
- package/examples/strategies/wolf.yaml +62 -0
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +116 -0
- package/openclaw.plugin.json +15 -0
- package/package.json +52 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export type { HookEventType, HookEvent, HookSystem } from '../types/hooks.js';
|
|
2
|
+
export type { NotificationService } from '../types/notification.js';
|
|
3
|
+
export type { StrategyConfig, } from '../types/strategy.js';
|
|
4
|
+
export type { StateManager, GateCheckResult, RiskGuard, } from '../types/action.js';
|
|
5
|
+
export type { Signal, ScanResult } from '../types/scanner.js';
|
|
6
|
+
export { ScanStatus } from '../types/scanner.js';
|
|
7
|
+
import type { Signal, ScanResult } from '../types/scanner.js';
|
|
8
|
+
/** Per-strategy slot counts for action payload. */
|
|
9
|
+
export interface StrategySlots {
|
|
10
|
+
total: number;
|
|
11
|
+
used: number;
|
|
12
|
+
available: number;
|
|
13
|
+
}
|
|
14
|
+
/** Action-specific enrichment wrapper around a scanner ScanResult. */
|
|
15
|
+
export interface ActionScanPayload {
|
|
16
|
+
scanResult: ScanResult;
|
|
17
|
+
/** Sorted signals (e.g. scanResult.signals) for actions to consider. */
|
|
18
|
+
topPicks?: Signal[];
|
|
19
|
+
/** Per-strategy total/used/available slots. Keys are addresses. */
|
|
20
|
+
strategySlots?: Record<string, StrategySlots>;
|
|
21
|
+
/** True when the emitting strategy (or any, if no address filter) has available slots. */
|
|
22
|
+
anySlotsAvailable?: boolean;
|
|
23
|
+
/** Sum of available slots (for emitting strategy when address set, else all). */
|
|
24
|
+
totalAvailableSlots?: number;
|
|
25
|
+
/** Number of scans in history (optional). */
|
|
26
|
+
scansInHistory?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface LlmDecisionRequest {
|
|
29
|
+
prompt: string;
|
|
30
|
+
context: Record<string, unknown>;
|
|
31
|
+
model?: string;
|
|
32
|
+
maxTokens?: number;
|
|
33
|
+
temperature?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface LlmDecisionResponse<T = unknown> {
|
|
36
|
+
decision: T;
|
|
37
|
+
rawResponse: string;
|
|
38
|
+
tokensUsed: number;
|
|
39
|
+
latencyMs: number;
|
|
40
|
+
}
|
|
41
|
+
export interface LlmDecision {
|
|
42
|
+
decide<T>(request: LlmDecisionRequest): Promise<LlmDecisionResponse<T>>;
|
|
43
|
+
}
|
|
44
|
+
import type { HookEvent, HookSystem } from '../types/hooks.js';
|
|
45
|
+
import type { NotificationService } from '../types/notification.js';
|
|
46
|
+
import type { StrategyConfig } from '../types/strategy.js';
|
|
47
|
+
import type { RuntimeContext } from '../types/runtime.js';
|
|
48
|
+
import type { RiskGuard, StateManager } from '../types/action.js';
|
|
49
|
+
import type { SenpiClient } from '../senpi/client.js';
|
|
50
|
+
import type { ContextBuilder } from '../context/types.js';
|
|
51
|
+
export type ActionType = 'OPEN_POSITION' | 'CLOSE_POSITION' | 'EMERGENCY_CLOSE_ALL' | string;
|
|
52
|
+
export type DecisionMode = 'llm' | 'script' | 'agent' | 'rule' | 'none';
|
|
53
|
+
export interface ActionConfig {
|
|
54
|
+
name: string;
|
|
55
|
+
action_type: ActionType;
|
|
56
|
+
decision_mode: DecisionMode;
|
|
57
|
+
decision_model?: string;
|
|
58
|
+
scanners?: string[];
|
|
59
|
+
min_confidence?: number;
|
|
60
|
+
context?: import('../context/types.js').ContextEntry[];
|
|
61
|
+
decision_prompt?: string;
|
|
62
|
+
params?: Record<string, unknown>;
|
|
63
|
+
}
|
|
64
|
+
export interface ActionContext {
|
|
65
|
+
senpi: SenpiClient;
|
|
66
|
+
stateManager: StateManager;
|
|
67
|
+
hookSystem: HookSystem;
|
|
68
|
+
llmDecision: LlmDecision;
|
|
69
|
+
contextBuilder: ContextBuilder;
|
|
70
|
+
riskGuard: RiskGuard;
|
|
71
|
+
notifications: NotificationService;
|
|
72
|
+
strategies: Map<string, StrategyConfig>;
|
|
73
|
+
playbook: {
|
|
74
|
+
tradingStrategyName: string;
|
|
75
|
+
version: string;
|
|
76
|
+
};
|
|
77
|
+
maxLeverageData: Record<string, number>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Base decision output from the decision layer.
|
|
81
|
+
* Enforced fields are common to ALL actions.
|
|
82
|
+
* Action-specific fields go in `payload` — each action defines its own shape.
|
|
83
|
+
*/
|
|
84
|
+
export interface ActionDecision {
|
|
85
|
+
execute: boolean;
|
|
86
|
+
actionType: ActionType;
|
|
87
|
+
confidence: number;
|
|
88
|
+
reasoning: string;
|
|
89
|
+
payload: Record<string, unknown>;
|
|
90
|
+
}
|
|
91
|
+
export interface ActionResult {
|
|
92
|
+
success: boolean;
|
|
93
|
+
action_type: ActionType;
|
|
94
|
+
summary: string;
|
|
95
|
+
data?: Record<string, unknown>;
|
|
96
|
+
skipped?: boolean;
|
|
97
|
+
skipReason?: string;
|
|
98
|
+
error?: string;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Core Action contract. Every action implementation must satisfy this.
|
|
102
|
+
*
|
|
103
|
+
* Actions are event-driven: instantiated once, receive events via handle(),
|
|
104
|
+
* return results. They do NOT subscribe themselves to events — the orchestrator
|
|
105
|
+
* (future) handles wiring.
|
|
106
|
+
*
|
|
107
|
+
* Lifecycle: create (factory) -> start() -> handle() [repeated] -> stop()
|
|
108
|
+
*/
|
|
109
|
+
export interface Action {
|
|
110
|
+
readonly name: string;
|
|
111
|
+
readonly actionType: ActionType;
|
|
112
|
+
handle(event: HookEvent): Promise<ActionResult>;
|
|
113
|
+
}
|
|
114
|
+
export type ActionFactory = (config: ActionConfig, context: RuntimeContext) => Action;
|
|
115
|
+
export interface ActionManifest {
|
|
116
|
+
type: string;
|
|
117
|
+
name: string;
|
|
118
|
+
description?: string;
|
|
119
|
+
eventsConsumed: string[];
|
|
120
|
+
eventsEmitted: string[];
|
|
121
|
+
configSchema?: Record<string, unknown>;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAgB/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* senpi guide subcommands — in-shell reference for @senpi/trading-recipe.
|
|
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
|
+
/** Minimal Commander command type — mirrors the interface in senpi-commands.ts */
|
|
13
|
+
interface CommanderCommand {
|
|
14
|
+
command(name: string, desc?: string): CommanderCommand;
|
|
15
|
+
description(desc: string): CommanderCommand;
|
|
16
|
+
option(flags: string, description?: string): CommanderCommand;
|
|
17
|
+
action(fn: (opts?: Record<string, unknown>) => void | Promise<void>): CommanderCommand;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register `senpi guide [subcommand]` on the senpi Commander subprogram.
|
|
21
|
+
* @param senpi - the `senpi` Commander command object
|
|
22
|
+
* @param version - plugin version string (from src/version.ts)
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerGuideCommands(senpi: CommanderCommand, version: string): void;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=guide-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgTH,kFAAkF;AAClF,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,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,IAAI,CA2CN"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* senpi guide subcommands — in-shell reference for @senpi/trading-recipe.
|
|
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-recipe 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 DSL exit: phases, lock modes, tiers, time-based cuts
|
|
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. Supports lock_mode (pctOfHighWater
|
|
145
|
+
or fixedRoe), Phase 1 fixed + trailing floor, Phase 2 tiers, and optional
|
|
146
|
+
Phase 1 time-based cuts (hard_timeout, weak_peak_cut, dead_weight_cut).
|
|
147
|
+
|
|
148
|
+
exit:
|
|
149
|
+
engine: dsl
|
|
150
|
+
interval_seconds: 30 # how often the price monitor runs
|
|
151
|
+
|
|
152
|
+
dsl_presets:
|
|
153
|
+
<preset_name>:
|
|
154
|
+
lock_mode: pctOfHighWater # or fixed_roe; YAML accepts snake_case
|
|
155
|
+
phase1: ...
|
|
156
|
+
phase2_trigger_tier: 0
|
|
157
|
+
phase2: ...
|
|
158
|
+
|
|
159
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
160
|
+
Phase 1 — Fixed floor + optional trailing
|
|
161
|
+
Active from entry until the tier at phase2_trigger_tier is crossed.
|
|
162
|
+
Floor = max(absolute_floor, trailing_floor). Absolute floor from max_loss_pct
|
|
163
|
+
(entry × (1 − max_loss_pct/100/leverage) for LONG). Trailing uses phase1
|
|
164
|
+
retraceThreshold (ROE %) so the floor can rise with high-water.
|
|
165
|
+
|
|
166
|
+
phase1:
|
|
167
|
+
max_loss_pct: 3.0 # e.g. 3% max loss at 1×
|
|
168
|
+
consecutive_breaches_required: 3 # ticks below floor before exit
|
|
169
|
+
# Optional time-based cuts (each: enabled, interval_in_minutes):
|
|
170
|
+
# hard_timeout, weak_peak_cut (min_value ROE %), dead_weight_cut
|
|
171
|
+
|
|
172
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
173
|
+
Phase 2 — Tiers + trailing floor (high-water retrace)
|
|
174
|
+
Starts when price reaches the tier at phase2_trigger_tier (0 = first tier).
|
|
175
|
+
Floor = max(tier_floor, trailing_floor). Retrace values are ROE %; the
|
|
176
|
+
engine divides by leverage for price (e.g. 1.5% ROE at 10× = 0.15% below HW).
|
|
177
|
+
|
|
178
|
+
phase2_trigger_tier: 0
|
|
179
|
+
|
|
180
|
+
phase2:
|
|
181
|
+
retrace_threshold: 1.5 # default ROE % retrace from HWM
|
|
182
|
+
consecutive_breaches_required: 1
|
|
183
|
+
|
|
184
|
+
tiers:
|
|
185
|
+
# trigger_pct = ROE % from entry that activates this tier
|
|
186
|
+
# lock_hw_pct = % of high-water ROE to lock (pctOfHighWater); floor trails every tick
|
|
187
|
+
# lock_pct = % of (entry→HW) range to lock (fixedRoe); floor fixed at tier trigger
|
|
188
|
+
# retrace = ROE % retrace for this tier (overrides retrace_threshold)
|
|
189
|
+
- { trigger_pct: 10, lock_hw_pct: 50 }
|
|
190
|
+
- { trigger_pct: 20, lock_hw_pct: 70 }
|
|
191
|
+
- { trigger_pct: 30, lock_hw_pct: 73, retrace: 1.2 }
|
|
192
|
+
- { trigger_pct: 50, lock_hw_pct: 80, retrace: 1.0 }
|
|
193
|
+
|
|
194
|
+
──────────────────────────────────────────────────────────────────────────────
|
|
195
|
+
State and events
|
|
196
|
+
Per-position state at {stateDir}/strategies/{id}/... . Close reason preserved
|
|
197
|
+
on pendingClose retry (phase1_timeout, weak_peak_cut, dead_weight_cut, dsl_breach).
|
|
198
|
+
Events: dsl.created, dsl.tier_advanced, dsl.sl_updated, dsl.phase_changed, position.closed
|
|
199
|
+
`.trim();
|
|
200
|
+
const SCHEMA_TEXT = `
|
|
201
|
+
YAML schema — top-level keys
|
|
202
|
+
─────────────────────────────────────────────────────────────────────────────
|
|
203
|
+
Key Type Req Description
|
|
204
|
+
name string Yes Strategy name
|
|
205
|
+
version string No Version identifier
|
|
206
|
+
description string No Human-readable description
|
|
207
|
+
strategies object Yes Keyed strategy configs (non-empty)
|
|
208
|
+
scanners array * Scanner definitions (* required when actions
|
|
209
|
+
have OPEN_POSITION or a scanners list)
|
|
210
|
+
actions array No Action definitions
|
|
211
|
+
exit object No Exit / DSL block
|
|
212
|
+
health object No Health check config
|
|
213
|
+
hooks array No Hook definitions
|
|
214
|
+
notifications object No e.g. telegram_chat_id
|
|
215
|
+
advanced object No Extra options
|
|
216
|
+
|
|
217
|
+
strategies.<name>
|
|
218
|
+
wallet string Yes Wallet address; supports \${VAR} substitution
|
|
219
|
+
budget number No Total budget
|
|
220
|
+
slots number No Max concurrent positions
|
|
221
|
+
margin_per_slot number No Margin per slot
|
|
222
|
+
trading_risk string No conservative | moderate | aggressive
|
|
223
|
+
enabled boolean No Default true
|
|
224
|
+
|
|
225
|
+
scanners[]
|
|
226
|
+
name string Yes Unique name referenced in actions.scanners
|
|
227
|
+
type string Yes emerging_movers | momentum | prescreener | oi_tracker
|
|
228
|
+
interval string Yes e.g. "30s", "2m", "1h"
|
|
229
|
+
blocked_assets array No
|
|
230
|
+
config object No Scanner-specific config (see: senpi guide scanners)
|
|
231
|
+
advanced object No
|
|
232
|
+
|
|
233
|
+
actions[]
|
|
234
|
+
name string Yes
|
|
235
|
+
action_type string Yes OPEN_POSITION
|
|
236
|
+
decision_mode string Yes llm | no_decision
|
|
237
|
+
decision_model string No Required when decision_mode: llm
|
|
238
|
+
scanners string[] No Scanner names this action listens to
|
|
239
|
+
min_confidence number No 0–10
|
|
240
|
+
context string[] No [signal]
|
|
241
|
+
decision_prompt string No Prompt template with {{signal}}
|
|
242
|
+
params object No
|
|
243
|
+
|
|
244
|
+
exit
|
|
245
|
+
engine string No dsl
|
|
246
|
+
interval_seconds number No Default 30 (min 5)
|
|
247
|
+
dsl_presets object No Presets keyed by name (preferred)
|
|
248
|
+
dsl object No Legacy alias for dsl_presets
|
|
249
|
+
|
|
250
|
+
Preset: lock_mode (pctOfHighWater | fixedRoe), phase1 (max_loss_pct,
|
|
251
|
+
consecutive_breaches_required, optional hard_timeout/weak_peak_cut/dead_weight_cut),
|
|
252
|
+
phase2_trigger_tier, phase2 (retrace_threshold ROE %, tiers with trigger_pct,
|
|
253
|
+
lock_hw_pct or lock_pct; tier retrace = ROE %). See: senpi guide dsl
|
|
254
|
+
|
|
255
|
+
Environment substitution: \${VAR} and \${VAR:-default} resolved at load time.
|
|
256
|
+
`.trim();
|
|
257
|
+
const MINIMAL_YAML = `
|
|
258
|
+
name: minimal
|
|
259
|
+
version: 1.0.0
|
|
260
|
+
description: Watch-only strategy — logs signals, opens no positions.
|
|
261
|
+
|
|
262
|
+
strategies:
|
|
263
|
+
watch-only:
|
|
264
|
+
wallet: "\${WALLET_ADDRESS}"
|
|
265
|
+
budget: "0"
|
|
266
|
+
slots: 1
|
|
267
|
+
margin_per_slot: 0
|
|
268
|
+
trading_risk: conservative
|
|
269
|
+
enabled: true
|
|
270
|
+
|
|
271
|
+
scanners:
|
|
272
|
+
- name: emerging_movers
|
|
273
|
+
type: emerging_movers
|
|
274
|
+
interval: 60s
|
|
275
|
+
config:
|
|
276
|
+
topN: 20
|
|
277
|
+
minRankJump: 5
|
|
278
|
+
minScansBeforeSignals: 2
|
|
279
|
+
|
|
280
|
+
actions:
|
|
281
|
+
- name: log_signals
|
|
282
|
+
action_type: OPEN_POSITION
|
|
283
|
+
decision_mode: no_decision
|
|
284
|
+
scanners: [emerging_movers]
|
|
285
|
+
min_confidence: 0
|
|
286
|
+
|
|
287
|
+
exit:
|
|
288
|
+
engine: dsl
|
|
289
|
+
interval_seconds: 60
|
|
290
|
+
dsl_presets:
|
|
291
|
+
default:
|
|
292
|
+
lock_mode: pctOfHighWater
|
|
293
|
+
phase1:
|
|
294
|
+
consecutive_breaches_required: 3
|
|
295
|
+
max_loss_pct: 5.0
|
|
296
|
+
phase2_trigger_tier: 0
|
|
297
|
+
phase2:
|
|
298
|
+
retrace_threshold: 1.5
|
|
299
|
+
consecutive_breaches_required: 1
|
|
300
|
+
tiers:
|
|
301
|
+
- { trigger_pct: 1, lock_hw_pct: 50 }
|
|
302
|
+
`.trim();
|
|
303
|
+
/**
|
|
304
|
+
* Register `senpi guide [subcommand]` on the senpi Commander subprogram.
|
|
305
|
+
* @param senpi - the `senpi` Commander command object
|
|
306
|
+
* @param version - plugin version string (from src/version.ts)
|
|
307
|
+
*/
|
|
308
|
+
export function registerGuideCommands(senpi, version) {
|
|
309
|
+
const guide = senpi.command("guide")
|
|
310
|
+
.description("In-shell reference for @senpi/trading-recipe");
|
|
311
|
+
guide.action(() => {
|
|
312
|
+
process.stdout.write(OVERVIEW_TEXT(version) + "\n");
|
|
313
|
+
});
|
|
314
|
+
guide.command("scanners")
|
|
315
|
+
.description("Scanner types and config fields")
|
|
316
|
+
.action(() => {
|
|
317
|
+
process.stdout.write(SCANNERS_TEXT + "\n");
|
|
318
|
+
});
|
|
319
|
+
guide.command("actions")
|
|
320
|
+
.description("Action types and decision modes")
|
|
321
|
+
.action(() => {
|
|
322
|
+
process.stdout.write(ACTIONS_TEXT + "\n");
|
|
323
|
+
});
|
|
324
|
+
guide.command("dsl")
|
|
325
|
+
.description("DSL exit engine: phases, lock modes, tiers, time-based cuts")
|
|
326
|
+
.action(() => {
|
|
327
|
+
process.stdout.write(DSL_TEXT + "\n");
|
|
328
|
+
});
|
|
329
|
+
guide.command("examples")
|
|
330
|
+
.description("Print minimal strategy YAML to stdout")
|
|
331
|
+
.action(() => {
|
|
332
|
+
process.stdout.write(MINIMAL_YAML + "\n");
|
|
333
|
+
});
|
|
334
|
+
guide.command("schema")
|
|
335
|
+
.description("Full YAML schema field reference")
|
|
336
|
+
.action(() => {
|
|
337
|
+
process.stdout.write(SCHEMA_TEXT + "\n");
|
|
338
|
+
});
|
|
339
|
+
guide.command("version")
|
|
340
|
+
.description("Plugin version and changelog URL")
|
|
341
|
+
.action(() => {
|
|
342
|
+
process.stdout.write(`@senpi/trading-recipe v${version}\n${CHANGELOG_URL}\n`);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
//# 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;yBAClB,OAAO;;;;;;;;;;;;;;;;CAgB/B,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CpB,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,8CAA8C,CAAC,CAAC;IAE/D,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,6DAA6D,CAAC;SAC1E,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,0BAA0B,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw CLI commands: openclaw senpi trading-strategy create | list | delete.
|
|
3
|
+
* Thin layer: all three invoke gateway RPCs only; validation and registry live in the gateway.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Register senpi subcommands on the given Commander program.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerSenpiCli(program: {
|
|
9
|
+
command: (name: string, desc?: string) => CommanderCommand | unknown;
|
|
10
|
+
}): void;
|
|
11
|
+
/** Minimal Commander command type for subcommands and options. */
|
|
12
|
+
interface CommanderCommand {
|
|
13
|
+
command(name: string, desc?: string): CommanderCommand;
|
|
14
|
+
description(desc: string): CommanderCommand;
|
|
15
|
+
option(flags: string, description?: string): CommanderCommand;
|
|
16
|
+
requiredOption(flags: string, description?: string): CommanderCommand;
|
|
17
|
+
action(fn: (opts: Record<string, unknown>) => void | Promise<void>): CommanderCommand;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# 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;AAQH;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAA;CAAE,GAChF,IAAI,CAgHN;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,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw CLI commands: openclaw senpi trading-strategy create | list | delete.
|
|
3
|
+
* Thin layer: all three invoke gateway RPCs only; validation and registry live in the gateway.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { registerGuideCommands } from "./guide-commands.js";
|
|
9
|
+
import { VERSION } from "../version.js";
|
|
10
|
+
/**
|
|
11
|
+
* Register senpi subcommands on the given Commander program.
|
|
12
|
+
*/
|
|
13
|
+
export function registerSenpiCli(program) {
|
|
14
|
+
const senpi = program.command("senpi");
|
|
15
|
+
senpi.description("Senpi trading recipe: trading-strategy create, list, delete");
|
|
16
|
+
const tradingStrategy = senpi.command("trading-strategy");
|
|
17
|
+
tradingStrategy.description("Manage trading strategies");
|
|
18
|
+
tradingStrategy
|
|
19
|
+
.command("create")
|
|
20
|
+
.description("Add a strategy from a YAML file or paste YAML; the gateway validates and runs it")
|
|
21
|
+
.option("-p, --path <path>", "Path to your strategy YAML file")
|
|
22
|
+
.option("-c, --content <content>", "Paste YAML content directly")
|
|
23
|
+
.option("--strategy-id <id>", "Name for this strategy (default: from file name or content)")
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
const hasPath = typeof opts.path === "string" && opts.path.length > 0;
|
|
26
|
+
const hasContent = typeof opts.content === "string";
|
|
27
|
+
if (hasPath && hasContent) {
|
|
28
|
+
console.error("Please provide either a file path (--path) or YAML content (--content), not both.\nExample: openclaw senpi trading-strategy create -p my-strategy.yaml");
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!hasPath && !hasContent) {
|
|
33
|
+
console.error("Please provide your strategy: either a path to a YAML file (--path) or the YAML content (--content).\nExample: openclaw senpi trading-strategy create -p my-strategy.yaml\nTo see a sample YAML: openclaw senpi guide examples");
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
let content;
|
|
38
|
+
if (hasPath) {
|
|
39
|
+
try {
|
|
40
|
+
content = readFileSync(path.resolve(process.cwd(), opts.path), "utf8");
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44
|
+
const isNotFound = msg.includes("ENOENT") || msg.includes("no such file");
|
|
45
|
+
if (isNotFound) {
|
|
46
|
+
console.error(`Could not find the file "${opts.path}". Please check the path is correct and the file exists.`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error(`Could not read the file. ${msg}`);
|
|
50
|
+
}
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
content = opts.content;
|
|
57
|
+
}
|
|
58
|
+
const params = {
|
|
59
|
+
tradingStrategyYamlContent: content,
|
|
60
|
+
...(typeof opts.strategyId === "string" && opts.strategyId.length > 0 ? { id: opts.strategyId } : {}),
|
|
61
|
+
};
|
|
62
|
+
const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.installStrategy", "--params", JSON.stringify(params)], {
|
|
63
|
+
stdio: "inherit",
|
|
64
|
+
cwd: process.cwd(),
|
|
65
|
+
});
|
|
66
|
+
process.exitCode = result.status ?? 1;
|
|
67
|
+
});
|
|
68
|
+
tradingStrategy
|
|
69
|
+
.command("delete <trading_strategy_id>")
|
|
70
|
+
.description("Remove a strategy (use the id from 'trading-strategy list')")
|
|
71
|
+
.action(async (tradingStrategyIdOrOpts) => {
|
|
72
|
+
const tradingStrategyId = typeof tradingStrategyIdOrOpts === "string" ? tradingStrategyIdOrOpts : "";
|
|
73
|
+
if (tradingStrategyId.length === 0) {
|
|
74
|
+
console.error("Please provide the strategy id (the name you used when creating it).\nExample: openclaw senpi trading-strategy delete my-strategy\nTo list installed strategies: openclaw senpi trading-strategy list");
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.deleteStrategy", "--params", JSON.stringify({ id: tradingStrategyId })], { stdio: "inherit", cwd: process.cwd() });
|
|
79
|
+
process.exitCode = result.status ?? 1;
|
|
80
|
+
});
|
|
81
|
+
tradingStrategy
|
|
82
|
+
.command("list")
|
|
83
|
+
.description("List all installed strategies with their id, source, and status (running/stopped)")
|
|
84
|
+
.action(async () => {
|
|
85
|
+
const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.listStrategies", "--json", "--params", "{}"], {
|
|
86
|
+
stdio: ["inherit", "pipe", "inherit"],
|
|
87
|
+
cwd: process.cwd(),
|
|
88
|
+
encoding: "utf8",
|
|
89
|
+
});
|
|
90
|
+
if (result.status !== 0) {
|
|
91
|
+
process.exitCode = result.status ?? 1;
|
|
92
|
+
console.error("\nTip: If the gateway is not running, start it with: openclaw gateway run");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let data;
|
|
96
|
+
try {
|
|
97
|
+
data = JSON.parse(result.stdout ?? "{}");
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
process.stdout.write(result.stdout ?? "");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const strategies = data.payload?.strategies ?? data.strategies ?? [];
|
|
104
|
+
if (strategies.length === 0) {
|
|
105
|
+
console.log("No strategies installed.");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
console.log("id\t\tsource\t\tstatus");
|
|
109
|
+
for (const s of strategies) {
|
|
110
|
+
console.log(`${s.id}\t\t${s.source ?? "(inline)"}\t\t${s.status ?? "—"}`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
registerGuideCommands(senpi, VERSION);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=senpi-commands.js.map
|