aria-code 0.85.0__tar.gz → 0.87.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 (748) hide show
  1. {aria_code-0.85.0/src/aria_code.egg-info → aria_code-0.87.0}/PKG-INFO +1 -1
  2. {aria_code-0.85.0 → aria_code-0.87.0}/pyproject.toml +1 -1
  3. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/core_cmds.py +28 -16
  5. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/market.py +121 -14
  6. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/market_cmds.py +20 -2
  7. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/market_handlers.py +14 -14
  8. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prompts/system_prompts.py +2 -2
  9. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_cli.py +71 -1
  10. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/completer.py +62 -17
  11. aria_code-0.87.0/src/aria_code/ui/mentions.py +206 -0
  12. {aria_code-0.85.0 → aria_code-0.87.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  13. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code.egg-info/SOURCES.txt +5 -0
  14. aria_code-0.87.0/tests/test_data_without_model.py +53 -0
  15. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_answers_in_english.py +20 -2
  16. aria_code-0.87.0/tests/test_mentions.py +62 -0
  17. aria_code-0.87.0/tests/test_natural_language_routing.py +118 -0
  18. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_output_rendering.py +5 -4
  19. aria_code-0.87.0/tests/test_platform_publish.py +95 -0
  20. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ui_completer_references.py +7 -8
  21. {aria_code-0.85.0 → aria_code-0.87.0}/LICENSE +0 -0
  22. {aria_code-0.85.0 → aria_code-0.87.0}/NOTICE +0 -0
  23. {aria_code-0.85.0 → aria_code-0.87.0}/README.md +0 -0
  24. {aria_code-0.85.0 → aria_code-0.87.0}/setup.cfg +0 -0
  25. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/__init__.py +0 -0
  26. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/adk_apps/__init__.py +0 -0
  27. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  28. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  29. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  30. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  31. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/__init__.py +0 -0
  32. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/base.py +0 -0
  33. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/code_review.py +0 -0
  34. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/__init__.py +0 -0
  35. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  36. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/critic.py +0 -0
  37. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/deepen.py +0 -0
  38. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/models.py +0 -0
  39. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  40. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  41. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/themes.py +0 -0
  42. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/deep/tiers.py +0 -0
  43. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  44. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/engineering/coder.py +0 -0
  45. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/engineering/tester.py +0 -0
  46. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/__init__.py +0 -0
  47. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  48. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  49. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  50. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/debate.py +0 -0
  51. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/earnings.py +0 -0
  52. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  53. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/macro.py +0 -0
  54. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/news.py +0 -0
  55. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/risk.py +0 -0
  56. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/sector.py +0 -0
  57. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/strategist.py +0 -0
  58. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  59. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  60. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/financial/technical.py +0 -0
  61. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/orchestrator.py +0 -0
  62. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  63. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/__init__.py +0 -0
  64. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  65. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/business_match.py +0 -0
  66. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  67. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  68. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  69. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  70. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  71. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  72. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  73. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/registry.py +0 -0
  74. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/signal_scheme.py +0 -0
  75. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/sports/__init__.py +0 -0
  76. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  77. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/supervisor.py +0 -0
  78. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/team.py +0 -0
  79. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  80. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  81. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  82. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  83. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  84. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  85. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  86. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  87. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  88. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  89. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  90. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aliyun_data_client.py +0 -0
  91. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/README.md +0 -0
  92. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/__init__.py +0 -0
  93. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/README.md +0 -0
  94. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/__init__.py +0 -0
  95. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/approvals.py +0 -0
  96. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/conversation.py +0 -0
  97. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/digest.py +0 -0
  98. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/intake.py +0 -0
  99. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/registry.py +0 -0
  100. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  101. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/README.md +0 -0
  102. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/__init__.py +0 -0
  103. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/_optional.py +0 -0
  104. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  105. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  106. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  107. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  108. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  109. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  110. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  111. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  112. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  113. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  114. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  115. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  116. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  117. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  118. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  119. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  120. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  121. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  122. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  123. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  124. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  125. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  126. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  127. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  128. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  129. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  130. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  131. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  132. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  133. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  134. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  135. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  136. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  137. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  138. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  139. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  140. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  141. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  142. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/config_store.py +0 -0
  143. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/constants.py +0 -0
  144. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/context.py +0 -0
  145. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  146. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/direct.py +0 -0
  147. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  148. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  149. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  150. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/google_login.py +0 -0
  151. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  152. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  153. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  154. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  155. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  156. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  157. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/helpers.py +0 -0
  158. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/hooks.py +0 -0
  159. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/i18n.py +0 -0
  160. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/intent.py +0 -0
  161. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  162. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  163. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  164. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  165. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/main.py +0 -0
  166. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  167. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  168. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  169. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  170. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  171. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  172. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  173. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  174. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  175. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/preflight.py +0 -0
  176. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  177. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  178. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  179. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  180. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  181. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  182. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  183. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  184. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  185. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  186. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  187. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  188. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  189. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  190. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  191. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  192. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  193. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  194. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  195. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  196. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  197. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  198. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/session_export.py +0 -0
  199. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  200. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/session_store.py +0 -0
  201. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  202. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  203. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  204. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  205. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  206. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  207. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  208. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  209. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  210. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  211. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  212. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  213. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  214. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  215. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/update_check.py +0 -0
  216. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/updater.py +0 -0
  217. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  218. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  219. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/daemon/README.md +0 -0
  220. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/vscode/README.md +0 -0
  221. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/apps/vscode/package.json +0 -0
  222. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_daemon.py +0 -0
  223. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_feishu_bot.py +0 -0
  224. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_mcp_server.py +0 -0
  225. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_relay_client.py +0 -0
  226. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_relay_server.py +0 -0
  227. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/aria_telegram_bot.py +0 -0
  228. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ariarc.py +0 -0
  229. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/artifacts.py +0 -0
  230. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/backtest_engine.py +0 -0
  231. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/backtest_report.py +0 -0
  232. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/__init__.py +0 -0
  233. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/automation.py +0 -0
  234. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/base.py +0 -0
  235. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/capabilities.py +0 -0
  236. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  237. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  238. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  239. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  240. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  241. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  242. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/config.py +0 -0
  243. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  244. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  245. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  246. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  247. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  248. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/paper_broker.py +0 -0
  249. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/planning.py +0 -0
  250. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/registry.py +0 -0
  251. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/brokers/trading.py +0 -0
  252. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/canva_client.py +0 -0
  253. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/change_store.py +0 -0
  254. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/__init__.py +0 -0
  255. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  256. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  257. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/canva_client.py +0 -0
  258. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/figma_client.py +0 -0
  259. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/football_data_client.py +0 -0
  260. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/kling_video_client.py +0 -0
  261. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/market_data_client.py +0 -0
  262. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/openai_image_client.py +0 -0
  263. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/runway_video_client.py +0 -0
  264. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  265. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/cloud_memory.py +0 -0
  266. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/command_safety.py +0 -0
  267. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/computer_use_tools.py +0 -0
  268. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/dashboard_generator.py +0 -0
  269. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/data_analysis_tools.py +0 -0
  270. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/data_cleaner.py +0 -0
  271. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/data_service.py +0 -0
  272. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/__init__.py +0 -0
  273. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/base.py +0 -0
  274. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/router.py +0 -0
  275. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  276. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  277. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  278. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  279. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  280. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  281. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  282. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  283. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  284. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  285. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/demo_player.py +0 -0
  286. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/doctor.py +0 -0
  287. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/domain/__init__.py +0 -0
  288. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/domain/backtest_engine.py +0 -0
  289. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/domain/backtest_report.py +0 -0
  290. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/domain/finance_formulas.py +0 -0
  291. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  292. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/domain/strategy_vault.py +0 -0
  293. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/evals/__init__.py +0 -0
  294. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/evals/harness.py +0 -0
  295. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/evals/runner.py +0 -0
  296. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/external_agent_runner.py +0 -0
  297. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/figma_client.py +0 -0
  298. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/file_analysis_tools.py +0 -0
  299. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/finance_formulas.py +0 -0
  300. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/football_data_client.py +0 -0
  301. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/image_gen_tools.py +0 -0
  302. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/intent_classifier.py +0 -0
  303. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/kling_video_client.py +0 -0
  304. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/licensing.py +0 -0
  305. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/local_finance_tools.py +0 -0
  306. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/local_image_provider.py +0 -0
  307. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/local_llm_provider.py +0 -0
  308. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/macro_tools.py +0 -0
  309. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/markdown_pdf.py +0 -0
  310. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/market_data_client.py +0 -0
  311. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/mcp_client.py +0 -0
  312. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/memory_manager.py +0 -0
  313. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/model_capability.py +0 -0
  314. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/notification_tools.py +0 -0
  315. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/openai_image_client.py +0 -0
  316. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/__init__.py +0 -0
  317. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  318. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  319. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  320. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  321. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  322. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  323. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  324. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_core/export.py +0 -0
  325. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  326. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  327. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  328. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  329. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  330. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  331. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  332. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  333. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  334. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  335. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  336. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  337. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  338. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  339. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  340. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  341. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  342. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  343. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  344. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  345. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  346. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/context.py +0 -0
  347. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  348. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/data.py +0 -0
  349. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  350. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/references.py +0 -0
  351. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  352. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  353. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  354. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  355. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  356. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  357. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  358. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  359. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  360. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  361. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  362. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  363. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  364. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  365. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  366. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  367. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  368. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  369. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  370. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  371. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  372. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  373. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  374. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  375. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  376. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  377. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  378. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  379. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  380. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  381. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  382. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  383. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  384. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  385. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  386. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  387. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  388. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  389. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  390. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  391. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/__init__.py +0 -0
  392. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/base.py +0 -0
  393. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/finance/__init__.py +0 -0
  394. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  395. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/payments/__init__.py +0 -0
  396. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/realty/__init__.py +0 -0
  397. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/registry.py +0 -0
  398. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/packs/rules.py +0 -0
  399. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/plan_utils.py +0 -0
  400. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/plugin_loader.py +0 -0
  401. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/portfolio_ledger.py +0 -0
  402. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/preview_server.py +0 -0
  403. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/privacy/__init__.py +0 -0
  404. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/privacy/feedback.py +0 -0
  405. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/project_review.py +0 -0
  406. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/project_review_api.py +0 -0
  407. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/project_review_server.py +0 -0
  408. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/project_tools.py +0 -0
  409. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/__init__.py +0 -0
  410. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/__init__.py +0 -0
  411. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  412. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  413. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/base.py +0 -0
  414. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/custom.py +0 -0
  415. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/ollama.py +0 -0
  416. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  417. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/llm/registry.py +0 -0
  418. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/local_image_provider.py +0 -0
  419. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  420. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/providers/tool_messages.py +0 -0
  421. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/realty_data_tools.py +0 -0
  422. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/relay_store.py +0 -0
  423. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/report_exporters.py +0 -0
  424. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/report_generator.py +0 -0
  425. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/review_service.py +0 -0
  426. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/__init__.py +0 -0
  427. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/acceptance.py +0 -0
  428. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/agent_loop.py +0 -0
  429. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/approval.py +0 -0
  430. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/budget.py +0 -0
  431. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/checkpoints.py +0 -0
  432. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/crash_report.py +0 -0
  433. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/events.py +0 -0
  434. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/gateway.py +0 -0
  435. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/lsp.py +0 -0
  436. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/orchestrator.py +0 -0
  437. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/repo_map.py +0 -0
  438. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/run_state.py +0 -0
  439. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/run_store.py +0 -0
  440. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/self_healing.py +0 -0
  441. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/subagent.py +0 -0
  442. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/task_ledger.py +0 -0
  443. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  444. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/tool_executor.py +0 -0
  445. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/tool_policy.py +0 -0
  446. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runtime/worktrees.py +0 -0
  447. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/runway_video_client.py +0 -0
  448. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/safety/__init__.py +0 -0
  449. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/safety/permissions.py +0 -0
  450. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/safety/service.py +0 -0
  451. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/setup_wizard.py +0 -0
  452. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/spreadsheet_tools.py +0 -0
  453. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/strategy_vault.py +0 -0
  454. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/__init__.py +0 -0
  455. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/artifact_tools.py +0 -0
  456. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/broker_tools.py +0 -0
  457. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  458. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  459. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  460. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  461. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  462. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/extended_tools.py +0 -0
  463. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  464. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  465. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  466. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  467. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  468. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/logistics_io.py +0 -0
  469. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  470. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/logistics_tools.py +0 -0
  471. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/macro_tools.py +0 -0
  472. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/notification_tools.py +0 -0
  473. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/project_tools.py +0 -0
  474. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  475. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  476. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/tools/stripe_tools.py +0 -0
  477. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/__init__.py +0 -0
  478. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/banner.py +0 -0
  479. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/console.py +0 -0
  480. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/image_render.py +0 -0
  481. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/input_box.py +0 -0
  482. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/picker.py +0 -0
  483. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/render/__init__.py +0 -0
  484. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/render/finance.py +0 -0
  485. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/render/market.py +0 -0
  486. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/render/output.py +0 -0
  487. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/render/responsive.py +0 -0
  488. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/render/team.py +0 -0
  489. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/robot.py +0 -0
  490. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  491. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/utils/vscode_uri.py +0 -0
  492. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/video_analysis.py +0 -0
  493. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/video_editor.py +0 -0
  494. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace/__init__.py +0 -0
  495. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace/files.py +0 -0
  496. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace/verify.py +0 -0
  497. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace_changes.py +0 -0
  498. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace_context.py +0 -0
  499. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace_service.py +0 -0
  500. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code/workspace_tools.py +0 -0
  501. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  502. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  503. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code.egg-info/requires.txt +0 -0
  504. {aria_code-0.85.0 → aria_code-0.87.0}/src/aria_code.egg-info/top_level.txt +0 -0
  505. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_adk_market_tools.py +0 -0
  506. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_agent_team_fallback.py +0 -0
  507. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_analyze_file_tool.py +0 -0
  508. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_architecture_ledger_is_true.py +0 -0
  509. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_architecture_report.py +0 -0
  510. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_aria_cli_core.py +0 -0
  511. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_aria_mcp_server.py +0 -0
  512. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_aria_sdk.py +0 -0
  513. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_artifact_publishing.py +0 -0
  514. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_artifacts_and_reports.py +0 -0
  515. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ashare_prediction_cmds.py +0 -0
  516. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_backtest_cmds.py +0 -0
  517. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_backtest_engine.py +0 -0
  518. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_backtest_report.py +0 -0
  519. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  520. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_broken_akshare_is_optional.py +0 -0
  521. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_broker_automation.py +0 -0
  522. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  523. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_broker_planning.py +0 -0
  524. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_broker_safety.py +0 -0
  525. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_broker_tools.py +0 -0
  526. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_budget.py +0 -0
  527. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_business_workflow_cmds.py +0 -0
  528. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_canva_client.py +0 -0
  529. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_canvas_cmds.py +0 -0
  530. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_card_approvals.py +0 -0
  531. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_channel_intake.py +0 -0
  532. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_channels.py +0 -0
  533. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_chart_handlers.py +0 -0
  534. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_chat_bots_fail_closed.py +0 -0
  535. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_chat_routing.py +0 -0
  536. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ci_security_workflow.py +0 -0
  537. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_app_split.py +0 -0
  538. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_bootstrap.py +0 -0
  539. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_config_store.py +0 -0
  540. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  541. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_runtime_consumer.py +0 -0
  542. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_tool_executor_module.py +0 -0
  543. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cli_updater.py +0 -0
  544. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_cloud_memory.py +0 -0
  545. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_code_audit_tools.py +0 -0
  546. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_code_review_agent.py +0 -0
  547. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_codegen_output.py +0 -0
  548. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_coder_tester_self_healing.py +0 -0
  549. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_coder_tool_safety.py +0 -0
  550. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_collaboration.py +0 -0
  551. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_command_loggers.py +0 -0
  552. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_command_safety.py +0 -0
  553. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_completions_builder.py +0 -0
  554. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_config_paths.py +0 -0
  555. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_configured_provider.py +0 -0
  556. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_container_entrypoint.py +0 -0
  557. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_container_entrypoints.py +0 -0
  558. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_context_checkpoints.py +0 -0
  559. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_context_references.py +0 -0
  560. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_context_service.py +0 -0
  561. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_conversation_core.py +0 -0
  562. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_crash_report.py +0 -0
  563. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_credential_file_permissions.py +0 -0
  564. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_custom_providers.py +0 -0
  565. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_daemon_gateway_config.py +0 -0
  566. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_dashboard_generator.py +0 -0
  567. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_data_service.py +0 -0
  568. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_data_service_imports.py +0 -0
  569. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_datasource_routing.py +0 -0
  570. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_deep_analysis.py +0 -0
  571. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_degrades_without_quant_engine.py +0 -0
  572. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  573. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_doctor.py +0 -0
  574. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  575. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_doctor_npm_scope.py +0 -0
  576. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_engine_boundary.py +0 -0
  577. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_enterprise_tool_honesty.py +0 -0
  578. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_env_switch_docs.py +0 -0
  579. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_evals_harness.py +0 -0
  580. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_event_import_roots.py +0 -0
  581. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_extended_tools.py +0 -0
  582. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_feishu_swarm_config.py +0 -0
  583. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_finalize_release.py +0 -0
  584. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_finance_renderers.py +0 -0
  585. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_finance_service_catalog.py +0 -0
  586. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_first_run_output.py +0 -0
  587. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_first_run_works.py +0 -0
  588. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_football_agent.py +0 -0
  589. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_football_prediction_output.py +0 -0
  590. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_google_cloud_models.py +0 -0
  591. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_google_cloud_routing.py +0 -0
  592. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_google_login.py +0 -0
  593. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_google_search_provider.py +0 -0
  594. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_headless_is_agentic.py +0 -0
  595. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_honest_surfaces.py +0 -0
  596. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_image_gen_tools.py +0 -0
  597. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_image_inputs.py +0 -0
  598. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_import_graph_budget.py +0 -0
  599. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_intent_router.py +0 -0
  600. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_intent_signals.py +0 -0
  601. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_kling_video_client.py +0 -0
  602. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_lazy_rebind.py +0 -0
  603. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_legacy_module_imports.py +0 -0
  604. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_license_consistency.py +0 -0
  605. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_licensing.py +0 -0
  606. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_local_image_provider.py +0 -0
  607. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_logistics_3pl.py +0 -0
  608. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_logistics_and_finance_agents.py +0 -0
  609. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_lsp.py +0 -0
  610. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_markdown_pdf.py +0 -0
  611. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_data_client.py +0 -0
  612. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_history_inheritance.py +0 -0
  613. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_history_tool.py +0 -0
  614. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_hours.py +0 -0
  615. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_questions_on_backend.py +0 -0
  616. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_symbol_extraction.py +0 -0
  617. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_market_universe.py +0 -0
  618. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_mcp_circuit.py +0 -0
  619. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_mcp_client.py +0 -0
  620. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_model_capability_registry.py +0 -0
  621. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_model_choice_is_the_users.py +0 -0
  622. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_model_selection_state.py +0 -0
  623. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_native_binary_entrypoints.py +0 -0
  624. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_native_installer.py +0 -0
  625. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_new_modules.py +0 -0
  626. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  627. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_no_uncommitted_imports.py +0 -0
  628. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_numeric_listings.py +0 -0
  629. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ollama_stream_imports.py +0 -0
  630. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ollama_stream_tools.py +0 -0
  631. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_openai_image_client.py +0 -0
  632. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_operations_suite.py +0 -0
  633. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_packages_facade.py +0 -0
  634. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_packaging_constraints.py +0 -0
  635. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_packaging_manifest.py +0 -0
  636. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_packs_domains.py +0 -0
  637. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_pdf_report.py +0 -0
  638. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_pick_best_installed_model.py +0 -0
  639. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_plan_mode.py +0 -0
  640. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_platform_package_assembly.py +0 -0
  641. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_platform_packages.py +0 -0
  642. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_plotly_html_output.py +0 -0
  643. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_portfolio_ledger.py +0 -0
  644. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_post_turn_context_decision.py +0 -0
  645. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_preflight.py +0 -0
  646. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_preview_server.py +0 -0
  647. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_privacy_feedback.py +0 -0
  648. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_project_aria.py +0 -0
  649. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_project_review.py +0 -0
  650. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_project_review_api.py +0 -0
  651. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_prompt_assembly.py +0 -0
  652. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_prompt_selection.py +0 -0
  653. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_provider_autoconfig.py +0 -0
  654. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_provider_error_messages.py +0 -0
  655. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_provider_integration.py +0 -0
  656. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_provider_registry.py +0 -0
  657. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_public_service_status.py +0 -0
  658. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_quant_engine_namespace.py +0 -0
  659. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_rebind_contract.py +0 -0
  660. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_rebind_namespace_contract.py +0 -0
  661. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_relay_client_credentials.py +0 -0
  662. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_relay_event_verification.py +0 -0
  663. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_relay_sends_for_clients.py +0 -0
  664. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_relay_store.py +0 -0
  665. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_relay_url.py +0 -0
  666. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_release_chain.py +0 -0
  667. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_release_commit_identity.py +0 -0
  668. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_release_push_is_atomic.py +0 -0
  669. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_release_reaches_the_registries.py +0 -0
  670. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_release_verification_waits.py +0 -0
  671. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_release_workflow_permissions.py +0 -0
  672. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_report_charts.py +0 -0
  673. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_report_generator.py +0 -0
  674. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_research_protocol.py +0 -0
  675. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_research_quality.py +0 -0
  676. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_responsive_rendering.py +0 -0
  677. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_review_service.py +0 -0
  678. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_root_module_budget.py +0 -0
  679. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  680. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_acceptance.py +0 -0
  681. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_agent_loop.py +0 -0
  682. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_approval.py +0 -0
  683. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_bridge.py +0 -0
  684. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_bridge_fallback.py +0 -0
  685. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_checkpoints.py +0 -0
  686. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_event_identity.py +0 -0
  687. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_gateway.py +0 -0
  688. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_repo_map.py +0 -0
  689. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_run_store.py +0 -0
  690. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_tool_executor.py +0 -0
  691. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runtime_worktrees.py +0 -0
  692. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_runway_video_client.py +0 -0
  693. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_safety_permissions.py +0 -0
  694. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_safety_service.py +0 -0
  695. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_safety_service_adoption.py +0 -0
  696. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_service_diagnostics_security.py +0 -0
  697. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_session_search.py +0 -0
  698. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_settings_service.py +0 -0
  699. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_shipper_digest.py +0 -0
  700. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_single_import_root.py +0 -0
  701. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_skill_agent_binding.py +0 -0
  702. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_skill_catalog.py +0 -0
  703. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_skill_loader.py +0 -0
  704. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_slash_popup.py +0 -0
  705. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_spreadsheet_tools.py +0 -0
  706. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_sse_stream_contract.py +0 -0
  707. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_startup_dashboard.py +0 -0
  708. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_startup_latency.py +0 -0
  709. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_status_language.py +0 -0
  710. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_streaming_pipeline.py +0 -0
  711. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_stripe_agent.py +0 -0
  712. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_subagent.py +0 -0
  713. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_supervisor_routing.py +0 -0
  714. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_system_prompts.py +0 -0
  715. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_system_tools_output.py +0 -0
  716. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_task_orchestrator.py +0 -0
  717. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_team_synthesis.py +0 -0
  718. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_tls_trust_store.py +0 -0
  719. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_tool_policy.py +0 -0
  720. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  721. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_tool_scope.py +0 -0
  722. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_tool_step_output.py +0 -0
  723. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_trading_service.py +0 -0
  724. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_tradingview_bridge.py +0 -0
  725. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_turn_planning.py +0 -0
  726. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ui_console_theme.py +0 -0
  727. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ui_input_box.py +0 -0
  728. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ui_language_and_model.py +0 -0
  729. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_ui_robot_banner.py +0 -0
  730. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_update_health_routes.py +0 -0
  731. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_verification_hint.py +0 -0
  732. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_verification_policy.py +0 -0
  733. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_version_consistency.py +0 -0
  734. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_version_counter.py +0 -0
  735. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_video_analysis.py +0 -0
  736. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_video_editor.py +0 -0
  737. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_vscode_mcp.py +0 -0
  738. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_warehouse_agents.py +0 -0
  739. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_warehouse_cli_registration.py +0 -0
  740. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_warehouse_erp_client.py +0 -0
  741. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_warehouse_workflow.py +0 -0
  742. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_wheel_is_installable.py +0 -0
  743. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_workspace_changes.py +0 -0
  744. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_workspace_context.py +0 -0
  745. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_workspace_files.py +0 -0
  746. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_workspace_scope.py +0 -0
  747. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_workspace_service.py +0 -0
  748. {aria_code-0.85.0 → aria_code-0.87.0}/tests/test_workspace_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.85.0
3
+ Version: 0.87.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.85.0"
7
+ version = "0.87.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.85.0"
20
+ __version__ = "0.87.0"
@@ -2187,28 +2187,40 @@ class CoreCommandsMixin:
2187
2187
  "resistance": res3,
2188
2188
  },
