aria-code 0.94.0__tar.gz → 0.95.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 (766) hide show
  1. {aria_code-0.94.0/src/aria_code.egg-info → aria_code-0.95.0}/PKG-INFO +1 -1
  2. {aria_code-0.94.0 → aria_code-0.95.0}/pyproject.toml +1 -1
  3. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/data_cmds.py +106 -46
  5. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +6 -1
  6. aria_code-0.95.0/src/aria_code/apps/cli/workspace_route.py +95 -0
  7. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_cli.py +28 -7
  8. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/local_finance_tools.py +69 -13
  9. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/render/finance.py +8 -6
  10. {aria_code-0.94.0 → aria_code-0.95.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  11. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code.egg-info/SOURCES.txt +3 -0
  12. aria_code-0.95.0/tests/test_compare_strategies.py +119 -0
  13. aria_code-0.95.0/tests/test_no_tools_route.py +99 -0
  14. {aria_code-0.94.0 → aria_code-0.95.0}/LICENSE +0 -0
  15. {aria_code-0.94.0 → aria_code-0.95.0}/NOTICE +0 -0
  16. {aria_code-0.94.0 → aria_code-0.95.0}/README.md +0 -0
  17. {aria_code-0.94.0 → aria_code-0.95.0}/setup.cfg +0 -0
  18. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/__init__.py +0 -0
  19. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/adk_apps/__init__.py +0 -0
  20. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  21. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  22. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  23. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  24. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/__init__.py +0 -0
  25. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/base.py +0 -0
  26. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/code_review.py +0 -0
  27. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/__init__.py +0 -0
  28. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  29. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/critic.py +0 -0
  30. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/deepen.py +0 -0
  31. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/models.py +0 -0
  32. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  33. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  34. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/themes.py +0 -0
  35. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/deep/tiers.py +0 -0
  36. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  37. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/engineering/coder.py +0 -0
  38. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/engineering/tester.py +0 -0
  39. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/__init__.py +0 -0
  40. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  41. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  42. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  43. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/debate.py +0 -0
  44. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/earnings.py +0 -0
  45. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  46. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/macro.py +0 -0
  47. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/news.py +0 -0
  48. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/risk.py +0 -0
  49. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/sector.py +0 -0
  50. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/strategist.py +0 -0
  51. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  52. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  53. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/financial/technical.py +0 -0
  54. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/orchestrator.py +0 -0
  55. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  56. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/__init__.py +0 -0
  57. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  58. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/business_match.py +0 -0
  59. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  60. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  61. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  62. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  63. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  64. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  65. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  66. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/registry.py +0 -0
  67. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/signal_scheme.py +0 -0
  68. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/sports/__init__.py +0 -0
  69. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  70. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/supervisor.py +0 -0
  71. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/team.py +0 -0
  72. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  73. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  74. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  75. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  76. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  77. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  78. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  79. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  80. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  81. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  82. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  83. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aliyun_data_client.py +0 -0
  84. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/README.md +0 -0
  85. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/__init__.py +0 -0
  86. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/README.md +0 -0
  87. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/__init__.py +0 -0
  88. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/approvals.py +0 -0
  89. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/conversation.py +0 -0
  90. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/digest.py +0 -0
  91. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/intake.py +0 -0
  92. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/registry.py +0 -0
  93. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  94. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/README.md +0 -0
  95. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/__init__.py +0 -0
  96. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/_optional.py +0 -0
  97. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  98. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  99. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  100. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  101. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  102. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  103. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  104. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  105. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  106. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  107. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  108. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  109. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  110. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  111. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  112. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  113. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  114. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  115. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  116. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  117. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  118. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  119. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  120. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  121. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  122. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  123. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  124. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  125. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  126. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  127. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  128. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  129. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  130. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  131. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  132. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  133. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  134. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  135. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  136. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  137. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/config_store.py +0 -0
  138. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/constants.py +0 -0
  139. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/context.py +0 -0
  140. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  141. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/direct.py +0 -0
  142. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/exec_events.py +0 -0
  143. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  144. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  145. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  146. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/google_login.py +0 -0
  147. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  148. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  149. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  150. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  151. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  152. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  153. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/helpers.py +0 -0
  154. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/hooks.py +0 -0
  155. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/i18n.py +0 -0
  156. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/intent.py +0 -0
  157. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  158. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  159. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  160. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  161. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/main.py +0 -0
  162. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  163. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  164. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  165. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  166. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  167. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  168. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  169. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  170. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  171. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/preflight.py +0 -0
  172. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  173. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  174. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  175. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  176. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  177. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  178. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  179. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  180. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  181. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  182. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  183. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  184. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  185. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  186. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  187. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  188. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  189. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  190. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  191. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  192. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  193. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  194. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  195. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/session_export.py +0 -0
  196. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  197. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/session_store.py +0 -0
  198. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  199. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  200. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  201. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  202. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  203. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  204. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  205. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  206. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  207. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  208. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  209. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  210. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  211. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  212. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/update_check.py +0 -0
  213. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/updater.py +0 -0
  214. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  215. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  216. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/daemon/README.md +0 -0
  217. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/vscode/README.md +0 -0
  218. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/apps/vscode/package.json +0 -0
  219. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_daemon.py +0 -0
  220. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_feishu_bot.py +0 -0
  221. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_mcp_server.py +0 -0
  222. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_relay_client.py +0 -0
  223. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_relay_server.py +0 -0
  224. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/aria_telegram_bot.py +0 -0
  225. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ariarc.py +0 -0
  226. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/artifacts.py +0 -0
  227. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/backtest_engine.py +0 -0
  228. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/backtest_report.py +0 -0
  229. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/__init__.py +0 -0
  230. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/automation.py +0 -0
  231. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/base.py +0 -0
  232. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/capabilities.py +0 -0
  233. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  234. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  235. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  236. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  237. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  238. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  239. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/config.py +0 -0
  240. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  241. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  242. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  243. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  244. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  245. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/paper_broker.py +0 -0
  246. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/planning.py +0 -0
  247. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/registry.py +0 -0
  248. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/brokers/trading.py +0 -0
  249. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/canva_client.py +0 -0
  250. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/change_store.py +0 -0
  251. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/__init__.py +0 -0
  252. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  253. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  254. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/canva_client.py +0 -0
  255. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/figma_client.py +0 -0
  256. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/football_data_client.py +0 -0
  257. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/kling_video_client.py +0 -0
  258. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/market_data_client.py +0 -0
  259. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/openai_image_client.py +0 -0
  260. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/runway_video_client.py +0 -0
  261. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  262. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/cloud_memory.py +0 -0
  263. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/command_safety.py +0 -0
  264. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/computer_use_tools.py +0 -0
  265. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/dashboard_generator.py +0 -0
  266. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/data_analysis_tools.py +0 -0
  267. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/data_cleaner.py +0 -0
  268. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/data_service.py +0 -0
  269. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/__init__.py +0 -0
  270. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/base.py +0 -0
  271. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/router.py +0 -0
  272. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  273. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  274. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  275. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  276. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  277. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  278. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  279. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  280. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  281. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  282. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/demo_player.py +0 -0
  283. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/doctor.py +0 -0
  284. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/domain/__init__.py +0 -0
  285. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/domain/backtest_engine.py +0 -0
  286. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/domain/backtest_report.py +0 -0
  287. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/domain/finance_formulas.py +0 -0
  288. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  289. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/domain/strategy_vault.py +0 -0
  290. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/evals/__init__.py +0 -0
  291. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/evals/harness.py +0 -0
  292. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/evals/runner.py +0 -0
  293. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/external_agent_runner.py +0 -0
  294. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/figma_client.py +0 -0
  295. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/file_analysis_tools.py +0 -0
  296. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/finance_formulas.py +0 -0
  297. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/football_data_client.py +0 -0
  298. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/image_gen_tools.py +0 -0
  299. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/intent_classifier.py +0 -0
  300. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/kling_video_client.py +0 -0
  301. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/licensing.py +0 -0
  302. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/local_finance_tools.py +0 -0
  303. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/local_image_provider.py +0 -0
  304. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/local_llm_provider.py +0 -0
  305. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/macro_tools.py +0 -0
  306. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/markdown_pdf.py +0 -0
  307. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/market_data_client.py +0 -0
  308. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/mcp_client.py +0 -0
  309. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/memory_manager.py +0 -0
  310. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/model_capability.py +0 -0
  311. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/notification_tools.py +0 -0
  312. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/openai_image_client.py +0 -0
  313. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/__init__.py +0 -0
  314. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  315. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  316. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  317. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  318. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  319. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  320. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  321. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_core/export.py +0 -0
  322. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  323. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  324. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  325. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  326. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  327. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  328. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  329. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  330. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  331. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  332. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  333. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  334. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  335. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  336. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  337. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  338. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  339. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  340. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  341. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  342. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  343. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/context.py +0 -0
  344. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  345. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/data.py +0 -0
  346. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  347. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/references.py +0 -0
  348. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  349. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  350. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  351. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  352. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  353. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  354. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  355. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  356. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  357. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  358. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  359. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  360. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  361. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  362. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  363. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  364. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  365. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  366. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  367. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  368. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  369. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  370. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  371. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  372. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  373. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  374. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  375. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  376. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  377. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  378. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  379. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  380. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  381. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  382. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  383. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  384. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  385. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  386. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  387. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  388. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/__init__.py +0 -0
  389. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/base.py +0 -0
  390. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/finance/__init__.py +0 -0
  391. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  392. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/payments/__init__.py +0 -0
  393. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/realty/__init__.py +0 -0
  394. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/registry.py +0 -0
  395. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/packs/rules.py +0 -0
  396. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/plan_utils.py +0 -0
  397. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/plugin_loader.py +0 -0
  398. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/portfolio_ledger.py +0 -0
  399. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/preview_server.py +0 -0
  400. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/privacy/__init__.py +0 -0
  401. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/privacy/feedback.py +0 -0
  402. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/project_review.py +0 -0
  403. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/project_review_api.py +0 -0
  404. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/project_review_server.py +0 -0
  405. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/project_tools.py +0 -0
  406. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/__init__.py +0 -0
  407. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/__init__.py +0 -0
  408. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  409. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  410. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/base.py +0 -0
  411. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/custom.py +0 -0
  412. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/ollama.py +0 -0
  413. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  414. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/llm/registry.py +0 -0
  415. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/local_image_provider.py +0 -0
  416. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  417. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/providers/tool_messages.py +0 -0
  418. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/realty_data_tools.py +0 -0
  419. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/relay_store.py +0 -0
  420. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/report_exporters.py +0 -0
  421. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/report_generator.py +0 -0
  422. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/review_service.py +0 -0
  423. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/__init__.py +0 -0
  424. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/acceptance.py +0 -0
  425. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/agent_loop.py +0 -0
  426. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/approval.py +0 -0
  427. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/budget.py +0 -0
  428. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/checkpoints.py +0 -0
  429. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/crash_report.py +0 -0
  430. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/events.py +0 -0
  431. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/gateway.py +0 -0
  432. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/lsp.py +0 -0
  433. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/orchestrator.py +0 -0
  434. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/processes.py +0 -0
  435. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/repo_map.py +0 -0
  436. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/run_state.py +0 -0
  437. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/run_store.py +0 -0
  438. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/self_healing.py +0 -0
  439. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/subagent.py +0 -0
  440. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/task_ledger.py +0 -0
  441. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  442. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/tool_executor.py +0 -0
  443. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/tool_policy.py +0 -0
  444. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runtime/worktrees.py +0 -0
  445. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/runway_video_client.py +0 -0
  446. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/safety/__init__.py +0 -0
  447. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/safety/permissions.py +0 -0
  448. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/safety/sandbox.py +0 -0
  449. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/safety/service.py +0 -0
  450. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/setup_wizard.py +0 -0
  451. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/spreadsheet_tools.py +0 -0
  452. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/strategy_vault.py +0 -0
  453. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/__init__.py +0 -0
  454. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/artifact_tools.py +0 -0
  455. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/broker_tools.py +0 -0
  456. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  457. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  458. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  459. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  460. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  461. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/extended_tools.py +0 -0
  462. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  463. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  464. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  465. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  466. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/logistics_io.py +0 -0
  467. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  468. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/logistics_tools.py +0 -0
  469. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/macro_tools.py +0 -0
  470. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/notification_tools.py +0 -0
  471. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/project_tools.py +0 -0
  472. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  473. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  474. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/tools/stripe_tools.py +0 -0
  475. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/__init__.py +0 -0
  476. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/banner.py +0 -0
  477. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/completer.py +0 -0
  478. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/console.py +0 -0
  479. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/image_render.py +0 -0
  480. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/input_box.py +0 -0
  481. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/mentions.py +0 -0
  482. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/picker.py +0 -0
  483. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/render/__init__.py +0 -0
  484. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/render/market.py +0 -0
  485. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/render/output.py +0 -0
  486. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/render/responsive.py +0 -0
  487. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/render/team.py +0 -0
  488. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/robot.py +0 -0
  489. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  490. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/utils/vscode_uri.py +0 -0
  491. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/video_analysis.py +0 -0
  492. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/video_editor.py +0 -0
  493. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace/__init__.py +0 -0
  494. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace/files.py +0 -0
  495. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace/verify.py +0 -0
  496. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace_changes.py +0 -0
  497. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace_context.py +0 -0
  498. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace_service.py +0 -0
  499. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code/workspace_tools.py +0 -0
  500. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  501. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  502. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code.egg-info/requires.txt +0 -0
  503. {aria_code-0.94.0 → aria_code-0.95.0}/src/aria_code.egg-info/top_level.txt +0 -0
  504. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_adk_market_tools.py +0 -0
  505. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_agent_key_points_language.py +0 -0
  506. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_agent_team_fallback.py +0 -0
  507. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_analyze_file_tool.py +0 -0
  508. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_architecture_ledger_is_true.py +0 -0
  509. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_architecture_report.py +0 -0
  510. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_aria_cli_core.py +0 -0
  511. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_aria_mcp_server.py +0 -0
  512. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_aria_sdk.py +0 -0
  513. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_artifact_publishing.py +0 -0
  514. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_artifacts_and_reports.py +0 -0
  515. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ashare_prediction_cmds.py +0 -0
  516. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_background_processes.py +0 -0
  517. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_backtest_cmds.py +0 -0
  518. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_backtest_engine.py +0 -0
  519. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_backtest_report.py +0 -0
  520. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  521. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_broken_akshare_is_optional.py +0 -0
  522. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_broker_automation.py +0 -0
  523. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  524. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_broker_planning.py +0 -0
  525. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_broker_safety.py +0 -0
  526. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_broker_tools.py +0 -0
  527. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_budget.py +0 -0
  528. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_business_workflow_cmds.py +0 -0
  529. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_canva_client.py +0 -0
  530. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_canvas_cmds.py +0 -0
  531. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_card_approvals.py +0 -0
  532. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_channel_intake.py +0 -0
  533. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_channels.py +0 -0
  534. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_chart_handlers.py +0 -0
  535. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_chat_bots_fail_closed.py +0 -0
  536. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_chat_routing.py +0 -0
  537. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ci_security_workflow.py +0 -0
  538. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_app_split.py +0 -0
  539. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_bootstrap.py +0 -0
  540. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_config_store.py +0 -0
  541. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  542. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_runtime_consumer.py +0 -0
  543. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_tool_executor_module.py +0 -0
  544. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cli_updater.py +0 -0
  545. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_cloud_memory.py +0 -0
  546. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_code_audit_tools.py +0 -0
  547. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_code_review_agent.py +0 -0
  548. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_codegen_output.py +0 -0
  549. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_coder_tester_self_healing.py +0 -0
  550. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_coder_tool_safety.py +0 -0
  551. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_collaboration.py +0 -0
  552. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_command_loggers.py +0 -0
  553. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_command_safety.py +0 -0
  554. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_completions_builder.py +0 -0
  555. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_config_paths.py +0 -0
  556. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_configured_provider.py +0 -0
  557. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_container_entrypoint.py +0 -0
  558. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_container_entrypoints.py +0 -0
  559. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_context_checkpoints.py +0 -0
  560. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_context_references.py +0 -0
  561. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_context_service.py +0 -0
  562. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_conversation_core.py +0 -0
  563. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_crash_report.py +0 -0
  564. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_credential_file_permissions.py +0 -0
  565. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_custom_providers.py +0 -0
  566. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_daemon_gateway_config.py +0 -0
  567. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_dashboard_generator.py +0 -0
  568. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_data_service.py +0 -0
  569. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_data_service_imports.py +0 -0
  570. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_data_without_model.py +0 -0
  571. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_datasource_routing.py +0 -0
  572. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_deep_analysis.py +0 -0
  573. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_degrades_without_quant_engine.py +0 -0
  574. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  575. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_doctor.py +0 -0
  576. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  577. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_doctor_npm_scope.py +0 -0
  578. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_edit_and_command_safety.py +0 -0
  579. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_engine_boundary.py +0 -0
  580. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_enterprise_tool_honesty.py +0 -0
  581. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_env_switch_docs.py +0 -0
  582. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_evals_harness.py +0 -0
  583. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_event_import_roots.py +0 -0
  584. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_exec_events.py +0 -0
  585. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_extended_tools.py +0 -0
  586. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_feishu_swarm_config.py +0 -0
  587. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_file_links.py +0 -0
  588. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_finalize_release.py +0 -0
  589. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_finance_renderers.py +0 -0
  590. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_finance_service_catalog.py +0 -0
  591. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_first_run_output.py +0 -0
  592. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_first_run_works.py +0 -0
  593. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_football_agent.py +0 -0
  594. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_football_prediction_output.py +0 -0
  595. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_google_cloud_models.py +0 -0
  596. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_google_cloud_routing.py +0 -0
  597. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_google_login.py +0 -0
  598. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_google_search_provider.py +0 -0
  599. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_headless_is_agentic.py +0 -0
  600. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_honest_surfaces.py +0 -0
  601. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_image_gen_tools.py +0 -0
  602. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_image_inputs.py +0 -0
  603. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_import_graph_budget.py +0 -0
  604. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_intent_router.py +0 -0
  605. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_intent_signals.py +0 -0
  606. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_kling_video_client.py +0 -0
  607. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_lazy_rebind.py +0 -0
  608. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_legacy_module_imports.py +0 -0
  609. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_license_consistency.py +0 -0
  610. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_licensing.py +0 -0
  611. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_local_image_provider.py +0 -0
  612. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_logistics_3pl.py +0 -0
  613. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_logistics_and_finance_agents.py +0 -0
  614. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_lsp.py +0 -0
  615. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_markdown_pdf.py +0 -0
  616. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_answers_in_english.py +0 -0
  617. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_data_client.py +0 -0
  618. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_history_inheritance.py +0 -0
  619. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_history_tool.py +0 -0
  620. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_hours.py +0 -0
  621. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_questions_on_backend.py +0 -0
  622. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_symbol_extraction.py +0 -0
  623. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_market_universe.py +0 -0
  624. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_mcp_circuit.py +0 -0
  625. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_mcp_client.py +0 -0
  626. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_mentions.py +0 -0
  627. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_model_capability_registry.py +0 -0
  628. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_model_choice_is_the_users.py +0 -0
  629. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_model_selection_state.py +0 -0
  630. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_narrow_chinese_output.py +0 -0
  631. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_native_binary_entrypoints.py +0 -0
  632. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_native_installer.py +0 -0
  633. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_natural_language_routing.py +0 -0
  634. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_new_modules.py +0 -0
  635. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  636. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_no_uncommitted_imports.py +0 -0
  637. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_numeric_listings.py +0 -0
  638. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ollama_stream_imports.py +0 -0
  639. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ollama_stream_tools.py +0 -0
  640. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_openai_image_client.py +0 -0
  641. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_operations_suite.py +0 -0
  642. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_os_sandbox.py +0 -0
  643. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_output_rendering.py +0 -0
  644. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_packages_facade.py +0 -0
  645. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_packaging_constraints.py +0 -0
  646. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_packaging_manifest.py +0 -0
  647. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_packs_domains.py +0 -0
  648. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_pdf_report.py +0 -0
  649. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_pick_best_installed_model.py +0 -0
  650. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_plan_mode.py +0 -0
  651. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_platform_package_assembly.py +0 -0
  652. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_platform_packages.py +0 -0
  653. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_platform_publish.py +0 -0
  654. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_plotly_html_output.py +0 -0
  655. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_portfolio_language.py +0 -0
  656. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_portfolio_ledger.py +0 -0
  657. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_post_turn_context_decision.py +0 -0
  658. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_preflight.py +0 -0
  659. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_preview_server.py +0 -0
  660. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_privacy_feedback.py +0 -0
  661. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_project_aria.py +0 -0
  662. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_project_context_files.py +0 -0
  663. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_project_review.py +0 -0
  664. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_project_review_api.py +0 -0
  665. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_prompt_assembly.py +0 -0
  666. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_prompt_selection.py +0 -0
  667. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_provider_autoconfig.py +0 -0
  668. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_provider_error_messages.py +0 -0
  669. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_provider_integration.py +0 -0
  670. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_provider_registry.py +0 -0
  671. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_public_service_status.py +0 -0
  672. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_quant_engine_namespace.py +0 -0
  673. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_rebind_contract.py +0 -0
  674. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_rebind_namespace_contract.py +0 -0
  675. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_relay_client_credentials.py +0 -0
  676. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_relay_event_verification.py +0 -0
  677. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_relay_sends_for_clients.py +0 -0
  678. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_relay_store.py +0 -0
  679. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_relay_url.py +0 -0
  680. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_release_chain.py +0 -0
  681. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_release_commit_identity.py +0 -0
  682. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_release_push_is_atomic.py +0 -0
  683. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_release_reaches_the_registries.py +0 -0
  684. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_release_verification_waits.py +0 -0
  685. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_release_workflow_permissions.py +0 -0
  686. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_report_charts.py +0 -0
  687. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_report_generator.py +0 -0
  688. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_research_protocol.py +0 -0
  689. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_research_quality.py +0 -0
  690. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_responsive_rendering.py +0 -0
  691. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_review_service.py +0 -0
  692. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_root_module_budget.py +0 -0
  693. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  694. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_acceptance.py +0 -0
  695. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_agent_loop.py +0 -0
  696. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_approval.py +0 -0
  697. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_bridge.py +0 -0
  698. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_bridge_fallback.py +0 -0
  699. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_checkpoints.py +0 -0
  700. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_event_identity.py +0 -0
  701. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_gateway.py +0 -0
  702. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_repo_map.py +0 -0
  703. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_run_store.py +0 -0
  704. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_tool_executor.py +0 -0
  705. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runtime_worktrees.py +0 -0
  706. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_runway_video_client.py +0 -0
  707. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_safety_permissions.py +0 -0
  708. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_safety_service.py +0 -0
  709. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_safety_service_adoption.py +0 -0
  710. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_service_diagnostics_security.py +0 -0
  711. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_session_search.py +0 -0
  712. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_settings_service.py +0 -0
  713. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_shell_commands_as_written.py +0 -0
  714. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_shipper_digest.py +0 -0
  715. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_single_import_root.py +0 -0
  716. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_skill_agent_binding.py +0 -0
  717. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_skill_catalog.py +0 -0
  718. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_skill_loader.py +0 -0
  719. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_slash_popup.py +0 -0
  720. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_spreadsheet_tools.py +0 -0
  721. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_sse_stream_contract.py +0 -0
  722. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_startup_dashboard.py +0 -0
  723. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_startup_latency.py +0 -0
  724. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_status_language.py +0 -0
  725. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_streaming_pipeline.py +0 -0
  726. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_stripe_agent.py +0 -0
  727. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_subagent.py +0 -0
  728. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_supervisor_routing.py +0 -0
  729. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_system_prompts.py +0 -0
  730. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_system_tools_output.py +0 -0
  731. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_task_orchestrator.py +0 -0
  732. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_team_analysts.py +0 -0
  733. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_team_synthesis.py +0 -0
  734. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_tls_trust_store.py +0 -0
  735. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_tool_policy.py +0 -0
  736. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  737. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_tool_scope.py +0 -0
  738. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_tool_step_output.py +0 -0
  739. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_trading_service.py +0 -0
  740. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_tradingview_bridge.py +0 -0
  741. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_turn_planning.py +0 -0
  742. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ui_completer_references.py +0 -0
  743. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ui_console_theme.py +0 -0
  744. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ui_input_box.py +0 -0
  745. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ui_language_and_model.py +0 -0
  746. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_ui_robot_banner.py +0 -0
  747. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_update_health_routes.py +0 -0
  748. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_verification_hint.py +0 -0
  749. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_verification_policy.py +0 -0
  750. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_version_consistency.py +0 -0
  751. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_version_counter.py +0 -0
  752. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_video_analysis.py +0 -0
  753. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_video_editor.py +0 -0
  754. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_vscode_mcp.py +0 -0
  755. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_warehouse_agents.py +0 -0
  756. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_warehouse_cli_registration.py +0 -0
  757. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_warehouse_erp_client.py +0 -0
  758. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_warehouse_workflow.py +0 -0
  759. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_wheel_is_installable.py +0 -0
  760. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_workspace_changes.py +0 -0
  761. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_workspace_context.py +0 -0
  762. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_workspace_files.py +0 -0
  763. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_workspace_scope.py +0 -0
  764. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_workspace_service.py +0 -0
  765. {aria_code-0.94.0 → aria_code-0.95.0}/tests/test_workspace_verify.py +0 -0
  766. {aria_code-0.94.0 → aria_code-0.95.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.94.0
3
+ Version: 0.95.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.94.0"
7
+ version = "0.95.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.94.0"
20
+ __version__ = "0.95.0"
@@ -339,23 +339,60 @@ class DataCommandsMixin:
339
339
  with self.context.console.status(f"[dim]{ui_text(self, f'获取 {symbol} 同行数据', f'Fetching {symbol} peer data')}...[/dim]", spinner="dots"):
340
340
  from local_finance_tools import _peer_comparison
341
341
  r = await loop.run_in_executor(None, _peer_comparison,
342
- {"symbol": symbol, "peers": peers})
342
+ {"symbol": symbol, "peers": peers, "lang": ui_text(self, "zh", "en")})
343
343
  else:
344
344
  from local_finance_tools import _peer_comparison
345
- r = _peer_comparison({"symbol": symbol, "peers": peers})
345
+ r = _peer_comparison({"symbol": symbol, "peers": peers, "lang": ui_text(self, "zh", "en")})
346
346
 
347
347
  _render_peer_comparison(r)
348
348
 
349
349
  async def cmd_compare(self, args: str):
350
- """多策略横向对比 → /api/v1/backtest/compare-strategies"""
351
- parts = args.split() if args else ["SPY"]
352
- symbol = parts[0].upper() if parts else "SPY"
353
- start = parts[1] if len(parts) > 1 else "2020-01-01"
354
- end = parts[2] if len(parts) > 2 else __import__("datetime").date.today().isoformat()
350
+ """/compare SYMBOL [start] [end] — several strategies on one symbol, against buy-and-hold.
351
+
352
+ /compare AAPL MSFT read MSFT as the start date, and the local fallback
353
+ ran four of its five strategies as buy-and-hold (the local engine had
354
+ no such names and fell through to it), so the table showed four
355
+ identical rows. Its "start → end" title was the dates asked for, not
356
+ the ones used, and the Buy & Hold row was a total return in the
357
+ annual-return column with a made-up trade count.
358
+ """
359
+ import re as _re
360
+
361
+ parts = args.split() if args and args.strip() else ["SPY"]
362
+ symbol = parts[0].upper()
363
+ rest = parts[1:]
364
+ def is_date(token: str) -> bool:
365
+ # A real date: 2024-13-01 has the shape and reached yfinance, whose
366
+ # failure was then explained as rate limiting.
367
+ try:
368
+ __import__("datetime").date.fromisoformat(token)
369
+ return len(token) == 10
370
+ except ValueError:
371
+ return False
372
+ if rest and not is_date(rest[0]):
373
+ # A symbol has a letter (AAPL, 0700.HK) or is a six-digit A-share code.
374
+ if all(_re.fullmatch(r"(?=.*[A-Za-z])[A-Za-z0-9.^=-]{1,12}|\d{6}", t) for t in rest):
375
+ # Two or more symbols: the user is comparing stocks, which is /peer.
376
+ peers = " ".join(t.upper() for t in rest)
377
+ note = f"→ /peer {symbol} {peers}"
378
+ self.context.console.print(f" [dim]{note}[/dim]") if self.context.has_rich else print(f" {note}")
379
+ await self.cmd_peer(f"{symbol} {peers}")
380
+ return
381
+ print_error(self.context, ui_text(self, f"无法识别的日期:{rest[0]}", f"Not a date: {rest[0]}"),
382
+ "Usage: /compare SYMBOL [YYYY-MM-DD] [YYYY-MM-DD]")
383
+ return
384
+ if len(rest) > 1 and not is_date(rest[1]):
385
+ print_error(self.context, ui_text(self, f"无法识别的日期:{rest[1]}", f"Not a date: {rest[1]}"),
386
+ "Usage: /compare SYMBOL [YYYY-MM-DD] [YYYY-MM-DD]")
387
+ return
388
+ start = rest[0] if rest else "2020-01-01"
389
+ end = rest[1] if len(rest) > 1 else __import__("datetime").date.today().isoformat()
355
390
  api_url = self.terminal.config.get("api_url", "http://localhost:8000")
356
391
  import aiohttp
357
392
 
358
393
  _STRATS = ["momentum", "mean_reversion", "breakout", "turtle", "ma_crossover"]
394
+ # What the local engine can run, under the names /compare shows.
395
+ _LOCAL = {"momentum": "momentum", "mean_reversion": "rsi_mean_revert", "ma_crossover": "sma_cross"}
359
396
 
360
397
  async def _do():
361
398
  payload = {"symbol": symbol, "strategies": _STRATS,
@@ -367,76 +404,90 @@ class DataCommandsMixin:
367
404
  body = await resp.json()
368
405
  return body.get("data", body)
369
406
 
407
+ def _row(name: str, d: dict) -> dict:
408
+ ann = float(d.get("annual_return", 0) or 0)
409
+ mdd = float(d.get("max_drawdown", 0) or 0)
410
+ return {
411
+ "name": name,
412
+ "annualized_return_pct": ann * 100,
413
+ "sharpe_ratio": float(d.get("sharpe_ratio", 0) or 0),
414
+ "max_drawdown_pct": mdd * 100,
415
+ "calmar_ratio": (ann / abs(mdd)) if mdd else 0.0,
416
+ "sortino_ratio": float(d.get("sortino_ratio", 0) or 0),
417
+ "win_rate_pct": float(d.get("win_rate", 0) or 0) * 100,
418
+ "n_trades": int(d.get("total_trades", 0) or 0),
419
+ }
420
+
370
421
  def _do_local():
371
- """Fallback: run each strategy via the local backtest engine and
372
- assemble the same shape the backend endpoint returns. Used when the
373
- backend is down or lacks the compare-strategies endpoint."""
374
- import asyncio as _aio
375
- rows = []
376
- bench_pct = 0.0
377
- for strat in _STRATS:
422
+ """The strategies the local engine has, over the same dates, and
423
+ buy-and-hold run through the same engine as the benchmark."""
424
+ run = _get_LOCAL_TOOLS()["backtest_strategy"][0]
425
+ rows, period, errors = [], None, []
426
+ for shown, local in _LOCAL.items():
378
427
  try:
379
- res = _get_LOCAL_TOOLS()["backtest_strategy"][0](
380
- {"symbol": symbol, "strategy": strat})
381
- except Exception:
428
+ res = run({"symbol": symbol, "strategy": local, "start": start, "end": end})
429
+ except Exception as exc:
430
+ errors.append(f"{shown}: {exc}")
382
431
  continue
383
432
  if not res.get("success"):
433
+ errors.append(f"{shown}: {res.get('error', 'failed')}")
384
434
  continue
385
435
  d = res.get("data", res)
386
- ann = float(d.get("annual_return", 0) or 0)
387
- mdd = float(d.get("max_drawdown", 0) or 0)
388
- calmar = (ann / abs(mdd)) if mdd else 0.0
389
- rows.append({
390
- "name": strat,
391
- "annualized_return_pct": ann * 100,
392
- "sharpe_ratio": float(d.get("sharpe_ratio", 0) or 0),
393
- "max_drawdown_pct": mdd * 100,
394
- "calmar_ratio": calmar,
395
- "sortino_ratio": float(d.get("sortino_ratio", 0) or 0),
396
- "win_rate_pct": float(d.get("win_rate", 0) or 0) * 100,
397
- "n_trades": int(d.get("total_trades", 0) or 0),
398
- })
399
- br = d.get("benchmark_return")
400
- if br is not None and br == br: # not NaN
401
- bench_pct = float(br) * 100
436
+ period = period or (d.get("start"), d.get("end"))
437
+ rows.append(_row(shown, d))
402
438
  rows.sort(key=lambda r: r["sharpe_ratio"], reverse=True)
403
439
  for i, r in enumerate(rows, 1):
404
440
  r["rank_by_sharpe"] = i
405
- return {"strategies": rows, "benchmark": {"annualized_return_pct": bench_pct},
406
- "provider": "local"}
441
+ bench = {}
442
+ try:
443
+ b = run({"symbol": symbol, "strategy": "buy_hold", "start": start, "end": end})
444
+ if b.get("success"):
445
+ bench = _row("buy_hold", b.get("data", b))
446
+ except Exception:
447
+ pass
448
+ return {"strategies": rows, "benchmark": bench, "provider": "local", "period": period,
449
+ "skipped": [s for s in _STRATS if s not in _LOCAL], "errors": errors}
407
450
 
408
451
  async def _do_with_fallback():
409
452
  try:
410
453
  return await _do()
411
454
  except Exception:
412
455
  # Backend unavailable / missing endpoint → local engine
456
+ note = ui_text(self, "后端不可用,使用本地回测引擎对比…",
457
+ "Backend unavailable; comparing with the local backtest engine…")
413
458
  if self.context.has_rich:
414
- self.context.console.print(" [dim]后端不可用,使用本地回测引擎对比…[/dim]")
415
- return _do_local()
459
+ self.context.console.print(f" [dim]{note}[/dim]")
460
+ import asyncio as _aio
461
+ return await _aio.get_event_loop().run_in_executor(None, _do_local)
416
462
 
463
+ status = ui_text(self, f"正在对比 {symbol} 的策略", f"Comparing strategies on {symbol}")
417
464
  if self.context.has_rich:
418
- with self.context.console.status(f"[dim]Comparing strategies on {symbol}...[/dim]", spinner="dots"):
465
+ with self.context.console.status(f"[dim]{status}...[/dim]", spinner="dots"):
419
466
  try:
420
467
  data = await _do_with_fallback()
421
468
  except Exception as e:
422
469
  print_error(self.context, str(e), "tool")
423
470
  return
424
471
  else:
425
- print(f"Comparing strategies on {symbol}...")
472
+ print(f"{status}...")
426
473
  try:
427
474
  data = await _do_with_fallback()
428
475
  except Exception as e:
429
476
  print_error(self.context, str(e), "tool")
430
477
  return
431
478
  if not data.get("strategies"):
432
- print_error(self.context, "策略对比无结果", "本地回测引擎未返回数据,检查标的代码是否正确")
479
+ detail = "; ".join(data.get("errors") or []) or ui_text(
480
+ self, "检查标的代码和日期是否正确", "check the symbol and the dates")
481
+ print_error(self.context, ui_text(self, "策略对比无结果", "No strategy results"), detail)
433
482
  return
434
483
 
435
484
  strategies = data.get("strategies", [])
436
- bh = data.get("benchmark", {})
485
+ bh = data.get("benchmark", {}) or {}
486
+ period = data.get("period") or (start, end)
437
487
  if self.context.has_rich:
438
488
  from rich.table import Table
439
- tbl = Table(title=f"[bold]{symbol} Strategy Comparison[/bold] {start} → {end}", show_header=True, header_style="bold")
489
+ tbl = Table(title=f"[bold]{symbol} Strategy Comparison[/bold] {period[0]} → {period[1]}",
490
+ show_header=True, header_style="bold")
440
491
  for col in ["Rank", "Strategy", "Ann.Ret%", "Sharpe", "MaxDD%", "Calmar", "Sortino", "Win%", "Trades"]:
441
492
  tbl.add_column(col, justify="right")
442
493
  for s in strategies:
@@ -451,11 +502,20 @@ class DataCommandsMixin:
451
502
  f"{s.get('win_rate_pct',0):.0f}%",
452
503
  str(s.get("n_trades",0)),
453
504
  )
454
- tbl.add_row("—", "[dim]Buy & Hold[/dim]",
455
- f"{bh.get('annualized_return_pct',0):+.1f}%",
456
- f"{bh.get('sharpe_ratio',0):.3f}",
457
- f"{bh.get('max_drawdown_pct',0):.1f}%", "—", "—", "—", "2")
505
+ if bh:
506
+ tbl.add_row("—", "[dim]Buy & Hold[/dim]",
507
+ f"{bh.get('annualized_return_pct',0):+.1f}%",
508
+ f"{bh.get('sharpe_ratio',0):.3f}",
509
+ f"{bh.get('max_drawdown_pct',0):.1f}%",
510
+ f"{bh['calmar_ratio']:.2f}" if "calmar_ratio" in bh else "—",
511
+ f"{bh['sortino_ratio']:.2f}" if "sortino_ratio" in bh else "—",
512
+ "—", str(bh["n_trades"]) if "n_trades" in bh else "—")
458
513
  self.context.console.print(tbl)
514
+ if data.get("skipped"):
515
+ self.context.console.print(" [dim]" + ui_text(
516
+ self, f"本地引擎没有 {', '.join(data['skipped'])},需后端才能对比。",
517
+ f"{', '.join(data['skipped'])} need the backend; the local engine does not have them.")
518
+ + "[/dim]")
459
519
  else:
460
520
  for s in strategies:
461
521
  print(f"{s['name']}: Ann={s.get('annualized_return_pct',0):+.1f}% Sharpe={s.get('sharpe_ratio',0):.2f} DD={s.get('max_drawdown_pct',0):.1f}%")
@@ -672,7 +672,12 @@ def handle_stock_chart_analysis_direct(symbol: str, period: str = "1y") -> dict:
672
672
  pe = info.get("trailingPE")
673
673
  pb = info.get("priceToBook")
674
674
  roe = info.get("returnOnEquity")
675
- div_yield = info.get("trailingAnnualDividendYield") or info.get("dividendYield")
675
+ # A fraction, as _fv(div_yield, 100, pct=True) below expects. The fallback
676
+ # was dividendYield, which yfinance gives already in percent: 100x too big.
677
+ trailing = info.get("trailingAnnualDividendYield")
678
+ rate = info.get("dividendRate")
679
+ price_now = info.get("regularMarketPrice") or info.get("currentPrice")
680
+ div_yield = trailing or (float(rate) / float(price_now) if rate and price_now else None)
676
681
  market_cap = info.get("marketCap")
677
682
 
678
683
  def _fv(v, mult=1.0, pct=False):
@@ -0,0 +1,95 @@
1
+ """A task about this folder, sent to a model that cannot touch it.
2
+
3
+ With backend_chat on, turns go to the Arthera backend, which receives the
4
+ prompt and history but none of Aria's local tools. Asked to run
5
+ `python3 -c 'import calc; print(calc.add(2,3))'` in a folder, it said it had
6
+ no filesystem access and gave the output as 5; the function subtracts, so it
7
+ is -1. The turn reported success with no tools used, and `-p` exited 0. A
8
+ small local model without tool calling is in the same position.
9
+
10
+ ``needs_workspace`` asks only whether a message needs this machine: it names
11
+ a file or imports a module that exists here, uses an @file reference, asks
12
+ for a command to be run, or says "this project", "the failing tests" and the
13
+ like. A question about code in general ("explain Python decorators") does not
14
+ need the folder and is left alone.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re
20
+ from pathlib import Path
21
+
22
+ _PATH_TOKEN = re.compile(r"[\w./-]+\.[A-Za-z0-9]{1,6}\b|[\w-]+/[\w./-]+")
23
+ _HERE_EN = re.compile(
24
+ r"\b(?:this|my|our|current)\s+(?:project|repo|repository|folder|directory|codebase|workspace|"
25
+ r"working\s+tree)\b|\bin\s+here\b|\b(?:the\s+)?failing\s+tests?\b|\bmy\s+(?:code|tests)\b",
26
+ re.I,
27
+ )
28
+ # Asking for a command to be run needs a tool to run it, wherever it points.
29
+ _RUN_EN = re.compile(r"\b(?:run|execute)\s+(?:`|python3?\b|pytest\b|npm\b|npx\b|node\b|make\b|cargo\b|"
30
+ r"go\s+(?:test|run|build)\b|bash\b|sh\b|pip3?\b|uv\b|git\b|ls\b|the\s+tests?\b)", re.I)
31
+ _RUN_ZH = re.compile(r"(?:运行|执行|跑一下|跑)\s*(?:`|python|pytest|npm|node|git|make|命令|脚本|测试)", re.I)
32
+ _IMPORT = re.compile(r"\b(?:import|from)\s+([A-Za-z_]\w*)")
33
+ _HERE_ZH = ("这个项目", "该项目", "当前项目", "这个仓库", "当前仓库", "这个目录", "当前目录", "这个文件夹",
34
+ "当前文件夹", "这个代码库", "本项目", "本仓库", "失败的测试", "我的代码")
35
+
36
+
37
+ def needs_workspace(text: str, cwd: Path | str | None = None) -> bool:
38
+ """True when the message is about files in ``cwd`` (default: the current directory)."""
39
+ message = str(text or "")
40
+ if "@file:" in message or "@folder:" in message:
41
+ return True
42
+ if _HERE_EN.search(message) or any(word in message for word in _HERE_ZH):
43
+ return True
44
+ if _RUN_EN.search(message) or _RUN_ZH.search(message):
45
+ return True
46
+ base = Path(cwd or Path.cwd())
47
+ for module in _IMPORT.findall(message):
48
+ if (base / f"{module}.py").is_file() or (base / module / "__init__.py").is_file():
49
+ return True
50
+ for token in _PATH_TOKEN.findall(message):
51
+ candidate = token.strip("./") if token.startswith("./") else token
52
+ try:
53
+ if candidate and (base / candidate).exists():
54
+ return True
55
+ except (OSError, ValueError):
56
+ continue
57
+ return False
58
+
59
+
60
+ def route_has_tools(model: str, config: dict, api_url: str | None) -> bool:
61
+ """Whether this turn's model can call Aria's local tools."""
62
+ try:
63
+ from aria_code.model_capability import get_model_capability
64
+
65
+ capability = get_model_capability(model)
66
+ if not (capability.tool_calls and capability.context_window >= 8192):
67
+ return False
68
+ except Exception:
69
+ pass
70
+ try:
71
+ from aria_code.apps.cli.providers.chat_routing import model_receives_local_tools
72
+
73
+ return model_receives_local_tools(model, config, api_url)
74
+ except Exception:
75
+ return True
76
+
77
+
78
+ def no_tools_message(config: dict, *, lang: str = "en") -> str:
79
+ """Why the model cannot do this here, and what to change."""
80
+ backend = bool(config.get("backend_chat"))
81
+ if lang == "zh":
82
+ why = ("当前通过 Arthera 云端对话(backend_chat),那里的模型读不到这个文件夹,也不能运行命令"
83
+ if backend else "当前模型不支持工具调用,读不到这个文件夹,也不能运行命令")
84
+ return (f"{why},关于这里文件的回答只能是推测。要在这个文件夹里写代码、跑测试,请用 /model "
85
+ "选一个能调用工具的模型(例如 Vertex 上的 Gemini、OpenAI 或 Ollama 的 qwen2.5-coder),"
86
+ "或用 aria-code --local。")
87
+ why = ("Turns go to Arthera cloud chat (backend_chat), where the model cannot read this folder or run "
88
+ "commands" if backend else "The current model cannot call tools, so it cannot read this folder "
89
+ "or run commands")
90
+ return (f"{why}; anything it says about files here is a guess. To work on code in this folder, pick a "
91
+ "model that runs tools with /model (Gemini on Vertex, OpenAI, or an Ollama model such as "
92
+ "qwen2.5-coder), or start with aria-code --local.")
93
+
94
+
95
+ __all__ = ["needs_workspace", "route_has_tools", "no_tools_message"]
@@ -5133,6 +5133,21 @@ class ArtheraTerminal:
5133
5133
  console.print(f"[{_agent_color}]{_agent_name}[/{_agent_color}]{_answer_meta}")
5134
5134
  else:
5135
5135
  print(f"{_agent_name}{' · ' + _answer_model if _answer_model else ''}")
5136
+ # A task about this folder on a model that cannot open it gets a guess
5137
+ # that reads like a result (backend_chat answered "5" for a function
5138
+ # that returns -1). Say so before the answer, once a session; the
5139
+ # person can still read it, and knows what it is.
5140
+ if not _model_has_tools and not getattr(self, "_no_tools_notice_shown", False):
5141
+ from apps.cli.workspace_route import needs_workspace, no_tools_message
5142
+ if needs_workspace(message):
5143
+ self._no_tools_notice_shown = True
5144
+ _zh_nt = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
5145
+ _why = no_tools_message(self.config, lang="zh" if _zh_nt else "en")
5146
+ if HAS_RICH:
5147
+ from aria_code.ui.render.output import print_hanging
5148
+ print_hanging(console, " ! ", _why, style="yellow")
5149
+ else:
5150
+ print(f" ! {_why}")
5136
5151
  # ── Single-shot turn through the shared runtime Gateway ─────────────
5137
5152
  # The per-round inline agent loop that used to live here was removed
5138
5153
  # (2026-07) after the runtime path was validated with real turns:
@@ -6523,13 +6538,11 @@ class ArtheraTerminal:
6523
6538
  self._maybe_show_intent_preflight(prompt, quiet=quiet)
6524
6539
 
6525
6540
  _curr_model_id_p = self.config.get("model", "")
6526
- _model_has_tools_p = False
6527
- if _HAS_MODEL_CAP:
6528
- try:
6529
- _mc_p = get_model_capability(_curr_model_id_p)
6530
- _model_has_tools_p = bool(_mc_p.tool_calls and _mc_p.context_window >= 8192)
6531
- except Exception:
6532
- pass
6541
+ # The route counts as much as the model: on backend_chat the model gets
6542
+ # no local tools whatever it could do with them. This only looked at the
6543
+ # model, so the deterministic chain skipped its data pre-fetch there.
6544
+ from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools
6545
+ _model_has_tools_p = route_has_tools(_curr_model_id_p, self.config, self.api_url)
6533
6546
 
6534
6547
  # ── Broker guide intent: broad discovery should not start an add wizard ──
6535
6548
  if _is_broker_guide_intent(prompt):
@@ -6560,6 +6573,14 @@ class ArtheraTerminal:
6560
6573
  if deterministic.get("success") or _is_stock_chart_analysis_request(prompt):
6561
6574
  result = deterministic
6562
6575
  else:
6576
+ # No one reads a headless answer before a script acts on it. A task
6577
+ # about this folder on a model that cannot open it would come back as
6578
+ # a confident guess with exit 0; fail before sending it instead.
6579
+ if not _model_has_tools_p and needs_workspace(prompt):
6580
+ _zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
6581
+ _why = no_tools_message(self.config, lang="zh" if _zh else "en")
6582
+ print(_why, file=sys.stderr)
6583
+ return {"success": False, "response": "", "error": "model_cannot_use_tools", "detail": _why}
6563
6584
  # Spinner for terminal usage: gives visual feedback while the model generates.
6564
6585
  # Only starts when we actually need to call the LLM (not for deterministic responses).
6565
6586
  _prompt_spinner = None
@@ -559,6 +559,15 @@ def _calculate_factors(params: dict) -> dict:
559
559
  # 5. backtest_strategy
560
560
  # ---------------------------------------------------------------------------
561
561
 
562
+ # Every name the local engine accepts, mapped to the strategy it runs.
563
+ _LOCAL_STRATEGIES = {
564
+ "sma_cross": "sma_cross", "ma_cross": "sma_cross", "ma_crossover": "sma_cross", "sma": "sma_cross",
565
+ "rsi_mean_revert": "rsi_mean_revert", "rsi": "rsi_mean_revert", "mean_reversion": "rsi_mean_revert",
566
+ "momentum": "momentum", "mom": "momentum",
567
+ "buy_hold": "buy_hold", "buy_and_hold": "buy_hold", "bh": "buy_hold",
568
+ }
569
+
570
+
562
571
  def _backtest_strategy(params: dict) -> dict:
563
572
  """
564
573
  Simple backtest engine. Supports:
@@ -566,6 +575,15 @@ def _backtest_strategy(params: dict) -> dict:
566
575
  """
567
576
  symbol = params.get("symbol", "AAPL")
568
577
  strategy = params.get("strategy", "sma_cross").lower().replace(" ", "_").replace("-", "_")
578
+ # An unknown name used to fall through to buy-and-hold and report its
579
+ # numbers under the name asked for: /compare showed mean_reversion,
580
+ # breakout, turtle and ma_crossover with identical results, all of them
581
+ # buy-and-hold.
582
+ known = _LOCAL_STRATEGIES.get(strategy)
583
+ if known is None:
584
+ return {"success": False, "error": f"Unknown strategy '{strategy}'. The local engine runs: "
585
+ + ", ".join(sorted(set(_LOCAL_STRATEGIES.values())))}
586
+ strategy = known
569
587
  start = params.get("start", _parse_date(None, 3 * 365))
570
588
  end = params.get("end", _today())
571
589
  fast = int(params.get("fast_period", 20))
@@ -598,12 +616,12 @@ def _backtest_strategy(params: dict) -> dict:
598
616
  close = df["Close"].astype(float)
599
617
 
600
618
  # ── Signal generation ─────────────────────────────────────────────────
601
- if strategy in ("sma_cross", "ma_cross"):
619
+ if strategy == "sma_cross":
602
620
  ma_f = close.rolling(fast).mean()
603
621
  ma_s = close.rolling(slow).mean()
604
622
  signal = (ma_f > ma_s).astype(int)
605
623
 
606
- elif strategy in ("rsi_mean_revert", "rsi"):
624
+ elif strategy == "rsi_mean_revert":
607
625
  delta = close.diff()
608
626
  gain = delta.clip(lower=0).rolling(14).mean()
609
627
  loss = (-delta.clip(upper=0)).rolling(14).mean()
@@ -2955,6 +2973,24 @@ def _walk_forward_backtest(params: dict) -> dict:
2955
2973
  # 25. Peer Comparison (同行对比)
2956
2974
  # ---------------------------------------------------------------------------
2957
2975
 
2976
+ def _dividend_yield_pct(info: dict):
2977
+ """Dividend yield in percent from a yfinance info dict, or None.
2978
+
2979
+ yfinance's ``dividendYield`` is already a percentage (0.32 for AAPL's
2980
+ 0.32%); multiplied by 100 again it showed AAPL at 32% and MSFT at 75%.
2981
+ ``trailingAnnualDividendYield`` is a fraction, and rate / price needs no
2982
+ knowledge of either.
2983
+ """
2984
+ trailing = info.get("trailingAnnualDividendYield")
2985
+ if trailing:
2986
+ return float(trailing) * 100
2987
+ rate = info.get("dividendRate") or info.get("trailingAnnualDividendRate")
2988
+ price = info.get("regularMarketPrice") or info.get("currentPrice") or info.get("previousClose")
2989
+ if rate and price:
2990
+ return float(rate) / float(price) * 100
2991
+ return None
2992
+
2993
+
2958
2994
  def _peer_comparison(params: dict) -> dict:
2959
2995
  """
