aria-code 0.90.0__tar.gz → 0.91.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 (753) hide show
  1. {aria_code-0.90.0/src/aria_code.egg-info → aria_code-0.91.0}/PKG-INFO +1 -1
  2. {aria_code-0.90.0 → aria_code-0.91.0}/pyproject.toml +1 -1
  3. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/base.py +6 -0
  5. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/earnings.py +22 -10
  6. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/fundamental.py +18 -2
  7. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/macro.py +19 -7
  8. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/news.py +31 -7
  9. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/risk.py +17 -6
  10. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/technical.py +30 -11
  11. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/registry.py +11 -1
  12. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/team.py +22 -14
  13. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +39 -20
  14. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/team.py +61 -7
  15. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/runtime_consumer.py +15 -5
  16. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/render/team.py +18 -10
  17. {aria_code-0.90.0 → aria_code-0.91.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  18. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code.egg-info/SOURCES.txt +2 -0
  19. aria_code-0.91.0/tests/test_agent_key_points_language.py +68 -0
  20. aria_code-0.91.0/tests/test_team_analysts.py +98 -0
  21. {aria_code-0.90.0 → aria_code-0.91.0}/LICENSE +0 -0
  22. {aria_code-0.90.0 → aria_code-0.91.0}/NOTICE +0 -0
  23. {aria_code-0.90.0 → aria_code-0.91.0}/README.md +0 -0
  24. {aria_code-0.90.0 → aria_code-0.91.0}/setup.cfg +0 -0
  25. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/__init__.py +0 -0
  26. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/adk_apps/__init__.py +0 -0
  27. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  28. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  29. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  30. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  31. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/__init__.py +0 -0
  32. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/code_review.py +0 -0
  33. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/__init__.py +0 -0
  34. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  35. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/critic.py +0 -0
  36. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/deepen.py +0 -0
  37. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/models.py +0 -0
  38. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  39. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  40. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/themes.py +0 -0
  41. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/deep/tiers.py +0 -0
  42. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  43. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/engineering/coder.py +0 -0
  44. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/engineering/tester.py +0 -0
  45. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/__init__.py +0 -0
  46. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  47. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  48. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  49. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/debate.py +0 -0
  50. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/sector.py +0 -0
  51. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/strategist.py +0 -0
  52. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  53. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  54. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/orchestrator.py +0 -0
  55. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  56. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/__init__.py +0 -0
  57. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  58. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/business_match.py +0 -0
  59. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  60. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  61. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  62. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  63. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  64. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  65. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  66. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/signal_scheme.py +0 -0
  67. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/sports/__init__.py +0 -0
  68. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  69. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/supervisor.py +0 -0
  70. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  71. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  72. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  73. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  74. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  75. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  76. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  77. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  78. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  79. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  80. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  81. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aliyun_data_client.py +0 -0
  82. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/README.md +0 -0
  83. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/__init__.py +0 -0
  84. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/README.md +0 -0
  85. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/__init__.py +0 -0
  86. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/approvals.py +0 -0
  87. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/conversation.py +0 -0
  88. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/digest.py +0 -0
  89. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/intake.py +0 -0
  90. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/registry.py +0 -0
  91. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  92. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/README.md +0 -0
  93. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/__init__.py +0 -0
  94. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/_optional.py +0 -0
  95. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  96. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  97. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  98. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  99. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  100. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  101. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  102. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  103. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  104. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  105. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  106. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  107. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  108. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  109. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  110. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  111. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  112. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  113. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  114. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  115. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  116. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  117. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  118. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  119. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  120. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  121. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  122. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  123. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  124. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  125. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  126. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  127. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  128. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  129. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  130. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  131. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  132. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  133. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  134. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/config_store.py +0 -0
  135. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/constants.py +0 -0
  136. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/context.py +0 -0
  137. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  138. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/direct.py +0 -0
  139. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  140. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  141. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  142. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/google_login.py +0 -0
  143. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  144. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  145. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  146. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  147. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  148. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  149. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  150. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/helpers.py +0 -0
  151. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/hooks.py +0 -0
  152. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/i18n.py +0 -0
  153. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/intent.py +0 -0
  154. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  155. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  156. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  157. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  158. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/main.py +0 -0
  159. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  160. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  161. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  162. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  163. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  164. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  165. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  166. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  167. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  168. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/preflight.py +0 -0
  169. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  170. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  171. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  172. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  173. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  174. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  175. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  176. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  177. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  178. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  179. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  180. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  181. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  182. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  183. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  184. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  185. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  186. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  187. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  188. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  189. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  190. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  191. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/session_export.py +0 -0
  192. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  193. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/session_store.py +0 -0
  194. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  195. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  196. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  197. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  198. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  199. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  200. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  201. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  202. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  203. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  204. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  205. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  206. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  207. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  208. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/update_check.py +0 -0
  209. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/updater.py +0 -0
  210. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  211. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  212. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/daemon/README.md +0 -0
  213. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/vscode/README.md +0 -0
  214. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/apps/vscode/package.json +0 -0
  215. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_cli.py +0 -0
  216. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_daemon.py +0 -0
  217. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_feishu_bot.py +0 -0
  218. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_mcp_server.py +0 -0
  219. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_relay_client.py +0 -0
  220. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_relay_server.py +0 -0
  221. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/aria_telegram_bot.py +0 -0
  222. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ariarc.py +0 -0
  223. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/artifacts.py +0 -0
  224. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/backtest_engine.py +0 -0
  225. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/backtest_report.py +0 -0
  226. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/__init__.py +0 -0
  227. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/automation.py +0 -0
  228. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/base.py +0 -0
  229. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/capabilities.py +0 -0
  230. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  231. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  232. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  233. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  234. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  235. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  236. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/config.py +0 -0
  237. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  238. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  239. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  240. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  241. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  242. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/paper_broker.py +0 -0
  243. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/planning.py +0 -0
  244. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/registry.py +0 -0
  245. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/brokers/trading.py +0 -0
  246. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/canva_client.py +0 -0
  247. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/change_store.py +0 -0
  248. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/__init__.py +0 -0
  249. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  250. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  251. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/canva_client.py +0 -0
  252. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/figma_client.py +0 -0
  253. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/football_data_client.py +0 -0
  254. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/kling_video_client.py +0 -0
  255. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/market_data_client.py +0 -0
  256. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/openai_image_client.py +0 -0
  257. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/runway_video_client.py +0 -0
  258. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  259. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/cloud_memory.py +0 -0
  260. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/command_safety.py +0 -0
  261. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/computer_use_tools.py +0 -0
  262. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/dashboard_generator.py +0 -0
  263. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/data_analysis_tools.py +0 -0
  264. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/data_cleaner.py +0 -0
  265. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/data_service.py +0 -0
  266. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/__init__.py +0 -0
  267. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/base.py +0 -0
  268. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/router.py +0 -0
  269. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  270. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  271. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  272. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  273. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  274. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  275. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  276. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  277. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  278. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  279. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/demo_player.py +0 -0
  280. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/doctor.py +0 -0
  281. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/domain/__init__.py +0 -0
  282. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/domain/backtest_engine.py +0 -0
  283. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/domain/backtest_report.py +0 -0
  284. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/domain/finance_formulas.py +0 -0
  285. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  286. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/domain/strategy_vault.py +0 -0
  287. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/evals/__init__.py +0 -0
  288. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/evals/harness.py +0 -0
  289. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/evals/runner.py +0 -0
  290. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/external_agent_runner.py +0 -0
  291. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/figma_client.py +0 -0
  292. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/file_analysis_tools.py +0 -0
  293. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/finance_formulas.py +0 -0
  294. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/football_data_client.py +0 -0
  295. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/image_gen_tools.py +0 -0
  296. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/intent_classifier.py +0 -0
  297. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/kling_video_client.py +0 -0
  298. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/licensing.py +0 -0
  299. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/local_finance_tools.py +0 -0
  300. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/local_image_provider.py +0 -0
  301. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/local_llm_provider.py +0 -0
  302. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/macro_tools.py +0 -0
  303. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/markdown_pdf.py +0 -0
  304. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/market_data_client.py +0 -0
  305. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/mcp_client.py +0 -0
  306. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/memory_manager.py +0 -0
  307. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/model_capability.py +0 -0
  308. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/notification_tools.py +0 -0
  309. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/openai_image_client.py +0 -0
  310. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/__init__.py +0 -0
  311. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  312. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  313. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  314. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  315. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  316. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  317. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  318. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_core/export.py +0 -0
  319. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  320. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  321. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  322. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  323. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  324. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  325. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  326. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  327. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  328. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  329. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  330. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  331. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  332. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  333. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  334. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  335. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  336. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  337. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  338. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  339. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  340. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/context.py +0 -0
  341. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  342. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/data.py +0 -0
  343. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  344. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/references.py +0 -0
  345. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  346. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  347. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  348. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  349. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  350. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  351. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  352. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  353. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  354. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  355. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  356. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  357. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  358. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  359. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  360. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  361. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  362. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  363. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  364. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  365. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  366. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  367. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  368. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  369. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  370. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  371. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  372. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  373. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  374. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  375. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  376. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  377. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  378. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  379. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  380. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  381. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  382. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  383. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  384. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  385. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/__init__.py +0 -0
  386. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/base.py +0 -0
  387. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/finance/__init__.py +0 -0
  388. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  389. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/payments/__init__.py +0 -0
  390. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/realty/__init__.py +0 -0
  391. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/registry.py +0 -0
  392. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/packs/rules.py +0 -0
  393. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/plan_utils.py +0 -0
  394. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/plugin_loader.py +0 -0
  395. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/portfolio_ledger.py +0 -0
  396. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/preview_server.py +0 -0
  397. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/privacy/__init__.py +0 -0
  398. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/privacy/feedback.py +0 -0
  399. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/project_review.py +0 -0
  400. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/project_review_api.py +0 -0
  401. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/project_review_server.py +0 -0
  402. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/project_tools.py +0 -0
  403. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/__init__.py +0 -0
  404. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/__init__.py +0 -0
  405. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  406. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  407. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/base.py +0 -0
  408. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/custom.py +0 -0
  409. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/ollama.py +0 -0
  410. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  411. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/llm/registry.py +0 -0
  412. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/local_image_provider.py +0 -0
  413. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  414. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/providers/tool_messages.py +0 -0
  415. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/realty_data_tools.py +0 -0
  416. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/relay_store.py +0 -0
  417. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/report_exporters.py +0 -0
  418. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/report_generator.py +0 -0
  419. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/review_service.py +0 -0
  420. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/__init__.py +0 -0
  421. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/acceptance.py +0 -0
  422. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/agent_loop.py +0 -0
  423. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/approval.py +0 -0
  424. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/budget.py +0 -0
  425. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/checkpoints.py +0 -0
  426. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/crash_report.py +0 -0
  427. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/events.py +0 -0
  428. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/gateway.py +0 -0
  429. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/lsp.py +0 -0
  430. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/orchestrator.py +0 -0
  431. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/repo_map.py +0 -0
  432. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/run_state.py +0 -0
  433. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/run_store.py +0 -0
  434. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/self_healing.py +0 -0
  435. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/subagent.py +0 -0
  436. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/task_ledger.py +0 -0
  437. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  438. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/tool_executor.py +0 -0
  439. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/tool_policy.py +0 -0
  440. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runtime/worktrees.py +0 -0
  441. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/runway_video_client.py +0 -0
  442. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/safety/__init__.py +0 -0
  443. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/safety/permissions.py +0 -0
  444. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/safety/service.py +0 -0
  445. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/setup_wizard.py +0 -0
  446. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/spreadsheet_tools.py +0 -0
  447. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/strategy_vault.py +0 -0
  448. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/__init__.py +0 -0
  449. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/artifact_tools.py +0 -0
  450. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/broker_tools.py +0 -0
  451. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  452. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  453. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  454. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  455. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  456. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/extended_tools.py +0 -0
  457. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  458. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  459. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  460. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  461. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  462. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/logistics_io.py +0 -0
  463. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  464. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/logistics_tools.py +0 -0
  465. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/macro_tools.py +0 -0
  466. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/notification_tools.py +0 -0
  467. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/project_tools.py +0 -0
  468. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  469. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  470. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/tools/stripe_tools.py +0 -0
  471. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/__init__.py +0 -0
  472. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/banner.py +0 -0
  473. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/completer.py +0 -0
  474. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/console.py +0 -0
  475. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/image_render.py +0 -0
  476. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/input_box.py +0 -0
  477. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/mentions.py +0 -0
  478. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/picker.py +0 -0
  479. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/render/__init__.py +0 -0
  480. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/render/finance.py +0 -0
  481. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/render/market.py +0 -0
  482. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/render/output.py +0 -0
  483. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/render/responsive.py +0 -0
  484. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/robot.py +0 -0
  485. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  486. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/utils/vscode_uri.py +0 -0
  487. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/video_analysis.py +0 -0
  488. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/video_editor.py +0 -0
  489. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace/__init__.py +0 -0
  490. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace/files.py +0 -0
  491. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace/verify.py +0 -0
  492. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace_changes.py +0 -0
  493. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace_context.py +0 -0
  494. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace_service.py +0 -0
  495. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code/workspace_tools.py +0 -0
  496. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  497. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  498. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code.egg-info/requires.txt +0 -0
  499. {aria_code-0.90.0 → aria_code-0.91.0}/src/aria_code.egg-info/top_level.txt +0 -0
  500. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_adk_market_tools.py +0 -0
  501. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_agent_team_fallback.py +0 -0
  502. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_analyze_file_tool.py +0 -0
  503. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_architecture_ledger_is_true.py +0 -0
  504. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_architecture_report.py +0 -0
  505. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_aria_cli_core.py +0 -0
  506. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_aria_mcp_server.py +0 -0
  507. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_aria_sdk.py +0 -0
  508. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_artifact_publishing.py +0 -0
  509. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_artifacts_and_reports.py +0 -0
  510. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ashare_prediction_cmds.py +0 -0
  511. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_backtest_cmds.py +0 -0
  512. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_backtest_engine.py +0 -0
  513. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_backtest_report.py +0 -0
  514. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  515. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_broken_akshare_is_optional.py +0 -0
  516. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_broker_automation.py +0 -0
  517. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  518. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_broker_planning.py +0 -0
  519. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_broker_safety.py +0 -0
  520. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_broker_tools.py +0 -0
  521. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_budget.py +0 -0
  522. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_business_workflow_cmds.py +0 -0
  523. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_canva_client.py +0 -0
  524. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_canvas_cmds.py +0 -0
  525. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_card_approvals.py +0 -0
  526. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_channel_intake.py +0 -0
  527. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_channels.py +0 -0
  528. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_chart_handlers.py +0 -0
  529. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_chat_bots_fail_closed.py +0 -0
  530. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_chat_routing.py +0 -0
  531. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ci_security_workflow.py +0 -0
  532. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_app_split.py +0 -0
  533. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_bootstrap.py +0 -0
  534. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_config_store.py +0 -0
  535. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  536. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_runtime_consumer.py +0 -0
  537. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_tool_executor_module.py +0 -0
  538. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cli_updater.py +0 -0
  539. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_cloud_memory.py +0 -0
  540. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_code_audit_tools.py +0 -0
  541. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_code_review_agent.py +0 -0
  542. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_codegen_output.py +0 -0
  543. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_coder_tester_self_healing.py +0 -0
  544. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_coder_tool_safety.py +0 -0
  545. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_collaboration.py +0 -0
  546. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_command_loggers.py +0 -0
  547. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_command_safety.py +0 -0
  548. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_completions_builder.py +0 -0
  549. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_config_paths.py +0 -0
  550. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_configured_provider.py +0 -0
  551. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_container_entrypoint.py +0 -0
  552. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_container_entrypoints.py +0 -0
  553. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_context_checkpoints.py +0 -0
  554. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_context_references.py +0 -0
  555. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_context_service.py +0 -0
  556. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_conversation_core.py +0 -0
  557. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_crash_report.py +0 -0
  558. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_credential_file_permissions.py +0 -0
  559. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_custom_providers.py +0 -0
  560. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_daemon_gateway_config.py +0 -0
  561. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_dashboard_generator.py +0 -0
  562. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_data_service.py +0 -0
  563. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_data_service_imports.py +0 -0
  564. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_data_without_model.py +0 -0
  565. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_datasource_routing.py +0 -0
  566. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_deep_analysis.py +0 -0
  567. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_degrades_without_quant_engine.py +0 -0
  568. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  569. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_doctor.py +0 -0
  570. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  571. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_doctor_npm_scope.py +0 -0
  572. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_engine_boundary.py +0 -0
  573. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_enterprise_tool_honesty.py +0 -0
  574. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_env_switch_docs.py +0 -0
  575. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_evals_harness.py +0 -0
  576. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_event_import_roots.py +0 -0
  577. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_extended_tools.py +0 -0
  578. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_feishu_swarm_config.py +0 -0
  579. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_file_links.py +0 -0
  580. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_finalize_release.py +0 -0
  581. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_finance_renderers.py +0 -0
  582. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_finance_service_catalog.py +0 -0
  583. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_first_run_output.py +0 -0
  584. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_first_run_works.py +0 -0
  585. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_football_agent.py +0 -0
  586. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_football_prediction_output.py +0 -0
  587. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_google_cloud_models.py +0 -0
  588. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_google_cloud_routing.py +0 -0
  589. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_google_login.py +0 -0
  590. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_google_search_provider.py +0 -0
  591. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_headless_is_agentic.py +0 -0
  592. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_honest_surfaces.py +0 -0
  593. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_image_gen_tools.py +0 -0
  594. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_image_inputs.py +0 -0
  595. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_import_graph_budget.py +0 -0
  596. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_intent_router.py +0 -0
  597. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_intent_signals.py +0 -0
  598. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_kling_video_client.py +0 -0
  599. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_lazy_rebind.py +0 -0
  600. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_legacy_module_imports.py +0 -0
  601. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_license_consistency.py +0 -0
  602. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_licensing.py +0 -0
  603. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_local_image_provider.py +0 -0
  604. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_logistics_3pl.py +0 -0
  605. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_logistics_and_finance_agents.py +0 -0
  606. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_lsp.py +0 -0
  607. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_markdown_pdf.py +0 -0
  608. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_answers_in_english.py +0 -0
  609. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_data_client.py +0 -0
  610. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_history_inheritance.py +0 -0
  611. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_history_tool.py +0 -0
  612. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_hours.py +0 -0
  613. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_questions_on_backend.py +0 -0
  614. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_symbol_extraction.py +0 -0
  615. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_market_universe.py +0 -0
  616. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_mcp_circuit.py +0 -0
  617. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_mcp_client.py +0 -0
  618. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_mentions.py +0 -0
  619. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_model_capability_registry.py +0 -0
  620. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_model_choice_is_the_users.py +0 -0
  621. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_model_selection_state.py +0 -0
  622. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_narrow_chinese_output.py +0 -0
  623. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_native_binary_entrypoints.py +0 -0
  624. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_native_installer.py +0 -0
  625. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_natural_language_routing.py +0 -0
  626. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_new_modules.py +0 -0
  627. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  628. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_no_uncommitted_imports.py +0 -0
  629. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_numeric_listings.py +0 -0
  630. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ollama_stream_imports.py +0 -0
  631. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ollama_stream_tools.py +0 -0
  632. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_openai_image_client.py +0 -0
  633. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_operations_suite.py +0 -0
  634. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_output_rendering.py +0 -0
  635. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_packages_facade.py +0 -0
  636. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_packaging_constraints.py +0 -0
  637. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_packaging_manifest.py +0 -0
  638. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_packs_domains.py +0 -0
  639. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_pdf_report.py +0 -0
  640. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_pick_best_installed_model.py +0 -0
  641. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_plan_mode.py +0 -0
  642. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_platform_package_assembly.py +0 -0
  643. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_platform_packages.py +0 -0
  644. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_platform_publish.py +0 -0
  645. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_plotly_html_output.py +0 -0
  646. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_portfolio_ledger.py +0 -0
  647. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_post_turn_context_decision.py +0 -0
  648. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_preflight.py +0 -0
  649. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_preview_server.py +0 -0
  650. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_privacy_feedback.py +0 -0
  651. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_project_aria.py +0 -0
  652. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_project_review.py +0 -0
  653. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_project_review_api.py +0 -0
  654. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_prompt_assembly.py +0 -0
  655. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_prompt_selection.py +0 -0
  656. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_provider_autoconfig.py +0 -0
  657. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_provider_error_messages.py +0 -0
  658. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_provider_integration.py +0 -0
  659. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_provider_registry.py +0 -0
  660. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_public_service_status.py +0 -0
  661. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_quant_engine_namespace.py +0 -0
  662. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_rebind_contract.py +0 -0
  663. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_rebind_namespace_contract.py +0 -0
  664. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_relay_client_credentials.py +0 -0
  665. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_relay_event_verification.py +0 -0
  666. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_relay_sends_for_clients.py +0 -0
  667. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_relay_store.py +0 -0
  668. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_relay_url.py +0 -0
  669. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_release_chain.py +0 -0
  670. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_release_commit_identity.py +0 -0
  671. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_release_push_is_atomic.py +0 -0
  672. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_release_reaches_the_registries.py +0 -0
  673. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_release_verification_waits.py +0 -0
  674. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_release_workflow_permissions.py +0 -0
  675. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_report_charts.py +0 -0
  676. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_report_generator.py +0 -0
  677. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_research_protocol.py +0 -0
  678. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_research_quality.py +0 -0
  679. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_responsive_rendering.py +0 -0
  680. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_review_service.py +0 -0
  681. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_root_module_budget.py +0 -0
  682. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  683. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_acceptance.py +0 -0
  684. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_agent_loop.py +0 -0
  685. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_approval.py +0 -0
  686. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_bridge.py +0 -0
  687. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_bridge_fallback.py +0 -0
  688. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_checkpoints.py +0 -0
  689. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_event_identity.py +0 -0
  690. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_gateway.py +0 -0
  691. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_repo_map.py +0 -0
  692. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_run_store.py +0 -0
  693. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_tool_executor.py +0 -0
  694. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runtime_worktrees.py +0 -0
  695. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_runway_video_client.py +0 -0
  696. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_safety_permissions.py +0 -0
  697. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_safety_service.py +0 -0
  698. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_safety_service_adoption.py +0 -0
  699. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_service_diagnostics_security.py +0 -0
  700. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_session_search.py +0 -0
  701. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_settings_service.py +0 -0
  702. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_shipper_digest.py +0 -0
  703. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_single_import_root.py +0 -0
  704. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_skill_agent_binding.py +0 -0
  705. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_skill_catalog.py +0 -0
  706. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_skill_loader.py +0 -0
  707. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_slash_popup.py +0 -0
  708. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_spreadsheet_tools.py +0 -0
  709. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_sse_stream_contract.py +0 -0
  710. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_startup_dashboard.py +0 -0
  711. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_startup_latency.py +0 -0
  712. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_status_language.py +0 -0
  713. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_streaming_pipeline.py +0 -0
  714. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_stripe_agent.py +0 -0
  715. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_subagent.py +0 -0
  716. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_supervisor_routing.py +0 -0
  717. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_system_prompts.py +0 -0
  718. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_system_tools_output.py +0 -0
  719. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_task_orchestrator.py +0 -0
  720. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_team_synthesis.py +0 -0
  721. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_tls_trust_store.py +0 -0
  722. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_tool_policy.py +0 -0
  723. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  724. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_tool_scope.py +0 -0
  725. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_tool_step_output.py +0 -0
  726. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_trading_service.py +0 -0
  727. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_tradingview_bridge.py +0 -0
  728. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_turn_planning.py +0 -0
  729. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ui_completer_references.py +0 -0
  730. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ui_console_theme.py +0 -0
  731. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ui_input_box.py +0 -0
  732. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ui_language_and_model.py +0 -0
  733. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_ui_robot_banner.py +0 -0
  734. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_update_health_routes.py +0 -0
  735. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_verification_hint.py +0 -0
  736. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_verification_policy.py +0 -0
  737. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_version_consistency.py +0 -0
  738. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_version_counter.py +0 -0
  739. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_video_analysis.py +0 -0
  740. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_video_editor.py +0 -0
  741. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_vscode_mcp.py +0 -0
  742. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_warehouse_agents.py +0 -0
  743. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_warehouse_cli_registration.py +0 -0
  744. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_warehouse_erp_client.py +0 -0
  745. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_warehouse_workflow.py +0 -0
  746. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_wheel_is_installable.py +0 -0
  747. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_workspace_changes.py +0 -0
  748. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_workspace_context.py +0 -0
  749. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_workspace_files.py +0 -0
  750. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_workspace_scope.py +0 -0
  751. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_workspace_service.py +0 -0
  752. {aria_code-0.90.0 → aria_code-0.91.0}/tests/test_workspace_verify.py +0 -0
  753. {aria_code-0.90.0 → aria_code-0.91.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.91.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.91.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.91.0"
@@ -176,6 +176,12 @@ class BaseAgent(ABC):
176
176
  _lang_rule = self._LANG_RULES.get(self.lang, self._LANG_RULES["zh"])
177
177
  _data_warn = self._data_guard(quote or {})
178
178
  system = system + self._TIME_SENSITIVE_FACT_POLICY + _lang_rule + _data_warn
179
+ if self.lang == "en":
180
+ # The agents' own prompts and much of their data are Chinese. A rule
181
+ # appended at the end lost to them: an English /team synthesis on
182
+ # Gemini came back in Chinese. Say it first as well.
183
+ system = ("Write your entire answer in English, even though the instructions and data "
184
+ "below may be in Chinese.\n\n" + system)
179
185
  from aria_code.providers.llm.base import Message
180
186
 
181
187
  # 自动注入 DAG pipeline 中的 upstream context
@@ -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 (
@@ -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)
@@ -1056,6 +1056,7 @@ class PortfolioCommandsMixin:
1056
1056
  success=bool(getattr(result, "success", True)),
1057
1057
  error=getattr(result, "error", None),
1058
1058
  degraded=bool(getattr(result, "degraded", False)),
1059
+ lang=_lang,
1059
1060
  )
1060
1061
  else:
1061
1062
  print(f" ⎿ {name} {getattr(result, 'signal', '')} {_kp[:50]}")
@@ -1111,8 +1112,12 @@ class PortfolioCommandsMixin:
1111
1112
  team_args = parse_team_args(args)
1112
1113
  symbols = resolve_team_symbols(team_args, self.terminal.config)
1113
1114
  agent_names = team_agent_names(team_args)
1115
+ # The UI language, unless the request itself is Chinese. Guessing from
1116
+ # the arguments alone made "/team AAPL" English in a Chinese session.
1114
1117
  _zh = sum(1 for c in args if '一' <= c <= '鿿')
1115
- _lang = "zh" if _zh / max(len(args), 1) > 0.15 else "en"
1118
+ _ui_zh = str(self.terminal.config.get("ui_lang", "en")).lower().startswith("zh")
1119
+ _lang = "zh" if (_zh / max(len(args), 1) > 0.15 or _ui_zh) else "en"
1120
+ _T = (lambda a, b: a) if _lang == "zh" else (lambda a, b: b)
1116
1121
 
1117
1122
  for sym in symbols:
1118
1123
  _agent_count = len(agent_names)
@@ -1136,6 +1141,7 @@ class PortfolioCommandsMixin:
1136
1141
  success=bool(getattr(result, "success", True)),
1137
1142
  error=getattr(result, "error", None),
1138
1143
  degraded=bool(getattr(result, "degraded", False)),
1144
+ lang=_lang,
1139
1145
  )
