aria-code 0.167.0__py3-none-win_amd64.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_bots/__init__.py +7 -0
- aria_bots/channels/README.md +97 -0
- aria_bots/channels/__init__.py +1 -0
- aria_bots/channels/approvals.py +263 -0
- aria_bots/channels/conversation.py +280 -0
- aria_bots/channels/digest.py +186 -0
- aria_bots/channels/registry.py +95 -0
- aria_bots/engine.py +144 -0
- aria_bots/feishu_bot.py +1385 -0
- aria_bots/logistics/__init__.py +1 -0
- aria_bots/logistics/carriers.py +253 -0
- aria_bots/logistics/freight.py +154 -0
- aria_bots/logistics/inventory.py +242 -0
- aria_bots/logistics/mcp_server.py +156 -0
- aria_bots/logistics/records.py +119 -0
- aria_bots/logistics/tenancy.py +152 -0
- aria_bots/market.py +91 -0
- aria_bots/relay_client.py +326 -0
- aria_bots/telegram_bot.py +299 -0
- aria_code/__init__.py +111 -0
- aria_code/_bin/aria-native.exe +0 -0
- aria_code/_bin/aria-runtime.exe +0 -0
- aria_code/_version.py +20 -0
- aria_code/account_memory.py +296 -0
- aria_code/account_session.py +166 -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 +49 -0
- aria_code/agents/base.py +329 -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 +315 -0
- aria_code/agents/financial/fundamental.py +178 -0
- aria_code/agents/financial/macro.py +111 -0
- aria_code/agents/financial/news.py +231 -0
- aria_code/agents/financial/risk.py +146 -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 +277 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +392 -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 +168 -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 +500 -0
- aria_code/agents/video/__init__.py +16 -0
- aria_code/agents/video/director.py +376 -0
- aria_code/agents/video/qa_agent.py +143 -0
- aria_code/agents/video/script_doctor.py +112 -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/navigation.schema.json +110 -0
- aria_code/agents/warehouse/task_agent.py +172 -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 +9 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/approvals.py +11 -0
- aria_code/apps/channels/conversation.py +11 -0
- aria_code/apps/channels/digest.py +11 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +11 -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/app_server.py +656 -0
- aria_code/apps/cli/auto_update.py +125 -0
- aria_code/apps/cli/bootstrap.py +206 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/chat_turn.py +1327 -0
- aria_code/apps/cli/cloud_models.py +231 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +34 -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 +378 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +215 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
- aria_code/apps/cli/commands/broker_cmds.py +1236 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +189 -0
- aria_code/apps/cli/commands/core_cmds.py +2748 -0
- aria_code/apps/cli/commands/data_cmds.py +521 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/engineering_cmds.py +399 -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 +544 -0
- aria_code/apps/cli/commands/market_cmds.py +1419 -0
- aria_code/apps/cli/commands/market_context.py +432 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2374 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
- aria_code/apps/cli/commands/report.py +476 -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 +723 -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 +297 -0
- aria_code/apps/cli/commands/workflow_cmds.py +629 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +158 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/conversation_policy.py +53 -0
- aria_code/apps/cli/deterministic.py +200 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/earnings_view.py +172 -0
- aria_code/apps/cli/endpoint_migration.py +64 -0
- aria_code/apps/cli/exec_events.py +255 -0
- aria_code/apps/cli/file_references.py +155 -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 +239 -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 +1314 -0
- aria_code/apps/cli/handlers/market_handlers.py +2570 -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/headless.py +352 -0
- aria_code/apps/cli/helpers.py +326 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +310 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +305 -0
- aria_code/apps/cli/intent_shadow.py +72 -0
- aria_code/apps/cli/intent_signals.py +347 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +550 -0
- aria_code/apps/cli/main.py +39 -0
- aria_code/apps/cli/market_hours.py +100 -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/mixin_binding.py +32 -0
- aria_code/apps/cli/model_catalog.py +652 -0
- aria_code/apps/cli/model_probe.py +169 -0
- aria_code/apps/cli/model_retirement.py +65 -0
- aria_code/apps/cli/native_branding.py +12 -0
- aria_code/apps/cli/native_bridge.py +118 -0
- aria_code/apps/cli/native_entry.py +58 -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 +78 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +71 -0
- aria_code/apps/cli/prompts/select.py +193 -0
- aria_code/apps/cli/prompts/system_prompts.py +562 -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 +775 -0
- aria_code/apps/cli/providers/chat_routing.py +139 -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 +1574 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
- aria_code/apps/cli/providers/runtime_bridge.py +586 -0
- aria_code/apps/cli/providers/vertexai_stream.py +592 -0
- aria_code/apps/cli/release_download.py +159 -0
- aria_code/apps/cli/review_runner.py +111 -0
- aria_code/apps/cli/runtime_consumer.py +769 -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_refresh.py +123 -0
- aria_code/apps/cli/session_store.py +125 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/task_isolation.py +211 -0
- aria_code/apps/cli/terminal_chrome.py +412 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +932 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +113 -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 +181 -0
- aria_code/apps/cli/tools/market_tools.py +626 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +656 -0
- aria_code/apps/cli/tools/write_tools.py +961 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/transactions.py +269 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +257 -0
- aria_code/apps/cli/updater.py +373 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1663 -0
- aria_code/apps/cli/web_login.py +136 -0
- aria_code/apps/cli/workflow_runner.py +127 -0
- aria_code/apps/cli/workspace_route.py +121 -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 +5244 -0
- aria_code/aria_daemon.py +1372 -0
- aria_code/aria_feishu_bot.py +16 -0
- aria_code/aria_mcp_server.py +61 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_telegram_bot.py +11 -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 +16 -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 +1985 -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 +190 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_server.py +276 -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/sec_statements.py +217 -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/doctor.py +860 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/_finance_core/__init__.py +5 -0
- aria_code/domain/_finance_core/backtest_engine.py +325 -0
- aria_code/domain/_finance_core/performance_stats.py +101 -0
- aria_code/domain/backtest_engine.py +75 -0
- aria_code/domain/backtest_report.py +488 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/performance_stats.py +6 -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/behavior.py +113 -0
- aria_code/evals/gap.py +93 -0
- aria_code/evals/harness.py +949 -0
- aria_code/evals/review_probe.py +132 -0
- aria_code/evals/runner.py +425 -0
- aria_code/evals/scorecard.py +322 -0
- aria_code/evals/summary.py +125 -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 +459 -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 +744 -0
- aria_code/memory_manager.py +273 -0
- aria_code/model_capability.py +512 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +26 -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 +58 -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 +232 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +162 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1705 -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 +393 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +75 -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 +304 -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 +137 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +160 -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 +5 -0
- aria_code/packages/aria_tools/financial/_paths.py +92 -0
- aria_code/packages/aria_tools/registry.py +129 -0
- aria_code/packages/quant_engine/__init__.py +33 -0
- aria_code/packages/quant_engine/_namespace.py +24 -0
- aria_code/packages/quant_engine/backtest/__init__.py +10 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +102 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +76 -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/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +31 -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/healthcare/__init__.py +40 -0
- aria_code/packs/logistics/__init__.py +171 -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/google_video_provider.py +256 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/arthera_gateway.py +90 -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 +137 -0
- aria_code/providers/llm/openai_compat.py +350 -0
- aria_code/providers/llm/registry.py +457 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +549 -0
- aria_code/providers/ollama_models.py +79 -0
- aria_code/providers/openai_params.py +32 -0
- aria_code/providers/tool_messages.py +100 -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/review_service.py +497 -0
- aria_code/runtime/__init__.py +176 -0
- aria_code/runtime/acceptance.py +632 -0
- aria_code/runtime/agent_loop.py +1851 -0
- aria_code/runtime/agent_profiles.py +75 -0
- aria_code/runtime/approval.py +71 -0
- aria_code/runtime/baseline.py +219 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +481 -0
- aria_code/runtime/consult.py +65 -0
- aria_code/runtime/contract.py +282 -0
- aria_code/runtime/delivery.py +432 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +167 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/native_index.py +153 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/processes.py +343 -0
- aria_code/runtime/project_graph.py +614 -0
- aria_code/runtime/repo_map.py +712 -0
- aria_code/runtime/research_bundle.py +105 -0
- aria_code/runtime/review.py +269 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +522 -0
- aria_code/runtime/scoped_runs.py +113 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/semantic_diff.py +171 -0
- aria_code/runtime/subagent.py +721 -0
- aria_code/runtime/symbol_edit.py +117 -0
- aria_code/runtime/task_brief.py +46 -0
- aria_code/runtime/task_context.py +145 -0
- aria_code/runtime/task_ledger.py +108 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/task_outcome.py +33 -0
- aria_code/runtime/task_verification.py +266 -0
- aria_code/runtime/task_worktree.py +448 -0
- aria_code/runtime/tool_executor.py +329 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/transactions.py +216 -0
- aria_code/runtime/windows_job.py +115 -0
- aria_code/runtime/workflows.py +222 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +27 -0
- aria_code/safety/client_isolation.py +178 -0
- aria_code/safety/permissions.py +339 -0
- aria_code/safety/risk.py +699 -0
- aria_code/safety/sandbox.py +148 -0
- aria_code/safety/service.py +102 -0
- aria_code/service_endpoints.py +14 -0
- aria_code/setup_wizard.py +684 -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 +509 -0
- aria_code/tools/data_analysis_tools.py +831 -0
- aria_code/tools/enterprise_finance_tools.py +202 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +880 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3488 -0
- aria_code/tools/logistics_carriers.py +11 -0
- aria_code/tools/logistics_inventory.py +11 -0
- aria_code/tools/logistics_io.py +11 -0
- aria_code/tools/logistics_tenancy.py +11 -0
- aria_code/tools/logistics_tools.py +11 -0
- aria_code/tools/macro_tools.py +412 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +662 -0
- aria_code/tools/spreadsheet_tools.py +399 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/tools/video_tools.py +500 -0
- aria_code/training/__init__.py +1 -0
- aria_code/training/compare.py +117 -0
- aria_code/training/prelude_commands.py +111 -0
- aria_code/training/prelude_eval.py +390 -0
- aria_code/training/prelude_real.py +183 -0
- aria_code/training/prelude_train.py +248 -0
- aria_code/training/sft_dataset.py +230 -0
- aria_code/training/trajectory_dataset.py +263 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +404 -0
- aria_code/ui/completer.py +571 -0
- aria_code/ui/console.py +285 -0
- aria_code/ui/input_box.py +505 -0
- aria_code/ui/mentions.py +206 -0
- aria_code/ui/picker.py +248 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/actions.py +297 -0
- aria_code/ui/render/finance.py +1732 -0
- aria_code/ui/render/market.py +253 -0
- aria_code/ui/render/output.py +954 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +367 -0
- aria_code/ui/robot.py +239 -0
- aria_code/ui/startup_dashboard.py +110 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +518 -0
- aria_code/video_workflow/__init__.py +8 -0
- aria_code/video_workflow/__main__.py +61 -0
- aria_code/video_workflow/engines/__init__.py +18 -0
- aria_code/video_workflow/engines/base.py +69 -0
- aria_code/video_workflow/engines/custom_model.py +204 -0
- aria_code/video_workflow/engines/google_veo.py +94 -0
- aria_code/video_workflow/engines/local_engine.py +71 -0
- aria_code/video_workflow/engines/registry.py +98 -0
- aria_code/video_workflow/google_models.py +278 -0
- aria_code/video_workflow/music/__init__.py +5 -0
- aria_code/video_workflow/music/foley_service.py +132 -0
- aria_code/video_workflow/music/service.py +212 -0
- aria_code/video_workflow/pipeline.py +620 -0
- aria_code/video_workflow/plan.py +202 -0
- aria_code/video_workflow/session.py +297 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +219 -0
- aria_code/workspace/verify.py +167 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.167.0.dist-info/METADATA +330 -0
- aria_code-0.167.0.dist-info/RECORD +601 -0
- aria_code-0.167.0.dist-info/WHEEL +5 -0
- aria_code-0.167.0.dist-info/entry_points.txt +5 -0
- aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.167.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""查找已安装 skills 并桥接显式配置的 Arthera 子包。
|
|
2
|
+
|
|
3
|
+
skill 那边其实早就有一套正规的发现顺序 —— packages/aria_skills/loader.py
|
|
4
|
+
的 default_skill_roots()(ARIA_SKILLS_PATH 环境变量 → 同级 aria-skills
|
|
5
|
+
checkout → ~/.arthera/skills → ~/.claude/skills → …)。这里直接复用它,
|
|
6
|
+
而不是再写第二套查找逻辑,免得两处顺序不一致时出现"CLI 能发现这个 skill、
|
|
7
|
+
工具却找不到它的脚本"。
|
|
8
|
+
|
|
9
|
+
Arthera 子包是私有仓库的东西,公开仓库无从假设它在哪;仅支持显式的
|
|
10
|
+
ARTHERA_ROOT / ARTHERA_PATH 设置,不隐式发现相邻源码目录。
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import sys
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from aria_code.packages.aria_core.paths import aria_home
|
|
19
|
+
|
|
20
|
+
__all__ = ["find_skill_script", "missing_script_message", "ensure_arthera_root"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _skill_roots() -> list[Path]:
|
|
24
|
+
"""优先复用 skill loader 的发现顺序;它不可用时退化为等价的最小实现。"""
|
|
25
|
+
try:
|
|
26
|
+
from packages.aria_skills.loader import default_skill_roots
|
|
27
|
+
|
|
28
|
+
return [Path(p) for p in default_skill_roots()]
|
|
29
|
+
except Exception:
|
|
30
|
+
roots: list[Path] = []
|
|
31
|
+
configured = os.getenv("ARIA_SKILLS_PATH", "")
|
|
32
|
+
roots.extend(
|
|
33
|
+
Path(item).expanduser() for item in configured.split(os.pathsep) if item.strip()
|
|
34
|
+
)
|
|
35
|
+
repository = Path(__file__).resolve().parents[3]
|
|
36
|
+
roots.extend([
|
|
37
|
+
repository.parent / "aria-skills" / "skills",
|
|
38
|
+
aria_home() / "skills",
|
|
39
|
+
Path.home() / ".aria" / "skills",
|
|
40
|
+
Path.home() / ".claude" / "skills",
|
|
41
|
+
])
|
|
42
|
+
return roots
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def find_skill_script(skill_name: str, script_name: str) -> Path | None:
|
|
46
|
+
"""返回 <某个 skill 根>/<skill_name>/scripts/<script_name>,找不到返回 None。
|
|
47
|
+
|
|
48
|
+
调用方负责把 None 变成对用户有意义的提示——这里不抛异常,因为"本机没装
|
|
49
|
+
这个 skill 目录"是完全正常的部署形态,不是错误。
|
|
50
|
+
"""
|
|
51
|
+
for root in _skill_roots():
|
|
52
|
+
candidate = root / skill_name / "scripts" / script_name
|
|
53
|
+
try:
|
|
54
|
+
if candidate.is_file():
|
|
55
|
+
return candidate
|
|
56
|
+
except OSError:
|
|
57
|
+
continue
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def missing_script_message(skill_name: str, script_name: str) -> str:
|
|
62
|
+
"""脚本缺失时给出可操作的提示,而不是打印一条别人机器上不存在的路径。"""
|
|
63
|
+
return (
|
|
64
|
+
f"Error: 找不到 {skill_name}/scripts/{script_name}。"
|
|
65
|
+
" 请获取 aria-skills 目录,并用 ARIA_SKILLS_PATH 指向其中的 skills/,"
|
|
66
|
+
"或把它放在 aria-code 的同级目录下。"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def ensure_arthera_root() -> bool:
|
|
71
|
+
"""把 Arthera 仓库根目录加进 sys.path,让 ``packages.*`` 可导入。返回是否找到。
|
|
72
|
+
|
|
73
|
+
Arthera 是私有仓库,公开仓库不该假设它
|
|
74
|
+
在某个写死的绝对路径上。这里认的是 ``ARTHERA_ROOT``(doctor.py 与
|
|
75
|
+
backtest_cmds.py 已经在用的同一个变量),不隐式发现旁边的源码目录。
|
|
76
|
+
"""
|
|
77
|
+
candidates: list[Path] = []
|
|
78
|
+
for var in ("ARTHERA_ROOT", "ARTHERA_PATH"):
|
|
79
|
+
configured = os.getenv(var, "")
|
|
80
|
+
if configured.strip():
|
|
81
|
+
candidates.append(Path(configured).expanduser())
|
|
82
|
+
|
|
83
|
+
for candidate in candidates:
|
|
84
|
+
try:
|
|
85
|
+
if candidate.is_dir():
|
|
86
|
+
path_str = str(candidate)
|
|
87
|
+
if path_str not in sys.path:
|
|
88
|
+
sys.path.append(path_str)
|
|
89
|
+
return True
|
|
90
|
+
except OSError:
|
|
91
|
+
continue
|
|
92
|
+
return False
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Tool registry facade over Aria Code's legacy LOCAL_TOOLS shape."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import Any, Callable, Dict, Iterable, List, Mapping, Optional
|
|
7
|
+
|
|
8
|
+
from aria_code.packages.aria_core import CapabilityManifest, PermissionLevel, ServiceKind
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Handler = Callable[[dict], dict]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
_PERMISSION_BY_TOOL = {
|
|
15
|
+
"read_file": [PermissionLevel.READ_ONLY],
|
|
16
|
+
"list_files": [PermissionLevel.READ_ONLY],
|
|
17
|
+
"search_code": [PermissionLevel.READ_ONLY],
|
|
18
|
+
"glob": [PermissionLevel.READ_ONLY],
|
|
19
|
+
"write_file": [PermissionLevel.WORKSPACE_WRITE],
|
|
20
|
+
"edit_file": [PermissionLevel.WORKSPACE_WRITE],
|
|
21
|
+
"notebook_edit": [PermissionLevel.WORKSPACE_WRITE],
|
|
22
|
+
"run_command": [PermissionLevel.WORKSPACE_WRITE],
|
|
23
|
+
"process": [PermissionLevel.WORKSPACE_WRITE],
|
|
24
|
+
"web_fetch": [PermissionLevel.NETWORK],
|
|
25
|
+
"github": [PermissionLevel.NETWORK],
|
|
26
|
+
"get_market_data": [PermissionLevel.NETWORK],
|
|
27
|
+
"broker_query": [PermissionLevel.BROKER_READ],
|
|
28
|
+
"broker_order": [PermissionLevel.BROKER_TRADE],
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class ToolSpec:
|
|
34
|
+
name: str
|
|
35
|
+
handler: Optional[Handler]
|
|
36
|
+
description: str
|
|
37
|
+
schema: Dict[str, Any] = field(default_factory=dict)
|
|
38
|
+
permissions: List[PermissionLevel] = field(default_factory=list)
|
|
39
|
+
capabilities: List[str] = field(default_factory=list)
|
|
40
|
+
|
|
41
|
+
def manifest(self) -> CapabilityManifest:
|
|
42
|
+
return CapabilityManifest(
|
|
43
|
+
name=self.name,
|
|
44
|
+
kind=ServiceKind.TOOL,
|
|
45
|
+
description=self.description,
|
|
46
|
+
capabilities=self.capabilities,
|
|
47
|
+
permissions=self.permissions,
|
|
48
|
+
input_schema=self.schema,
|
|
49
|
+
tags=["tool"],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ToolRegistry:
|
|
54
|
+
"""Small typed registry that can wrap existing dict-based tools."""
|
|
55
|
+
|
|
56
|
+
def __init__(self) -> None:
|
|
57
|
+
self._tools: Dict[str, ToolSpec] = {}
|
|
58
|
+
|
|
59
|
+
def register(self, spec: ToolSpec, *, overwrite: bool = False) -> None:
|
|
60
|
+
if spec.name in self._tools and not overwrite:
|
|
61
|
+
raise ValueError(f"tool already registered: {spec.name}")
|
|
62
|
+
self._tools[spec.name] = spec
|
|
63
|
+
|
|
64
|
+
def get(self, name: str) -> Optional[ToolSpec]:
|
|
65
|
+
return self._tools.get(name)
|
|
66
|
+
|
|
67
|
+
def list(self) -> List[ToolSpec]:
|
|
68
|
+
return [self._tools[name] for name in sorted(self._tools)]
|
|
69
|
+
|
|
70
|
+
def manifests(self) -> List[CapabilityManifest]:
|
|
71
|
+
return [tool.manifest() for tool in self.list()]
|
|
72
|
+
|
|
73
|
+
def legacy_tools(self) -> Dict[str, tuple]:
|
|
74
|
+
return {
|
|
75
|
+
name: (spec.handler, spec.description)
|
|
76
|
+
for name, spec in self._tools.items()
|
|
77
|
+
if spec.handler is not None
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _schema_by_name(schemas: Iterable[dict]) -> Dict[str, dict]:
|
|
82
|
+
out: Dict[str, dict] = {}
|
|
83
|
+
for schema in schemas or []:
|
|
84
|
+
fn = schema.get("function") or {}
|
|
85
|
+
name = fn.get("name")
|
|
86
|
+
if name:
|
|
87
|
+
out[name] = fn.get("parameters") or {}
|
|
88
|
+
return out
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _capabilities_for_tool(name: str) -> List[str]:
|
|
92
|
+
if name.startswith("broker_"):
|
|
93
|
+
return ["broker"]
|
|
94
|
+
if name in ("get_market_data",) or "market" in name or "quote" in name:
|
|
95
|
+
return ["market.data"]
|
|
96
|
+
if name in ("read_file", "list_files", "search_code", "glob"):
|
|
97
|
+
return ["workspace.read"]
|
|
98
|
+
if name in ("write_file", "edit_file", "notebook_edit"):
|
|
99
|
+
return ["workspace.write"]
|
|
100
|
+
if name in ("run_command", "process"):
|
|
101
|
+
return ["shell"]
|
|
102
|
+
if name in ("web_fetch", "github"):
|
|
103
|
+
return ["network"]
|
|
104
|
+
return ["tool"]
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def build_registry_from_legacy(
|
|
108
|
+
tools: Mapping[str, tuple],
|
|
109
|
+
schemas: Iterable[dict] = (),
|
|
110
|
+
) -> ToolRegistry:
|
|
111
|
+
"""Create a typed registry from ``LOCAL_TOOLS`` and tool schemas."""
|
|
112
|
+
|
|
113
|
+
registry = ToolRegistry()
|
|
114
|
+
schema_map = _schema_by_name(schemas)
|
|
115
|
+
for name, value in tools.items():
|
|
116
|
+
handler = value[0] if value else None
|
|
117
|
+
description = value[1] if len(value) > 1 else ""
|
|
118
|
+
registry.register(
|
|
119
|
+
ToolSpec(
|
|
120
|
+
name=name,
|
|
121
|
+
handler=handler,
|
|
122
|
+
description=description,
|
|
123
|
+
schema=schema_map.get(name, {}),
|
|
124
|
+
permissions=_PERMISSION_BY_TOOL.get(name, [PermissionLevel.READ_ONLY]),
|
|
125
|
+
capabilities=_capabilities_for_tool(name),
|
|
126
|
+
),
|
|
127
|
+
overwrite=True,
|
|
128
|
+
)
|
|
129
|
+
return registry
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""quant_engine — vendored commodity quant modules (sports + stochastic).
|
|
2
|
+
|
|
3
|
+
Elo/Dixon-Coles football prediction and Black-Scholes/Monte-Carlo/Kelly
|
|
4
|
+
options+derivatives math. Proprietary factor/ML/strategy engines stay in the
|
|
5
|
+
private Arthera platform.
|
|
6
|
+
|
|
7
|
+
Open-core boundary: callers MUST go through ``is_available()`` and degrade
|
|
8
|
+
gracefully when it returns False. Today the source is bundled, so it is always
|
|
9
|
+
available — but routing every use through this boundary means the day the engine
|
|
10
|
+
is split into a separate compiled (.so) wheel, the free shell keeps working with
|
|
11
|
+
no caller changes (see tools/build_quant_engine.py, CLOSING_SOURCE.md).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from importlib.util import find_spec
|
|
15
|
+
|
|
16
|
+
# Compiled/private engine distributions may retain only this public stub.
|
|
17
|
+
# Absence of the optional extension helper must not prevent is_available().
|
|
18
|
+
try:
|
|
19
|
+
from ._namespace import extend as _extend_namespace
|
|
20
|
+
except ImportError:
|
|
21
|
+
pass
|
|
22
|
+
else:
|
|
23
|
+
_extend_namespace(__path__, "")
|
|
24
|
+
|
|
25
|
+
__version__ = "1.0.0"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def is_available() -> bool:
|
|
29
|
+
"""True if the quant engine (bundled source or compiled wheel) can be imported."""
|
|
30
|
+
try:
|
|
31
|
+
return find_spec("aria_code.packages.quant_engine.stochastic") is not None
|
|
32
|
+
except Exception:
|
|
33
|
+
return False
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Explicit legacy backend opt-in; never search a developer's filesystem.
|
|
2
|
+
|
|
3
|
+
Standalone financial-service over MCP is the normal integration. Existing
|
|
4
|
+
private integrations may deliberately set ARTHERA_ROOT until their public API
|
|
5
|
+
cutover. Bundled modules keep precedence over that configured source.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import List
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def extend(package_path: List[str], subpackage: str) -> None:
|
|
16
|
+
configured = os.getenv("ARTHERA_ROOT", "").strip()
|
|
17
|
+
if not configured:
|
|
18
|
+
return
|
|
19
|
+
candidate = Path(configured).expanduser() / "packages" / "quant_engine" / subpackage
|
|
20
|
+
try:
|
|
21
|
+
if candidate.is_dir() and str(candidate) not in package_path:
|
|
22
|
+
package_path.append(str(candidate))
|
|
23
|
+
except OSError:
|
|
24
|
+
return
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Backtest engine for evaluating AI trading signals."""
|
|
2
|
+
|
|
3
|
+
from .core import Order, Position, Portfolio
|
|
4
|
+
from .engine import BacktestEngine
|
|
5
|
+
|
|
6
|
+
__all__ = ["Order", "Position", "Portfolio", "BacktestEngine"]
|
|
7
|
+
|
|
8
|
+
# Optional explicit backend modules never override this distribution.
|
|
9
|
+
from .._namespace import extend as _extend_namespace
|
|
10
|
+
_extend_namespace(__path__, "backtest")
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import Dict, List, Optional
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
@dataclass
|
|
6
|
+
class Order:
|
|
7
|
+
symbol: str
|
|
8
|
+
quantity: float
|
|
9
|
+
price: float
|
|
10
|
+
order_type: str = "MARKET"
|
|
11
|
+
direction: str = "BUY" # BUY or SELL
|
|
12
|
+
status: str = "PENDING"
|
|
13
|
+
timestamp: Optional[datetime] = None
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class Position:
|
|
17
|
+
symbol: str
|
|
18
|
+
quantity: float = 0.0
|
|
19
|
+
avg_price: float = 0.0
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def market_value(self, current_price: float) -> float:
|
|
23
|
+
return self.quantity * current_price
|
|
24
|
+
|
|
25
|
+
def update(self, quantity: float, price: float, is_buy: bool):
|
|
26
|
+
if is_buy:
|
|
27
|
+
total_cost = (self.quantity * self.avg_price) + (quantity * price)
|
|
28
|
+
self.quantity += quantity
|
|
29
|
+
self.avg_price = total_cost / self.quantity if self.quantity > 0 else 0
|
|
30
|
+
else:
|
|
31
|
+
self.quantity -= quantity
|
|
32
|
+
if self.quantity <= 0:
|
|
33
|
+
self.avg_price = 0.0
|
|
34
|
+
self.quantity = 0.0
|
|
35
|
+
|
|
36
|
+
class Portfolio:
|
|
37
|
+
def __init__(self, initial_cash: float = 100000.0):
|
|
38
|
+
self.initial_cash = initial_cash
|
|
39
|
+
self.cash = initial_cash
|
|
40
|
+
self.positions: Dict[str, Position] = {}
|
|
41
|
+
self.history: List[Dict] = []
|
|
42
|
+
|
|
43
|
+
def get_position(self, symbol: str) -> Position:
|
|
44
|
+
if symbol not in self.positions:
|
|
45
|
+
self.positions[symbol] = Position(symbol=symbol)
|
|
46
|
+
return self.positions[symbol]
|
|
47
|
+
|
|
48
|
+
def total_value(self, current_prices: Dict[str, float]) -> float:
|
|
49
|
+
pos_value = sum(
|
|
50
|
+
pos.quantity * current_prices.get(sym, pos.avg_price)
|
|
51
|
+
for sym, pos in self.positions.items()
|
|
52
|
+
)
|
|
53
|
+
return self.cash + pos_value
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from typing import List, Dict, Any
|
|
2
|
+
import pandas as pd
|
|
3
|
+
from .core import Portfolio, Order
|
|
4
|
+
|
|
5
|
+
class BacktestEngine:
|
|
6
|
+
"""Minimal Event-Driven Backtest Engine for Agent Signals"""
|
|
7
|
+
|
|
8
|
+
def __init__(self, initial_cash: float = 100000.0):
|
|
9
|
+
self.portfolio = Portfolio(initial_cash=initial_cash)
|
|
10
|
+
self.orders: List[Order] = []
|
|
11
|
+
|
|
12
|
+
def run_signals(self, price_data: pd.DataFrame, signals: List[Dict[str, Any]]):
|
|
13
|
+
"""
|
|
14
|
+
Run backtest based on daily prices and agent signals.
|
|
15
|
+
price_data expects index to be datetime, with 'close' column.
|
|
16
|
+
signals expects format: [{'date': 'YYYY-MM-DD', 'signal': 'BUY', 'confidence': 0.8, 'symbol': 'AAPL'}]
|
|
17
|
+
"""
|
|
18
|
+
# Convert signals to a dictionary indexed by date for O(1) lookup
|
|
19
|
+
signal_dict = {}
|
|
20
|
+
for s in signals:
|
|
21
|
+
try:
|
|
22
|
+
date_str = pd.to_datetime(s['date']).strftime('%Y-%m-%d')
|
|
23
|
+
signal_dict[date_str] = s
|
|
24
|
+
except (ValueError, TypeError, KeyError):
|
|
25
|
+
# 裸 except 会连 KeyboardInterrupt / SystemExit 一起吞掉——
|
|
26
|
+
# 循环里跑着时用户按 Ctrl+C 会被静默忽略。这里真正要容忍的
|
|
27
|
+
# 只是"某条信号的日期字段解析不了",收窄到具体异常。
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
equity_curve = []
|
|
31
|
+
|
|
32
|
+
for date, row in price_data.iterrows():
|
|
33
|
+
current_price = float(row['close'])
|
|
34
|
+
date_str = date.strftime('%Y-%m-%d')
|
|
35
|
+
symbol = "UNKNOWN" # Simplification for single-asset backtest for now
|
|
36
|
+
|
|
37
|
+
# Check for signals on this date
|
|
38
|
+
if date_str in signal_dict:
|
|
39
|
+
sig = signal_dict[date_str]
|
|
40
|
+
symbol = sig.get('symbol', 'UNKNOWN')
|
|
41
|
+
action = sig.get('signal', 'HOLD').upper()
|
|
42
|
+
confidence = float(sig.get('confidence', 0.5))
|
|
43
|
+
|
|
44
|
+
if action == 'BUY':
|
|
45
|
+
# Allocate portion of cash based on confidence
|
|
46
|
+
target_investment = self.portfolio.cash * confidence
|
|
47
|
+
qty = int(target_investment / current_price)
|
|
48
|
+
if qty > 0:
|
|
49
|
+
cost = qty * current_price
|
|
50
|
+
self.portfolio.cash -= cost
|
|
51
|
+
pos = self.portfolio.get_position(symbol)
|
|
52
|
+
pos.update(qty, current_price, True)
|
|
53
|
+
self.orders.append(Order(symbol, qty, current_price, direction="BUY", status="FILLED", timestamp=date))
|
|
54
|
+
|
|
55
|
+
elif action in ['SELL', 'REDUCE']:
|
|
56
|
+
pos = self.portfolio.get_position(symbol)
|
|
57
|
+
if pos.quantity > 0:
|
|
58
|
+
# Sell portion based on confidence
|
|
59
|
+
sell_qty = int(pos.quantity * confidence)
|
|
60
|
+
if sell_qty > 0:
|
|
61
|
+
proceeds = sell_qty * current_price
|
|
62
|
+
self.portfolio.cash += proceeds
|
|
63
|
+
pos.update(sell_qty, current_price, False)
|
|
64
|
+
self.orders.append(Order(symbol, sell_qty, current_price, direction="SELL", status="FILLED", timestamp=date))
|
|
65
|
+
|
|
66
|
+
# Record daily equity
|
|
67
|
+
total_val = self.portfolio.total_value({symbol: current_price})
|
|
68
|
+
equity_curve.append({
|
|
69
|
+
'date': date,
|
|
70
|
+
'total_value': total_val,
|
|
71
|
+
'cash': self.portfolio.cash
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
return pd.DataFrame(equity_curve).set_index('date')
|
|
75
|
+
|
|
76
|
+
def calculate_metrics(self, equity_df: pd.DataFrame) -> Dict[str, float]:
|
|
77
|
+
if equity_df.empty:
|
|
78
|
+
return {}
|
|
79
|
+
|
|
80
|
+
returns = equity_df['total_value'].pct_change().dropna()
|
|
81
|
+
total_return = (equity_df['total_value'].iloc[-1] / self.portfolio.initial_cash) - 1.0
|
|
82
|
+
|
|
83
|
+
# Periods a year from the equity curve's own dates; 252 when it has none.
|
|
84
|
+
from aria_code.domain import performance_stats as stats
|
|
85
|
+
|
|
86
|
+
periods = stats.periods_per_year_from_dates(
|
|
87
|
+
len(returns), equity_df.index[0], equity_df.index[-1]
|
|
88
|
+
) or float(stats.FALLBACK_PERIODS_PER_YEAR)
|
|
89
|
+
ann_vol = returns.std() * (periods ** 0.5) if not returns.empty else 0.0
|
|
90
|
+
sharpe = (returns.mean() * periods) / ann_vol if ann_vol > 0 else 0.0
|
|
91
|
+
|
|
92
|
+
cum_ret = (1 + returns).cumprod()
|
|
93
|
+
peak = cum_ret.cummax()
|
|
94
|
+
drawdown = (cum_ret - peak) / peak
|
|
95
|
+
max_dd = drawdown.min()
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"total_return_pct": round(total_return * 100, 2),
|
|
99
|
+
"annualized_volatility_pct": round(ann_vol * 100, 2),
|
|
100
|
+
"sharpe_ratio": round(sharpe, 2),
|
|
101
|
+
"max_drawdown_pct": round(max_dd * 100, 2) if not pd.isna(max_dd) else 0.0
|
|
102
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Portfolio optimization engine."""
|
|
2
|
+
|
|
3
|
+
from .optimizer import PortfolioOptimizer
|
|
4
|
+
|
|
5
|
+
__all__ = ["PortfolioOptimizer"]
|
|
6
|
+
|
|
7
|
+
# Optional explicit backend modules never override this distribution.
|
|
8
|
+
from .._namespace import extend as _extend_namespace
|
|
9
|
+
_extend_namespace(__path__, "portfolio")
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pandas as pd
|
|
3
|
+
from scipy.optimize import minimize
|
|
4
|
+
from typing import Dict, List, Tuple
|
|
5
|
+
|
|
6
|
+
class PortfolioOptimizer:
|
|
7
|
+
"""Quantitative Portfolio Optimization Engine"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, risk_free_rate: float = 0.02):
|
|
10
|
+
self.risk_free_rate = risk_free_rate
|
|
11
|
+
|
|
12
|
+
def _get_returns_stats(self, prices_df: pd.DataFrame) -> Tuple[np.ndarray, np.ndarray]:
|
|
13
|
+
returns = prices_df.pct_change().dropna()
|
|
14
|
+
mean_returns = returns.mean().values * 252
|
|
15
|
+
cov_matrix = returns.cov().values * 252
|
|
16
|
+
return mean_returns, cov_matrix
|
|
17
|
+
|
|
18
|
+
def portfolio_performance(self, weights: np.ndarray, mean_returns: np.ndarray, cov_matrix: np.ndarray) -> Tuple[float, float]:
|
|
19
|
+
returns = np.sum(mean_returns * weights)
|
|
20
|
+
std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
|
|
21
|
+
return returns, std
|
|
22
|
+
|
|
23
|
+
def min_variance(self, prices_df: pd.DataFrame) -> Dict[str, float]:
|
|
24
|
+
"""Minimize portfolio variance"""
|
|
25
|
+
symbols = prices_df.columns.tolist()
|
|
26
|
+
num_assets = len(symbols)
|
|
27
|
+
_, cov_matrix = self._get_returns_stats(prices_df)
|
|
28
|
+
|
|
29
|
+
args = (cov_matrix,)
|
|
30
|
+
def portfolio_volatility(weights, cov):
|
|
31
|
+
return np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
|
|
32
|
+
|
|
33
|
+
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
|
|
34
|
+
bounds = tuple((0.0, 1.0) for asset in range(num_assets))
|
|
35
|
+
initial_guess = num_assets * [1. / num_assets,]
|
|
36
|
+
|
|
37
|
+
result = minimize(portfolio_volatility, initial_guess, args=args,
|
|
38
|
+
method='SLSQP', bounds=bounds, constraints=constraints)
|
|
39
|
+
|
|
40
|
+
return {sym: round(weight, 4) for sym, weight in zip(symbols, result.x)}
|
|
41
|
+
|
|
42
|
+
def max_sharpe(self, prices_df: pd.DataFrame) -> Dict[str, float]:
|
|
43
|
+
"""Maximize Sharpe Ratio"""
|
|
44
|
+
symbols = prices_df.columns.tolist()
|
|
45
|
+
num_assets = len(symbols)
|
|
46
|
+
mean_returns, cov_matrix = self._get_returns_stats(prices_df)
|
|
47
|
+
|
|
48
|
+
def neg_sharpe_ratio(weights, mean_ret, cov, rf_rate):
|
|
49
|
+
p_ret, p_std = self.portfolio_performance(weights, mean_ret, cov)
|
|
50
|
+
return -(p_ret - rf_rate) / p_std
|
|
51
|
+
|
|
52
|
+
args = (mean_returns, cov_matrix, self.risk_free_rate)
|
|
53
|
+
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
|
|
54
|
+
bounds = tuple((0.0, 1.0) for asset in range(num_assets))
|
|
55
|
+
initial_guess = num_assets * [1. / num_assets,]
|
|
56
|
+
|
|
57
|
+
result = minimize(neg_sharpe_ratio, initial_guess, args=args,
|
|
58
|
+
method='SLSQP', bounds=bounds, constraints=constraints)
|
|
59
|
+
|
|
60
|
+
return {sym: round(weight, 4) for sym, weight in zip(symbols, result.x)}
|
|
61
|
+
|
|
62
|
+
def risk_parity(self, prices_df: pd.DataFrame) -> Dict[str, float]:
|
|
63
|
+
"""Inverse volatility weighting (naive risk parity)"""
|
|
64
|
+
returns = prices_df.pct_change().dropna()
|
|
65
|
+
volatilities = returns.std() * np.sqrt(252)
|
|
66
|
+
inv_vol = 1.0 / volatilities
|
|
67
|
+
weights = inv_vol / inv_vol.sum()
|
|
68
|
+
|
|
69
|
+
return {sym: round(weights[sym], 4) for sym in prices_df.columns}
|
|
70
|
+
|
|
71
|
+
def combine_agent_signals(self, optimal_weights: Dict[str, float], agent_confidences: Dict[str, float]) -> Dict[str, float]:
|
|
72
|
+
"""
|
|
73
|
+
Adjust optimal weights based on Agent confidence.
|
|
74
|
+
For example, if max_sharpe gives AAPL 0.6, but Agent confidence is 0.5,
|
|
75
|
+
we scale it down and keep remaining in cash.
|
|
76
|
+
"""
|
|
77
|
+
final_weights = {}
|
|
78
|
+
for sym, w in optimal_weights.items():
|
|
79
|
+
conf = agent_confidences.get(sym, 1.0)
|
|
80
|
+
final_weights[sym] = round(w * conf, 4)
|
|
81
|
+
|
|
82
|
+
cash_weight = round(1.0 - sum(final_weights.values()), 4)
|
|
83
|
+
final_weights['CASH'] = max(0.0, cash_weight)
|
|
84
|
+
|
|
85
|
+
return final_weights
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""
|
|
2
|
+
packages/quant_engine/sports — 足球量化分析模块
|
|
3
|
+
================================================
|
|
4
|
+
v2.0.0 — 2026-06
|
|
5
|
+
|
|
6
|
+
模块组成:
|
|
7
|
+
elo — World Football Elo 动态评分系统(二次曲线攻防,GD K 因子)
|
|
8
|
+
dixon_coles — Dixon-Coles 比分预测(NB 分布,大比分悬殊自动启用)
|
|
9
|
+
form — 近期状态分析(指数衰减权重)
|
|
10
|
+
h2h — 历史交锋分析与调整
|
|
11
|
+
predictor — 统一预测引擎 v2(动态权重、赛事情境、ρ 校准)
|
|
12
|
+
tracker — 预测追踪、Brier Score、自动 Elo 同步、动态场均进球
|
|
13
|
+
|
|
14
|
+
快速使用:
|
|
15
|
+
from packages.quant_engine.sports import quick_predict, get_elo
|
|
16
|
+
|
|
17
|
+
# 预测(含 NB 分布 + 动态权重)
|
|
18
|
+
result = quick_predict("germany", "curacao", league="wc")
|
|
19
|
+
print(f"德国赢率: {result['home_win']*100:.1f}%") # ~85%
|
|
20
|
+
|
|
21
|
+
# Elo 评分
|
|
22
|
+
elo = get_elo()
|
|
23
|
+
print(elo.get_rating("germany")) # ~1912(赛后更新)
|
|
24
|
+
|
|
25
|
+
# 自动同步已结束 WC 比赛 Elo
|
|
26
|
+
from packages.quant_engine.sports import sync_elo_from_wc
|
|
27
|
+
sync_elo_from_wc(api_get_fn)
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from .elo import EloRatingSystem, get_elo, ranking_to_elo
|
|
31
|
+
from .dixon_coles import (
|
|
32
|
+
compute_match_probabilities,
|
|
33
|
+
predict_scoreline_matrix,
|
|
34
|
+
tau_correction,
|
|
35
|
+
estimate_rho_from_results,
|
|
36
|
+
format_dc_result,
|
|
37
|
+
)
|
|
38
|
+
from .form import analyze_form, parse_api_results, form_bar, momentum_label
|
|
39
|
+
from .h2h import analyze_h2h
|
|
40
|
+
from .predictor import FootballPredictor, get_predictor, quick_predict
|
|
41
|
+
from .tracker import (
|
|
42
|
+
record_prediction,
|
|
43
|
+
record_result,
|
|
44
|
+
get_accuracy_stats,
|
|
45
|
+
sync_elo_from_wc,
|
|
46
|
+
fetch_wc_league_avg,
|
|
47
|
+
fetch_wc_rho,
|
|
48
|
+
auto_calibrate,
|
|
49
|
+
backfill_score_metrics,
|
|
50
|
+
)
|
|
51
|
+
from .calibrator import (
|
|
52
|
+
get_calibrated_params,
|
|
53
|
+
get_team_goal_bias,
|
|
54
|
+
get_all_team_biases,
|
|
55
|
+
calibration_summary,
|
|
56
|
+
save_calibration,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
__all__ = [
|
|
60
|
+
"EloRatingSystem", "get_elo", "ranking_to_elo",
|
|
61
|
+
"compute_match_probabilities", "predict_scoreline_matrix",
|
|
62
|
+
"tau_correction", "estimate_rho_from_results", "format_dc_result",
|
|
63
|
+
"analyze_form", "parse_api_results", "form_bar", "momentum_label",
|
|
64
|
+
"analyze_h2h",
|
|
65
|
+
"FootballPredictor", "get_predictor", "quick_predict",
|
|
66
|
+
"record_prediction", "record_result", "get_accuracy_stats",
|
|
67
|
+
"sync_elo_from_wc", "fetch_wc_league_avg", "fetch_wc_rho", "auto_calibrate",
|
|
68
|
+
"get_calibrated_params", "get_team_goal_bias", "get_all_team_biases",
|
|
69
|
+
"calibration_summary", "save_calibration",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
__version__ = "2.0.0"
|
|
73
|
+
|
|
74
|
+
# Optional explicit backend modules never override this distribution.
|
|
75
|
+
from .._namespace import extend as _extend_namespace
|
|
76
|
+
_extend_namespace(__path__, "sports")
|