2960
2996
  同行估值与表现对比。
@@ -3000,7 +3036,7 @@ def _peer_comparison(params: dict) -> dict:
3000
3036
  pe = info.get("trailingPE") or info.get("forwardPE")
3001
3037
  pb = info.get("priceToBook")
3002
3038
  roe = info.get("returnOnEquity")
3003
- dy = info.get("dividendYield")
3039
+ dy = _dividend_yield_pct(info)
3004
3040
  mc = info.get("marketCap")
3005
3041
  ytd = (price / prev - 1) if prev else None
3006
3042
  rows.append({
@@ -3010,7 +3046,7 @@ def _peer_comparison(params: dict) -> dict:
3010
3046
  "pe": round(pe, 1) if pe else None,
3011
3047
  "pb": round(pb, 2) if pb else None,
3012
3048
  "roe_pct": round(roe * 100, 1) if roe else None,
3013
- "div_yield": round(dy * 100, 2) if dy else None,
3049
+ "div_yield": round(dy, 2) if dy else None,
3014
3050
  "market_cap_b": round(mc / 1e9, 1) if mc else None,
3015
3051
  "is_target": sym == symbol,
3016
3052
  })
@@ -3021,20 +3057,39 @@ def _peer_comparison(params: dict) -> dict:
3021
3057
  return {"success": False, "error": "无法获取对比数据"}