1140
1146
  else:
1141
1147
  print(f" ⎿ {name} {getattr(result, 'signal', '')} {_kp[:50]}")
@@ -1173,6 +1179,9 @@ class PortfolioCommandsMixin:
1173
1179
  on_tool_end=consumer.on_tool_result,
1174
1180
  )
1175
1181
 
1182
+ # A tool whose result never came back leaves its spinner up,
1183
+ # and the prompt does not return while it runs.
1184
+ consumer.close_tool_spinner()
1176
1185
  team_result = _analysis.team_result
1177
1186
  _data_bundle = _analysis.data_bundle
1178
1187
  _quality_notes = _analysis.quality_notes or []
@@ -1187,9 +1196,10 @@ class PortfolioCommandsMixin:
1187
1196
  lang=_lang,
1188
1197
  )
1189
1198
  if _quality_notes:
1199
+ from rich.markup import escape as _esc_q
1190
1200
  self.context.console.print(
1191
- " [yellow]数据质量警告:[/yellow] "
1192
- + "; ".join(_quality_notes[:3])
1201
+ f" [yellow]{_T('数据质量警告', 'Data quality')}:[/yellow] "
1202
+ + _esc_q("; ".join(_quality_notes[:3]))
1193
1203
  )
1194
1204
 
1195
1205
  # Signal divergence notice — only when DebateAgent ran
