aria-code 0.97.0__tar.gz → 0.98.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 (773) hide show
  1. {aria_code-0.97.0/src/aria_code.egg-info → aria_code-0.98.0}/PKG-INFO +1 -1
  2. {aria_code-0.97.0 → aria_code-0.98.0}/pyproject.toml +1 -1
  3. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +51 -92
  5. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/domain/backtest_report.py +39 -10
  6. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/render/output.py +26 -7
  7. {aria_code-0.97.0 → aria_code-0.98.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  8. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code.egg-info/SOURCES.txt +1 -0
  9. aria_code-0.98.0/tests/test_backtest_runs_what_it_names.py +106 -0
  10. {aria_code-0.97.0 → aria_code-0.98.0}/LICENSE +0 -0
  11. {aria_code-0.97.0 → aria_code-0.98.0}/NOTICE +0 -0
  12. {aria_code-0.97.0 → aria_code-0.98.0}/README.md +0 -0
  13. {aria_code-0.97.0 → aria_code-0.98.0}/setup.cfg +0 -0
  14. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/__init__.py +0 -0
  15. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/adk_apps/__init__.py +0 -0
  16. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  17. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  18. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  19. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  20. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/__init__.py +0 -0
  21. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/base.py +0 -0
  22. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/code_review.py +0 -0
  23. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/__init__.py +0 -0
  24. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  25. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/critic.py +0 -0
  26. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/deepen.py +0 -0
  27. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/models.py +0 -0
  28. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  29. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  30. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/themes.py +0 -0
  31. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/deep/tiers.py +0 -0
  32. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  33. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/engineering/coder.py +0 -0
  34. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/engineering/tester.py +0 -0
  35. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/__init__.py +0 -0
  36. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  37. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  38. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  39. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/debate.py +0 -0
  40. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/earnings.py +0 -0
  41. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  42. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/macro.py +0 -0
  43. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/news.py +0 -0
  44. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/risk.py +0 -0
  45. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/sector.py +0 -0
  46. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/strategist.py +0 -0
  47. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  48. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  49. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/financial/technical.py +0 -0
  50. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/orchestrator.py +0 -0
  51. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  52. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/__init__.py +0 -0
  53. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  54. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/business_match.py +0 -0
  55. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  56. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  57. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  58. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  59. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  60. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  61. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  62. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/registry.py +0 -0
  63. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/signal_scheme.py +0 -0
  64. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/sports/__init__.py +0 -0
  65. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  66. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/supervisor.py +0 -0
  67. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/team.py +0 -0
  68. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  69. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  70. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  71. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  72. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  73. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  74. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  75. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  76. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  77. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  78. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  79. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aliyun_data_client.py +0 -0
  80. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/README.md +0 -0
  81. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/__init__.py +0 -0
  82. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/README.md +0 -0
  83. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/__init__.py +0 -0
  84. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/approvals.py +0 -0
  85. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/conversation.py +0 -0
  86. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/digest.py +0 -0
  87. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/intake.py +0 -0
  88. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/registry.py +0 -0
  89. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  90. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/README.md +0 -0
  91. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/__init__.py +0 -0
  92. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/_optional.py +0 -0
  93. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  94. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  95. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/chat_turn.py +0 -0
  96. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  97. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  98. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  99. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  100. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  101. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  102. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  103. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  104. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  105. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  106. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  107. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  108. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  109. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  110. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  111. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  112. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  113. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  114. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  115. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  116. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  117. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  118. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  119. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  120. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  121. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  122. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  123. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  124. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  125. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  126. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  127. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  128. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  129. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  130. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  131. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  132. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  133. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  134. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/config_store.py +0 -0
  135. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/constants.py +0 -0
  136. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/context.py +0 -0
  137. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  138. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/direct.py +0 -0
  139. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/exec_events.py +0 -0
  140. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  141. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  142. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  143. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/google_login.py +0 -0
  144. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  145. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  146. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  147. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  148. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  149. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  150. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  151. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/headless.py +0 -0
  152. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/helpers.py +0 -0
  153. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/hooks.py +0 -0
  154. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/i18n.py +0 -0
  155. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/intent.py +0 -0
  156. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  157. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  158. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  159. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  160. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/main.py +0 -0
  161. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  162. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  163. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  164. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  165. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/mixin_binding.py +0 -0
  166. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  167. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  168. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  169. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  170. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  171. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/preflight.py +0 -0
  172. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  173. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  174. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  175. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  176. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  177. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  178. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  179. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  180. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  181. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  182. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  183. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  184. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  185. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  186. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  187. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  188. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  189. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  190. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  191. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  192. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  193. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  194. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  195. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/session_export.py +0 -0
  196. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  197. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/session_store.py +0 -0
  198. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  199. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/terminal_chrome.py +0 -0
  200. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  201. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  202. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  203. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  204. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  205. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  206. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  207. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  208. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  209. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  210. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  211. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  212. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  213. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/update_check.py +0 -0
  214. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/updater.py +0 -0
  215. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  216. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  217. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/cli/workspace_route.py +0 -0
  218. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/daemon/README.md +0 -0
  219. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/vscode/README.md +0 -0
  220. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/apps/vscode/package.json +0 -0
  221. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_cli.py +0 -0
  222. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_daemon.py +0 -0
  223. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_feishu_bot.py +0 -0
  224. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_mcp_server.py +0 -0
  225. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_relay_client.py +0 -0
  226. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_relay_server.py +0 -0
  227. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/aria_telegram_bot.py +0 -0
  228. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ariarc.py +0 -0
  229. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/artifacts.py +0 -0
  230. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/backtest_engine.py +0 -0
  231. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/backtest_report.py +0 -0
  232. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/__init__.py +0 -0
  233. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/automation.py +0 -0
  234. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/base.py +0 -0
  235. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/capabilities.py +0 -0
  236. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  237. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  238. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  239. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  240. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  241. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  242. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/config.py +0 -0
  243. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  244. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  245. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  246. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  247. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  248. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/paper_broker.py +0 -0
  249. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/planning.py +0 -0
  250. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/registry.py +0 -0
  251. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/brokers/trading.py +0 -0
  252. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/canva_client.py +0 -0
  253. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/change_store.py +0 -0
  254. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/__init__.py +0 -0
  255. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  256. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  257. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/canva_client.py +0 -0
  258. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/figma_client.py +0 -0
  259. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/football_data_client.py +0 -0
  260. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/kling_video_client.py +0 -0
  261. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/market_data_client.py +0 -0
  262. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/openai_image_client.py +0 -0
  263. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/runway_video_client.py +0 -0
  264. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  265. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/cloud_memory.py +0 -0
  266. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/command_safety.py +0 -0
  267. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/computer_use_tools.py +0 -0
  268. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/dashboard_generator.py +0 -0
  269. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/data_analysis_tools.py +0 -0
  270. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/data_cleaner.py +0 -0
  271. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/data_service.py +0 -0
  272. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/__init__.py +0 -0
  273. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/base.py +0 -0
  274. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/router.py +0 -0
  275. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  276. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  277. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  278. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  279. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  280. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  281. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  282. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  283. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  284. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  285. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/demo_player.py +0 -0
  286. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/doctor.py +0 -0
  287. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/domain/__init__.py +0 -0
  288. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/domain/backtest_engine.py +0 -0
  289. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/domain/finance_formulas.py +0 -0
  290. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  291. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/domain/strategy_vault.py +0 -0
  292. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/evals/__init__.py +0 -0
  293. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/evals/harness.py +0 -0
  294. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/evals/runner.py +0 -0
  295. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/external_agent_runner.py +0 -0
  296. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/figma_client.py +0 -0
  297. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/file_analysis_tools.py +0 -0
  298. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/finance_formulas.py +0 -0
  299. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/football_data_client.py +0 -0
  300. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/image_gen_tools.py +0 -0
  301. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/intent_classifier.py +0 -0
  302. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/kling_video_client.py +0 -0
  303. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/licensing.py +0 -0
  304. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/local_finance_tools.py +0 -0
  305. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/local_image_provider.py +0 -0
  306. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/local_llm_provider.py +0 -0
  307. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/macro_tools.py +0 -0
  308. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/markdown_pdf.py +0 -0
  309. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/market_data_client.py +0 -0
  310. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/mcp_client.py +0 -0
  311. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/memory_manager.py +0 -0
  312. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/model_capability.py +0 -0
  313. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/notification_tools.py +0 -0
  314. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/openai_image_client.py +0 -0
  315. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/__init__.py +0 -0
  316. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  317. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  318. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  319. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  320. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  321. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  322. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  323. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_core/export.py +0 -0
  324. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  325. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  326. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  327. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  328. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  329. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  330. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  331. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  332. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  333. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  334. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  335. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  336. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  337. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  338. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  339. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  340. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  341. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  342. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  343. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  344. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  345. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/context.py +0 -0
  346. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  347. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/data.py +0 -0
  348. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  349. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/references.py +0 -0
  350. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  351. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  352. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  353. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  354. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  355. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  356. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  357. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  358. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  359. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  360. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  361. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  362. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  363. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  364. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  365. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  366. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  367. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  368. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  369. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  370. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  371. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  372. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  373. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  374. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  375. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  376. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  377. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  378. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  379. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  380. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  381. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  382. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  383. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  384. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  385. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  386. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  387. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  388. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  389. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  390. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/__init__.py +0 -0
  391. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/base.py +0 -0
  392. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/finance/__init__.py +0 -0
  393. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  394. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/payments/__init__.py +0 -0
  395. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/realty/__init__.py +0 -0
  396. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/registry.py +0 -0
  397. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/packs/rules.py +0 -0
  398. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/plan_utils.py +0 -0
  399. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/plugin_loader.py +0 -0
  400. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/portfolio_ledger.py +0 -0
  401. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/preview_server.py +0 -0
  402. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/privacy/__init__.py +0 -0
  403. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/privacy/feedback.py +0 -0
  404. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/project_review.py +0 -0
  405. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/project_review_api.py +0 -0
  406. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/project_review_server.py +0 -0
  407. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/project_tools.py +0 -0
  408. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/__init__.py +0 -0
  409. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/__init__.py +0 -0
  410. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  411. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  412. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/base.py +0 -0
  413. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/custom.py +0 -0
  414. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/ollama.py +0 -0
  415. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  416. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/llm/registry.py +0 -0
  417. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/local_image_provider.py +0 -0
  418. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  419. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/providers/tool_messages.py +0 -0
  420. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/realty_data_tools.py +0 -0
  421. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/relay_store.py +0 -0
  422. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/report_exporters.py +0 -0
  423. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/report_generator.py +0 -0
  424. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/review_service.py +0 -0
  425. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/__init__.py +0 -0
  426. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/acceptance.py +0 -0
  427. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/agent_loop.py +0 -0
  428. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/approval.py +0 -0
  429. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/budget.py +0 -0
  430. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/checkpoints.py +0 -0
  431. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/crash_report.py +0 -0
  432. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/events.py +0 -0
  433. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/gateway.py +0 -0
  434. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/lsp.py +0 -0
  435. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/orchestrator.py +0 -0
  436. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/processes.py +0 -0
  437. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/repo_map.py +0 -0
  438. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/run_state.py +0 -0
  439. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/run_store.py +0 -0
  440. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/self_healing.py +0 -0
  441. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/subagent.py +0 -0
  442. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/task_ledger.py +0 -0
  443. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  444. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/tool_executor.py +0 -0
  445. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/tool_policy.py +0 -0
  446. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runtime/worktrees.py +0 -0
  447. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/runway_video_client.py +0 -0
  448. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/safety/__init__.py +0 -0
  449. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/safety/permissions.py +0 -0
  450. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/safety/sandbox.py +0 -0
  451. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/safety/service.py +0 -0
  452. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/setup_wizard.py +0 -0
  453. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/spreadsheet_tools.py +0 -0
  454. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/strategy_vault.py +0 -0
  455. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/__init__.py +0 -0
  456. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/artifact_tools.py +0 -0
  457. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/broker_tools.py +0 -0
  458. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  459. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  460. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  461. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  462. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  463. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/extended_tools.py +0 -0
  464. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  465. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  466. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  467. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  468. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  469. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/logistics_io.py +0 -0
  470. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  471. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/logistics_tools.py +0 -0
  472. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/macro_tools.py +0 -0
  473. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/notification_tools.py +0 -0
  474. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/project_tools.py +0 -0
  475. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  476. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  477. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/tools/stripe_tools.py +0 -0
  478. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/__init__.py +0 -0
  479. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/banner.py +0 -0
  480. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/completer.py +0 -0
  481. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/console.py +0 -0
  482. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/image_render.py +0 -0
  483. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/input_box.py +0 -0
  484. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/mentions.py +0 -0
  485. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/picker.py +0 -0
  486. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/render/__init__.py +0 -0
  487. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/render/finance.py +0 -0
  488. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/render/market.py +0 -0
  489. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/render/responsive.py +0 -0
  490. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/render/team.py +0 -0
  491. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/robot.py +0 -0
  492. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  493. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/utils/vscode_uri.py +0 -0
  494. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/video_analysis.py +0 -0
  495. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/video_editor.py +0 -0
  496. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace/__init__.py +0 -0
  497. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace/files.py +0 -0
  498. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace/verify.py +0 -0
  499. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace_changes.py +0 -0
  500. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace_context.py +0 -0
  501. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace_service.py +0 -0
  502. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code/workspace_tools.py +0 -0
  503. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  504. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  505. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code.egg-info/requires.txt +0 -0
  506. {aria_code-0.97.0 → aria_code-0.98.0}/src/aria_code.egg-info/top_level.txt +0 -0
  507. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_adk_market_tools.py +0 -0
  508. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_agent_key_points_language.py +0 -0
  509. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_agent_team_fallback.py +0 -0
  510. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_analyze_file_tool.py +0 -0
  511. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_architecture_ledger_is_true.py +0 -0
  512. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_architecture_report.py +0 -0
  513. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_aria_cli_core.py +0 -0
  514. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_aria_mcp_server.py +0 -0
  515. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_aria_sdk.py +0 -0
  516. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_artifact_publishing.py +0 -0
  517. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_artifacts_and_reports.py +0 -0
  518. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ashare_prediction_cmds.py +0 -0
  519. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_background_processes.py +0 -0
  520. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_backtest_cmds.py +0 -0
  521. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_backtest_engine.py +0 -0
  522. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_backtest_report.py +0 -0
  523. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  524. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_broken_akshare_is_optional.py +0 -0
  525. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_broker_automation.py +0 -0
  526. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  527. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_broker_planning.py +0 -0
  528. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_broker_safety.py +0 -0
  529. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_broker_tools.py +0 -0
  530. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_budget.py +0 -0
  531. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_business_workflow_cmds.py +0 -0
  532. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_canva_client.py +0 -0
  533. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_canvas_cmds.py +0 -0
  534. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_card_approvals.py +0 -0
  535. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_channel_intake.py +0 -0
  536. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_channels.py +0 -0
  537. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_chart_handlers.py +0 -0
  538. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_chat_bots_fail_closed.py +0 -0
  539. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_chat_routing.py +0 -0
  540. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ci_security_workflow.py +0 -0
  541. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_app_split.py +0 -0
  542. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_bootstrap.py +0 -0
  543. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_config_store.py +0 -0
  544. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  545. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_runtime_consumer.py +0 -0
  546. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_tool_executor_module.py +0 -0
  547. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cli_updater.py +0 -0
  548. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_cloud_memory.py +0 -0
  549. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_code_audit_tools.py +0 -0
  550. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_code_review_agent.py +0 -0
  551. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_codegen_output.py +0 -0
  552. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_coder_tester_self_healing.py +0 -0
  553. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_coder_tool_safety.py +0 -0
  554. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_collaboration.py +0 -0
  555. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_command_loggers.py +0 -0
  556. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_command_safety.py +0 -0
  557. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_compare_strategies.py +0 -0
  558. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_completions_builder.py +0 -0
  559. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_config_paths.py +0 -0
  560. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_configured_provider.py +0 -0
  561. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_container_entrypoint.py +0 -0
  562. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_container_entrypoints.py +0 -0
  563. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_context_checkpoints.py +0 -0
  564. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_context_references.py +0 -0
  565. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_context_service.py +0 -0
  566. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_conversation_core.py +0 -0
  567. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_crash_report.py +0 -0
  568. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_credential_file_permissions.py +0 -0
  569. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_custom_providers.py +0 -0
  570. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_daemon_gateway_config.py +0 -0
  571. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_dashboard_generator.py +0 -0
  572. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_data_service.py +0 -0
  573. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_data_service_imports.py +0 -0
  574. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_data_without_model.py +0 -0
  575. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_datasource_routing.py +0 -0
  576. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_deep_analysis.py +0 -0
  577. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_degrades_without_quant_engine.py +0 -0
  578. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  579. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_doctor.py +0 -0
  580. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  581. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_doctor_npm_scope.py +0 -0
  582. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_edit_and_command_safety.py +0 -0
  583. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_engine_boundary.py +0 -0
  584. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_enterprise_tool_honesty.py +0 -0
  585. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_env_switch_docs.py +0 -0
  586. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_evals_harness.py +0 -0
  587. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_event_import_roots.py +0 -0
  588. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_exec_events.py +0 -0
  589. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_extended_tools.py +0 -0
  590. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_feishu_swarm_config.py +0 -0
  591. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_file_links.py +0 -0
  592. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_finalize_release.py +0 -0
  593. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_finance_renderers.py +0 -0
  594. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_finance_service_catalog.py +0 -0
  595. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_first_run_output.py +0 -0
  596. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_first_run_works.py +0 -0
  597. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_football_agent.py +0 -0
  598. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_football_prediction_output.py +0 -0
  599. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_google_cloud_models.py +0 -0
  600. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_google_cloud_routing.py +0 -0
  601. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_google_login.py +0 -0
  602. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_google_search_provider.py +0 -0
  603. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_headless_is_agentic.py +0 -0
  604. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_honest_surfaces.py +0 -0
  605. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_image_gen_tools.py +0 -0
  606. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_image_inputs.py +0 -0
  607. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_import_graph_budget.py +0 -0
  608. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_intent_router.py +0 -0
  609. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_intent_signals.py +0 -0
  610. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_kling_video_client.py +0 -0
  611. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_lazy_rebind.py +0 -0
  612. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_legacy_module_imports.py +0 -0
  613. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_license_consistency.py +0 -0
  614. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_licensing.py +0 -0
  615. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_local_image_provider.py +0 -0
  616. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_logistics_3pl.py +0 -0
  617. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_logistics_and_finance_agents.py +0 -0
  618. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_lsp.py +0 -0
  619. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_markdown_pdf.py +0 -0
  620. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_answers_in_english.py +0 -0
  621. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_data_client.py +0 -0
  622. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_history_inheritance.py +0 -0
  623. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_history_tool.py +0 -0
  624. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_hours.py +0 -0
  625. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_questions_on_backend.py +0 -0
  626. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_symbol_extraction.py +0 -0
  627. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_market_universe.py +0 -0
  628. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_mcp_circuit.py +0 -0
  629. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_mcp_client.py +0 -0
  630. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_mentions.py +0 -0
  631. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_model_capability_registry.py +0 -0
  632. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_model_choice_is_the_users.py +0 -0
  633. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_model_selection_state.py +0 -0
  634. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_narrow_chinese_output.py +0 -0
  635. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_native_binary_entrypoints.py +0 -0
  636. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_native_installer.py +0 -0
  637. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_natural_language_routing.py +0 -0
  638. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_new_modules.py +0 -0
  639. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  640. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_no_tools_route.py +0 -0
  641. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_no_uncommitted_imports.py +0 -0
  642. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_numeric_listings.py +0 -0
  643. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ollama_stream_imports.py +0 -0
  644. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ollama_stream_tools.py +0 -0
  645. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_openai_image_client.py +0 -0
  646. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_operations_suite.py +0 -0
  647. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_os_sandbox.py +0 -0
  648. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_output_rendering.py +0 -0
  649. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_packages_facade.py +0 -0
  650. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_packaging_constraints.py +0 -0
  651. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_packaging_manifest.py +0 -0
  652. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_packs_domains.py +0 -0
  653. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_pdf_report.py +0 -0
  654. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_pick_best_installed_model.py +0 -0
  655. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_plan_mode.py +0 -0
  656. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_platform_package_assembly.py +0 -0
  657. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_platform_packages.py +0 -0
  658. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_platform_publish.py +0 -0
  659. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_plotly_html_output.py +0 -0
  660. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_portfolio_language.py +0 -0
  661. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_portfolio_ledger.py +0 -0
  662. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_post_turn_context_decision.py +0 -0
  663. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_preflight.py +0 -0
  664. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_preview_server.py +0 -0
  665. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_privacy_feedback.py +0 -0
  666. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_project_aria.py +0 -0
  667. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_project_context_files.py +0 -0
  668. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_project_review.py +0 -0
  669. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_project_review_api.py +0 -0
  670. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_prompt_assembly.py +0 -0
  671. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_prompt_selection.py +0 -0
  672. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_provider_autoconfig.py +0 -0
  673. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_provider_error_messages.py +0 -0
  674. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_provider_integration.py +0 -0
  675. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_provider_registry.py +0 -0
  676. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_public_service_status.py +0 -0
  677. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_quant_engine_namespace.py +0 -0
  678. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_rebind_contract.py +0 -0
  679. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_rebind_namespace_contract.py +0 -0
  680. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_relay_client_credentials.py +0 -0
  681. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_relay_event_verification.py +0 -0
  682. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_relay_sends_for_clients.py +0 -0
  683. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_relay_store.py +0 -0
  684. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_relay_url.py +0 -0
  685. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_release_chain.py +0 -0
  686. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_release_commit_identity.py +0 -0
  687. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_release_push_is_atomic.py +0 -0
  688. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_release_reaches_the_registries.py +0 -0
  689. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_release_verification_waits.py +0 -0
  690. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_release_workflow_permissions.py +0 -0
  691. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_report_charts.py +0 -0
  692. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_report_generator.py +0 -0
  693. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_research_protocol.py +0 -0
  694. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_research_quality.py +0 -0
  695. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_responsive_rendering.py +0 -0
  696. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_review_service.py +0 -0
  697. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_root_module_budget.py +0 -0
  698. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  699. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_acceptance.py +0 -0
  700. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_agent_loop.py +0 -0
  701. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_approval.py +0 -0
  702. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_bridge.py +0 -0
  703. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_bridge_fallback.py +0 -0
  704. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_checkpoints.py +0 -0
  705. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_event_identity.py +0 -0
  706. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_gateway.py +0 -0
  707. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_repo_map.py +0 -0
  708. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_run_store.py +0 -0
  709. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_tool_executor.py +0 -0
  710. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runtime_worktrees.py +0 -0
  711. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_runway_video_client.py +0 -0
  712. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_safety_permissions.py +0 -0
  713. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_safety_service.py +0 -0
  714. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_safety_service_adoption.py +0 -0
  715. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_service_diagnostics_security.py +0 -0
  716. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_session_search.py +0 -0
  717. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_settings_service.py +0 -0
  718. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_shell_commands_as_written.py +0 -0
  719. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_shipper_digest.py +0 -0
  720. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_single_import_root.py +0 -0
  721. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_skill_agent_binding.py +0 -0
  722. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_skill_catalog.py +0 -0
  723. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_skill_loader.py +0 -0
  724. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_slash_popup.py +0 -0
  725. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_spreadsheet_tools.py +0 -0
  726. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_sse_stream_contract.py +0 -0
  727. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_startup_dashboard.py +0 -0
  728. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_startup_latency.py +0 -0
  729. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_status_language.py +0 -0
  730. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_streaming_pipeline.py +0 -0
  731. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_stripe_agent.py +0 -0
  732. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_subagent.py +0 -0
  733. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_supervisor_routing.py +0 -0
  734. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_system_prompts.py +0 -0
  735. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_system_tools_output.py +0 -0
  736. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_task_orchestrator.py +0 -0
  737. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_team_analysts.py +0 -0
  738. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_team_synthesis.py +0 -0
  739. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_terminal_mixins.py +0 -0
  740. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_terminal_snapshots.py +0 -0
  741. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_tls_trust_store.py +0 -0
  742. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_tool_policy.py +0 -0
  743. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  744. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_tool_scope.py +0 -0
  745. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_tool_step_output.py +0 -0
  746. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_trading_service.py +0 -0
  747. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_tradingview_bridge.py +0 -0
  748. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_turn_planning.py +0 -0
  749. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ui_completer_references.py +0 -0
  750. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ui_console_theme.py +0 -0
  751. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ui_input_box.py +0 -0
  752. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ui_language_and_model.py +0 -0
  753. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_ui_robot_banner.py +0 -0
  754. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_update_health_routes.py +0 -0
  755. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_verification_hint.py +0 -0
  756. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_verification_policy.py +0 -0
  757. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_version_consistency.py +0 -0
  758. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_version_counter.py +0 -0
  759. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_video_analysis.py +0 -0
  760. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_video_editor.py +0 -0
  761. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_vscode_mcp.py +0 -0
  762. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_warehouse_agents.py +0 -0
  763. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_warehouse_cli_registration.py +0 -0
  764. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_warehouse_erp_client.py +0 -0
  765. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_warehouse_workflow.py +0 -0
  766. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_wheel_is_installable.py +0 -0
  767. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_workspace_changes.py +0 -0
  768. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_workspace_context.py +0 -0
  769. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_workspace_files.py +0 -0
  770. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_workspace_scope.py +0 -0
  771. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_workspace_service.py +0 -0
  772. {aria_code-0.97.0 → aria_code-0.98.0}/tests/test_workspace_verify.py +0 -0
  773. {aria_code-0.97.0 → aria_code-0.98.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.97.0
3
+ Version: 0.98.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.97.0"
7
+ version = "0.98.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.97.0"
20
+ __version__ = "0.98.0"
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
  from typing import Any
9
9
 
10
10
  from ._ui import has_rich, print_error
11
+ from aria_code.apps.cli.i18n import ui_text
11
12
 
12
13
 
13
14
  def format_backtest_data_error(
@@ -278,11 +279,19 @@ class BacktestCommandsMixin:
278
279
  else:
279
280
  _resolved_start = None
280
281
 
281
- _known_strategies = {"momentum", "mom", "sma_cross", "ma_cross", "moving_average",
282
- "buy_hold", "buyhold", "hold", "ml", "ml_signal", "agent"}
283
- if len(parts) == 1 and parts[0].lower() not in _known_strategies:
282
+ from backtest_report import STRATEGY_ALIASES as _STRATEGY_ALIASES
283
+ _known_strategies = set(_STRATEGY_ALIASES) | {"ml", "ml_signal", "agent"}
284
+
285
+ def _is_strategy(token: str) -> bool:
286
+ return token.lower().replace("-", "_") in _known_strategies
287
+
288
+ if len(parts) == 1 and not _is_strategy(parts[0]):
284
289
  strategy = "momentum"
285
290
  symbol = parts[0].upper()
291
+ elif len(parts) > 1 and not _is_strategy(parts[0]) and _is_strategy(parts[1]):
292
+ # "/backtest AAPL sma": symbol first. It ran strategy "AAPL" on the
293
+ # ticker SMA, an unknown name that then fell through to buy-and-hold.
294
+ strategy, symbol = parts[1], parts[0].upper()
286
295
  else:
287
296
  strategy = parts[0] if len(parts) > 0 else "momentum"
288
297
  symbol = parts[1].upper() if len(parts) > 1 else "SPY"
@@ -306,6 +315,12 @@ class BacktestCommandsMixin:
306
315
  end_date = (_raw_end if _raw_end and _date_re.match(_raw_end) else None) \
307
316
  or today.isoformat()
308
317
 
318
+ if not _is_strategy(strategy):
319
+ print_error(self.context,
320
+ ui_text(self, f"未知策略:{strategy}", f"Unknown strategy: {strategy}"),
321
+ "momentum · sma_cross (sma) · buy_hold · ml · agent — /backtest sma AAPL")
322
+ return
323
+
309
324
  # ── ML 信号组合回测 ──────────────────────────────────────────────────
310
325
  if strategy.lower() in ("ml", "ml_signal"):
311
326
  await self._cmd_ml_signal_backtest(parts[1:], start_date=start_date,
@@ -353,14 +368,21 @@ class BacktestCommandsMixin:
353
368
  logger.debug("local backtest failed, falling back to yfinance direct: %s", _e)
354
369
 
355
370
  # ── Direct yfinance backtest — works offline, no backend needed ──
371
+ # Bars found, for a precise error message. Set before the import:
372
+ # inside the try, a missing yfinance left it unset and the error
373
+ # path below raised UnboundLocalError instead of reporting.
374
+ _yf_bars = [0]
356
375
  try:
357
376
  import yfinance as _yf
358
- import numpy as _np
359
- import statistics as _stats
360
377
 
361
- _yf_bars = [0] # records bars found, for a precise error message
362
378
 
363
379
  def _run_yf_backtest():
380
+ # Prices straight from yfinance, run through the same engine
381
+ # as the main path. This had its own engine, which ran
382
+ # momentum whatever strategy was asked for, counted buys and
383
+ # sells as separate trades and called the share of up days
384
+ # the win rate.
385
+ from backtest_report import run_backtest_from_history
364
386
  _ticker = _yf.Ticker(symbol)
365
387
  _df = _ticker.history(start=start_date, end=end_date, auto_adjust=True)
366
388
  if _df is None or _df.empty:
@@ -370,95 +392,24 @@ class BacktestCommandsMixin:
370
392
  end_date=end_date,
371
393
  bars=0,
372
394
  ), "bars": 0}
373
- _close = _df["Close"].dropna()
374
- _yf_bars[0] = len(_close)
375
- if len(_close) < 5:
395
+ _rows = [{"date": str(idx.date()), "close": float(row["Close"]),
396
+ "volume": float(row["Volume"]) if "Volume" in row and row["Volume"] == row["Volume"] else None}
397
+ for idx, row in _df.iterrows() if row["Close"] == row["Close"]]
398
+ _yf_bars[0] = len(_rows)
399
+ _res = run_backtest_from_history(_rows, local_config)
400
+ if not _res.get("success"):
401
+ if "Unknown strategy" in str(_res.get("error", "")):
402
+ return _res
376
403
  return {"success": False, "error": format_backtest_data_error(
377
404
  symbol,
378
405
  start_date=start_date,
379
406
  end_date=end_date,
380
407
  bars=_yf_bars[0],
381
408
  ), "bars": _yf_bars[0]}
382
- _prices = list(_close)
383
- n = len(_prices)
384
- # Momentum strategy: buy when N-day momentum > 0
385
- _mp = int(_momentum_period)
386
- _signals = [0] * n
387
- for i in range(_mp, n):
388
- _signals[i] = 1 if _prices[i] > _prices[i - _mp] else -1
389
- # Simulate portfolio
390
- _cap = float(_initial_capital)
391
- _position = 0.0 # shares
392
- _cash = _cap
393
- _trades = 0
394
- _portfolio = []
395
- for i in range(1, n):
396
- _p = _prices[i]
397
- _sig = _signals[i - 1]
398
- if _sig == 1 and _position == 0 and _cash > 0:
399
- _shares = _cash / _p
400
- _position = _shares
401
- _cash = 0
402
- _trades += 1
403
- elif _sig == -1 and _position > 0:
404
- _cash = _position * _p
405
- _position = 0
406
- _trades += 1
407
- _portfolio.append(_cash + _position * _p)
408
- if not _portfolio:
409
- return None
410
- _final = _portfolio[-1]
411
- _total_return = (_final - _cap) / _cap
412
- _bh_return = (_prices[-1] - _prices[0]) / _prices[0]
413
- # Daily returns for Sharpe
414
- _rets = [(_portfolio[i] - _portfolio[i-1]) / _portfolio[i-1] for i in range(1, len(_portfolio)) if _portfolio[i-1] > 0]
415
- _ann_return = sum(_rets) / len(_rets) * 252 if _rets else 0
416
- _ann_vol = _stats.stdev(_rets) * (252 ** 0.5) if len(_rets) > 1 else 0
417
- _sharpe = _ann_return / _ann_vol if _ann_vol > 0 else 0
418
- # Max drawdown
419
- _peak = _portfolio[0]
420
- _max_dd = 0.0
421
- for v in _portfolio:
422
- if v > _peak:
423
- _peak = v
424
- _dd = (_peak - v) / _peak if _peak > 0 else 0
425
- if _dd > _max_dd:
426
- _max_dd = _dd
427
- # Equity curve (sampled monthly)
428
- _step = max(1, n // 24)
429
- _equity_curve = [
430
- {"date": str(_close.index[min(i + 1, n - 1)].date()), "strategy": round(_portfolio[min(i, len(_portfolio)-1)], 2)}
431
- for i in range(0, len(_portfolio), _step)
432
- ]
433
- _win_trades = sum(1 for i in range(1, len(_portfolio)) if _portfolio[i] > _portfolio[i-1])
434
- _vol = _df["Volume"].dropna() if "Volume" in _df else []
435
- _vol_count = len(_vol) if hasattr(_vol, "__len__") else 0
436
- return {
437
- "success": True,
438
- "symbol": symbol,
439
- "strategy": strategy,
440
- "total_return": round(_total_return, 4),
441
- "buy_hold_return": round(_bh_return, 4),
442
- "annualized_return": round(_ann_return, 4),
443
- "sharpe_ratio": round(_sharpe, 3),
444
- "max_drawdown": round(-_max_dd, 4),
445
- "win_rate": round(_win_trades / max(len(_portfolio) - 1, 1), 3),
446
- "num_trades": _trades,
447
- "equity_curve": _equity_curve,
448
- "data_provider": "yfinance",
449
- "provider_chain": ["yfinance"],
450
- "start_date": start_date,
451
- "end_date": end_date,
452
- "initial_capital": float(_initial_capital),
453
- "bars": n,
454
- "volume_summary": {
455
- "last": round(float(_vol.iloc[-1]), 2) if _vol_count else None,
456
- "average": round(float(_vol.mean()), 2) if _vol_count else None,
457
- "min": round(float(_vol.min()), 2) if _vol_count else None,
458
- "max": round(float(_vol.max()), 2) if _vol_count else None,
459
- "coverage": round(_vol_count / max(len(_df), 1), 4),
460
- },
461
- }
409
+ _res.update({"data_provider": "yfinance", "provider_chain": ["yfinance"],
410
+ "num_trades": _res.get("total_trades", 0),
411
+ "start_date": start_date, "end_date": end_date})
412
+ return _res
462
413
 
463
414
  yf_result = await asyncio.get_event_loop().run_in_executor(None, _run_yf_backtest)
464
415
  if yf_result and yf_result.get("success"):
@@ -546,8 +497,11 @@ class BacktestCommandsMixin:
546
497
  for r in rows:
547
498
  tbl.add_row(*r)
548
499
  self.context.console.print(tbl)
549
- self.context.console.print(
550
- f" [bold]{self._bt_result_summary(d, lang=self.terminal.config.get('ui_lang', 'en') or 'en')}[/bold]")
500
+ # Wrapped lines stay beside " ", not at column 0.
501
+ from aria_code.ui.render.output import print_hanging
502
+ print_hanging(self.context.console, " ",
503
+ self._bt_result_summary(d, lang=self.terminal.config.get('ui_lang', 'en') or 'en'),
504
+ "bold")
551
505
 
552
506
  actual_start = self._bt_value(d, "start", "start_date", default=start_date)
553
507
  actual_end = self._bt_value(d, "end", "end_date", default=end_date)
@@ -561,12 +515,17 @@ class BacktestCommandsMixin:
561
515
  from rich.table import Table
562
516
  from rich.text import Text
563
517
  from aria_code.ui.render.output import file_uri
518
+ from backtest_report import normalize_strategy as _normalize_strategy
564
519
 
565
520
  facts: list[tuple[str, object]] = [
566
521
  ("source", src),
567
522
  ("period", f"{actual_start} → {actual_end} · {bars} bars"),
568
523
  ("capital", initial),
569
- ("params", f"momentum={_momentum_period} fast={_fast_period} slow={_slow_period}"),
524
+ # The parameters the strategy used: SMA showed momentum=20.
525
+ ("params", {
526
+ "momentum": f"momentum={_momentum_period}",
527
+ "sma_cross": f"fast={_fast_period} slow={_slow_period}",
528
+ }.get(_normalize_strategy(strategy) or "", "—")),
570
529
  ]
571
530
  if d.get("provider_chain"):
572
531
  chain = " → ".join(str(x) for x in d.get("provider_chain") or [])
@@ -93,19 +93,36 @@ def _sma(values: Sequence[float], window: int) -> List[Optional[float]]:
93
93
  return out
94
94
 
95
95
 
96
+ # Every name accepted, mapped to the strategy it runs.
97
+ STRATEGY_ALIASES = {
98
+ "buy_hold": "buy_hold", "buyhold": "buy_hold", "hold": "buy_hold", "buy_and_hold": "buy_hold",
99
+ "sma_cross": "sma_cross", "ma_cross": "sma_cross", "moving_average": "sma_cross", "sma": "sma_cross",
100
+ "sma_crossover": "sma_cross", "ma_crossover": "sma_cross",
101
+ "momentum": "momentum", "mom": "momentum",
102
+ }
103
+
104
+
105
+ def normalize_strategy(name: str) -> Optional[str]:
106
+ """The strategy a name runs, or None if there is no such strategy."""
107
+ return STRATEGY_ALIASES.get((name or "momentum").lower().replace("-", "_").replace(" ", "_"))
108
+
109
+
96
110
  def _signals(strategy: str, closes: Sequence[float], fast: int, slow: int, momentum_period: int) -> List[int]:
97
- strategy = (strategy or "momentum").lower().replace("-", "_").replace(" ", "_")
111
+ known = normalize_strategy(strategy)
112
+ if known is None:
113
+ # Any other name used to fall through to buy-and-hold and be reported
114
+ # under the name asked for: "/backtest sma AAPL" was buy-and-hold.
115
+ raise ValueError(f"Unknown strategy '{strategy}'. Available: momentum, sma_cross (sma), buy_hold")
116
+ strategy = known
98
117
  n = len(closes)
99
- if strategy in ("buy_hold", "buyhold", "hold"):
118
+ if strategy == "buy_hold":
100
119
  return [1] * n
101
- if strategy in ("sma_cross", "ma_cross", "moving_average"):
120
+ if strategy == "sma_cross":
102
121
  fast_ma = _sma(closes, max(2, fast))
103
122
  slow_ma = _sma(closes, max(max(3, slow), fast + 1))
104
123
  return [1 if f is not None and s is not None and f > s else 0 for f, s in zip(fast_ma, slow_ma)]
105
- if strategy in ("momentum", "mom"):
106
- period = max(2, momentum_period)
107
- return [1 if i >= period and closes[i] > closes[i - period] else 0 for i in range(n)]
108
- return [1] * n
124
+ period = max(2, momentum_period)
125
+ return [1 if i >= period and closes[i] > closes[i - period] else 0 for i in range(n)]
109
126
 
110
127
 
111
128
  def _max_drawdown(values: Sequence[float]) -> float:
@@ -142,7 +159,10 @@ def run_backtest_from_history(history: Sequence[Dict[str, Any]], config: Backtes
142
159
  closes = [float(r["close"]) for r in rows]
143
160
  volumes = [_as_float(r.get("volume")) for r in rows]
144
161
  valid_volumes = [v for v in volumes if v is not None and v >= 0]
145
- signals = _signals(config.strategy, closes, config.fast_period, config.slow_period, config.momentum_period)
162
+ try:
163
+ signals = _signals(config.strategy, closes, config.fast_period, config.slow_period, config.momentum_period)
164
+ except ValueError as exc:
165
+ return {"success": False, "symbol": config.symbol, "strategy": config.strategy, "error": str(exc)}
146
166
 
147
167
  initial = float(config.initial_capital or 100000.0)
148
168
  equity = [initial]
@@ -151,12 +171,18 @@ def run_backtest_from_history(history: Sequence[Dict[str, Any]], config: Backtes
151
171
  daily_benchmark_returns = [0.0]
152
172
  trades = 0
153
173
  previous_position = 0
174
+ trade_results: List[float] = [] # return of each round trip
175
+ entry_equity = None
154
176
 
155
177
  for i in range(1, len(closes)):
156
178
  day_return = closes[i] / closes[i - 1] - 1.0
157
179
  position = signals[i - 1] # shift one day to avoid look-ahead bias
158
180
  if position == 1 and previous_position == 0:
159
181
  trades += 1
182
+ entry_equity = equity[-1]
183
+ elif position == 0 and previous_position == 1 and entry_equity:
184
+ trade_results.append(equity[-1] / entry_equity - 1.0)
185
+ entry_equity = None
160
186
  previous_position = position
161
187
  strategy_return = day_return * position
162
188
  daily_strategy_returns.append(strategy_return)
@@ -171,8 +197,11 @@ def run_backtest_from_history(history: Sequence[Dict[str, Any]], config: Backtes
171
197
  annualized_return = (1.0 + total_return) ** (1.0 / years) - 1.0 if total_return > -1 else -1.0
172
198
  volatility = _stddev(daily_strategy_returns[1:]) * math.sqrt(252)
173
199
  sharpe = (sum(daily_strategy_returns[1:]) / max(len(daily_strategy_returns) - 1, 1)) / _stddev(daily_strategy_returns[1:]) * math.sqrt(252) if _stddev(daily_strategy_returns[1:]) > 0 else 0.0
174
- active_returns = [r for r, s in zip(daily_strategy_returns[1:], signals[:-1]) if s == 1]
175
- win_rate = sum(1 for r in active_returns if r > 0) / len(active_returns) if active_returns else 0.0
200
+ if entry_equity:
201
+ trade_results.append(equity[-1] / entry_equity - 1.0) # still open: marked at the last close
202
+ # Winning trades over trades. This was the share of up days while holding,
203
+ # so one buy-and-hold "trade" showed a 52.5% win rate.
204
+ win_rate = sum(1 for r in trade_results if r > 0) / len(trade_results) if trade_results else 0.0
176
205
 
177
206
  curve = [
178
207
  {
@@ -281,17 +281,23 @@ def error_hint(error: str, context: str = "") -> str:
281
281
  "http://", "https://", "www.", ".com", ".org", ".net",
282
282
  "web_fetch", "web fetch", "forbidden",
283
283
  ))
284
- if "401" in err_lower or "unauthorized" in err_lower:
284
+ def code(n: str) -> bool:
285
+ # A status code as a number of its own: "1500 bars" is not a 500.
286
+ return re.search(rf"(?<!\d){n}(?!\d)", err_lower) is not None
287
+
288
+ if code("401") or "unauthorized" in err_lower:
285
289
  if any(h in err_lower for h in ("finnhub", "alphavantage", "polygon", "api/v1", "api/v2/finance")):
286
290
  return "Hint: API key required — /apikey set finnhub <KEY> (free at finnhub.io)"
287
291
  if _is_web:
288
292
  return "Hint: This site blocks automated access (paywall/anti-bot). Try another source."
289
293
  return "Hint: Authentication required. Run /login to sign in."
290
- if "403" in err_lower or "forbidden" in err_lower:
294
+ if code("403") or "forbidden" in err_lower:
291
295
  if _is_web:
292
296
  return "Hint: This site blocks automated access (paywall/anti-bot). Try another source."
293
297
  return "Hint: Access denied. Check your API key or subscription."
294
- if "429" in err_lower or "rate" in err_lower:
298
+ # "rate" alone matched strategy, generate and separate: "Unknown strategy"
299
+ # came with "Rate limited. Wait a moment and try again."
300
+ if code("429") or re.search(r"rate[\s_-]?limit|too many requests", err_lower):
295
301
  return "Hint: Rate limited. Wait a moment and try again."
296
302
  if ("ollama" in err_lower or "ollama http" in err_lower) and (
297
303
  "not found" in err_lower or "404" in err_lower
@@ -319,15 +325,15 @@ def error_hint(error: str, context: str = "") -> str:
319
325
  if "file not found" in err_lower or "no such file" in err_lower:
320
326
  return ("Hint: This file does not exist. Do NOT guess other filenames — "
321
327
  "list the directory first, or this question may not need a file at all.")
322
- if "404" in err_lower and context == "tool":
328
+ if code("404") and context == "tool":
323
329
  return "Hint: Tool not available. Check /tools for available tools."
324
330
  if "not found" in err_lower and context == "session":
325
331
  return "Hint: Session not found. Run /sessions to list available."
326
- if "404" in err_lower or ("not found" in err_lower and context not in ("tool", "")):
332
+ if code("404") or ("not found" in err_lower and context not in ("tool", "")):
327
333
  return "Hint: Resource not found. Check the symbol or path."
328
334
  if "no data" in err_lower or "no result" in err_lower:
329
335
  return "Hint: No data returned. Verify the symbol spelling."
330
- if "500" in err_lower or "internal" in err_lower:
336
+ if code("500") or "internal server" in err_lower:
331
337
  return "Hint: Server error. Try again in a moment or /health to check."
332
338
  if context == "login":
333
339
  return "Hint: Check email/password. Usage: /login email password"
@@ -353,6 +359,11 @@ def print_hanging(console, prefix: str, text: str, style: str = "") -> None:
353
359
  console.print(grid)
354
360
 
355
361
 
362
+ # The contexts error_hint() understands; anything else given is a hint to show.
363
+ ERROR_CONTEXTS = frozenset({"", "tool", "login", "session", "screenshot", "vision", "browser",
364
+ "browser screenshot", "deep"})
365
+
366
+
356
367
  def print_error(
357
368
  msg: str,
358
369
  context: str = "",
@@ -362,7 +373,15 @@ def print_error(
362
373
  rich_box=None,
363
374
  use_panel: bool = False,
364
375
  ) -> None:
365
- hint = error_hint(msg, context)
376
+ # The second argument is either where the error came from ("tool",
377
+ # "login"), from which a hint is guessed, or the hint itself. Most callers
378
+ # pass the hint: "请先用 /broker add 添加", "Usage: /compare SYMBOL …",
379
+ # "Install: pip install mss pillow". It was taken for a context and never
380
+ # shown, and a guess took its place.
381
+ if str(context or "").strip().lower() in ERROR_CONTEXTS:
382
+ hint = error_hint(msg, context)
383
+ else:
384
+ hint = str(context)
366
385
  if not use_panel:
367
386
  # Claude Code style: clean └ tree connector for inline error guidance
368
387
  if has_rich:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.97.0
3
+ Version: 0.98.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
@@ -517,6 +517,7 @@ tests/test_background_processes.py
517
517
  tests/test_backtest_cmds.py
518
518
  tests/test_backtest_engine.py
519
519
  tests/test_backtest_report.py
520
+ tests/test_backtest_runs_what_it_names.py
520
521
  tests/test_binary_bundles_runtime_imports.py
521
522
  tests/test_broken_akshare_is_optional.py
522
523
  tests/test_broker_automation.py
@@ -0,0 +1,106 @@
1
+ """/backtest runs the strategy it names on the symbol it names, and counts wins per trade.
2
+
3
+ "/backtest AAPL sma" ran a strategy called "AAPL" on the ticker SMA; the
4
+ engine did not know "AAPL" (nor "sma") and ran buy-and-hold under that name,
5
+ so the result matched buy-and-hold to the decimal. The yfinance fallback ran
6
+ momentum whatever was asked. "Win Rate" was the share of up days while
7
+ holding: one buy-and-hold trade showed 52.5%. And error guidance passed to
8
+ print_error was never shown; a hint guessed from "rate" in "strategy" said
9
+ "Rate limited".
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import pytest
15
+
16
+ from aria_code.domain.backtest_report import BacktestConfig, normalize_strategy, run_backtest_from_history
17
+ from aria_code.ui.render.output import error_hint
18
+
19
+
20
+ def _history(closes):
21
+ return [{"date": f"2025-{1 + i // 28:02d}-{1 + i % 28:02d}", "close": c, "volume": 1000} for i, c in enumerate(closes)]
22
+
23
+
24
+ @pytest.mark.parametrize("name, runs", [("sma", "sma_cross"), ("ma_crossover", "sma_cross"),
25
+ ("buy_and_hold", "buy_hold"), ("mom", "momentum"), ("AAPL", None)])
26
+ def test_strategy_names(name, runs):
27
+ assert normalize_strategy(name) == runs
28
+
29
+
30
+ def test_an_unknown_strategy_is_an_error_not_buy_and_hold():
31
+ closes = [100 + i for i in range(120)]
32
+ result = run_backtest_from_history(_history(closes), BacktestConfig(symbol="AAPL", strategy="turtle",
33
+ start_date="2025-01-01",
34
+ end_date="2025-12-31"))
35
+ assert result["success"] is False and "Unknown strategy 'turtle'" in result["error"]
36
+
37
+
38
+ def test_win_rate_counts_trades_not_days():
39
+ # Rises then falls every 20 days: SMA crossings make several round trips.
40
+ closes = []
41
+ price = 100.0
42
+ for i in range(240):
43
+ price *= 1.01 if (i // 20) % 2 == 0 else 0.99
44
+ closes.append(round(price, 4))
45
+ cfg = BacktestConfig(symbol="X", strategy="sma", start_date="2025-01-01", end_date="2025-12-31",
46
+ fast_period=5, slow_period=10)
47
+ result = run_backtest_from_history(_history(closes), cfg)
48
+ assert result["success"]
49
+ trades = result["total_trades"]
50
+ assert trades >= 2
51
+ # A win rate over trades is a multiple of 1/trades.
52
+ assert abs(result["win_rate"] * trades - round(result["win_rate"] * trades)) < 1e-6
53
+
54
+ hold = run_backtest_from_history(_history(closes), BacktestConfig(
55
+ symbol="X", strategy="buy_hold", start_date="2025-01-01", end_date="2025-12-31"))
56
+ assert hold["total_trades"] == 1 and hold["win_rate"] in (0.0, 1.0)
57
+
58
+
59
+ @pytest.mark.parametrize("message", ["Unknown strategy: turtle", "No strategy results", "generate failed",
60
+ "only 1500 bars"])
61
+ def test_hints_are_not_guessed_from_parts_of_words(message):
62
+ assert "Rate limited" not in error_hint(message)
63
+ assert "Server error" not in error_hint(message)
64
+
65
+
66
+ def test_real_rate_limits_still_get_the_hint():
67
+ assert "Rate limited" in error_hint("HTTP 429 Too Many Requests")
68
+ assert "Rate limited" in error_hint("yfinance rate limit reached")
69
+
70
+
71
+ def test_the_callers_hint_is_shown(snapshot):
72
+ from aria_code.ui.render.output import print_error
73
+
74
+ con = snapshot.console()
75
+ print_error("No broker configured", "请先用 /broker add 添加", console=con, has_rich=True)
76
+ print_error("Login failed", "login", console=con, has_rich=True)
77
+ text = con.file.getvalue()
78
+ assert "请先用 /broker add 添加" in text
79
+ assert "Check email/password" in text
80
+
81
+
82
+ def test_backtest_takes_either_order(monkeypatch):
83
+ import asyncio
84
+ from types import SimpleNamespace
85
+
86
+ import aria_code.apps.cli.commands.backtest_cmds as backtest_cmds
87
+
88
+ seen = {}
89
+
90
+ def fake_report(config, output_dir=None):
91
+ seen["strategy"], seen["symbol"] = config.strategy, config.symbol
92
+ return {"success": False, "error": "stop here"}
93
+
94
+ import backtest_report
95
+ monkeypatch.setattr(backtest_report, "generate_backtest_report", fake_report)
96
+ monkeypatch.setitem(__import__("sys").modules, "yfinance", None)
97
+ printed = []
98
+ console = SimpleNamespace(print=lambda *a, **k: printed.append(" ".join(map(str, a))),
99
+ status=lambda *a, **k: __import__("contextlib").nullcontext(), width=100)
100
+
101
+ class Cli(backtest_cmds.BacktestCommandsMixin):
102
+ context = SimpleNamespace(has_rich=True, console=console)
103
+ terminal = SimpleNamespace(config={"ui_lang": "en", "api_url": "http://127.0.0.1:9"})
104
+
105
+ asyncio.run(Cli().cmd_backtest("AAPL sma"))
106
+ assert seen == {"strategy": "sma", "symbol": "AAPL"}
File without changes
File without changes
File without changes
File without changes