dexbot 1.1.10
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/LICENSE +21 -0
- package/README.md +287 -0
- package/claw/README.md +513 -0
- package/claw/scripts/memu_runner.py +385 -0
- package/claw/skills/bitshares-guide/SKILL.md +14 -0
- package/claw/skills/bitshares-guide/references/example-skill-shells.md +18 -0
- package/claw/skills/bitshares-guide/references/presentation-patterns.md +19 -0
- package/claw/skills/bitshares-guide/references/scope-guardrails.md +9 -0
- package/claw/skills/launcher-ops/SKILL.md +18 -0
- package/claw/skills/launcher-ops/references/launcher-workflow.md +23 -0
- package/claw/skills/margin-trading/SKILL.md +23 -0
- package/claw/skills/margin-trading/references/honest-asset-list.md +74 -0
- package/claw/skills/margin-trading/references/honest-assets.md +44 -0
- package/claw/skills/margin-trading/references/position-management.md +203 -0
- package/claw/skills/margin-trading/references/trading-concepts.md +80 -0
- package/claw/skills/memu-memory/SKILL.md +218 -0
- package/claw/skills/shared/references/js-automation-overview.md +24 -0
- package/claw/skills/shared/references/safety-and-staleness.md +11 -0
- package/claw/skills/shared/references/skill-boundaries.md +17 -0
- package/claw/skills/trend-detection/SKILL.md +33 -0
- package/claw/skills/trend-detection/agents/openai.yaml +3 -0
- package/claw/skills/trend-detection/references/service.md +45 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts +3 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +149 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts +3 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +387 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts +3 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js +200 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts +3 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js +212 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +31 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +249 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts +2 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js +782 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -0
- package/dist/analysis/analyze_derivatives.d.ts +95 -0
- package/dist/analysis/analyze_derivatives.d.ts.map +1 -0
- package/dist/analysis/analyze_derivatives.js +295 -0
- package/dist/analysis/analyze_derivatives.js.map +1 -0
- package/dist/analysis/analyze_dynamic_weight.d.ts +14 -0
- package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -0
- package/dist/analysis/analyze_dynamic_weight.js +208 -0
- package/dist/analysis/analyze_dynamic_weight.js.map +1 -0
- package/dist/analysis/analyze_kalman.d.ts +13 -0
- package/dist/analysis/analyze_kalman.d.ts.map +1 -0
- package/dist/analysis/analyze_kalman.js +123 -0
- package/dist/analysis/analyze_kalman.js.map +1 -0
- package/dist/analysis/analyze_regime.d.ts +20 -0
- package/dist/analysis/analyze_regime.d.ts.map +1 -0
- package/dist/analysis/analyze_regime.js +139 -0
- package/dist/analysis/analyze_regime.js.map +1 -0
- package/dist/analysis/analyze_regime_windows.d.ts +19 -0
- package/dist/analysis/analyze_regime_windows.d.ts.map +1 -0
- package/dist/analysis/analyze_regime_windows.js +413 -0
- package/dist/analysis/analyze_regime_windows.js.map +1 -0
- package/dist/analysis/analyze_risk_profile.d.ts +3 -0
- package/dist/analysis/analyze_risk_profile.d.ts.map +1 -0
- package/dist/analysis/analyze_risk_profile.js +159 -0
- package/dist/analysis/analyze_risk_profile.js.map +1 -0
- package/dist/analysis/analyze_trade_heatmap.d.ts +3 -0
- package/dist/analysis/analyze_trade_heatmap.d.ts.map +1 -0
- package/dist/analysis/analyze_trade_heatmap.js +367 -0
- package/dist/analysis/analyze_trade_heatmap.js.map +1 -0
- package/dist/analysis/analyze_volatility.d.ts +22 -0
- package/dist/analysis/analyze_volatility.d.ts.map +1 -0
- package/dist/analysis/analyze_volatility.js +172 -0
- package/dist/analysis/analyze_volatility.js.map +1 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +99 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js +804 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +2 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js +347 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -0
- package/dist/analysis/bot_fitting/shared_utils.d.ts +15 -0
- package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/shared_utils.js +48 -0
- package/dist/analysis/bot_fitting/shared_utils.js.map +1 -0
- package/dist/analysis/bot_key_utils.d.ts +16 -0
- package/dist/analysis/bot_key_utils.d.ts.map +1 -0
- package/dist/analysis/bot_key_utils.js +61 -0
- package/dist/analysis/bot_key_utils.js.map +1 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.d.ts +3 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.d.ts.map +1 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.js +498 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +546 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.js +427 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -0
- package/dist/analysis/chart_utils.d.ts +13 -0
- package/dist/analysis/chart_utils.d.ts.map +1 -0
- package/dist/analysis/chart_utils.js +142 -0
- package/dist/analysis/chart_utils.js.map +1 -0
- package/dist/analysis/derivative_chart_generator.d.ts +18 -0
- package/dist/analysis/derivative_chart_generator.d.ts.map +1 -0
- package/dist/analysis/derivative_chart_generator.js +896 -0
- package/dist/analysis/derivative_chart_generator.js.map +1 -0
- package/dist/analysis/math_utils.d.ts +35 -0
- package/dist/analysis/math_utils.d.ts.map +1 -0
- package/dist/analysis/math_utils.js +121 -0
- package/dist/analysis/math_utils.js.map +1 -0
- package/dist/analysis/price_sources.d.ts +34 -0
- package/dist/analysis/price_sources.d.ts.map +1 -0
- package/dist/analysis/price_sources.js +103 -0
- package/dist/analysis/price_sources.js.map +1 -0
- package/dist/analysis/trade_profitability.d.ts +115 -0
- package/dist/analysis/trade_profitability.d.ts.map +1 -0
- package/dist/analysis/trade_profitability.js +1247 -0
- package/dist/analysis/trade_profitability.js.map +1 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts +38 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -0
- package/dist/analysis/tradingview/analyze_tradingview.js +212 -0
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +9 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1717 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts +250 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.js +903 -0
- package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +1449 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts +42 -0
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/hurst_analyzer.js +159 -0
- package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.js +408 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts +103 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.js +229 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts +34 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.js +89 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +1 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts +39 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.js +132 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/regime_chart_generator.js +345 -0
- package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts +2 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js +130 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts +2 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +38 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.d.ts +6 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.js +732 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -0
- package/dist/bot.d.ts +49 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +221 -0
- package/dist/bot.js.map +1 -0
- package/dist/credential-daemon.d.ts +64 -0
- package/dist/credential-daemon.d.ts.map +1 -0
- package/dist/credential-daemon.js +987 -0
- package/dist/credential-daemon.js.map +1 -0
- package/dist/dexbot.d.ts +87 -0
- package/dist/dexbot.d.ts.map +1 -0
- package/dist/dexbot.js +1222 -0
- package/dist/dexbot.js.map +1 -0
- package/dist/market_adapter/ama_signal_runner.d.ts +3 -0
- package/dist/market_adapter/ama_signal_runner.d.ts.map +1 -0
- package/dist/market_adapter/ama_signal_runner.js +175 -0
- package/dist/market_adapter/ama_signal_runner.js.map +1 -0
- package/dist/market_adapter/candle_utils.d.ts +57 -0
- package/dist/market_adapter/candle_utils.d.ts.map +1 -0
- package/dist/market_adapter/candle_utils.js +252 -0
- package/dist/market_adapter/candle_utils.js.map +1 -0
- package/dist/market_adapter/core/asymmetric_bounds.d.ts +20 -0
- package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -0
- package/dist/market_adapter/core/asymmetric_bounds.js +88 -0
- package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -0
- package/dist/market_adapter/core/config_normalizers.d.ts +10 -0
- package/dist/market_adapter/core/config_normalizers.d.ts.map +1 -0
- package/dist/market_adapter/core/config_normalizers.js +24 -0
- package/dist/market_adapter/core/config_normalizers.js.map +1 -0
- package/dist/market_adapter/core/kibana_candles.d.ts +74 -0
- package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -0
- package/dist/market_adapter/core/kibana_candles.js +249 -0
- package/dist/market_adapter/core/kibana_candles.js.map +1 -0
- package/dist/market_adapter/core/kibana_client.d.ts +27 -0
- package/dist/market_adapter/core/kibana_client.d.ts.map +1 -0
- package/dist/market_adapter/core/kibana_client.js +120 -0
- package/dist/market_adapter/core/kibana_client.js.map +1 -0
- package/dist/market_adapter/core/kibana_market_candles.d.ts +143 -0
- package/dist/market_adapter/core/kibana_market_candles.d.ts.map +1 -0
- package/dist/market_adapter/core/kibana_market_candles.js +170 -0
- package/dist/market_adapter/core/kibana_market_candles.js.map +1 -0
- package/dist/market_adapter/core/market_adapter_service.d.ts +210 -0
- package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -0
- package/dist/market_adapter/core/market_adapter_service.js +2328 -0
- package/dist/market_adapter/core/market_adapter_service.js.map +1 -0
- package/dist/market_adapter/core/strategies/ama.d.ts +2 -0
- package/dist/market_adapter/core/strategies/ama.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/ama.js +138 -0
- package/dist/market_adapter/core/strategies/ama.js.map +1 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.d.ts +50 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.js +143 -0
- package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -0
- package/dist/market_adapter/core/strategies/atr/calculator.d.ts +12 -0
- package/dist/market_adapter/core/strategies/atr/calculator.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/atr/calculator.js +47 -0
- package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -0
- package/dist/market_adapter/core/strategies/collateral_manager.d.ts +32 -0
- package/dist/market_adapter/core/strategies/collateral_manager.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/collateral_manager.js +68 -0
- package/dist/market_adapter/core/strategies/collateral_manager.js.map +1 -0
- package/dist/market_adapter/core/strategies/regime_gate.d.ts +66 -0
- package/dist/market_adapter/core/strategies/regime_gate.d.ts.map +1 -0
- package/dist/market_adapter/core/strategies/regime_gate.js +189 -0
- package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -0
- package/dist/market_adapter/index.d.ts +10 -0
- package/dist/market_adapter/index.d.ts.map +1 -0
- package/dist/market_adapter/index.js +71 -0
- package/dist/market_adapter/index.js.map +1 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.d.ts +3 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.d.ts.map +1 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1165 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -0
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts +54 -0
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -0
- package/dist/market_adapter/inputs/fetch_lp_data.js +743 -0
- package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -0
- package/dist/market_adapter/inputs/kibana_source.d.ts +68 -0
- package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -0
- package/dist/market_adapter/inputs/kibana_source.js +143 -0
- package/dist/market_adapter/inputs/kibana_source.js.map +1 -0
- package/dist/market_adapter/interval_utils.d.ts +6 -0
- package/dist/market_adapter/interval_utils.d.ts.map +1 -0
- package/dist/market_adapter/interval_utils.js +14 -0
- package/dist/market_adapter/interval_utils.js.map +1 -0
- package/dist/market_adapter/log_format.d.ts +16 -0
- package/dist/market_adapter/log_format.d.ts.map +1 -0
- package/dist/market_adapter/log_format.js +72 -0
- package/dist/market_adapter/log_format.js.map +1 -0
- package/dist/market_adapter/lp_chart_core.d.ts +6 -0
- package/dist/market_adapter/lp_chart_core.d.ts.map +1 -0
- package/dist/market_adapter/lp_chart_core.js +874 -0
- package/dist/market_adapter/lp_chart_core.js.map +1 -0
- package/dist/market_adapter/lp_chart_runner.d.ts +135 -0
- package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -0
- package/dist/market_adapter/lp_chart_runner.js +337 -0
- package/dist/market_adapter/lp_chart_runner.js.map +1 -0
- package/dist/market_adapter/lp_chart_strategy_loader.d.ts +23 -0
- package/dist/market_adapter/lp_chart_strategy_loader.d.ts.map +1 -0
- package/dist/market_adapter/lp_chart_strategy_loader.js +169 -0
- package/dist/market_adapter/lp_chart_strategy_loader.js.map +1 -0
- package/dist/market_adapter/market_adapter.d.ts +133 -0
- package/dist/market_adapter/market_adapter.d.ts.map +1 -0
- package/dist/market_adapter/market_adapter.js +1331 -0
- package/dist/market_adapter/market_adapter.js.map +1 -0
- package/dist/market_adapter/merge_lp_data.d.ts +3 -0
- package/dist/market_adapter/merge_lp_data.d.ts.map +1 -0
- package/dist/market_adapter/merge_lp_data.js +125 -0
- package/dist/market_adapter/merge_lp_data.js.map +1 -0
- package/dist/market_adapter/test_helpers.d.ts +14 -0
- package/dist/market_adapter/test_helpers.d.ts.map +1 -0
- package/dist/market_adapter/test_helpers.js +22 -0
- package/dist/market_adapter/test_helpers.js.map +1 -0
- package/dist/market_adapter/utils/adapter_client.d.ts +20 -0
- package/dist/market_adapter/utils/adapter_client.d.ts.map +1 -0
- package/dist/market_adapter/utils/adapter_client.js +88 -0
- package/dist/market_adapter/utils/adapter_client.js.map +1 -0
- package/dist/market_adapter/utils/atomic_write.d.ts +9 -0
- package/dist/market_adapter/utils/atomic_write.d.ts.map +1 -0
- package/dist/market_adapter/utils/atomic_write.js +13 -0
- package/dist/market_adapter/utils/atomic_write.js.map +1 -0
- package/dist/market_adapter/utils/chain.d.ts +50 -0
- package/dist/market_adapter/utils/chain.d.ts.map +1 -0
- package/dist/market_adapter/utils/chain.js +196 -0
- package/dist/market_adapter/utils/chain.js.map +1 -0
- package/dist/market_adapter/utils/data_discovery.d.ts +6 -0
- package/dist/market_adapter/utils/data_discovery.d.ts.map +1 -0
- package/dist/market_adapter/utils/data_discovery.js +35 -0
- package/dist/market_adapter/utils/data_discovery.js.map +1 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts +15 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.js +60 -0
- package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -0
- package/dist/market_adapter/utils/file_lock.d.ts +19 -0
- package/dist/market_adapter/utils/file_lock.d.ts.map +1 -0
- package/dist/market_adapter/utils/file_lock.js +191 -0
- package/dist/market_adapter/utils/file_lock.js.map +1 -0
- package/dist/market_adapter/utils/native_history.d.ts +19 -0
- package/dist/market_adapter/utils/native_history.d.ts.map +1 -0
- package/dist/market_adapter/utils/native_history.js +172 -0
- package/dist/market_adapter/utils/native_history.js.map +1 -0
- package/dist/market_adapter/utils/paths.d.ts +5 -0
- package/dist/market_adapter/utils/paths.d.ts.map +1 -0
- package/dist/market_adapter/utils/paths.js +7 -0
- package/dist/market_adapter/utils/paths.js.map +1 -0
- package/dist/modules/account_bots.d.ts +112 -0
- package/dist/modules/account_bots.d.ts.map +1 -0
- package/dist/modules/account_bots.js +1259 -0
- package/dist/modules/account_bots.js.map +1 -0
- package/dist/modules/account_orders.d.ts +273 -0
- package/dist/modules/account_orders.d.ts.map +1 -0
- package/dist/modules/account_orders.js +662 -0
- package/dist/modules/account_orders.js.map +1 -0
- package/dist/modules/authority_resolver.d.ts +2 -0
- package/dist/modules/authority_resolver.d.ts.map +1 -0
- package/dist/modules/authority_resolver.js +231 -0
- package/dist/modules/authority_resolver.js.map +1 -0
- package/dist/modules/bitshares-native/chain_client.d.ts +38 -0
- package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -0
- package/dist/modules/bitshares-native/chain_client.js +322 -0
- package/dist/modules/bitshares-native/chain_client.js.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts +59 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.js +456 -0
- package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.d.ts +66 -0
- package/dist/modules/bitshares-native/crypto/ecc.d.ts.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc.js +557 -0
- package/dist/modules/bitshares-native/crypto/ecc.js.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts +2 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.d.ts.map +1 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.js +20 -0
- package/dist/modules/bitshares-native/crypto/ecc_selector.js.map +1 -0
- package/dist/modules/bitshares-native/index.d.ts +3 -0
- package/dist/modules/bitshares-native/index.d.ts.map +1 -0
- package/dist/modules/bitshares-native/index.js +32 -0
- package/dist/modules/bitshares-native/index.js.map +1 -0
- package/dist/modules/bitshares-native/resolvers.d.ts +40 -0
- package/dist/modules/bitshares-native/resolvers.d.ts.map +1 -0
- package/dist/modules/bitshares-native/resolvers.js +161 -0
- package/dist/modules/bitshares-native/resolvers.js.map +1 -0
- package/dist/modules/bitshares-native/serial/chain_constants.d.ts +56 -0
- package/dist/modules/bitshares-native/serial/chain_constants.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/chain_constants.js +92 -0
- package/dist/modules/bitshares-native/serial/chain_constants.js.map +1 -0
- package/dist/modules/bitshares-native/serial/index.d.ts +10 -0
- package/dist/modules/bitshares-native/serial/index.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/index.js +14 -0
- package/dist/modules/bitshares-native/serial/index.js.map +1 -0
- package/dist/modules/bitshares-native/serial/operations.d.ts +102 -0
- package/dist/modules/bitshares-native/serial/operations.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/operations.js +615 -0
- package/dist/modules/bitshares-native/serial/operations.js.map +1 -0
- package/dist/modules/bitshares-native/serial/serializer.d.ts +64 -0
- package/dist/modules/bitshares-native/serial/serializer.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/serializer.js +252 -0
- package/dist/modules/bitshares-native/serial/serializer.js.map +1 -0
- package/dist/modules/bitshares-native/serial/types.d.ts +120 -0
- package/dist/modules/bitshares-native/serial/types.d.ts.map +1 -0
- package/dist/modules/bitshares-native/serial/types.js +837 -0
- package/dist/modules/bitshares-native/serial/types.js.map +1 -0
- package/dist/modules/bitshares-native/signing_client.d.ts +6 -0
- package/dist/modules/bitshares-native/signing_client.d.ts.map +1 -0
- package/dist/modules/bitshares-native/signing_client.js +141 -0
- package/dist/modules/bitshares-native/signing_client.js.map +1 -0
- package/dist/modules/bitshares-native/subscriptions.d.ts +6 -0
- package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -0
- package/dist/modules/bitshares-native/subscriptions.js +865 -0
- package/dist/modules/bitshares-native/subscriptions.js.map +1 -0
- package/dist/modules/bitshares-native/transport.d.ts +51 -0
- package/dist/modules/bitshares-native/transport.d.ts.map +1 -0
- package/dist/modules/bitshares-native/transport.js +447 -0
- package/dist/modules/bitshares-native/transport.js.map +1 -0
- package/dist/modules/bitshares-native/tx/builder.d.ts +30 -0
- package/dist/modules/bitshares-native/tx/builder.d.ts.map +1 -0
- package/dist/modules/bitshares-native/tx/builder.js +262 -0
- package/dist/modules/bitshares-native/tx/builder.js.map +1 -0
- package/dist/modules/bitshares_client.d.ts +129 -0
- package/dist/modules/bitshares_client.d.ts.map +1 -0
- package/dist/modules/bitshares_client.js +627 -0
- package/dist/modules/bitshares_client.js.map +1 -0
- package/dist/modules/bot_settings.d.ts +33 -0
- package/dist/modules/bot_settings.d.ts.map +1 -0
- package/dist/modules/bot_settings.js +328 -0
- package/dist/modules/bot_settings.js.map +1 -0
- package/dist/modules/bots_file_lock.d.ts +88 -0
- package/dist/modules/bots_file_lock.d.ts.map +1 -0
- package/dist/modules/bots_file_lock.js +161 -0
- package/dist/modules/bots_file_lock.js.map +1 -0
- package/dist/modules/chain_keys.d.ts +302 -0
- package/dist/modules/chain_keys.d.ts.map +1 -0
- package/dist/modules/chain_keys.js +1095 -0
- package/dist/modules/chain_keys.js.map +1 -0
- package/dist/modules/chain_orders.d.ts +423 -0
- package/dist/modules/chain_orders.d.ts.map +1 -0
- package/dist/modules/chain_orders.js +1201 -0
- package/dist/modules/chain_orders.js.map +1 -0
- package/dist/modules/cli_whitelist_args.d.ts +6 -0
- package/dist/modules/cli_whitelist_args.d.ts.map +1 -0
- package/dist/modules/cli_whitelist_args.js +13 -0
- package/dist/modules/cli_whitelist_args.js.map +1 -0
- package/dist/modules/config.d.ts +57 -0
- package/dist/modules/config.d.ts.map +1 -0
- package/dist/modules/config.js +107 -0
- package/dist/modules/config.js.map +1 -0
- package/dist/modules/constants.d.ts +635 -0
- package/dist/modules/constants.d.ts.map +1 -0
- package/dist/modules/constants.js +1464 -0
- package/dist/modules/constants.js.map +1 -0
- package/dist/modules/cr_planner.d.ts +51 -0
- package/dist/modules/cr_planner.d.ts.map +1 -0
- package/dist/modules/cr_planner.js +299 -0
- package/dist/modules/cr_planner.js.map +1 -0
- package/dist/modules/credential_policy.d.ts +188 -0
- package/dist/modules/credential_policy.d.ts.map +1 -0
- package/dist/modules/credential_policy.js +1452 -0
- package/dist/modules/credential_policy.js.map +1 -0
- package/dist/modules/credential_runtime.d.ts +42 -0
- package/dist/modules/credential_runtime.d.ts.map +1 -0
- package/dist/modules/credential_runtime.js +148 -0
- package/dist/modules/credential_runtime.js.map +1 -0
- package/dist/modules/credential_session_cache.d.ts +36 -0
- package/dist/modules/credential_session_cache.d.ts.map +1 -0
- package/dist/modules/credential_session_cache.js +106 -0
- package/dist/modules/credential_session_cache.js.map +1 -0
- package/dist/modules/credit_runtime.d.ts +412 -0
- package/dist/modules/credit_runtime.d.ts.map +1 -0
- package/dist/modules/credit_runtime.js +2866 -0
- package/dist/modules/credit_runtime.js.map +1 -0
- package/dist/modules/crypto/browser_provider.d.ts +15 -0
- package/dist/modules/crypto/browser_provider.d.ts.map +1 -0
- package/dist/modules/crypto/browser_provider.js +113 -0
- package/dist/modules/crypto/browser_provider.js.map +1 -0
- package/dist/modules/crypto/index.d.ts +9 -0
- package/dist/modules/crypto/index.d.ts.map +1 -0
- package/dist/modules/crypto/index.js +44 -0
- package/dist/modules/crypto/index.js.map +1 -0
- package/dist/modules/crypto/node_provider.d.ts +15 -0
- package/dist/modules/crypto/node_provider.d.ts.map +1 -0
- package/dist/modules/crypto/node_provider.js +74 -0
- package/dist/modules/crypto/node_provider.js.map +1 -0
- package/dist/modules/crypto/provider.d.ts +34 -0
- package/dist/modules/crypto/provider.d.ts.map +1 -0
- package/dist/modules/crypto/provider.js +3 -0
- package/dist/modules/crypto/provider.js.map +1 -0
- package/dist/modules/crypto/pure_ripemd160.d.ts +8 -0
- package/dist/modules/crypto/pure_ripemd160.d.ts.map +1 -0
- package/dist/modules/crypto/pure_ripemd160.js +142 -0
- package/dist/modules/crypto/pure_ripemd160.js.map +1 -0
- package/dist/modules/crypto/pure_scrypt.d.ts +23 -0
- package/dist/modules/crypto/pure_scrypt.d.ts.map +1 -0
- package/dist/modules/crypto/pure_scrypt.js +161 -0
- package/dist/modules/crypto/pure_scrypt.js.map +1 -0
- package/dist/modules/crypto/pure_secp256k1.d.ts +29 -0
- package/dist/modules/crypto/pure_secp256k1.d.ts.map +1 -0
- package/dist/modules/crypto/pure_secp256k1.js +195 -0
- package/dist/modules/crypto/pure_secp256k1.js.map +1 -0
- package/dist/modules/crypto/sync.d.ts +13 -0
- package/dist/modules/crypto/sync.d.ts.map +1 -0
- package/dist/modules/crypto/sync.js +37 -0
- package/dist/modules/crypto/sync.js.map +1 -0
- package/dist/modules/dexbot_class.d.ts +1074 -0
- package/dist/modules/dexbot_class.d.ts.map +1 -0
- package/dist/modules/dexbot_class.js +4613 -0
- package/dist/modules/dexbot_class.js.map +1 -0
- package/dist/modules/dexbot_credential_client.d.ts +71 -0
- package/dist/modules/dexbot_credential_client.d.ts.map +1 -0
- package/dist/modules/dexbot_credential_client.js +224 -0
- package/dist/modules/dexbot_credential_client.js.map +1 -0
- package/dist/modules/dexbot_fill_runtime.d.ts +173 -0
- package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -0
- package/dist/modules/dexbot_fill_runtime.js +217 -0
- package/dist/modules/dexbot_fill_runtime.js.map +1 -0
- package/dist/modules/dexbot_maintenance_runtime.d.ts +279 -0
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -0
- package/dist/modules/dexbot_maintenance_runtime.js +1613 -0
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -0
- package/dist/modules/env.d.ts +12 -0
- package/dist/modules/env.d.ts.map +1 -0
- package/dist/modules/env.js +57 -0
- package/dist/modules/env.js.map +1 -0
- package/dist/modules/fund_registry.d.ts +96 -0
- package/dist/modules/fund_registry.d.ts.map +1 -0
- package/dist/modules/fund_registry.js +261 -0
- package/dist/modules/fund_registry.js.map +1 -0
- package/dist/modules/general_settings.d.ts +36 -0
- package/dist/modules/general_settings.d.ts.map +1 -0
- package/dist/modules/general_settings.js +63 -0
- package/dist/modules/general_settings.js.map +1 -0
- package/dist/modules/graceful_shutdown.d.ts +86 -0
- package/dist/modules/graceful_shutdown.d.ts.map +1 -0
- package/dist/modules/graceful_shutdown.js +164 -0
- package/dist/modules/graceful_shutdown.js.map +1 -0
- package/dist/modules/key_store.d.ts +60 -0
- package/dist/modules/key_store.d.ts.map +1 -0
- package/dist/modules/key_store.js +215 -0
- package/dist/modules/key_store.js.map +1 -0
- package/dist/modules/launcher/bot_supervisor.d.ts +84 -0
- package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -0
- package/dist/modules/launcher/bot_supervisor.js +1067 -0
- package/dist/modules/launcher/bot_supervisor.js.map +1 -0
- package/dist/modules/launcher/child_env.d.ts +9 -0
- package/dist/modules/launcher/child_env.d.ts.map +1 -0
- package/dist/modules/launcher/child_env.js +78 -0
- package/dist/modules/launcher/child_env.js.map +1 -0
- package/dist/modules/launcher/credential_bootstrap.d.ts +22 -0
- package/dist/modules/launcher/credential_bootstrap.d.ts.map +1 -0
- package/dist/modules/launcher/credential_bootstrap.js +303 -0
- package/dist/modules/launcher/credential_bootstrap.js.map +1 -0
- package/dist/modules/launcher/credential_daemon.d.ts +32 -0
- package/dist/modules/launcher/credential_daemon.d.ts.map +1 -0
- package/dist/modules/launcher/credential_daemon.js +173 -0
- package/dist/modules/launcher/credential_daemon.js.map +1 -0
- package/dist/modules/launcher/credential_secret.d.ts +6 -0
- package/dist/modules/launcher/credential_secret.d.ts.map +1 -0
- package/dist/modules/launcher/credential_secret.js +15 -0
- package/dist/modules/launcher/credential_secret.js.map +1 -0
- package/dist/modules/launcher/foreign_cred_daemon.d.ts +2 -0
- package/dist/modules/launcher/foreign_cred_daemon.d.ts.map +1 -0
- package/dist/modules/launcher/foreign_cred_daemon.js +166 -0
- package/dist/modules/launcher/foreign_cred_daemon.js.map +1 -0
- package/dist/modules/launcher/headless_password.d.ts +8 -0
- package/dist/modules/launcher/headless_password.d.ts.map +1 -0
- package/dist/modules/launcher/headless_password.js +33 -0
- package/dist/modules/launcher/headless_password.js.map +1 -0
- package/dist/modules/launcher/launch_modes.d.ts +36 -0
- package/dist/modules/launcher/launch_modes.d.ts.map +1 -0
- package/dist/modules/launcher/launch_modes.js +129 -0
- package/dist/modules/launcher/launch_modes.js.map +1 -0
- package/dist/modules/launcher/market_adapter_runtime.d.ts +43 -0
- package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -0
- package/dist/modules/launcher/market_adapter_runtime.js +217 -0
- package/dist/modules/launcher/market_adapter_runtime.js.map +1 -0
- package/dist/modules/launcher/market_adapter_watchdog.d.ts +26 -0
- package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -0
- package/dist/modules/launcher/market_adapter_watchdog.js +214 -0
- package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -0
- package/dist/modules/launcher/monolithic_runtime.d.ts +89 -0
- package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -0
- package/dist/modules/launcher/monolithic_runtime.js +425 -0
- package/dist/modules/launcher/monolithic_runtime.js.map +1 -0
- package/dist/modules/launcher/runtime_entry.d.ts +26 -0
- package/dist/modules/launcher/runtime_entry.d.ts.map +1 -0
- package/dist/modules/launcher/runtime_entry.js +49 -0
- package/dist/modules/launcher/runtime_entry.js.map +1 -0
- package/dist/modules/launcher/status_reporting.d.ts +48 -0
- package/dist/modules/launcher/status_reporting.d.ts.map +1 -0
- package/dist/modules/launcher/status_reporting.js +113 -0
- package/dist/modules/launcher/status_reporting.js.map +1 -0
- package/dist/modules/launcher/supervisor_control.d.ts +6 -0
- package/dist/modules/launcher/supervisor_control.d.ts.map +1 -0
- package/dist/modules/launcher/supervisor_control.js +59 -0
- package/dist/modules/launcher/supervisor_control.js.map +1 -0
- package/dist/modules/logger.d.ts +2 -0
- package/dist/modules/logger.d.ts.map +1 -0
- package/dist/modules/logger.js +71 -0
- package/dist/modules/logger.js.map +1 -0
- package/dist/modules/market_adapter_whitelist.d.ts +22 -0
- package/dist/modules/market_adapter_whitelist.d.ts.map +1 -0
- package/dist/modules/market_adapter_whitelist.js +82 -0
- package/dist/modules/market_adapter_whitelist.js.map +1 -0
- package/dist/modules/node_health_cache.d.ts +55 -0
- package/dist/modules/node_health_cache.d.ts.map +1 -0
- package/dist/modules/node_health_cache.js +134 -0
- package/dist/modules/node_health_cache.js.map +1 -0
- package/dist/modules/node_manager.d.ts +215 -0
- package/dist/modules/node_manager.d.ts.map +1 -0
- package/dist/modules/node_manager.js +628 -0
- package/dist/modules/node_manager.js.map +1 -0
- package/dist/modules/order/accounting.d.ts +349 -0
- package/dist/modules/order/accounting.d.ts.map +1 -0
- package/dist/modules/order/accounting.js +1191 -0
- package/dist/modules/order/accounting.js.map +1 -0
- package/dist/modules/order/async_lock.d.ts +126 -0
- package/dist/modules/order/async_lock.d.ts.map +1 -0
- package/dist/modules/order/async_lock.js +195 -0
- package/dist/modules/order/async_lock.js.map +1 -0
- package/dist/modules/order/export.d.ts +129 -0
- package/dist/modules/order/export.d.ts.map +1 -0
- package/dist/modules/order/export.js +316 -0
- package/dist/modules/order/export.js.map +1 -0
- package/dist/modules/order/format.d.ts +158 -0
- package/dist/modules/order/format.d.ts.map +1 -0
- package/dist/modules/order/format.js +232 -0
- package/dist/modules/order/format.js.map +1 -0
- package/dist/modules/order/grid.d.ts +549 -0
- package/dist/modules/order/grid.d.ts.map +1 -0
- package/dist/modules/order/grid.js +1746 -0
- package/dist/modules/order/grid.js.map +1 -0
- package/dist/modules/order/grid_reconcile.d.ts +154 -0
- package/dist/modules/order/grid_reconcile.d.ts.map +1 -0
- package/dist/modules/order/grid_reconcile.js +1192 -0
- package/dist/modules/order/grid_reconcile.js.map +1 -0
- package/dist/modules/order/index.d.ts +55 -0
- package/dist/modules/order/index.d.ts.map +1 -0
- package/dist/modules/order/index.js +79 -0
- package/dist/modules/order/index.js.map +1 -0
- package/dist/modules/order/logger.d.ts +136 -0
- package/dist/modules/order/logger.d.ts.map +1 -0
- package/dist/modules/order/logger.js +614 -0
- package/dist/modules/order/logger.js.map +1 -0
- package/dist/modules/order/logger_state.d.ts +133 -0
- package/dist/modules/order/logger_state.d.ts.map +1 -0
- package/dist/modules/order/logger_state.js +170 -0
- package/dist/modules/order/logger_state.js.map +1 -0
- package/dist/modules/order/manager.d.ts +413 -0
- package/dist/modules/order/manager.d.ts.map +1 -0
- package/dist/modules/order/manager.js +1605 -0
- package/dist/modules/order/manager.js.map +1 -0
- package/dist/modules/order/processed_fill_store.d.ts +135 -0
- package/dist/modules/order/processed_fill_store.d.ts.map +1 -0
- package/dist/modules/order/processed_fill_store.js +288 -0
- package/dist/modules/order/processed_fill_store.js.map +1 -0
- package/dist/modules/order/runner.d.ts +70 -0
- package/dist/modules/order/runner.d.ts.map +1 -0
- package/dist/modules/order/runner.js +140 -0
- package/dist/modules/order/runner.js.map +1 -0
- package/dist/modules/order/strategy.d.ts +196 -0
- package/dist/modules/order/strategy.d.ts.map +1 -0
- package/dist/modules/order/strategy.js +398 -0
- package/dist/modules/order/strategy.js.map +1 -0
- package/dist/modules/order/sync_engine.d.ts +386 -0
- package/dist/modules/order/sync_engine.d.ts.map +1 -0
- package/dist/modules/order/sync_engine.js +1459 -0
- package/dist/modules/order/sync_engine.js.map +1 -0
- package/dist/modules/order/utils/math.d.ts +677 -0
- package/dist/modules/order/utils/math.d.ts.map +1 -0
- package/dist/modules/order/utils/math.js +1172 -0
- package/dist/modules/order/utils/math.js.map +1 -0
- package/dist/modules/order/utils/order.d.ts +572 -0
- package/dist/modules/order/utils/order.d.ts.map +1 -0
- package/dist/modules/order/utils/order.js +1145 -0
- package/dist/modules/order/utils/order.js.map +1 -0
- package/dist/modules/order/utils/system.d.ts +268 -0
- package/dist/modules/order/utils/system.d.ts.map +1 -0
- package/dist/modules/order/utils/system.js +1261 -0
- package/dist/modules/order/utils/system.js.map +1 -0
- package/dist/modules/order/utils/validate.d.ts +280 -0
- package/dist/modules/order/utils/validate.d.ts.map +1 -0
- package/dist/modules/order/utils/validate.js +918 -0
- package/dist/modules/order/utils/validate.js.map +1 -0
- package/dist/modules/order/working_grid.d.ts +212 -0
- package/dist/modules/order/working_grid.d.ts.map +1 -0
- package/dist/modules/order/working_grid.js +279 -0
- package/dist/modules/order/working_grid.js.map +1 -0
- package/dist/modules/path_api.d.ts +32 -0
- package/dist/modules/path_api.d.ts.map +1 -0
- package/dist/modules/path_api.js +148 -0
- package/dist/modules/path_api.js.map +1 -0
- package/dist/modules/paths.d.ts +58 -0
- package/dist/modules/paths.d.ts.map +1 -0
- package/dist/modules/paths.js +82 -0
- package/dist/modules/paths.js.map +1 -0
- package/dist/modules/process_discovery.d.ts +58 -0
- package/dist/modules/process_discovery.d.ts.map +1 -0
- package/dist/modules/process_discovery.js +265 -0
- package/dist/modules/process_discovery.js.map +1 -0
- package/dist/modules/runtime.d.ts +34 -0
- package/dist/modules/runtime.d.ts.map +1 -0
- package/dist/modules/runtime.js +98 -0
- package/dist/modules/runtime.js.map +1 -0
- package/dist/modules/runtime_settings.d.ts +12 -0
- package/dist/modules/runtime_settings.d.ts.map +1 -0
- package/dist/modules/runtime_settings.js +122 -0
- package/dist/modules/runtime_settings.js.map +1 -0
- package/dist/modules/settings_merge.d.ts +38 -0
- package/dist/modules/settings_merge.d.ts.map +1 -0
- package/dist/modules/settings_merge.js +246 -0
- package/dist/modules/settings_merge.js.map +1 -0
- package/dist/modules/storage/browser_adapter.d.ts +56 -0
- package/dist/modules/storage/browser_adapter.d.ts.map +1 -0
- package/dist/modules/storage/browser_adapter.js +231 -0
- package/dist/modules/storage/browser_adapter.js.map +1 -0
- package/dist/modules/storage/index.d.ts +28 -0
- package/dist/modules/storage/index.d.ts.map +1 -0
- package/dist/modules/storage/index.js +52 -0
- package/dist/modules/storage/index.js.map +1 -0
- package/dist/modules/storage/node_adapter.d.ts +49 -0
- package/dist/modules/storage/node_adapter.d.ts.map +1 -0
- package/dist/modules/storage/node_adapter.js +167 -0
- package/dist/modules/storage/node_adapter.js.map +1 -0
- package/dist/modules/storage/types.d.ts +92 -0
- package/dist/modules/storage/types.d.ts.map +1 -0
- package/dist/modules/storage/types.js +3 -0
- package/dist/modules/storage/types.js.map +1 -0
- package/dist/modules/types.d.ts +1382 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +11 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/modules/utils/base58check.d.ts +12 -0
- package/dist/modules/utils/base58check.d.ts.map +1 -0
- package/dist/modules/utils/base58check.js +112 -0
- package/dist/modules/utils/base58check.js.map +1 -0
- package/dist/modules/utils/build_dir.d.ts +7 -0
- package/dist/modules/utils/build_dir.d.ts.map +1 -0
- package/dist/modules/utils/build_dir.js +8 -0
- package/dist/modules/utils/build_dir.js.map +1 -0
- package/dist/modules/utils/fs_utils.d.ts +25 -0
- package/dist/modules/utils/fs_utils.d.ts.map +1 -0
- package/dist/modules/utils/fs_utils.js +27 -0
- package/dist/modules/utils/fs_utils.js.map +1 -0
- package/dist/modules/utils/math_utils.d.ts +10 -0
- package/dist/modules/utils/math_utils.d.ts.map +1 -0
- package/dist/modules/utils/math_utils.js +17 -0
- package/dist/modules/utils/math_utils.js.map +1 -0
- package/dist/modules/validate_profiles.d.ts +37 -0
- package/dist/modules/validate_profiles.d.ts.map +1 -0
- package/dist/modules/validate_profiles.js +369 -0
- package/dist/modules/validate_profiles.js.map +1 -0
- package/dist/pm2.d.ts +167 -0
- package/dist/pm2.d.ts.map +1 -0
- package/dist/pm2.js +998 -0
- package/dist/pm2.js.map +1 -0
- package/dist/scripts/analyze-git.d.ts +11 -0
- package/dist/scripts/analyze-git.d.ts.map +1 -0
- package/dist/scripts/analyze-git.js +851 -0
- package/dist/scripts/analyze-git.js.map +1 -0
- package/dist/scripts/analyze-orders.d.ts +17 -0
- package/dist/scripts/analyze-orders.d.ts.map +1 -0
- package/dist/scripts/analyze-orders.js +1568 -0
- package/dist/scripts/analyze-orders.js.map +1 -0
- package/dist/scripts/diagnose-kibana-candles.d.ts +3 -0
- package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -0
- package/dist/scripts/diagnose-kibana-candles.js +82 -0
- package/dist/scripts/diagnose-kibana-candles.js.map +1 -0
- package/dist/scripts/diagnose-pool-history.d.ts +3 -0
- package/dist/scripts/diagnose-pool-history.d.ts.map +1 -0
- package/dist/scripts/diagnose-pool-history.js +296 -0
- package/dist/scripts/diagnose-pool-history.js.map +1 -0
- package/dist/scripts/divergence-calc.d.ts +26 -0
- package/dist/scripts/divergence-calc.d.ts.map +1 -0
- package/dist/scripts/divergence-calc.js +119 -0
- package/dist/scripts/divergence-calc.js.map +1 -0
- package/dist/scripts/generate_lp_chart.d.ts +31 -0
- package/dist/scripts/generate_lp_chart.d.ts.map +1 -0
- package/dist/scripts/generate_lp_chart.js +92 -0
- package/dist/scripts/generate_lp_chart.js.map +1 -0
- package/dist/scripts/generate_mainnet_corpus_report.d.ts +24 -0
- package/dist/scripts/generate_mainnet_corpus_report.d.ts.map +1 -0
- package/dist/scripts/generate_mainnet_corpus_report.js +237 -0
- package/dist/scripts/generate_mainnet_corpus_report.js.map +1 -0
- package/dist/scripts/generate_market_adapter_whitelist.d.ts +2 -0
- package/dist/scripts/generate_market_adapter_whitelist.d.ts.map +1 -0
- package/dist/scripts/generate_market_adapter_whitelist.js +111 -0
- package/dist/scripts/generate_market_adapter_whitelist.js.map +1 -0
- package/dist/scripts/migrate_bot_keys.d.ts +6 -0
- package/dist/scripts/migrate_bot_keys.d.ts.map +1 -0
- package/dist/scripts/migrate_bot_keys.js +301 -0
- package/dist/scripts/migrate_bot_keys.js.map +1 -0
- package/dist/scripts/native_release_gates.d.ts +3 -0
- package/dist/scripts/native_release_gates.d.ts.map +1 -0
- package/dist/scripts/native_release_gates.js +52 -0
- package/dist/scripts/native_release_gates.js.map +1 -0
- package/dist/scripts/print_grid.d.ts +16 -0
- package/dist/scripts/print_grid.d.ts.map +1 -0
- package/dist/scripts/print_grid.js +80 -0
- package/dist/scripts/print_grid.js.map +1 -0
- package/dist/scripts/run-tests.d.ts +2 -0
- package/dist/scripts/run-tests.d.ts.map +1 -0
- package/dist/scripts/run-tests.js +49 -0
- package/dist/scripts/run-tests.js.map +1 -0
- package/dist/scripts/sync-version.d.ts +14 -0
- package/dist/scripts/sync-version.d.ts.map +1 -0
- package/dist/scripts/sync-version.js +158 -0
- package/dist/scripts/sync-version.js.map +1 -0
- package/dist/scripts/test-credit-renewal.d.ts +2 -0
- package/dist/scripts/test-credit-renewal.d.ts.map +1 -0
- package/dist/scripts/test-credit-renewal.js +329 -0
- package/dist/scripts/test-credit-renewal.js.map +1 -0
- package/dist/scripts/update.d.ts +24 -0
- package/dist/scripts/update.d.ts.map +1 -0
- package/dist/scripts/update.js +650 -0
- package/dist/scripts/update.js.map +1 -0
- package/dist/scripts/validate_bots.d.ts +16 -0
- package/dist/scripts/validate_bots.d.ts.map +1 -0
- package/dist/scripts/validate_bots.js +106 -0
- package/dist/scripts/validate_bots.js.map +1 -0
- package/dist/scripts/verify-browser-bundle.d.ts +22 -0
- package/dist/scripts/verify-browser-bundle.d.ts.map +1 -0
- package/dist/scripts/verify-browser-bundle.js +339 -0
- package/dist/scripts/verify-browser-bundle.js.map +1 -0
- package/dist/unlock.d.ts +48 -0
- package/dist/unlock.d.ts.map +1 -0
- package/dist/unlock.js +925 -0
- package/dist/unlock.js.map +1 -0
- package/package.json +112 -0
- package/scripts/README.md +356 -0
- package/scripts/clear-all.sh +195 -0
- package/scripts/clear-logs.sh +95 -0
- package/scripts/clear-market-adapter.sh +196 -0
- package/scripts/clear-orders.sh +113 -0
- package/scripts/create-bot-symlinks.sh +51 -0
- package/scripts/postinstall.js +9 -0
- package/scripts/reset-settings.sh +118 -0
|
@@ -0,0 +1,1259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* modules/account_bots.ts - Bot Configuration Management
|
|
4
|
+
*
|
|
5
|
+
* Interactive CLI helper for editing bot profiles in profiles/bots.json.
|
|
6
|
+
* Manages multi-bot configuration and metadata.
|
|
7
|
+
*
|
|
8
|
+
* ===============================================================================
|
|
9
|
+
* EXPORTS (5 functions)
|
|
10
|
+
* ===============================================================================
|
|
11
|
+
*
|
|
12
|
+
* MAIN ENTRY POINT:
|
|
13
|
+
* 1. main() - Interactive CLI for bot configuration management
|
|
14
|
+
* Lists bots, allows add/edit/delete/activate operations
|
|
15
|
+
* Loads and saves profiles/bots.json
|
|
16
|
+
*
|
|
17
|
+
* 2. normalizeBotDraft(draft) - Normalize a bot configuration draft
|
|
18
|
+
* Applies defaults and validation to raw bot config entries
|
|
19
|
+
*
|
|
20
|
+
* UTILITIES:
|
|
21
|
+
* 3. parseJsonWithComments(raw) - Parse JSON with comment stripping
|
|
22
|
+
* Removes / * / and // style comments before JSON parsing
|
|
23
|
+
*
|
|
24
|
+
* 4. parseCronToDelta(cronString) - Parse cron expression to delta (minutes)
|
|
25
|
+
* Converts cron schedule to rotation frequency
|
|
26
|
+
*
|
|
27
|
+
* 5. deltaToCron(deltaMinutes) - Convert delta (minutes) to cron expression
|
|
28
|
+
* Converts rotation frequency to cron schedule
|
|
29
|
+
*
|
|
30
|
+
* ===============================================================================
|
|
31
|
+
*
|
|
32
|
+
* BOT CONFIGURATION (profiles/bots.json):
|
|
33
|
+
* {
|
|
34
|
+
* "bots": [
|
|
35
|
+
* {
|
|
36
|
+
* "name": "BTS/USD",
|
|
37
|
+
* "preferredAccount": "my-account",
|
|
38
|
+
* "assetA": "BTS",
|
|
39
|
+
* "assetB": "USD",
|
|
40
|
+
* "active": true,
|
|
41
|
+
* "dryRun": false,
|
|
42
|
+
* "startPrice": "pool", // Price for order alignment: "pool", "book", or numeric
|
|
43
|
+
* "gridPrice": null, // Reference price for x-factor bounds (3 options):
|
|
44
|
+
* // "pool" / "book" = live pair price reference
|
|
45
|
+
* // "ama"/"ama1".."ama4" = market adapter writes a center snapshot to
|
|
46
|
+
* // profiles/orders/<botKey>.dynamicgrid.json; grid reads the effective center on reset
|
|
47
|
+
* // <number> = fixed numeric reference
|
|
48
|
+
* // null = use startPrice
|
|
49
|
+
* "minPrice": "2x",
|
|
50
|
+
* "maxPrice": "2x",
|
|
51
|
+
* "incrementPercent": 0.5,
|
|
52
|
+
* "targetSpreadPercent": 2,
|
|
53
|
+
* "weightDistribution": { "sell": 1, "buy": 1 },
|
|
54
|
+
* "botFunds": { "sell": "100%", "buy": "100%" },
|
|
55
|
+
* "activeOrders": { "sell": 20, "buy": 20 },
|
|
56
|
+
* "debtPolicy": "ignore", // Debt policy: "ignore", "warn", or "block"
|
|
57
|
+
* "min_BTS_value": 0, // Minimum BTS value threshold for operations
|
|
58
|
+
* }
|
|
59
|
+
* ]
|
|
60
|
+
* }
|
|
61
|
+
*
|
|
62
|
+
* GLOBAL SETTINGS CONFIGURATION (profiles/general.settings.json):
|
|
63
|
+
* {
|
|
64
|
+
* "MARKET_ADAPTER": {
|
|
65
|
+
* "AMA_DELTA_THRESHOLD_PERCENT": 2 // % change in AMA center price triggers grid reset
|
|
66
|
+
* },
|
|
67
|
+
* "GRID_LIMITS": {
|
|
68
|
+
* "GRID_COMPARISON": {
|
|
69
|
+
* "RMS_PERCENTAGE": 14.3 // RMS divergence threshold triggers grid reset (set to 0 to disable)
|
|
70
|
+
* }
|
|
71
|
+
* }
|
|
72
|
+
* }
|
|
73
|
+
*
|
|
74
|
+
* ===============================================================================
|
|
75
|
+
*/
|
|
76
|
+
const { path } = require('./path_api');
|
|
77
|
+
const { getStorage } = require('./storage');
|
|
78
|
+
const storage = getStorage();
|
|
79
|
+
const { ensureProfilesDirectory, readInput } = require('./order/utils/system');
|
|
80
|
+
const { DEFAULT_CONFIG, GRID_LIMITS, TIMING, LOG_LEVEL, UPDATER, MARKET_ADAPTER, NODE_MANAGEMENT, FILL_PROCESSING, PIPELINE_TIMING, CREDENTIAL_PROMPTS, MAINTENANCE, COW_PERFORMANCE, INCREMENT_BOUNDS, FEE_PARAMETERS, API_LIMITS, LOGGING_CONFIG, NATIVE_CLIENT, LAUNCHER } = require('./constants');
|
|
81
|
+
const { PATHS } = require('./paths');
|
|
82
|
+
const { SETTINGS_FILE, readGeneralSettings, writeGeneralSettings } = require('./general_settings');
|
|
83
|
+
const { parseJsonWithComments } = require('./order/utils/system');
|
|
84
|
+
const { writeJSON } = require('./utils/fs_utils');
|
|
85
|
+
const { assertNoDuplicateBotKeys } = require('./bot_settings');
|
|
86
|
+
const BOTS_FILE = PATHS.PROFILES.BOTS_JSON;
|
|
87
|
+
const PROFILES_DIR = PATHS.PROFILES_DIR;
|
|
88
|
+
/**
|
|
89
|
+
* Loads the bots configuration from profiles/bots.json.
|
|
90
|
+
* @returns {Object} An object containing the config and the file path.
|
|
91
|
+
*/
|
|
92
|
+
function loadBotsConfig() {
|
|
93
|
+
if (!storage.exists(BOTS_FILE)) {
|
|
94
|
+
return { config: { bots: [] }, filePath: BOTS_FILE };
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const content = storage.readFile(BOTS_FILE);
|
|
98
|
+
if (!content || !content.trim())
|
|
99
|
+
return { config: { bots: [] }, filePath: BOTS_FILE };
|
|
100
|
+
const parsed = parseJsonWithComments(content);
|
|
101
|
+
if (!Array.isArray(parsed.bots))
|
|
102
|
+
parsed.bots = [];
|
|
103
|
+
return { config: parsed, filePath: BOTS_FILE };
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
console.error('Failed to load bots configuration:', err.message);
|
|
107
|
+
return { config: { bots: [] }, filePath: BOTS_FILE };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Saves the bots configuration to the specified file path.
|
|
112
|
+
* @param {Object} config - The configuration object to save.
|
|
113
|
+
* @param {string} filePath - The path to the file.
|
|
114
|
+
* @throws {Error} If saving fails.
|
|
115
|
+
*/
|
|
116
|
+
function saveBotsConfig(config, filePath) {
|
|
117
|
+
try {
|
|
118
|
+
ensureProfilesDirectory(PROFILES_DIR);
|
|
119
|
+
const entries = Array.isArray(config?.bots) ? config.bots : Array.isArray(config) ? config : [];
|
|
120
|
+
if (entries.length >= 2)
|
|
121
|
+
assertNoDuplicateBotKeys(entries, 'account_bots');
|
|
122
|
+
writeJSON(filePath, config);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
console.error('Failed to save bots configuration:', err.message);
|
|
126
|
+
throw err;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Loads general settings from profiles/general.settings.json.
|
|
131
|
+
* Delegates all merge logic to mergeSettings() in settings_merge.ts,
|
|
132
|
+
* which handles per-section strategies, NODES⇄NODE_MANAGEMENT mapping,
|
|
133
|
+
* and passthrough of unmapped NODES sub-keys.
|
|
134
|
+
* @returns {Object} The loaded settings or default settings if the file doesn't exist.
|
|
135
|
+
*/
|
|
136
|
+
function loadGeneralSettings() {
|
|
137
|
+
const defaults = {
|
|
138
|
+
LOG_LEVEL: LOG_LEVEL,
|
|
139
|
+
GRID_LIMITS: { ...GRID_LIMITS },
|
|
140
|
+
TIMING: { ...TIMING },
|
|
141
|
+
UPDATER: { ...UPDATER },
|
|
142
|
+
MARKET_ADAPTER: { ...MARKET_ADAPTER },
|
|
143
|
+
NODE_MANAGEMENT: { ...NODE_MANAGEMENT },
|
|
144
|
+
DEFAULT_CONFIG: { ...DEFAULT_CONFIG },
|
|
145
|
+
FILL_PROCESSING: { ...FILL_PROCESSING },
|
|
146
|
+
PIPELINE_TIMING: { ...PIPELINE_TIMING },
|
|
147
|
+
CREDENTIAL_PROMPTS: { ...CREDENTIAL_PROMPTS },
|
|
148
|
+
MAINTENANCE: { ...MAINTENANCE },
|
|
149
|
+
COW_PERFORMANCE: { ...COW_PERFORMANCE },
|
|
150
|
+
INCREMENT_BOUNDS: { ...INCREMENT_BOUNDS },
|
|
151
|
+
FEE_PARAMETERS: { ...FEE_PARAMETERS },
|
|
152
|
+
API_LIMITS: { ...API_LIMITS },
|
|
153
|
+
LOGGING_CONFIG: { ...LOGGING_CONFIG },
|
|
154
|
+
NATIVE_CLIENT: { ...NATIVE_CLIENT },
|
|
155
|
+
LAUNCHER: { ...LAUNCHER },
|
|
156
|
+
};
|
|
157
|
+
const settings = readGeneralSettings({
|
|
158
|
+
fallback: null,
|
|
159
|
+
onError: (err) => {
|
|
160
|
+
console.error('Failed to load general settings:', err.message);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
const { mergeSettings } = require('./settings_merge');
|
|
164
|
+
const merged = mergeSettings(settings, defaults);
|
|
165
|
+
// MARKET_ADAPTER validation for AMA_DELTA_THRESHOLD_PERCENT
|
|
166
|
+
const configuredDeltaPercent = Number(merged.MARKET_ADAPTER.AMA_DELTA_THRESHOLD_PERCENT);
|
|
167
|
+
const effectiveDeltaPercent = Number.isFinite(configuredDeltaPercent) && configuredDeltaPercent > 0
|
|
168
|
+
? configuredDeltaPercent
|
|
169
|
+
: MARKET_ADAPTER.AMA_DELTA_THRESHOLD_PERCENT;
|
|
170
|
+
merged.MARKET_ADAPTER.AMA_DELTA_THRESHOLD_PERCENT = effectiveDeltaPercent;
|
|
171
|
+
return merged;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Saves general settings to profiles/general.settings.json.
|
|
175
|
+
* @param {Object} settings - The settings object to save.
|
|
176
|
+
*/
|
|
177
|
+
function saveGeneralSettings(settings) {
|
|
178
|
+
try {
|
|
179
|
+
writeGeneralSettings(settings);
|
|
180
|
+
console.log(`\n✓ General settings saved to ${path.basename(SETTINGS_FILE)}`);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
console.error('Failed to save general settings:', err.message);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Lists the configured bots to the console.
|
|
188
|
+
* @param {Array<Object>} bots - The list of bot configuration objects.
|
|
189
|
+
*/
|
|
190
|
+
function listBots(bots) {
|
|
191
|
+
if (!bots.length) {
|
|
192
|
+
console.log(' (no bot entries defined yet)');
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
bots.forEach((bot, index) => {
|
|
196
|
+
const name = bot.name || `<unnamed-${index + 1}>`;
|
|
197
|
+
const inactiveSuffix = bot.active === false ? ' [inactive]' : '';
|
|
198
|
+
const dryRunSuffix = bot.dryRun ? ' (dryRun)' : '';
|
|
199
|
+
console.log(` ${index + 1}: ${name}${inactiveSuffix}${dryRunSuffix} ${bot.assetA || '?'} / ${bot.assetB || '?'}`);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Prompts the user to select a bot from the list.
|
|
204
|
+
* @param {Array<Object>} bots - The list of bots.
|
|
205
|
+
* @param {string} promptMessage - The message to display.
|
|
206
|
+
* @returns {Promise<number|string|null>} The selected index, '\x1b' if ESC, or null if invalid.
|
|
207
|
+
*/
|
|
208
|
+
async function selectBotIndex(bots, promptMessage) {
|
|
209
|
+
if (!bots.length)
|
|
210
|
+
return null;
|
|
211
|
+
listBots(bots);
|
|
212
|
+
const raw = (await readInput(`${promptMessage} [1-${bots.length}]: `)).trim();
|
|
213
|
+
if (raw === '\x1b')
|
|
214
|
+
return '\x1b';
|
|
215
|
+
const idx = Number(raw);
|
|
216
|
+
if (Number.isNaN(idx) || idx < 1 || idx > bots.length) {
|
|
217
|
+
if (raw !== '')
|
|
218
|
+
console.log('Invalid selection.');
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
return idx - 1;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Prompts the user for a string input.
|
|
225
|
+
* @param {string} promptText - The prompt text to display.
|
|
226
|
+
* @param {string} [defaultValue] - The default value to use if input is empty.
|
|
227
|
+
* @returns {Promise<string>} The user input or default value.
|
|
228
|
+
*/
|
|
229
|
+
async function askString(promptText, defaultValue) {
|
|
230
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
231
|
+
const answer = await readInput(`${promptText}${suffix}: `);
|
|
232
|
+
if (answer === '\x1b')
|
|
233
|
+
return '\x1b';
|
|
234
|
+
if (!answer)
|
|
235
|
+
return defaultValue;
|
|
236
|
+
return answer.trim();
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Prompts the user for a required string input.
|
|
240
|
+
* @param {string} promptText - The prompt text to display.
|
|
241
|
+
* @param {string} [defaultValue] - The default value to use if input is empty.
|
|
242
|
+
* @returns {Promise<string>} The user input.
|
|
243
|
+
*/
|
|
244
|
+
async function askRequiredString(promptText, defaultValue) {
|
|
245
|
+
while (true) {
|
|
246
|
+
const value = await askString(promptText, defaultValue);
|
|
247
|
+
if (value === '\x1b')
|
|
248
|
+
return '\x1b';
|
|
249
|
+
if (value && value.trim())
|
|
250
|
+
return value.trim();
|
|
251
|
+
console.log('This field is required.');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Prompts the user for a cron schedule using interval and time.
|
|
256
|
+
* @param {string} promptText - The prompt text to display.
|
|
257
|
+
* @param {string} defaultValue - The default value to use if input is empty.
|
|
258
|
+
* @returns {Promise<string>} The user input.
|
|
259
|
+
*/
|
|
260
|
+
async function askCronSchedule(promptText, defaultValue) {
|
|
261
|
+
const current = parseCronToDelta(defaultValue);
|
|
262
|
+
// Interval Prompt
|
|
263
|
+
const days = await askNumberWithBounds(' Interval (days)', current.days, 1, 31);
|
|
264
|
+
if (days === '\x1b')
|
|
265
|
+
return '\x1b';
|
|
266
|
+
// Time Prompt
|
|
267
|
+
let time = current.time;
|
|
268
|
+
while (true) {
|
|
269
|
+
const rawTime = await askString(' Time (HH:mm)', current.time);
|
|
270
|
+
if (rawTime === '\x1b')
|
|
271
|
+
return '\x1b';
|
|
272
|
+
if (/^([01]\d|2[0-3]):([0-5]\d)$/.test(rawTime)) {
|
|
273
|
+
time = rawTime;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
console.log(' Invalid time format. Use HH:mm (24h)');
|
|
277
|
+
}
|
|
278
|
+
return deltaToCron(days, time);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Prompts the user for a branch and validates it.
|
|
282
|
+
* @param {string} promptText - The prompt text to display.
|
|
283
|
+
* @param {string} defaultValue - The default value to use if input is empty.
|
|
284
|
+
* @returns {Promise<string>} The user input.
|
|
285
|
+
*/
|
|
286
|
+
async function askUpdaterBranch(promptText, defaultValue) {
|
|
287
|
+
const validBranches = ['main', 'dev', 'test', 'auto'];
|
|
288
|
+
while (true) {
|
|
289
|
+
const value = await askString(promptText, defaultValue);
|
|
290
|
+
if (value === '\x1b')
|
|
291
|
+
return '\x1b';
|
|
292
|
+
const lowered = value.toLowerCase().trim();
|
|
293
|
+
if (validBranches.includes(lowered))
|
|
294
|
+
return lowered;
|
|
295
|
+
console.log(`Invalid branch. Please choose from: ${validBranches.join(', ')}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Prompts the user for a log level and validates it.
|
|
300
|
+
* @param {string} promptText - The prompt text to display.
|
|
301
|
+
* @param {string} defaultValue - The default value to use if input is empty.
|
|
302
|
+
* @returns {Promise<string>} The user input.
|
|
303
|
+
*/
|
|
304
|
+
async function askLogLevel(promptText, defaultValue) {
|
|
305
|
+
const validLevels = ['debug', 'info', 'warn', 'error'];
|
|
306
|
+
while (true) {
|
|
307
|
+
console.log(`Available levels: ${validLevels.join(', ')}`);
|
|
308
|
+
const value = await askString(promptText, defaultValue);
|
|
309
|
+
if (value === '\x1b')
|
|
310
|
+
return '\x1b';
|
|
311
|
+
const lowered = value.toLowerCase().trim();
|
|
312
|
+
if (validLevels.includes(lowered))
|
|
313
|
+
return lowered;
|
|
314
|
+
console.log(`Invalid log level. Please choose from: ${validLevels.join(', ')}`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Prompts the user for an asset symbol.
|
|
319
|
+
* @param {string} promptText - The prompt text to display.
|
|
320
|
+
* @param {string} [defaultValue] - The default value to use if input is empty.
|
|
321
|
+
* @returns {Promise<string>} The asset symbol in uppercase.
|
|
322
|
+
*/
|
|
323
|
+
async function askAsset(promptText, defaultValue) {
|
|
324
|
+
while (true) {
|
|
325
|
+
const displayDefault = defaultValue ? String(defaultValue).toUpperCase() : undefined;
|
|
326
|
+
const suffix = displayDefault !== undefined && displayDefault !== null ? ` [${displayDefault}]` : '';
|
|
327
|
+
const answer = await readInput(`${promptText}${suffix}: `);
|
|
328
|
+
if (answer === '\x1b')
|
|
329
|
+
return '\x1b';
|
|
330
|
+
if (!answer) {
|
|
331
|
+
if (displayDefault)
|
|
332
|
+
return displayDefault;
|
|
333
|
+
console.log('Asset name is required.');
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
return answer.toUpperCase().trim();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Prompts the user for Asset B, ensuring it's different from Asset A.
|
|
341
|
+
* @param {string} promptText - The prompt text to display.
|
|
342
|
+
* @param {string} [defaultValue] - The default value to use if input is empty.
|
|
343
|
+
* @param {string} assetA - The symbol of Asset A.
|
|
344
|
+
* @returns {Promise<string>} The asset symbol in uppercase.
|
|
345
|
+
*/
|
|
346
|
+
async function askAssetB(promptText, defaultValue, assetA) {
|
|
347
|
+
while (true) {
|
|
348
|
+
const displayDefault = defaultValue ? String(defaultValue).toUpperCase() : undefined;
|
|
349
|
+
const suffix = displayDefault !== undefined && displayDefault !== null ? ` [${displayDefault}]` : '';
|
|
350
|
+
const answer = await readInput(`${promptText}${suffix}: `);
|
|
351
|
+
if (answer === '\x1b')
|
|
352
|
+
return '\x1b';
|
|
353
|
+
if (!answer) {
|
|
354
|
+
if (displayDefault)
|
|
355
|
+
return displayDefault;
|
|
356
|
+
console.log('Asset name is required.');
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
const assetB = answer.toUpperCase().trim();
|
|
360
|
+
// Validate that Asset B is different from Asset A
|
|
361
|
+
if (assetB === assetA) {
|
|
362
|
+
console.log(`Invalid: Asset B cannot be the same as Asset A (${assetA})`);
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
return assetB;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Prompts the user for a numeric value.
|
|
370
|
+
* @param {string} promptText - The prompt text to display.
|
|
371
|
+
* @param {number} [defaultValue] - The default value to use if input is empty.
|
|
372
|
+
* @returns {Promise<number|string>} The numeric value or '\x1b' if ESC.
|
|
373
|
+
*/
|
|
374
|
+
async function askNumber(promptText, defaultValue) {
|
|
375
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
376
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
377
|
+
if (raw === '\x1b')
|
|
378
|
+
return '\x1b';
|
|
379
|
+
if (raw === '')
|
|
380
|
+
return defaultValue;
|
|
381
|
+
const parsed = Number(raw);
|
|
382
|
+
if (Number.isNaN(parsed)) {
|
|
383
|
+
console.log('Please enter a valid number.');
|
|
384
|
+
return askNumber(promptText, defaultValue);
|
|
385
|
+
}
|
|
386
|
+
// Validate that number is finite (not Infinity, -Infinity, or NaN)
|
|
387
|
+
if (!Number.isFinite(parsed)) {
|
|
388
|
+
console.log('Please enter a valid finite number.');
|
|
389
|
+
return askNumber(promptText, defaultValue);
|
|
390
|
+
}
|
|
391
|
+
return parsed;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Prompts the user for a weight distribution value with a legend.
|
|
395
|
+
* @param {string} promptText - The prompt text to display.
|
|
396
|
+
* @param {number} [defaultValue] - The default value to use if input is empty.
|
|
397
|
+
* @returns {Promise<number|string>} The numeric value or '\x1b' if ESC.
|
|
398
|
+
*/
|
|
399
|
+
async function askWeightDistribution(promptText, defaultValue) {
|
|
400
|
+
const MIN_WEIGHT = -1;
|
|
401
|
+
const MAX_WEIGHT = 2;
|
|
402
|
+
console.log(' \x1b[38;5;45m-1=SuperValley\x1b[0m ←→ \x1b[38;5;39m0=Valley\x1b[0m ←→ \x1b[38;5;250m0.5=Neutral\x1b[0m ←→ \x1b[38;5;208m1=Mountain\x1b[0m ←→ \x1b[38;5;196m2=SuperMountain\x1b[0m');
|
|
403
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
404
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
405
|
+
if (raw === '\x1b')
|
|
406
|
+
return '\x1b';
|
|
407
|
+
if (raw === '')
|
|
408
|
+
return defaultValue;
|
|
409
|
+
const parsed = Number(raw);
|
|
410
|
+
if (Number.isNaN(parsed)) {
|
|
411
|
+
console.log('Please enter a valid number.');
|
|
412
|
+
return askWeightDistribution(promptText, defaultValue);
|
|
413
|
+
}
|
|
414
|
+
if (parsed < MIN_WEIGHT || parsed > MAX_WEIGHT) {
|
|
415
|
+
console.log(`Weight distribution must be between ${MIN_WEIGHT} and ${MAX_WEIGHT}.`);
|
|
416
|
+
return askWeightDistribution(promptText, defaultValue);
|
|
417
|
+
}
|
|
418
|
+
return parsed;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Prompts the user for a weight distribution value without a legend.
|
|
422
|
+
* @param {string} promptText - The prompt text to display.
|
|
423
|
+
* @param {number} [defaultValue] - The default value to use if input is empty.
|
|
424
|
+
* @returns {Promise<number|string>} The numeric value or '\x1b' if ESC.
|
|
425
|
+
*/
|
|
426
|
+
async function askWeightDistributionNoLegend(promptText, defaultValue) {
|
|
427
|
+
const MIN_WEIGHT = -1;
|
|
428
|
+
const MAX_WEIGHT = 2;
|
|
429
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
430
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
431
|
+
if (raw === '\x1b')
|
|
432
|
+
return '\x1b';
|
|
433
|
+
if (raw === '')
|
|
434
|
+
return defaultValue;
|
|
435
|
+
const parsed = Number(raw);
|
|
436
|
+
if (Number.isNaN(parsed)) {
|
|
437
|
+
console.log('Please enter a valid number.');
|
|
438
|
+
return askWeightDistributionNoLegend(promptText, defaultValue);
|
|
439
|
+
}
|
|
440
|
+
if (parsed < MIN_WEIGHT || parsed > MAX_WEIGHT) {
|
|
441
|
+
console.log(`Weight distribution must be between ${MIN_WEIGHT} and ${MAX_WEIGHT}.`);
|
|
442
|
+
return askWeightDistributionNoLegend(promptText, defaultValue);
|
|
443
|
+
}
|
|
444
|
+
return parsed;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Checks if a value is a multiplier string (e.g. "3x").
|
|
448
|
+
* @param {*} value - The value to check.
|
|
449
|
+
* @returns {boolean} True if it's a multiplier string.
|
|
450
|
+
*/
|
|
451
|
+
function isMultiplierString(value) {
|
|
452
|
+
return typeof value === 'string' && /^[-]*[0-9]+(?:\.[0-9]+)?x[-]*$/i.test(value);
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Validates a cron expression (5 fields).
|
|
456
|
+
* @param {string} cron - The cron string to validate.
|
|
457
|
+
* @returns {boolean} True if valid.
|
|
458
|
+
*/
|
|
459
|
+
function isValidCron(cron) {
|
|
460
|
+
const cronRegex = /^((\*(\/\d+)?)|(\d+(-\d+)?(,\d+(-\d+)?)*))( ((\*(\/\d+)?)|(\d+(-\d+)?(,\d+(-\d+)?)*))){4}$/;
|
|
461
|
+
return cronRegex.test(cron.trim());
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Converts a cron string to a readable format (days delta and time).
|
|
465
|
+
* Only supports simple daily/multi-day patterns like "0 0 * /N * *".
|
|
466
|
+
* @param {string} cron
|
|
467
|
+
* @returns {Object} { days, time }
|
|
468
|
+
*/
|
|
469
|
+
function parseCronToDelta(cron) {
|
|
470
|
+
const parts = cron.trim().split(/\s+/);
|
|
471
|
+
if (parts.length !== 5)
|
|
472
|
+
return { days: 1, time: '00:00' };
|
|
473
|
+
const min = parts[0].padStart(2, '0');
|
|
474
|
+
const hour = parts[1].padStart(2, '0');
|
|
475
|
+
let days = 1;
|
|
476
|
+
if (parts[2].startsWith('*/')) {
|
|
477
|
+
days = parseInt(parts[2].substring(2)) || 1;
|
|
478
|
+
}
|
|
479
|
+
else if (parts[2] === '*') {
|
|
480
|
+
days = 1;
|
|
481
|
+
}
|
|
482
|
+
return { days, time: `${hour}:${min}` };
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Converts days delta and time to a cron string.
|
|
486
|
+
* @param {number} days
|
|
487
|
+
* @param {string} time - format "HH:mm"
|
|
488
|
+
* @returns {string} cron string
|
|
489
|
+
*/
|
|
490
|
+
function deltaToCron(days, time) {
|
|
491
|
+
const [hour, min] = time.split(':').map((s) => parseInt(s));
|
|
492
|
+
const dayPart = days > 1 ? `*/${days}` : '*';
|
|
493
|
+
return `${min} ${hour} ${dayPart} * *`;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Prompts the user for a number within specified bounds.
|
|
497
|
+
* @param {string} promptText - The prompt text to display.
|
|
498
|
+
* @param {number} [defaultValue] - The default value to use if input is empty.
|
|
499
|
+
* @param {number} minVal - The minimum allowed value.
|
|
500
|
+
* @param {number} maxVal - The maximum allowed value.
|
|
501
|
+
* @returns {Promise<number|string>} The numeric value or '\x1b' if ESC.
|
|
502
|
+
*/
|
|
503
|
+
async function askNumberWithBounds(promptText, defaultValue, minVal = 0, maxVal = 100) {
|
|
504
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
505
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
506
|
+
if (raw === '\x1b')
|
|
507
|
+
return '\x1b';
|
|
508
|
+
if (raw === '')
|
|
509
|
+
return defaultValue;
|
|
510
|
+
const parsed = Number(raw);
|
|
511
|
+
if (Number.isNaN(parsed)) {
|
|
512
|
+
console.log('Please enter a valid number.');
|
|
513
|
+
return askNumberWithBounds(promptText, defaultValue, minVal, maxVal);
|
|
514
|
+
}
|
|
515
|
+
// Validate that number is finite (not Infinity, -Infinity, or NaN)
|
|
516
|
+
if (!Number.isFinite(parsed)) {
|
|
517
|
+
console.log('Please enter a valid finite number.');
|
|
518
|
+
return askNumberWithBounds(promptText, defaultValue, minVal, maxVal);
|
|
519
|
+
}
|
|
520
|
+
// Validate bounds
|
|
521
|
+
if (parsed < minVal) {
|
|
522
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be >= ${minVal}`);
|
|
523
|
+
return askNumberWithBounds(promptText, defaultValue, minVal, maxVal);
|
|
524
|
+
}
|
|
525
|
+
if (parsed > maxVal) {
|
|
526
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be <= ${maxVal}`);
|
|
527
|
+
return askNumberWithBounds(promptText, defaultValue, minVal, maxVal);
|
|
528
|
+
}
|
|
529
|
+
return parsed;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Prompts the user for the target spread percentage.
|
|
533
|
+
* @param {string} promptText - The prompt text to display.
|
|
534
|
+
* @param {number} [defaultValue] - The default value to use if input is empty.
|
|
535
|
+
* @param {number} incrementPercent - The grid increment percentage.
|
|
536
|
+
* @param {number} minSpreadFactor - The minimum spread factor from GRID_LIMITS.
|
|
537
|
+
* @returns {Promise<number|string>} The spread percentage or '\x1b' if ESC.
|
|
538
|
+
*/
|
|
539
|
+
async function askTargetSpreadPercent(promptText, defaultValue, incrementPercent = 0, minSpreadFactor = 2.1) {
|
|
540
|
+
const safeIncrement = Number.isFinite(incrementPercent) ? incrementPercent : 0;
|
|
541
|
+
const safeMinSpreadFactor = Number.isFinite(minSpreadFactor) ? minSpreadFactor : 2.1;
|
|
542
|
+
const minRequired = safeIncrement * safeMinSpreadFactor;
|
|
543
|
+
const minRequiredLabel = minRequired.toFixed(6);
|
|
544
|
+
const effectiveDefault = Number.isFinite(defaultValue) ? Math.max(defaultValue, minRequired) : defaultValue;
|
|
545
|
+
const suffix = effectiveDefault !== undefined && effectiveDefault !== null ? ` [${effectiveDefault.toFixed(2)}]` : '';
|
|
546
|
+
const raw = (await readInput(`${promptText} (>= ${minRequiredLabel})${suffix}: `)).trim();
|
|
547
|
+
if (raw === '\x1b')
|
|
548
|
+
return '\x1b';
|
|
549
|
+
if (raw === '')
|
|
550
|
+
return effectiveDefault;
|
|
551
|
+
const parsed = Number(raw);
|
|
552
|
+
if (Number.isNaN(parsed)) {
|
|
553
|
+
console.log('Please enter a valid number.');
|
|
554
|
+
return askTargetSpreadPercent(promptText, defaultValue, incrementPercent, minSpreadFactor);
|
|
555
|
+
}
|
|
556
|
+
// Validate that number is finite (not Infinity, -Infinity, or NaN)
|
|
557
|
+
if (!Number.isFinite(parsed)) {
|
|
558
|
+
console.log('Please enter a valid finite number.');
|
|
559
|
+
return askTargetSpreadPercent(promptText, defaultValue, incrementPercent, minSpreadFactor);
|
|
560
|
+
}
|
|
561
|
+
// Validate >= minSpreadFactor x incrementPercent (with floating point precision handling)
|
|
562
|
+
if (parsed + Number.EPSILON < minRequired) {
|
|
563
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be >= ${safeMinSpreadFactor}x incrementPercent (${minRequiredLabel})`);
|
|
564
|
+
return askTargetSpreadPercent(promptText, defaultValue, incrementPercent, minSpreadFactor);
|
|
565
|
+
}
|
|
566
|
+
// Validate no negative
|
|
567
|
+
if (parsed < 0) {
|
|
568
|
+
console.log(`Invalid ${promptText}: ${parsed}. Cannot be negative`);
|
|
569
|
+
return askTargetSpreadPercent(promptText, defaultValue, incrementPercent, minSpreadFactor);
|
|
570
|
+
}
|
|
571
|
+
return parsed;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Prompts the user for an integer within a range.
|
|
575
|
+
* @param {string} promptText - The prompt text to display.
|
|
576
|
+
* @param {number} [defaultValue] - The default value to use if input is empty.
|
|
577
|
+
* @param {number} minVal - The minimum allowed value.
|
|
578
|
+
* @param {number} maxVal - The maximum allowed value.
|
|
579
|
+
* @returns {Promise<number|string>} The integer or '\x1b' if ESC.
|
|
580
|
+
*/
|
|
581
|
+
async function askIntegerInRange(promptText, defaultValue, minVal = 0, maxVal = 100) {
|
|
582
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
583
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
584
|
+
if (raw === '\x1b')
|
|
585
|
+
return '\x1b';
|
|
586
|
+
if (raw === '')
|
|
587
|
+
return defaultValue;
|
|
588
|
+
const parsed = Number(raw);
|
|
589
|
+
if (Number.isNaN(parsed)) {
|
|
590
|
+
console.log('Please enter a valid number.');
|
|
591
|
+
return askIntegerInRange(promptText, defaultValue, minVal, maxVal);
|
|
592
|
+
}
|
|
593
|
+
// Validate that number is integer (not float)
|
|
594
|
+
if (!Number.isInteger(parsed)) {
|
|
595
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be an integer (no decimals)`);
|
|
596
|
+
return askIntegerInRange(promptText, defaultValue, minVal, maxVal);
|
|
597
|
+
}
|
|
598
|
+
// Validate bounds
|
|
599
|
+
if (parsed < minVal || parsed > maxVal) {
|
|
600
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be between ${minVal} and ${maxVal}`);
|
|
601
|
+
return askIntegerInRange(promptText, defaultValue, minVal, maxVal);
|
|
602
|
+
}
|
|
603
|
+
return parsed;
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Prompts the user for a numeric value or a multiplier.
|
|
607
|
+
* @param {string} promptText - The prompt text to display.
|
|
608
|
+
* @param {number|string} [defaultValue] - The default value to use if input is empty.
|
|
609
|
+
* @returns {Promise<number|string>} The value or '\x1b' if ESC.
|
|
610
|
+
*/
|
|
611
|
+
async function askNumberOrMultiplier(promptText, defaultValue) {
|
|
612
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
613
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
614
|
+
if (raw === '\x1b')
|
|
615
|
+
return '\x1b';
|
|
616
|
+
if (raw === '')
|
|
617
|
+
return defaultValue;
|
|
618
|
+
if (isMultiplierString(raw)) {
|
|
619
|
+
const trimmed = raw.trim();
|
|
620
|
+
const multiplier = parseFloat(trimmed);
|
|
621
|
+
if (multiplier <= 0) {
|
|
622
|
+
console.log(`Invalid ${promptText}: "${trimmed}". Multiplier must be > 0. No "0x" or negative values`);
|
|
623
|
+
return askNumberOrMultiplier(promptText, defaultValue);
|
|
624
|
+
}
|
|
625
|
+
return trimmed;
|
|
626
|
+
}
|
|
627
|
+
const parsed = Number(raw);
|
|
628
|
+
if (Number.isNaN(parsed)) {
|
|
629
|
+
console.log('Please enter a valid number or multiplier (e.g. 5x).');
|
|
630
|
+
return askNumberOrMultiplier(promptText, defaultValue);
|
|
631
|
+
}
|
|
632
|
+
// Validate that number is > 0 (for price inputs)
|
|
633
|
+
if (parsed <= 0) {
|
|
634
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be > 0 (positive number)`);
|
|
635
|
+
return askNumberOrMultiplier(promptText, defaultValue);
|
|
636
|
+
}
|
|
637
|
+
return parsed;
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Prompts the user for the maximum price, ensuring it's greater than minimum price.
|
|
641
|
+
* @param {string} promptText - The prompt text to display.
|
|
642
|
+
* @param {number|string} [defaultValue] - The default value to use if input is empty.
|
|
643
|
+
* @param {number|string} minPrice - The minimum price.
|
|
644
|
+
* @returns {Promise<number|string>} The value or '\x1b' if ESC.
|
|
645
|
+
*/
|
|
646
|
+
async function askMaxPrice(promptText, defaultValue, minPrice) {
|
|
647
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
648
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
649
|
+
if (raw === '\x1b')
|
|
650
|
+
return '\x1b';
|
|
651
|
+
if (raw === '')
|
|
652
|
+
return defaultValue;
|
|
653
|
+
if (isMultiplierString(raw)) {
|
|
654
|
+
const trimmed = raw.trim();
|
|
655
|
+
const multiplier = parseFloat(trimmed);
|
|
656
|
+
if (multiplier <= 0) {
|
|
657
|
+
console.log(`Invalid ${promptText}: "${trimmed}". Multiplier must be > 0. No "0x" or negative values`);
|
|
658
|
+
return askMaxPrice(promptText, defaultValue, minPrice);
|
|
659
|
+
}
|
|
660
|
+
return trimmed;
|
|
661
|
+
}
|
|
662
|
+
const parsed = Number(raw);
|
|
663
|
+
if (Number.isNaN(parsed)) {
|
|
664
|
+
console.log('Please enter a valid number or multiplier (e.g. 5x).');
|
|
665
|
+
return askMaxPrice(promptText, defaultValue, minPrice);
|
|
666
|
+
}
|
|
667
|
+
// Validate that number is > 0 (for price inputs)
|
|
668
|
+
if (parsed <= 0) {
|
|
669
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be > 0 (positive number)`);
|
|
670
|
+
return askMaxPrice(promptText, defaultValue, minPrice);
|
|
671
|
+
}
|
|
672
|
+
// Validate that maxPrice > minPrice
|
|
673
|
+
const minPriceValue = typeof minPrice === 'string' ? parseFloat(minPrice) : minPrice;
|
|
674
|
+
if (parsed <= minPriceValue) {
|
|
675
|
+
console.log(`Invalid ${promptText}: ${parsed}. Must be > minPrice (${minPriceValue})`);
|
|
676
|
+
return askMaxPrice(promptText, defaultValue, minPrice);
|
|
677
|
+
}
|
|
678
|
+
return parsed;
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* Normalizes a percentage string input.
|
|
682
|
+
* @param {string} value - The input string.
|
|
683
|
+
* @returns {string|null} The normalized percentage string or null if invalid.
|
|
684
|
+
*/
|
|
685
|
+
function normalizePercentageInput(value) {
|
|
686
|
+
if (typeof value !== 'string')
|
|
687
|
+
return null;
|
|
688
|
+
const trimmed = value.trim();
|
|
689
|
+
if (!trimmed.endsWith('%'))
|
|
690
|
+
return null;
|
|
691
|
+
const numeric = Number(trimmed.slice(0, -1).trim());
|
|
692
|
+
if (Number.isNaN(numeric))
|
|
693
|
+
return null;
|
|
694
|
+
return `${numeric}%`;
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* Prompts the user for a numeric value or a percentage.
|
|
698
|
+
* @param {string} promptText - The prompt text to display.
|
|
699
|
+
* @param {number|string} [defaultValue] - The default value to use if input is empty.
|
|
700
|
+
* @returns {Promise<number|string>} The value or '\x1b' if ESC.
|
|
701
|
+
*/
|
|
702
|
+
async function askNumberOrPercentage(promptText, defaultValue) {
|
|
703
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
704
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
705
|
+
if (raw === '\x1b')
|
|
706
|
+
return '\x1b';
|
|
707
|
+
if (raw === '')
|
|
708
|
+
return defaultValue;
|
|
709
|
+
const percent = normalizePercentageInput(raw);
|
|
710
|
+
if (percent !== null)
|
|
711
|
+
return percent;
|
|
712
|
+
const parsed = Number(raw);
|
|
713
|
+
if (Number.isNaN(parsed)) {
|
|
714
|
+
console.log('Please enter a valid number or percentage (e.g. 100, 50%).');
|
|
715
|
+
return askNumberOrPercentage(promptText, defaultValue);
|
|
716
|
+
}
|
|
717
|
+
return parsed;
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* Prompts the user for a boolean value (Y/n).
|
|
721
|
+
* @param {string} promptText - The prompt text to display.
|
|
722
|
+
* @param {boolean} [defaultValue] - The default value to use if input is empty.
|
|
723
|
+
* @returns {Promise<boolean|string>} The boolean value or '\x1b' if ESC.
|
|
724
|
+
*/
|
|
725
|
+
async function askBoolean(promptText, defaultValue) {
|
|
726
|
+
const label = defaultValue ? 'Y/n' : 'y/N';
|
|
727
|
+
const raw = (await readInput(`${promptText} (${label}): `)).trim().toLowerCase();
|
|
728
|
+
if (raw === '\x1b')
|
|
729
|
+
return '\x1b';
|
|
730
|
+
if (!raw)
|
|
731
|
+
return !!defaultValue;
|
|
732
|
+
return raw.startsWith('y');
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Prompts the user for the start price (numeric or "pool"/"book").
|
|
736
|
+
* @param {string} promptText - The prompt text to display.
|
|
737
|
+
* @param {number|string} [defaultValue] - The default value to use if input is empty.
|
|
738
|
+
* @returns {Promise<number|string>} The start price or '\x1b' if ESC.
|
|
739
|
+
*/
|
|
740
|
+
async function askStartPrice(promptText, defaultValue) {
|
|
741
|
+
while (true) {
|
|
742
|
+
const suffix = defaultValue !== undefined && defaultValue !== null ? ` [${defaultValue}]` : '';
|
|
743
|
+
const raw = (await readInput(`${promptText}${suffix}: `)).trim();
|
|
744
|
+
if (raw === '\x1b')
|
|
745
|
+
return '\x1b';
|
|
746
|
+
if (!raw) {
|
|
747
|
+
if (defaultValue !== undefined && defaultValue !== null) {
|
|
748
|
+
return defaultValue;
|
|
749
|
+
}
|
|
750
|
+
return undefined;
|
|
751
|
+
}
|
|
752
|
+
const lower = raw.toLowerCase();
|
|
753
|
+
if (lower === 'pool')
|
|
754
|
+
return lower;
|
|
755
|
+
if (lower === 'book')
|
|
756
|
+
return 'book';
|
|
757
|
+
// Accept numeric values (including decimals)
|
|
758
|
+
const num = Number(raw);
|
|
759
|
+
if (!Number.isNaN(num) && Number.isFinite(num)) {
|
|
760
|
+
return num;
|
|
761
|
+
}
|
|
762
|
+
console.log('Please enter "pool", "book", or a numeric value.');
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
/**
|
|
766
|
+
* Prompts the user for the grid price mode (pool, book, ama, numeric, or startprice).
|
|
767
|
+
* @param {string} promptText - The prompt text to display.
|
|
768
|
+
* @param {string} [defaultValue] - The default value to use if input is empty.
|
|
769
|
+
* @returns {Promise<string>} The grid price mode or '\x1b' if ESC.
|
|
770
|
+
*/
|
|
771
|
+
async function askGridPriceMode(promptText, defaultValue) {
|
|
772
|
+
while (true) {
|
|
773
|
+
const shownDefault = defaultValue === null || defaultValue === undefined ? 'startPrice' : defaultValue;
|
|
774
|
+
const raw = (await readInput(`${promptText} [${shownDefault}]: `)).trim();
|
|
775
|
+
if (raw === '\x1b')
|
|
776
|
+
return '\x1b';
|
|
777
|
+
if (!raw)
|
|
778
|
+
return defaultValue === undefined ? null : defaultValue;
|
|
779
|
+
const lower = raw.toLowerCase();
|
|
780
|
+
if (lower === 'none' || lower === 'null' || lower === 'start' || lower === 'startprice')
|
|
781
|
+
return null;
|
|
782
|
+
if (lower === 'pool')
|
|
783
|
+
return lower;
|
|
784
|
+
if (lower === 'book')
|
|
785
|
+
return 'book';
|
|
786
|
+
if (/^ama(?:[1-4])?$/.test(lower))
|
|
787
|
+
return lower;
|
|
788
|
+
const num = Number(raw);
|
|
789
|
+
if (Number.isFinite(num) && num > 0)
|
|
790
|
+
return num;
|
|
791
|
+
console.log('Please enter: pool, book, ama, ama1..ama4, a positive number, or none/startprice.');
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
/**
|
|
795
|
+
* Normalizes a bot draft for editing or saving.
|
|
796
|
+
* Preserves existing fields and strips unsupported runtime-managed fields.
|
|
797
|
+
* @param {Object} [base={}] - The initial bot data to edit.
|
|
798
|
+
* @returns {Object} A normalized bot draft.
|
|
799
|
+
*/
|
|
800
|
+
function normalizeBotDraft(base = {}) {
|
|
801
|
+
const data = JSON.parse(JSON.stringify(base));
|
|
802
|
+
if (!data.weightDistribution)
|
|
803
|
+
data.weightDistribution = { ...DEFAULT_CONFIG.weightDistribution };
|
|
804
|
+
if (!data.botFunds)
|
|
805
|
+
data.botFunds = { ...DEFAULT_CONFIG.botFunds };
|
|
806
|
+
if (!data.activeOrders)
|
|
807
|
+
data.activeOrders = { ...DEFAULT_CONFIG.activeOrders };
|
|
808
|
+
if (data.active === undefined)
|
|
809
|
+
data.active = DEFAULT_CONFIG.active;
|
|
810
|
+
if (data.dryRun === undefined)
|
|
811
|
+
data.dryRun = DEFAULT_CONFIG.dryRun;
|
|
812
|
+
if (data.minPrice === undefined)
|
|
813
|
+
data.minPrice = DEFAULT_CONFIG.minPrice;
|
|
814
|
+
if (data.maxPrice === undefined)
|
|
815
|
+
data.maxPrice = DEFAULT_CONFIG.maxPrice;
|
|
816
|
+
if (data.incrementPercent === undefined)
|
|
817
|
+
data.incrementPercent = DEFAULT_CONFIG.incrementPercent;
|
|
818
|
+
if (data.targetSpreadPercent === undefined)
|
|
819
|
+
data.targetSpreadPercent = DEFAULT_CONFIG.targetSpreadPercent;
|
|
820
|
+
if (data.startPrice === undefined)
|
|
821
|
+
data.startPrice = data.startPrice || DEFAULT_CONFIG.startPrice || 'pool';
|
|
822
|
+
if (data.gridPrice === undefined)
|
|
823
|
+
data.gridPrice = null;
|
|
824
|
+
delete data.gridPriceOffsetPct;
|
|
825
|
+
delete data.gridPriceOffsetClampToBounds;
|
|
826
|
+
return data;
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* Interactive menu to edit bot data.
|
|
830
|
+
* @param {Object} [base={}] - The initial bot data to edit.
|
|
831
|
+
* @returns {Promise<Object|null>} The edited bot data or null if cancelled.
|
|
832
|
+
*/
|
|
833
|
+
async function promptBotData(base = {}) {
|
|
834
|
+
const data = normalizeBotDraft(base);
|
|
835
|
+
let finished = false;
|
|
836
|
+
let cancelled = false;
|
|
837
|
+
let showMenu = true;
|
|
838
|
+
while (!finished) {
|
|
839
|
+
if (showMenu) {
|
|
840
|
+
console.log('\n\x1b[1m--- Bot Editor: ' + (data.name || 'New Bot') + ' ---\x1b[0m');
|
|
841
|
+
console.log(`\x1b[1;33m1) Pair:\x1b[0m \x1b[1;31m${data.assetA || '?'} / ${data.assetB || '?'} \x1b[0m`);
|
|
842
|
+
console.log(`\x1b[1;33m2) Identity:\x1b[0m \x1b[38;5;208mName:\x1b[0m ${data.name || '?'} , \x1b[38;5;208mAccount:\x1b[0m ${data.preferredAccount || '?'} , \x1b[38;5;208mActive:\x1b[0m ${data.active}, \x1b[38;5;208mDryRun:\x1b[0m ${data.dryRun}`);
|
|
843
|
+
console.log(`\x1b[1;33m3) Price:\x1b[0m \x1b[38;5;208mRange:\x1b[0m [${data.minPrice} - ${data.maxPrice}], \x1b[38;5;208mStart:\x1b[0m ${data.startPrice}, \x1b[38;5;208mGrid:\x1b[0m ${data.gridPrice === null ? 'startPrice' : data.gridPrice}`);
|
|
844
|
+
console.log(`\x1b[1;33m4) Grid:\x1b[0m \x1b[38;5;208mWeights:\x1b[0m (S:${data.weightDistribution.sell}, B:${data.weightDistribution.buy}), \x1b[38;5;208mIncr:\x1b[0m ${data.incrementPercent}%, \x1b[38;5;208mSpread:\x1b[0m ${data.targetSpreadPercent}%`);
|
|
845
|
+
console.log(`\x1b[1;33m5) Funding:\x1b[0m \x1b[38;5;208mSell:\x1b[0m ${data.botFunds.sell}, \x1b[38;5;208mBuy:\x1b[0m ${data.botFunds.buy} | \x1b[38;5;208mOrders:\x1b[0m (S:${data.activeOrders.sell}, B:${data.activeOrders.buy})`);
|
|
846
|
+
console.log('--------------------------------------------------');
|
|
847
|
+
console.log('\x1b[1;32mS) Save & Exit\x1b[0m');
|
|
848
|
+
console.log('\x1b[97mC) Cancel (Discard changes)\x1b[0m');
|
|
849
|
+
showMenu = false;
|
|
850
|
+
}
|
|
851
|
+
const choice = (await readInput('Select section to edit or action: ', {
|
|
852
|
+
validate: (input) => ['1', '2', '3', '4', '5', 's', 'c'].includes(input.toLowerCase())
|
|
853
|
+
})).trim().toLowerCase();
|
|
854
|
+
if (choice === '\x1b') {
|
|
855
|
+
finished = true;
|
|
856
|
+
cancelled = true;
|
|
857
|
+
break;
|
|
858
|
+
}
|
|
859
|
+
switch (choice) {
|
|
860
|
+
case '1':
|
|
861
|
+
const assetA = await askAsset('Asset A for selling', data.assetA);
|
|
862
|
+
if (assetA === '\x1b')
|
|
863
|
+
break;
|
|
864
|
+
const assetB = await askAssetB('Asset B for buying', data.assetB, assetA);
|
|
865
|
+
if (assetB === '\x1b')
|
|
866
|
+
break;
|
|
867
|
+
data.assetA = assetA;
|
|
868
|
+
data.assetB = assetB;
|
|
869
|
+
showMenu = true;
|
|
870
|
+
break;
|
|
871
|
+
case '2':
|
|
872
|
+
const name = await askRequiredString('Bot name', data.name);
|
|
873
|
+
if (name === '\x1b')
|
|
874
|
+
break;
|
|
875
|
+
const prefAcc = await askRequiredString('Preferred account', data.preferredAccount);
|
|
876
|
+
if (prefAcc === '\x1b')
|
|
877
|
+
break;
|
|
878
|
+
const active = await askBoolean('Active', data.active);
|
|
879
|
+
if (active === '\x1b')
|
|
880
|
+
break;
|
|
881
|
+
const dryRun = await askBoolean('Dry run', data.dryRun);
|
|
882
|
+
if (dryRun === '\x1b')
|
|
883
|
+
break;
|
|
884
|
+
data.name = name;
|
|
885
|
+
data.preferredAccount = prefAcc;
|
|
886
|
+
data.active = active;
|
|
887
|
+
data.dryRun = dryRun;
|
|
888
|
+
showMenu = true;
|
|
889
|
+
break;
|
|
890
|
+
case '3':
|
|
891
|
+
const minP = await askNumberOrMultiplier('minPrice', data.minPrice);
|
|
892
|
+
if (minP === '\x1b')
|
|
893
|
+
break;
|
|
894
|
+
const maxP = await askMaxPrice('maxPrice', data.maxPrice, minP);
|
|
895
|
+
if (maxP === '\x1b')
|
|
896
|
+
break;
|
|
897
|
+
const startP = await askStartPrice('startPrice (pool, book or A/B)', data.startPrice);
|
|
898
|
+
if (startP === '\x1b')
|
|
899
|
+
break;
|
|
900
|
+
const gp = await askGridPriceMode('gridPrice (pool/book/ama/number/none)', data.gridPrice);
|
|
901
|
+
if (gp === '\x1b')
|
|
902
|
+
break;
|
|
903
|
+
data.minPrice = minP;
|
|
904
|
+
data.maxPrice = maxP;
|
|
905
|
+
data.startPrice = startP;
|
|
906
|
+
data.gridPrice = gp;
|
|
907
|
+
showMenu = true;
|
|
908
|
+
break;
|
|
909
|
+
case '4':
|
|
910
|
+
const wSell = await askWeightDistribution('Weight distribution (sell)', data.weightDistribution.sell);
|
|
911
|
+
if (wSell === '\x1b')
|
|
912
|
+
break;
|
|
913
|
+
const wBuy = await askWeightDistributionNoLegend('Weight distribution (buy)', data.weightDistribution.buy);
|
|
914
|
+
if (wBuy === '\x1b')
|
|
915
|
+
break;
|
|
916
|
+
const incrP = await askNumberWithBounds('incrementPercent', data.incrementPercent, 0.01, 10);
|
|
917
|
+
if (incrP === '\x1b')
|
|
918
|
+
break;
|
|
919
|
+
const defaultSpread = data.targetSpreadPercent || incrP * 4;
|
|
920
|
+
// Use current general settings for the validation limit
|
|
921
|
+
const currentSettings = loadGeneralSettings();
|
|
922
|
+
const targetS = await askTargetSpreadPercent('targetSpread %', defaultSpread, incrP, currentSettings.GRID_LIMITS.MIN_SPREAD_FACTOR);
|
|
923
|
+
if (targetS === '\x1b')
|
|
924
|
+
break;
|
|
925
|
+
data.weightDistribution.sell = wSell;
|
|
926
|
+
data.weightDistribution.buy = wBuy;
|
|
927
|
+
data.incrementPercent = incrP;
|
|
928
|
+
data.targetSpreadPercent = targetS;
|
|
929
|
+
showMenu = true;
|
|
930
|
+
break;
|
|
931
|
+
case '5':
|
|
932
|
+
const fSell = await askNumberOrPercentage('botFunds sell amount', data.botFunds.sell);
|
|
933
|
+
if (fSell === '\x1b')
|
|
934
|
+
break;
|
|
935
|
+
const fBuy = await askNumberOrPercentage('botFunds buy amount', data.botFunds.buy);
|
|
936
|
+
if (fBuy === '\x1b')
|
|
937
|
+
break;
|
|
938
|
+
const oSell = await askIntegerInRange('activeOrders sell count', data.activeOrders.sell, 1, 100);
|
|
939
|
+
if (oSell === '\x1b')
|
|
940
|
+
break;
|
|
941
|
+
const oBuy = await askIntegerInRange('activeOrders buy count', data.activeOrders.buy, 1, 100);
|
|
942
|
+
if (oBuy === '\x1b')
|
|
943
|
+
break;
|
|
944
|
+
data.botFunds.sell = fSell;
|
|
945
|
+
data.botFunds.buy = fBuy;
|
|
946
|
+
data.activeOrders.sell = oSell;
|
|
947
|
+
data.activeOrders.buy = oBuy;
|
|
948
|
+
showMenu = true;
|
|
949
|
+
break;
|
|
950
|
+
case 's':
|
|
951
|
+
// Final basic validation before saving
|
|
952
|
+
if (!data.name || !data.assetA || !data.assetB || !data.preferredAccount) {
|
|
953
|
+
console.log('\x1b[38;5;160mError: Name, Pair, and Account are required before saving.\x1b[0m');
|
|
954
|
+
break;
|
|
955
|
+
}
|
|
956
|
+
{
|
|
957
|
+
const currentSettings = loadGeneralSettings();
|
|
958
|
+
const spreadFactor = Number.isFinite(currentSettings.GRID_LIMITS.MIN_SPREAD_FACTOR)
|
|
959
|
+
? currentSettings.GRID_LIMITS.MIN_SPREAD_FACTOR
|
|
960
|
+
: 2.1;
|
|
961
|
+
const minRequiredSpread = data.incrementPercent * spreadFactor;
|
|
962
|
+
if (data.targetSpreadPercent + Number.EPSILON < minRequiredSpread) {
|
|
963
|
+
console.log(`\x1b[38;5;160mError: targetSpreadPercent (${data.targetSpreadPercent}) must be >= ${spreadFactor}x incrementPercent (${minRequiredSpread.toFixed(6)}).\x1b[0m`);
|
|
964
|
+
break;
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
finished = true;
|
|
968
|
+
break;
|
|
969
|
+
case 'c':
|
|
970
|
+
finished = true;
|
|
971
|
+
cancelled = true;
|
|
972
|
+
break;
|
|
973
|
+
default:
|
|
974
|
+
// Invalid choice - just ignore and prompt again without redisplaying menu
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
if (cancelled)
|
|
978
|
+
return null;
|
|
979
|
+
// Return the final data structure
|
|
980
|
+
return {
|
|
981
|
+
name: data.name,
|
|
982
|
+
active: data.active,
|
|
983
|
+
dryRun: data.dryRun,
|
|
984
|
+
preferredAccount: data.preferredAccount,
|
|
985
|
+
assetA: data.assetA,
|
|
986
|
+
assetB: data.assetB,
|
|
987
|
+
startPrice: data.startPrice,
|
|
988
|
+
minPrice: data.minPrice,
|
|
989
|
+
maxPrice: data.maxPrice,
|
|
990
|
+
incrementPercent: data.incrementPercent,
|
|
991
|
+
targetSpreadPercent: data.targetSpreadPercent,
|
|
992
|
+
weightDistribution: data.weightDistribution,
|
|
993
|
+
botFunds: data.botFunds,
|
|
994
|
+
activeOrders: data.activeOrders,
|
|
995
|
+
gridPrice: data.gridPrice,
|
|
996
|
+
debtPolicy: data.debtPolicy,
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
/**
|
|
1000
|
+
* Interactive menu to edit general settings.
|
|
1001
|
+
* @returns {Promise<void>}
|
|
1002
|
+
*/
|
|
1003
|
+
async function promptGeneralSettings() {
|
|
1004
|
+
const settings = loadGeneralSettings();
|
|
1005
|
+
let finished = false;
|
|
1006
|
+
while (!finished) {
|
|
1007
|
+
console.log('\x1b[1m--- General Settings (Global) ---\x1b[0m');
|
|
1008
|
+
console.log(`\x1b[1;33m1) Grid Health:\x1b[0m \x1b[38;5;208mRatio:\x1b[0m ${settings.GRID_LIMITS.GRID_REGENERATION_PERCENTAGE}%, \x1b[38;5;208mRMS:\x1b[0m ${settings.GRID_LIMITS.GRID_COMPARISON.RMS_PERCENTAGE}%, \x1b[38;5;208mAMA Delta:\x1b[0m ${settings.MARKET_ADAPTER.AMA_DELTA_THRESHOLD_PERCENT}%`);
|
|
1009
|
+
console.log(`\x1b[1;33m2) Order Recovery:\x1b[0m \x1b[38;5;208mDust Threshold:\x1b[0m ${settings.GRID_LIMITS.PARTIAL_DUST_THRESHOLD_PERCENTAGE}%`);
|
|
1010
|
+
const nodeCount = (settings.NODES.list || []).length;
|
|
1011
|
+
const hcIntervalMin = ((settings.NODES.healthCheck?.intervalMs || NODE_MANAGEMENT.HEALTH_CHECK_INTERVAL_MS) / 60000).toFixed(0);
|
|
1012
|
+
const prefNodeDisplay = settings.NODES.selection?.preferredNode || 'none';
|
|
1013
|
+
console.log(`\x1b[1;33m3) Node Config:\x1b[0m \x1b[38;5;208mNodes:\x1b[0m ${nodeCount}, \x1b[38;5;208mHealthChk:\x1b[0m ${hcIntervalMin}min, \x1b[38;5;208mPrefNode:\x1b[0m ${prefNodeDisplay}`);
|
|
1014
|
+
console.log(`\x1b[1;33m4) Log lvl:\x1b[0m \x1b[38;5;208m${settings.LOG_LEVEL}\x1b[0m (debug, info, warn, error)`);
|
|
1015
|
+
const updaterStatus = settings.UPDATER.ACTIVE ? `\x1b[92mON\x1b[0m` : `\x1b[38;5;160mOFF\x1b[0m`;
|
|
1016
|
+
const currentSched = parseCronToDelta(settings.UPDATER.SCHEDULE || "0 0 * * *");
|
|
1017
|
+
console.log(`\x1b[1;33m5) Updater:\x1b[0m [${updaterStatus}] \x1b[38;5;208mBranch:\x1b[0m ${settings.UPDATER.BRANCH}, \x1b[38;5;208mInterval:\x1b[0m ${currentSched.days}d, \x1b[38;5;208mTime:\x1b[0m ${currentSched.time}`);
|
|
1018
|
+
console.log('--------------------------------------------------');
|
|
1019
|
+
console.log('\x1b[1;32mS) Save & Exit\x1b[0m');
|
|
1020
|
+
console.log('\x1b[97mC) Cancel (Discard changes)\x1b[0m');
|
|
1021
|
+
const choice = (await readInput('Select section to edit or action: ', {
|
|
1022
|
+
validate: (input) => ['1', '2', '3', '4', '5', 's', 'c'].includes(input)
|
|
1023
|
+
})).trim().toLowerCase();
|
|
1024
|
+
if (choice === '\x1b') {
|
|
1025
|
+
finished = true;
|
|
1026
|
+
break;
|
|
1027
|
+
}
|
|
1028
|
+
switch (choice) {
|
|
1029
|
+
case '1':
|
|
1030
|
+
const gRegen = await askNumberWithBounds('Grid Ratio Regeneration %', settings.GRID_LIMITS.GRID_REGENERATION_PERCENTAGE, 0.1, 50);
|
|
1031
|
+
if (gRegen === '\x1b')
|
|
1032
|
+
break;
|
|
1033
|
+
const rms = await askNumberWithBounds('RMS Divergence Threshold %', settings.GRID_LIMITS.GRID_COMPARISON.RMS_PERCENTAGE, 1, 100);
|
|
1034
|
+
if (rms === '\x1b')
|
|
1035
|
+
break;
|
|
1036
|
+
const amaDelta = await askNumberWithBounds('AMA Delta Threshold %', settings.MARKET_ADAPTER.AMA_DELTA_THRESHOLD_PERCENT, 0.1, 50.0);
|
|
1037
|
+
if (amaDelta === '\x1b')
|
|
1038
|
+
break;
|
|
1039
|
+
settings.GRID_LIMITS.GRID_REGENERATION_PERCENTAGE = gRegen;
|
|
1040
|
+
settings.GRID_LIMITS.GRID_COMPARISON.RMS_PERCENTAGE = rms;
|
|
1041
|
+
settings.MARKET_ADAPTER.AMA_DELTA_THRESHOLD_PERCENT = amaDelta;
|
|
1042
|
+
break;
|
|
1043
|
+
case '2':
|
|
1044
|
+
const dust = await askNumberWithBounds('Partial Dust Threshold %', settings.GRID_LIMITS.PARTIAL_DUST_THRESHOLD_PERCENTAGE, 0.1, 50);
|
|
1045
|
+
if (dust === '\x1b')
|
|
1046
|
+
break;
|
|
1047
|
+
settings.GRID_LIMITS.PARTIAL_DUST_THRESHOLD_PERCENTAGE = dust;
|
|
1048
|
+
break;
|
|
1049
|
+
case '3':
|
|
1050
|
+
settings.NODES.enabled = true;
|
|
1051
|
+
{
|
|
1052
|
+
const currentList = settings.NODES.list && settings.NODES.list.length > 0
|
|
1053
|
+
? settings.NODES.list
|
|
1054
|
+
: NODE_MANAGEMENT.DEFAULT_NODES;
|
|
1055
|
+
let nodeList = [...currentList];
|
|
1056
|
+
let editorCancelled = false;
|
|
1057
|
+
while (true) {
|
|
1058
|
+
console.log('\x1b[1m === Node List Editor ===\x1b[0m');
|
|
1059
|
+
nodeList.forEach((node, i) => {
|
|
1060
|
+
console.log(` \x1b[38;5;208m${i + 1})\x1b[0m ${node}`);
|
|
1061
|
+
});
|
|
1062
|
+
console.log(' \x1b[1;32mA) Add node\x1b[0m');
|
|
1063
|
+
console.log(' \x1b[1;31mR) Remove node\x1b[0m');
|
|
1064
|
+
console.log(' \x1b[1;33mD) Done\x1b[0m');
|
|
1065
|
+
const nodeChoice = (await readInput(' Choice: ')).trim().toLowerCase();
|
|
1066
|
+
if (nodeChoice === '\x1b') {
|
|
1067
|
+
editorCancelled = true;
|
|
1068
|
+
break;
|
|
1069
|
+
}
|
|
1070
|
+
if (nodeChoice === 'a') {
|
|
1071
|
+
const newNode = await askString(' Enter node URL');
|
|
1072
|
+
if (newNode === '\x1b')
|
|
1073
|
+
continue;
|
|
1074
|
+
if (newNode && newNode.trim()) {
|
|
1075
|
+
nodeList.push(newNode.trim());
|
|
1076
|
+
console.log(` \x1b[92mAdded.\x1b[0m Count: ${nodeList.length}`);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
else if (nodeChoice === 'r') {
|
|
1080
|
+
if (nodeList.length <= 1) {
|
|
1081
|
+
console.log(' \x1b[33mNeed at least one node. Add another first.\x1b[0m');
|
|
1082
|
+
continue;
|
|
1083
|
+
}
|
|
1084
|
+
const removeIdx = await askIntegerInRange(' Enter node number to remove', 1, 1, nodeList.length);
|
|
1085
|
+
if (removeIdx === '\x1b')
|
|
1086
|
+
continue;
|
|
1087
|
+
const removed = nodeList.splice(removeIdx - 1, 1)[0];
|
|
1088
|
+
console.log(` \x1b[92mRemoved:\x1b[0m ${removed}`);
|
|
1089
|
+
}
|
|
1090
|
+
else if (nodeChoice === 'd') {
|
|
1091
|
+
settings.NODES.list = nodeList;
|
|
1092
|
+
break;
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
if (editorCancelled)
|
|
1096
|
+
break;
|
|
1097
|
+
}
|
|
1098
|
+
const hcInterval = await askIntegerInRange('Health Check Interval (min)', (settings.NODES.healthCheck?.intervalMs || NODE_MANAGEMENT.HEALTH_CHECK_INTERVAL_MS) / 60000, 1, 43200);
|
|
1099
|
+
if (hcInterval === '\x1b')
|
|
1100
|
+
break;
|
|
1101
|
+
if (!settings.NODES.healthCheck)
|
|
1102
|
+
settings.NODES.healthCheck = {};
|
|
1103
|
+
settings.NODES.healthCheck.intervalMs = hcInterval * 60000;
|
|
1104
|
+
const prefNode = await askString('Preferred Node URL (leave empty for automatic selection)', settings.NODES.selection?.preferredNode || '');
|
|
1105
|
+
if (prefNode === '\x1b')
|
|
1106
|
+
break;
|
|
1107
|
+
if (!settings.NODES.selection)
|
|
1108
|
+
settings.NODES.selection = {};
|
|
1109
|
+
settings.NODES.selection.preferredNode = prefNode.trim() || null;
|
|
1110
|
+
break;
|
|
1111
|
+
case '4':
|
|
1112
|
+
const newLevel = await askLogLevel('Enter log level', settings.LOG_LEVEL);
|
|
1113
|
+
if (newLevel === '\x1b')
|
|
1114
|
+
break;
|
|
1115
|
+
settings.LOG_LEVEL = newLevel;
|
|
1116
|
+
break;
|
|
1117
|
+
case '5':
|
|
1118
|
+
const upActive = await askBoolean('Enable Automated Updater', settings.UPDATER.ACTIVE !== false);
|
|
1119
|
+
if (upActive === '\x1b')
|
|
1120
|
+
break;
|
|
1121
|
+
settings.UPDATER.ACTIVE = upActive;
|
|
1122
|
+
console.log(' \x1b[38;5;250mBranch:\x1b[0m \x1b[92mmain\x1b[0m, \x1b[38;5;208mdev\x1b[0m, \x1b[38;5;160mtest\x1b[0m, or \x1b[38;5;39mauto\x1b[0m (detected current)');
|
|
1123
|
+
const branch = await askUpdaterBranch('Branch', settings.UPDATER.BRANCH);
|
|
1124
|
+
if (branch === '\x1b')
|
|
1125
|
+
break;
|
|
1126
|
+
const schedule = await askCronSchedule('Schedule', settings.UPDATER.SCHEDULE);
|
|
1127
|
+
if (schedule === '\x1b')
|
|
1128
|
+
break;
|
|
1129
|
+
settings.UPDATER.BRANCH = branch;
|
|
1130
|
+
settings.UPDATER.SCHEDULE = schedule;
|
|
1131
|
+
break;
|
|
1132
|
+
case 's':
|
|
1133
|
+
saveGeneralSettings(settings);
|
|
1134
|
+
finished = true;
|
|
1135
|
+
break;
|
|
1136
|
+
case 'c':
|
|
1137
|
+
finished = true;
|
|
1138
|
+
break;
|
|
1139
|
+
default:
|
|
1140
|
+
console.log('Invalid choice.');
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
/**
|
|
1145
|
+
* Entry point exposing a menu-driven interface for creating, modifying, and reviewing bots.
|
|
1146
|
+
* @returns {Promise<void>}
|
|
1147
|
+
*/
|
|
1148
|
+
async function main() {
|
|
1149
|
+
console.log('dexbot bots — bots.json configurator (writes profiles/bots.json)');
|
|
1150
|
+
const { config, filePath } = loadBotsConfig();
|
|
1151
|
+
let exit = false;
|
|
1152
|
+
while (!exit) {
|
|
1153
|
+
console.log('\nActions:');
|
|
1154
|
+
console.log(' 1) New bot');
|
|
1155
|
+
console.log(' 2) Modify bot');
|
|
1156
|
+
console.log(' 3) Delete bot');
|
|
1157
|
+
console.log(' 4) Copy bot');
|
|
1158
|
+
console.log(' 5) List bots');
|
|
1159
|
+
console.log(' 6) General settings');
|
|
1160
|
+
console.log(' 7) Exit (or press Enter)');
|
|
1161
|
+
const selection = (await readInput('Choose an action [1-7]: ')).trim();
|
|
1162
|
+
console.log('');
|
|
1163
|
+
if (selection === '\x1b' || selection === '7' || selection === '') {
|
|
1164
|
+
exit = true;
|
|
1165
|
+
continue;
|
|
1166
|
+
}
|
|
1167
|
+
switch (selection) {
|
|
1168
|
+
case '1': {
|
|
1169
|
+
while (true) {
|
|
1170
|
+
try {
|
|
1171
|
+
const entry = await promptBotData();
|
|
1172
|
+
if (!entry)
|
|
1173
|
+
break;
|
|
1174
|
+
config.bots.push(entry);
|
|
1175
|
+
saveBotsConfig(config, filePath);
|
|
1176
|
+
console.log(`\nAdded bot '${entry.name}' to ${path.basename(filePath)}.`);
|
|
1177
|
+
}
|
|
1178
|
+
catch (err) {
|
|
1179
|
+
console.log(`\n❌ Invalid input: ${err.message}\n`);
|
|
1180
|
+
break;
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
break;
|
|
1184
|
+
}
|
|
1185
|
+
case '2': {
|
|
1186
|
+
while (true) {
|
|
1187
|
+
const idx = await selectBotIndex(config.bots, 'modify or leave (Enter/Esc)');
|
|
1188
|
+
if (idx === null || idx === '\x1b')
|
|
1189
|
+
break;
|
|
1190
|
+
try {
|
|
1191
|
+
const entry = await promptBotData(config.bots[idx]);
|
|
1192
|
+
if (entry) {
|
|
1193
|
+
config.bots[idx] = entry;
|
|
1194
|
+
saveBotsConfig(config, filePath);
|
|
1195
|
+
console.log(`saved settings '${entry.name}' in ${path.basename(filePath)}.\n`);
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
catch (err) {
|
|
1199
|
+
console.log(`\n❌ Invalid input: ${err.message}\n`);
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
break;
|
|
1203
|
+
}
|
|
1204
|
+
case '3': {
|
|
1205
|
+
while (true) {
|
|
1206
|
+
const idx = await selectBotIndex(config.bots, 'delete or leave (Enter/Esc)');
|
|
1207
|
+
if (idx === null || idx === '\x1b')
|
|
1208
|
+
break;
|
|
1209
|
+
const placeholderName = config.bots[idx].name || `<unnamed-${idx + 1}>`;
|
|
1210
|
+
const confirm = await askBoolean(`Delete '${placeholderName}'?`, false);
|
|
1211
|
+
if (confirm === '\x1b')
|
|
1212
|
+
break;
|
|
1213
|
+
if (confirm) {
|
|
1214
|
+
const removed = config.bots.splice(idx, 1)[0];
|
|
1215
|
+
saveBotsConfig(config, filePath);
|
|
1216
|
+
console.log(`Removed bot '${removed.name || placeholderName}' from ${path.basename(filePath)}.\n`);
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
console.log('\nDeletion cancelled.');
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
break;
|
|
1223
|
+
}
|
|
1224
|
+
case '4': {
|
|
1225
|
+
while (true) {
|
|
1226
|
+
const idx = await selectBotIndex(config.bots, 'copy or leave (Enter/Esc)');
|
|
1227
|
+
if (idx === null || idx === '\x1b')
|
|
1228
|
+
break;
|
|
1229
|
+
try {
|
|
1230
|
+
const entry = await promptBotData(config.bots[idx]);
|
|
1231
|
+
if (entry) {
|
|
1232
|
+
config.bots.splice(idx + 1, 0, entry);
|
|
1233
|
+
saveBotsConfig(config, filePath);
|
|
1234
|
+
console.log(`Copied bot '${entry.name}' into ${path.basename(filePath)}.\n`);
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
catch (err) {
|
|
1238
|
+
console.log(`\n❌ Invalid input: ${err.message}\n`);
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
break;
|
|
1242
|
+
}
|
|
1243
|
+
case '5':
|
|
1244
|
+
listBots(config.bots);
|
|
1245
|
+
break;
|
|
1246
|
+
case '6':
|
|
1247
|
+
await promptGeneralSettings();
|
|
1248
|
+
break;
|
|
1249
|
+
case '7':
|
|
1250
|
+
exit = true;
|
|
1251
|
+
break;
|
|
1252
|
+
default:
|
|
1253
|
+
console.log('Unknown selection.');
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
console.log('Botmanager closed!');
|
|
1257
|
+
}
|
|
1258
|
+
module.exports = { main, normalizeBotDraft, parseJsonWithComments, parseCronToDelta, deltaToCron };
|
|
1259
|
+
//# sourceMappingURL=account_bots.js.map
|