3022
3058
 
3023
3059
  # Relative rankings
3024
- pe_vals = [r["pe"] for r in rows if r["pe"] is not None]
3025
- pb_vals = [r["pb"] for r in rows if r["pb"] is not None]
3026
- roe_vals = [r["roe_pct"] for r in rows if r["roe_pct"] is not None]
3027
-
3028
3060
  target_row = next((r for r in rows if r["is_target"]), rows[0])
3061
+ # The peers only. The target was counted among its own peers, so with one
3062
+ # peer the "peer median" PE was the target's own PE and the verdict was
3063
+ # always "fair"; the ROE average was half the target's.
3064
+ others = [r for r in rows if r is not target_row]
3065
+ pe_vals = [r["pe"] for r in others if r["pe"] is not None]
3066
+ roe_vals = [r["roe_pct"] for r in others if r["roe_pct"] is not None]
3067
+ zh = str(params.get("lang", "zh")).lower().startswith("zh")
3068
+
3069
+ def _median(values):
3070
+ ordered = sorted(values)
3071
+ mid = len(ordered) // 2
3072
+ return ordered[mid] if len(ordered) % 2 else (ordered[mid - 1] + ordered[mid]) / 2
3073
+
3029
3074
  analysis = []
3030
3075
  if target_row.get("pe") and pe_vals:
3031
- med_pe = sorted(pe_vals)[len(pe_vals)//2]
3032
- vs = "高估" if target_row["pe"] > med_pe * 1.2 else "低估" if target_row["pe"] < med_pe * 0.8 else "合理"
3033
- analysis.append(f"PE {target_row['pe']:.1f}x vs 同行中位数 {med_pe:.1f}x → {vs}")
3076
+ med_pe = _median(pe_vals)
3077
+ high, low = target_row["pe"] > med_pe * 1.2, target_row["pe"] < med_pe * 0.8
3078
+ if zh:
3079
+ vs = "高估" if high else "低估" if low else "合理"
3080
+ analysis.append(f"PE {target_row['pe']:.1f}x vs 同行中位数 {med_pe:.1f}x → {vs}")
3081
+ else:
3082
+ vs = "above peers" if high else "below peers" if low else "in line"
3083
+ analysis.append(f"PE {target_row['pe']:.1f}x vs peer median {med_pe:.1f}x → {vs}")
3034
3084
  if target_row.get("roe_pct") and roe_vals:
3035
3085
  avg_roe = sum(roe_vals) / len(roe_vals)
3036
- vs = "优于同行" if target_row["roe_pct"] > avg_roe else "低于同行"
3037
- analysis.append(f"ROE {target_row['roe_pct']:.1f}% vs 同行均值 {avg_roe:.1f}% → {vs}")
3086
+ better = target_row["roe_pct"] > avg_roe
3087
+ if zh:
3088
+ analysis.append(f"ROE {target_row['roe_pct']:.1f}% vs 同行均值 {avg_roe:.1f}% → "
3089
+ f"{'优于同行' if better else '低于同行'}")
3090
+ else:
3091
+ analysis.append(f"ROE {target_row['roe_pct']:.1f}% vs peer average {avg_roe:.1f}% → "
3092
+ f"{'above peers' if better else 'below peers'}")
3038
3093
 
3039
3094
  return {
3040
3095
  "success": True,
@@ -3042,6 +3097,7 @@ def _peer_comparison(params: dict) -> dict:
3042
3097
  "peers": peers,
3043
3098
  "table": rows,
3044
3099
  "analysis": analysis,
3100
+ "lang": "zh" if zh else "en",
3045
3101
  "provider": "yfinance",
3046
3102
  }
3047
3103
 
@@ -1309,15 +1309,16 @@ def render_peer_comparison(r: dict, *, console=None, has_rich: bool = True) -> N
1309
1309
  from rich.table import Table
1310
1310
  from rich.rule import Rule
1311
1311
  symbol = r.get("symbol","")
1312
- console.print(Rule(f"[bold]{symbol}[/bold] 同行估值对比", style="dim"))
1312
+ zh = str(r.get("lang", "zh")).lower().startswith("zh")
1313
+ console.print(Rule(f"[bold]{symbol}[/bold] " + ("同行估值对比" if zh else "peer valuation"), style="dim"))
1313
1314
  t = Table(show_header=True, box=None, padding=(0,1))
1314
- t.add_column("代码", style="bold", width=8)
1315
- t.add_column("名称", width=14)
1315
+ t.add_column("代码" if zh else "Symbol", style="bold", width=8)
1316
+ t.add_column("名称" if zh else "Name", width=14)
1316
1317
  t.add_column("PE", justify="right")
1317
1318
  t.add_column("PB", justify="right")
1318
1319
  t.add_column("ROE%", justify="right")
1319
- t.add_column("股息%", justify="right")
1320
- t.add_column("市值(B)", justify="right", style="dim")
1320
+ t.add_column("股息%" if zh else "Div%", justify="right")
1321
+ t.add_column("市值(B)" if zh else "Mkt cap (B)", justify="right", style="dim")
1321
1322
  for row in rows:
1322
1323
  is_t = row.get("is_target", False)
1323
1324
  pe = f"{row['pe']:.1f}" if row.get("pe") else "—"
@@ -1337,7 +1338,8 @@ def render_peer_comparison(r: dict, *, console=None, has_rich: bool = True) -> N
1337
1338
  for line in analysis:
1338
1339
  console.print(f" [dim]▸ {line}[/dim]")
1339
1340
  else:
1340
- print(f"\n{r.get('symbol','')} 同行对比")
1341
+ zh = str(r.get("lang", "zh")).lower().startswith("zh")
1342
+ print(f"\n{r.get('symbol','')} " + ("同行对比" if zh else "peer comparison"))
1341
1343
  for row in rows:
1342
1344
  print(f" {row['symbol']:<8} PE:{row.get('pe','—')} PB:{row.get('pb','—')}")
1343
1345
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.94.0
3
+ Version: 0.95.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
@@ -205,6 +205,7 @@ src/aria_code/apps/cli/tradingview_bridge.py
205
205
  src/aria_code/apps/cli/turn_planning.py
206
206
  src/aria_code/apps/cli/update_check.py
207
207
  src/aria_code/apps/cli/updater.py
208
+ src/aria_code/apps/cli/workspace_route.py
208
209
  src/aria_code/apps/cli/commands/__init__.py
209
210
  src/aria_code/apps/cli/commands/_business_render.py
210
211
  src/aria_code/apps/cli/commands/_ui.py
@@ -546,6 +547,7 @@ tests/test_coder_tool_safety.py
546
547
  tests/test_collaboration.py
547
548
  tests/test_command_loggers.py
548
549
  tests/test_command_safety.py
550
+ tests/test_compare_strategies.py
549
551
  tests/test_completions_builder.py
550
552
  tests/test_config_paths.py
551
553
  tests/test_configured_provider.py
@@ -628,6 +630,7 @@ tests/test_native_installer.py
628
630
  tests/test_natural_language_routing.py
629
631
  tests/test_new_modules.py
630
632
  tests/test_no_hardcoded_developer_paths.py
633
+ tests/test_no_tools_route.py
631
634
  tests/test_no_uncommitted_imports.py
632
635
  tests/test_numeric_listings.py
633
636
  tests/test_ollama_stream_imports.py