@senpi/runtime 1.0.95-dev.20260408174401
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 +155 -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 +220 -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 +278 -0
- package/dist/actions/open-position/open-position.action.js.map +1 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts +14 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -0
- package/dist/actions/position-tracker/position-tracker.action.js +201 -0
- package/dist/actions/position-tracker/position-tracker.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 +27 -0
- package/dist/cli/guide-commands.d.ts.map +1 -0
- package/dist/cli/guide-commands.js +481 -0
- package/dist/cli/guide-commands.js.map +1 -0
- package/dist/cli/senpi-cli-config.d.ts +33 -0
- package/dist/cli/senpi-cli-config.d.ts.map +1 -0
- package/dist/cli/senpi-cli-config.js +130 -0
- package/dist/cli/senpi-cli-config.js.map +1 -0
- package/dist/cli/senpi-commands.d.ts +21 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -0
- package/dist/cli/senpi-commands.js +471 -0
- package/dist/cli/senpi-commands.js.map +1 -0
- package/dist/cli/senpi-config-commands.d.ts +11 -0
- package/dist/cli/senpi-config-commands.d.ts.map +1 -0
- package/dist/cli/senpi-config-commands.js +113 -0
- package/dist/cli/senpi-config-commands.js.map +1 -0
- package/dist/constants/dsl/index.d.ts +62 -0
- package/dist/constants/dsl/index.d.ts.map +1 -0
- package/dist/constants/dsl/index.js +62 -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 +38 -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 +90 -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/scanner-context.provider.d.ts +10 -0
- package/dist/context/providers/scanner-context.provider.d.ts.map +1 -0
- package/dist/context/providers/scanner-context.provider.js +20 -0
- package/dist/context/providers/scanner-context.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 +30 -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 +71 -0
- package/dist/context/providers/strategy.provider.js.map +1 -0
- package/dist/context/types.d.ts +45 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +18 -0
- package/dist/context/types.js.map +1 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +591 -0
- package/dist/debug.js.map +1 -0
- package/dist/dsl/config/exit-block.d.ts +11 -0
- package/dist/dsl/config/exit-block.d.ts.map +1 -0
- package/dist/dsl/config/exit-block.js +5 -0
- package/dist/dsl/config/exit-block.js.map +1 -0
- package/dist/dsl/config/index.d.ts +8 -0
- package/dist/dsl/config/index.d.ts.map +1 -0
- package/dist/dsl/config/index.js +6 -0
- package/dist/dsl/config/index.js.map +1 -0
- package/dist/dsl/config/parse-phase.d.ts +14 -0
- package/dist/dsl/config/parse-phase.d.ts.map +1 -0
- package/dist/dsl/config/parse-phase.js +78 -0
- package/dist/dsl/config/parse-phase.js.map +1 -0
- package/dist/dsl/config/parse-plugin-config.d.ts +8 -0
- package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -0
- package/dist/dsl/config/parse-plugin-config.js +27 -0
- package/dist/dsl/config/parse-plugin-config.js.map +1 -0
- package/dist/dsl/config/parse-preset.d.ts +7 -0
- package/dist/dsl/config/parse-preset.d.ts.map +1 -0
- package/dist/dsl/config/parse-preset.js +99 -0
- package/dist/dsl/config/parse-preset.js.map +1 -0
- package/dist/dsl/config/parse-tiers.d.ts +7 -0
- package/dist/dsl/config/parse-tiers.d.ts.map +1 -0
- package/dist/dsl/config/parse-tiers.js +31 -0
- package/dist/dsl/config/parse-tiers.js.map +1 -0
- package/dist/dsl/config/parse-timeouts.d.ts +16 -0
- package/dist/dsl/config/parse-timeouts.d.ts.map +1 -0
- package/dist/dsl/config/parse-timeouts.js +75 -0
- package/dist/dsl/config/parse-timeouts.js.map +1 -0
- package/dist/dsl/config/raw-types.d.ts +45 -0
- package/dist/dsl/config/raw-types.d.ts.map +1 -0
- package/dist/dsl/config/raw-types.js +5 -0
- package/dist/dsl/config/raw-types.js.map +1 -0
- package/dist/dsl/config/unknown-keys.d.ts +7 -0
- package/dist/dsl/config/unknown-keys.d.ts.map +1 -0
- package/dist/dsl/config/unknown-keys.js +119 -0
- package/dist/dsl/config/unknown-keys.js.map +1 -0
- package/dist/dsl/config/validation.d.ts +21 -0
- package/dist/dsl/config/validation.d.ts.map +1 -0
- package/dist/dsl/config/validation.js +45 -0
- package/dist/dsl/config/validation.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/exchange-stop.d.ts +16 -0
- package/dist/dsl/engine/exchange-stop.d.ts.map +1 -0
- package/dist/dsl/engine/exchange-stop.js +20 -0
- package/dist/dsl/engine/exchange-stop.js.map +1 -0
- package/dist/dsl/engine/floors.d.ts +32 -0
- package/dist/dsl/engine/floors.d.ts.map +1 -0
- package/dist/dsl/engine/floors.js +115 -0
- package/dist/dsl/engine/floors.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 +7 -0
- package/dist/dsl/engine/index.js.map +1 -0
- package/dist/dsl/engine/round.d.ts +5 -0
- package/dist/dsl/engine/round.d.ts.map +1 -0
- package/dist/dsl/engine/round.js +9 -0
- package/dist/dsl/engine/round.js.map +1 -0
- package/dist/dsl/engine/state-updates.d.ts +8 -0
- package/dist/dsl/engine/state-updates.d.ts.map +1 -0
- package/dist/dsl/engine/state-updates.js +60 -0
- package/dist/dsl/engine/state-updates.js.map +1 -0
- package/dist/dsl/engine/tick.d.ts +6 -0
- package/dist/dsl/engine/tick.d.ts.map +1 -0
- package/dist/dsl/engine/tick.js +174 -0
- package/dist/dsl/engine/tick.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 +116 -0
- package/dist/dsl/events/guards.js.map +1 -0
- package/dist/dsl/events/handlers.d.ts +19 -0
- package/dist/dsl/events/handlers.d.ts.map +1 -0
- package/dist/dsl/events/handlers.js +387 -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/events/initial-state.d.ts +7 -0
- package/dist/dsl/events/initial-state.d.ts.map +1 -0
- package/dist/dsl/events/initial-state.js +96 -0
- package/dist/dsl/events/initial-state.js.map +1 -0
- package/dist/dsl/events/normalize-position-opened.d.ts +10 -0
- package/dist/dsl/events/normalize-position-opened.d.ts.map +1 -0
- package/dist/dsl/events/normalize-position-opened.js +13 -0
- package/dist/dsl/events/normalize-position-opened.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 +37 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/monitor/create-monitor.d.ts +24 -0
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -0
- package/dist/dsl/monitor/create-monitor.js +162 -0
- package/dist/dsl/monitor/create-monitor.js.map +1 -0
- package/dist/dsl/monitor/effective-dex.d.ts +7 -0
- package/dist/dsl/monitor/effective-dex.d.ts.map +1 -0
- package/dist/dsl/monitor/effective-dex.js +11 -0
- package/dist/dsl/monitor/effective-dex.js.map +1 -0
- package/dist/dsl/monitor/exchange-sync.d.ts +16 -0
- package/dist/dsl/monitor/exchange-sync.d.ts.map +1 -0
- package/dist/dsl/monitor/exchange-sync.js +37 -0
- package/dist/dsl/monitor/exchange-sync.js.map +1 -0
- package/dist/dsl/monitor/index.d.ts +6 -0
- package/dist/dsl/monitor/index.d.ts.map +1 -0
- package/dist/dsl/monitor/index.js +5 -0
- package/dist/dsl/monitor/index.js.map +1 -0
- package/dist/dsl/monitor/market-price.d.ts +5 -0
- package/dist/dsl/monitor/market-price.d.ts.map +1 -0
- package/dist/dsl/monitor/market-price.js +24 -0
- package/dist/dsl/monitor/market-price.js.map +1 -0
- package/dist/dsl/monitor/process-one-position.d.ts +19 -0
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -0
- package/dist/dsl/monitor/process-one-position.js +438 -0
- package/dist/dsl/monitor/process-one-position.js.map +1 -0
- package/dist/dsl/notifications/formatter.d.ts +18 -0
- package/dist/dsl/notifications/formatter.d.ts.map +1 -0
- package/dist/dsl/notifications/formatter.js +69 -0
- package/dist/dsl/notifications/formatter.js.map +1 -0
- package/dist/dsl/notifications/index.d.ts +19 -0
- package/dist/dsl/notifications/index.d.ts.map +1 -0
- package/dist/dsl/notifications/index.js +90 -0
- package/dist/dsl/notifications/index.js.map +1 -0
- package/dist/dsl/plugin/index.d.ts +66 -0
- package/dist/dsl/plugin/index.d.ts.map +1 -0
- package/dist/dsl/plugin/index.js +398 -0
- package/dist/dsl/plugin/index.js.map +1 -0
- package/dist/dsl/plugin/options.d.ts +40 -0
- package/dist/dsl/plugin/options.d.ts.map +1 -0
- package/dist/dsl/plugin/options.js +5 -0
- package/dist/dsl/plugin/options.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 +29 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +191 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/types.d.ts +114 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/health/types.js +2 -0
- package/dist/health/types.js.map +1 -0
- package/dist/index.d.ts +102 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +772 -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 +22 -0
- package/dist/runtime/action-registry.js.map +1 -0
- package/dist/runtime/auto-update/command-runner.d.ts +20 -0
- package/dist/runtime/auto-update/command-runner.d.ts.map +1 -0
- package/dist/runtime/auto-update/command-runner.js +54 -0
- package/dist/runtime/auto-update/command-runner.js.map +1 -0
- package/dist/runtime/auto-update/coordinator.d.ts +90 -0
- package/dist/runtime/auto-update/coordinator.d.ts.map +1 -0
- package/dist/runtime/auto-update/coordinator.js +336 -0
- package/dist/runtime/auto-update/coordinator.js.map +1 -0
- package/dist/runtime/auto-update/gateway-restart.d.ts +49 -0
- package/dist/runtime/auto-update/gateway-restart.d.ts.map +1 -0
- package/dist/runtime/auto-update/gateway-restart.js +105 -0
- package/dist/runtime/auto-update/gateway-restart.js.map +1 -0
- package/dist/runtime/auto-update/policy.d.ts +24 -0
- package/dist/runtime/auto-update/policy.d.ts.map +1 -0
- package/dist/runtime/auto-update/policy.js +42 -0
- package/dist/runtime/auto-update/policy.js.map +1 -0
- package/dist/runtime/auto-update/preflight.d.ts +16 -0
- package/dist/runtime/auto-update/preflight.d.ts.map +1 -0
- package/dist/runtime/auto-update/preflight.js +20 -0
- package/dist/runtime/auto-update/preflight.js.map +1 -0
- package/dist/runtime/auto-update/state-store.d.ts +29 -0
- package/dist/runtime/auto-update/state-store.d.ts.map +1 -0
- package/dist/runtime/auto-update/state-store.js +51 -0
- package/dist/runtime/auto-update/state-store.js.map +1 -0
- package/dist/runtime/auto-update/types.d.ts +105 -0
- package/dist/runtime/auto-update/types.d.ts.map +1 -0
- package/dist/runtime/auto-update/types.js +56 -0
- package/dist/runtime/auto-update/types.js.map +1 -0
- package/dist/runtime/auto-update/version-source.d.ts +23 -0
- package/dist/runtime/auto-update/version-source.d.ts.map +1 -0
- package/dist/runtime/auto-update/version-source.js +25 -0
- package/dist/runtime/auto-update/version-source.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 +36 -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 +22 -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 +70 -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 +35 -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 +31 -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-runtime-config.d.ts +23 -0
- package/dist/runtime/load-runtime-config.d.ts.map +1 -0
- package/dist/runtime/load-runtime-config.js +176 -0
- package/dist/runtime/load-runtime-config.js.map +1 -0
- package/dist/runtime/map-exit-config.d.ts +11 -0
- package/dist/runtime/map-exit-config.d.ts.map +1 -0
- package/dist/runtime/map-exit-config.js +86 -0
- package/dist/runtime/map-exit-config.js.map +1 -0
- package/dist/runtime/map-strategies-registration.d.ts +14 -0
- package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
- package/dist/runtime/map-strategies-registration.js +44 -0
- package/dist/runtime/map-strategies-registration.js.map +1 -0
- package/dist/runtime/map-strategies.d.ts +14 -0
- package/dist/runtime/map-strategies.d.ts.map +1 -0
- package/dist/runtime/map-strategies.js +64 -0
- package/dist/runtime/map-strategies.js.map +1 -0
- package/dist/runtime/notifications.d.ts +19 -0
- package/dist/runtime/notifications.d.ts.map +1 -0
- package/dist/runtime/notifications.js +88 -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/recipe-version.d.ts +3 -0
- package/dist/runtime/recipe-version.d.ts.map +1 -0
- package/dist/runtime/recipe-version.js +3 -0
- package/dist/runtime/recipe-version.js.map +1 -0
- package/dist/runtime/reconcile-state.d.ts +37 -0
- package/dist/runtime/reconcile-state.d.ts.map +1 -0
- package/dist/runtime/reconcile-state.js +179 -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 +30 -0
- package/dist/runtime/run.d.ts.map +1 -0
- package/dist/runtime/run.js +46 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/runtime-config.d.ts +6 -0
- package/dist/runtime/runtime-config.d.ts.map +1 -0
- package/dist/runtime/runtime-config.js +5 -0
- package/dist/runtime/runtime-config.js.map +1 -0
- package/dist/runtime/runtime-schema.d.ts +1859 -0
- package/dist/runtime/runtime-schema.d.ts.map +1 -0
- package/dist/runtime/runtime-schema.js +110 -0
- package/dist/runtime/runtime-schema.js.map +1 -0
- package/dist/runtime/runtime-version.d.ts +19 -0
- package/dist/runtime/runtime-version.d.ts.map +1 -0
- package/dist/runtime/runtime-version.js +29 -0
- package/dist/runtime/runtime-version.js.map +1 -0
- package/dist/runtime/runtime.d.ts +53 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +335 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scanner-composition.d.ts +23 -0
- package/dist/runtime/scanner-composition.d.ts.map +1 -0
- package/dist/runtime/scanner-composition.js +168 -0
- package/dist/runtime/scanner-composition.js.map +1 -0
- package/dist/runtime/scanner-registry.d.ts +28 -0
- package/dist/runtime/scanner-registry.d.ts.map +1 -0
- package/dist/runtime/scanner-registry.js +114 -0
- package/dist/runtime/scanner-registry.js.map +1 -0
- package/dist/runtime/state-layout.d.ts +50 -0
- package/dist/runtime/state-layout.d.ts.map +1 -0
- package/dist/runtime/state-layout.js +89 -0
- package/dist/runtime/state-layout.js.map +1 -0
- package/dist/runtime/strategy-registry.d.ts +79 -0
- package/dist/runtime/strategy-registry.d.ts.map +1 -0
- package/dist/runtime/strategy-registry.js +265 -0
- package/dist/runtime/strategy-registry.js.map +1 -0
- package/dist/runtime/validate-dsl-position-tracking.d.ts +3 -0
- package/dist/runtime/validate-dsl-position-tracking.d.ts.map +1 -0
- package/dist/runtime/validate-dsl-position-tracking.js +27 -0
- package/dist/runtime/validate-dsl-position-tracking.js.map +1 -0
- package/dist/scanners/__tests__/default-engine-test-composition.d.ts +9 -0
- package/dist/scanners/__tests__/default-engine-test-composition.d.ts.map +1 -0
- package/dist/scanners/__tests__/default-engine-test-composition.js +84 -0
- package/dist/scanners/__tests__/default-engine-test-composition.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/position-tracker-scenarios.d.ts +21 -0
- package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.d.ts.map +1 -0
- package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.js +199 -0
- package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.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 +131 -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/context-source-mapping.d.ts +4 -0
- package/dist/scanners/context-source-mapping.d.ts.map +1 -0
- package/dist/scanners/context-source-mapping.js +10 -0
- package/dist/scanners/context-source-mapping.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 +48 -0
- package/dist/scanners/engine/data-providers.d.ts.map +1 -0
- package/dist/scanners/engine/data-providers.js +28 -0
- package/dist/scanners/engine/data-providers.js.map +1 -0
- package/dist/scanners/engine/engine.d.ts +92 -0
- package/dist/scanners/engine/engine.d.ts.map +1 -0
- package/dist/scanners/engine/engine.js +478 -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 +33 -0
- package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
- package/dist/scanners/engine/input-resolver.js +216 -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 +48 -0
- package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
- package/dist/scanners/engine/strategy-registry.js +103 -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 +713 -0
- package/dist/scanners/implementations/emerging-movers.js.map +1 -0
- package/dist/scanners/implementations/index.d.ts +9 -0
- package/dist/scanners/implementations/index.d.ts.map +1 -0
- package/dist/scanners/implementations/index.js +9 -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 +66 -0
- package/dist/scanners/implementations/liquidation-watchdog.d.ts.map +1 -0
- package/dist/scanners/implementations/liquidation-watchdog.js +293 -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 +205 -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 +132 -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 +71 -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 +445 -0
- package/dist/scanners/implementations/opportunity.js.map +1 -0
- package/dist/scanners/implementations/position-tracker.d.ts +120 -0
- package/dist/scanners/implementations/position-tracker.d.ts.map +1 -0
- package/dist/scanners/implementations/position-tracker.js +360 -0
- package/dist/scanners/implementations/position-tracker.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 +101 -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 +205 -0
- package/dist/scanners/implementations/sm-flip.js.map +1 -0
- package/dist/scanners/index.d.ts +26 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +19 -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/prepare-scanner-inputs.d.ts +12 -0
- package/dist/scanners/prepare-scanner-inputs.d.ts.map +1 -0
- package/dist/scanners/prepare-scanner-inputs.js +21 -0
- package/dist/scanners/prepare-scanner-inputs.js.map +1 -0
- package/dist/scanners/protocol/context.d.ts +95 -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 +297 -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 +79 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -0
- package/dist/scanners/runtime-module.js +362 -0
- package/dist/scanners/runtime-module.js.map +1 -0
- package/dist/scanners/scanner-definition.d.ts +81 -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 +35 -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 +48 -0
- package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
- package/dist/scripts/run-dsl-standalone-live.js +531 -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 +264 -0
- package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
- package/dist/senpi/client.d.ts +99 -0
- package/dist/senpi/client.d.ts.map +1 -0
- package/dist/senpi/client.js +779 -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 +162 -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 +18 -0
- package/dist/state/paths.d.ts.map +1 -0
- package/dist/state/paths.js +51 -0
- package/dist/state/paths.js.map +1 -0
- package/dist/state/state-manager.d.ts +83 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +380 -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 +51 -0
- package/dist/strategy/strategy-state.d.ts.map +1 -0
- package/dist/strategy/strategy-state.js +218 -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 +286 -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 +13 -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 +30 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +18 -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 +106 -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/clearing-house-staleness.d.ts +47 -0
- package/dist/utils/clearing-house-staleness.d.ts.map +1 -0
- package/dist/utils/clearing-house-staleness.js +73 -0
- package/dist/utils/clearing-house-staleness.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 +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +97 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/perp-coin.d.ts +19 -0
- package/dist/utils/perp-coin.d.ts.map +1 -0
- package/dist/utils/perp-coin.js +40 -0
- package/dist/utils/perp-coin.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/utils/retry.d.ts +19 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +32 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +21 -0
- package/dist/version.js.map +1 -0
- package/examples/.env.example +25 -0
- package/examples/README.md +89 -0
- package/examples/scanners-consumer-quickstart.mjs +134 -0
- package/examples/scanners-emerging-movers-v4.mjs +287 -0
- package/examples/scanners-liquidation-watchdog.mjs +341 -0
- package/examples/scanners-live-mcp.mjs +208 -0
- package/examples/scanners-multi-strategy.mjs +165 -0
- package/examples/scanners-position-tracker-e2e.mjs +225 -0
- package/examples/scanners-scheduled-events.mjs +96 -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 +63 -0
- package/examples/strategies/dsl.yaml +47 -0
- package/examples/strategies/fox-minimal-loosened.yaml +225 -0
- package/examples/strategies/fox-minimal.yaml +220 -0
- package/examples/strategies/minimal.yaml +44 -0
- package/examples/strategies/viper.yaml +59 -0
- package/examples/strategies/wolf.yaml +64 -0
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +115 -0
- package/openclaw.plugin.json +67 -0
- package/package.json +53 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exit DSL validation: interval bounds and structured errors for primitive field checks.
|
|
3
|
+
*/
|
|
4
|
+
export type DslValidationIssueCode = "INVALID_INTERVAL_SECONDS" | "INVALID_PRESET_CONFIG" | "INVALID_MAX_LOSS_PCT" | "INVALID_RETRACE_THRESHOLD" | "INVALID_TRIGGER_PCT" | "INVALID_LOCK_HW_PCT" | "INVALID_BREACHES" | "INVALID_CONSECUTIVE_BREACHES" | "INVALID_PHASE2_TRIGGER_TIER" | "INVALID_TIME_CUT_INTERVAL" | "INVALID_WEAK_PEAK_MIN_VALUE" | "UNKNOWN_DSL_CONFIG_KEY" | "DSL_PRESET_SOURCE_CONFLICT" | "LEGACY_PRESET_FIELD" | "LEGACY_PHASE1_FIELD" | "LEGACY_PHASE2_FIELD" | "LEGACY_TIER_FIELD";
|
|
5
|
+
export interface DslValidationIssue {
|
|
6
|
+
code: DslValidationIssueCode;
|
|
7
|
+
message: string;
|
|
8
|
+
path: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class DslConfigValidationError extends Error {
|
|
11
|
+
readonly issues: DslValidationIssue[];
|
|
12
|
+
constructor(issues: DslValidationIssue[]);
|
|
13
|
+
toJSON(): {
|
|
14
|
+
issues: DslValidationIssue[];
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/** Build a single validation issue (for callers outside this module). */
|
|
18
|
+
export declare function dslValidationIssue(code: DslValidationIssueCode, message: string, path: string): DslValidationIssue;
|
|
19
|
+
/** interval_seconds: integer in [minSeconds, maxSeconds]. */
|
|
20
|
+
export declare function validateIntervalSeconds(intervalSeconds: number, minSeconds: number, maxSeconds: number): void;
|
|
21
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,sBAAsB,GAC9B,0BAA0B,GAC1B,uBAAuB,GACvB,sBAAsB,GACtB,2BAA2B,GAC3B,qBAAqB,GACrB,qBAAqB,GACrB,kBAAkB,GAClB,8BAA8B,GAC9B,6BAA6B,GAC7B,2BAA2B,GAC3B,6BAA6B,GAC7B,wBAAwB,GACxB,4BAA4B,GAC5B,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,CAAC;AAExB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAE1B,MAAM,EAAE,kBAAkB,EAAE;IAWxC,MAAM,IAAI;QAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;KAAE;CAG3C;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,sBAAsB,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,kBAAkB,CAEpB;AAgBD,6DAA6D;AAC7D,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAyBN"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exit DSL validation: interval bounds and structured errors for primitive field checks.
|
|
3
|
+
*/
|
|
4
|
+
export class DslConfigValidationError extends Error {
|
|
5
|
+
issues;
|
|
6
|
+
constructor(issues) {
|
|
7
|
+
const first = issues[0];
|
|
8
|
+
const summary = issues.length === 1 && first
|
|
9
|
+
? `${first.code}: ${first.message} (${first.path})`
|
|
10
|
+
: issues.map((i) => `${i.code}: ${i.message} (${i.path})`).join("; ");
|
|
11
|
+
super(summary);
|
|
12
|
+
this.name = "DslConfigValidationError";
|
|
13
|
+
this.issues = issues;
|
|
14
|
+
}
|
|
15
|
+
toJSON() {
|
|
16
|
+
return { issues: this.issues };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Build a single validation issue (for callers outside this module). */
|
|
20
|
+
export function dslValidationIssue(code, message, path) {
|
|
21
|
+
return { code, message, path };
|
|
22
|
+
}
|
|
23
|
+
function issue(code, message, path) {
|
|
24
|
+
return dslValidationIssue(code, message, path);
|
|
25
|
+
}
|
|
26
|
+
function throwIfIssues(issues) {
|
|
27
|
+
if (issues.length > 0) {
|
|
28
|
+
throw new DslConfigValidationError(issues);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** interval_seconds: integer in [minSeconds, maxSeconds]. */
|
|
32
|
+
export function validateIntervalSeconds(intervalSeconds, minSeconds, maxSeconds) {
|
|
33
|
+
const path = "exit.interval_seconds";
|
|
34
|
+
const issues = [];
|
|
35
|
+
if (typeof intervalSeconds !== "number" ||
|
|
36
|
+
!Number.isInteger(intervalSeconds) ||
|
|
37
|
+
intervalSeconds < minSeconds) {
|
|
38
|
+
issues.push(issue("INVALID_INTERVAL_SECONDS", `must be an integer >= ${minSeconds}`, path));
|
|
39
|
+
}
|
|
40
|
+
else if (intervalSeconds > maxSeconds) {
|
|
41
|
+
issues.push(issue("INVALID_INTERVAL_SECONDS", `must be <= ${maxSeconds}`, path));
|
|
42
|
+
}
|
|
43
|
+
throwIfIssues(issues);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/dsl/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2BH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,MAAM,CAAuB;IAEtC,YAAY,MAA4B;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK;YAC1B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG;YACnD,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAChC,IAA4B,EAC5B,OAAe,EACf,IAAY;IAEZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,KAAK,CACZ,IAA4B,EAC5B,OAAe,EACf,IAAY;IAEZ,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,MAA4B;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CACrC,eAAuB,EACvB,UAAkB,EAClB,UAAkB;IAElB,MAAM,IAAI,GAAG,uBAAuB,CAAC;IACrC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;QAClC,eAAe,GAAG,UAAU,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,0BAA0B,EAC1B,yBAAyB,UAAU,EAAE,EACrC,IAAI,CACL,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,eAAe,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CACT,KAAK,CACH,0BAA0B,EAC1B,cAAc,UAAU,EAAE,EAC1B,IAAI,CACL,CACF,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/constants/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/constants/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exchange stop-loss trigger price for editPosition (phase-dependent policy).
|
|
3
|
+
*/
|
|
4
|
+
import type { DslState } from "../../types/dsl/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Stop-loss trigger price sent to the exchange via `editPosition`.
|
|
7
|
+
*
|
|
8
|
+
* **Phase 1** (`phase === 1` and `phase1.enabled !== false`): exchange SL is **only** the
|
|
9
|
+
* `max_loss_pct` absolute floor. Tighter effective floors (retrace / tiers) are enforced via
|
|
10
|
+
* `closePosition` after consecutive breaches — not by moving the exchange stop to that level.
|
|
11
|
+
*
|
|
12
|
+
* **Phase 2** (and `phase1.enabled: false` from open): exchange SL tracks the tier lock floor.
|
|
13
|
+
* In phase 2, `floorPrice` and `tierFloorPrice` match (no separate HW-retrace floor component).
|
|
14
|
+
*/
|
|
15
|
+
export declare function exchangeStopLossTriggerPx(state: DslState): number;
|
|
16
|
+
//# sourceMappingURL=exchange-stop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange-stop.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/exchange-stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAKjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exchange stop-loss trigger price for editPosition (phase-dependent policy).
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Stop-loss trigger price sent to the exchange via `editPosition`.
|
|
6
|
+
*
|
|
7
|
+
* **Phase 1** (`phase === 1` and `phase1.enabled !== false`): exchange SL is **only** the
|
|
8
|
+
* `max_loss_pct` absolute floor. Tighter effective floors (retrace / tiers) are enforced via
|
|
9
|
+
* `closePosition` after consecutive breaches — not by moving the exchange stop to that level.
|
|
10
|
+
*
|
|
11
|
+
* **Phase 2** (and `phase1.enabled: false` from open): exchange SL tracks the tier lock floor.
|
|
12
|
+
* In phase 2, `floorPrice` and `tierFloorPrice` match (no separate HW-retrace floor component).
|
|
13
|
+
*/
|
|
14
|
+
export function exchangeStopLossTriggerPx(state) {
|
|
15
|
+
if (state.phase === 1 && state.phase1.enabled !== false) {
|
|
16
|
+
return state.phase1.absoluteFloor;
|
|
17
|
+
}
|
|
18
|
+
return state.floorPrice;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=exchange-stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange-stop.js","sourceRoot":"","sources":["../../../src/dsl/engine/exchange-stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAe;IACvD,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effective floor, tier floors, and ROE/price helpers for dslTick.
|
|
3
|
+
*/
|
|
4
|
+
import type { DslState } from "../../types/dsl/index.js";
|
|
5
|
+
/** ROE % at given price. */
|
|
6
|
+
export declare function computeCurrentROE(state: DslState, price: number): number;
|
|
7
|
+
/** Convert floor ROE % to price (LONG: entry*(1+roe/100/lev), SHORT: entry*(1-roe/100/lev)). */
|
|
8
|
+
export declare function roeToPriceFloor(state: DslState, floorRoe: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* Tier floor: % of current high-water ROE (`lock_hw_pct`).
|
|
11
|
+
*
|
|
12
|
+
* **Contract:** `tierIndex` must be an integer in `[0, tiers.length)`. Throws if not — this is
|
|
13
|
+
* intentional for callers that pass **freshly derived** indices (e.g. tier advance from
|
|
14
|
+
* `tierIndexFromPrice`). The **persisted** `state.currentTierIndex` path in `dslTick` validates
|
|
15
|
+
* (and resets) disk state *before* calling this function so stale config or corruption does not
|
|
16
|
+
* crash the monitor tick.
|
|
17
|
+
*/
|
|
18
|
+
export declare function computeTierFloor(state: DslState, tierIndex: number): number;
|
|
19
|
+
/** Phase 1 trailing floor: HW retrace (phase1.retraceThreshold as ROE % → price fraction). */
|
|
20
|
+
export declare function phase1TrailingFloor(state: DslState): number;
|
|
21
|
+
/** Phase 1 max-loss + trailing. When phase1 is disabled, only the absolute (max-loss) floor applies until tiers engage. */
|
|
22
|
+
export declare function phase1BaseFloor(state: DslState): number;
|
|
23
|
+
export declare function effectiveFloor(state: DslState): number;
|
|
24
|
+
export declare function isBreach(state: DslState, price: number): boolean;
|
|
25
|
+
/** Phase 1 only: consecutive breaches before exit (tier-level overrides removed in v2). */
|
|
26
|
+
export declare function resolveBreachesRequired(state: DslState): number;
|
|
27
|
+
/** Tier floor as ROE %; 0 when no tier. */
|
|
28
|
+
export declare function computeLockedProfitPct(state: DslState): number;
|
|
29
|
+
/** ROE % to next tier trigger; null at max tier. Clamped to 0 when already past trigger (same tick). */
|
|
30
|
+
export declare function computeDistanceToNextTierPct(state: DslState, currentROE: number): number | null;
|
|
31
|
+
export declare function tierIndexFromPrice(state: DslState, price: number): number;
|
|
32
|
+
//# sourceMappingURL=floors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floors.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/floors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAMzD,4BAA4B;AAC5B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxE;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAc3E;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAM3D;AAED,2HAA2H;AAC3H,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAOvD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAgBtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGhE;AAED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAE/D;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAM9D;AAED,wGAAwG;AACxG,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUzE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effective floor, tier floors, and ROE/price helpers for dslTick.
|
|
3
|
+
*/
|
|
4
|
+
import { createLogger } from "../../utils/logger.js";
|
|
5
|
+
import { roundTo } from "./round.js";
|
|
6
|
+
const log = createLogger("[senpi-core][dsl-floors]");
|
|
7
|
+
/** ROE % at given price. */
|
|
8
|
+
export function computeCurrentROE(state, price) {
|
|
9
|
+
return state.direction === "LONG"
|
|
10
|
+
? ((price - state.entryPrice) / state.entryPrice) * state.leverage * 100
|
|
11
|
+
: ((state.entryPrice - price) / state.entryPrice) * state.leverage * 100;
|
|
12
|
+
}
|
|
13
|
+
/** Convert floor ROE % to price (LONG: entry*(1+roe/100/lev), SHORT: entry*(1-roe/100/lev)). */
|
|
14
|
+
export function roeToPriceFloor(state, floorRoe) {
|
|
15
|
+
const pct = floorRoe / 100 / state.leverage;
|
|
16
|
+
if (state.direction === "LONG")
|
|
17
|
+
return roundTo(state.entryPrice * (1 + pct));
|
|
18
|
+
return roundTo(state.entryPrice * (1 - pct));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Tier floor: % of current high-water ROE (`lock_hw_pct`).
|
|
22
|
+
*
|
|
23
|
+
* **Contract:** `tierIndex` must be an integer in `[0, tiers.length)`. Throws if not — this is
|
|
24
|
+
* intentional for callers that pass **freshly derived** indices (e.g. tier advance from
|
|
25
|
+
* `tierIndexFromPrice`). The **persisted** `state.currentTierIndex` path in `dslTick` validates
|
|
26
|
+
* (and resets) disk state *before* calling this function so stale config or corruption does not
|
|
27
|
+
* crash the monitor tick.
|
|
28
|
+
*/
|
|
29
|
+
export function computeTierFloor(state, tierIndex) {
|
|
30
|
+
if (!Number.isInteger(tierIndex) || tierIndex < 0 || tierIndex >= state.tiers.length) {
|
|
31
|
+
const msg = `computeTierFloor: tier index out of bounds (tierIndex=${tierIndex}, tiersLength=${state.tiers.length}, asset=${state.asset})`;
|
|
32
|
+
log.error(msg);
|
|
33
|
+
throw new Error(msg);
|
|
34
|
+
}
|
|
35
|
+
const tier = state.tiers[tierIndex];
|
|
36
|
+
if (!tier) {
|
|
37
|
+
const msg = `computeTierFloor: missing tier at index ${tierIndex} (asset=${state.asset})`;
|
|
38
|
+
log.error(msg);
|
|
39
|
+
throw new Error(msg);
|
|
40
|
+
}
|
|
41
|
+
const floorRoe = state.highWaterRoe * (tier.lockHwPct / 100);
|
|
42
|
+
return roeToPriceFloor(state, floorRoe);
|
|
43
|
+
}
|
|
44
|
+
/** Phase 1 trailing floor: HW retrace (phase1.retraceThreshold as ROE % → price fraction). */
|
|
45
|
+
export function phase1TrailingFloor(state) {
|
|
46
|
+
const hw = state.highWaterPrice;
|
|
47
|
+
const retraceRoePct = state.phase1.retraceThreshold;
|
|
48
|
+
const retracePrice = retraceRoePct / 100 / state.leverage;
|
|
49
|
+
if (state.direction === "LONG")
|
|
50
|
+
return roundTo(hw * (1 - retracePrice));
|
|
51
|
+
return roundTo(hw * (1 + retracePrice));
|
|
52
|
+
}
|
|
53
|
+
/** Phase 1 max-loss + trailing. When phase1 is disabled, only the absolute (max-loss) floor applies until tiers engage. */
|
|
54
|
+
export function phase1BaseFloor(state) {
|
|
55
|
+
if (state.phase1.enabled === false) {
|
|
56
|
+
return state.phase1.absoluteFloor;
|
|
57
|
+
}
|
|
58
|
+
const absFloor = state.phase1.absoluteFloor;
|
|
59
|
+
const trailing = phase1TrailingFloor(state);
|
|
60
|
+
return state.direction === "LONG" ? Math.max(absFloor, trailing) : Math.min(absFloor, trailing);
|
|
61
|
+
}
|
|
62
|
+
export function effectiveFloor(state) {
|
|
63
|
+
if (state.phase === 2) {
|
|
64
|
+
if (state.currentTierIndex == null) {
|
|
65
|
+
return state.phase1.absoluteFloor;
|
|
66
|
+
}
|
|
67
|
+
return state.tierFloorPrice;
|
|
68
|
+
}
|
|
69
|
+
const tierIdx = state.currentTierIndex;
|
|
70
|
+
if (tierIdx == null) {
|
|
71
|
+
return phase1BaseFloor(state);
|
|
72
|
+
}
|
|
73
|
+
const base = phase1BaseFloor(state);
|
|
74
|
+
const fromTier = state.tierFloorPrice;
|
|
75
|
+
return state.direction === "LONG" ? Math.max(base, fromTier) : Math.min(base, fromTier);
|
|
76
|
+
}
|
|
77
|
+
export function isBreach(state, price) {
|
|
78
|
+
if (state.direction === "LONG")
|
|
79
|
+
return price <= state.floorPrice;
|
|
80
|
+
return price >= state.floorPrice;
|
|
81
|
+
}
|
|
82
|
+
/** Phase 1 only: consecutive breaches before exit (tier-level overrides removed in v2). */
|
|
83
|
+
export function resolveBreachesRequired(state) {
|
|
84
|
+
return state.phase1.consecutiveBreachesRequired;
|
|
85
|
+
}
|
|
86
|
+
/** Tier floor as ROE %; 0 when no tier. */
|
|
87
|
+
export function computeLockedProfitPct(state) {
|
|
88
|
+
if (state.currentTierIndex == null)
|
|
89
|
+
return 0;
|
|
90
|
+
const floorPrice = state.tierFloorPrice;
|
|
91
|
+
return state.direction === "LONG"
|
|
92
|
+
? ((floorPrice - state.entryPrice) / state.entryPrice) * state.leverage * 100
|
|
93
|
+
: ((state.entryPrice - floorPrice) / state.entryPrice) * state.leverage * 100;
|
|
94
|
+
}
|
|
95
|
+
/** ROE % to next tier trigger; null at max tier. Clamped to 0 when already past trigger (same tick). */
|
|
96
|
+
export function computeDistanceToNextTierPct(state, currentROE) {
|
|
97
|
+
const idx = state.currentTierIndex ?? -1;
|
|
98
|
+
const nextIdx = idx + 1;
|
|
99
|
+
if (nextIdx >= state.tiers.length)
|
|
100
|
+
return null;
|
|
101
|
+
const nextTier = state.tiers[nextIdx];
|
|
102
|
+
return Math.max(0, nextTier.triggerPct - currentROE);
|
|
103
|
+
}
|
|
104
|
+
export function tierIndexFromPrice(state, price) {
|
|
105
|
+
const movePct = state.direction === "LONG"
|
|
106
|
+
? ((price - state.entryPrice) / state.entryPrice) * state.leverage * 100
|
|
107
|
+
: ((state.entryPrice - price) / state.entryPrice) * state.leverage * 100;
|
|
108
|
+
let idx = -1;
|
|
109
|
+
for (let i = 0; i < state.tiers.length; i++) {
|
|
110
|
+
if (movePct >= state.tiers[i].triggerPct)
|
|
111
|
+
idx = i;
|
|
112
|
+
}
|
|
113
|
+
return idx;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=floors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floors.js","sourceRoot":"","sources":["../../../src/dsl/engine/floors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/round.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAuB,GAAG,MAAM,CAGhF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Price rounding for DSL price levels.
|
|
3
|
+
*/
|
|
4
|
+
import { PRICE_DECIMALS } from "../../constants/dsl/index.js";
|
|
5
|
+
export function roundTo(value, decimals = PRICE_DECIMALS) {
|
|
6
|
+
const f = 10 ** decimals;
|
|
7
|
+
return Math.round(value * f) / f;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=round.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../../src/dsl/engine/round.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,WAAmB,cAAc;IACtE,MAAM,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-water and derived telemetry fields on DslState each tick.
|
|
3
|
+
*/
|
|
4
|
+
import type { DslState } from "../../types/dsl/index.js";
|
|
5
|
+
export declare function updateHighWater(state: DslState, price: number, now: string): DslState;
|
|
6
|
+
/** Write all tick-updated derived fields onto state. Call after floor/tier/phase are final. */
|
|
7
|
+
export declare function writeDerivedFields(next: DslState, price: number, now: string): DslState;
|
|
8
|
+
//# sourceMappingURL=state-updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-updates.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/state-updates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AASzD,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAiBrF;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAwCvF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-water and derived telemetry fields on DslState each tick.
|
|
3
|
+
*/
|
|
4
|
+
import { computeCurrentROE, computeDistanceToNextTierPct, computeLockedProfitPct, phase1BaseFloor, resolveBreachesRequired, } from "./floors.js";
|
|
5
|
+
export function updateHighWater(state, price, now) {
|
|
6
|
+
let hw = state.highWaterPrice;
|
|
7
|
+
if (state.direction === "LONG" && price > hw)
|
|
8
|
+
hw = price;
|
|
9
|
+
if (state.direction === "SHORT" && price < hw)
|
|
10
|
+
hw = price;
|
|
11
|
+
const highWaterRoe = state.direction === "LONG"
|
|
12
|
+
? ((hw - state.entryPrice) / state.entryPrice) * state.leverage * 100
|
|
13
|
+
: ((state.entryPrice - hw) / state.entryPrice) * state.leverage * 100;
|
|
14
|
+
return {
|
|
15
|
+
...state,
|
|
16
|
+
highWaterPrice: hw,
|
|
17
|
+
hwTimestamp: hw !== state.highWaterPrice ? now : state.hwTimestamp,
|
|
18
|
+
lastCheck: now,
|
|
19
|
+
lastPrice: price,
|
|
20
|
+
peakROE: Math.max(state.peakROE, highWaterRoe),
|
|
21
|
+
highWaterRoe,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Write all tick-updated derived fields onto state. Call after floor/tier/phase are final. */
|
|
25
|
+
export function writeDerivedFields(next, price, now) {
|
|
26
|
+
const hw = next.highWaterPrice;
|
|
27
|
+
const floor = next.floorPrice;
|
|
28
|
+
const direction = next.direction;
|
|
29
|
+
const currentROE = computeCurrentROE(next, price);
|
|
30
|
+
const trailingFloor = next.phase === 1 ? phase1BaseFloor(next) : next.currentTierIndex != null ? next.tierFloorPrice : 0;
|
|
31
|
+
const distanceToFloor = direction === "LONG" ? price - floor : floor - price;
|
|
32
|
+
const denom = Math.abs(floor) > 1e-12
|
|
33
|
+
? Math.abs(floor)
|
|
34
|
+
: Math.abs(next.entryPrice) > 1e-12
|
|
35
|
+
? Math.abs(next.entryPrice)
|
|
36
|
+
: 1;
|
|
37
|
+
const distancePct = (distanceToFloor / denom) * 100;
|
|
38
|
+
const retracePct = hw > 0
|
|
39
|
+
? direction === "LONG"
|
|
40
|
+
? ((hw - price) / hw) * 100
|
|
41
|
+
: ((price - hw) / hw) * 100
|
|
42
|
+
: 0;
|
|
43
|
+
const elapsedMinutes = (new Date(now).getTime() - new Date(next.createdAt).getTime()) / 60_000;
|
|
44
|
+
const breachesRequired = resolveBreachesRequired(next);
|
|
45
|
+
const lockedProfitPct = next.currentTierIndex != null ? Math.max(0, computeLockedProfitPct(next)) : 0;
|
|
46
|
+
const distanceToNextTierPct = computeDistanceToNextTierPct(next, currentROE);
|
|
47
|
+
return {
|
|
48
|
+
...next,
|
|
49
|
+
currentROE,
|
|
50
|
+
trailingFloor,
|
|
51
|
+
distanceToFloor,
|
|
52
|
+
distancePct,
|
|
53
|
+
retracePct,
|
|
54
|
+
elapsedMinutes,
|
|
55
|
+
breachesRequired,
|
|
56
|
+
lockedProfitPct,
|
|
57
|
+
distanceToNextTierPct,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=state-updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-updates.js","sourceRoot":"","sources":["../../../src/dsl/engine/state-updates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure DSL tick: state + price → next state and actions.
|
|
3
|
+
*/
|
|
4
|
+
import type { DslState, DslTickResult } from "../../types/dsl/index.js";
|
|
5
|
+
export declare function dslTick(state: DslState, price: number, now: string): DslTickResult;
|
|
6
|
+
//# sourceMappingURL=tick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/tick.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAexE,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAwLlF"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure DSL tick: state + price → next state and actions.
|
|
3
|
+
*/
|
|
4
|
+
import { CLOSE_REASON } from "../../constants/dsl/index.js";
|
|
5
|
+
import { computeCurrentROE, computeTierFloor, effectiveFloor, isBreach, resolveBreachesRequired, tierIndexFromPrice, } from "./floors.js";
|
|
6
|
+
import { updateHighWater, writeDerivedFields } from "./state-updates.js";
|
|
7
|
+
import { createLogger } from "../../utils/logger.js";
|
|
8
|
+
const log = createLogger("[senpi-core][dsl-tick]");
|
|
9
|
+
export function dslTick(state, price, now) {
|
|
10
|
+
const prevFloorPrice = state.floorPrice;
|
|
11
|
+
let next = updateHighWater(state, price, now);
|
|
12
|
+
const currentROEAfterHw = computeCurrentROE(next, price);
|
|
13
|
+
if (next.weakPeakCut?.enabled && currentROEAfterHw >= next.weakPeakCut.minValue) {
|
|
14
|
+
next = { ...next, weakPeakCutStartedAt: now };
|
|
15
|
+
}
|
|
16
|
+
// Dead-weight: stagnation clock is time since we last saw **positive** mark-to-entry ROE on a tick.
|
|
17
|
+
// Resets every tick while currentROE > 0 so a dip into negative does not use a stale timer from
|
|
18
|
+
// before the last positive print (and HW timestamp alone is unreliable vs deadWeightCutStartedAt).
|
|
19
|
+
if (next.deadWeightCut?.enabled && currentROEAfterHw > 0) {
|
|
20
|
+
next = { ...next, deadWeightCutStartedAt: now };
|
|
21
|
+
}
|
|
22
|
+
const direction = next.direction;
|
|
23
|
+
let floor = effectiveFloor(next);
|
|
24
|
+
let action = "none";
|
|
25
|
+
let closeReason;
|
|
26
|
+
const newTierIndexForBreach = tierIndexFromPrice(next, price);
|
|
27
|
+
const prevTierIndexForBreach = next.currentTierIndex ?? -1;
|
|
28
|
+
if (next.phase === 1) {
|
|
29
|
+
if (isBreach(next, price)) {
|
|
30
|
+
const breachesRequired = resolveBreachesRequired(next);
|
|
31
|
+
const newCount = (next.currentBreachCount ?? 0) + 1;
|
|
32
|
+
next = { ...next, currentBreachCount: newCount };
|
|
33
|
+
if (newCount >= breachesRequired) {
|
|
34
|
+
action = "close";
|
|
35
|
+
closeReason = CLOSE_REASON.DSL_BREACH;
|
|
36
|
+
next = { ...next, floorPrice: prevFloorPrice };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const advancingTier = newTierIndexForBreach > prevTierIndexForBreach;
|
|
41
|
+
if (!advancingTier)
|
|
42
|
+
next = { ...next, currentBreachCount: 0 };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (action === "none") {
|
|
46
|
+
const currentROE = computeCurrentROE(next, price);
|
|
47
|
+
if (next.hardTimeout?.enabled && next.phase === 1) {
|
|
48
|
+
// Never hard-timeout once in phase 2. Skip on the same tick we cross into phase 2 via the
|
|
49
|
+
// first tier so a boundary hit does not lose to the clock before tier advance runs.
|
|
50
|
+
const wouldEnterPhase2ThisTick = next.phase2.enabled !== false &&
|
|
51
|
+
newTierIndexForBreach > (next.currentTierIndex ?? -1);
|
|
52
|
+
if (!wouldEnterPhase2ThisTick) {
|
|
53
|
+
const elapsed = (new Date(now).getTime() - new Date(next.hardTimeoutStartedAt).getTime()) / 60_000;
|
|
54
|
+
if (elapsed >= next.hardTimeout.intervalInMinutes) {
|
|
55
|
+
action = "close";
|
|
56
|
+
closeReason = CLOSE_REASON.HARD_TIMEOUT;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (action === "none" && next.deadWeightCut?.enabled) {
|
|
61
|
+
const elapsed = (new Date(now).getTime() - new Date(next.deadWeightCutStartedAt).getTime()) / 60_000;
|
|
62
|
+
if (elapsed >= next.deadWeightCut.intervalInMinutes && currentROE <= 0) {
|
|
63
|
+
action = "close";
|
|
64
|
+
closeReason = CLOSE_REASON.DEAD_WEIGHT_CUT;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (action === "none" && next.weakPeakCut?.enabled) {
|
|
68
|
+
const elapsed = (new Date(now).getTime() - new Date(next.weakPeakCutStartedAt).getTime()) / 60_000;
|
|
69
|
+
const everPositive = direction === "LONG"
|
|
70
|
+
? next.highWaterPrice > next.entryPrice
|
|
71
|
+
: next.highWaterPrice < next.entryPrice;
|
|
72
|
+
const minVal = next.weakPeakCut.minValue;
|
|
73
|
+
if (elapsed >= next.weakPeakCut.intervalInMinutes &&
|
|
74
|
+
everPositive &&
|
|
75
|
+
next.peakROE < minVal &&
|
|
76
|
+
currentROE < next.peakROE) {
|
|
77
|
+
action = "close";
|
|
78
|
+
closeReason = CLOSE_REASON.WEAK_PEAK_CUT;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (action === "close") {
|
|
83
|
+
next = writeDerivedFields(next, price, now);
|
|
84
|
+
next = { ...next, closeReason: closeReason ?? null };
|
|
85
|
+
const floorChanged = next.floorPrice !== prevFloorPrice;
|
|
86
|
+
return {
|
|
87
|
+
tierChanged: false,
|
|
88
|
+
phaseChanged: false,
|
|
89
|
+
action: "close",
|
|
90
|
+
newFloorPrice: undefined,
|
|
91
|
+
newTierIndex: undefined,
|
|
92
|
+
newPhase: undefined,
|
|
93
|
+
state: next,
|
|
94
|
+
floorChanged,
|
|
95
|
+
closeReason,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const newTierIndex = newTierIndexForBreach;
|
|
99
|
+
const prevTierIndex = next.currentTierIndex;
|
|
100
|
+
let tierChanged = false;
|
|
101
|
+
let phaseChanged = false;
|
|
102
|
+
let newFloorPrice = floor;
|
|
103
|
+
let newPhase = next.phase;
|
|
104
|
+
if (newTierIndex > (prevTierIndex ?? -1)) {
|
|
105
|
+
tierChanged = true;
|
|
106
|
+
const tierFloor = computeTierFloor(next, newTierIndex);
|
|
107
|
+
const effFloor = effectiveFloor(next);
|
|
108
|
+
const floorPrice = next.direction === "LONG"
|
|
109
|
+
? Math.max(effFloor, tierFloor)
|
|
110
|
+
: Math.min(effFloor, tierFloor);
|
|
111
|
+
next = {
|
|
112
|
+
...next,
|
|
113
|
+
currentTierIndex: newTierIndex,
|
|
114
|
+
tierFloorPrice: tierFloor,
|
|
115
|
+
floorPrice,
|
|
116
|
+
tierSince: now,
|
|
117
|
+
};
|
|
118
|
+
newFloorPrice = next.floorPrice;
|
|
119
|
+
if (next.phase === 1 && next.phase2.enabled !== false) {
|
|
120
|
+
phaseChanged = true;
|
|
121
|
+
newPhase = 2;
|
|
122
|
+
next = {
|
|
123
|
+
...next,
|
|
124
|
+
phase: 2,
|
|
125
|
+
phaseSince: now,
|
|
126
|
+
currentBreachCount: 0,
|
|
127
|
+
floorPrice: next.tierFloorPrice,
|
|
128
|
+
};
|
|
129
|
+
newFloorPrice = next.floorPrice;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (next.currentTierIndex != null && next.currentTierIndex >= 0) {
|
|
133
|
+
const persistedIdx = next.currentTierIndex;
|
|
134
|
+
if (!Number.isInteger(persistedIdx) || persistedIdx >= next.tiers.length) {
|
|
135
|
+
log.error("dslTick: currentTierIndex invalid or out of bounds, resetting to null", {
|
|
136
|
+
asset: next.asset,
|
|
137
|
+
currentTierIndex: next.currentTierIndex,
|
|
138
|
+
tiersLength: next.tiers.length,
|
|
139
|
+
});
|
|
140
|
+
next = { ...next, currentTierIndex: null, tierFloorPrice: 0, tierSince: null };
|
|
141
|
+
floor = effectiveFloor(next);
|
|
142
|
+
next = { ...next, floorPrice: floor };
|
|
143
|
+
newFloorPrice = floor;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const newTierFloor = computeTierFloor(next, next.currentTierIndex);
|
|
147
|
+
const ratcheted = next.tierFloorPrice === 0
|
|
148
|
+
? newTierFloor
|
|
149
|
+
: next.direction === "LONG"
|
|
150
|
+
? Math.max(newTierFloor, next.tierFloorPrice)
|
|
151
|
+
: Math.min(newTierFloor, next.tierFloorPrice);
|
|
152
|
+
next = { ...next, tierFloorPrice: ratcheted };
|
|
153
|
+
floor = effectiveFloor(next);
|
|
154
|
+
next = { ...next, floorPrice: floor };
|
|
155
|
+
newFloorPrice = floor;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (!tierChanged && !phaseChanged) {
|
|
159
|
+
next = { ...next, floorPrice: floor };
|
|
160
|
+
}
|
|
161
|
+
next = writeDerivedFields(next, price, now);
|
|
162
|
+
const floorChanged = next.floorPrice !== prevFloorPrice;
|
|
163
|
+
return {
|
|
164
|
+
tierChanged,
|
|
165
|
+
phaseChanged,
|
|
166
|
+
action: "none",
|
|
167
|
+
newFloorPrice: tierChanged || phaseChanged ? newFloorPrice : undefined,
|
|
168
|
+
newTierIndex: tierChanged ? newTierIndex : undefined,
|
|
169
|
+
newPhase: phaseChanged ? newPhase : undefined,
|
|
170
|
+
state: next,
|
|
171
|
+
floorChanged: floorChanged || tierChanged || phaseChanged,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=tick.js.map
|