2189
2189
  }
2190
+ # The summary was Chinese whatever the UI language ("趋势: 偏多 …
2191
+ # 自审通过"); the trend value itself comes from the chart in Chinese.
2192
+ _zh = str(self.terminal.config.get("ui_lang", "en")).lower().startswith("zh")
2193
+ _T = (lambda a, b: a) if _zh else (lambda a, b: b)
2194
+ _trend = str(result.get("trend") or "—")
2195
+ if not _zh:
2196
+ _trend = {"偏多": "bullish", "偏空": "bearish", "震荡": "range-bound",
2197
+ "震荡/中性": "range-bound"}.get(_trend, _trend)
2198
+ _summary = (
2199
+ f"{display_label} {_T('趋势', 'trend')}: {_trend} "
2200
+ f"RSI: {f'{rsi_val:.1f}' if rsi_val else '—'} "
2201
+ f"{_T('支撑', 'support')}: {'/'.join(str(v) for v in sup3) or '—'} "
2202
+ f"{_T('阻力', 'resistance')}: {'/'.join(str(v) for v in res3) or '—'} "
2203
+ f"{_T('数据', 'source')}: {provider}"
2204
+ )
2205
+ _issues_head = _T(f"自审发现 {len(issues)} 个问题:", f"self-check found {len(issues)} issue(s):")
2206
+ _clean = _T("自审通过(数据质量正常)", "self-check passed (data quality normal)")
2190
2207
  if self.context.has_rich:
2191
- self.context.console.print(f" [green]✓[/green] chart generated [dim]({elapsed_ms}ms)[/dim]")
2192
- self.context.console.print(f" saved: [link={path}]{path_label}[/link]")
2193
- self.context.console.print(
2194
- f" [dim]{display_label} "
2195
- f"趋势: {result.get('trend','—')} "
2196
- f"RSI: {f'{rsi_val:.1f}' if rsi_val else '—'} "
2197
- f"支撑: {'/'.join(str(v) for v in sup3) or '—'} "
2198
- f"阻力: {'/'.join(str(v) for v in res3) or '—'} "
2199
- f"数据: {provider}[/dim]"
2200
- )
2208
+ from rich.markup import escape as _esc
2209
+
2210
+ self.context.console.print(f" [green]✓[/green] {_T('图表已生成', 'chart generated')} [dim]({elapsed_ms}ms)[/dim]")
2211
+ self.context.console.print(f" {_T('已保存', 'saved')}: [link={path}]{path_label}[/link]")
2212
+ self.context.console.print(f" [dim]{_esc(_summary)}[/dim]")
2201
2213
  if issues:
2202
- self.context.console.print(f" [yellow]⚠ 自审发现 {len(issues)} 个问题:[/yellow]")
2214
+ self.context.console.print(f" [yellow]⚠ {_issues_head}[/yellow]")
2203
2215
  for iss in issues:
2204
- self.context.console.print(f" [yellow]· {iss}[/yellow]")
2216
+ self.context.console.print(f" [yellow]· {_esc(str(iss))}[/yellow]")
2205
2217
  else:
2206
- self.context.console.print(" [green dim]✓ 自审通过(数据质量正常)[/green dim]")
2218
+ self.context.console.print(f" [green dim]✓ {_clean}[/green dim]")
2207
2219
  else:
2208
- print(f" OK chart generated ({elapsed_ms}ms): {path_label}")
2209
- print(f" {display_label} 趋势: {result.get('trend','—')} RSI: {f'{rsi_val:.1f}' if rsi_val else '—'} 数据: {provider}")
2220
+ print(f" OK {_T('图表已生成', 'chart generated')} ({elapsed_ms}ms): {path_label}")
2221
+ print(f" {_summary}")
2210
2222
  if issues:
2211
- print(f" ⚠ 自审发现 {len(issues)} 个问题:")
2223
+ print(f" ⚠ {_issues_head}")
2212
2224
  for iss in issues:
2213
2225
  print(f" · {iss}")
2214
2226
  import subprocess as _sp
@@ -6,6 +6,7 @@ CLI, Feishu, and future gateway adapters can share the same command semantics.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ import re
9
10
  from dataclasses import dataclass
