aria-code 0.90.0__tar.gz → 0.92.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.
Files changed (759) hide show
  1. {aria_code-0.90.0/src/aria_code.egg-info → aria_code-0.92.0}/PKG-INFO +1 -1
  2. {aria_code-0.90.0 → aria_code-0.92.0}/pyproject.toml +1 -1
  3. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/base.py +13 -2
  5. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/earnings.py +22 -10
  6. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/fundamental.py +18 -2
  7. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/macro.py +19 -7
  8. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/news.py +31 -7
  9. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/risk.py +17 -6
  10. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/technical.py +30 -11
  11. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/portfolio_agent.py +45 -16
  12. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/registry.py +11 -1
  13. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/team.py +22 -14
  14. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +78 -52
  15. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/team.py +61 -7
  16. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/helpers.py +48 -28
  17. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/local_tool_schemas.py +2 -1
  18. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/runtime_consumer.py +15 -5
  19. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/system_tools.py +56 -192
  20. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/write_tools.py +28 -4
  21. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_cli.py +3 -2
  22. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/tool_executor.py +2 -1
  23. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/safety/permissions.py +52 -26
  24. aria_code-0.92.0/src/aria_code/safety/sandbox.py +120 -0
  25. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/render/team.py +28 -15
  26. {aria_code-0.90.0 → aria_code-0.92.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  27. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code.egg-info/SOURCES.txt +8 -0
  28. aria_code-0.92.0/tests/test_agent_key_points_language.py +68 -0
  29. aria_code-0.92.0/tests/test_edit_and_command_safety.py +122 -0
  30. aria_code-0.92.0/tests/test_os_sandbox.py +102 -0
  31. aria_code-0.92.0/tests/test_portfolio_language.py +112 -0
  32. aria_code-0.92.0/tests/test_project_context_files.py +79 -0
  33. aria_code-0.92.0/tests/test_shell_commands_as_written.py +70 -0
  34. aria_code-0.92.0/tests/test_team_analysts.py +98 -0
  35. {aria_code-0.90.0 → aria_code-0.92.0}/LICENSE +0 -0
  36. {aria_code-0.90.0 → aria_code-0.92.0}/NOTICE +0 -0
  37. {aria_code-0.90.0 → aria_code-0.92.0}/README.md +0 -0
  38. {aria_code-0.90.0 → aria_code-0.92.0}/setup.cfg +0 -0
  39. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/__init__.py +0 -0
  40. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/adk_apps/__init__.py +0 -0
  41. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  42. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  43. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  44. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  45. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/__init__.py +0 -0
  46. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/code_review.py +0 -0
  47. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/__init__.py +0 -0
  48. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  49. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/critic.py +0 -0
  50. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/deepen.py +0 -0
  51. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/models.py +0 -0
  52. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  53. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  54. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/themes.py +0 -0
  55. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/deep/tiers.py +0 -0
  56. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  57. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/engineering/coder.py +0 -0
  58. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/engineering/tester.py +0 -0
  59. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/__init__.py +0 -0
  60. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  61. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  62. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  63. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/debate.py +0 -0
  64. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/sector.py +0 -0
  65. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/strategist.py +0 -0
  66. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  67. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  68. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/orchestrator.py +0 -0
  69. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/__init__.py +0 -0
  70. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  71. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/business_match.py +0 -0
  72. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  73. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  74. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  75. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  76. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  77. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  78. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  79. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/signal_scheme.py +0 -0
  80. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/sports/__init__.py +0 -0
  81. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  82. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/supervisor.py +0 -0
  83. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  84. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  85. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  86. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  87. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  88. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  89. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  90. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  91. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  92. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  93. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  94. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aliyun_data_client.py +0 -0
  95. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/README.md +0 -0
  96. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/__init__.py +0 -0
  97. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/README.md +0 -0
  98. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/__init__.py +0 -0
  99. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/approvals.py +0 -0
  100. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/conversation.py +0 -0
  101. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/digest.py +0 -0
  102. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/intake.py +0 -0
  103. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/registry.py +0 -0
  104. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  105. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/README.md +0 -0
  106. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/__init__.py +0 -0
  107. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/_optional.py +0 -0
  108. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  109. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  110. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  111. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  112. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  113. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  114. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  115. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  116. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  117. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  118. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  119. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  120. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  121. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  122. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  123. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  124. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  125. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  126. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  127. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  128. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  129. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  130. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  131. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  132. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  133. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  134. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  135. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  136. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  137. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  138. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  139. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  140. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  141. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  142. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  143. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  144. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  145. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  146. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  147. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/config_store.py +0 -0
  148. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/constants.py +0 -0
  149. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/context.py +0 -0
  150. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  151. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/direct.py +0 -0
  152. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  153. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  154. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  155. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/google_login.py +0 -0
  156. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  157. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  158. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  159. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  160. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  161. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  162. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  163. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/hooks.py +0 -0
  164. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/i18n.py +0 -0
  165. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/intent.py +0 -0
  166. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  167. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  168. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  169. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/main.py +0 -0
  170. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  171. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  172. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  173. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  174. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  175. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  176. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  177. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  178. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  179. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/preflight.py +0 -0
  180. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  181. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  182. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  183. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  184. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  185. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  186. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  187. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  188. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  189. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  190. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  191. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  192. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  193. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  194. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  195. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  196. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  197. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  198. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  199. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  200. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  201. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  202. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/session_export.py +0 -0
  203. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  204. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/session_store.py +0 -0
  205. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  206. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  207. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  208. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  209. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  210. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  211. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  212. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  213. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  214. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  215. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  216. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  217. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/update_check.py +0 -0
  218. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/updater.py +0 -0
  219. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  220. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  221. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/daemon/README.md +0 -0
  222. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/vscode/README.md +0 -0
  223. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/apps/vscode/package.json +0 -0
  224. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_daemon.py +0 -0
  225. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_feishu_bot.py +0 -0
  226. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_mcp_server.py +0 -0
  227. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_relay_client.py +0 -0
  228. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_relay_server.py +0 -0
  229. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/aria_telegram_bot.py +0 -0
  230. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ariarc.py +0 -0
  231. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/artifacts.py +0 -0
  232. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/backtest_engine.py +0 -0
  233. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/backtest_report.py +0 -0
  234. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/__init__.py +0 -0
  235. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/automation.py +0 -0
  236. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/base.py +0 -0
  237. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/capabilities.py +0 -0
  238. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  239. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  240. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  241. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  242. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  243. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  244. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/config.py +0 -0
  245. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  246. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  247. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  248. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  249. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  250. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/paper_broker.py +0 -0
  251. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/planning.py +0 -0
  252. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/registry.py +0 -0
  253. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/brokers/trading.py +0 -0
  254. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/canva_client.py +0 -0
  255. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/change_store.py +0 -0
  256. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/__init__.py +0 -0
  257. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  258. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  259. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/canva_client.py +0 -0
  260. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/figma_client.py +0 -0
  261. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/football_data_client.py +0 -0
  262. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/kling_video_client.py +0 -0
  263. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/market_data_client.py +0 -0
  264. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/openai_image_client.py +0 -0
  265. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/runway_video_client.py +0 -0
  266. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  267. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/cloud_memory.py +0 -0
  268. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/command_safety.py +0 -0
  269. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/computer_use_tools.py +0 -0
  270. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/dashboard_generator.py +0 -0
  271. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/data_analysis_tools.py +0 -0
  272. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/data_cleaner.py +0 -0
  273. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/data_service.py +0 -0
  274. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/__init__.py +0 -0
  275. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/base.py +0 -0
  276. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/router.py +0 -0
  277. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  278. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  279. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  280. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  281. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  282. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  283. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  284. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  285. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  286. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  287. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/demo_player.py +0 -0
  288. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/doctor.py +0 -0
  289. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/domain/__init__.py +0 -0
  290. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/domain/backtest_engine.py +0 -0
  291. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/domain/backtest_report.py +0 -0
  292. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/domain/finance_formulas.py +0 -0
  293. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  294. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/domain/strategy_vault.py +0 -0
  295. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/evals/__init__.py +0 -0
  296. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/evals/harness.py +0 -0
  297. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/evals/runner.py +0 -0
  298. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/external_agent_runner.py +0 -0
  299. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/figma_client.py +0 -0
  300. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/file_analysis_tools.py +0 -0
  301. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/finance_formulas.py +0 -0
  302. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/football_data_client.py +0 -0
  303. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/image_gen_tools.py +0 -0
  304. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/intent_classifier.py +0 -0
  305. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/kling_video_client.py +0 -0
  306. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/licensing.py +0 -0
  307. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/local_finance_tools.py +0 -0
  308. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/local_image_provider.py +0 -0
  309. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/local_llm_provider.py +0 -0
  310. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/macro_tools.py +0 -0
  311. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/markdown_pdf.py +0 -0
  312. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/market_data_client.py +0 -0
  313. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/mcp_client.py +0 -0
  314. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/memory_manager.py +0 -0
  315. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/model_capability.py +0 -0
  316. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/notification_tools.py +0 -0
  317. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/openai_image_client.py +0 -0
  318. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/__init__.py +0 -0
  319. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  320. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  321. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  322. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  323. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  324. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  325. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  326. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_core/export.py +0 -0
  327. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  328. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  329. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  330. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  331. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  332. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  333. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  334. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  335. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  336. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  337. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  338. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  339. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  340. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  341. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  342. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  343. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  344. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  345. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  346. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  347. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  348. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/context.py +0 -0
  349. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  350. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/data.py +0 -0
  351. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  352. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/references.py +0 -0
  353. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  354. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  355. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  356. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  357. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  358. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  359. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  360. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  361. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  362. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  363. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  364. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  365. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  366. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  367. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  368. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  369. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  370. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  371. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  372. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  373. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  374. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  375. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  376. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  377. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  378. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  379. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  380. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  381. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  382. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  383. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  384. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  385. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  386. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  387. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  388. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  389. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  390. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  391. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  392. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  393. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/__init__.py +0 -0
  394. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/base.py +0 -0
  395. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/finance/__init__.py +0 -0
  396. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  397. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/payments/__init__.py +0 -0
  398. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/realty/__init__.py +0 -0
  399. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/registry.py +0 -0
  400. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/packs/rules.py +0 -0
  401. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/plan_utils.py +0 -0
  402. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/plugin_loader.py +0 -0
  403. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/portfolio_ledger.py +0 -0
  404. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/preview_server.py +0 -0
  405. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/privacy/__init__.py +0 -0
  406. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/privacy/feedback.py +0 -0
  407. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/project_review.py +0 -0
  408. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/project_review_api.py +0 -0
  409. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/project_review_server.py +0 -0
  410. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/project_tools.py +0 -0
  411. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/__init__.py +0 -0
  412. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/__init__.py +0 -0
  413. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  414. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  415. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/base.py +0 -0
  416. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/custom.py +0 -0
  417. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/ollama.py +0 -0
  418. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  419. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/llm/registry.py +0 -0
  420. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/local_image_provider.py +0 -0
  421. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  422. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/providers/tool_messages.py +0 -0
  423. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/realty_data_tools.py +0 -0
  424. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/relay_store.py +0 -0
  425. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/report_exporters.py +0 -0
  426. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/report_generator.py +0 -0
  427. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/review_service.py +0 -0
  428. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/__init__.py +0 -0
  429. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/acceptance.py +0 -0
  430. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/agent_loop.py +0 -0
  431. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/approval.py +0 -0
  432. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/budget.py +0 -0
  433. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/checkpoints.py +0 -0
  434. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/crash_report.py +0 -0
  435. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/events.py +0 -0
  436. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/gateway.py +0 -0
  437. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/lsp.py +0 -0
  438. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/orchestrator.py +0 -0
  439. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/repo_map.py +0 -0
  440. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/run_state.py +0 -0
  441. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/run_store.py +0 -0
  442. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/self_healing.py +0 -0
  443. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/subagent.py +0 -0
  444. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/task_ledger.py +0 -0
  445. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  446. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/tool_policy.py +0 -0
  447. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runtime/worktrees.py +0 -0
  448. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/runway_video_client.py +0 -0
  449. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/safety/__init__.py +0 -0
  450. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/safety/service.py +0 -0
  451. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/setup_wizard.py +0 -0
  452. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/spreadsheet_tools.py +0 -0
  453. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/strategy_vault.py +0 -0
  454. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/__init__.py +0 -0
  455. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/artifact_tools.py +0 -0
  456. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/broker_tools.py +0 -0
  457. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  458. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  459. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  460. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  461. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  462. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/extended_tools.py +0 -0
  463. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  464. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  465. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  466. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  467. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  468. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/logistics_io.py +0 -0
  469. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  470. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/logistics_tools.py +0 -0
  471. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/macro_tools.py +0 -0
  472. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/notification_tools.py +0 -0
  473. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/project_tools.py +0 -0
  474. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  475. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  476. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/tools/stripe_tools.py +0 -0
  477. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/__init__.py +0 -0
  478. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/banner.py +0 -0
  479. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/completer.py +0 -0
  480. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/console.py +0 -0
  481. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/image_render.py +0 -0
  482. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/input_box.py +0 -0
  483. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/mentions.py +0 -0
  484. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/picker.py +0 -0
  485. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/render/__init__.py +0 -0
  486. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/render/finance.py +0 -0
  487. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/render/market.py +0 -0
  488. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/render/output.py +0 -0
  489. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/render/responsive.py +0 -0
  490. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/robot.py +0 -0
  491. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  492. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/utils/vscode_uri.py +0 -0
  493. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/video_analysis.py +0 -0
  494. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/video_editor.py +0 -0
  495. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace/__init__.py +0 -0
  496. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace/files.py +0 -0
  497. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace/verify.py +0 -0
  498. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace_changes.py +0 -0
  499. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace_context.py +0 -0
  500. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace_service.py +0 -0
  501. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code/workspace_tools.py +0 -0
  502. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  503. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  504. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code.egg-info/requires.txt +0 -0
  505. {aria_code-0.90.0 → aria_code-0.92.0}/src/aria_code.egg-info/top_level.txt +0 -0
  506. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_adk_market_tools.py +0 -0
  507. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_agent_team_fallback.py +0 -0
  508. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_analyze_file_tool.py +0 -0
  509. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_architecture_ledger_is_true.py +0 -0
  510. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_architecture_report.py +0 -0
  511. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_aria_cli_core.py +0 -0
  512. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_aria_mcp_server.py +0 -0
  513. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_aria_sdk.py +0 -0
  514. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_artifact_publishing.py +0 -0
  515. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_artifacts_and_reports.py +0 -0
  516. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ashare_prediction_cmds.py +0 -0
  517. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_backtest_cmds.py +0 -0
  518. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_backtest_engine.py +0 -0
  519. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_backtest_report.py +0 -0
  520. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  521. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_broken_akshare_is_optional.py +0 -0
  522. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_broker_automation.py +0 -0
  523. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  524. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_broker_planning.py +0 -0
  525. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_broker_safety.py +0 -0
  526. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_broker_tools.py +0 -0
  527. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_budget.py +0 -0
  528. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_business_workflow_cmds.py +0 -0
  529. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_canva_client.py +0 -0
  530. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_canvas_cmds.py +0 -0
  531. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_card_approvals.py +0 -0
  532. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_channel_intake.py +0 -0
  533. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_channels.py +0 -0
  534. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_chart_handlers.py +0 -0
  535. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_chat_bots_fail_closed.py +0 -0
  536. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_chat_routing.py +0 -0
  537. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ci_security_workflow.py +0 -0
  538. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_app_split.py +0 -0
  539. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_bootstrap.py +0 -0
  540. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_config_store.py +0 -0
  541. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  542. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_runtime_consumer.py +0 -0
  543. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_tool_executor_module.py +0 -0
  544. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cli_updater.py +0 -0
  545. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_cloud_memory.py +0 -0
  546. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_code_audit_tools.py +0 -0
  547. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_code_review_agent.py +0 -0
  548. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_codegen_output.py +0 -0
  549. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_coder_tester_self_healing.py +0 -0
  550. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_coder_tool_safety.py +0 -0
  551. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_collaboration.py +0 -0
  552. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_command_loggers.py +0 -0
  553. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_command_safety.py +0 -0
  554. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_completions_builder.py +0 -0
  555. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_config_paths.py +0 -0
  556. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_configured_provider.py +0 -0
  557. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_container_entrypoint.py +0 -0
  558. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_container_entrypoints.py +0 -0
  559. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_context_checkpoints.py +0 -0
  560. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_context_references.py +0 -0
  561. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_context_service.py +0 -0
  562. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_conversation_core.py +0 -0
  563. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_crash_report.py +0 -0
  564. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_credential_file_permissions.py +0 -0
  565. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_custom_providers.py +0 -0
  566. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_daemon_gateway_config.py +0 -0
  567. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_dashboard_generator.py +0 -0
  568. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_data_service.py +0 -0
  569. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_data_service_imports.py +0 -0
  570. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_data_without_model.py +0 -0
  571. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_datasource_routing.py +0 -0
  572. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_deep_analysis.py +0 -0
  573. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_degrades_without_quant_engine.py +0 -0
  574. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  575. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_doctor.py +0 -0
  576. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  577. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_doctor_npm_scope.py +0 -0
  578. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_engine_boundary.py +0 -0
  579. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_enterprise_tool_honesty.py +0 -0
  580. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_env_switch_docs.py +0 -0
  581. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_evals_harness.py +0 -0
  582. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_event_import_roots.py +0 -0
  583. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_extended_tools.py +0 -0
  584. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_feishu_swarm_config.py +0 -0
  585. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_file_links.py +0 -0
  586. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_finalize_release.py +0 -0
  587. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_finance_renderers.py +0 -0
  588. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_finance_service_catalog.py +0 -0
  589. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_first_run_output.py +0 -0
  590. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_first_run_works.py +0 -0
  591. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_football_agent.py +0 -0
  592. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_football_prediction_output.py +0 -0
  593. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_google_cloud_models.py +0 -0
  594. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_google_cloud_routing.py +0 -0
  595. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_google_login.py +0 -0
  596. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_google_search_provider.py +0 -0
  597. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_headless_is_agentic.py +0 -0
  598. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_honest_surfaces.py +0 -0
  599. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_image_gen_tools.py +0 -0
  600. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_image_inputs.py +0 -0
  601. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_import_graph_budget.py +0 -0
  602. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_intent_router.py +0 -0
  603. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_intent_signals.py +0 -0
  604. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_kling_video_client.py +0 -0
  605. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_lazy_rebind.py +0 -0
  606. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_legacy_module_imports.py +0 -0
  607. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_license_consistency.py +0 -0
  608. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_licensing.py +0 -0
  609. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_local_image_provider.py +0 -0
  610. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_logistics_3pl.py +0 -0
  611. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_logistics_and_finance_agents.py +0 -0
  612. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_lsp.py +0 -0
  613. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_markdown_pdf.py +0 -0
  614. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_answers_in_english.py +0 -0
  615. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_data_client.py +0 -0
  616. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_history_inheritance.py +0 -0
  617. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_history_tool.py +0 -0
  618. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_hours.py +0 -0
  619. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_questions_on_backend.py +0 -0
  620. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_symbol_extraction.py +0 -0
  621. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_market_universe.py +0 -0
  622. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_mcp_circuit.py +0 -0
  623. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_mcp_client.py +0 -0
  624. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_mentions.py +0 -0
  625. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_model_capability_registry.py +0 -0
  626. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_model_choice_is_the_users.py +0 -0
  627. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_model_selection_state.py +0 -0
  628. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_narrow_chinese_output.py +0 -0
  629. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_native_binary_entrypoints.py +0 -0
  630. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_native_installer.py +0 -0
  631. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_natural_language_routing.py +0 -0
  632. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_new_modules.py +0 -0
  633. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  634. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_no_uncommitted_imports.py +0 -0
  635. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_numeric_listings.py +0 -0
  636. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ollama_stream_imports.py +0 -0
  637. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ollama_stream_tools.py +0 -0
  638. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_openai_image_client.py +0 -0
  639. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_operations_suite.py +0 -0
  640. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_output_rendering.py +0 -0
  641. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_packages_facade.py +0 -0
  642. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_packaging_constraints.py +0 -0
  643. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_packaging_manifest.py +0 -0
  644. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_packs_domains.py +0 -0
  645. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_pdf_report.py +0 -0
  646. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_pick_best_installed_model.py +0 -0
  647. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_plan_mode.py +0 -0
  648. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_platform_package_assembly.py +0 -0
  649. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_platform_packages.py +0 -0
  650. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_platform_publish.py +0 -0
  651. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_plotly_html_output.py +0 -0
  652. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_portfolio_ledger.py +0 -0
  653. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_post_turn_context_decision.py +0 -0
  654. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_preflight.py +0 -0
  655. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_preview_server.py +0 -0
  656. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_privacy_feedback.py +0 -0
  657. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_project_aria.py +0 -0
  658. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_project_review.py +0 -0
  659. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_project_review_api.py +0 -0
  660. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_prompt_assembly.py +0 -0
  661. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_prompt_selection.py +0 -0
  662. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_provider_autoconfig.py +0 -0
  663. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_provider_error_messages.py +0 -0
  664. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_provider_integration.py +0 -0
  665. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_provider_registry.py +0 -0
  666. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_public_service_status.py +0 -0
  667. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_quant_engine_namespace.py +0 -0
  668. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_rebind_contract.py +0 -0
  669. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_rebind_namespace_contract.py +0 -0
  670. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_relay_client_credentials.py +0 -0
  671. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_relay_event_verification.py +0 -0
  672. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_relay_sends_for_clients.py +0 -0
  673. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_relay_store.py +0 -0
  674. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_relay_url.py +0 -0
  675. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_release_chain.py +0 -0
  676. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_release_commit_identity.py +0 -0
  677. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_release_push_is_atomic.py +0 -0
  678. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_release_reaches_the_registries.py +0 -0
  679. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_release_verification_waits.py +0 -0
  680. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_release_workflow_permissions.py +0 -0
  681. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_report_charts.py +0 -0
  682. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_report_generator.py +0 -0
  683. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_research_protocol.py +0 -0
  684. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_research_quality.py +0 -0
  685. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_responsive_rendering.py +0 -0
  686. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_review_service.py +0 -0
  687. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_root_module_budget.py +0 -0
  688. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  689. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_acceptance.py +0 -0
  690. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_agent_loop.py +0 -0
  691. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_approval.py +0 -0
  692. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_bridge.py +0 -0
  693. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_bridge_fallback.py +0 -0
  694. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_checkpoints.py +0 -0
  695. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_event_identity.py +0 -0
  696. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_gateway.py +0 -0
  697. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_repo_map.py +0 -0
  698. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_run_store.py +0 -0
  699. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_tool_executor.py +0 -0
  700. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runtime_worktrees.py +0 -0
  701. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_runway_video_client.py +0 -0
  702. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_safety_permissions.py +0 -0
  703. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_safety_service.py +0 -0
  704. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_safety_service_adoption.py +0 -0
  705. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_service_diagnostics_security.py +0 -0
  706. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_session_search.py +0 -0
  707. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_settings_service.py +0 -0
  708. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_shipper_digest.py +0 -0
  709. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_single_import_root.py +0 -0
  710. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_skill_agent_binding.py +0 -0
  711. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_skill_catalog.py +0 -0
  712. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_skill_loader.py +0 -0
  713. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_slash_popup.py +0 -0
  714. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_spreadsheet_tools.py +0 -0
  715. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_sse_stream_contract.py +0 -0
  716. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_startup_dashboard.py +0 -0
  717. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_startup_latency.py +0 -0
  718. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_status_language.py +0 -0
  719. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_streaming_pipeline.py +0 -0
  720. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_stripe_agent.py +0 -0
  721. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_subagent.py +0 -0
  722. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_supervisor_routing.py +0 -0
  723. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_system_prompts.py +0 -0
  724. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_system_tools_output.py +0 -0
  725. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_task_orchestrator.py +0 -0
  726. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_team_synthesis.py +0 -0
  727. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_tls_trust_store.py +0 -0
  728. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_tool_policy.py +0 -0
  729. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  730. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_tool_scope.py +0 -0
  731. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_tool_step_output.py +0 -0
  732. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_trading_service.py +0 -0
  733. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_tradingview_bridge.py +0 -0
  734. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_turn_planning.py +0 -0
  735. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ui_completer_references.py +0 -0
  736. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ui_console_theme.py +0 -0
  737. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ui_input_box.py +0 -0
  738. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ui_language_and_model.py +0 -0
  739. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_ui_robot_banner.py +0 -0
  740. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_update_health_routes.py +0 -0
  741. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_verification_hint.py +0 -0
  742. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_verification_policy.py +0 -0
  743. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_version_consistency.py +0 -0
  744. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_version_counter.py +0 -0
  745. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_video_analysis.py +0 -0
  746. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_video_editor.py +0 -0
  747. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_vscode_mcp.py +0 -0
  748. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_warehouse_agents.py +0 -0
  749. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_warehouse_cli_registration.py +0 -0
  750. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_warehouse_erp_client.py +0 -0
  751. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_warehouse_workflow.py +0 -0
  752. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_wheel_is_installable.py +0 -0
  753. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_workspace_changes.py +0 -0
  754. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_workspace_context.py +0 -0
  755. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_workspace_files.py +0 -0
  756. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_workspace_scope.py +0 -0
  757. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_workspace_service.py +0 -0
  758. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_workspace_verify.py +0 -0
  759. {aria_code-0.90.0 → aria_code-0.92.0}/tests/test_wrapped_indent.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.90.0
3
+ Version: 0.92.0
4
4
  Summary: Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/artheras/aria-code
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aria-code"
7
- version = "0.90.0"
7
+ version = "0.92.0"
8
8
  description = "Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -17,4 +17,4 @@ from __future__ import annotations
17
17
 
18
18
  __all__ = ["__version__"]
19
19
 
20
- __version__ = "0.90.0"
20
+ __version__ = "0.92.0"
@@ -103,6 +103,7 @@ class BaseAgent(ABC):
103
103
  self.on_tool_end = on_tool_end
104
104
  self.config = config or {}
105
105
  self.lang = lang
106
+ self.llm_error: Optional[str] = None # why the last model call gave nothing, if it failed
106
107
  self.memory = [] # Short-term conversation history for multi-turn context
107
108
 
108
109
  async def fetch_data(self, symbol: str) -> Dict[str, Any]:
@@ -176,6 +177,12 @@ class BaseAgent(ABC):
176
177
  _lang_rule = self._LANG_RULES.get(self.lang, self._LANG_RULES["zh"])
177
178
  _data_warn = self._data_guard(quote or {})
178
179
  system = system + self._TIME_SENSITIVE_FACT_POLICY + _lang_rule + _data_warn
180
+ if self.lang == "en":
181
+ # The agents' own prompts and much of their data are Chinese. A rule
182
+ # appended at the end lost to them: an English /team synthesis on
183
+ # Gemini came back in Chinese. Say it first as well.
184
+ system = ("Write your entire answer in English, even though the instructions and data "
185
+ "below may be in Chinese.\n\n" + system)
179
186
  from aria_code.providers.llm.base import Message
180
187
 
181
188
  # 自动注入 DAG pipeline 中的 upstream context
@@ -228,10 +235,14 @@ class BaseAgent(ABC):
228
235
  elif t == "tool_end" and self.on_tool_end:
229
236
  self.on_tool_end(event.get("tool_name", ""), event.get("tool_result", None))
230
237
  elif t == "error":
231
- logger.warning(f"[{self.name}] LLM 错误: {event.get('message')}")
238
+ # The caller falls back to a template and says so; a
239
+ # WARNING here went to the terminal as a raw log line.
240
+ self.llm_error = str(event.get("message") or "error")
241
+ logger.info(f"[{self.name}] LLM 错误: {event.get('message')}")
232
242
  break
233
243
  except Exception as e:
234
- logger.warning(f"[{self.name}] LLM 调用失败: {e}")
244
+ self.llm_error = str(e) or type(e).__name__
245
+ logger.info(f"[{self.name}] LLM 调用失败: {e}")
235
246
  break
236
247
 
237
248
  # 将当前 Assistant 的回复加入消息流
@@ -128,9 +128,10 @@ class EarningsAgent(BaseAgent):
128
128
  if not earnings:
129
129
  return AgentResult(
130
130
  agent=self.name, symbol=symbol,
131
- analysis=f"{symbol}: 未获取到财报数据。",
131
+ analysis=(f"{symbol}: 未获取到财报数据。" if str(self.lang).startswith("zh")
132
+ else f"{symbol}: no earnings data."),
132
133
  confidence=0.3, signal="HOLD",
133
- key_points=["无财报数据"],
134
+ key_points=["无财报数据" if str(self.lang).startswith("zh") else "no earnings data"],
134
135
  )
135
136
 
136
137
  earnings_block = _format_earnings(earnings)
@@ -150,10 +151,10 @@ class EarningsAgent(BaseAgent):
150
151
 
151
152
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=500)
152
153
  if not analysis:
153
- analysis = _template_analysis(symbol, earnings, most_recent, beat_miss_summary)
154
+ analysis = _template_analysis(symbol, earnings, most_recent, beat_miss_summary, lang=self.lang)
154
155
 
155
156
  signal, confidence = _derive_signal(analysis, most_recent, earnings)
156
- key_points = _build_key_points(earnings, most_recent, signal)
157
+ key_points = _build_key_points(earnings, most_recent, signal, lang=self.lang)
157
158
 
158
159
  return AgentResult(
159
160
  agent=self.name, symbol=symbol,
@@ -265,26 +266,30 @@ def _derive_signal(analysis: str, most_recent: Dict, earnings: Dict) -> tuple[st
265
266
  return "HOLD", 0.40
266
267
 
267
268
 
268
- def _build_key_points(earnings: Dict, most_recent: Dict, signal: str) -> List[str]:
269
+ def _build_key_points(earnings: Dict, most_recent: Dict, signal: str, lang: str = "zh") -> List[str]:
270
+ zh = str(lang).lower().startswith("zh")
269
271
  pts = []
270
272
  sup = most_recent.get("pct_surprise")
271
273
  if sup is not None:
272
- pts.append(f"EPS 超预期 {sup:+.1f}%" if sup >= 0 else f"EPS 低于预期 {sup:.1f}%")
274
+ if zh:
275
+ pts.append(f"EPS 超预期 {sup:+.1f}%" if sup >= 0 else f"EPS 低于预期 {sup:.1f}%")
276
+ else:
277
+ pts.append(f"EPS beat by {sup:+.1f}%" if sup >= 0 else f"EPS missed by {sup:.1f}%")
273
278
  rx = earnings.get("price_reaction_pct")
274
279
  if rx is not None:
275
- pts.append(f"财报后股价反应: {rx:+.1f}%")
280
+ pts.append(f"财报后股价反应: {rx:+.1f}%" if zh else f"post-earnings move {rx:+.1f}%")
276
281
  rev = earnings.get("revenue_trend", [])
277
282
  if len(rev) >= 2:
278
283
  v0 = rev[0].get("revenue")
279
284
  v1 = rev[1].get("revenue")
280
285
  if v0 and v1:
281
286
  qoq = (v0 - v1) / abs(v1) * 100
282
- pts.append(f"营收环比 {qoq:+.1f}%")
283
- pts.append(f"财报信号: {signal}")
287
+ pts.append(f"营收环比 {qoq:+.1f}%" if zh else f"revenue {qoq:+.1f}% q/q")
288
+ pts.append(f"财报信号: {signal}" if zh else f"earnings signal: {signal}")
284
289
  return pts[:5]
285
290
 
286
291
 
287
- def _template_analysis(symbol: str, earnings: Dict, most_recent: Dict, summary: str) -> str:
292
+ def _template_analysis(symbol: str, earnings: Dict, most_recent: Dict, summary: str, lang: str = "zh") -> str:
288
293
  sup = most_recent.get("pct_surprise")
289
294
  if sup is not None:
290
295
  if sup >= 10: verdict = "STRONG_BEAT"
@@ -295,6 +300,13 @@ def _template_analysis(symbol: str, earnings: Dict, most_recent: Dict, summary:
295
300
  else:
296
301
  verdict = "IN_LINE"
297
302
 
303
+ if not str(lang).lower().startswith("zh"):
304
+ return (
305
+ f"{symbol} earnings (template):\n"
306
+ f"First read: {summary}\n"
307
+ f"Rating: {verdict}\n"
308
+ f"Suggested signal: {'BUY' if 'BEAT' in verdict else ('SELL' if 'MISS' in verdict else 'HOLD')}"
309
+ )
298
310
  return (
299
311
  f"{symbol} 财报解读(模板):\n"
300
312
  f"初步判断:{summary}\n"
@@ -109,7 +109,7 @@ class FundamentalAgent(BaseAgent):
109
109
 
110
110
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=500, quote=quote)
111
111
  if not analysis:
112
- analysis = _template_fundamental(symbol, pe, pb, roe, rev_g)
112
+ analysis = _template_fundamental(symbol, pe, pb, roe, rev_g, lang=self.lang)
113
113
 
114
114
  signal = _extract_signal(analysis, pe or 0)
115
115
  confidence = _calc_confidence(pe or 0, pb or 0, roe or 0)
@@ -173,7 +173,23 @@ def _extract_key_points(text: str) -> List[str]:
173
173
 
174
174
 
175
175
  def _template_fundamental(symbol: str, pe: Optional[float], pb: Optional[float],
176
- roe: Optional[float], rev_g: Optional[float]) -> str:
176
+ roe: Optional[float], rev_g: Optional[float], lang: str = "zh") -> str:
177
+ if not str(lang).lower().startswith("zh"):
178
+ if not pe or pe <= 0:
179
+ valuation, conclusion = "not enough data", "DATA_LIMITED"
180
+ elif pe < 15:
181
+ valuation, conclusion = "undervalued", "UNDERVALUED"
182
+ elif pe > 40:
183
+ valuation, conclusion = "overvalued", "OVERVALUED"
184
+ else:
185
+ valuation, conclusion = "fairly valued", "FAIRLY_VALUED"
186
+ return (
187
+ f"{symbol} fundamentals (template):\n"
188
+ f"• Valuation: PE={_fmt_num(pe, 1, 'x')} PB={_fmt_num(pb, 2, 'x')} → {valuation}\n"
189
+ f"• Profitability: ROE={_fmt_num(roe, 1, '%')} revenue growth={_fmt_num(rev_g, 1, '%')}\n"
190
+ "• Missing figures are not zeros; check against the filings and peers\n"
191
+ f"• Conclusion: {conclusion}"
192
+ )
177
193
  if not pe or pe <= 0:
178
194
  valuation, conclusion = "数据不足", "DATA_LIMITED"
179
195
  elif pe < 15:
@@ -54,7 +54,7 @@ class MacroAgent(BaseAgent):
54
54
 
55
55
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=500, quote=quote)
56
56
  if not analysis:
57
- analysis = _template_macro(symbol, indices)
57
+ analysis = _template_macro(symbol, indices, lang=self.lang)
58
58
 
59
59
  signal = _extract_signal(analysis)
60
60
  key_points = _extract_key_points(analysis)
@@ -85,15 +85,27 @@ def _extract_key_points(text: str) -> List[str]:
85
85
 
86
86
  _IDX_NAMES = {"000001": "上证", "399006": "创业板"}
87
87
 
88
- def _template_macro(symbol: str, indices: Dict) -> str:
89
- idx_str = "、".join(
90
- f"{_IDX_NAMES.get(k, k)} {v.get('change_pct', 0):+.2f}%"
88
+ def _template_macro(symbol: str, indices: Dict, lang: str = "zh") -> str:
89
+ """Without a model: the index moves, and nothing claimed beyond them.
90
+
91
+ This stated "当前货币政策偏宽松,流动性充裕" (policy loose, liquidity
92
+ ample) as fact — a macro view with no data behind it.
93
+ """
94
+ zh = str(lang).lower().startswith("zh")
95
+ idx_str = ("、" if zh else ", ").join(
96
+ f"{_IDX_NAMES.get(k, k) if zh else k} {v.get('change_pct', 0):+.2f}%"
91
97
  for k, v in indices.items()
92
- ) if indices else "指数数据不可用"
98
+ ) if indices else ("指数数据不可用" if zh else "index data unavailable")
99
+ if not zh:
100
+ return (
101
+ f"{symbol} macro (template):\n"
102
+ f"• Market indices: {idx_str}\n"
103
+ "• Policy and liquidity were not assessed (no model analysis)\n"
104
+ "• Conclusion: NEUTRAL"
105
+ )
93
106
  return (
94
107
  f"{symbol} 宏观分析(模板):\n"
95
108
  f"• 市场指数: {idx_str}\n"
96
- "• 当前货币政策偏宽松,流动性充裕\n"
97
- "• 建议关注政策面变化和外资动向\n"
109
+ "• 未评估货币政策与流动性(无模型分析)\n"
98
110
  "• 结论: NEUTRAL"
99
111
  )
@@ -90,9 +90,10 @@ class NewsAgent(BaseAgent):
90
90
  if not news:
91
91
  return AgentResult(
92
92
  agent=self.name, symbol=symbol,
93
- analysis=f"{symbol}: 未获取到近期新闻数据。",
93
+ analysis=(f"{symbol}: 未获取到近期新闻数据。" if str(self.lang).startswith("zh")
94
+ else f"{symbol}: no recent news."),
94
95
  confidence=0.3, signal="HOLD",
95
- key_points=["无近期新闻数据"],
96
+ key_points=["无近期新闻数据" if str(self.lang).startswith("zh") else "no recent news"],
96
97
  )
97
98
 
98
99
  events = _classify_events(news)
@@ -110,11 +111,11 @@ class NewsAgent(BaseAgent):
110
111
 
111
112
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=500)
112
113
  if not analysis:
113
- analysis = _template_analysis(symbol, news, events)
114
+ analysis = _template_analysis(symbol, news, events, lang=self.lang)
114
115
 
115
116
  signal = _extract_signal(analysis, events)
116
117
  confidence = _estimate_confidence(news, events)
117
- key_points = _build_key_points(news, events)
118
+ key_points = _build_key_points(news, events, lang=self.lang)
118
119
 
119
120
  return AgentResult(
120
121
  agent=self.name, symbol=symbol,
@@ -170,12 +171,21 @@ def _estimate_confidence(news: List[Dict], events: Dict[str, int]) -> float:
170
171
  return min(round(base, 2), 0.75)
171
172
 
172
173
 
173
- def _build_key_points(news: List[Dict], events: Dict[str, int]) -> List[str]:
174
+ _EVENT_EN = {"earnings": "earnings-related", "upgrade": "analyst upgrades", "downgrade": "analyst downgrades",
175
+ "insider": "insider trades", "regulatory": "regulatory events", "dividend": "dividend news",
176
+ "merger": "M&A news"}
177
+
178
+
179
+ def _build_key_points(news: List[Dict], events: Dict[str, int], lang: str = "zh") -> List[str]:
180
+ zh = str(lang).lower().startswith("zh")
174
181
  points = []
175
182
  recent = [n for n in news if n.get("age_days", 999) <= 3]
176
183
  if recent:
177
- points.append(f"近3日 {len(recent)} 条新鲜新闻")
184
+ points.append(f"近3日 {len(recent)} 条新鲜新闻" if zh else f"{len(recent)} stories in the last 3 days")
178
185
  for etype, count in events.items():
186
+ if not zh:
187
+ points.append(f"{_EVENT_EN.get(etype, etype)} × {count}")
188
+ continue
179
189
  label = {
180
190
  "earnings": "业绩/财报相关",
181
191
  "upgrade": "分析师升级评级",
@@ -189,8 +199,22 @@ def _build_key_points(news: List[Dict], events: Dict[str, int]) -> List[str]:
189
199
  return points[:5]
190
200
 
191
201
 
192
- def _template_analysis(symbol: str, news: List[Dict], events: Dict[str, int]) -> str:
202
+ def _template_analysis(symbol: str, news: List[Dict], events: Dict[str, int], lang: str = "zh") -> str:
193
203
  recent = [n for n in news if n.get("age_days", 999) <= 7]
204
+ if not str(lang).lower().startswith("zh"):
205
+ tone = "neutral"
206
+ if events.get("upgrade", 0) > events.get("downgrade", 0):
207
+ tone = "positive"
208
+ elif events.get("downgrade", 0) > 0 or events.get("regulatory", 0) > 0:
209
+ tone = "negative"
210
+ titles = "\n".join(f" • {n['title'][:60]}" for n in recent[:3])
211
+ return (
212
+ f"{symbol} recent news tone: {tone}\n"
213
+ f"{len(recent)} related stories in the last 7 days\n"
214
+ f"Headlines:\n{titles or ' (no recent headlines)'}\n"
215
+ f"Events: {', '.join(events.keys()) or 'none'}\n"
216
+ f"Conclusion: {tone.upper() if tone != 'neutral' else 'NEUTRAL'}"
217
+ )
194
218
  sentiment = "中性"
195
219
  if events.get("upgrade", 0) > events.get("downgrade", 0):
196
220
  sentiment = "偏正面"
@@ -94,15 +94,16 @@ class RiskAgent(BaseAgent):
94
94
 
95
95
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=400, quote=quote)
96
96
  if not analysis:
97
- analysis = _template_risk(symbol, metrics)
97
+ analysis = _template_risk(symbol, metrics, lang=self.lang)
98
98
 
99
99
  signal = _risk_to_signal(metrics)
100
100
  confidence = 0.70
101
+ zh = str(self.lang).lower().startswith("zh")
101
102
  key_points = [
102
- f"年化波动率 {metrics.get('ann_vol',0):.1f}%",
103
- f"最大回撤 {metrics.get('max_dd',0):.1f}%",
104
- f"夏普比率 {metrics.get('sharpe',0):.2f}",
105
- ] if metrics else ["风险数据不可用"]
103
+ f"年化波动率 {metrics.get('ann_vol',0):.1f}%" if zh else f"annualised volatility {metrics.get('ann_vol',0):.1f}%",
104
+ f"最大回撤 {metrics.get('max_dd',0):.1f}%" if zh else f"max drawdown {metrics.get('max_dd',0):.1f}%",
105
+ f"夏普比率 {metrics.get('sharpe',0):.2f}" if zh else f"Sharpe ratio {metrics.get('sharpe',0):.2f}",
106
+ ] if metrics else ["风险数据不可用" if zh else "risk data unavailable"]
106
107
 
