aria-code 4.2.0__tar.gz → 4.4.0__tar.gz
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-4.2.0/aria_code.egg-info → aria_code-4.4.0}/PKG-INFO +106 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/README.md +93 -1
- aria_code-4.4.0/adk_apps/__init__.py +1 -0
- aria_code-4.4.0/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code-4.4.0/adk_apps/aria_code_review/agent.py +32 -0
- aria_code-4.4.0/adk_apps/aria_research/__init__.py +1 -0
- aria_code-4.4.0/adk_apps/aria_research/agent.py +31 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/base.py +119 -29
- aria_code-4.4.0/agents/code_review.py +200 -0
- aria_code-4.4.0/agents/financial/debate.py +224 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/fundamental.py +33 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/risk.py +34 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/registry.py +6 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/signal_scheme.py +14 -0
- aria_code-4.4.0/agents/supervisor.py +113 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/team.py +117 -8
- aria_code-4.4.0/agents/warehouse/__init__.py +15 -0
- aria_code-4.4.0/agents/warehouse/contracts.py +26 -0
- aria_code-4.4.0/agents/warehouse/dashboard.py +155 -0
- aria_code-4.4.0/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code-4.4.0/agents/warehouse/inventory_health.py +24 -0
- aria_code-4.4.0/agents/warehouse/local_run.py +71 -0
- aria_code-4.4.0/agents/warehouse/local_snapshot.py +132 -0
- aria_code-4.4.0/agents/warehouse/logistics_sync.py +21 -0
- aria_code-4.4.0/agents/warehouse/workflow.py +31 -0
- aria_code-4.4.0/aliyun_data_client.py +4 -0
- aria_code-4.4.0/apps/cli/broker_render.py +206 -0
- aria_code-4.4.0/apps/cli/commands/ashare_prediction_cmds.py +299 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/backtest_cmds.py +6 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/broker_cmds.py +45 -2
- aria_code-4.4.0/apps/cli/commands/canvas_cmds.py +54 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/catalog.py +7 -4
- aria_code-4.4.0/apps/cli/commands/core_cmds.py +2411 -0
- aria_code-4.4.0/apps/cli/commands/finance_service_cmds.py +32 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/model_cmds.py +122 -1
- aria_code-4.4.0/apps/cli/commands/orchestrator_cmds.py +36 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/portfolio_cmds.py +18 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/team.py +15 -2
- aria_code-4.4.0/apps/cli/commands/warehouse_cmds.py +51 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/workflow_cmds.py +31 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/workspace_cmds.py +4 -3
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/config_paths.py +10 -7
- aria_code-4.4.0/apps/cli/finance_service_catalog.py +111 -0
- aria_code-4.4.0/apps/cli/football_reports.py +231 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/handlers/market_handlers.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/intent_router.py +23 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/message_processing.py +66 -13
- aria_code-4.4.0/apps/cli/model_catalog.py +408 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/prompts/system_prompts.py +11 -16
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/chat_routing.py +2 -0
- aria_code-4.4.0/apps/cli/providers/collaboration.py +98 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/llm/ollama_stream.py +24 -8
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/runtime_consumer.py +19 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/session_jsonl.py +2 -1
- aria_code-4.4.0/apps/cli/skills_catalog.py +273 -0
- aria_code-4.4.0/apps/cli/tool_executor.py +752 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/market_tools.py +15 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/update_check.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/utils/market_detect.py +0 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_cli.py +128 -4138
- {aria_code-4.2.0 → aria_code-4.4.0/aria_code.egg-info}/PKG-INFO +106 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_code.egg-info/SOURCES.txt +131 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_code.egg-info/entry_points.txt +1 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_code.egg-info/requires.txt +15 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_code.egg-info/top_level.txt +20 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_feishu_bot.py +60 -0
- aria_code-4.4.0/aria_mcp_server.py +7 -0
- aria_code-4.4.0/aria_relay_client.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/artifacts.py +21 -0
- aria_code-4.4.0/backtest_engine.py +4 -0
- aria_code-4.4.0/backtest_report.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/cn/xtquant_broker.py +50 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/config.py +47 -1
- aria_code-4.4.0/brokers/intl/trading212_broker.py +183 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/registry.py +1 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/trading.py +14 -2
- aria_code-4.4.0/canva_client.py +4 -0
- aria_code-4.4.0/clients/__init__.py +0 -0
- aria_code-4.4.0/clients/canva_client.py +284 -0
- aria_code-4.4.0/clients/figma_client.py +100 -0
- {aria_code-4.2.0 → aria_code-4.4.0/clients}/football_data_client.py +3 -2
- aria_code-4.4.0/clients/kling_video_client.py +182 -0
- {aria_code-4.2.0 → aria_code-4.4.0/clients}/market_data_client.py +18 -13
- aria_code-4.4.0/clients/openai_image_client.py +242 -0
- aria_code-4.4.0/clients/runway_video_client.py +157 -0
- aria_code-4.4.0/clients/warehouse_erp_client.py +105 -0
- aria_code-4.4.0/computer_use_tools.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/dashboard_generator.py +2 -1
- aria_code-4.4.0/data_analysis_tools.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/data_service.py +39 -9
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/alpha_vantage_source.py +3 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/finnhub_source.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/fred_source.py +3 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/tushare_source.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/doctor.py +90 -1
- aria_code-4.4.0/domain/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/domain}/portfolio_ledger.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0/domain}/strategy_vault.py +2 -1
- aria_code-4.4.0/external_agent_runner.py +115 -0
- aria_code-4.4.0/figma_client.py +4 -0
- aria_code-4.4.0/file_analysis_tools.py +4 -0
- aria_code-4.4.0/finance_formulas.py +4 -0
- aria_code-4.4.0/football_data_client.py +4 -0
- aria_code-4.4.0/image_gen_tools.py +4 -0
- aria_code-4.4.0/kling_video_client.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/licensing.py +2 -1
- aria_code-4.4.0/local_finance_tools.py +4 -0
- aria_code-4.4.0/local_image_provider.py +4 -0
- aria_code-4.4.0/local_llm_provider.py +4 -0
- aria_code-4.4.0/macro_tools.py +4 -0
- aria_code-4.4.0/markdown_pdf.py +289 -0
- aria_code-4.4.0/market_data_client.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/mcp_client.py +3 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/memory_manager.py +2 -1
- aria_code-4.4.0/notification_tools.py +4 -0
- aria_code-4.4.0/openai_image_client.py +4 -0
- aria_code-4.4.0/packages/adk_bridge/__init__.py +11 -0
- aria_code-4.4.0/packages/adk_bridge/code_review_tools.py +45 -0
- aria_code-4.4.0/packages/adk_bridge/market_tools.py +125 -0
- aria_code-4.4.0/packages/aria_core/paths.py +57 -0
- aria_code-4.4.0/packages/aria_mcp/bridge.py +201 -0
- aria_code-4.4.0/packages/aria_mcp/server.py +1550 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/__init__.py +4 -0
- aria_code-4.4.0/packages/aria_services/cache.py +60 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/context_checkpoints.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/provider_health.py +80 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_skills/catalog.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_skills/loader.py +28 -2
- aria_code-4.4.0/packages/aria_tools/financial/__init__.py +8 -0
- aria_code-4.4.0/packages/aria_tools/financial/_paths.py +104 -0
- aria_code-4.4.0/packages/aria_tools/financial/compliance.py +31 -0
- aria_code-4.4.0/packages/aria_tools/financial/factors.py +33 -0
- aria_code-4.4.0/packages/aria_tools/financial/risk_tools.py +33 -0
- aria_code-4.4.0/packages/aria_tools/financial/strategy.py +31 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/__init__.py +10 -0
- aria_code-4.4.0/packages/quant_engine/backtest/__init__.py +6 -0
- aria_code-4.4.0/packages/quant_engine/backtest/core.py +53 -0
- aria_code-4.4.0/packages/quant_engine/backtest/engine.py +93 -0
- aria_code-4.4.0/packages/quant_engine/portfolio/__init__.py +5 -0
- aria_code-4.4.0/packages/quant_engine/portfolio/optimizer.py +85 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/calibrator.py +3 -2
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/elo.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/ml_model.py +26 -3
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/predictor.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/tracker.py +5 -4
- aria_code-4.4.0/portfolio_ledger.py +4 -0
- aria_code-4.4.0/preview_server.py +409 -0
- aria_code-4.4.0/project_tools.py +4 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/llm/registry.py +3 -2
- aria_code-4.4.0/providers/local_image_provider.py +202 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/pyproject.toml +58 -5
- aria_code-4.4.0/realty_data_tools.py +4 -0
- aria_code-4.4.0/report_exporters.py +150 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/report_generator.py +252 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/__init__.py +2 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/run_store.py +2 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/subagent.py +126 -8
- aria_code-4.4.0/runtime/task_ledger.py +86 -0
- aria_code-4.4.0/runtime/task_orchestrator.py +90 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/tool_policy.py +2 -1
- aria_code-4.4.0/runway_video_client.py +4 -0
- aria_code-4.4.0/spreadsheet_tools.py +4 -0
- aria_code-4.4.0/strategy_vault.py +4 -0
- aria_code-4.4.0/tests/test_adk_market_tools.py +89 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_analyze_file_tool.py +1 -1
- aria_code-4.4.0/tests/test_aria_mcp_server.py +560 -0
- aria_code-4.4.0/tests/test_ashare_prediction_cmds.py +60 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_backtest_engine.py +1 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_backtest_report.py +1 -1
- aria_code-4.4.0/tests/test_broker_chat_confirm_gate.py +161 -0
- aria_code-4.4.0/tests/test_canva_client.py +101 -0
- aria_code-4.4.0/tests/test_canvas_cmds.py +133 -0
- aria_code-4.4.0/tests/test_ci_security_workflow.py +12 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_cli_app_split.py +7 -1
- aria_code-4.4.0/tests/test_cli_tool_executor_module.py +6 -0
- aria_code-4.4.0/tests/test_code_review_agent.py +55 -0
- aria_code-4.4.0/tests/test_collaboration.py +61 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_configured_provider.py +5 -0
- aria_code-4.4.0/tests/test_data_service_imports.py +8 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_doctor.py +100 -1
- aria_code-4.4.0/tests/test_feishu_swarm_config.py +15 -0
- aria_code-4.4.0/tests/test_finance_service_catalog.py +18 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_football_prediction_output.py +1 -1
- aria_code-4.4.0/tests/test_image_gen_tools.py +102 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_intent_router.py +8 -0
- aria_code-4.4.0/tests/test_kling_video_client.py +96 -0
- aria_code-4.4.0/tests/test_legacy_module_imports.py +17 -0
- aria_code-4.4.0/tests/test_local_image_provider.py +156 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_market_data_client.py +10 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_market_symbol_extraction.py +5 -0
- aria_code-4.4.0/tests/test_no_hardcoded_developer_paths.py +71 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_ollama_stream_tools.py +28 -0
- aria_code-4.4.0/tests/test_openai_image_client.py +194 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_output_rendering.py +26 -0
- aria_code-4.4.0/tests/test_packaging_manifest.py +123 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_portfolio_ledger.py +1 -1
- aria_code-4.4.0/tests/test_preview_server.py +248 -0
- aria_code-4.4.0/tests/test_public_service_status.py +57 -0
- aria_code-4.4.0/tests/test_report_charts.py +167 -0
- aria_code-4.4.0/tests/test_runway_video_client.py +87 -0
- aria_code-4.4.0/tests/test_service_diagnostics_security.py +20 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_skill_loader.py +70 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_spreadsheet_tools.py +1 -1
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_subagent.py +29 -0
- aria_code-4.4.0/tests/test_supervisor_routing.py +30 -0
- aria_code-4.4.0/tests/test_task_orchestrator.py +28 -0
- aria_code-4.4.0/tests/test_version_consistency.py +67 -0
- aria_code-4.4.0/tests/test_video_analysis.py +82 -0
- aria_code-4.4.0/tests/test_video_editor.py +148 -0
- aria_code-4.4.0/tests/test_warehouse_agents.py +45 -0
- aria_code-4.4.0/tests/test_warehouse_cli_registration.py +10 -0
- aria_code-4.4.0/tests/test_warehouse_erp_client.py +63 -0
- aria_code-4.4.0/tests/test_warehouse_workflow.py +26 -0
- aria_code-4.4.0/tests/test_workspace_context.py +92 -0
- aria_code-4.4.0/tools/__init__.py +0 -0
- aria_code-4.4.0/tools/build_quant_engine.py +97 -0
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/data_analysis_tools.py +3 -2
- aria_code-4.4.0/tools/image_gen_tools.py +114 -0
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/local_finance_tools.py +5 -4
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/macro_tools.py +3 -2
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/notification_tools.py +2 -1
- aria_code-4.4.0/tools/spreadsheet_tools.py +388 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/render/finance.py +8 -0
- aria_code-4.4.0/video_analysis.py +147 -0
- aria_code-4.4.0/video_editor.py +271 -0
- aria_code-4.4.0/workspace_context.py +233 -0
- aria_code-4.2.0/agents/financial/debate.py +0 -145
- aria_code-4.2.0/apps/cli/commands/finance_render.py +0 -12
- aria_code-4.2.0/packages/aria_mcp/bridge.py +0 -38
- {aria_code-4.2.0 → aria_code-4.4.0}/LICENSE +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/calibration_loop.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/critic.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/deepen.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/models.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/pipeline.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/quant_fusion.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/themes.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/deep/tiers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/catalyst.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/earnings.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/macro.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/news.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/sector.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/synthesis.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/financial/technical.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/portfolio_agent.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/business_match.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/cashflow_verify.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/contract_rules.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/energy_anomaly.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/exit_settlement.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/ops_optimize.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/realty/revenue_share.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/sports/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/agents/sports/football_agent.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/README.md +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/channels/README.md +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/channels/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/channels/intake.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/channels/registry.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/channels/tradingview.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/README.md +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/bootstrap.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/codegen_paths.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/market.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/market_context.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/market_render.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/report.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/team_render.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/config_store.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/deterministic.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/direct.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/github_app_auth.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/handlers/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/hooks.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/i18n.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/intent.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/main.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/market_metadata.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/market_universe.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/pdf_report.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/plan_mode.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/plotly_html.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/prediction_feedback.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/preflight.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/project_aria.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/prompt_assembly.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/prompts/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/prompts/coding.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/prompts/ui.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/base.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/session_export.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/session_store.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/todo_tracker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/context.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/file_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/system_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tools/write_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/turn_planning.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/cli/utils/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/daemon/README.md +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/vscode/README.md +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/apps/vscode/package.json +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_daemon.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_relay_server.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/aria_telegram_bot.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ariarc.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/automation.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/base.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/capabilities.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/cn/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/cn/futu_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/cn/tiger_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/intl/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/intl/webull_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/paper_broker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/brokers/planning.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/change_store.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/clients}/aliyun_data_client.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/clients}/aria_relay_client.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/command_safety.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/data_cleaner.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/base.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/router.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/akshare_source.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/edgar_source.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/world_bank_source.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/datasources/sources/yfinance_source.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/demo_player.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/domain}/backtest_engine.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/domain}/backtest_report.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/domain}/finance_formulas.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/intent_classifier.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/model_capability.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_agents/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_agents/manifest.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_core/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_core/architecture.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_core/export.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_core/manifest.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_infra/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_infra/arthera.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_infra/doctor.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_infra/product.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_mcp/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_mcp/circuit.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_mcp/config.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_mcp/tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_sdk/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_sdk/client.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_sdk/providers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_sdk/streaming.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_sdk/types.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/context.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/data.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/references.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/registry.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/research_protocol.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/research_quality.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/settings.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_services/usage.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_skills/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_skills/registry.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_tools/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/aria_tools/registry.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/form.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/plan_utils.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/plugin_loader.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/privacy/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/privacy/feedback.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/llm/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/llm/anthropic.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/llm/base.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/llm/ollama.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/providers/llm/openai_compat.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/providers}/local_llm_provider.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/agent_loop.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/approval.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/checkpoints.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/events.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/gateway.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/lsp.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/run_state.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/tool_executor.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/runtime/worktrees.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/safety/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/safety/permissions.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/safety/service.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/setup.cfg +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/setup_wizard.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_architecture_report.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_broker_automation.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_broker_planning.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_broker_safety.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_channel_intake.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_channels.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_chat_routing.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_codegen_output.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_command_safety.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_completions_builder.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_config_paths.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_context_references.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_context_service.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_data_service.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_football_agent.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_image_inputs.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_licensing.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_lsp.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_market_universe.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_mcp_client.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_new_modules.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_packages_facade.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_pdf_report.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_plan_mode.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_preflight.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_project_aria.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_provider_integration.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_provider_registry.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_report_generator.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_research_protocol.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_research_quality.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_safety_service.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_session_search.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_settings_service.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_system_prompts.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_tool_policy.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_trading_service.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_turn_planning.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_workspace_files.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/tests/test_workspace_verify.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/computer_use_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/file_analysis_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/project_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0/tools}/realty_data_tools.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/banner.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/completer.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/console.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/image_render.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/input_box.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/picker.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/render/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/render/market.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/render/output.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/render/responsive.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/render/team.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/robot.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/ui/startup_dashboard.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/workspace/__init__.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/workspace/files.py +0 -0
- {aria_code-4.2.0 → aria_code-4.4.0}/workspace/verify.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.4.0
|
|
4
4
|
Summary: AI-powered financial terminal — local LLM + multi-source market data
|
|
5
5
|
License: BUSL-1.1
|
|
6
6
|
Project-URL: Homepage, https://github.com/artherahq/aria-code
|
|
@@ -51,11 +51,16 @@ Provides-Extra: files
|
|
|
51
51
|
Requires-Dist: pdfplumber>=0.11.0; extra == "files"
|
|
52
52
|
Requires-Dist: pypdf>=4.3.0; extra == "files"
|
|
53
53
|
Requires-Dist: python-docx>=1.1.2; extra == "files"
|
|
54
|
+
Requires-Dist: python-pptx>=1.0.2; extra == "files"
|
|
54
55
|
Requires-Dist: openpyxl>=3.1.5; extra == "files"
|
|
55
56
|
Requires-Dist: beautifulsoup4>=4.12.3; extra == "files"
|
|
56
57
|
Requires-Dist: Pillow>=10.4.0; extra == "files"
|
|
57
58
|
Provides-Extra: video
|
|
58
59
|
Requires-Dist: opencv-python>=4.8.0; extra == "video"
|
|
60
|
+
Provides-Extra: video-analysis
|
|
61
|
+
Requires-Dist: faster-whisper>=1.0.0; extra == "video-analysis"
|
|
62
|
+
Provides-Extra: adk
|
|
63
|
+
Requires-Dist: google-adk>=2.6.3; extra == "adk"
|
|
59
64
|
Provides-Extra: ibkr
|
|
60
65
|
Requires-Dist: ib_insync>=0.9.86; extra == "ibkr"
|
|
61
66
|
Provides-Extra: futu
|
|
@@ -76,6 +81,11 @@ Requires-Dist: longbridge>=1.0.22; extra == "brokers"
|
|
|
76
81
|
Requires-Dist: alpaca-py>=0.35.0; extra == "brokers"
|
|
77
82
|
Provides-Extra: backtest
|
|
78
83
|
Requires-Dist: vectorbt>=0.26.2; extra == "backtest"
|
|
84
|
+
Provides-Extra: image-gen
|
|
85
|
+
Requires-Dist: torch>=2.2.0; extra == "image-gen"
|
|
86
|
+
Requires-Dist: diffusers>=0.30.0; extra == "image-gen"
|
|
87
|
+
Requires-Dist: transformers>=4.40.0; extra == "image-gen"
|
|
88
|
+
Requires-Dist: accelerate>=0.30.0; extra == "image-gen"
|
|
79
89
|
Provides-Extra: web
|
|
80
90
|
Requires-Dist: ddgs>=9.0; extra == "web"
|
|
81
91
|
Provides-Extra: browser
|
|
@@ -100,6 +110,7 @@ Requires-Dist: duckdb>=0.10.3; extra == "full"
|
|
|
100
110
|
Requires-Dist: pdfplumber>=0.11.0; extra == "full"
|
|
101
111
|
Requires-Dist: pypdf>=4.3.0; extra == "full"
|
|
102
112
|
Requires-Dist: python-docx>=1.1.2; extra == "full"
|
|
113
|
+
Requires-Dist: python-pptx>=1.0.2; extra == "full"
|
|
103
114
|
Requires-Dist: openpyxl>=3.1.5; extra == "full"
|
|
104
115
|
Requires-Dist: beautifulsoup4>=4.12.3; extra == "full"
|
|
105
116
|
Requires-Dist: Pillow>=10.4.0; extra == "full"
|
|
@@ -112,6 +123,7 @@ Requires-Dist: duckdb>=0.10.3; extra == "all"
|
|
|
112
123
|
Requires-Dist: pdfplumber>=0.11.0; extra == "all"
|
|
113
124
|
Requires-Dist: pypdf>=4.3.0; extra == "all"
|
|
114
125
|
Requires-Dist: python-docx>=1.1.2; extra == "all"
|
|
126
|
+
Requires-Dist: python-pptx>=1.0.2; extra == "all"
|
|
115
127
|
Requires-Dist: openpyxl>=3.1.5; extra == "all"
|
|
116
128
|
Requires-Dist: beautifulsoup4>=4.12.3; extra == "all"
|
|
117
129
|
Requires-Dist: Pillow>=10.4.0; extra == "all"
|
|
@@ -223,6 +235,7 @@ $ aria-code
|
|
|
223
235
|
| **83 commands** | Consolidated from ~150 — removed all LLM-replaceable commands; natural language handles the rest |
|
|
224
236
|
| **LLM routing fix** | Model now knows it can call real-time data tools instead of saying "I don't have live data" |
|
|
225
237
|
| **Unified agent loop** | CLI, SDK and self-host backend now run the *same* tested runtime (`runtime.run_turn`) — consistent provider routing, cloud→local fallback and tool execution on every surface |
|
|
238
|
+
| **Warehouse ERP agents** | Read-only carrier-sync, inbound-exception and inventory-health analysis with a dedicated operational signal scheme; see [data contract](docs/warehouse-erp-agents.md) |
|
|
226
239
|
| **One-command install** | `pip install aria-code` (PyPI) or `npm install -g @artheras/aria-code` — verified clean on Python 3.10 / 3.11 / 3.12 |
|
|
227
240
|
|
|
228
241
|
See [CHANGELOG.md](CHANGELOG.md) for the full history.
|
|
@@ -315,6 +328,28 @@ mindmap
|
|
|
315
328
|
|
|
316
329
|
## 🚀 Quick Start
|
|
317
330
|
|
|
331
|
+
### Option 0: Download the binary (no Python/Node install needed)
|
|
332
|
+
|
|
333
|
+
Every tagged release publishes standalone binaries for macOS (arm64), Windows (x64), and Linux (x64) — download from the [Releases page](https://github.com/artherahq/aria-code/releases), no Python or Node.js required:
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
# macOS / Linux
|
|
337
|
+
chmod +x aria-code-macos-arm64 # or aria-code-linux-x64
|
|
338
|
+
./aria-code-macos-arm64
|
|
339
|
+
```
|
|
340
|
+
```powershell
|
|
341
|
+
# Windows
|
|
342
|
+
.\aria-code-windows-x64.exe
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
> The macOS build is signed + notarized only once `MACOS_CERTIFICATE_P12_BASE64` and the Apple notarization secrets are configured in repo Settings → Secrets (see `.github/workflows/build-native-binaries.yml`) — without them, CI still builds and smoke-tests successfully but produces an **unsigned** binary that macOS Gatekeeper will refuse to run. Until those secrets are added, get a signed macOS build by running `scripts/build_native_binary.sh --notarize` locally on a machine with the real Developer ID cert imported. Windows/Linux binaries need no signing step and run as-is.
|
|
346
|
+
|
|
347
|
+
Each release also publishes a standalone **`aria-code-mcp-*`** binary — the MCP server (see [Expose aria-code to other MCP clients](#expose-aria-code-to-other-mcp-clients) below) with no Python install needed:
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
claude mcp add aria-code -- /path/to/aria-code-mcp-macos-arm64 # or -linux-x64 / -windows-x64.exe
|
|
351
|
+
```
|
|
352
|
+
|
|
318
353
|
### Option 1: Bootstrap (fresh Mac / Linux — recommended)
|
|
319
354
|
|
|
320
355
|
No Node.js, Python, or Xcode required. One command handles everything:
|
|
@@ -937,6 +972,75 @@ Connect any [Model Context Protocol](https://modelcontextprotocol.io) server:
|
|
|
937
972
|
/mcp tools # All available MCP tools
|
|
938
973
|
```
|
|
939
974
|
|
|
975
|
+
### Expose aria-code to other MCP clients
|
|
976
|
+
|
|
977
|
+
aria-code can also run *as* an MCP server, so Claude Code, Codex, or any
|
|
978
|
+
other MCP client can call into it directly:
|
|
979
|
+
|
|
980
|
+
- `aria.market.quote` / `aria.agent.team` / `aria.artifacts.list` — live quote + technicals, multi-agent research, generated artifacts (all read-only)
|
|
981
|
+
- `aria.skill.list` / `aria.skill.get` — discover and fetch the installed portable [SKILL.md](https://github.com/artherahq/aria-skills) workflows: reusable expert playbooks for UI design systems, anti-generic-AI-look design critique, trading-app patterns, equity research, backtest validation, and more. `aria.skill.list` takes an optional `query` to rank by relevance to your task; `aria.skill.get` returns the full workflow text for **you** to follow — skills are instruction documents, not executable tools, so nothing runs server-side. Each result carries an `integrity` field (`verified` for signed catalog skills, `unlocked` for local drop-ins) so you can see a skill's provenance before following it
|
|
982
|
+
- `aria.report.generate` — fetch data and generate a full HTML research report artifact for a symbol
|
|
983
|
+
- `aria.backtest.run` — run a historical strategy simulation (`buy_hold` or `sma_cross`) against real price history
|
|
984
|
+
- `aria.broker.positions` / `aria.broker.list_previews` — read account/positions and recent order previews for a configured broker (US/CN/HK/UK — see `/broker`)
|
|
985
|
+
- `aria.broker.preview_order` — build a risk-checked order preview. **Never places a live trade by itself** — execution requires either a human running `/trade confirm <preview_id>` in the aria-code terminal, or `aria.broker.confirm_order` below (off by default per broker)
|
|
986
|
+
- `aria.broker.confirm_order` — **execute a previously built order preview, for real.** Off by default for every broker. Refuses unconditionally unless (1) a human already ran `/trade allow-chat-confirm <broker_id>` at the aria-code terminal keyboard — retyping the exact broker id, not y/yes — to opt that specific broker into chat-confirmed execution (this opt-in can never be triggered from MCP/chat, only from the terminal), **and** (2) the call itself passes `confirmed: true`. Executions via this path are tagged `source: "chat_mcp"` in the trade audit log (`~/.aria-code/trade_audit.jsonl`) to distinguish them from terminal-confirmed trades. Run `/trade disallow-chat-confirm <broker_id>` at any time to turn it back off
|
|
987
|
+
- `aria.report.chart` — candlestick + MA20/50 chart PNG for a symbol
|
|
988
|
+
- `aria.report.indicator_chart` — candlestick + volume + RSI(14) + MACD(12,26,9) multi-panel chart PNG for a symbol
|
|
989
|
+
- `aria.report.comparison_chart` — normalized (base=100) % return comparison chart PNG across 2+ symbols
|
|
990
|
+
- `aria.report.allocation_chart` — pie chart PNG of a broker account's position weights by market value
|
|
991
|
+
- `aria.report.pdf` / `aria.report.docx` / `aria.report.pptx` — render a Markdown report to PDF, an editable Word document, or a slide deck (one slide per heading) — all chart/report tools save to your artifacts folder
|
|
992
|
+
- `aria.report.canva_design` / `aria.report.canva_upload_asset` — fill a Canva brand template with data (and optionally an uploaded image asset) and export a design draft (needs `/canva connect <client_id> <client_secret>` once — register an app at [canva.com/developers](https://www.canva.com/developers/) and have a brand template ready first; Canva has no API for creating a design from scratch, only autofilling an existing template)
|
|
993
|
+
- `aria.figma.read_file` / `aria.figma.comments` — read a Figma file's page/frame structure (depth-limited summary) and its comments (needs `/apikey set figma <personal_access_token>` once). Read-only — Figma has no public API for writing/creating designs from a script, only its in-app Plugin API can do that
|
|
994
|
+
- `aria.report.estimate_image_cost` — get an illustrative per-image cost estimate (USD) for OpenAI's `gpt-image-1` at a given size/quality, before generating. Free.
|
|
995
|
+
- `aria.report.generate_image` / `aria.report.edit_image` — generate a new image or transform an existing local photo via OpenAI's `gpt-image-1` (needs `/apikey set openai sk-...`). `edit_image` accepts an optional `mask_path` for inpainting — a mask PNG where transparent areas mark what to edit, opaque areas are preserved untouched. **Real per-call cost, billed the instant it succeeds** — both hard-refuse without `confirmed: true`, and calling `aria.report.estimate_image_cost` first is strongly recommended
|
|
996
|
+
- `aria.report.generate_image_local` / `aria.report.edit_image_local` — the same, entirely locally via a self-hosted SDXL-Turbo (no API key, no per-call cost; needs the optional `image_gen` extra and ~4GB of weights on first use)
|
|
997
|
+
- `aria.video.probe` / `aria.video.trim` / `aria.video.concat` / `aria.video.overlay_text` / `aria.video.overlay_audio` / `aria.video.convert` / `aria.video.change_speed` — deterministic local video editing via `ffmpeg` (no AI, no API key)
|
|
998
|
+
- `aria.video.transcribe` / `aria.video.detect_scenes` — local AI-assisted analysis: speech transcription (`faster-whisper`, needs the optional `video_analysis` extra) and scene-cut detection (`opencv`, needs the optional `video` extra) — both produce editing *decisions*, not new pixels
|
|
999
|
+
- `aria.video.generate_estimate` / `aria.video.generate_submit` / `aria.video.generate_status` — cloud AI text-to-video via Kling or Runway (`provider: "kling" | "runway"`). **Real per-request cost, billed the instant submission succeeds** — `generate_submit` hard-refuses without `confirmed: true`, and calling `generate_estimate` first is strongly recommended. Needs `/apikey set kling <access_key>:<secret_key>` or `/apikey set runway <key>`. No local/free option exists for this layer the way SDXL-Turbo covers images — see `video_editor.py`/`video_analysis.py` for the free local-only editing/analysis layers
|
|
1000
|
+
|
|
1001
|
+
```bash
|
|
1002
|
+
python3 aria_mcp_server.py # dev, from the repo root
|
|
1003
|
+
# or, once installed: aria-code-mcp
|
|
1004
|
+
```
|
|
1005
|
+
|
|
1006
|
+
Register with Claude Code:
|
|
1007
|
+
|
|
1008
|
+
```bash
|
|
1009
|
+
claude mcp add aria-code -- python3 /path/to/aria-code/aria_mcp_server.py
|
|
1010
|
+
```
|
|
1011
|
+
|
|
1012
|
+
Register with Codex (`~/.codex/config.toml`):
|
|
1013
|
+
|
|
1014
|
+
```toml
|
|
1015
|
+
[mcp_servers.aria_code]
|
|
1016
|
+
command = "python3"
|
|
1017
|
+
args = ["/path/to/aria-code/aria_mcp_server.py"]
|
|
1018
|
+
```
|
|
1019
|
+
|
|
1020
|
+
#### Want deeper A-share quant tools too? Register a second server, don't wait for us to add them here
|
|
1021
|
+
|
|
1022
|
+
This server intentionally does **not** re-expose Arthera's `quant_engine` quant
|
|
1023
|
+
tools (factor calculation, Bayesian-HMM regime detection, northbound-flow,
|
|
1024
|
+
Kelly position sizing, options pricing, pairs-trading stats, and a much
|
|
1025
|
+
deeper `run_backtest` than the one above — T+1 settlement, limit-up/down
|
|
1026
|
+
filtering, `sma_cross`/`rsi_mean_revert`/`momentum` strategies, CN_A or US
|
|
1027
|
+
market). That's a separate project (Arthera) with its own MCP server —
|
|
1028
|
+
`packages/quant_engine/mcp_server.py` — speaking the identical MCP
|
|
1029
|
+
2024-11-05 stdio JSON-RPC protocol, so any client here can register it
|
|
1030
|
+
as a second, independent server rather than this one proxying it:
|
|
1031
|
+
|
|
1032
|
+
```bash
|
|
1033
|
+
claude mcp add arthera-quant -- python3 /path/to/Arthera/packages/quant_engine/mcp_server.py
|
|
1034
|
+
```
|
|
1035
|
+
|
|
1036
|
+
We keep these two separate on purpose, not as a gap to close later: a few of
|
|
1037
|
+
`quant_engine`'s tools (`get_ai_signal`, `get_predictions`,
|
|
1038
|
+
`get_market_insights`) call Arthera's own internal Alibaba Cloud service and
|
|
1039
|
+
simply won't work without that access, so folding them into this server
|
|
1040
|
+
would mean shipping tools that error out for anyone without Arthera's
|
|
1041
|
+
private infrastructure. If you don't have access to that repo, everything
|
|
1042
|
+
above this section still works standalone.
|
|
1043
|
+
|
|
940
1044
|
---
|
|
941
1045
|
|
|
942
1046
|
## ⚙️ Configuration
|
|
@@ -1021,7 +1125,7 @@ converts to Apache 2.0 four years after release.
|
|
|
1021
1125
|
|
|
1022
1126
|
<p align="center">
|
|
1023
1127
|
<a href="https://arthera.finance">Website</a> ·
|
|
1024
|
-
<a href="https://github.com/
|
|
1128
|
+
<a href="https://github.com/artherahq/aria-code">Project Repository</a> ·
|
|
1025
1129
|
<a href="https://github.com/artherahq/aria-code/issues">Issues</a> ·
|
|
1026
1130
|
<a href="https://github.com/artherahq/aria-code/discussions">Discussions</a>
|
|
1027
1131
|
</p>
|
|
@@ -90,6 +90,7 @@ $ aria-code
|
|
|
90
90
|
| **83 commands** | Consolidated from ~150 — removed all LLM-replaceable commands; natural language handles the rest |
|
|
91
91
|
| **LLM routing fix** | Model now knows it can call real-time data tools instead of saying "I don't have live data" |
|
|
92
92
|
| **Unified agent loop** | CLI, SDK and self-host backend now run the *same* tested runtime (`runtime.run_turn`) — consistent provider routing, cloud→local fallback and tool execution on every surface |
|
|
93
|
+
| **Warehouse ERP agents** | Read-only carrier-sync, inbound-exception and inventory-health analysis with a dedicated operational signal scheme; see [data contract](docs/warehouse-erp-agents.md) |
|
|
93
94
|
| **One-command install** | `pip install aria-code` (PyPI) or `npm install -g @artheras/aria-code` — verified clean on Python 3.10 / 3.11 / 3.12 |
|
|
94
95
|
|
|
95
96
|
See [CHANGELOG.md](CHANGELOG.md) for the full history.
|
|
@@ -182,6 +183,28 @@ mindmap
|
|
|
182
183
|
|
|
183
184
|
## 🚀 Quick Start
|
|
184
185
|
|
|
186
|
+
### Option 0: Download the binary (no Python/Node install needed)
|
|
187
|
+
|
|
188
|
+
Every tagged release publishes standalone binaries for macOS (arm64), Windows (x64), and Linux (x64) — download from the [Releases page](https://github.com/artherahq/aria-code/releases), no Python or Node.js required:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# macOS / Linux
|
|
192
|
+
chmod +x aria-code-macos-arm64 # or aria-code-linux-x64
|
|
193
|
+
./aria-code-macos-arm64
|
|
194
|
+
```
|
|
195
|
+
```powershell
|
|
196
|
+
# Windows
|
|
197
|
+
.\aria-code-windows-x64.exe
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
> The macOS build is signed + notarized only once `MACOS_CERTIFICATE_P12_BASE64` and the Apple notarization secrets are configured in repo Settings → Secrets (see `.github/workflows/build-native-binaries.yml`) — without them, CI still builds and smoke-tests successfully but produces an **unsigned** binary that macOS Gatekeeper will refuse to run. Until those secrets are added, get a signed macOS build by running `scripts/build_native_binary.sh --notarize` locally on a machine with the real Developer ID cert imported. Windows/Linux binaries need no signing step and run as-is.
|
|
201
|
+
|
|
202
|
+
Each release also publishes a standalone **`aria-code-mcp-*`** binary — the MCP server (see [Expose aria-code to other MCP clients](#expose-aria-code-to-other-mcp-clients) below) with no Python install needed:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
claude mcp add aria-code -- /path/to/aria-code-mcp-macos-arm64 # or -linux-x64 / -windows-x64.exe
|
|
206
|
+
```
|
|
207
|
+
|
|
185
208
|
### Option 1: Bootstrap (fresh Mac / Linux — recommended)
|
|
186
209
|
|
|
187
210
|
No Node.js, Python, or Xcode required. One command handles everything:
|
|
@@ -804,6 +827,75 @@ Connect any [Model Context Protocol](https://modelcontextprotocol.io) server:
|
|
|
804
827
|
/mcp tools # All available MCP tools
|
|
805
828
|
```
|
|
806
829
|
|
|
830
|
+
### Expose aria-code to other MCP clients
|
|
831
|
+
|
|
832
|
+
aria-code can also run *as* an MCP server, so Claude Code, Codex, or any
|
|
833
|
+
other MCP client can call into it directly:
|
|
834
|
+
|
|
835
|
+
- `aria.market.quote` / `aria.agent.team` / `aria.artifacts.list` — live quote + technicals, multi-agent research, generated artifacts (all read-only)
|
|
836
|
+
- `aria.skill.list` / `aria.skill.get` — discover and fetch the installed portable [SKILL.md](https://github.com/artherahq/aria-skills) workflows: reusable expert playbooks for UI design systems, anti-generic-AI-look design critique, trading-app patterns, equity research, backtest validation, and more. `aria.skill.list` takes an optional `query` to rank by relevance to your task; `aria.skill.get` returns the full workflow text for **you** to follow — skills are instruction documents, not executable tools, so nothing runs server-side. Each result carries an `integrity` field (`verified` for signed catalog skills, `unlocked` for local drop-ins) so you can see a skill's provenance before following it
|
|
837
|
+
- `aria.report.generate` — fetch data and generate a full HTML research report artifact for a symbol
|
|
838
|
+
- `aria.backtest.run` — run a historical strategy simulation (`buy_hold` or `sma_cross`) against real price history
|
|
839
|
+
- `aria.broker.positions` / `aria.broker.list_previews` — read account/positions and recent order previews for a configured broker (US/CN/HK/UK — see `/broker`)
|
|
840
|
+
- `aria.broker.preview_order` — build a risk-checked order preview. **Never places a live trade by itself** — execution requires either a human running `/trade confirm <preview_id>` in the aria-code terminal, or `aria.broker.confirm_order` below (off by default per broker)
|
|
841
|
+
- `aria.broker.confirm_order` — **execute a previously built order preview, for real.** Off by default for every broker. Refuses unconditionally unless (1) a human already ran `/trade allow-chat-confirm <broker_id>` at the aria-code terminal keyboard — retyping the exact broker id, not y/yes — to opt that specific broker into chat-confirmed execution (this opt-in can never be triggered from MCP/chat, only from the terminal), **and** (2) the call itself passes `confirmed: true`. Executions via this path are tagged `source: "chat_mcp"` in the trade audit log (`~/.aria-code/trade_audit.jsonl`) to distinguish them from terminal-confirmed trades. Run `/trade disallow-chat-confirm <broker_id>` at any time to turn it back off
|
|
842
|
+
- `aria.report.chart` — candlestick + MA20/50 chart PNG for a symbol
|
|
843
|
+
- `aria.report.indicator_chart` — candlestick + volume + RSI(14) + MACD(12,26,9) multi-panel chart PNG for a symbol
|
|
844
|
+
- `aria.report.comparison_chart` — normalized (base=100) % return comparison chart PNG across 2+ symbols
|
|
845
|
+
- `aria.report.allocation_chart` — pie chart PNG of a broker account's position weights by market value
|
|
846
|
+
- `aria.report.pdf` / `aria.report.docx` / `aria.report.pptx` — render a Markdown report to PDF, an editable Word document, or a slide deck (one slide per heading) — all chart/report tools save to your artifacts folder
|
|
847
|
+
- `aria.report.canva_design` / `aria.report.canva_upload_asset` — fill a Canva brand template with data (and optionally an uploaded image asset) and export a design draft (needs `/canva connect <client_id> <client_secret>` once — register an app at [canva.com/developers](https://www.canva.com/developers/) and have a brand template ready first; Canva has no API for creating a design from scratch, only autofilling an existing template)
|
|
848
|
+
- `aria.figma.read_file` / `aria.figma.comments` — read a Figma file's page/frame structure (depth-limited summary) and its comments (needs `/apikey set figma <personal_access_token>` once). Read-only — Figma has no public API for writing/creating designs from a script, only its in-app Plugin API can do that
|
|
849
|
+
- `aria.report.estimate_image_cost` — get an illustrative per-image cost estimate (USD) for OpenAI's `gpt-image-1` at a given size/quality, before generating. Free.
|
|
850
|
+
- `aria.report.generate_image` / `aria.report.edit_image` — generate a new image or transform an existing local photo via OpenAI's `gpt-image-1` (needs `/apikey set openai sk-...`). `edit_image` accepts an optional `mask_path` for inpainting — a mask PNG where transparent areas mark what to edit, opaque areas are preserved untouched. **Real per-call cost, billed the instant it succeeds** — both hard-refuse without `confirmed: true`, and calling `aria.report.estimate_image_cost` first is strongly recommended
|
|
851
|
+
- `aria.report.generate_image_local` / `aria.report.edit_image_local` — the same, entirely locally via a self-hosted SDXL-Turbo (no API key, no per-call cost; needs the optional `image_gen` extra and ~4GB of weights on first use)
|
|
852
|
+
- `aria.video.probe` / `aria.video.trim` / `aria.video.concat` / `aria.video.overlay_text` / `aria.video.overlay_audio` / `aria.video.convert` / `aria.video.change_speed` — deterministic local video editing via `ffmpeg` (no AI, no API key)
|
|
853
|
+
- `aria.video.transcribe` / `aria.video.detect_scenes` — local AI-assisted analysis: speech transcription (`faster-whisper`, needs the optional `video_analysis` extra) and scene-cut detection (`opencv`, needs the optional `video` extra) — both produce editing *decisions*, not new pixels
|
|
854
|
+
- `aria.video.generate_estimate` / `aria.video.generate_submit` / `aria.video.generate_status` — cloud AI text-to-video via Kling or Runway (`provider: "kling" | "runway"`). **Real per-request cost, billed the instant submission succeeds** — `generate_submit` hard-refuses without `confirmed: true`, and calling `generate_estimate` first is strongly recommended. Needs `/apikey set kling <access_key>:<secret_key>` or `/apikey set runway <key>`. No local/free option exists for this layer the way SDXL-Turbo covers images — see `video_editor.py`/`video_analysis.py` for the free local-only editing/analysis layers
|
|
855
|
+
|
|
856
|
+
```bash
|
|
857
|
+
python3 aria_mcp_server.py # dev, from the repo root
|
|
858
|
+
# or, once installed: aria-code-mcp
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
Register with Claude Code:
|
|
862
|
+
|
|
863
|
+
```bash
|
|
864
|
+
claude mcp add aria-code -- python3 /path/to/aria-code/aria_mcp_server.py
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
Register with Codex (`~/.codex/config.toml`):
|
|
868
|
+
|
|
869
|
+
```toml
|
|
870
|
+
[mcp_servers.aria_code]
|
|
871
|
+
command = "python3"
|
|
872
|
+
args = ["/path/to/aria-code/aria_mcp_server.py"]
|
|
873
|
+
```
|
|
874
|
+
|
|
875
|
+
#### Want deeper A-share quant tools too? Register a second server, don't wait for us to add them here
|
|
876
|
+
|
|
877
|
+
This server intentionally does **not** re-expose Arthera's `quant_engine` quant
|
|
878
|
+
tools (factor calculation, Bayesian-HMM regime detection, northbound-flow,
|
|
879
|
+
Kelly position sizing, options pricing, pairs-trading stats, and a much
|
|
880
|
+
deeper `run_backtest` than the one above — T+1 settlement, limit-up/down
|
|
881
|
+
filtering, `sma_cross`/`rsi_mean_revert`/`momentum` strategies, CN_A or US
|
|
882
|
+
market). That's a separate project (Arthera) with its own MCP server —
|
|
883
|
+
`packages/quant_engine/mcp_server.py` — speaking the identical MCP
|
|
884
|
+
2024-11-05 stdio JSON-RPC protocol, so any client here can register it
|
|
885
|
+
as a second, independent server rather than this one proxying it:
|
|
886
|
+
|
|
887
|
+
```bash
|
|
888
|
+
claude mcp add arthera-quant -- python3 /path/to/Arthera/packages/quant_engine/mcp_server.py
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
We keep these two separate on purpose, not as a gap to close later: a few of
|
|
892
|
+
`quant_engine`'s tools (`get_ai_signal`, `get_predictions`,
|
|
893
|
+
`get_market_insights`) call Arthera's own internal Alibaba Cloud service and
|
|
894
|
+
simply won't work without that access, so folding them into this server
|
|
895
|
+
would mean shipping tools that error out for anyone without Arthera's
|
|
896
|
+
private infrastructure. If you don't have access to that repo, everything
|
|
897
|
+
above this section still works standalone.
|
|
898
|
+
|
|
807
899
|
---
|
|
808
900
|
|
|
809
901
|
## ⚙️ Configuration
|
|
@@ -888,7 +980,7 @@ converts to Apache 2.0 four years after release.
|
|
|
888
980
|
|
|
889
981
|
<p align="center">
|
|
890
982
|
<a href="https://arthera.finance">Website</a> ·
|
|
891
|
-
<a href="https://github.com/
|
|
983
|
+
<a href="https://github.com/artherahq/aria-code">Project Repository</a> ·
|
|
892
984
|
<a href="https://github.com/artherahq/aria-code/issues">Issues</a> ·
|
|
893
985
|
<a href="https://github.com/artherahq/aria-code/discussions">Discussions</a>
|
|
894
986
|
</p>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""ADK application packages shipped as optional Aria Code integrations."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Google ADK entrypoint package for Aria's read-only code reviewer."""
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Google ADK entrypoint: a bounded reviewer for pasted code."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from google.adk.agents.llm_agent import Agent
|
|
8
|
+
|
|
9
|
+
from packages.adk_bridge import CodeReviewTools
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
_tools = CodeReviewTools()
|
|
13
|
+
|
|
14
|
+
root_agent = Agent(
|
|
15
|
+
model=os.getenv("ARIA_ADK_MODEL", "gemini-3.5-flash"),
|
|
16
|
+
name="aria_code_review",
|
|
17
|
+
description="A read-only code reviewer for user-submitted source text.",
|
|
18
|
+
instruction="""You are Aria Code Review, a careful software reviewer.
|
|
19
|
+
|
|
20
|
+
Ask the user to paste the relevant source code when it has not been supplied.
|
|
21
|
+
Use review_code for deterministic findings and preserve its severity, line,
|
|
22
|
+
rule, and limitations. Never claim to have opened a local path, accessed a
|
|
23
|
+
repository, run a command, changed a file, or executed tests: this ADK agent
|
|
24
|
+
has none of those capabilities.
|
|
25
|
+
|
|
26
|
+
Explain only findings supported by the submitted code. Separate deterministic
|
|
27
|
+
findings from suggestions, and recommend a test or validation step where
|
|
28
|
+
appropriate. Do not expose credentials appearing in source; tell the user to
|
|
29
|
+
revoke and rotate any exposed credential instead.
|
|
30
|
+
""",
|
|
31
|
+
tools=[_tools.review_code],
|
|
32
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Read-only Aria market-research agent for Google ADK."""
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Google ADK entrypoint: ``adk web adk_apps`` discovers ``aria_research``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from google.adk.agents.llm_agent import Agent
|
|
8
|
+
|
|
9
|
+
from packages.adk_bridge import MarketResearchTools
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
_tools = MarketResearchTools()
|
|
13
|
+
|
|
14
|
+
root_agent = Agent(
|
|
15
|
+
model=os.getenv("ARIA_ADK_MODEL", "gemini-3.5-flash"),
|
|
16
|
+
name="aria_research",
|
|
17
|
+
description="A read-only market-research assistant for Aria Code and Arthera.",
|
|
18
|
+
instruction="""You are Aria Research, a careful financial-research assistant.
|
|
19
|
+
|
|
20
|
+
Use get_market_snapshot for live market facts and explicitly identify its data
|
|
21
|
+
quality, timestamp, warnings, and source limitations. Use get_market_data_health
|
|
22
|
+
when a data result is missing, stale, or conflicting. Do not invent prices,
|
|
23
|
+
returns, news, citations, positions, or tool output.
|
|
24
|
+
|
|
25
|
+
This agent is research-only. Never claim to execute, recommend, place, modify,
|
|
26
|
+
or schedule trades. Do not request credentials. State clearly that your output
|
|
27
|
+
is research assistance, not investment advice. For quantitative conclusions,
|
|
28
|
+
separate observed facts from hypotheses and mention material uncertainty.
|
|
29
|
+
""",
|
|
30
|
+
tools=[_tools.get_market_snapshot, _tools.get_market_data_health],
|
|
31
|
+
)
|
|
@@ -10,7 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
import logging
|
|
11
11
|
from abc import ABC, abstractmethod
|
|
12
12
|
from dataclasses import dataclass, field
|
|
13
|
-
from typing import Any, Callable, Dict, List, Optional
|
|
13
|
+
from typing import Any, Callable, Dict, List, Optional, Generator, AsyncGenerator
|
|
14
14
|
|
|
15
15
|
logger = logging.getLogger(__name__)
|
|
16
16
|
|
|
@@ -67,12 +67,15 @@ class BaseAgent(ABC):
|
|
|
67
67
|
name: str = "base"
|
|
68
68
|
description: str = "基础 Agent"
|
|
69
69
|
|
|
70
|
-
#
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
"-
|
|
70
|
+
# Time-sensitive claims must come from a tool result with a timestamp, not
|
|
71
|
+
# from a hard-coded prompt. This is appended to every agent because a
|
|
72
|
+
# wrong IPO/symbol/event claim can otherwise contaminate all specialisms.
|
|
73
|
+
_TIME_SENSITIVE_FACT_POLICY = (
|
|
74
|
+
"\n\n## Time-sensitive fact policy\n"
|
|
75
|
+
"- Do not treat examples, aliases, model memory, or internal notes as current facts.\n"
|
|
76
|
+
"- Verify ticker identity, IPO/listing status, prices, corporate events, sports results, "
|
|
77
|
+
"and dates with an appropriate tool or source before stating them as facts.\n"
|
|
78
|
+
"- If a current fact cannot be verified, say that it is unverified instead of guessing.\n"
|
|
76
79
|
)
|
|
77
80
|
|
|
78
81
|
# Language rule injected per-call based on detected user language
|
|
@@ -86,14 +89,21 @@ class BaseAgent(ABC):
|
|
|
86
89
|
llm_provider=None, # BaseLLMProvider 实例(可选,None 则用模板生成)
|
|
87
90
|
data_router=None, # DataRouter 实例(可选)
|
|
88
91
|
on_token: Optional[Callable[[str], None]] = None, # 流式 token 回调
|
|
92
|
+
on_thought: Optional[Callable[[str], None]] = None, # 思考过程回调
|
|
93
|
+
on_tool_start: Optional[Callable[[str, Dict], None]] = None, # 工具调用开始回调
|
|
94
|
+
on_tool_end: Optional[Callable[[str, Any], None]] = None, # 工具调用结束回调
|
|
89
95
|
config: Optional[Dict] = None,
|
|
90
96
|
lang: str = "zh", # user language: "zh" | "en"
|
|
91
97
|
):
|
|
92
98
|
self.llm = llm_provider
|
|
93
99
|
self.data = data_router
|
|
94
100
|
self.on_token = on_token
|
|
101
|
+
self.on_thought = on_thought
|
|
102
|
+
self.on_tool_start = on_tool_start
|
|
103
|
+
self.on_tool_end = on_tool_end
|
|
95
104
|
self.config = config or {}
|
|
96
105
|
self.lang = lang
|
|
106
|
+
self.memory = [] # Short-term conversation history for multi-turn context
|
|
97
107
|
|
|
98
108
|
async def fetch_data(self, symbol: str) -> Dict[str, Any]:
|
|
99
109
|
"""
|
|
@@ -127,43 +137,123 @@ class BaseAgent(ABC):
|
|
|
127
137
|
)
|
|
128
138
|
return ""
|
|
129
139
|
|
|
140
|
+
async def _execute_tool(self, tool_name: str, tool_args: Dict[str, Any]) -> str:
|
|
141
|
+
"""
|
|
142
|
+
执行本地工具或 MCP 工具(可被子类重写扩展)。
|
|
143
|
+
实际项目中可将 aria-skills 暴露为工具。
|
|
144
|
+
"""
|
|
145
|
+
if self.on_tool_start:
|
|
146
|
+
self.on_tool_start(tool_name, tool_args)
|
|
147
|
+
|
|
148
|
+
result = None
|
|
149
|
+
try:
|
|
150
|
+
# 路由到数据层或其他 MCP Client 执行
|
|
151
|
+
if self.data and hasattr(self.data, "execute_tool"):
|
|
152
|
+
result = await self.data.execute_tool(tool_name, tool_args)
|
|
153
|
+
else:
|
|
154
|
+
result = f"Error: Tool {tool_name} not implemented or data router unavailable."
|
|
155
|
+
except Exception as e:
|
|
156
|
+
result = f"Error executing {tool_name}: {e}"
|
|
157
|
+
|
|
158
|
+
if self.on_tool_end:
|
|
159
|
+
self.on_tool_end(tool_name, result)
|
|
160
|
+
|
|
161
|
+
import json
|
|
162
|
+
return json.dumps(result, ensure_ascii=False) if not isinstance(result, str) else result
|
|
163
|
+
|
|
130
164
|
async def _call_llm(
|
|
131
165
|
self,
|
|
132
166
|
system: str,
|
|
133
167
|
user: str,
|
|
134
168
|
max_tokens: int = 800,
|
|
135
169
|
quote: Optional[Dict[str, Any]] = None,
|
|
170
|
+
max_tool_loops: int = 5,
|
|
136
171
|
) -> str:
|
|
137
|
-
"""调用 LLM
|
|
172
|
+
"""调用 LLM 生成分析文本,内置 Tool Calling 的执行循环"""
|
|
138
173
|
if not self.llm:
|
|
139
174
|
return ""
|
|
140
|
-
# Inject language rule +
|
|
175
|
+
# Inject language rule + time-sensitive fact policy + data guard.
|
|
141
176
|
_lang_rule = self._LANG_RULES.get(self.lang, self._LANG_RULES["zh"])
|
|
142
177
|
_data_warn = self._data_guard(quote or {})
|
|
143
|
-
system = system + self.
|
|
178
|
+
system = system + self._TIME_SENSITIVE_FACT_POLICY + _lang_rule + _data_warn
|
|
144
179
|
from providers.llm.base import Message
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
180
|
+
|
|
181
|
+
# 自动注入 DAG pipeline 中的 upstream context
|
|
182
|
+
if hasattr(self, "_current_data") and self._current_data:
|
|
183
|
+
upstream = self._current_data.get("upstream_context")
|
|
184
|
+
if upstream:
|
|
185
|
+
user += "\n\n## ⬆️ 团队/上游 Agent 提供的背景上下文 (Upstream Insights)\n"
|
|
186
|
+
user += "请在分析中参考以下来自其他专家 Agent 的核心观点:\n"
|
|
187
|
+
user += "\n".join(upstream)
|
|
188
|
+
|
|
189
|
+
# 融入历史记忆
|
|
190
|
+
if not self.memory:
|
|
191
|
+
messages = [
|
|
192
|
+
Message(role="system", content=system),
|
|
193
|
+
Message(role="user", content=user),
|
|
194
|
+
]
|
|
195
|
+
else:
|
|
196
|
+
messages = list(self.memory)
|
|
197
|
+
messages.append(Message(role="user", content=user))
|
|
198
|
+
|
|
149
199
|
full_text = ""
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
200
|
+
loop_count = 0
|
|
201
|
+
|
|
202
|
+
while loop_count < max_tool_loops:
|
|
203
|
+
loop_count += 1
|
|
204
|
+
current_text = ""
|
|
205
|
+
tool_calls = []
|
|
206
|
+
|
|
207
|
+
try:
|
|
208
|
+
async for event in self.llm.stream(
|
|
209
|
+
messages, max_tokens=max_tokens
|
|
210
|
+
):
|
|
211
|
+
t = event.get("type")
|
|
212
|
+
if t == "token":
|
|
213
|
+
tok = event.get("text", "")
|
|
214
|
+
current_text += tok
|
|
215
|
+
full_text += tok
|
|
216
|
+
if self.on_token:
|
|
217
|
+
self.on_token(tok)
|
|
218
|
+
elif t == "thought" and self.on_thought:
|
|
219
|
+
self.on_thought(event.get("text", ""))
|
|
220
|
+
elif t == "tool_call":
|
|
221
|
+
# 记录工具调用意图
|
|
222
|
+
tool_calls.append({
|
|
223
|
+
"name": event.get("name"),
|
|
224
|
+
"args": event.get("args", {})
|
|
225
|
+
})
|
|
226
|
+
elif t == "tool_start" and self.on_tool_start:
|
|
227
|
+
self.on_tool_start(event.get("tool_name", ""), event.get("tool_args", {}))
|
|
228
|
+
elif t == "tool_end" and self.on_tool_end:
|
|
229
|
+
self.on_tool_end(event.get("tool_name", ""), event.get("tool_result", None))
|
|
230
|
+
elif t == "error":
|
|
231
|
+
logger.warning(f"[{self.name}] LLM 错误: {event.get('message')}")
|
|
232
|
+
break
|
|
233
|
+
except Exception as e:
|
|
234
|
+
logger.warning(f"[{self.name}] LLM 调用失败: {e}")
|
|
235
|
+
break
|
|
236
|
+
|
|
237
|
+
# 将当前 Assistant 的回复加入消息流
|
|
238
|
+
messages.append(Message(role="assistant", content=current_text))
|
|
239
|
+
|
|
240
|
+
# 如果没有工具调用,说明 LLM 完成了最终回答,跳出循环
|
|
241
|
+
if not tool_calls:
|
|
242
|
+
break
|
|
243
|
+
|
|
244
|
+
# 有工具调用,则逐一执行,并把结果喂回 LLM
|
|
245
|
+
for tc in tool_calls:
|
|
246
|
+
tool_res = await self._execute_tool(tc["name"], tc["args"])
|
|
247
|
+
# 注意:实际 provider 中 Message 结构可能需要 tool_call_id
|
|
248
|
+
# 这里假设通用 Message 能够携带 role="tool"
|
|
249
|
+
messages.append(Message(role="tool", name=tc["name"], content=tool_res))
|
|
250
|
+
|
|
251
|
+
# 更新短期记忆
|
|
252
|
+
self.memory = messages
|
|
253
|
+
|
|
165
254
|
return full_text.strip()
|
|
166
255
|
|
|
256
|
+
|
|
167
257
|
@abstractmethod
|
|
168
258
|
async def analyze(self, symbol: str, data: Dict[str, Any]) -> AgentResult:
|
|
169
259
|
"""
|