10
11
  from typing import Mapping
11
12
 
@@ -56,13 +57,13 @@ _DASHBOARD_MODE_HINTS: tuple[tuple[tuple[str, ...], str], ...] = (
56
57
  )
57
58
 
58
59
  _CHART_PERIOD_HINTS: tuple[tuple[tuple[str, ...], str], ...] = (
59
- (("近一年", "一年", "1y", "1年"), "1y"),
60
- (("近三个月", "三个月", "3m", "3个月"), "3m"),
61
- (("近六个月", "六个月", "6m", "6个月"), "6m"),
62
- (("年初至今", "ytd"), "ytd"),
63
- (("两年", "2y"), "2y"),
64
- (("三年", "3y"), "3y"),
65
- (("五年", "5y"), "5y"),
60
+ (("近三个月", "三个月", "3m", "3个月", "3 months", "three months", "3-month", "quarter"), "3m"),
61
+ (("近六个月", "六个月", "6m", "6个月", "6 months", "six months", "6-month", "half a year"), "6m"),
62
+ (("年初至今", "ytd", "year to date"), "ytd"),
63
+ (("两年", "2y", "2 years", "two years"), "2y"),
64
+ (("三年", "3y", "3 years", "three years"), "3y"),
65
+ (("五年", "5y", "5 years", "five years"), "5y"),
66
+ (("近一年", "一年", "1y", "1年", "1 year", "one year", "a year", "12 months"), "1y"),
66
67
  )
67
68
 
68
69
  _REPORT_TYPE_HINTS: tuple[tuple[tuple[str, ...], str], ...] = (
@@ -80,7 +81,13 @@ _TRADINGVIEW_ANALYSIS_HINTS = (
80
81
  "指标", "信号", "analyze", "analysis", "data", "indicator", "signal",
81
82
  )
82
83
 
83
- _ROUTE_SYMBOL_BLOCKLIST = {"K", "LINE", "CHART", "PLOT"}
84
+ _ROUTE_SYMBOL_BLOCKLIST = {
85
+ "K", "LINE", "CHART", "PLOT",
86
+ # Product and engineering acronyms, typed in capitals and almost never a
87
+ # ticker in a message: "news app UI design ideas" ran `/news UI`.
88
+ "UI", "UX", "API", "CLI", "SDK", "URL", "PDF", "CSS", "HTML", "SQL", "JSON", "CSV", "IDE",
89
+ "OS", "PR", "QA", "CI", "CD", "MVP", "LLM", "GPU", "CPU", "RAM", "SSD", "DB",
90
+ }
84
91
  _CHART_CONTEXT_TOKEN_BLOCKLIST = {
85
92
  "ABOVE", "BELOW", "INC", "TTM", "RATIO", "SIGNAL", "SUPPORT", "RESIST",
86
93
  "RESISTANCE", "LEVEL", "LEVELS", "HIGH", "LOW", "OPEN", "CLOSE", "AVG",
@@ -115,8 +122,31 @@ def _news_topic(text: str, symbols: list[str]) -> str:
115
122
  return symbols[0] if symbols else text
116
123
 
117
124
 
125
+ def _known_tickers() -> frozenset[str]:
126
+ """Tickers Aria knows by name — the company table's values."""
127
+ global _KNOWN_TICKERS
128
+ if _KNOWN_TICKERS is None:
129
+ try:
130
+ from aria_code.apps.cli.utils.market_detect import _COMPANY_TO_TICKER
131
+
132
+ _KNOWN_TICKERS = frozenset(str(v).upper() for v in _COMPANY_TO_TICKER.values() if v)
133
+ except Exception:
134
+ _KNOWN_TICKERS = frozenset()
135
+ return _KNOWN_TICKERS
136
+
137
+
138
+ _KNOWN_TICKERS: frozenset[str] | None = None
139
+
140
+
118
141
  def _route_symbols(text: str, *, limit: int = 6) -> list[str]:
119
- """Resolve ticker/company mentions for natural-language command routing."""
142
+ """Resolve ticker/company mentions for natural-language command routing.
143
+
144
+ The second pass reads the message upper-cased so "aapl" is found — and it
145
+ used to accept anything that came out of it, so every English word became
146
+ a ticker: "what's the latest version of python?" ran `/news WHAT`, "write a
147
+ report generator script" ran `/report WRITE`. That pass now adds only
148
+ tickers Aria knows; the message as typed is read as before.
149
+ """
120
150
  seen: set[str] = set()
121
151
  out: list[str] = []
122
152
  for source in (text, text.upper()):
@@ -126,6 +156,8 @@ def _route_symbols(text: str, *, limit: int = 6) -> list[str]:
126
156
  not normalized
127
157
  or normalized in _ROUTE_SYMBOL_BLOCKLIST
128
158
  or _is_blocked_market_symbol_candidate(normalized)
159
+ or (source is not text and normalized not in _known_tickers()
160
+ and normalized not in text)
129
161
  ):
130
162
  continue
131
163
  if len(normalized) == 1 and "." not in normalized:
@@ -135,7 +167,10 @@ def _route_symbols(text: str, *, limit: int = 6) -> list[str]:
135
167
  out.append(normalized)
136
168
  if len(out) >= limit:
137
169
  return out
138
- single = _extract_market_symbol(text) or _extract_market_symbol(text.upper())
170
+ single = _extract_market_symbol(text)
171
+ if not single:
172
+ upper = _extract_market_symbol(text.upper())
173
+ single = upper if str(upper or "").upper() in _known_tickers() else ""
139
174
  normalized = str(single or "").upper()
140
175
  if (
141
176
  normalized
@@ -236,12 +271,67 @@ def parse_analysis_args(args: str, *, default_symbol: str = "AAPL") -> AnalysisA
236
271
  return AnalysisArgs(symbol=(symbol or default_symbol).upper(), focus=focus, lang=lang)
237
272
 
238
273
 
274
+ _DATA_FILE_RE = re.compile(r"(?<![\w/.-])([\w./-]+\.(?:csv|tsv|xlsx|xls|json))(?![\w.])", re.I)
275
+ _CODE_FILE_RE = re.compile(r"\b[\w./-]+\.(?:py|js|ts|tsx|jsx|go|rs|java|rb|php|c|cc|cpp|h|cs|swift|kt|sh|"
276
+ r"md|txt|toml|ya?ml|html|css|sql|ipynb|csv|tsv|json|xlsx?)\b", re.I)
277
+ _CODE_WORDS = (
278
+ "script", "function", "class", "method", "refactor", "repo", "repository", "stack trace", "traceback",
279
+ "test coverage", "unit test", "pattern", "code", "compile", "debug", "regex", "api", "endpoint",
280
+ "代码", "脚本", "函数", "重构", "仓库", "测试", "报错", "调试", "接口",
281
+ )
282
+ # English words match whole words ("repo" is not in "report"); Chinese has no
283
+ # spaces, so it matches as a substring.
284
+ _CODE_WORD_RE = re.compile(
285
+ r"\b(?:" + "|".join(re.escape(w) for w in _CODE_WORDS if w.isascii()) + r")(?:s|es)?\b", re.I)
286
+ _INVENTORY_WORDS = ("inventory", "reorder", "re-order", "safety stock", "stockout", "sku", "库存", "补货", "安全库存", "断货")
287
+ _CARRIER_WORDS = ("carrier", "freight", "waybill", "shipping cost", "lane", "承运商", "运单", "运费", "物流成本")
288
+ _FINANCE_WORDS = ("market", "stock", "finance", "financial", "earnings", "市场", "股", "财经", "金融", "财报")
289
+ # Commands that act on one instrument and must not guess one.
290
+ _SYMBOL_COMMANDS = {"/analyze", "/risk", "/strategy", "/signal", "/predict", "/report", "/news", "/chart",
291
+ "/backtest"}
292
+
293
+
294
+ def _logistics_route(text: str, low: str, available_commands: set[str]) -> RoutedCommand | None:
295
+ """ "Which SKUs in skus.csv need reordering?" → /inventory skus.csv, when that file exists."""
296
+ import os
297
+
298
+ files = [m.group(1) for m in _DATA_FILE_RE.finditer(text) if os.path.isfile(m.group(1))]
299
+ if not files:
300
+ return None
301
+ if "/inventory" in available_commands and any(w in low for w in _INVENTORY_WORDS):
302
+ return RoutedCommand(command="/inventory", args=files[0])
303
+ if "/carriers" in available_commands and any(w in low for w in _CARRIER_WORDS):
304
+ return RoutedCommand(command="/carriers", args=files[0])
305
+ return None
306
+
307
+
308
+ def _looks_like_code_work(text: str, low: str) -> bool:
309
+ """A message about code or a data file, which is the model's to answer.
310
+
311
+ "plot a histogram of ages in data.csv" ran `/chart OF AGES GE IN CSV`,
312
+ "analyze this stack trace" ran `/analyze`, "strategy pattern in python"
313
+ ran `/strategy`. None of them is a market request.
314
+ """
315
+ return (bool(_CODE_FILE_RE.search(text)) or bool(_CODE_WORD_RE.search(low))
316
+ or any(word in low for word in _CODE_WORDS if not word.isascii()))
317
+
318
+
239
319
  def route_top_level_text(user_input: str, available_commands: set[str]) -> RoutedCommand | None:
240
- """Translate bare workflow text into a slash command when possible."""
320
+ """Translate bare workflow text into a slash command when possible.
321
+
322
+ Only requests this can answer with certainty run a command; anything else
323
+ — code, data files, a keyword with no instrument — goes to the model,
324
+ which has the same tools and can ask.
325
+ """
241
326
 
242
327
  stripped = user_input.strip()
243
328
  if not stripped or stripped.startswith("/"):
244
329
  return None
330
+ logistics = _logistics_route(stripped, stripped.lower(), available_commands)
331
+ if logistics is not None:
332
+ return logistics
333
+ if _looks_like_code_work(stripped, stripped.lower()):
334
+ return None
245
335
 
246
336
  low = stripped.lower()
247
337
 
@@ -336,13 +426,23 @@ def route_top_level_text(user_input: str, available_commands: set[str]) -> Route
336
426
  "新闻", "消息", "最新进展", "最近进展", "news", "latest", "recent",
337
427
  )):
