aria-code 0.52.0__py3-none-any.whl
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.
- aria_code/__init__.py +42 -0
- aria_code/_version.py +20 -0
- aria_code/adk_apps/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/agent.py +32 -0
- aria_code/adk_apps/aria_research/__init__.py +1 -0
- aria_code/adk_apps/aria_research/agent.py +31 -0
- aria_code/agents/__init__.py +34 -0
- aria_code/agents/base.py +318 -0
- aria_code/agents/code_review.py +200 -0
- aria_code/agents/deep/__init__.py +37 -0
- aria_code/agents/deep/calibration_loop.py +144 -0
- aria_code/agents/deep/critic.py +125 -0
- aria_code/agents/deep/deepen.py +193 -0
- aria_code/agents/deep/models.py +149 -0
- aria_code/agents/deep/pipeline.py +164 -0
- aria_code/agents/deep/quant_fusion.py +192 -0
- aria_code/agents/deep/themes.py +95 -0
- aria_code/agents/deep/tiers.py +106 -0
- aria_code/agents/engineering/__init__.py +14 -0
- aria_code/agents/engineering/coder.py +222 -0
- aria_code/agents/engineering/tester.py +145 -0
- aria_code/agents/financial/__init__.py +21 -0
- aria_code/agents/financial/cashflow_burn.py +119 -0
- aria_code/agents/financial/catalyst.py +279 -0
- aria_code/agents/financial/corporate_finance.py +175 -0
- aria_code/agents/financial/debate.py +224 -0
- aria_code/agents/financial/earnings.py +303 -0
- aria_code/agents/financial/fundamental.py +191 -0
- aria_code/agents/financial/macro.py +99 -0
- aria_code/agents/financial/news.py +207 -0
- aria_code/agents/financial/risk.py +165 -0
- aria_code/agents/financial/sector.py +279 -0
- aria_code/agents/financial/strategist.py +121 -0
- aria_code/agents/financial/stripe_revenue.py +127 -0
- aria_code/agents/financial/synthesis.py +274 -0
- aria_code/agents/financial/technical.py +258 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +363 -0
- aria_code/agents/realty/__init__.py +62 -0
- aria_code/agents/realty/asset_diagnosis.py +152 -0
- aria_code/agents/realty/business_match.py +166 -0
- aria_code/agents/realty/cashflow_verify.py +209 -0
- aria_code/agents/realty/contract_rules.py +210 -0
- aria_code/agents/realty/energy_anomaly.py +189 -0
- aria_code/agents/realty/exit_settlement.py +208 -0
- aria_code/agents/realty/fulfillment_risk.py +206 -0
- aria_code/agents/realty/ops_optimize.py +160 -0
- aria_code/agents/realty/revenue_share.py +215 -0
- aria_code/agents/registry.py +158 -0
- aria_code/agents/signal_scheme.py +111 -0
- aria_code/agents/sports/__init__.py +0 -0
- aria_code/agents/sports/football_agent.py +197 -0
- aria_code/agents/supervisor.py +113 -0
- aria_code/agents/team.py +492 -0
- aria_code/agents/warehouse/__init__.py +25 -0
- aria_code/agents/warehouse/contracts.py +26 -0
- aria_code/agents/warehouse/dashboard.py +155 -0
- aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
- aria_code/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code/agents/warehouse/inventory_health.py +24 -0
- aria_code/agents/warehouse/local_run.py +71 -0
- aria_code/agents/warehouse/local_snapshot.py +132 -0
- aria_code/agents/warehouse/logistics_cost.py +84 -0
- aria_code/agents/warehouse/logistics_sync.py +21 -0
- aria_code/agents/warehouse/workflow.py +31 -0
- aria_code/aliyun_data_client.py +4 -0
- aria_code/apps/README.md +12 -0
- aria_code/apps/__init__.py +2 -0
- aria_code/apps/channels/README.md +15 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +95 -0
- aria_code/apps/channels/tradingview.py +94 -0
- aria_code/apps/cli/README.md +13 -0
- aria_code/apps/cli/__init__.py +2 -0
- aria_code/apps/cli/_optional.py +120 -0
- aria_code/apps/cli/bootstrap.py +145 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +16 -0
- aria_code/apps/cli/commands/_business_render.py +78 -0
- aria_code/apps/cli/commands/_ui.py +71 -0
- aria_code/apps/cli/commands/analysis_cmds.py +369 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +239 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
- aria_code/apps/cli/commands/broker_cmds.py +1234 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +87 -0
- aria_code/apps/cli/commands/core_cmds.py +2520 -0
- aria_code/apps/cli/commands/data_cmds.py +457 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/file_cmds.py +312 -0
- aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
- aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
- aria_code/apps/cli/commands/market.py +434 -0
- aria_code/apps/cli/commands/market_cmds.py +1381 -0
- aria_code/apps/cli/commands/market_context.py +425 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2153 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
- aria_code/apps/cli/commands/report.py +437 -0
- aria_code/apps/cli/commands/scaffold_templates.py +617 -0
- aria_code/apps/cli/commands/session_cmds.py +236 -0
- aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
- aria_code/apps/cli/commands/team.py +669 -0
- aria_code/apps/cli/commands/team_render.py +8 -0
- aria_code/apps/cli/commands/ui_cmds.py +401 -0
- aria_code/apps/cli/commands/warehouse_cmds.py +79 -0
- aria_code/apps/cli/commands/workflow_cmds.py +480 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +78 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/deterministic.py +191 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/finance_service_catalog.py +111 -0
- aria_code/apps/cli/football_reports.py +231 -0
- aria_code/apps/cli/github_app_auth.py +135 -0
- aria_code/apps/cli/google_login.py +196 -0
- aria_code/apps/cli/handlers/__init__.py +11 -0
- aria_code/apps/cli/handlers/broker_handlers.py +122 -0
- aria_code/apps/cli/handlers/chart_handlers.py +1309 -0
- aria_code/apps/cli/handlers/market_handlers.py +2513 -0
- aria_code/apps/cli/handlers/realty_handlers.py +114 -0
- aria_code/apps/cli/handlers/sports_handlers.py +22 -0
- aria_code/apps/cli/handlers/strategy_advice.py +82 -0
- aria_code/apps/cli/helpers.py +302 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +297 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +276 -0
- aria_code/apps/cli/intent_signals.py +344 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +536 -0
- aria_code/apps/cli/main.py +29 -0
- aria_code/apps/cli/market_metadata.py +135 -0
- aria_code/apps/cli/market_universe.py +487 -0
- aria_code/apps/cli/message_processing.py +310 -0
- aria_code/apps/cli/model_catalog.py +620 -0
- aria_code/apps/cli/pdf_report.py +977 -0
- aria_code/apps/cli/plan_mode.py +139 -0
- aria_code/apps/cli/plotly_html.py +15 -0
- aria_code/apps/cli/prediction_feedback.py +202 -0
- aria_code/apps/cli/preflight.py +502 -0
- aria_code/apps/cli/project_aria.py +60 -0
- aria_code/apps/cli/prompt_assembly.py +59 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +53 -0
- aria_code/apps/cli/prompts/select.py +142 -0
- aria_code/apps/cli/prompts/system_prompts.py +552 -0
- aria_code/apps/cli/prompts/ui.py +436 -0
- aria_code/apps/cli/provider_endpoints.py +237 -0
- aria_code/apps/cli/provider_keys.py +73 -0
- aria_code/apps/cli/providers/__init__.py +1 -0
- aria_code/apps/cli/providers/base.py +521 -0
- aria_code/apps/cli/providers/chat_routing.py +128 -0
- aria_code/apps/cli/providers/collaboration.py +98 -0
- aria_code/apps/cli/providers/llm/__init__.py +1 -0
- aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
- aria_code/apps/cli/providers/llm/ollama_stream.py +1594 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
- aria_code/apps/cli/providers/runtime_bridge.py +353 -0
- aria_code/apps/cli/providers/vertexai_stream.py +316 -0
- aria_code/apps/cli/runtime_consumer.py +657 -0
- aria_code/apps/cli/sandbox.py +32 -0
- aria_code/apps/cli/session_export.py +120 -0
- aria_code/apps/cli/session_jsonl.py +208 -0
- aria_code/apps/cli/session_store.py +112 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +823 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +106 -0
- aria_code/apps/cli/tools/__init__.py +40 -0
- aria_code/apps/cli/tools/context.py +46 -0
- aria_code/apps/cli/tools/file_tools.py +180 -0
- aria_code/apps/cli/tools/market_tools.py +620 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +726 -0
- aria_code/apps/cli/tools/write_tools.py +845 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +153 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1597 -0
- aria_code/apps/daemon/README.md +14 -0
- aria_code/apps/vscode/README.md +115 -0
- aria_code/apps/vscode/package.json +70 -0
- aria_code/aria_cli.py +6743 -0
- aria_code/aria_daemon.py +1398 -0
- aria_code/aria_feishu_bot.py +1423 -0
- aria_code/aria_mcp_server.py +7 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_relay_server.py +490 -0
- aria_code/aria_telegram_bot.py +202 -0
- aria_code/ariarc.py +385 -0
- aria_code/artifacts.py +581 -0
- aria_code/backtest_engine.py +4 -0
- aria_code/backtest_report.py +4 -0
- aria_code/brokers/__init__.py +78 -0
- aria_code/brokers/automation.py +193 -0
- aria_code/brokers/base.py +231 -0
- aria_code/brokers/capabilities.py +264 -0
- aria_code/brokers/cn/__init__.py +10 -0
- aria_code/brokers/cn/easytrader_broker.py +193 -0
- aria_code/brokers/cn/futu_broker.py +194 -0
- aria_code/brokers/cn/longbridge_broker.py +190 -0
- aria_code/brokers/cn/tiger_broker.py +196 -0
- aria_code/brokers/cn/xtquant_broker.py +225 -0
- aria_code/brokers/config.py +414 -0
- aria_code/brokers/intl/__init__.py +5 -0
- aria_code/brokers/intl/alpaca_broker.py +183 -0
- aria_code/brokers/intl/ibkr_broker.py +215 -0
- aria_code/brokers/intl/trading212_broker.py +183 -0
- aria_code/brokers/intl/webull_broker.py +156 -0
- aria_code/brokers/paper_broker.py +266 -0
- aria_code/brokers/planning.py +296 -0
- aria_code/brokers/registry.py +213 -0
- aria_code/brokers/trading.py +267 -0
- aria_code/canva_client.py +4 -0
- aria_code/change_store.py +127 -0
- aria_code/clients/__init__.py +0 -0
- aria_code/clients/aliyun_data_client.py +660 -0
- aria_code/clients/aria_relay_client.py +182 -0
- aria_code/clients/canva_client.py +284 -0
- aria_code/clients/figma_client.py +100 -0
- aria_code/clients/football_data_client.py +1671 -0
- aria_code/clients/kling_video_client.py +182 -0
- aria_code/clients/market_data_client.py +1976 -0
- aria_code/clients/openai_image_client.py +242 -0
- aria_code/clients/runway_video_client.py +157 -0
- aria_code/clients/warehouse_erp_client.py +105 -0
- aria_code/cloud_memory.py +181 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_tools.py +4 -0
- aria_code/dashboard_generator.py +579 -0
- aria_code/data_analysis_tools.py +4 -0
- aria_code/data_cleaner.py +483 -0
- aria_code/data_service.py +513 -0
- aria_code/datasources/__init__.py +23 -0
- aria_code/datasources/base.py +166 -0
- aria_code/datasources/router.py +253 -0
- aria_code/datasources/sources/__init__.py +15 -0
- aria_code/datasources/sources/akshare_source.py +269 -0
- aria_code/datasources/sources/alpha_vantage_source.py +203 -0
- aria_code/datasources/sources/edgar_source.py +219 -0
- aria_code/datasources/sources/finnhub_source.py +198 -0
- aria_code/datasources/sources/fred_source.py +223 -0
- aria_code/datasources/sources/tushare_source.py +143 -0
- aria_code/datasources/sources/web_scraper_source.py +278 -0
- aria_code/datasources/sources/world_bank_source.py +206 -0
- aria_code/datasources/sources/yfinance_source.py +152 -0
- aria_code/demo_player.py +207 -0
- aria_code/doctor.py +813 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/backtest_engine.py +354 -0
- aria_code/domain/backtest_report.py +472 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/portfolio_ledger.py +307 -0
- aria_code/domain/strategy_vault.py +421 -0
- aria_code/evals/__init__.py +37 -0
- aria_code/evals/harness.py +598 -0
- aria_code/evals/runner.py +238 -0
- aria_code/external_agent_runner.py +115 -0
- aria_code/figma_client.py +4 -0
- aria_code/file_analysis_tools.py +4 -0
- aria_code/finance_formulas.py +4 -0
- aria_code/football_data_client.py +4 -0
- aria_code/image_gen_tools.py +4 -0
- aria_code/intent_classifier.py +386 -0
- aria_code/kling_video_client.py +4 -0
- aria_code/licensing.py +151 -0
- aria_code/local_finance_tools.py +4 -0
- aria_code/local_image_provider.py +4 -0
- aria_code/local_llm_provider.py +4 -0
- aria_code/macro_tools.py +4 -0
- aria_code/markdown_pdf.py +289 -0
- aria_code/market_data_client.py +4 -0
- aria_code/mcp_client.py +639 -0
- aria_code/memory_manager.py +246 -0
- aria_code/model_capability.py +486 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +23 -0
- aria_code/packages/adk_bridge/__init__.py +11 -0
- aria_code/packages/adk_bridge/code_review_tools.py +49 -0
- aria_code/packages/adk_bridge/market_tools.py +125 -0
- aria_code/packages/aria_agents/__init__.py +5 -0
- aria_code/packages/aria_agents/manifest.py +78 -0
- aria_code/packages/aria_core/__init__.py +34 -0
- aria_code/packages/aria_core/architecture.py +269 -0
- aria_code/packages/aria_core/export.py +147 -0
- aria_code/packages/aria_core/manifest.py +65 -0
- aria_code/packages/aria_core/paths.py +57 -0
- aria_code/packages/aria_core/secure_file.py +68 -0
- aria_code/packages/aria_infra/__init__.py +15 -0
- aria_code/packages/aria_infra/arthera.py +52 -0
- aria_code/packages/aria_infra/doctor.py +246 -0
- aria_code/packages/aria_infra/product.py +40 -0
- aria_code/packages/aria_mcp/__init__.py +25 -0
- aria_code/packages/aria_mcp/bridge.py +201 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +111 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1550 -0
- aria_code/packages/aria_mcp/tools.py +81 -0
- aria_code/packages/aria_sdk/__init__.py +19 -0
- aria_code/packages/aria_sdk/client.py +396 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +79 -0
- aria_code/packages/aria_sdk/types.py +86 -0
- aria_code/packages/aria_services/__init__.py +92 -0
- aria_code/packages/aria_services/cache.py +60 -0
- aria_code/packages/aria_services/context.py +356 -0
- aria_code/packages/aria_services/context_checkpoints.py +157 -0
- aria_code/packages/aria_services/data.py +11 -0
- aria_code/packages/aria_services/provider_health.py +268 -0
- aria_code/packages/aria_services/references.py +247 -0
- aria_code/packages/aria_services/registry.py +249 -0
- aria_code/packages/aria_services/research_protocol.py +57 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +157 -0
- aria_code/packages/aria_services/usage.py +151 -0
- aria_code/packages/aria_skills/__init__.py +46 -0
- aria_code/packages/aria_skills/catalog.py +149 -0
- aria_code/packages/aria_skills/loader.py +455 -0
- aria_code/packages/aria_skills/registry.py +84 -0
- aria_code/packages/aria_tools/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/__init__.py +8 -0
- aria_code/packages/aria_tools/financial/_paths.py +130 -0
- aria_code/packages/aria_tools/financial/compliance.py +31 -0
- aria_code/packages/aria_tools/financial/factors.py +33 -0
- aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
- aria_code/packages/aria_tools/financial/strategy.py +31 -0
- aria_code/packages/aria_tools/registry.py +128 -0
- aria_code/packages/quant_engine/__init__.py +34 -0
- aria_code/packages/quant_engine/_namespace.py +62 -0
- aria_code/packages/quant_engine/backtest/__init__.py +14 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +96 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +80 -0
- aria_code/packages/quant_engine/sports/calibrator.py +354 -0
- aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
- aria_code/packages/quant_engine/sports/elo.py +300 -0
- aria_code/packages/quant_engine/sports/form.py +188 -0
- aria_code/packages/quant_engine/sports/h2h.py +195 -0
- aria_code/packages/quant_engine/sports/ml_model.py +377 -0
- aria_code/packages/quant_engine/sports/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +35 -0
- aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
- aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
- aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- aria_code/packs/__init__.py +85 -0
- aria_code/packs/base.py +168 -0
- aria_code/packs/finance/__init__.py +250 -0
- aria_code/packs/logistics/__init__.py +169 -0
- aria_code/packs/payments/__init__.py +139 -0
- aria_code/packs/realty/__init__.py +190 -0
- aria_code/packs/registry.py +202 -0
- aria_code/packs/rules.py +90 -0
- aria_code/plan_utils.py +194 -0
- aria_code/plugin_loader.py +328 -0
- aria_code/portfolio_ledger.py +4 -0
- aria_code/preview_server.py +449 -0
- aria_code/privacy/__init__.py +5 -0
- aria_code/privacy/feedback.py +123 -0
- aria_code/project_review.py +278 -0
- aria_code/project_review_api.py +235 -0
- aria_code/project_review_server.py +18 -0
- aria_code/project_tools.py +4 -0
- aria_code/providers/__init__.py +30 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/autoconfig.py +213 -0
- aria_code/providers/llm/base.py +139 -0
- aria_code/providers/llm/custom.py +158 -0
- aria_code/providers/llm/ollama.py +129 -0
- aria_code/providers/llm/openai_compat.py +313 -0
- aria_code/providers/llm/registry.py +444 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +589 -0
- aria_code/realty_data_tools.py +4 -0
- aria_code/report_exporters.py +150 -0
- aria_code/report_generator.py +1764 -0
- aria_code/runtime/__init__.py +169 -0
- aria_code/runtime/acceptance.py +481 -0
- aria_code/runtime/agent_loop.py +1520 -0
- aria_code/runtime/approval.py +57 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +432 -0
- aria_code/runtime/crash_report.py +174 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +150 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/repo_map.py +700 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +450 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/subagent.py +547 -0
- aria_code/runtime/task_ledger.py +86 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/tool_executor.py +217 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +23 -0
- aria_code/safety/permissions.py +306 -0
- aria_code/safety/service.py +102 -0
- aria_code/setup_wizard.py +673 -0
- aria_code/spreadsheet_tools.py +4 -0
- aria_code/strategy_vault.py +4 -0
- aria_code/tools/__init__.py +0 -0
- aria_code/tools/artifact_tools.py +252 -0
- aria_code/tools/broker_tools.py +92 -0
- aria_code/tools/build_quant_engine.py +97 -0
- aria_code/tools/code_audit_tools.py +192 -0
- aria_code/tools/computer_use_tools.py +504 -0
- aria_code/tools/data_analysis_tools.py +809 -0
- aria_code/tools/enterprise_finance_tools.py +156 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +885 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3417 -0
- aria_code/tools/logistics_tools.py +135 -0
- aria_code/tools/macro_tools.py +369 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +659 -0
- aria_code/tools/spreadsheet_tools.py +388 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +508 -0
- aria_code/ui/completer.py +501 -0
- aria_code/ui/console.py +281 -0
- aria_code/ui/image_render.py +243 -0
- aria_code/ui/input_box.py +488 -0
- aria_code/ui/picker.py +201 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/finance.py +1705 -0
- aria_code/ui/render/market.py +225 -0
- aria_code/ui/render/output.py +775 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +354 -0
- aria_code/ui/robot.py +235 -0
- aria_code/ui/startup_dashboard.py +109 -0
- aria_code/utils/vscode_uri.py +37 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +271 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +193 -0
- aria_code/workspace/verify.py +113 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_context.py +233 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.52.0.dist-info/METADATA +237 -0
- aria_code-0.52.0.dist-info/RECORD +478 -0
- aria_code-0.52.0.dist-info/WHEEL +5 -0
- aria_code-0.52.0.dist-info/entry_points.txt +3 -0
- aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.52.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"""AnalysisCommandsMixin — market analysis and indicator commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from aria_code.apps.cli.commands.market import parse_analysis_args
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import json
|
|
10
|
+
import asyncio
|
|
11
|
+
import datetime
|
|
12
|
+
import time
|
|
13
|
+
import shlex
|
|
14
|
+
import sys
|
|
15
|
+
import os
|
|
16
|
+
from typing import Dict, Any, Optional
|
|
17
|
+
|
|
18
|
+
def _get__HAS_BROKERS():
|
|
19
|
+
from .._optional import HAS_BROKERS as val
|
|
20
|
+
return val
|
|
21
|
+
def _render_cb_rates(*args, **kwargs):
|
|
22
|
+
from aria_cli import _render_cb_rates as fn
|
|
23
|
+
return fn(*args, **kwargs)
|
|
24
|
+
def _render_fear_greed(*args, **kwargs):
|
|
25
|
+
from aria_cli import _render_fear_greed as fn
|
|
26
|
+
return fn(*args, **kwargs)
|
|
27
|
+
def _render_quality_scores(*args, **kwargs):
|
|
28
|
+
from aria_cli import _render_quality_scores as fn
|
|
29
|
+
return fn(*args, **kwargs)
|
|
30
|
+
def _render_options_chain(*args, **kwargs):
|
|
31
|
+
from aria_cli import _render_options_chain as fn
|
|
32
|
+
return fn(*args, **kwargs)
|
|
33
|
+
def build_analyze_context(*args, **kwargs):
|
|
34
|
+
from aria_cli import build_analyze_context as fn
|
|
35
|
+
return fn(*args, **kwargs)
|
|
36
|
+
def _render_funding_rates(*args, **kwargs):
|
|
37
|
+
from aria_cli import _render_funding_rates as fn
|
|
38
|
+
return fn(*args, **kwargs)
|
|
39
|
+
def _get_broker_registry(*args, **kwargs):
|
|
40
|
+
from .._optional import get_registry as fn
|
|
41
|
+
return fn(*args, **kwargs)
|
|
42
|
+
def build_analyze_prompt(*args, **kwargs):
|
|
43
|
+
from aria_cli import build_analyze_prompt as fn
|
|
44
|
+
return fn(*args, **kwargs)
|
|
45
|
+
def _render_funding_compare(*args, **kwargs):
|
|
46
|
+
from aria_cli import _render_funding_compare as fn
|
|
47
|
+
return fn(*args, **kwargs)
|
|
48
|
+
def _is_ashare_symbol(*args, **kwargs):
|
|
49
|
+
from aria_code.apps.cli.helpers import _is_ashare_symbol as fn
|
|
50
|
+
return fn(*args, **kwargs)
|
|
51
|
+
def _get__HAS_MDC():
|
|
52
|
+
from .._optional import HAS_MDC as val
|
|
53
|
+
return val
|
|
54
|
+
def _ashare_code_to_name(*args, **kwargs):
|
|
55
|
+
from aria_cli import _ashare_code_to_name as fn
|
|
56
|
+
return fn(*args, **kwargs)
|
|
57
|
+
def _get__HAS_LOCAL_FINANCE():
|
|
58
|
+
from aria_cli import _HAS_LOCAL_FINANCE as val
|
|
59
|
+
return val
|
|
60
|
+
def _render_econ_calendar(*args, **kwargs):
|
|
61
|
+
from aria_cli import _render_econ_calendar as fn
|
|
62
|
+
return fn(*args, **kwargs)
|
|
63
|
+
def _render_macro_result(*args, **kwargs):
|
|
64
|
+
from aria_cli import _render_macro_result as fn
|
|
65
|
+
return fn(*args, **kwargs)
|
|
66
|
+
def _render_ichimoku(*args, **kwargs):
|
|
67
|
+
from aria_cli import _render_ichimoku as fn
|
|
68
|
+
return fn(*args, **kwargs)
|
|
69
|
+
def _get_mdc(*args, **kwargs):
|
|
70
|
+
from .._optional import get_mdc as fn
|
|
71
|
+
return fn(*args, **kwargs)
|
|
72
|
+
|
|
73
|
+
import json
|
|
74
|
+
import asyncio
|
|
75
|
+
import datetime
|
|
76
|
+
import time
|
|
77
|
+
import shlex
|
|
78
|
+
import sys
|
|
79
|
+
import os
|
|
80
|
+
from typing import Dict, Any, Optional
|
|
81
|
+
|
|
82
|
+
# A real logger. This was a `def logger(*args, **kwargs)` forwarding to
|
|
83
|
+
# aria_cli, so every `logger.debug(...)` raised AttributeError — and all but
|
|
84
|
+
# one of them sit in an except block, where the failure replaced whatever
|
|
85
|
+
# error was being reported.
|
|
86
|
+
logger = logging.getLogger(__name__)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class AnalysisCommandsMixin:
|
|
90
|
+
"""Mixin: market analysis and technical indicator commands."""
|
|
91
|
+
|
|
92
|
+
async def cmd_analyze(self, args: str):
|
|
93
|
+
"""Deep analysis: fetch real quote + TA + fundamentals, then ask LLM."""
|
|
94
|
+
parsed = parse_analysis_args(args)
|
|
95
|
+
symbol = parsed.symbol
|
|
96
|
+
is_cn = _is_ashare_symbol(symbol)
|
|
97
|
+
response_lang = parsed.lang or ("zh" if is_cn else "en")
|
|
98
|
+
|
|
99
|
+
if self.context.has_rich:
|
|
100
|
+
with self.context.console.status(f"[dim]正在获取 {symbol} 数据...[/dim]", spinner="dots"):
|
|
101
|
+
ctx = await self._build_analyze_context(symbol, is_cn)
|
|
102
|
+
else:
|
|
103
|
+
print(f"Fetching data for {symbol}...")
|
|
104
|
+
ctx = await self._build_analyze_context(symbol, is_cn)
|
|
105
|
+
|
|
106
|
+
if parsed.focus == "volume":
|
|
107
|
+
if response_lang == "en":
|
|
108
|
+
ctx += (
|
|
109
|
+
"\n\n### User Focus\n"
|
|
110
|
+
"- Focus on volume, price-volume confirmation, and volume versus recent average. "
|
|
111
|
+
"If volume is unavailable, state that the source did not return it and do not invent values."
|
|
112
|
+
)
|
|
113
|
+
else:
|
|
114
|
+
ctx += (
|
|
115
|
+
"\n\n### 用户关注\n"
|
|
116
|
+
"- 重点分析成交量、量价关系、成交量相对近期均量的变化;"
|
|
117
|
+
"若成交量数据不可用,请直接说明来源未返回成交量,不要编造数值。"
|
|
118
|
+
)
|
|
119
|
+
elif parsed.focus:
|
|
120
|
+
heading = "User Focus" if response_lang == "en" else "用户关注"
|
|
121
|
+
label = "Focus on" if response_lang == "en" else "重点分析"
|
|
122
|
+
ctx += f"\n\n### {heading}\n- {label}: {parsed.focus}"
|
|
123
|
+
|
|
124
|
+
await self.terminal.send_message(build_analyze_prompt(symbol, ctx, is_cn, response_lang=response_lang))
|
|
125
|
+
try:
|
|
126
|
+
_resp = next((m["content"] for m in reversed(self.terminal.conversation)
|
|
127
|
+
if m.get("role") == "assistant" and m.get("content")), "")
|
|
128
|
+
if _resp:
|
|
129
|
+
self.terminal._record_prediction(symbol, _resp)
|
|
130
|
+
except Exception:
|
|
131
|
+
pass
|
|
132
|
+
|
|
133
|
+
async def _build_analyze_context(self, symbol: str, is_cn: bool) -> str:
|
|
134
|
+
"""Fetch real market data and return a structured context string for the LLM."""
|
|
135
|
+
return await build_analyze_context(
|
|
136
|
+
symbol,
|
|
137
|
+
is_cn,
|
|
138
|
+
has_mdc=_get__HAS_MDC(),
|
|
139
|
+
get_mdc=_get_mdc if _get__HAS_MDC() else None,
|
|
140
|
+
ashare_name_lookup=_ashare_code_to_name,
|
|
141
|
+
has_brokers=_get__HAS_BROKERS(),
|
|
142
|
+
get_broker_registry=_get_broker_registry if _get__HAS_BROKERS() else None,
|
|
143
|
+
logger=logger,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
async def cmd_macro(self, args: str):
|
|
147
|
+
"""/macro [us|cn|rates|calendar] [indicator] — 宏观经济数据仪表板"""
|
|
148
|
+
import asyncio as _asyncio
|
|
149
|
+
parts = args.strip().lower().split() if args.strip() else []
|
|
150
|
+
region = parts[0] if parts else "all"
|
|
151
|
+
indicator = parts[1] if len(parts) > 1 else "all"
|
|
152
|
+
|
|
153
|
+
try:
|
|
154
|
+
from macro_tools import get_us_macro, get_cn_macro, get_central_bank_rates, get_economic_calendar
|
|
155
|
+
except ImportError:
|
|
156
|
+
if self.context.has_rich:
|
|
157
|
+
self.context.console.print("[red]macro_tools 模块未找到[/red]")
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
loop = _asyncio.get_event_loop()
|
|
161
|
+
|
|
162
|
+
if region in ("us", "all"):
|
|
163
|
+
if self.context.has_rich:
|
|
164
|
+
with self.context.console.status("[dim]获取美国宏观数据 (FRED)...[/dim]", spinner="dots"):
|
|
165
|
+
r = await loop.run_in_executor(None, lambda: get_us_macro(indicator if region == "us" else "all"))
|
|
166
|
+
else:
|
|
167
|
+
r = get_us_macro(indicator if region == "us" else "all")
|
|
168
|
+
_render_macro_result(r, "🇺🇸 美国宏观")
|
|
169
|
+
|
|
170
|
+
if region in ("cn", "all"):
|
|
171
|
+
if self.context.has_rich:
|
|
172
|
+
with self.context.console.status("[dim]获取中国宏观数据 (akshare)...[/dim]", spinner="dots"):
|
|
173
|
+
r_cn = await loop.run_in_executor(None, lambda: get_cn_macro(indicator if region == "cn" else "all"))
|
|
174
|
+
else:
|
|
175
|
+
r_cn = get_cn_macro(indicator if region == "cn" else "all")
|
|
176
|
+
_render_macro_result(r_cn, "🇨🇳 中国宏观")
|
|
177
|
+
|
|
178
|
+
if region in ("rates", "all"):
|
|
179
|
+
if self.context.has_rich:
|
|
180
|
+
with self.context.console.status("[dim]获取央行利率...[/dim]", spinner="dots"):
|
|
181
|
+
r_rates = await loop.run_in_executor(None, get_central_bank_rates)
|
|
182
|
+
else:
|
|
183
|
+
r_rates = get_central_bank_rates()
|
|
184
|
+
_render_cb_rates(r_rates)
|
|
185
|
+
|
|
186
|
+
if region == "calendar":
|
|
187
|
+
if self.context.has_rich:
|
|
188
|
+
with self.context.console.status("[dim]获取经济日历...[/dim]", spinner="dots"):
|
|
189
|
+
r_cal = await loop.run_in_executor(None, lambda: get_economic_calendar(7))
|
|
190
|
+
else:
|
|
191
|
+
r_cal = get_economic_calendar(7)
|
|
192
|
+
_render_econ_calendar(r_cal)
|
|
193
|
+
|
|
194
|
+
async def cmd_options(self, args: str):
|
|
195
|
+
"""/options <symbol> [calls|puts] [expiry] — 期权链查询"""
|
|
196
|
+
parts = args.strip().split() if args.strip() else []
|
|
197
|
+
symbol = parts[0].upper() if parts else "AAPL"
|
|
198
|
+
opt_type = "both"
|
|
199
|
+
expiry = ""
|
|
200
|
+
for p in parts[1:]:
|
|
201
|
+
if p.lower() in ("calls", "puts"):
|
|
202
|
+
opt_type = p.lower()
|
|
203
|
+
elif "-" in p and len(p) == 10:
|
|
204
|
+
expiry = p
|
|
205
|
+
|
|
206
|
+
if not _get__HAS_LOCAL_FINANCE():
|
|
207
|
+
if self.context.has_rich:
|
|
208
|
+
self.context.console.print("[red]local_finance_tools 未加载[/red]")
|
|
209
|
+
return
|
|
210
|
+
|
|
211
|
+
import asyncio as _asyncio
|
|
212
|
+
loop = _asyncio.get_event_loop()
|
|
213
|
+
if self.context.has_rich:
|
|
214
|
+
with self.context.console.status(f"[dim]获取 {symbol} 期权链...[/dim]", spinner="dots"):
|
|
215
|
+
from local_finance_tools import _get_options_chain
|
|
216
|
+
r = await loop.run_in_executor(None, _get_options_chain,
|
|
217
|
+
{"symbol": symbol, "type": opt_type, "expiry": expiry, "limit": 20})
|
|
218
|
+
else:
|
|
219
|
+
from local_finance_tools import _get_options_chain
|
|
220
|
+
r = _get_options_chain({"symbol": symbol, "type": opt_type, "expiry": expiry, "limit": 20})
|
|
221
|
+
|
|
222
|
+
if not r.get("success"):
|
|
223
|
+
if self.context.has_rich:
|
|
224
|
+
self.context.console.print(f"[red]{r.get('error')}[/red]")
|
|
225
|
+
return
|
|
226
|
+
|
|
227
|
+
_render_options_chain(r)
|
|
228
|
+
try:
|
|
229
|
+
spot = r.get("current_price") or r.get("spot_price")
|
|
230
|
+
if spot and spot > 0:
|
|
231
|
+
from packages.quant_engine.stochastic.options_pricing import OptionSpec, black_scholes
|
|
232
|
+
T = 30 / 365
|
|
233
|
+
r_f = 0.05
|
|
234
|
+
chain = r.get("calls", []) or r.get("chain", []) or []
|
|
235
|
+
sigma = 0.25
|
|
236
|
+
for row in chain[:5]:
|
|
237
|
+
iv = row.get("impliedVolatility") or row.get("iv")
|
|
238
|
+
if iv and 0.01 < float(iv) < 5.0:
|
|
239
|
+
sigma = float(iv)
|
|
240
|
+
break
|
|
241
|
+
|
|
242
|
+
atm_call = black_scholes(OptionSpec(S=spot, K=round(spot, -1) or spot, T=T, r=r_f, sigma=sigma, option_type="call"))
|
|
243
|
+
atm_put = black_scholes(OptionSpec(S=spot, K=round(spot, -1) or spot, T=T, r=r_f, sigma=sigma, option_type="put"))
|
|
244
|
+
if self.context.has_rich:
|
|
245
|
+
from rich.table import Table
|
|
246
|
+
from rich import box as _box
|
|
247
|
+
tbl = Table(title=f"[bold]B-S ATM 理论价格[/bold] σ={sigma:.0%} T=30d r=5%",
|
|
248
|
+
box=_box.SIMPLE, show_header=True, header_style="bold dim")
|
|
249
|
+
tbl.add_column("", style="dim")
|
|
250
|
+
tbl.add_column("理论价", justify="right")
|
|
251
|
+
tbl.add_column("Delta", justify="right")
|
|
252
|
+
tbl.add_column("Gamma", justify="right")
|
|
253
|
+
tbl.add_column("Theta/日", justify="right")
|
|
254
|
+
tbl.add_column("Vega/1%", justify="right")
|
|
255
|
+
tbl.add_column("Vanna", justify="right")
|
|
256
|
+
tbl.add_row("Call", f"{atm_call.price:.2f}", f"{atm_call.delta:+.3f}",
|
|
257
|
+
f"{atm_call.gamma:.4f}", f"{atm_call.theta:+.4f}",
|
|
258
|
+
f"{atm_call.vega:.4f}", f"{atm_call.vanna:.4f}")
|
|
259
|
+
tbl.add_row("Put", f"{atm_put.price:.2f}", f"{atm_put.delta:+.3f}",
|
|
260
|
+
f"{atm_put.gamma:.4f}", f"{atm_put.theta:+.4f}",
|
|
261
|
+
f"{atm_put.vega:.4f}", f"{atm_put.vanna:.4f}")
|
|
262
|
+
self.context.console.print(tbl)
|
|
263
|
+
else:
|
|
264
|
+
print(f"B-S ATM call={atm_call.price:.2f} Δ={atm_call.delta:+.3f} put={atm_put.price:.2f} Δ={atm_put.delta:+.3f} σ={sigma:.0%}")
|
|
265
|
+
except Exception:
|
|
266
|
+
pass
|
|
267
|
+
|
|
268
|
+
async def cmd_quality(self, args: str):
|
|
269
|
+
"""/quality <symbol> — Piotroski F-Score + Altman Z-Score 双维财务质量评估"""
|
|
270
|
+
symbol = args.strip().upper() if args.strip() else "AAPL"
|
|
271
|
+
if not _get__HAS_LOCAL_FINANCE():
|
|
272
|
+
if self.context.has_rich:
|
|
273
|
+
self.context.console.print("[red]local_finance_tools 未加载[/red]")
|
|
274
|
+
return
|
|
275
|
+
|
|
276
|
+
import asyncio as _asyncio
|
|
277
|
+
loop = _asyncio.get_event_loop()
|
|
278
|
+
if self.context.has_rich:
|
|
279
|
+
with self.context.console.status(f"[dim]计算 {symbol} 财务质量评分...[/dim]", spinner="dots"):
|
|
280
|
+
from local_finance_tools import _piotroski_fscore, _altman_zscore
|
|
281
|
+
f_r = await loop.run_in_executor(None, _piotroski_fscore, {"symbol": symbol})
|
|
282
|
+
z_r = await loop.run_in_executor(None, _altman_zscore, {"symbol": symbol})
|
|
283
|
+
else:
|
|
284
|
+
from local_finance_tools import _piotroski_fscore, _altman_zscore
|
|
285
|
+
f_r = _piotroski_fscore({"symbol": symbol})
|
|
286
|
+
z_r = _altman_zscore({"symbol": symbol})
|
|
287
|
+
|
|
288
|
+
_render_quality_scores(symbol, f_r, z_r)
|
|
289
|
+
|
|
290
|
+
async def cmd_ichimoku(self, args: str):
|
|
291
|
+
"""/ichimoku <symbol> — 一目均衡表分析"""
|
|
292
|
+
symbol = args.strip().upper() if args.strip() else "AAPL"
|
|
293
|
+
if not _get__HAS_LOCAL_FINANCE():
|
|
294
|
+
if self.context.has_rich:
|
|
295
|
+
self.context.console.print("[red]local_finance_tools 未加载[/red]")
|
|
296
|
+
return
|
|
297
|
+
|
|
298
|
+
import asyncio as _asyncio
|
|
299
|
+
loop = _asyncio.get_event_loop()
|
|
300
|
+
if self.context.has_rich:
|
|
301
|
+
with self.context.console.status(f"[dim]计算 {symbol} 一目均衡表...[/dim]", spinner="dots"):
|
|
302
|
+
from local_finance_tools import _calculate_ichimoku
|
|
303
|
+
r = await loop.run_in_executor(None, _calculate_ichimoku, {"symbol": symbol})
|
|
304
|
+
else:
|
|
305
|
+
from local_finance_tools import _calculate_ichimoku
|
|
306
|
+
r = _calculate_ichimoku({"symbol": symbol})
|
|
307
|
+
|
|
308
|
+
_render_ichimoku(r)
|
|
309
|
+
|
|
310
|
+
async def cmd_fear_greed(self, args: str):
|
|
311
|
+
"""/feargreed — 加密货币恐惧贪婪指数"""
|
|
312
|
+
if not _get__HAS_LOCAL_FINANCE():
|
|
313
|
+
if self.context.has_rich:
|
|
314
|
+
self.context.console.print("[red]local_finance_tools 未加载[/red]")
|
|
315
|
+
return
|
|
316
|
+
|
|
317
|
+
import asyncio as _asyncio
|
|
318
|
+
loop = _asyncio.get_event_loop()
|
|
319
|
+
if self.context.has_rich:
|
|
320
|
+
with self.context.console.status("[dim]获取恐惧贪婪指数...[/dim]", spinner="dots"):
|
|
321
|
+
from local_finance_tools import _get_fear_greed_index
|
|
322
|
+
r = await loop.run_in_executor(None, _get_fear_greed_index, {})
|
|
323
|
+
else:
|
|
324
|
+
from local_finance_tools import _get_fear_greed_index
|
|
325
|
+
r = _get_fear_greed_index({})
|
|
326
|
+
|
|
327
|
+
_render_fear_greed(r)
|
|
328
|
+
|
|
329
|
+
async def cmd_funding(self, args: str):
|
|
330
|
+
"""/funding [compare] [BTC ETH SOL] [exchange] — 永续合约资金费率"""
|
|
331
|
+
parts = args.strip().split() if args.strip() else []
|
|
332
|
+
compare_mode = any(p.lower() == "compare" for p in parts)
|
|
333
|
+
parts = [p for p in parts if p.lower() != "compare"]
|
|
334
|
+
|
|
335
|
+
exchange = "binance"
|
|
336
|
+
syms = []
|
|
337
|
+
for p in parts:
|
|
338
|
+
if p.lower() in ("binance", "okx", "bybit", "coinbase"):
|
|
339
|
+
exchange = p.lower()
|
|
340
|
+
else:
|
|
341
|
+
syms.append(p.upper() + "/USDT" if "/" not in p else p.upper())
|
|
342
|
+
if not syms:
|
|
343
|
+
syms = ["BTC/USDT", "ETH/USDT", "SOL/USDT"]
|
|
344
|
+
|
|
345
|
+
if not _get__HAS_LOCAL_FINANCE():
|
|
346
|
+
if self.context.has_rich:
|
|
347
|
+
self.context.console.print("[red]local_finance_tools 未加载[/red]")
|
|
348
|
+
return
|
|
349
|
+
|
|
350
|
+
import asyncio as _asyncio
|
|
351
|
+
loop = _asyncio.get_event_loop()
|
|
352
|
+
if compare_mode:
|
|
353
|
+
if self.context.has_rich:
|
|
354
|
+
with self.context.console.status("[dim]并行查询 binance / okx / bybit...[/dim]", spinner="dots"):
|
|
355
|
+
from local_finance_tools import _get_funding_rates_compare
|
|
356
|
+
r = await loop.run_in_executor(None, _get_funding_rates_compare, {"symbols": syms})
|
|
357
|
+
else:
|
|
358
|
+
from local_finance_tools import _get_funding_rates_compare
|
|
359
|
+
r = _get_funding_rates_compare({"symbols": syms})
|
|
360
|
+
_render_funding_compare(r)
|
|
361
|
+
else:
|
|
362
|
+
if self.context.has_rich:
|
|
363
|
+
with self.context.console.status(f"[dim]获取 {exchange} 资金费率...[/dim]", spinner="dots"):
|
|
364
|
+
from local_finance_tools import _get_funding_rates
|
|
365
|
+
r = await loop.run_in_executor(None, _get_funding_rates, {"exchange": exchange, "symbols": syms})
|
|
366
|
+
else:
|
|
367
|
+
from local_finance_tools import _get_funding_rates
|
|
368
|
+
r = _get_funding_rates({"exchange": exchange, "symbols": syms})
|
|
369
|
+
_render_funding_rates(r)
|