aria-code 4.3.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.3.0/aria_code.egg-info → aria_code-4.4.0}/PKG-INFO +1 -1
- 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.3.0 → aria_code-4.4.0}/agents/base.py +11 -8
- 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.3.0 → aria_code-4.4.0}/agents/financial/fundamental.py +5 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/risk.py +5 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/team.py +7 -1
- aria_code-4.4.0/agents/warehouse/dashboard.py +155 -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/apps/cli/broker_render.py +206 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/broker_cmds.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/model_cmds.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/workflow_cmds.py +31 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/workspace_cmds.py +4 -3
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/config_paths.py +10 -7
- aria_code-4.4.0/apps/cli/football_reports.py +231 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/handlers/market_handlers.py +2 -1
- {aria_code-4.3.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.3.0 → aria_code-4.4.0}/apps/cli/prompts/system_prompts.py +11 -16
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/llm/ollama_stream.py +24 -8
- {aria_code-4.3.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.3.0 → aria_code-4.4.0}/apps/cli/tool_executor.py +55 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/market_tools.py +15 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/update_check.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/utils/market_detect.py +0 -2
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_cli.py +26 -1041
- {aria_code-4.3.0 → aria_code-4.4.0/aria_code.egg-info}/PKG-INFO +1 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_code.egg-info/SOURCES.txt +50 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_code.egg-info/top_level.txt +7 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/cn/xtquant_broker.py +50 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/config.py +2 -1
- aria_code-4.4.0/clients/__init__.py +0 -0
- aria_code-4.4.0/clients/aliyun_data_client.py +660 -0
- aria_code-4.4.0/clients/aria_relay_client.py +182 -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.4.0/clients/football_data_client.py +1671 -0
- aria_code-4.4.0/clients/kling_video_client.py +182 -0
- aria_code-4.4.0/clients/market_data_client.py +1975 -0
- 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.3.0 → aria_code-4.4.0}/dashboard_generator.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/alpha_vantage_source.py +3 -2
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/finnhub_source.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/fred_source.py +3 -2
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/tushare_source.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/doctor.py +2 -1
- aria_code-4.4.0/domain/__init__.py +0 -0
- aria_code-4.4.0/domain/backtest_engine.py +354 -0
- aria_code-4.4.0/domain/backtest_report.py +472 -0
- aria_code-4.4.0/domain/finance_formulas.py +389 -0
- aria_code-4.4.0/domain/portfolio_ledger.py +307 -0
- aria_code-4.4.0/domain/strategy_vault.py +421 -0
- aria_code-4.4.0/image_gen_tools.py +4 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/licensing.py +2 -1
- aria_code-4.4.0/markdown_pdf.py +289 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/mcp_client.py +3 -2
- {aria_code-4.3.0 → aria_code-4.4.0}/memory_manager.py +2 -1
- 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/aria_core/paths.py +57 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/context_checkpoints.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_skills/catalog.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_skills/loader.py +3 -2
- aria_code-4.4.0/packages/aria_tools/financial/_paths.py +104 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/financial/compliance.py +6 -3
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/financial/factors.py +7 -6
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/financial/risk_tools.py +7 -6
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/financial/strategy.py +6 -3
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/calibrator.py +3 -2
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/elo.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/ml_model.py +26 -3
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/predictor.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/tracker.py +5 -4
- aria_code-4.4.0/preview_server.py +409 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/llm/registry.py +3 -2
- {aria_code-4.3.0 → aria_code-4.4.0}/pyproject.toml +26 -4
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/run_store.py +2 -1
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/tool_policy.py +2 -1
- aria_code-4.4.0/spreadsheet_tools.py +4 -0
- aria_code-4.4.0/tests/test_code_review_agent.py +55 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_market_data_client.py +10 -0
- {aria_code-4.3.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.3.0 → aria_code-4.4.0}/tests/test_ollama_stream_tools.py +28 -0
- {aria_code-4.3.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.4.0/tests/test_version_consistency.py +67 -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.4.0/tools/computer_use_tools.py +504 -0
- aria_code-4.4.0/tools/data_analysis_tools.py +809 -0
- aria_code-4.4.0/tools/file_analysis_tools.py +885 -0
- aria_code-4.4.0/tools/image_gen_tools.py +114 -0
- aria_code-4.4.0/tools/local_finance_tools.py +3335 -0
- aria_code-4.4.0/tools/macro_tools.py +369 -0
- aria_code-4.4.0/tools/notification_tools.py +249 -0
- aria_code-4.4.0/tools/project_tools.py +525 -0
- aria_code-4.4.0/tools/realty_data_tools.py +659 -0
- aria_code-4.4.0/tools/spreadsheet_tools.py +388 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/render/finance.py +8 -0
- aria_code-4.3.0/agents/financial/debate.py +0 -145
- aria_code-4.3.0/apps/cli/commands/finance_render.py +0 -12
- aria_code-4.3.0/packages/adk_bridge/__init__.py +0 -10
- {aria_code-4.3.0 → aria_code-4.4.0}/LICENSE +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/README.md +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/adk_apps/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/adk_apps/aria_research/agent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/calibration_loop.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/critic.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/deepen.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/models.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/pipeline.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/quant_fusion.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/themes.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/deep/tiers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/catalyst.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/earnings.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/macro.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/news.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/sector.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/synthesis.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/financial/technical.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/portfolio_agent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/business_match.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/cashflow_verify.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/contract_rules.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/energy_anomaly.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/exit_settlement.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/ops_optimize.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/realty/revenue_share.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/signal_scheme.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/sports/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/sports/football_agent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/supervisor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/warehouse/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/warehouse/contracts.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/warehouse/inventory_health.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/agents/warehouse/workflow.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aliyun_data_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/README.md +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/channels/README.md +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/channels/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/channels/intake.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/channels/registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/channels/tradingview.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/README.md +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/bootstrap.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/codegen_paths.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/catalog.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/market.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/market_context.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/market_render.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/report.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/team.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/team_render.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/config_store.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/deterministic.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/direct.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/github_app_auth.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/handlers/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/hooks.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/i18n.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/intent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/intent_router.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/main.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/market_metadata.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/market_universe.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/pdf_report.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/plan_mode.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/plotly_html.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/prediction_feedback.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/preflight.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/project_aria.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/prompt_assembly.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/prompts/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/prompts/coding.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/prompts/ui.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/base.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/collaboration.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/runtime_consumer.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/session_export.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/session_store.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/todo_tracker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/context.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/file_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/system_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tools/write_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/turn_planning.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/cli/utils/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/daemon/README.md +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/vscode/README.md +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/apps/vscode/package.json +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_code.egg-info/requires.txt +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_daemon.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_feishu_bot.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_mcp_server.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_relay_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_relay_server.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/aria_telegram_bot.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ariarc.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/artifacts.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/backtest_engine.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/backtest_report.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/automation.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/base.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/capabilities.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/cn/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/cn/futu_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/cn/tiger_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/intl/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/intl/trading212_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/intl/webull_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/paper_broker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/planning.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/brokers/trading.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/canva_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/change_store.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/command_safety.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/computer_use_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/data_analysis_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/data_cleaner.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/data_service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/base.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/router.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/akshare_source.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/edgar_source.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/world_bank_source.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/datasources/sources/yfinance_source.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/demo_player.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/external_agent_runner.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/figma_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/file_analysis_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/finance_formulas.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/football_data_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/intent_classifier.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/kling_video_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/local_finance_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/local_image_provider.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/local_llm_provider.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/macro_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/market_data_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/model_capability.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/notification_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/openai_image_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_agents/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_agents/manifest.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_core/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_core/architecture.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_core/export.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_core/manifest.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_infra/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_infra/arthera.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_infra/doctor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_infra/product.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_mcp/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_mcp/bridge.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_mcp/circuit.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_mcp/config.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_mcp/server.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_mcp/tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_sdk/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_sdk/client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_sdk/providers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_sdk/streaming.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_sdk/types.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/cache.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/context.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/data.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/provider_health.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/references.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/research_protocol.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/research_quality.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/settings.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_services/usage.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_skills/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_skills/registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/aria_tools/registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/form.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/plan_utils.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/plugin_loader.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/portfolio_ledger.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/privacy/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/privacy/feedback.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/project_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/llm/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/llm/anthropic.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/llm/base.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/llm/ollama.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/llm/openai_compat.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/local_image_provider.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/providers/local_llm_provider.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/realty_data_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/report_exporters.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/report_generator.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/agent_loop.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/approval.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/checkpoints.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/events.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/gateway.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/lsp.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/run_state.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/subagent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/task_ledger.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/task_orchestrator.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/tool_executor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runtime/worktrees.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/runway_video_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/safety/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/safety/permissions.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/safety/service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/setup.cfg +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/setup_wizard.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/strategy_vault.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_architecture_report.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_backtest_report.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_broker_automation.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_broker_planning.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_broker_safety.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_canva_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_channel_intake.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_channels.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_chat_routing.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_codegen_output.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_collaboration.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_command_safety.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_completions_builder.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_config_paths.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_configured_provider.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_context_references.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_context_service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_data_service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_doctor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_football_agent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_image_inputs.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_intent_router.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_licensing.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_lsp.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_market_universe.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_mcp_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_new_modules.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_packages_facade.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_pdf_report.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_plan_mode.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_preflight.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_preview_server.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_project_aria.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_provider_integration.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_provider_registry.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_public_service_status.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_report_charts.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_report_generator.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_research_protocol.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_research_quality.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_safety_service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_session_search.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_settings_service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_skill_loader.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_subagent.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_system_prompts.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_tool_policy.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_trading_service.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_turn_planning.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_video_analysis.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_video_editor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_workspace_context.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_workspace_files.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/tests/test_workspace_verify.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/banner.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/completer.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/console.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/image_render.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/input_box.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/picker.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/render/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/render/market.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/render/output.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/render/responsive.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/render/team.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/robot.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/ui/startup_dashboard.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/video_analysis.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/video_editor.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/workspace/__init__.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/workspace/files.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/workspace/verify.py +0 -0
- {aria_code-4.3.0 → aria_code-4.4.0}/workspace_context.py +0 -0
|
@@ -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
|
+
)
|
|
@@ -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
|
|
@@ -169,10 +172,10 @@ class BaseAgent(ABC):
|
|
|
169
172
|
"""调用 LLM 生成分析文本,内置 Tool Calling 的执行循环"""
|
|
170
173
|
if not self.llm:
|
|
171
174
|
return ""
|
|
172
|
-
# Inject language rule +
|
|
175
|
+
# Inject language rule + time-sensitive fact policy + data guard.
|
|
173
176
|
_lang_rule = self._LANG_RULES.get(self.lang, self._LANG_RULES["zh"])
|
|
174
177
|
_data_warn = self._data_guard(quote or {})
|
|
175
|
-
system = system + self.
|
|
178
|
+
system = system + self._TIME_SENSITIVE_FACT_POLICY + _lang_rule + _data_warn
|
|
176
179
|
from providers.llm.base import Message
|
|
177
180
|
|
|
178
181
|
# 自动注入 DAG pipeline 中的 upstream context
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Deterministic, read-only code review agent.
|
|
2
|
+
|
|
3
|
+
The agent deliberately reviews caller-supplied text only. It never resolves a
|
|
4
|
+
path, invokes a shell, or changes a workspace, so it can be used safely from
|
|
5
|
+
both the CLI and a Google ADK function tool.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import ast
|
|
11
|
+
import re
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from pathlib import PurePath
|
|
14
|
+
from typing import Any, Dict, Iterable, List
|
|
15
|
+
|
|
16
|
+
from .base import AgentResult, BaseAgent
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class CodeReviewFinding:
|
|
21
|
+
"""A stable, evidence-bearing static-review finding."""
|
|
22
|
+
|
|
23
|
+
severity: str
|
|
24
|
+
rule: str
|
|
25
|
+
message: str
|
|
26
|
+
line: int | None
|
|
27
|
+
evidence: str
|
|
28
|
+
|
|
29
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
30
|
+
return {
|
|
31
|
+
"severity": self.severity,
|
|
32
|
+
"rule": self.rule,
|
|
33
|
+
"message": self.message,
|
|
34
|
+
"line": self.line,
|
|
35
|
+
"evidence": self.evidence,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class CodeReviewAgent(BaseAgent):
|
|
40
|
+
"""Find high-signal correctness and security hazards without an LLM."""
|
|
41
|
+
|
|
42
|
+
name = "code_review"
|
|
43
|
+
description = "Read-only deterministic code review for user-supplied snippets and diffs"
|
|
44
|
+
MAX_SOURCE_CHARS = 48_000
|
|
45
|
+
_SEVERITY_ORDER = {"critical": 0, "high": 1, "medium": 2, "low": 3}
|
|
46
|
+
_SECRET_ASSIGNMENT = re.compile(
|
|
47
|
+
r"\b(?:api[_-]?key|secret|token|password)\b\s*=\s*['\"][^'\"]{8,}['\"]",
|
|
48
|
+
re.IGNORECASE,
|
|
49
|
+
)
|
|
50
|
+
_TOKEN_LITERAL = re.compile(r"\b(?:(?:ghp|github_pat)_[A-Za-z0-9_-]{12,}|sk-[A-Za-z0-9_-]{12,})\b", re.IGNORECASE)
|
|
51
|
+
_SHELL_TRUE = re.compile(r"\b(?:subprocess\.[A-Za-z_]+|os\.system)\b.*\bshell\s*=\s*True", re.IGNORECASE)
|
|
52
|
+
_EVAL_EXEC = re.compile(r"\b(?:eval|exec)\s*\(")
|
|
53
|
+
_PICKLE = re.compile(r"\bpickle\.loads?\s*\(")
|
|
54
|
+
_UNSAFE_YAML = re.compile(r"\byaml\.load\s*\(")
|
|
55
|
+
_TLS_DISABLED = re.compile(r"\brequests\.[A-Za-z_]+\s*\(.*\bverify\s*=\s*False", re.IGNORECASE)
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def _safe_filename(filename: str) -> str:
|
|
59
|
+
name = PurePath(str(filename or "snippet.py")).name
|
|
60
|
+
return name[:160] or "snippet.py"
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def _append(
|
|
64
|
+
cls,
|
|
65
|
+
findings: List[CodeReviewFinding],
|
|
66
|
+
severity: str,
|
|
67
|
+
rule: str,
|
|
68
|
+
message: str,
|
|
69
|
+
line: int | None,
|
|
70
|
+
evidence: str,
|
|
71
|
+
) -> None:
|
|
72
|
+
if rule == "hardcoded-secret":
|
|
73
|
+
evidence = "<credential value redacted>"
|
|
74
|
+
findings.append(
|
|
75
|
+
CodeReviewFinding(
|
|
76
|
+
severity=severity,
|
|
77
|
+
rule=rule,
|
|
78
|
+
message=message,
|
|
79
|
+
line=line,
|
|
80
|
+
evidence=evidence.strip()[:240],
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def _scan_lines(cls, lines: Iterable[str], findings: List[CodeReviewFinding]) -> None:
|
|
86
|
+
for number, line in enumerate(lines, start=1):
|
|
87
|
+
if cls._SECRET_ASSIGNMENT.search(line) or cls._TOKEN_LITERAL.search(line):
|
|
88
|
+
cls._append(
|
|
89
|
+
findings, "high", "hardcoded-secret",
|
|
90
|
+
"疑似硬编码凭据;改用环境变量或受管密钥,并立即轮换已暴露的值。",
|
|
91
|
+
number, line,
|
|
92
|
+
)
|
|
93
|
+
if cls._SHELL_TRUE.search(line):
|
|
94
|
+
cls._append(
|
|
95
|
+
findings, "high", "shell-true",
|
|
96
|
+
"shell=True 会把不可信输入交给 shell 解释;改用参数列表和严格的输入校验。",
|
|
97
|
+
number, line,
|
|
98
|
+
)
|
|
99
|
+
if cls._EVAL_EXEC.search(line):
|
|
100
|
+
cls._append(
|
|
101
|
+
findings, "high", "dynamic-execution",
|
|
102
|
+
"eval/exec 可执行不可信文本;使用受限解析器或显式分发表。",
|
|
103
|
+
number, line,
|
|
104
|
+
)
|
|
105
|
+
if cls._PICKLE.search(line):
|
|
106
|
+
cls._append(
|
|
107
|
+
findings, "high", "unsafe-deserialization",
|
|
108
|
+
"pickle 反序列化不可信数据可执行任意代码;改用 JSON 或签名的可信工件。",
|
|
109
|
+
number, line,
|
|
110
|
+
)
|
|
111
|
+
if cls._UNSAFE_YAML.search(line) and "Loader=" not in line:
|
|
112
|
+
cls._append(
|
|
113
|
+
findings, "high", "unsafe-yaml-load",
|
|
114
|
+
"yaml.load 未指定安全 Loader;使用 yaml.safe_load。",
|
|
115
|
+
number, line,
|
|
116
|
+
)
|
|
117
|
+
if cls._TLS_DISABLED.search(line):
|
|
118
|
+
cls._append(
|
|
119
|
+
findings, "high", "tls-verification-disabled",
|
|
120
|
+
"TLS 证书校验被关闭;除受控测试外不得使用 verify=False。",
|
|
121
|
+
number, line,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
@classmethod
|
|
125
|
+
def review_source(
|
|
126
|
+
cls,
|
|
127
|
+
source: str,
|
|
128
|
+
*,
|
|
129
|
+
filename: str = "snippet.py",
|
|
130
|
+
language: str = "python",
|
|
131
|
+
is_diff: bool = False,
|
|
132
|
+
) -> List[CodeReviewFinding]:
|
|
133
|
+
"""Review source text or an already-provided diff without touching disk."""
|
|
134
|
+
if not isinstance(source, str) or not source.strip():
|
|
135
|
+
return [CodeReviewFinding("medium", "empty-input", "没有可审查的代码内容。", None, "")]
|
|
136
|
+
if len(source) > cls.MAX_SOURCE_CHARS:
|
|
137
|
+
return [CodeReviewFinding(
|
|
138
|
+
"medium", "input-truncated",
|
|
139
|
+
f"审查输入超过 {cls.MAX_SOURCE_CHARS} 字符;请按文件或提交拆分后复查。",
|
|
140
|
+
None, "",
|
|
141
|
+
)]
|
|
142
|
+
|
|
143
|
+
findings: List[CodeReviewFinding] = []
|
|
144
|
+
lines = source.splitlines()
|
|
145
|
+
scan_lines = [line[1:] for line in lines if line.startswith("+") and not line.startswith("+++")] if is_diff else lines
|
|
146
|
+
cls._scan_lines(scan_lines, findings)
|
|
147
|
+
|
|
148
|
+
inferred_python = language.lower() in {"py", "python"} or cls._safe_filename(filename).endswith(".py")
|
|
149
|
+
if inferred_python and not is_diff:
|
|
150
|
+
try:
|
|
151
|
+
tree = ast.parse(source, filename=cls._safe_filename(filename))
|
|
152
|
+
except SyntaxError as exc:
|
|
153
|
+
cls._append(
|
|
154
|
+
findings, "critical", "python-syntax-error",
|
|
155
|
+
"Python 代码无法解析,运行前会失败。",
|
|
156
|
+
exc.lineno, (exc.text or "").strip(),
|
|
157
|
+
)
|
|
158
|
+
else:
|
|
159
|
+
for node in ast.walk(tree):
|
|
160
|
+
if isinstance(node, ast.ExceptHandler) and node.type is None:
|
|
161
|
+
cls._append(
|
|
162
|
+
findings, "medium", "bare-except",
|
|
163
|
+
"裸 except 会吞掉系统退出和中断;至少捕获 Exception,并记录或处理错误。",
|
|
164
|
+
node.lineno, "except:",
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
unique = {(item.rule, item.line, item.evidence): item for item in findings}
|
|
168
|
+
return sorted(unique.values(), key=lambda item: (cls._SEVERITY_ORDER[item.severity], item.line or 0, item.rule))
|
|
169
|
+
|
|
170
|
+
@classmethod
|
|
171
|
+
def format_findings(cls, findings: List[CodeReviewFinding]) -> str:
|
|
172
|
+
if not findings:
|
|
173
|
+
return "确定性检查未发现已覆盖规则中的问题;仍需执行测试并进行语义审查。"
|
|
174
|
+
rows = []
|
|
175
|
+
for finding in findings:
|
|
176
|
+
location = f"第 {finding.line} 行" if finding.line else "输入级"
|
|
177
|
+
rows.append(f"[{finding.severity.upper()}] {location} {finding.rule}: {finding.message}")
|
|
178
|
+
return "\n".join(rows)
|
|
179
|
+
|
|
180
|
+
async def analyze(self, symbol: str, data: Dict[str, Any]) -> AgentResult:
|
|
181
|
+
source = str(data.get("source") or data.get("content") or data.get("diff") or "")
|
|
182
|
+
filename = self._safe_filename(str(data.get("filename") or symbol or "snippet.py"))
|
|
183
|
+
findings = self.review_source(
|
|
184
|
+
source,
|
|
185
|
+
filename=filename,
|
|
186
|
+
language=str(data.get("language") or "python"),
|
|
187
|
+
is_diff=bool(data.get("is_diff")),
|
|
188
|
+
)
|
|
189
|
+
return AgentResult(
|
|
190
|
+
agent=self.name,
|
|
191
|
+
symbol=filename,
|
|
192
|
+
analysis=self.format_findings(findings),
|
|
193
|
+
confidence=0.99 if source else 0.0,
|
|
194
|
+
signal="HOLD",
|
|
195
|
+
key_points=[f"{item.severity}: {item.rule}" for item in findings[:8]],
|
|
196
|
+
data_used={"filename": filename, "finding_count": len(findings)},
|
|
197
|
+
degraded=False,
|
|
198
|
+
provenance=["deterministic_static_review"],
|
|
199
|
+
limitations=["只审查调用方提供的文本;不会读取文件、执行命令或运行测试。"],
|
|
200
|
+
)
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"""
|
|
2
|
+
agents/financial/debate.py — 信号争议调解 Agent
|
|
3
|
+
================================================
|
|
4
|
+
当多个 Agent 出现真实分歧(看涨 vs 看跌)时,
|
|
5
|
+
DebateAgent 作为"裁判"对冲突进行分析,输出综合判断。
|
|
6
|
+
不独立运行,由 AgentTeam 在检测到分歧时自动触发。
|
|
7
|
+
|
|
8
|
+
2026-08 领域词汇修正:这个 agent 原本把金融的 BUY/HOLD/SELL 硬编码在
|
|
9
|
+
system prompt、信号解析和模板兜底里,但 AgentTeam 对**所有**领域都会在
|
|
10
|
+
信号冲突时触发它——实测跑 warehouse 团队(GOOD/WATCH/CONCERN/SEVERE)
|
|
11
|
+
时,它往结果里塞了一个 "HOLD",正是 signal_scheme.py 开头警告过的那种
|
|
12
|
+
"借用金融词汇表达完全不同含义"。表决层没被污染(SignalScheme.vote()
|
|
13
|
+
会过滤掉不在本领域词表里的信号),但报告界面上会多出一张语义不搭的卡片,
|
|
14
|
+
而且裁判意见实际上没参与最终结论 —— 等于白跑一趟。
|
|
15
|
+
|
|
16
|
+
现在 team.py 会把当前领域的 SignalScheme 通过 data["signal_scheme"]
|
|
17
|
+
传进来,本文件所有词汇都从 scheme 里取。不传时默认 FINANCIAL_SCHEME,
|
|
18
|
+
所以单独调用 DebateAgent 的既有金融调用方行为完全不变。
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import logging
|
|
24
|
+
from typing import Any, Dict, List
|
|
25
|
+
|
|
26
|
+
from ..base import BaseAgent, AgentResult
|
|
27
|
+
from ..signal_scheme import FINANCIAL_SCHEME, SignalScheme
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class DebateAgent(BaseAgent):
|
|
33
|
+
|
|
34
|
+
name = "debate"
|
|
35
|
+
description = "信号争议调解 — 当多 Agent 信号冲突时自动触发,输出裁判视角"
|
|
36
|
+
|
|
37
|
+
_SYSTEM_FINANCIAL = (
|
|
38
|
+
"You are a senior investment committee chair mediating a dispute between "
|
|
39
|
+
"analysts who have conflicting views on a stock. Your role is to:\n"
|
|
40
|
+
"1. Identify the core disagreement\n"
|
|
41
|
+
"2. Evaluate which side has stronger evidence\n"
|
|
42
|
+
"3. Determine the dominant factor (macro vs technical vs fundamental)\n"
|
|
43
|
+
"4. Provide a nuanced resolution that acknowledges both sides\n"
|
|
44
|
+
"5. Conclude with a clear signal: {vocabulary} and the primary reason\n"
|
|
45
|
+
"Be direct. Avoid empty hedging. Make a call."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
_SYSTEM_GENERIC = (
|
|
49
|
+
"You are the senior reviewer mediating a dispute between specialist "
|
|
50
|
+
"analysts who reached conflicting conclusions about the same subject. "
|
|
51
|
+
"Your role is to:\n"
|
|
52
|
+
"1. Identify the core disagreement\n"
|
|
53
|
+
"2. Evaluate which side has stronger evidence\n"
|
|
54
|
+
"3. Determine which dimension dominates the overall assessment\n"
|
|
55
|
+
"4. Provide a nuanced resolution that acknowledges both sides\n"
|
|
56
|
+
"5. Conclude with a clear signal: {vocabulary} and the primary reason\n"
|
|
57
|
+
"Be direct. Avoid empty hedging. Make a call."
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def _system_prompt(self, scheme: SignalScheme) -> str:
|
|
61
|
+
# 只有金融领域保留"投资委员会主席"这个具体身份设定;其它领域用中性
|
|
62
|
+
# 措辞——让仓储/地产的裁判自称投资委员会主席,会把 LLM 往错误的
|
|
63
|
+
# 推理框架上带(比如去权衡"要不要建仓"而不是"这个仓库健不健康")。
|
|
64
|
+
template = self._SYSTEM_FINANCIAL if scheme.name == "financial" else self._SYSTEM_GENERIC
|
|
65
|
+
return template.format(vocabulary=" / ".join(_ranked_vocabulary(scheme)))
|
|
66
|
+
|
|
67
|
+
async def fetch_data(self, symbol: str) -> Dict[str, Any]:
|
|
68
|
+
return await super().fetch_data(symbol)
|
|
69
|
+
|
|
70
|
+
async def analyze(self, symbol: str, data: Dict[str, Any]) -> AgentResult:
|
|
71
|
+
conflicting: List[Dict] = data.get("conflicting", [])
|
|
72
|
+
scheme: SignalScheme = data.get("signal_scheme") or FINANCIAL_SCHEME
|
|
73
|
+
|
|
74
|
+
if not conflicting:
|
|
75
|
+
return AgentResult(
|
|
76
|
+
agent=self.name, symbol=symbol,
|
|
77
|
+
analysis="无冲突结果可调解。",
|
|
78
|
+
confidence=0.3, signal=scheme.neutral_default,
|
|
79
|
+
key_points=["无需调解"],
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
debate_block = _format_conflict(conflicting, scheme)
|
|
83
|
+
vocabulary = " / ".join(_ranked_vocabulary(scheme))
|
|
84
|
+
subject_line = f"Stock: {symbol}" if scheme.name == "financial" else f"Subject: {symbol}"
|
|
85
|
+
dominant_q = (
|
|
86
|
+
"What is the dominant factor driving the stock right now? "
|
|
87
|
+
if scheme.name == "financial"
|
|
88
|
+
else "Which dimension dominates the overall assessment right now? "
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
prompt = (
|
|
92
|
+
f"{subject_line}\n\n"
|
|
93
|
+
f"Conflicting Analyst Views:\n{debate_block}\n\n"
|
|
94
|
+
"Mediate this dispute. Which view is more compelling and why? "
|
|
95
|
+
f"{dominant_q}"
|
|
96
|
+
f"End with: Signal: {vocabulary} — [primary reason in one line]"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
analysis = await self._call_llm(self._system_prompt(scheme), prompt, max_tokens=600)
|
|
100
|
+
if not analysis:
|
|
101
|
+
analysis = _template_resolution(symbol, conflicting, scheme)
|
|
102
|
+
|
|
103
|
+
signal = _extract_signal(analysis, scheme)
|
|
104
|
+
confidence = _estimate_confidence(conflicting)
|
|
105
|
+
key_points = _build_key_points(conflicting, analysis, scheme)
|
|
106
|
+
|
|
107
|
+
return AgentResult(
|
|
108
|
+
agent=self.name, symbol=symbol,
|
|
109
|
+
analysis=analysis,
|
|
110
|
+
confidence=confidence,
|
|
111
|
+
signal=signal,
|
|
112
|
+
key_points=key_points,
|
|
113
|
+
data_used={"conflict_count": len(conflicting)},
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# ── Helpers ───────────────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
def _ranked_vocabulary(scheme: SignalScheme) -> List[str]:
|
|
120
|
+
"""按分数从高到低列出该领域的信号词,供 prompt 展示。"""
|
|
121
|
+
return [name for name, _ in sorted(scheme.scores.items(), key=lambda kv: -kv[1])]
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _format_conflict(results: List[Dict], scheme: SignalScheme = FINANCIAL_SCHEME) -> str:
|
|
125
|
+
lines = []
|
|
126
|
+
for r in results:
|
|
127
|
+
agent = r.get("agent", "unknown")
|
|
128
|
+
signal = r.get("signal", scheme.neutral_default)
|
|
129
|
+
conf = r.get("confidence", 0)
|
|
130
|
+
pts = r.get("key_points", [])
|
|
131
|
+
summary = "; ".join(pts[:3]) if pts else r.get("analysis", "")[:150]
|
|
132
|
+
lines.append(
|
|
133
|
+
f" [{agent.upper()}] Signal: {signal} (conf {conf:.0%})\n"
|
|
134
|
+
f" Key points: {summary}"
|
|
135
|
+
)
|
|
136
|
+
return "\n".join(lines)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _extract_signal(analysis: str, scheme: SignalScheme = FINANCIAL_SCHEME) -> str:
|
|
140
|
+
"""从裁判文本里解析出本领域词汇表中的信号。
|
|
141
|
+
|
|
142
|
+
长词优先匹配(STRONG_BUY 必须排在 BUY 前面,否则 "STRONG_BUY" 会被
|
|
143
|
+
"BUY" 的前缀判定抢先命中;这是原实现手写四个 if 的顺序想表达的意思,
|
|
144
|
+
改成按长度排序后对任意领域词汇表都成立,不用每加一个领域重写一遍)。
|
|
145
|
+
"""
|
|
146
|
+
text = analysis.upper()
|
|
147
|
+
vocabulary = sorted(scheme.scores, key=len, reverse=True)
|
|
148
|
+
|
|
149
|
+
for marker in ("SIGNAL: ", "SIGNAL:", "CONCLUSION:", "CONCLUSION: "):
|
|
150
|
+
idx = text.find(marker)
|
|
151
|
+
if idx != -1:
|
|
152
|
+
remainder = text[idx + len(marker):].strip()
|
|
153
|
+
for name in vocabulary:
|
|
154
|
+
if remainder.startswith(name.upper()):
|
|
155
|
+
return name
|
|
156
|
+
|
|
157
|
+
# 没有显式 marker 时的兜底:只在文本里恰好出现一个方向的词汇时才采信,
|
|
158
|
+
# 出现多个方向说明裁判没给出明确结论,退回中性值而不是猜。
|
|
159
|
+
positives = [s for s in scheme.positive_signals if s.upper() in text]
|
|
160
|
+
negatives = [s for s in scheme.negative_signals if s.upper() in text]
|
|
161
|
+
if positives and not negatives:
|
|
162
|
+
return max(positives, key=lambda s: scheme.scores.get(s, 0))
|
|
163
|
+
if negatives and not positives:
|
|
164
|
+
return min(negatives, key=lambda s: scheme.scores.get(s, 0))
|
|
165
|
+
return scheme.neutral_default
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _estimate_confidence(results: List[Dict]) -> float:
|
|
169
|
+
if not results:
|
|
170
|
+
return 0.4
|
|
171
|
+
confs = [r.get("confidence", 0.5) for r in results if r.get("confidence")]
|
|
172
|
+
avg = sum(confs) / len(confs) if confs else 0.5
|
|
173
|
+
return round(min(avg * 0.9, 0.75), 2)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _side_labels(scheme: SignalScheme) -> tuple[str, str]:
|
|
177
|
+
"""(正面阵营, 负面阵营) 的中文标签。金融叫多空,其它领域这么叫没有意义
|
|
178
|
+
——仓储团队里没有"看跌方",只有"报告健康"和"报告有问题"的两拨 agent。"""
|
|
179
|
+
if scheme.name == "financial":
|
|
180
|
+
return "看涨方", "看跌方"
|
|
181
|
+
return "正面评估", "负面评估"
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _split_sides(results: List[Dict], scheme: SignalScheme) -> tuple[List[Dict], List[Dict]]:
|
|
185
|
+
positive = [r for r in results if r.get("signal") in scheme.positive_signals]
|
|
186
|
+
negative = [r for r in results if r.get("signal") in scheme.negative_signals]
|
|
187
|
+
return positive, negative
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _build_key_points(
|
|
191
|
+
results: List[Dict], analysis: str, scheme: SignalScheme = FINANCIAL_SCHEME
|
|
192
|
+
) -> List[str]:
|
|
193
|
+
positive, negative = _split_sides(results, scheme)
|
|
194
|
+
pos_label, neg_label = _side_labels(scheme)
|
|
195
|
+
points = []
|
|
196
|
+
if positive:
|
|
197
|
+
points.append(f"{pos_label}: {', '.join(r['agent'] for r in positive)}")
|
|
198
|
+
if negative:
|
|
199
|
+
points.append(f"{neg_label}: {', '.join(r['agent'] for r in negative)}")
|
|
200
|
+
points.append("DebateAgent 已介入调解")
|
|
201
|
+
points.append(f"裁判结论: {_extract_signal(analysis, scheme)}")
|
|
202
|
+
return points
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _template_resolution(
|
|
206
|
+
symbol: str, results: List[Dict], scheme: SignalScheme = FINANCIAL_SCHEME
|
|
207
|
+
) -> str:
|
|
208
|
+
positive, negative = _split_sides(results, scheme)
|
|
209
|
+
pos_label, neg_label = _side_labels(scheme)
|
|
210
|
+
|
|
211
|
+
best = max(scheme.scores, key=lambda s: scheme.scores[s])
|
|
212
|
+
worst = min(scheme.scores, key=lambda s: scheme.scores[s])
|
|
213
|
+
if len(positive) > len(negative):
|
|
214
|
+
resolution = f"{best} — 多数{pos_label}信号占优"
|
|
215
|
+
elif len(negative) > len(positive):
|
|
216
|
+
resolution = f"{worst} — 多数{neg_label}信号占优"
|
|
217
|
+
else:
|
|
218
|
+
resolution = f"{scheme.neutral_default} — 双方力量均衡,建议观望"
|
|
219
|
+
return (
|
|
220
|
+
f"{symbol} 信号冲突调解报告\n"
|
|
221
|
+
f"{pos_label}: {', '.join(r['agent'] for r in positive) or '无'}\n"
|
|
222
|
+
f"{neg_label}: {', '.join(r['agent'] for r in negative) or '无'}\n"
|
|
223
|
+
f"裁判结论: Signal: {resolution}"
|
|
224
|
+
)
|
|
@@ -6,11 +6,15 @@ agents/financial/fundamental.py — 基本面分析 Agent
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
import os
|
|
8
8
|
import sys
|
|
9
|
+
from pathlib import Path
|
|
9
10
|
from typing import Any, Dict, List, Optional
|
|
10
11
|
from ..base import BaseAgent, AgentResult
|
|
11
12
|
|
|
12
13
|
# 动态加载 aria_tools 中的 MCP 工具
|
|
13
|
-
|
|
14
|
+
# 相对本文件定位同仓库的 packages/,不写死开发者本机路径
|
|
15
|
+
_PKGS = str(Path(__file__).resolve().parents[2] / "packages")
|
|
16
|
+
if _PKGS not in sys.path:
|
|
17
|
+
sys.path.append(_PKGS)
|
|
14
18
|
try:
|
|
15
19
|
from aria_tools.financial.factors import run_factor_research
|
|
16
20
|
except ImportError:
|
|
@@ -16,10 +16,14 @@ except ImportError:
|
|
|
16
16
|
|
|
17
17
|
import os
|
|
18
18
|
import sys
|
|
19
|
+
from pathlib import Path
|
|
19
20
|
import asyncio
|
|
20
21
|
|
|
21
22
|
# 动态加载 aria_tools 中的 MCP 工具
|
|
22
|
-
|
|
23
|
+
# 相对本文件定位同仓库的 packages/,不写死开发者本机路径
|
|
24
|
+
_PKGS = str(Path(__file__).resolve().parents[2] / "packages")
|
|
25
|
+
if _PKGS not in sys.path:
|
|
26
|
+
sys.path.append(_PKGS)
|
|
23
27
|
try:
|
|
24
28
|
from aria_tools.financial.risk_tools import run_risk_profile
|
|
25
29
|
except ImportError:
|
|
@@ -276,7 +276,13 @@ class AgentTeam:
|
|
|
276
276
|
if explicit_debate or self.signal_scheme.needs_debate(results):
|
|
277
277
|
debate_agent = self._build_agent("debate")
|
|
278
278
|
if debate_agent:
|
|
279
|
-
debate_data = {
|
|
279
|
+
debate_data = {
|
|
280
|
+
"conflicting": [r.to_dict() for r in results if r.success],
|
|
281
|
+
# 领域词汇表要一起传:DebateAgent 默认说金融的 BUY/HOLD/SELL,
|
|
282
|
+
# 不告诉它当前领域用什么词,它产出的信号会被 vote() 过滤掉
|
|
283
|
+
# (不在 scores 里),等于裁判意见完全不参与最终结论。
|
|
284
|
+
"signal_scheme": self.signal_scheme,
|
|
285
|
+
}
|
|
280
286
|
try:
|
|
281
287
|
debate_result = await asyncio.wait_for(
|
|
282
288
|
debate_agent.analyze(symbol, debate_data),
|