338
428
  symbols = _route_symbols(stripped)
339
- return RoutedCommand(command="/news", args=_news_topic(stripped, symbols))
429
+ topic = _news_topic(stripped, symbols)
430
+ # "latest"/"recent" alone are ordinary words ("the latest version of
431
+ # python"): without an instrument, only an explicit news request about
432
+ # markets is one ("今天有什么财经新闻", "market news today").
433
+ explicit = any(k in low for k in ("新闻", "news")) and any(k in low for k in _FINANCE_WORDS)
434
+ if symbols or topic in ("SpaceX", "LVMH") or explicit:
435
+ return RoutedCommand(command="/news", args=topic)
340
436
  parts = stripped.split(maxsplit=1)
341
437
  keyword = parts[0].lower()
342
438
  rest = parts[1] if len(parts) > 1 else ""
343
439
  command = TOP_LEVEL_ROUTES.get(keyword)
344
440
  if not command or command not in available_commands:
345
441
  return None
442
+ # "risk of this refactor?", "strategy pattern …", "analyze this …": these
443
+ # commands act on one instrument, and parse_analysis_args fell back to AAPL.
444
+ if command in _SYMBOL_COMMANDS and not _route_symbols(rest or stripped):
445
+ return None
346
446
  if command == "/analyze":
347
447
  parsed = parse_analysis_args(rest)
348
448
  focus_arg = f" --focus {parsed.focus}" if parsed.focus else ""