@@ -1199,7 +1209,7 @@ class PortfolioCommandsMixin:
1199
1209
  )
1200
1210
  if _has_debate:
1201
1211
  self.context.console.print(
1202
- " [#C08050]🔥 信号分歧已触发 DebateAgent 调解[/#C08050]"
1212
+ f" [#C08050]🔥 {_T('信号分歧已触发 DebateAgent 调解', 'Signals disagreed; the debate agent weighed in')}[/#C08050]"
1203
1213
  )
1204
1214
 
1205
1215
  # Synthesis in a _get_Panel() for visual separation
@@ -1209,11 +1219,13 @@ class PortfolioCommandsMixin:
1209
1219
  build_team_terminal_summary as _team_terminal_summary,
1210
1220
  clean_team_synthesis_text as _clean_team_synthesis,
1211
1221
  )
1212
- _syn = _clean_team_synthesis(team_result.synthesis or "*(无综合结论)*")
1213
- _market_summary = _team_terminal_summary(_data_bundle)
1214
- _elapsed = f" [dim]耗时 {team_result.elapsed_sec:.1f}s[/dim]"
1222
+ from rich.markup import escape as _esc_syn
1223
+ _syn = _esc_syn(_clean_team_synthesis(
1224
+ team_result.synthesis or _T("(无综合结论)", "(no synthesis)")))
1225
+ _market_summary = _team_terminal_summary(_data_bundle, lang=_lang)
1226
+ _elapsed = f" [dim]{_T('耗时', 'took')} {team_result.elapsed_sec:.1f}s[/dim]"
1215
1227
  _sig_str = team_result.final_signal or ""