107
108
  return AgentResult(
108
109
  agent=self.name, symbol=symbol,
@@ -151,9 +152,19 @@ def _risk_to_signal(metrics: Dict) -> str:
151
152
  return "HOLD"
152
153
 
153
154
 
154
- def _template_risk(symbol: str, m: Dict) -> str:
155
+ def _template_risk(symbol: str, m: Dict, lang: str = "zh") -> str:
155
156
  vol = m.get("ann_vol", 0)
156
157
  dd = m.get("max_dd", 0)
158
+ if not str(lang).lower().startswith("zh"):
159
+ level = "high" if vol > 40 else ("medium" if vol > 20 else "low")
160
+ return (
161
+ f"{symbol} risk (template):\n"
162
+ f"• Annualised volatility: {vol:.1f}% (risk {level})\n"
163
+ f"• Max drawdown: {dd:.1f}%\n"
164
+ f"• Sharpe ratio: {m.get('sharpe',0):.2f}\n"
165
+ f"• Suggested position: {'5-10%' if vol>40 else '10-15%' if vol>20 else '15-20%'}\n"
166
+ f"• Risk Score: {min(10, int(vol/5))}/10"
167
+ )
157
168
  risk_level = "高" if vol > 40 else ("中" if vol > 20 else "低")
158
169
  return (
159
170
  f"{symbol} 风险分析(模板):\n"
@@ -58,11 +58,11 @@ class TechnicalAgent(BaseAgent):
58
58
 
59
59
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=600, quote=quote)
60
60
  if not analysis:
61
- analysis = _template_analysis(symbol, price, history)
61
+ analysis = _template_analysis(symbol, price, history, lang=self.lang)
62
62
 
63
63
  signal = _extract_signal(analysis, history)
64
64
  confidence = history.get("signal_strength", 0.5)
65
- key_points = _extract_key_points(history, price)
65
+ key_points = _extract_key_points(history, price, lang=self.lang)
66
66
 
67
67
  return AgentResult(
68
68
  agent=self.name, symbol=symbol,
@@ -218,35 +218,54 @@ def _extract_signal(analysis: str, history: Dict) -> str:
218
218
  return "HOLD"
219
219
 
220
220
 
221
- def _extract_key_points(history: Dict, price: float) -> List[str]:
221
+ # Pattern values stay as _detect_simple_pattern returns them; this is how
222
+ # they read in English.
223
+ _PATTERN_EN = {"锤子线": "hammer", "阳线吞噬": "bullish engulfing", "十字星": "doji", "数据不足": "not enough data"}
224
+
225
+
226
+ def _extract_key_points(history: Dict, price: float, lang: str = "zh") -> List[str]:
227
+ """The analyst's one-line findings, in the team's language.
228
+
229
+ They were Chinese only, so an English /team listed "距MA20 -0.5%" and
230
+ "MACD死叉,空头压力" under "Technical".
231
+ """
232
+ zh = str(lang).lower().startswith("zh")
222
233
  points = []
223
234
  rsi = history.get("rsi", 50)
224
235
  ma20 = history.get("ma20", 0)
225
- ma60 = history.get("ma60", 0)
226
236
  if rsi < 35:
227
- points.append(f"RSI超卖({rsi:.0f}),有反弹机会")
237
+ points.append(f"RSI超卖({rsi:.0f}),有反弹机会" if zh else f"RSI oversold ({rsi:.0f}), room to rebound")
228
238
  elif rsi > 70:
229
- points.append(f"RSI超买({rsi:.0f}),注意回调风险")
239
+ points.append(f"RSI超买({rsi:.0f}),注意回调风险" if zh else f"RSI overbought ({rsi:.0f}), pullback risk")
230
240
  if ma20 > 0:
231
241
  diff_pct = (price - ma20) / ma20 * 100
232
- points.append(f"距MA20 {diff_pct:+.1f}%")
242
+ points.append(f"距MA20 {diff_pct:+.1f}%" if zh else f"{diff_pct:+.1f}% vs MA20")
233
243
  macd = history.get("macd", 0)
234
244
  sig = history.get("macd_signal", 0)
235
245
  if macd > sig and history.get("macd_hist", 0) > 0:
236
- points.append("MACD金叉,多头动能")
246
+ points.append("MACD金叉,多头动能" if zh else "MACD bullish crossover")
237
247
  elif macd < sig:
238
- points.append("MACD死叉,空头压力")
248
+ points.append("MACD死叉,空头压力" if zh else "MACD bearish crossover")
239
249
  pattern = history.get("pattern", "")
240
250
  if pattern and pattern != "无特殊形态":
241
- points.append(f"K线形态: {pattern}")
251
+ points.append(f"K线形态: {pattern}" if zh else f"Candle pattern: {_PATTERN_EN.get(pattern, pattern)}")
242
252
  return points
243
253
 
244
254
 
245
- def _template_analysis(symbol: str, price: float, history: Dict) -> str:
255
+ def _template_analysis(symbol: str, price: float, history: Dict, lang: str = "zh") -> str:
246
256
  rsi = history.get("rsi", 50)
247
257
  ma20 = history.get("ma20", 0)
248
258
  macd = history.get("macd", 0)
249
259
  sig = history.get("macd_signal", 0)
260
+ if not str(lang).lower().startswith("zh"):
261
+ up, bull = price > ma20, macd > sig
262
+ return (
263
+ f"{symbol} technicals (template):\n"
264
+ f"• Price {price}, {'uptrend' if up else 'downtrend'} (MA20={ma20:.2f})\n"
265
+ f"• RSI={rsi:.0f}, {'oversold' if rsi < 35 else 'overbought' if rsi > 70 else 'normal range'}\n"
266
+ f"• MACD momentum {'bullish' if bull else 'bearish'}\n"
267
+ f"• Overall {'BULLISH' if bull and up else 'NEUTRAL'}"
268
+ )
250
269
  trend = "上升趋势" if price > ma20 else "下降趋势"
251
270
  momentum = "偏多" if macd > sig else "偏空"
252
271
  return (
@@ -176,20 +176,24 @@ class PortfolioAgent(BaseAgent):
176
176
  async def analyze_portfolio(
177
177
  self, symbols: List[str], data: Dict[str, Any]
178
178
  ) -> AgentResult:
179
+ zh = self.lang != "en"
179
180
  if len(symbols) < 2:
180
181
  return AgentResult(
181
182
  agent=self.name, symbol=",".join(symbols),
182
- analysis="组合分析需要至少 2 个标的。",
183
+ analysis=("组合分析需要至少 2 个标的。" if zh
184
+ else "A portfolio analysis needs at least 2 symbols."),
183
185
  confidence=0.0, signal="HOLD",
184
- key_points=["标的数量不足"],
186
+ key_points=["标的数量不足" if zh else "Not enough symbols"],
185
187
  )
186
188
 
187
189
  if data.get("error") == "insufficient_data":
188
190
  return AgentResult(
189
191
  agent=self.name, symbol=",".join(symbols),
190
- analysis="无法获取足够的历史价格数据进行组合分析。",
192
+ analysis=("无法获取足够的历史价格数据进行组合分析。" if zh
193
+ else "Not enough price history could be fetched to analyse the portfolio."),
191
194
  confidence=0.3, signal="HOLD",
192
- key_points=["历史数据不足(需要 >20 个交易日)"],
195
+ key_points=["历史数据不足(需要 >20 个交易日)" if zh
196
+ else "Not enough history (needs more than 20 trading days)"],
193
197
  )
194
198
 
195
199
  valid_syms = data.get("valid_symbols", symbols)
@@ -210,12 +214,12 @@ class PortfolioAgent(BaseAgent):
210
214
 
211
215
  analysis = await self._call_llm(self._SYSTEM, prompt, max_tokens=650)
212
216
  if not analysis:
213
- analysis = _template_analysis(valid_syms, data)
217
+ analysis = _template_analysis(valid_syms, data, self.lang)
214
218
 
215
219
  verdict = _extract_verdict(analysis)
216
220
  signal = _verdict_to_signal(verdict)
217
221
  confidence = _estimate_confidence(data)
218
- key_points = _build_key_points(data, verdict)
222
+ key_points = _build_key_points(data, verdict, self.lang)
219
223
 
220
224
  return AgentResult(
221
225
  agent=self.name,
@@ -225,6 +229,9 @@ class PortfolioAgent(BaseAgent):
225
229
  signal=signal,
226
230
  key_points=key_points,
227
231
  data_used={
232
+ # The verdict itself: the signal maps NEEDS_ATTENTION to SELL,
233
+ # and a banner built from the signal said HIGH_RISK.
234
+ "verdict": verdict,
228
235
  "n": len(valid_syms),
229
236
  "port_vol_ann": data.get("port_vol_ann"),
230
237
  "div_ratio": data.get("div_ratio"),
@@ -312,35 +319,45 @@ def _estimate_confidence(d: Dict) -> float:
312
319
  return min(round(base, 2), 0.75)
313
320
 
314
321
 
315
- def _build_key_points(d: Dict, verdict: str) -> List[str]:
322
+ def _build_key_points(d: Dict, verdict: str, lang: str = "zh") -> List[str]:
323
+ zh = lang != "en"
316
324
  pts = []
317
325
  n = len(d.get("valid_symbols", []))
318
326
  if d.get("weight_source") == "ledger":
319
- pts.append(f"{n} 个标的,按真实持仓成本加权")
327
+ pts.append(f"{n} 个标的,按真实持仓成本加权" if zh
328
+ else f"{n} symbols, weighted by the cost of your real positions")
320
329
  else:
321
- pts.append(f"{n} 个标的,等权配置(无真实持仓数据,非实际风险暴露)")
330
+ pts.append(f"{n} 个标的,等权配置(无真实持仓数据,非实际风险暴露)" if zh
331
+ else f"{n} symbols, equal weight (no real positions recorded, so not your actual exposure)")
322
332
 
323
333
  port_vol = d.get("port_vol_ann", 0)
324
334
  if port_vol:
325
- risk_lv = "高风险" if port_vol > 0.30 else ("中等" if port_vol > 0.18 else "低风险")
326
- pts.append(f"组合年化波动 {port_vol*100:.1f}%({risk_lv})")
335
+ if zh:
336
+ risk_lv = "高风险" if port_vol > 0.30 else ("中等" if port_vol > 0.18 else "低风险")
337
+ pts.append(f"组合年化波动 {port_vol*100:.1f}%({risk_lv})")
338
+ else:
339
+ risk_lv = "high" if port_vol > 0.30 else ("medium" if port_vol > 0.18 else "low")
340
+ pts.append(f"Annualised portfolio volatility {port_vol*100:.1f}% ({risk_lv})")
327
341
 
328
342
  div_r = d.get("div_ratio", 1)
329
343
  if div_r < 1.1:
330
- pts.append(f"分散度不足(ratio {div_r:.2f}x,标的相关性高)")
344
+ pts.append(f"分散度不足(ratio {div_r:.2f}x,标的相关性高)" if zh
345
+ else f"Poorly diversified (ratio {div_r:.2f}x, the symbols move together)")
331
346
  else:
332
- pts.append(f"分散度合理(ratio {div_r:.2f}x)")
347
+ pts.append(f"分散度合理(ratio {div_r:.2f}x)" if zh
348
+ else f"Reasonably diversified (ratio {div_r:.2f}x)")
333
349
 
334
350
  high_corr = d.get("high_corr", [])
335
351
  if high_corr:
336
352
  top = high_corr[0]
337
- pts.append(f"最高相关对: {top['sym1']}↔{top['sym2']} ({top['corr']:+.2f})")
353
+ pts.append(f"{'最高相关对' if zh else 'Most correlated pair'}: "
354
+ f"{top['sym1']}↔{top['sym2']} ({top['corr']:+.2f})")
338
355
 
339
- pts.append(f"整体评级: {verdict}")
356
+ pts.append(f"{'整体评级' if zh else 'Overall'}: {verdict}")
340
357
  return pts[:6]
341
358
 
342
359
 
343
- def _template_analysis(symbols: List[str], d: Dict) -> str:
360
+ def _template_analysis(symbols: List[str], d: Dict, lang: str = "zh") -> str:
344
361
  high_corr = d.get("high_corr", [])
345
362
  port_vol = d.get("port_vol_ann", 0)
346
363
  div_r = d.get("div_ratio", 1)
@@ -351,6 +368,18 @@ def _template_analysis(symbols: List[str], d: Dict) -> str:
351
368
  elif len(high_corr) >= 3 or port_vol > 0.30:
352
369
  verdict = "HIGH_RISK"
353
370
 
371
+ if lang == "en":
372
+ lines = [f"{','.join(symbols)} portfolio report (template)"]
373
+ lines.append(f"Annualised volatility: {port_vol*100:.1f}%")
374
+ lines.append(f"Diversification ratio: {div_r:.2f}x")
375
+ if high_corr:
376
+ lines.append(f"{len(high_corr)} highly correlated pairs, the highest "
377
+ f"{high_corr[0]['sym1']}↔{high_corr[0]['sym2']} {high_corr[0]['corr']:+.2f}")
378
+ else:
379
+ lines.append("No highly correlated pairs.")
380
+ lines.append(f"\n{verdict}")
381
+ return "\n".join(lines)
382
+
354
383
  lines = [f"{','.join(symbols)} 组合分析报告(模板)"]
355
384
  lines.append(f"年化波动率: {port_vol*100:.1f}%")
356
385
  lines.append(f"分散度系数: {div_r:.2f}x")
@@ -30,9 +30,19 @@ _BUILTIN: Dict[str, Type[BaseAgent]] = {
30
30
  }
31
31
 
32
32
  # 尝试加载其他内置 agent(文件存在则注册)
33
+ # The package this module was loaded as: "aria_code.agents", or "agents" when the
34
+ # CLI's bare import root is in use. The built-ins were imported by the fixed
35
+ # name "aria_code.agents.…" — a second copy of the package under the other
36
+ # root, whose classes subclass a different BaseAgent. issubclass() then said
37
+ # no and they were dropped without a word: /team announced four analysts and
38
+ # only "technical" (imported relatively, above) ever ran.
39
+ _PACKAGE = __package__ or "aria_code.agents"
40
+
41
+
33
42
  def _try_import_builtin(module_path: str, name: str) -> None:
43
+ if module_path.startswith("aria_code.agents."):
44
+ module_path = _PACKAGE + module_path[len("aria_code.agents"):]
34
45
  try:
35
- parts = module_path.split(".")
36
46
  mod = importlib.import_module(module_path)
37
47
  for _, cls in inspect.getmembers(mod, inspect.isclass):
38
48
  if issubclass(cls, BaseAgent) and cls is not BaseAgent:
@@ -316,6 +316,7 @@ class AgentTeam:
316
316
  llm_provider=self.llm,
317
317
  data_router=self.data,
318
318
  on_token=self.on_token,
319
+ lang=self.lang, # without it the agent answered in Chinese for an English /team
319
320
  )
320
321
  synth_data = {
321
322
  "agent_results": [r.to_dict() for r in results],
@@ -332,11 +333,11 @@ class AgentTeam:
332
333
  synthesis_text = synth_result.analysis
333
334
  except Exception as e:
334
335
  logger.warning(f"[synthesis] 失败: {e}")
335
- synthesis_text = _template_synthesis(results, self.signal_scheme)
336
+ synthesis_text = _template_synthesis(results, self.signal_scheme, lang=self.lang)
336
337
  else:
337
- synthesis_text = _template_synthesis(results, self.signal_scheme)
338
+ synthesis_text = _template_synthesis(results, self.signal_scheme, lang=self.lang)
338
339
  else:
339
- synthesis_text = _template_synthesis(results, self.signal_scheme)
340
+ synthesis_text = _template_synthesis(results, self.signal_scheme, lang=self.lang)
340
341
 
341
342
  return TeamResult(
342
343
  symbol = symbol,
@@ -386,7 +387,7 @@ class AgentTeam:
386
387
 
387
388
  # 执行最终的信号表决与综合
388
389
  final_signal, confidence = self.signal_scheme.vote(results)
389
- synthesis_text = _template_synthesis(results, self.signal_scheme)
390
+ synthesis_text = _template_synthesis(results, self.signal_scheme, lang=self.lang)
390
391
 
391
392
  return TeamResult(
392
393
  symbol = symbol,
@@ -468,25 +469,32 @@ def _vote_signal(results: List[AgentResult], scheme: SignalScheme = FINANCIAL_SC
468
469
  return scheme.vote(results)
469
470
 
470
471
 
471
- def _template_synthesis(results: List[AgentResult], scheme: SignalScheme = FINANCIAL_SCHEME) -> str:
472
- """无 synthesis agent 时的模板汇总"""
472
+ def _template_synthesis(results: List[AgentResult], scheme: SignalScheme = FINANCIAL_SCHEME,
473
+ lang: str = "zh") -> str:
474
+ """无 synthesis agent 时的模板汇总 — the summary when no model wrote one, in the team's language."""
475
+ zh = str(lang).lower().startswith("zh")
476
+ T = (lambda a, b: a) if zh else (lambda a, b: b)
473
477
  if not results:
474
- return "分析完成,无结果。"
475
- lines = ["## 团队分析汇总\n"]
478
+ return T("分析完成,无结果。", "Analysis finished with no results.")
479
+ lines = [T("## 团队分析汇总\n", "## Team summary\n")]
476
480
  failed_count = sum(1 for r in results if not r.success)
477
481
  if failed_count:
478
- lines.append(f"> ⚠️ {failed_count}/{len(results)} 个 agent 未能完成分析"
479
- f"(超时或 LLM 不可用),以下结论仅基于成功的 agent。\n")
482
+ lines.append(T(f"> ⚠️ {failed_count}/{len(results)} 个 agent 未能完成分析"
483
+ f"(超时或 LLM 不可用),以下结论仅基于成功的 agent。\n",
484
+ f"> ⚠️ {failed_count} of {len(results)} analysts did not finish (timeout or no model); "
485
+ "the conclusion uses only the ones that did.\n"))
480
486
  for r in results:
481
487
  if r.success:
482
- lines.append(f"**{r.agent.upper()}** ({r.signal}, 置信度 {r.confidence:.0%})")
488
+ lines.append(f"**{r.agent.upper()}** ({r.signal}, {T('置信度', 'confidence')} {r.confidence:.0%})")
483
489
  for pt in (r.key_points or [])[:3]:
484
490
  lines.append(f" • {pt}")
485
491
  else:
486
- err_label = "超时" if r.error == "timeout" else (r.error or "分析失败")
492
+ err_label = T("超时", "timed out") if r.error == "timeout" else (r.error or T("分析失败", "failed"))
487
493
  lines.append(f"**{r.agent.upper()}** ⚠️ {err_label}")
488
494
  signal, conf = scheme.vote(results)
489
- lines.append(f"\n**综合结论**: {signal}(置信度 {conf:.0%})")
495
+ lines.append(f"\n**{T('综合结论', 'Conclusion')}**: {signal}({T('置信度', 'confidence')} {conf:.0%})"
496
+ if zh else f"\n**Conclusion**: {signal} (confidence {conf:.0%})")
490
497
  if failed_count == len(results):
491
- lines.append("\n> ⚠️ 所有 agent 均未成功,此结论仅为默认值,不具参考意义。请确认 LLM 服务正常后重试。")
498
+ lines.append(T("\n> ⚠️ 所有 agent 均未成功,此结论仅为默认值,不具参考意义。请确认 LLM 服务正常后重试。",
499
+ "\n> ⚠️ No analyst succeeded; this is a default, not a conclusion. Check the model and retry."))
492
500
  return "\n".join(lines)