@@ -424,11 +524,18 @@ def parse_technical_args(args: str, *, default_symbol: str = "AAPL", default_day
424
524
  return TechnicalArgs(symbol=symbol, days=days)
425
525
 
426
526
 
427
- async def try_top_level_route(user_input: str, commands) -> bool:
428
- """Execute a top-level routed slash command through a SlashCommands object."""
527
+ async def try_top_level_route(user_input: str, commands, *, announce=None) -> bool:
528
+ """Execute a top-level routed slash command through a SlashCommands object.
529
+
530
+ ``announce`` is told the command first ("→ /news AAPL"): the interactive
531
+ loop routes here before send_message, so a routed message used to run its
532
+ command with nothing on screen saying which.
533
+ """
429
534
 
430
535
  routed = route_top_level_text(user_input, set(commands.commands))
431
536
  if routed is None:
432
537
  return False
538
+ if announce is not None:
539
+ announce(routed.text)
433
540
  await commands.execute(routed.text)
434
541
  return True
@@ -352,6 +352,24 @@ from typing import Dict, Any, Optional
352
352
  logger = logging.getLogger(__name__)
353
353
 
354
354
 
355
+ def _news_date(raw: str) -> str:
356
+ """A feed's publish time as 2026-10-05.
357
+
358
+ The first ten characters were kept, which suits ISO dates and cut an RSS
359
+ date mid-word: "Mon, 05 Oct 2026 12:00:00 GMT" showed as "Mon, 05 Oc".
360
+ """
361
+ from datetime import datetime
362
+ from email.utils import parsedate_to_datetime
363
+
364
+ text = str(raw or "").strip()
365
+ for parse in (lambda t: datetime.fromisoformat(t.replace("Z", "+00:00")), parsedate_to_datetime):
366
+ try:
367
+ return parse(text).strftime("%Y-%m-%d")
368
+ except (TypeError, ValueError, IndexError):
369
+ continue
370
+ return text[:10]
371
+
372
+
355
373
  class MarketCommandsMixin:
356
374
  """Mixin: Market commands: quote, realty, football, screen, news, screen_cn, limitup, north."""
357
375
 
@@ -1185,7 +1203,7 @@ class MarketCommandsMixin:
1185
1203
  url_item = a.get("url", a.get("link", ""))
1186
1204
  pub_date = a.get("published_at", a.get("date", a.get("publishedAt", "")))
1187
1205
  if pub_date:
1188
- pub_date = pub_date[:10] if len(pub_date) >= 10 else pub_date
1206
+ pub_date = _news_date(pub_date)
1189
1207
  else:
1190
1208
  title = str(a)
1191
1209
  source = pub_date = url_item = ""
@@ -1224,7 +1242,7 @@ class MarketCommandsMixin:
1224
1242
  source = a.get("source", "") if isinstance(a, dict) else ""
1225
1243
  pub_date = a.get("published_at", "") if isinstance(a, dict) else ""
1226
1244
  if pub_date:
1227
- pub_date = pub_date[:10] if len(pub_date) >= 10 else pub_date
1245
+ pub_date = _news_date(pub_date)
1228
1246
  if self.context.has_rich:
1229
1247
  self.context.console.print(f" [bold]{idx}.[/bold] {title}")
1230
1248
  meta_parts = [p for p in [source, pub_date] if p]
@@ -294,6 +294,11 @@ def _nearest_levels(
294
294
  return support, resistance
295
295
 
296
296
 
297
+ def _compact_levels(currency: str, levels: list[float]) -> str:
298
+ """"USD 332.54 / 328.35 / 325.81": the currency once."""
299
+ return f"{currency} " + " / ".join(f"{v:,.2f}" for v in levels) if levels else "—"
300
+
301
+
297
302
  def _format_levels(currency: str, levels: list[float]) -> str:
298
303
  return ", ".join(f"{currency} {v:,.2f}" for v in levels) if levels else "—"
299
304
 
@@ -389,22 +394,17 @@ def _append_timeframe_levels(
389
394
  resistance = row.get("resistance") or []
390
395
  action = _level_action_line(name, support, resistance, currency, english=english)
391
396
 
397
+ # Two lines a timeframe, not four: the levels on one line, what to do
398
+ # with them on the next. Every level stays; the data source is in the
399
+ # header already. The whole snapshot ran to about 48 lines.
392
400
  if english:
393
- meta = f"For: {horizon}"
394
- if source:
395
- meta += f" · Source: {source}"
396
- lines.append(f"- **{name}** — {meta}")
397
- lines.append(f" - Support: {_format_levels(currency, support)}")
398
- lines.append(f" - Resistance: {_format_levels(currency, resistance)}")
399
- lines.append(f" - Use: {action}")
401
+ lines.append(f"- **{name}** ({horizon}) — support {_compact_levels(currency, support)}"
402
+ f" · resistance {_compact_levels(currency, resistance)} ")
403
+ lines.append(f" {action}")
400
404
  else:
401
- meta = f"适合:{horizon}"
402
- if source:
403
- meta += f" · 来源:{source}"
404
- lines.append(f"- **{name}** — {meta}")
405
- lines.append(f" - 支撑:{_format_levels(currency, support)}")
406
- lines.append(f" - 压力:{_format_levels(currency, resistance)}")
407
- lines.append(f" - 用法:{action}")
405
+ lines.append(f"- **{name}**({horizon})— 支撑 {_compact_levels(currency, support)}"
406
+ f" · 压力 {_compact_levels(currency, resistance)} ")
407
+ lines.append(f" {action}")
408
408
 
409
409
 
410
410
  _HORIZON_UNITS_EN = {"日": "days", "周": "weeks", "月": "months"}
@@ -38,7 +38,7 @@ def build_response_style_rule(lang: str) -> str:
38
38
  return (
39
39
  "## Terminal Answer Style\n"
40
40
  "- Lead with the answer or conclusion. Do not start with filler such as 'Sure' or 'I can help'.\n"
41
- "- Strict Currency: US assets (e.g. AAPL, TSLA) use '$' (USD); A-shares use '¥' (CNY); HK assets use 'HK$'. Never mix currencies.\n"
41
+ "- Strict Currency: label amounts with the asset's currency as the data gives it — USD for US assets (e.g. AAPL, TSLA), CNY for A-shares, HKD for Hong Kong — and never mix currencies.\n"
42
42
  "- Format Financial Metrics Cleanly: Use structured Markdown tables or concise bullet points for Price, RSI, MACD, MA, and Bollinger Bands.\n"
43
43
  "- Never dump raw, unexecuted Python code or pseudo-scripts in chat when performing analytical queries. Synthesize insights directly.\n"
44
44
  "- Never explain tool errors, missing parameters, or recovery mechanics to the user. Silently proceed with available data.\n"
@@ -53,7 +53,7 @@ def build_response_style_rule(lang: str) -> str:
53
53
  return (
54
54
  "## 终端回答风格\n"
55
55
  "- 先给结论或直接答案,不要以“好的/当然/我来帮你”开头。\n"
56
- "- 严格匹配货币符号:美股(如 AAPL、TSLA)必须使用 '$' (USD);A股使用 '¥' (CNY);港股使用 'HK$'。严禁将美股均线/价格标注为人民币。\n"
56
+ "- 严格匹配货币:按数据给出的货币代码标注金额——美股(如 AAPL、TSLA)用 USD,A股用 CNY,港股用 HKD;严禁混用,严禁将美股均线/价格标注为人民币。\n"
57
57
  "- 金融指标结构化排版:价格、涨跌幅、RSI、MACD、均线、布林带等必须使用结构清晰的 Markdown 表格或整齐键值对呈现,禁止乱序纯文本堆砌。\n"
58
58
  "- 严禁在对话中向用户输出未执行的 Python 伪代码或脚本片段;直接给出整理后的金融分析结论与核心数据。\n"
59
59
  "- 严禁向用户解释底层工具调用失败的原因或道歉(如“因缺少参数导致web_search失败”);遇网络或工具异常时静默使用备用数据并继续分析。\n"
@@ -2752,6 +2752,50 @@ def _render_answer_block(text: str) -> None:
2752
2752
  console.print(Padding(make_markdown(_strip_latex(text)), (0, 0, 0, 4)))
2753
2753
 
2754
2754
 
2755
+ _MODEL_UNAVAILABLE_MARKERS = (
2756
+ "vertex_needs_project", "vertex_not_logged_in", "vertex_gcloud_failed", "missing_api_key:",
2757
+ "no_cloud_provider", "no_provider", "all_providers_failed", "http 401", "http 403", "http 402",
2758
+ "insufficient balance", "http 429", "rate limit",
2759
+ )
2760
+
2761
+
2762
+ def _model_unavailable(error: object) -> bool:
2763
+ """The turn failed because no model could be reached — not because of what was asked."""
2764
+ text = str(error or "").lower()
2765
+ return any(marker in text for marker in _MODEL_UNAVAILABLE_MARKERS)
2766
+
2767
+
2768
+ def _data_without_model(message: str, history: list) -> dict:
2769
+ """What Aria can answer from data alone, for a turn whose model is unreachable.
2770
+
2771
+ With no Google project set, "AAPL price" printed setup guidance and
2772
+ nothing else, though the quote needs no model: the same pre-fetch that
2773
+ serves tool-less routes answers it.
2774
+ """
2775
+ try:
2776
+ found = _run_deterministic_chain(message, model_has_tools=False, history=history)
2777
+ except Exception as exc:
2778
+ logger.debug("data fallback failed: %s", exc)
2779
+ return {}
2780
+ return found if found.get("success") and (found.get("response") or "").strip() else {}
2781
+
2782
+
2783
+ def _announce_route(command_text: str) -> None:
2784
+ """Say which command a plain-language message ran: "→ /news AAPL".
2785
+
2786
+ Routed messages used to run their command silently, so a misroute looked
2787
+ like Aria misunderstanding, and nobody learned the command for next time.
2788
+ """
2789
+ if _ARIA_BOT_MODE:
2790
+ return
2791
+ if HAS_RICH:
2792
+ from rich.text import Text
2793
+
2794
+ console.print(Text(f" → {command_text}", style="dim"))
2795
+ else:
2796
+ print(f" → {command_text}")
2797
+
2798
+
2755
2799
  def _print_tool_call(tool_name: str, params: dict):
2756
2800
  """Print tool call header — Claude Code-style ⏺ bullet tree."""
2757
2801
  if _ARIA_BOT_MODE:
@@ -4694,6 +4738,7 @@ class ArtheraTerminal:
4694
4738
  if routed is not None:
4695
4739
  self._send_message_route_active = True
4696
4740
  try:
4741
+ _announce_route(routed.text)
4697
4742
  self._maybe_show_intent_preflight(routed.text)
4698
4743
  await self.commands.execute(routed.text)
4699
4744
  finally:
@@ -4703,6 +4748,7 @@ class ArtheraTerminal:
4703
4748
  if routed is not None:
4704
4749
  self._send_message_route_active = True
4705
4750
  try:
4751
+ _announce_route(routed.text)
4706
4752
  self._maybe_show_intent_preflight(routed.text)
4707
4753
  await self.commands.execute(routed.text)
4708
4754
  finally:
@@ -5335,6 +5381,30 @@ class ArtheraTerminal:
5335
5381
  result.get("error", "Unknown error"),
5336
5382
  lang=self.config.get("ui_lang", "en") or "en",
5337
5383
  )
5384
+ _offline_answer = (
5385
+ _data_without_model(message, self.conversation[:-1])
5386
+ if _model_unavailable(result.get("error")) else {}
5387
+ )
5388
+ if _offline_answer:
5389
+ # The data is the answer; the model problem is a note under it.
5390
+ _en_note = _detect_lang(message) == "en"
5391
+ _answer = _offline_answer["response"]
5392
+ if HAS_RICH:
5393
+ console.print()
5394
+ console.print(make_markdown(_strip_latex(_answer))) # its header carries the disclaimer
5395
+ else:
5396
+ print("\n" + _answer)
5397
+ self.conversation.append({"role": "assistant", "content": _answer})
5398
+ self._last_response = _answer
5399
+ error_presentation = AgentErrorPresentation(
5400
+ error=error_presentation.error,
5401
+ level="warning",
5402
+ lines=[
5403
+ ("模型不可用,以上为数据快照(未经模型分析)。" if not _en_note else
5404
+ "The model is unavailable, so this is the data snapshot without model analysis."),
5405
+ *error_presentation.lines[-1:],
5406
+ ],
5407
+ )
5338
5408
  console.print() if HAS_RICH else print()
5339
5409
  if error_presentation.use_generic_error_prefix:
5340
5410
  _print_error(error_presentation.lines[0])
@@ -6357,7 +6427,7 @@ class ArtheraTerminal:
6357
6427
  # Intercepts bare keywords like "analyze AAPL" → /analyze AAPL
6358
6428
  # so users don't need to type the slash for common quant workflows.
6359
6429
  self._maybe_show_intent_preflight(user_input)
6360
- _routed = await try_top_level_route(user_input, self.commands)
6430
+ _routed = await try_top_level_route(user_input, self.commands, announce=_announce_route)
6361
6431
  if _routed:
6362
6432
  continue
6363
6433
 
@@ -321,31 +321,76 @@ if HAS_PT:
321
321
  display_meta = meta_str,
322
322
  )
323
323
 
324
+ def _mention_index(self):
325
+ if getattr(self, "_mentions", None) is None:
326
+ from aria_code.ui.mentions import MentionIndex
327
+
328
+ self._mentions = MentionIndex(self.workspace, output_root=self.output_root, symbols=self.symbols)
329
+ return self._mentions
330
+
331
+ def _kind_label(self, name: str) -> str:
332
+ for kind in REFERENCE_KINDS:
333
+ if kind.name == name:
334
+ return kind.label_zh if self.lang == "zh" else kind.label_en
335
+ return name
336
+
337
+ def _kind_shortcuts(self, frag: str) -> Iterator[Completion]:
338
+ lowered = frag.lower()
339
+ for kind in REFERENCE_KINDS:
340
+ if kind.name.startswith(lowered):
341
+ yield Completion(
342
+ f"{kind.name}:",
343
+ start_position=-len(frag),
344
+ display=FormattedText([("class:fz-hi", f"@{kind.name}"), ("class:fz-cat", ":")]),
345
+ display_meta=(f"只看{self._kind_label(kind.name)}" if self.lang == "zh"
346
+ else f"{self._kind_label(kind.name)} only"),
347
+ )
348
+
349
+ def _mention_completions(self, mentions, replace: int) -> Iterator[Completion]:
350
+ for mention in mentions:
351
+ hits = set(mention.matched)
352
+ parts = [("class:fz-hi" if i in hits else "", ch) for i, ch in enumerate(mention.label)]
353
+ yield Completion(
354
+ mention.insert_text,
355
+ start_position=-replace,
356
+ display=FormattedText(parts),
357
+ display_meta=self._kind_label(mention.kind),
358
+ )
359
+
324
360
  def _reference_completions(self, frag: str) -> Iterator[Completion]:
325
- """Complete typed reference namespaces and their values."""
361
+ """Complete "@" references: results across every kind first.
362
+
363
+ "@" used to open on the kinds (file:, asset: …) and list files only
364
+ after a path character, so attaching a file took three steps. A
365
+ bare "@" now shows recently changed files, "@fx" searches files,
366
+ folders, assets and saved resources together, and "@file:" or
367
+ another kind prefix narrows to that kind.
368
+ """
326
369
  if ":" not in frag:
327
- lowered = frag.lower()
328
- for kind in REFERENCE_KINDS:
329
- if kind.name.startswith(lowered):
330
- label = kind.label_zh if self.lang == "zh" else kind.label_en
331
- yield Completion(
332
- f"{kind.name}:",
333
- start_position=-len(frag),
334
- display=FormattedText([
335
- ("class:fz-hi", f"@{kind.name}"),
336
- ("class:fz-cat", ":"),
337
- ]),
338
- display_meta=label,
339
- )
340
- # Keep the first-level @ menu semantic and compact. Plain-path
341
- # completion remains available only after an explicit path
342
- # prefix; normal discovery goes through @file:/@folder:.
370
+ # Browsing by path ("@src/", "@./", "@~/") works as before.
343
371
  if frag and (frag.startswith((".", "/", "~")) or "/" in frag):
344
372
  yield from self._file_completions(frag)
373
+ return
374
+ index = self._mention_index()
375
+ if not frag:
376
+ from aria_code.ui.mentions import Mention
377
+
378
+ recent = [Mention("file", path, 0) for path in index.recent_files()]
379
+ yield from self._mention_completions(recent, 0)
380
+ yield from self._kind_shortcuts("")
381
+ return
382
+ if len(frag) >= 2:
383
+ yield from self._kind_shortcuts(frag)
384
+ yield from self._mention_completions(index.search(frag), len(frag))
345
385
  return
346
386
 
347
387
  kind, value_frag = frag.split(":", 1)
348
388
  kind = kind.lower()
389
+ path_like = value_frag.startswith((".", "/", "~")) or "/" in value_frag
390
+ if kind in {"file", "folder"} and value_frag and not path_like:
391
+ found = self._mention_index().search(value_frag, kind=kind)
392
+ yield from self._mention_completions(found, len(frag))
393
+ return
349
394
  if kind == "asset":
350
395
  for symbol in self.symbols:
351
396
  if symbol.lower().startswith(value_frag.lower()):