1216
- _conf_str = (f" [dim]置信度 {team_result.confidence:.0%}[/dim]"
1228
+ _conf_str = (f" [dim]{_T('置信度', 'confidence')} {team_result.confidence:.0%}[/dim]"
1217
1229
  if team_result.confidence else "")
1218
1230
  _sig_color = _SC.get(_sig_str.upper(), "dim")
1219
1231
  _sig_icon = _VS.get(_sig_str.upper(), ("dim", "●"))[1]
@@ -1221,7 +1233,7 @@ class PortfolioCommandsMixin:
1221
1233
  f"{_conf_str}{_elapsed}")
1222
1234
  self.context.console.print(Panel(
1223
1235
  f"{_market_summary}\n\n{_syn}\n\n{_footer}",
1224
- title="[bold]综合结论[/bold]",
1236
+ title=f"[bold]{_T('综合结论', 'Conclusion')}[/bold]",
1225
1237
  box=_rbox_team.ROUNDED,
1226
1238
  border_style="#C08050",
1227
1239
  padding=(0, 1),
@@ -1229,21 +1241,21 @@ class PortfolioCommandsMixin:
1229
1241
  else:
1230
1242
  # agents already streamed via _on_agent_done (plain print)
1231
1243
  if _quality_notes:
1232
- print(" 数据质量警告: " + "; ".join(_quality_notes[:3]))
1233
- print("\n ── 综合结论 ──")
1244
+ print(f" {_T('数据质量警告', 'Data quality')}: " + "; ".join(_quality_notes[:3]))
1245
+ print(f"\n ── {_T('综合结论', 'Conclusion')} ──")
1234
1246
  from apps.cli.commands.team import (
1235
1247
  build_team_terminal_summary as _team_terminal_summary,
1236
1248
  clean_team_synthesis_text as _clean_team_synthesis,
1237
1249
  )
1238
- print(_team_terminal_summary(_data_bundle))
1250
+ print(_team_terminal_summary(_data_bundle, lang=_lang))
1239
1251
  print()
1240
- print(_clean_team_synthesis(team_result.synthesis or "*(无综合结论)*"))
1241
- print(f"\n 耗时 {team_result.elapsed_sec:.1f}s "
1252
+ print(_clean_team_synthesis(team_result.synthesis or _T("(无综合结论)", "(no synthesis)")))
1253
+ print(f"\n {_T('耗时', 'took')} {team_result.elapsed_sec:.1f}s "
1242
1254
  f"Signal: {team_result.final_signal} "
1243
- f"置信度: {team_result.confidence:.0%}")
1255
+ f"{_T('置信度', 'confidence')}: {team_result.confidence:.0%}")
1244
1256
 
1245
1257
  # 保存报告
1246
- await self._save_team_report(sym, team_result, _data_bundle, _quality_notes)
1258
+ await self._save_team_report(sym, team_result, _data_bundle, _quality_notes, lang=_lang)
1247
1259
 
1248
1260
  # Record the directional call for outcome verification (DPO loop).
1249
1261
  # synthesis + final_signal → detect_direction; entry price fetched
@@ -1261,11 +1273,14 @@ class PortfolioCommandsMixin:
1261
1273
  self.context.console.print(f"\n [red]{_m}[/red]") if self.context.has_rich else print(f"\n {_m}")
1262
1274
  continue
1263
1275
  except Exception as e:
1264
- msg = f"团队分析失败: {e}"
1276
+ if "consumer" in locals():
1277
+ consumer.close_tool_spinner()
1278
+ msg = f"团队分析失败: {e}" if _lang == "zh" else f"Team analysis failed: {e}"
1265
1279
  self.context.console.print(f"\n [red]{msg}[/red]") if self.context.has_rich else print(f"\n {msg}")
1266
1280
  continue
1267
1281
 
1268
- async def _save_team_report(self, symbol: str, team_result, data_bundle=None, quality_notes: Optional[list] = None) -> None:
1282
+ async def _save_team_report(self, symbol: str, team_result, data_bundle=None, quality_notes: Optional[list] = None,
1283
+ lang: str = "zh") -> None:
1269
1284
  """将 /team 分析结果保存为 Markdown 报告"""
1270
1285
  saved = save_team_report(
1271
1286
  symbol=symbol,
@@ -1278,5 +1293,9 @@ class PortfolioCommandsMixin:
1278
1293
  short_path = "/".join(parts[-5:]) if len(parts) > 5 else str(saved.path)
1279
1294
  except Exception:
1280
1295
  short_path = str(saved.path)
1281
- msg = f" 报告已保存: .../{short_path}"
1282
- self.context.console.print(f" [dim]{msg}[/dim]") if self.context.has_rich else print(msg)
1296
+ label = "报告已保存" if str(lang).startswith("zh") else "Report saved"
1297
+ if self.context.has_rich:
1298
+ self.context.console.print(
1299
+ f" [dim]{label}:[/dim] [link={_file_uri(saved.path)}]…/{short_path}[/link]")
1300
+ else:
1301
+ print(f" {label}: .../{short_path}")