aria-code 0.81.0__tar.gz → 0.82.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 (741) hide show
  1. {aria_code-0.81.0/src/aria_code.egg-info → aria_code-0.82.0}/PKG-INFO +1 -1
  2. {aria_code-0.81.0 → aria_code-0.82.0}/pyproject.toml +1 -1
  3. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +13 -11
  5. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/broker_cmds.py +5 -3
  6. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +5 -2
  7. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/core_cmds.py +4 -3
  8. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/data_cmds.py +11 -7
  9. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market_cmds.py +8 -6
  10. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +3 -1
  11. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +3 -1
  12. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/market_handlers.py +9 -4
  13. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/i18n.py +11 -0
  14. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/base.py +53 -0
  15. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/utils/market_detect.py +35 -2
  16. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_cli.py +9 -2
  17. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/agent_loop.py +39 -0
  18. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/render/market.py +23 -15
  19. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/render/output.py +19 -2
  20. {aria_code-0.81.0 → aria_code-0.82.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  21. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code.egg-info/SOURCES.txt +3 -0
  22. aria_code-0.82.0/tests/test_first_run_output.py +107 -0
  23. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_answers_in_english.py +6 -0
  24. aria_code-0.82.0/tests/test_numeric_listings.py +57 -0
  25. aria_code-0.82.0/tests/test_status_language.py +70 -0
  26. {aria_code-0.81.0 → aria_code-0.82.0}/LICENSE +0 -0
  27. {aria_code-0.81.0 → aria_code-0.82.0}/NOTICE +0 -0
  28. {aria_code-0.81.0 → aria_code-0.82.0}/README.md +0 -0
  29. {aria_code-0.81.0 → aria_code-0.82.0}/setup.cfg +0 -0
  30. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/__init__.py +0 -0
  31. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/adk_apps/__init__.py +0 -0
  32. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  33. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  34. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  35. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  36. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/__init__.py +0 -0
  37. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/base.py +0 -0
  38. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/code_review.py +0 -0
  39. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/__init__.py +0 -0
  40. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  41. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/critic.py +0 -0
  42. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/deepen.py +0 -0
  43. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/models.py +0 -0
  44. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  45. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  46. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/themes.py +0 -0
  47. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/deep/tiers.py +0 -0
  48. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  49. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/engineering/coder.py +0 -0
  50. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/engineering/tester.py +0 -0
  51. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/__init__.py +0 -0
  52. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  53. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  54. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  55. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/debate.py +0 -0
  56. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/earnings.py +0 -0
  57. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  58. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/macro.py +0 -0
  59. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/news.py +0 -0
  60. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/risk.py +0 -0
  61. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/sector.py +0 -0
  62. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/strategist.py +0 -0
  63. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  64. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  65. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/financial/technical.py +0 -0
  66. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/orchestrator.py +0 -0
  67. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  68. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/__init__.py +0 -0
  69. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  70. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/business_match.py +0 -0
  71. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  72. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  73. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  74. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  75. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  76. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  77. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  78. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/registry.py +0 -0
  79. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/signal_scheme.py +0 -0
  80. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/sports/__init__.py +0 -0
  81. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  82. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/supervisor.py +0 -0
  83. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/team.py +0 -0
  84. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  85. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  86. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  87. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  88. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  89. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  90. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  91. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  92. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  93. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  94. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  95. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aliyun_data_client.py +0 -0
  96. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/README.md +0 -0
  97. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/__init__.py +0 -0
  98. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/README.md +0 -0
  99. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/__init__.py +0 -0
  100. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/approvals.py +0 -0
  101. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/conversation.py +0 -0
  102. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/digest.py +0 -0
  103. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/intake.py +0 -0
  104. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/registry.py +0 -0
  105. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  106. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/README.md +0 -0
  107. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/__init__.py +0 -0
  108. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/_optional.py +0 -0
  109. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  110. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  111. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  112. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  113. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  114. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  115. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  116. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  117. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  118. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  119. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  120. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  121. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  122. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  123. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  124. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  125. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  126. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  127. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  128. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  129. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  130. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  131. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  132. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  133. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  134. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  135. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  136. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  137. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  138. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  139. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  140. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  141. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  142. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/config_store.py +0 -0
  143. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/constants.py +0 -0
  144. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/context.py +0 -0
  145. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  146. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/direct.py +0 -0
  147. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  148. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  149. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  150. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/google_login.py +0 -0
  151. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  152. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  153. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  154. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  155. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  156. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  157. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/helpers.py +0 -0
  158. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/hooks.py +0 -0
  159. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/intent.py +0 -0
  160. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  161. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  162. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  163. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  164. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/main.py +0 -0
  165. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  166. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  167. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  168. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  169. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  170. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  171. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  172. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  173. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  174. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/preflight.py +0 -0
  175. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  176. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  177. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  178. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  179. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  180. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  181. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  182. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  183. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  184. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  185. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  186. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  187. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  188. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  189. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  190. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  191. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  192. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  193. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  194. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  195. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  196. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  197. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/session_export.py +0 -0
  198. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  199. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/session_store.py +0 -0
  200. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  201. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  202. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  203. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  204. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  205. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  206. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  207. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  208. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  209. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  210. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  211. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  212. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  213. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  214. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/update_check.py +0 -0
  215. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/updater.py +0 -0
  216. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  217. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/daemon/README.md +0 -0
  218. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/vscode/README.md +0 -0
  219. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/apps/vscode/package.json +0 -0
  220. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_daemon.py +0 -0
  221. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_feishu_bot.py +0 -0
  222. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_mcp_server.py +0 -0
  223. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_relay_client.py +0 -0
  224. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_relay_server.py +0 -0
  225. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/aria_telegram_bot.py +0 -0
  226. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ariarc.py +0 -0
  227. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/artifacts.py +0 -0
  228. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/backtest_engine.py +0 -0
  229. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/backtest_report.py +0 -0
  230. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/__init__.py +0 -0
  231. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/automation.py +0 -0
  232. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/base.py +0 -0
  233. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/capabilities.py +0 -0
  234. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  235. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  236. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  237. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  238. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  239. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  240. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/config.py +0 -0
  241. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  242. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  243. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  244. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  245. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  246. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/paper_broker.py +0 -0
  247. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/planning.py +0 -0
  248. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/registry.py +0 -0
  249. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/brokers/trading.py +0 -0
  250. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/canva_client.py +0 -0
  251. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/change_store.py +0 -0
  252. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/__init__.py +0 -0
  253. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  254. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  255. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/canva_client.py +0 -0
  256. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/figma_client.py +0 -0
  257. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/football_data_client.py +0 -0
  258. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/kling_video_client.py +0 -0
  259. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/market_data_client.py +0 -0
  260. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/openai_image_client.py +0 -0
  261. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/runway_video_client.py +0 -0
  262. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  263. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/cloud_memory.py +0 -0
  264. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/command_safety.py +0 -0
  265. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/computer_use_tools.py +0 -0
  266. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/dashboard_generator.py +0 -0
  267. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/data_analysis_tools.py +0 -0
  268. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/data_cleaner.py +0 -0
  269. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/data_service.py +0 -0
  270. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/__init__.py +0 -0
  271. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/base.py +0 -0
  272. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/router.py +0 -0
  273. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  274. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  275. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  276. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  277. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  278. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  279. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  280. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  281. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  282. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  283. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/demo_player.py +0 -0
  284. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/doctor.py +0 -0
  285. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/domain/__init__.py +0 -0
  286. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/domain/backtest_engine.py +0 -0
  287. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/domain/backtest_report.py +0 -0
  288. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/domain/finance_formulas.py +0 -0
  289. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  290. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/domain/strategy_vault.py +0 -0
  291. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/evals/__init__.py +0 -0
  292. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/evals/harness.py +0 -0
  293. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/evals/runner.py +0 -0
  294. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/external_agent_runner.py +0 -0
  295. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/figma_client.py +0 -0
  296. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/file_analysis_tools.py +0 -0
  297. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/finance_formulas.py +0 -0
  298. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/football_data_client.py +0 -0
  299. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/image_gen_tools.py +0 -0
  300. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/intent_classifier.py +0 -0
  301. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/kling_video_client.py +0 -0
  302. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/licensing.py +0 -0
  303. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/local_finance_tools.py +0 -0
  304. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/local_image_provider.py +0 -0
  305. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/local_llm_provider.py +0 -0
  306. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/macro_tools.py +0 -0
  307. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/markdown_pdf.py +0 -0
  308. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/market_data_client.py +0 -0
  309. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/mcp_client.py +0 -0
  310. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/memory_manager.py +0 -0
  311. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/model_capability.py +0 -0
  312. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/notification_tools.py +0 -0
  313. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/openai_image_client.py +0 -0
  314. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/__init__.py +0 -0
  315. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  316. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  317. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  318. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  319. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  320. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  321. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  322. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/export.py +0 -0
  323. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  324. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  325. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  326. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  327. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  328. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  329. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  330. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  331. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  332. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  333. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  334. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  335. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  336. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  337. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  338. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  339. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  340. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  341. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  342. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  343. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  344. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/context.py +0 -0
  345. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  346. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/data.py +0 -0
  347. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  348. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/references.py +0 -0
  349. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  350. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  351. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  352. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  353. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  354. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  355. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  356. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  357. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  358. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  359. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  360. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  361. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  362. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  363. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  364. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  365. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  366. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  367. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  368. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  369. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  370. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  371. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  372. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  373. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  374. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  375. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  376. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  377. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  378. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  379. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  380. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  381. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  382. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  383. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  384. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  385. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  386. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  387. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  388. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  389. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/__init__.py +0 -0
  390. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/base.py +0 -0
  391. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/finance/__init__.py +0 -0
  392. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  393. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/payments/__init__.py +0 -0
  394. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/realty/__init__.py +0 -0
  395. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/registry.py +0 -0
  396. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/packs/rules.py +0 -0
  397. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/plan_utils.py +0 -0
  398. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/plugin_loader.py +0 -0
  399. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/portfolio_ledger.py +0 -0
  400. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/preview_server.py +0 -0
  401. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/privacy/__init__.py +0 -0
  402. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/privacy/feedback.py +0 -0
  403. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/project_review.py +0 -0
  404. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/project_review_api.py +0 -0
  405. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/project_review_server.py +0 -0
  406. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/project_tools.py +0 -0
  407. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/__init__.py +0 -0
  408. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/__init__.py +0 -0
  409. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  410. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  411. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/base.py +0 -0
  412. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/custom.py +0 -0
  413. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/ollama.py +0 -0
  414. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  415. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/llm/registry.py +0 -0
  416. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/local_image_provider.py +0 -0
  417. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  418. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/providers/tool_messages.py +0 -0
  419. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/realty_data_tools.py +0 -0
  420. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/relay_store.py +0 -0
  421. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/report_exporters.py +0 -0
  422. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/report_generator.py +0 -0
  423. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/review_service.py +0 -0
  424. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/__init__.py +0 -0
  425. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/acceptance.py +0 -0
  426. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/approval.py +0 -0
  427. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/budget.py +0 -0
  428. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/checkpoints.py +0 -0
  429. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/crash_report.py +0 -0
  430. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/events.py +0 -0
  431. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/gateway.py +0 -0
  432. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/lsp.py +0 -0
  433. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/orchestrator.py +0 -0
  434. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/repo_map.py +0 -0
  435. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/run_state.py +0 -0
  436. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/run_store.py +0 -0
  437. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/self_healing.py +0 -0
  438. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/subagent.py +0 -0
  439. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/task_ledger.py +0 -0
  440. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  441. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/tool_executor.py +0 -0
  442. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/tool_policy.py +0 -0
  443. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runtime/worktrees.py +0 -0
  444. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/runway_video_client.py +0 -0
  445. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/safety/__init__.py +0 -0
  446. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/safety/permissions.py +0 -0
  447. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/safety/service.py +0 -0
  448. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/setup_wizard.py +0 -0
  449. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/spreadsheet_tools.py +0 -0
  450. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/strategy_vault.py +0 -0
  451. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/__init__.py +0 -0
  452. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/artifact_tools.py +0 -0
  453. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/broker_tools.py +0 -0
  454. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  455. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  456. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  457. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  458. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  459. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/extended_tools.py +0 -0
  460. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  461. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  462. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  463. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  464. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  465. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_io.py +0 -0
  466. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  467. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_tools.py +0 -0
  468. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/macro_tools.py +0 -0
  469. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/notification_tools.py +0 -0
  470. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/project_tools.py +0 -0
  471. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  472. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  473. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/tools/stripe_tools.py +0 -0
  474. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/__init__.py +0 -0
  475. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/banner.py +0 -0
  476. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/completer.py +0 -0
  477. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/console.py +0 -0
  478. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/image_render.py +0 -0
  479. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/input_box.py +0 -0
  480. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/picker.py +0 -0
  481. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/render/__init__.py +0 -0
  482. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/render/finance.py +0 -0
  483. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/render/responsive.py +0 -0
  484. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/render/team.py +0 -0
  485. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/robot.py +0 -0
  486. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  487. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/utils/vscode_uri.py +0 -0
  488. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/video_analysis.py +0 -0
  489. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/video_editor.py +0 -0
  490. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace/__init__.py +0 -0
  491. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace/files.py +0 -0
  492. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace/verify.py +0 -0
  493. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace_changes.py +0 -0
  494. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace_context.py +0 -0
  495. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace_service.py +0 -0
  496. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code/workspace_tools.py +0 -0
  497. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  498. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  499. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code.egg-info/requires.txt +0 -0
  500. {aria_code-0.81.0 → aria_code-0.82.0}/src/aria_code.egg-info/top_level.txt +0 -0
  501. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_adk_market_tools.py +0 -0
  502. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_agent_team_fallback.py +0 -0
  503. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_analyze_file_tool.py +0 -0
  504. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_architecture_ledger_is_true.py +0 -0
  505. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_architecture_report.py +0 -0
  506. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_aria_cli_core.py +0 -0
  507. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_aria_mcp_server.py +0 -0
  508. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_aria_sdk.py +0 -0
  509. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_artifact_publishing.py +0 -0
  510. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_artifacts_and_reports.py +0 -0
  511. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ashare_prediction_cmds.py +0 -0
  512. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_backtest_cmds.py +0 -0
  513. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_backtest_engine.py +0 -0
  514. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_backtest_report.py +0 -0
  515. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  516. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_broken_akshare_is_optional.py +0 -0
  517. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_broker_automation.py +0 -0
  518. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  519. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_broker_planning.py +0 -0
  520. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_broker_safety.py +0 -0
  521. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_broker_tools.py +0 -0
  522. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_budget.py +0 -0
  523. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_business_workflow_cmds.py +0 -0
  524. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_canva_client.py +0 -0
  525. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_canvas_cmds.py +0 -0
  526. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_card_approvals.py +0 -0
  527. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_channel_intake.py +0 -0
  528. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_channels.py +0 -0
  529. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_chart_handlers.py +0 -0
  530. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_chat_bots_fail_closed.py +0 -0
  531. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_chat_routing.py +0 -0
  532. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ci_security_workflow.py +0 -0
  533. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_app_split.py +0 -0
  534. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_bootstrap.py +0 -0
  535. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_config_store.py +0 -0
  536. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  537. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_runtime_consumer.py +0 -0
  538. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_tool_executor_module.py +0 -0
  539. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cli_updater.py +0 -0
  540. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_cloud_memory.py +0 -0
  541. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_code_audit_tools.py +0 -0
  542. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_code_review_agent.py +0 -0
  543. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_codegen_output.py +0 -0
  544. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_coder_tester_self_healing.py +0 -0
  545. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_coder_tool_safety.py +0 -0
  546. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_collaboration.py +0 -0
  547. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_command_loggers.py +0 -0
  548. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_command_safety.py +0 -0
  549. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_completions_builder.py +0 -0
  550. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_config_paths.py +0 -0
  551. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_configured_provider.py +0 -0
  552. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_container_entrypoint.py +0 -0
  553. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_container_entrypoints.py +0 -0
  554. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_context_checkpoints.py +0 -0
  555. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_context_references.py +0 -0
  556. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_context_service.py +0 -0
  557. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_conversation_core.py +0 -0
  558. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_crash_report.py +0 -0
  559. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_credential_file_permissions.py +0 -0
  560. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_custom_providers.py +0 -0
  561. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_daemon_gateway_config.py +0 -0
  562. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_dashboard_generator.py +0 -0
  563. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_data_service.py +0 -0
  564. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_data_service_imports.py +0 -0
  565. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_datasource_routing.py +0 -0
  566. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_deep_analysis.py +0 -0
  567. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_degrades_without_quant_engine.py +0 -0
  568. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  569. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_doctor.py +0 -0
  570. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  571. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_doctor_npm_scope.py +0 -0
  572. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_engine_boundary.py +0 -0
  573. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_enterprise_tool_honesty.py +0 -0
  574. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_env_switch_docs.py +0 -0
  575. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_evals_harness.py +0 -0
  576. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_event_import_roots.py +0 -0
  577. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_extended_tools.py +0 -0
  578. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_feishu_swarm_config.py +0 -0
  579. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_finalize_release.py +0 -0
  580. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_finance_renderers.py +0 -0
  581. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_finance_service_catalog.py +0 -0
  582. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_first_run_works.py +0 -0
  583. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_football_agent.py +0 -0
  584. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_football_prediction_output.py +0 -0
  585. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_google_cloud_models.py +0 -0
  586. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_google_cloud_routing.py +0 -0
  587. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_google_login.py +0 -0
  588. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_google_search_provider.py +0 -0
  589. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_headless_is_agentic.py +0 -0
  590. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_honest_surfaces.py +0 -0
  591. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_image_gen_tools.py +0 -0
  592. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_image_inputs.py +0 -0
  593. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_import_graph_budget.py +0 -0
  594. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_intent_router.py +0 -0
  595. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_intent_signals.py +0 -0
  596. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_kling_video_client.py +0 -0
  597. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_lazy_rebind.py +0 -0
  598. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_legacy_module_imports.py +0 -0
  599. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_license_consistency.py +0 -0
  600. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_licensing.py +0 -0
  601. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_local_image_provider.py +0 -0
  602. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_logistics_3pl.py +0 -0
  603. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_logistics_and_finance_agents.py +0 -0
  604. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_lsp.py +0 -0
  605. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_markdown_pdf.py +0 -0
  606. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_data_client.py +0 -0
  607. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_history_inheritance.py +0 -0
  608. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_history_tool.py +0 -0
  609. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_hours.py +0 -0
  610. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_questions_on_backend.py +0 -0
  611. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_symbol_extraction.py +0 -0
  612. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_market_universe.py +0 -0
  613. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_mcp_circuit.py +0 -0
  614. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_mcp_client.py +0 -0
  615. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_model_capability_registry.py +0 -0
  616. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_model_choice_is_the_users.py +0 -0
  617. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_model_selection_state.py +0 -0
  618. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_native_binary_entrypoints.py +0 -0
  619. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_native_installer.py +0 -0
  620. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_new_modules.py +0 -0
  621. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  622. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_no_uncommitted_imports.py +0 -0
  623. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ollama_stream_imports.py +0 -0
  624. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ollama_stream_tools.py +0 -0
  625. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_openai_image_client.py +0 -0
  626. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_operations_suite.py +0 -0
  627. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_output_rendering.py +0 -0
  628. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_packages_facade.py +0 -0
  629. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_packaging_constraints.py +0 -0
  630. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_packaging_manifest.py +0 -0
  631. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_packs_domains.py +0 -0
  632. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_pdf_report.py +0 -0
  633. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_pick_best_installed_model.py +0 -0
  634. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_plan_mode.py +0 -0
  635. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_platform_package_assembly.py +0 -0
  636. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_platform_packages.py +0 -0
  637. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_plotly_html_output.py +0 -0
  638. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_portfolio_ledger.py +0 -0
  639. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_post_turn_context_decision.py +0 -0
  640. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_preflight.py +0 -0
  641. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_preview_server.py +0 -0
  642. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_privacy_feedback.py +0 -0
  643. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_project_aria.py +0 -0
  644. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_project_review.py +0 -0
  645. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_project_review_api.py +0 -0
  646. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_prompt_assembly.py +0 -0
  647. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_prompt_selection.py +0 -0
  648. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_provider_autoconfig.py +0 -0
  649. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_provider_error_messages.py +0 -0
  650. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_provider_integration.py +0 -0
  651. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_provider_registry.py +0 -0
  652. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_public_service_status.py +0 -0
  653. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_quant_engine_namespace.py +0 -0
  654. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_rebind_contract.py +0 -0
  655. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_rebind_namespace_contract.py +0 -0
  656. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_relay_client_credentials.py +0 -0
  657. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_relay_event_verification.py +0 -0
  658. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_relay_sends_for_clients.py +0 -0
  659. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_relay_store.py +0 -0
  660. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_relay_url.py +0 -0
  661. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_release_chain.py +0 -0
  662. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_release_commit_identity.py +0 -0
  663. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_release_push_is_atomic.py +0 -0
  664. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_release_reaches_the_registries.py +0 -0
  665. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_release_verification_waits.py +0 -0
  666. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_release_workflow_permissions.py +0 -0
  667. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_report_charts.py +0 -0
  668. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_report_generator.py +0 -0
  669. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_research_protocol.py +0 -0
  670. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_research_quality.py +0 -0
  671. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_responsive_rendering.py +0 -0
  672. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_review_service.py +0 -0
  673. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_root_module_budget.py +0 -0
  674. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  675. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_acceptance.py +0 -0
  676. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_agent_loop.py +0 -0
  677. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_approval.py +0 -0
  678. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_bridge.py +0 -0
  679. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_bridge_fallback.py +0 -0
  680. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_checkpoints.py +0 -0
  681. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_event_identity.py +0 -0
  682. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_gateway.py +0 -0
  683. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_repo_map.py +0 -0
  684. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_run_store.py +0 -0
  685. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_tool_executor.py +0 -0
  686. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runtime_worktrees.py +0 -0
  687. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_runway_video_client.py +0 -0
  688. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_safety_permissions.py +0 -0
  689. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_safety_service.py +0 -0
  690. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_safety_service_adoption.py +0 -0
  691. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_service_diagnostics_security.py +0 -0
  692. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_session_search.py +0 -0
  693. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_settings_service.py +0 -0
  694. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_shipper_digest.py +0 -0
  695. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_single_import_root.py +0 -0
  696. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_skill_agent_binding.py +0 -0
  697. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_skill_catalog.py +0 -0
  698. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_skill_loader.py +0 -0
  699. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_spreadsheet_tools.py +0 -0
  700. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_sse_stream_contract.py +0 -0
  701. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_startup_dashboard.py +0 -0
  702. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_startup_latency.py +0 -0
  703. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_streaming_pipeline.py +0 -0
  704. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_stripe_agent.py +0 -0
  705. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_subagent.py +0 -0
  706. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_supervisor_routing.py +0 -0
  707. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_system_prompts.py +0 -0
  708. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_system_tools_output.py +0 -0
  709. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_task_orchestrator.py +0 -0
  710. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_team_synthesis.py +0 -0
  711. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_tls_trust_store.py +0 -0
  712. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_tool_policy.py +0 -0
  713. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  714. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_tool_scope.py +0 -0
  715. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_trading_service.py +0 -0
  716. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_tradingview_bridge.py +0 -0
  717. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_turn_planning.py +0 -0
  718. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ui_completer_references.py +0 -0
  719. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ui_console_theme.py +0 -0
  720. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ui_input_box.py +0 -0
  721. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ui_language_and_model.py +0 -0
  722. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_ui_robot_banner.py +0 -0
  723. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_update_health_routes.py +0 -0
  724. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_verification_hint.py +0 -0
  725. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_verification_policy.py +0 -0
  726. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_version_consistency.py +0 -0
  727. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_version_counter.py +0 -0
  728. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_video_analysis.py +0 -0
  729. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_video_editor.py +0 -0
  730. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_vscode_mcp.py +0 -0
  731. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_warehouse_agents.py +0 -0
  732. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_warehouse_cli_registration.py +0 -0
  733. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_warehouse_erp_client.py +0 -0
  734. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_warehouse_workflow.py +0 -0
  735. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_wheel_is_installable.py +0 -0
  736. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_workspace_changes.py +0 -0
  737. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_workspace_context.py +0 -0
  738. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_workspace_files.py +0 -0
  739. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_workspace_scope.py +0 -0
  740. {aria_code-0.81.0 → aria_code-0.82.0}/tests/test_workspace_service.py +0 -0
  741. {aria_code-0.81.0 → aria_code-0.82.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.81.0
3
+ Version: 0.82.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.81.0"
7
+ version = "0.82.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.81.0"
20
+ __version__ = "0.82.0"
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from aria_code.apps.cli.i18n import ui_text
6
+
5
7
  from aria_code.apps.cli.commands.market import parse_analysis_args
6
8
  from aria_code.apps.cli.commands.market_context import context_has_price
7
9
 
@@ -98,7 +100,7 @@ class AnalysisCommandsMixin:
98
100
  response_lang = parsed.lang or ("zh" if is_cn else "en")
99
101
 
100
102
  if self.context.has_rich:
101
- with self.context.console.status(f"[dim]正在获取 {symbol} 数据...[/dim]", spinner="dots"):
103
+ with self.context.console.status(f"[dim]{ui_text(self, f'正在获取 {symbol} 数据', f'Fetching {symbol} data')}...[/dim]", spinner="dots"):
102
104
  ctx = await self._build_analyze_context(symbol, is_cn)
103
105
  else:
104
106
  print(f"Fetching data for {symbol}...")
@@ -166,7 +168,7 @@ class AnalysisCommandsMixin:
166
168
 
167
169
  if region in ("us", "all"):
168
170
  if self.context.has_rich:
169
- with self.context.console.status("[dim]获取美国宏观数据 (FRED)...[/dim]", spinner="dots"):
171
+ with self.context.console.status(f"[dim]{ui_text(self, '获取美国宏观数据 (FRED)', 'Fetching US macro data (FRED)')}...[/dim]", spinner="dots"):
170
172
  r = await loop.run_in_executor(None, lambda: get_us_macro(indicator if region == "us" else "all"))
171
173
  else:
172
174
  r = get_us_macro(indicator if region == "us" else "all")
@@ -174,7 +176,7 @@ class AnalysisCommandsMixin:
174
176
 
175
177
  if region in ("cn", "all"):
176
178
  if self.context.has_rich:
177
- with self.context.console.status("[dim]获取中国宏观数据 (akshare)...[/dim]", spinner="dots"):
179
+ with self.context.console.status(f"[dim]{ui_text(self, '获取中国宏观数据 (akshare)', 'Fetching China macro data (akshare)')}...[/dim]", spinner="dots"):
178
180
  r_cn = await loop.run_in_executor(None, lambda: get_cn_macro(indicator if region == "cn" else "all"))
179
181
  else:
180
182
  r_cn = get_cn_macro(indicator if region == "cn" else "all")
@@ -182,7 +184,7 @@ class AnalysisCommandsMixin:
182
184
 
183
185
  if region in ("rates", "all"):
184
186
  if self.context.has_rich:
185
- with self.context.console.status("[dim]获取央行利率...[/dim]", spinner="dots"):
187
+ with self.context.console.status(f"[dim]{ui_text(self, '获取央行利率', 'Fetching central bank rates')}...[/dim]", spinner="dots"):
186
188
  r_rates = await loop.run_in_executor(None, get_central_bank_rates)
187
189
  else:
188
190
  r_rates = get_central_bank_rates()
@@ -190,7 +192,7 @@ class AnalysisCommandsMixin:
190
192
 
191
193
  if region == "calendar":
192
194
  if self.context.has_rich:
193
- with self.context.console.status("[dim]获取经济日历...[/dim]", spinner="dots"):
195
+ with self.context.console.status(f"[dim]{ui_text(self, '获取经济日历', 'Fetching the economic calendar')}...[/dim]", spinner="dots"):
194
196
  r_cal = await loop.run_in_executor(None, lambda: get_economic_calendar(7))
195
197
  else:
196
198
  r_cal = get_economic_calendar(7)
@@ -216,7 +218,7 @@ class AnalysisCommandsMixin:
216
218
  import asyncio as _asyncio
217
219
  loop = _asyncio.get_event_loop()
218
220
  if self.context.has_rich:
219
- with self.context.console.status(f"[dim]获取 {symbol} 期权链...[/dim]", spinner="dots"):
221
+ with self.context.console.status(f"[dim]{ui_text(self, f'获取 {symbol} 期权链', f'Fetching the {symbol} option chain')}...[/dim]", spinner="dots"):
220
222
  from local_finance_tools import _get_options_chain
221
223
  r = await loop.run_in_executor(None, _get_options_chain,
222
224
  {"symbol": symbol, "type": opt_type, "expiry": expiry, "limit": 20})
@@ -281,7 +283,7 @@ class AnalysisCommandsMixin:
281
283
  import asyncio as _asyncio
282
284
  loop = _asyncio.get_event_loop()
283
285
  if self.context.has_rich:
284
- with self.context.console.status(f"[dim]计算 {symbol} 财务质量评分...[/dim]", spinner="dots"):
286
+ with self.context.console.status(f"[dim]{ui_text(self, f'计算 {symbol} 财务质量评分', f'Scoring {symbol} financial quality')}...[/dim]", spinner="dots"):
285
287
  from local_finance_tools import _piotroski_fscore, _altman_zscore
286
288
  f_r = await loop.run_in_executor(None, _piotroski_fscore, {"symbol": symbol})
287
289
  z_r = await loop.run_in_executor(None, _altman_zscore, {"symbol": symbol})
@@ -303,7 +305,7 @@ class AnalysisCommandsMixin:
303
305
  import asyncio as _asyncio
304
306
  loop = _asyncio.get_event_loop()
305
307
  if self.context.has_rich:
306
- with self.context.console.status(f"[dim]计算 {symbol} 一目均衡表...[/dim]", spinner="dots"):
308
+ with self.context.console.status(f"[dim]{ui_text(self, f'计算 {symbol} 一目均衡表', f'Computing {symbol} Ichimoku')}...[/dim]", spinner="dots"):
307
309
  from local_finance_tools import _calculate_ichimoku
308
310
  r = await loop.run_in_executor(None, _calculate_ichimoku, {"symbol": symbol})
309
311
  else:
@@ -322,7 +324,7 @@ class AnalysisCommandsMixin:
322
324
  import asyncio as _asyncio
323
325
  loop = _asyncio.get_event_loop()
324
326
  if self.context.has_rich:
325
- with self.context.console.status("[dim]获取恐惧贪婪指数...[/dim]", spinner="dots"):
327
+ with self.context.console.status(f"[dim]{ui_text(self, '获取恐惧贪婪指数', 'Fetching the Fear & Greed index')}...[/dim]", spinner="dots"):
326
328
  from local_finance_tools import _get_fear_greed_index
327
329
  r = await loop.run_in_executor(None, _get_fear_greed_index, {})
328
330
  else:
@@ -356,7 +358,7 @@ class AnalysisCommandsMixin:
356
358
  loop = _asyncio.get_event_loop()
357
359
  if compare_mode:
358
360
  if self.context.has_rich:
359
- with self.context.console.status("[dim]并行查询 binance / okx / bybit...[/dim]", spinner="dots"):
361
+ with self.context.console.status(f"[dim]{ui_text(self, '并行查询 binance / okx / bybit', 'Querying binance / okx / bybit in parallel')}...[/dim]", spinner="dots"):
360
362
  from local_finance_tools import _get_funding_rates_compare
361
363
  r = await loop.run_in_executor(None, _get_funding_rates_compare, {"symbols": syms})
362
364
  else:
@@ -365,7 +367,7 @@ class AnalysisCommandsMixin:
365
367
  _render_funding_compare(r)
366
368
  else:
367
369
  if self.context.has_rich:
368
- with self.context.console.status(f"[dim]获取 {exchange} 资金费率...[/dim]", spinner="dots"):
370
+ with self.context.console.status(f"[dim]{ui_text(self, f'获取 {exchange} 资金费率', f'Fetching {exchange} funding rates')}...[/dim]", spinner="dots"):
369
371
  from local_finance_tools import _get_funding_rates
370
372
  r = await loop.run_in_executor(None, _get_funding_rates, {"exchange": exchange, "symbols": syms})
371
373
  else:
@@ -6,6 +6,8 @@ imported lazily inside each method body to avoid circular imports at load time.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ from aria_code.apps.cli.i18n import ui_text
10
+
9
11
  from ._ui import Panel, print_error, rich_box
10
12
  from aria_code.packages.aria_core.paths import aria_home
11
13
 
@@ -389,7 +391,7 @@ class BrokerCommandsMixin:
389
391
  label = broker_id
390
392
  try:
391
393
  if self.context.has_rich:
392
- with self.context.console.status(f"[dim]正在连接 {broker_id}...[/dim]", spinner="dots"):
394
+ with self.context.console.status(f"[dim]{ui_text(self, f'正在连接 {broker_id}', f'Connecting to {broker_id}')}...[/dim]", spinner="dots"):
393
395
  import asyncio as _aio
394
396
  loop = _aio.get_event_loop()
395
397
  broker = await loop.run_in_executor(None, reg.connect, broker_id)
@@ -859,7 +861,7 @@ class BrokerCommandsMixin:
859
861
  if not broker:
860
862
  return
861
863
  import asyncio as _aio
862
- with self.context.console.status("[dim]获取持仓...[/dim]", spinner="dots") if self.context.has_rich else _null_ctx():
864
+ with self.context.console.status(f"[dim]{ui_text(self, '获取持仓', 'Fetching positions')}...[/dim]", spinner="dots") if self.context.has_rich else _null_ctx():
863
865
  pos = await _aio.get_event_loop().run_in_executor(None, broker.positions)
864
866
  _print_broker_positions(pos, broker.label, broker.config.get("currency","CNY"))
865
867
  except Exception as e:
@@ -889,7 +891,7 @@ class BrokerCommandsMixin:
889
891
  if not broker:
890
892
  return
891
893
  import asyncio as _aio
892
- with self.context.console.status("[dim]获取订单...[/dim]", spinner="dots") if self.context.has_rich else _null_ctx():
894
+ with self.context.console.status(f"[dim]{ui_text(self, '获取订单', 'Fetching orders')}...[/dim]", spinner="dots") if self.context.has_rich else _null_ctx():
893
895
  orders = await _aio.get_event_loop().run_in_executor(
894
896
  None, lambda: broker.orders(status=status, limit=30)
895
897
  )
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from aria_code.apps.cli.i18n import ui_text
6
+
5
7
  from ._business_render import p, print_realty_result, print_risk_scan
6
8
 
7
9
 
@@ -275,7 +277,7 @@ class BusinessWorkflowCommandsMixin:
275
277
 
276
278
  async def _run_realty_agent(self, agent_name: str, project_id: str, input_data: dict):
277
279
  if self.context.has_rich:
278
- with self.context.console.status(f"[dim]运行 {agent_name} Agent...[/dim]", spinner="dots"):
280
+ with self.context.console.status(f"[dim]{ui_text(self, f'运行 {agent_name} Agent', f'Running the {agent_name} agent')}...[/dim]", spinner="dots"):
279
281
  result = await self._call_realty_agent(agent_name, project_id, input_data)
280
282
  else:
281
283
  print(f"Running {agent_name}...")
@@ -286,7 +288,8 @@ class BusinessWorkflowCommandsMixin:
286
288
  async def _run_realty_team(self, agents: list, project_id: str, input_data: dict):
287
289
  import asyncio
288
290
  if self.context.has_rich:
289
- with self.context.console.status(f"[dim]并行扫描 {', '.join(agents)}...[/dim]", spinner="dots"):
291
+ _names = ', '.join(agents)
292
+ with self.context.console.status(f"[dim]{ui_text(self, f'并行扫描 {_names}', f'Scanning {_names} in parallel')}...[/dim]", spinner="dots"):
290
293
  tasks = [self._call_realty_agent(n, project_id, input_data) for n in agents]
291
294
  results = await asyncio.gather(*tasks, return_exceptions=False)
292
295
  else:
@@ -13,6 +13,7 @@ NameError,而这正是 requires-python = "<3.14,>=3.10" 声明支持的全部
13
13
  全绿。已发布的 4.3.0 同样中招:pip install 后运行 aria-code 直接崩溃。
14
14
  """
15
15
 
16
+ from aria_code.apps.cli.i18n import ui_text
16
17
  from ._ui import print_error
17
18
 
18
19
  import pathlib
@@ -2240,7 +2241,7 @@ class CoreCommandsMixin:
2240
2241
  return
2241
2242
  mdc = _get_mdc()
2242
2243
  if self.context.has_rich:
2243
- with self.context.console.status("[dim]获取全球指数...[/dim]", spinner="dots"):
2244
+ with self.context.console.status(f"[dim]{ui_text(self, '获取全球指数', 'Fetching global indices')}...[/dim]", spinner="dots"):
2244
2245
  r = mdc.indices()
2245
2246
  else:
2246
2247
  print(" 获取全球指数...")
@@ -2287,7 +2288,7 @@ class CoreCommandsMixin:
2287
2288
 
2288
2289
  mdc = _get_mdc()
2289
2290
  if self.context.has_rich:
2290
- with self.context.console.status(f"[dim]获取{market.upper()}热门股...[/dim]", spinner="dots"):
2291
+ with self.context.console.status(f"[dim]{ui_text(self, f'获取{market.upper()}热门股', f'Fetching top {market.upper()} movers')}...[/dim]", spinner="dots"):
2291
2292
  r = mdc.hot_stocks(market=market, top_n=top_n)
2292
2293
  else:
2293
2294
  r = mdc.hot_stocks(market=market, top_n=top_n)
@@ -2489,7 +2490,7 @@ class CoreCommandsMixin:
2489
2490
  sub = parts[1].lower() if len(parts) > 1 else "filings"
2490
2491
 
2491
2492
  if self.context.has_rich:
2492
- with self.context.console.status(f"[dim]查询 EDGAR {symbol}...[/dim]", spinner="dots"):
2493
+ with self.context.console.status(f"[dim]{ui_text(self, f'查询 EDGAR {symbol}', f'Querying EDGAR for {symbol}')}...[/dim]", spinner="dots"):
2493
2494
  result = await asyncio.get_event_loop().run_in_executor(
2494
2495
  None, lambda: _fetch_edgar_data(symbol, sub)
2495
2496
  )
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from aria_code.apps.cli.i18n import ui_text
6
+
5
7
  from ._ui import print_error
6
8
 
7
9
 
@@ -86,7 +88,7 @@ class DataCommandsMixin:
86
88
  self.context.console.print("[dim]用法: /data sql \"SELECT ...\"|/dim]")
87
89
  return
88
90
  if self.context.has_rich:
89
- with self.context.console.status("[dim]执行 SQL...[/dim]", spinner="dots"):
91
+ with self.context.console.status(f"[dim]{ui_text(self, '执行 SQL', 'Running SQL')}...[/dim]", spinner="dots"):
90
92
  r = await loop.run_in_executor(None, sql_query, {"query": query})
91
93
  else:
92
94
  r = sql_query({"query": query})
@@ -104,7 +106,7 @@ class DataCommandsMixin:
104
106
  export_data = {"示例数据": [{"symbol": s, "note": "需 yfinance"} for s in watchlist]}
105
107
  p = {"data": export_data, "filename": fname}
106
108
  if self.context.has_rich:
107
- with self.context.console.status("[dim]生成 Excel...[/dim]", spinner="dots"):
109
+ with self.context.console.status(f"[dim]{ui_text(self, '生成 Excel', 'Building Excel')}...[/dim]", spinner="dots"):
108
110
  r = await loop.run_in_executor(None, export_to_excel, p)
109
111
  else:
110
112
  r = export_to_excel(p)
@@ -125,7 +127,7 @@ class DataCommandsMixin:
125
127
  self.context.console.print("[dim]用法: /data load <csv文件路径>[/dim]")
126
128
  return
127
129
  if self.context.has_rich:
128
- with self.context.console.status("[dim]加载 CSV...[/dim]", spinner="dots"):
130
+ with self.context.console.status(f"[dim]{ui_text(self, '加载 CSV', 'Loading CSV')}...[/dim]", spinner="dots"):
129
131
  r = await loop.run_in_executor(None, load_csv_data, {"path": csv_path})
130
132
  else:
131
133
  r = load_csv_data({"path": csv_path})
@@ -221,7 +223,7 @@ class DataCommandsMixin:
221
223
 
222
224
  elif sub == "check":
223
225
  if self.context.has_rich:
224
- with self.context.console.status("[dim]检查价格预警...[/dim]", spinner="dots"):
226
+ with self.context.console.status(f"[dim]{ui_text(self, '检查价格预警', 'Checking price alerts')}...[/dim]", spinner="dots"):
225
227
  r = await loop.run_in_executor(None, check_alerts)
226
228
  else:
227
229
  r = check_alerts()
@@ -262,7 +264,8 @@ class DataCommandsMixin:
262
264
  return
263
265
 
264
266
  if self.context.has_rich:
265
- with self.context.console.status(f"[dim]计算 {', '.join(symbols)} 相关性矩阵...[/dim]", spinner="dots"):
267
+ _names = ', '.join(symbols)
268
+ with self.context.console.status(f"[dim]{ui_text(self, f'计算 {_names} 相关性矩阵', f'Computing the {_names} correlation matrix')}...[/dim]", spinner="dots"):
266
269
  r = await loop.run_in_executor(None, calc_correlation_matrix,
267
270
  {"symbols": symbols, "period": period})
268
271
  else:
@@ -312,7 +315,8 @@ class DataCommandsMixin:
312
315
  p_params["weights"] = weights
313
316
 
314
317
  if self.context.has_rich:
315
- with self.context.console.status(f"[dim]回测 {', '.join(symbols)} ({period})...[/dim]", spinner="dots"):
318
+ _names = ', '.join(symbols)
319
+ with self.context.console.status(f"[dim]{ui_text(self, f'回测 {_names} ({period})', f'Backtesting {_names} ({period})')}...[/dim]", spinner="dots"):
316
320
  r = await loop.run_in_executor(None, portfolio_backtest, p_params)
317
321
  else:
318
322
  r = portfolio_backtest(p_params)
@@ -332,7 +336,7 @@ class DataCommandsMixin:
332
336
  import asyncio as _asyncio
333
337
  loop = _asyncio.get_event_loop()
334
338
  if self.context.has_rich:
335
- with self.context.console.status(f"[dim]获取 {symbol} 同行数据...[/dim]", spinner="dots"):
339
+ with self.context.console.status(f"[dim]{ui_text(self, f'获取 {symbol} 同行数据', f'Fetching {symbol} peer data')}...[/dim]", spinner="dots"):
336
340
  from local_finance_tools import _peer_comparison
337
341
  r = await loop.run_in_executor(None, _peer_comparison,
338
342
  {"symbol": symbol, "peers": peers})
@@ -7,6 +7,8 @@ by _rebind_mixin_globals() called at module load time.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ from aria_code.apps.cli.i18n import ui_text
11
+
10
12
  from ._ui import print_error
11
13
  from typing import Optional, Tuple
12
14
 
@@ -385,7 +387,7 @@ class MarketCommandsMixin:
385
387
  city2 = parts[2] if len(parts) > 2 else ("上海" if city1 != "上海" else "北京")
386
388
  import functools as _functools
387
389
  if self.context.has_rich:
388
- with self.context.console.status(f"[dim]获取 {city1}/{city2} 房价指数...[/dim]", spinner="dots"):
390
+ with self.context.console.status(f"[dim]{ui_text(self, f'获取 {city1}/{city2} 房价指数', f'Fetching {city1}/{city2} house price indices')}...[/dim]", spinner="dots"):
389
391
  r = await loop.run_in_executor(
390
392
  None, _functools.partial(get_house_price_index, city1, city2)
391
393
  )
@@ -394,7 +396,7 @@ class MarketCommandsMixin:
394
396
  _render_house_price(r)
395
397
  # Also show investment data
396
398
  if self.context.has_rich:
397
- with self.context.console.status("[dim]获取房地产投资数据...[/dim]", spinner="dots"):
399
+ with self.context.console.status(f"[dim]{ui_text(self, '获取房地产投资数据', 'Fetching real-estate investment data')}...[/dim]", spinner="dots"):
398
400
  ri = await loop.run_in_executor(None, get_re_investment)
399
401
  else:
400
402
  ri = get_re_investment()
@@ -410,7 +412,7 @@ class MarketCommandsMixin:
410
412
  code = parts[1] if len(parts) > 1 else None
411
413
  if code:
412
414
  if self.context.has_rich:
413
- with self.context.console.status(f"[dim]分析 {code} REIT...[/dim]", spinner="dots"):
415
+ with self.context.console.status(f"[dim]{ui_text(self, f'分析 {code} REIT', f'Analyzing REIT {code}')}...[/dim]", spinner="dots"):
414
416
  r = await loop.run_in_executor(None, get_reit_analysis, code)
415
417
  else:
416
418
  r = get_reit_analysis(code)
@@ -429,7 +431,7 @@ class MarketCommandsMixin:
429
431
  self.context.console.print(f"[red]{r.get('error','分析失败')}[/red]") if self.context.has_rich else None
430
432
  else:
431
433
  if self.context.has_rich:
432
- with self.context.console.status("[dim]获取 REIT 列表...[/dim]", spinner="dots"):
434
+ with self.context.console.status(f"[dim]{ui_text(self, '获取 REIT 列表', 'Fetching the REIT list')}...[/dim]", spinner="dots"):
433
435
  r = await loop.run_in_executor(None, get_reits_list)
434
436
  else:
435
437
  r = get_reits_list()
@@ -438,7 +440,7 @@ class MarketCommandsMixin:
438
440
  elif sub == "compare":
439
441
  cities = parts[1:] if len(parts) > 1 else None
440
442
  if self.context.has_rich:
441
- with self.context.console.status("[dim]对比多城市房价...[/dim]", spinner="dots"):
443
+ with self.context.console.status(f"[dim]{ui_text(self, '对比多城市房价', 'Comparing city house prices')}...[/dim]", spinner="dots"):
442
444
  r = await loop.run_in_executor(None, get_multi_city_comparison, cities)
443
445
  else:
444
446
  r = get_multi_city_comparison(cities)
@@ -483,7 +485,7 @@ class MarketCommandsMixin:
483
485
 
484
486
  elif sub == "us":
485
487
  if self.context.has_rich:
486
- with self.context.console.status("[dim]获取美国住房数据...[/dim]", spinner="dots"):
488
+ with self.context.console.status(f"[dim]{ui_text(self, '获取美国住房数据', 'Fetching US housing data')}...[/dim]", spinner="dots"):
487
489
  r = await loop.run_in_executor(None, get_us_housing_data)
488
490
  else:
489
491
  r = get_us_housing_data()
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from aria_code.apps.cli.i18n import ui_text
6
+
5
7
 
6
8
  import json
7
9
  import asyncio
@@ -78,7 +80,7 @@ class OrchestratorCommandsMixin:
78
80
  if self.context.has_rich:
79
81
  provider = ConfiguredProvider(self.context.config, "gemini-2.5-flash")
80
82
 
81
- with self.context.console.status("[dim]Orchestrator 正在编排智能体网络...[/dim]"):
83
+ with self.context.console.status(f"[dim]{ui_text(self, 'Orchestrator 正在编排智能体网络', 'Orchestrator is planning the agent network')}...[/dim]"):
82
84
  result = await dynamic_agent_orchestration(request, provider)
83
85
  agents_to_run = result.get("agents", [])
84
86
 
@@ -7,6 +7,8 @@ by _rebind_mixin_globals() called at module load time.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ from aria_code.apps.cli.i18n import ui_text
11
+
10
12
  from ._ui import Panel, print_error
11
13
 
12
14
 
@@ -597,7 +599,7 @@ class PortfolioCommandsMixin:
597
599
  if export_pdf_flag:
598
600
  try:
599
601
  if self.context.has_rich:
600
- with self.context.console.status("[dim]导出 PDF…[/dim]", spinner="dots"):
602
+ with self.context.console.status(f"[dim]{ui_text(self, '导出 PDF', 'Exporting PDF')}…[/dim]", spinner="dots"):
601
603
  _pdf_path = await export_report_pdf(out_f)
602
604
  else:
603
605
  _pdf_path = await export_report_pdf(out_f)
@@ -1701,7 +1701,9 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
1701
1701
 
1702
1702
  if not quote.get("success") or price is None or price == 0:
1703
1703
  err = quote.get("error") or _no_price
1704
- if "NoneType" in str(err):
1704
+ # "NoneType…" and a bare KeyError repr ("'currentTradingPeriod'", what
1705
+ # yfinance raises for a symbol it has no chart for) say nothing to a user.
1706
+ if "NoneType" in str(err) or re.fullmatch(r"'\w+'", str(err).strip()):
1705
1707
  err = _no_price
1706
1708
  is_rate_limit = "rate" in str(err).lower() or "429" in str(err) or "too many" in str(err).lower()
1707
1709
  if is_rate_limit:
@@ -2321,8 +2323,11 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2321
2323
  lines.append(f"## `{symbol}`")
2322
2324
  lines.append("*" + " · ".join(p for p in (data_src, _now_str, session_note, _L["disclaimer"]) if p) + "*")
2323
2325
  lines.append("")
2324
- lines.append(f"**{'Takeaway' if _en else '结论'}**{_sep}{_summary_line}")
2325
- lines.append(f"**{'Watch' if _en else '观察位'}**{_sep}{_watch_line}")
2326
+ # Two trailing spaces: a Markdown line break. Without it the renderer
2327
+ # joined these lines into one paragraph ("…MACD negative. Watch: Watch
2328
+ # USD 334.30…"). "Levels", not "Watch": the line itself starts "Watch …".
2329
+ lines.append(f"**{'Takeaway' if _en else '结论'}**{_sep}{_summary_line} ")
2330
+ lines.append(f"**{'Levels' if _en else '观察位'}**{_sep}{_watch_line}")
2326
2331
  lines.append("")
2327
2332
 
2328
2333
  # ── Price table ──
@@ -2390,7 +2395,7 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2390
2395
  if _en else
2391
2396
  f" · 量化分 {_signal_score:+d} · 置信度 {_signal_confidence:.0%}"
2392
2397
  )
2393
- lines.append(f"{_L['signal_lbl']}{_sep}`{signal}` — {signal_str}{_score_detail}")
2398
+ lines.append(f"{_L['signal_lbl']}{_sep}`{signal}` — {signal_str}{_score_detail} ")
2394
2399
  _reason_parts = []
2395
2400
  if _positive_reasons:
2396
2401
  _reason_parts.append(("support: " if _en else "支撑:") + _join_reasons(_positive_reasons[:3]))
@@ -238,6 +238,17 @@ def get_ui_lang(config: Optional[dict] = None) -> str:
238
238
  return detect_system_lang()
239
239
 
240
240
 
241
+ def ui_text(owner, zh_text: str, en_text: str) -> str:
242
+ """The text for the configured UI language; English unless ui_lang is zh.
243
+
244
+ ``owner`` is a command object (its ``terminal.config``), a terminal (its
245
+ ``config``) or a config dict.
246
+ """
247
+ config = owner if isinstance(owner, dict) else (
248
+ getattr(owner, "config", None) or getattr(getattr(owner, "terminal", None), "config", None) or {})
249
+ return zh_text if str(config.get("ui_lang", "en")).lower().startswith("zh") else en_text
250
+
251
+
241
252
  def t(key: str, lang: Optional[str] = None, config: Optional[dict] = None) -> str:
242
253
  """Translate a UI key to the given language (or auto-detect).
243
254
 
@@ -355,6 +355,59 @@ def _gcloud_login_only(config: dict) -> bool:
355
355
  return not _adc_available() and not _google_api_key(config) and bool(shutil.which("gcloud"))
356
356
 
357
357
 
358
+ def _gcloud_folder() -> str:
359
+ import os
360
+
361
+ if os.name == "nt":
362
+ return os.getenv("CLOUDSDK_CONFIG") or os.path.join(os.getenv("APPDATA", ""), "gcloud")
363
+ return os.getenv("CLOUDSDK_CONFIG") or os.path.join(os.path.expanduser("~"), ".config", "gcloud")
364
+
365
+
366
+ def _gcloud_default_project(folder: str) -> str:
367
+ """The active gcloud configuration's core/project, read from its file."""
368
+ import configparser
369
+ import os
370
+
371
+ try:
372
+ with open(os.path.join(folder, "active_config"), encoding="utf-8") as handle:
373
+ active = handle.read().strip() or "default"
374
+ except OSError:
375
+ active = "default"
376
+ parser = configparser.ConfigParser()
377
+ try:
378
+ parser.read(os.path.join(folder, "configurations", f"config_{active}"), encoding="utf-8")
379
+ return parser.get("core", "project", fallback="").strip()
380
+ except configparser.Error:
381
+ return ""
382
+
383
+
384
+ def google_readiness(config: dict) -> str:
385
+ """"" when a Gemini request can be attempted, else what is missing.
386
+
387
+ The banner said "Cloud model configured" for the default model on a
388
+ machine with no Google credentials at all, and the first question then
389
+ failed. This reads only the environment and gcloud's files — no
390
+ subprocess — so it is cheap enough for startup.
391
+ """
392
+ import os
393
+ import shutil
394
+
395
+ if _google_api_key(config) or _adc_available():
396
+ return ""
397
+ if not shutil.which("gcloud"):
398
+ return "no Google credentials"
399
+ # Same order as vertex_openai_endpoint, so the banner names the problem
400
+ # the first request will report.
401
+ folder = _gcloud_folder()
402
+ project = (os.getenv("GOOGLE_CLOUD_PROJECT") or str(config.get("gcp_project") or "")
403
+ or _gcloud_default_project(folder))
404
+ if not project or project == "(unset)":
405
+ return "no Google Cloud project"
406
+ if not any(os.path.isfile(os.path.join(folder, name)) for name in ("credentials.db", "access_tokens.db")):
407
+ return "gcloud not signed in"
408
+ return ""
409
+
410
+
358
411
  def vertex_openai_endpoint(config: dict) -> dict:
359
412
  """Vertex AI's OpenAI-compatible endpoint and a token from the gcloud login.
360
413
 
@@ -1231,6 +1231,23 @@ def _is_blocked_market_symbol_candidate(symbol: str) -> bool:
1231
1231
  )
1232
1232
 
1233
1233
 
1234
+ # Numeric codes listed with an exchange suffix. The bare-ticker scan read
1235
+ # "0700.HK" as the letters HK and "7203.T" as T — AT&T — so the quote shown
1236
+ # was some other company's, though Aria's own hints say to type 0700.HK.
1237
+ _NUMERIC_LISTING = _re_sym.compile(r'(?<![\w.])(\d{4,5})\.(HK|T|TW)(?![A-Za-z0-9])', _re_sym.I)
1238
+
1239
+
1240
+ def _numeric_listings(message: str) -> list[tuple[int, int, str]]:
1241
+ """(start, end, symbol) of each numeric listing, in Yahoo's form (0700.HK)."""
1242
+ found = []
1243
+ for match in _NUMERIC_LISTING.finditer(message):
1244
+ code, suffix = match.group(1), match.group(2).upper()
1245
+ if suffix == "HK":
1246
+ code = f"{int(code):04d}"
1247
+ found.append((match.start(), match.end(), f"{code}.{suffix}"))
1248
+ return found
1249
+
1250
+
1234
1251
  def _is_english_function_word(message: str, match) -> bool:
1235
1252
  """"I" the pronoun and "A" the article, read as one-letter tickers.
1236
1253
 
@@ -1267,6 +1284,9 @@ def _extract_market_symbol(message: str) -> str:
1267
1284
  for cn, tick in sorted(_COMPANY_TO_TICKER.items(), key=lambda x: -len(x[0])):
1268
1285
  if cn in message:
1269
1286
  return tick
1287
+ listings = _numeric_listings(message)
1288
+ if listings:
1289
+ return listings[0][2]
1270
1290
  # A股裸6位代码(600519 / sh600519 / 688256.SH)
1271
1291
  m = _re_sym.search(r'(?<!\d)(?:[sS][hHzZ])?([036]\d{5}|68\d{4})(?:\.(?:SH|SZ|SS))?(?!\d)', message)
1272
1292
  if m:
@@ -1305,20 +1325,33 @@ def _extract_market_symbols(message: str, limit: int = 6) -> list[str]:
1305
1325
  start = message.find(name)
1306
1326
  add_hit(start, ticker)
1307
1327
 
1328
+ # Spans of coded listings: the letters in "0700.HK" or "600519.SS" are its
1329
+ # exchange, not a second ticker.
1330
+ coded_spans: list[tuple[int, int]] = []
1308
1331
  for match in _re_sym.finditer(r'(?<!\d)(?:[sS][hHzZ])?([036]\d{5}|68\d{4})(?:\.(?:SH|SZ|SS))?(?!\d)', message):
1309
1332
  add_hit(match.start(), match.group(1))
1333
+ coded_spans.append((match.start(), match.end()))
1310
1334
 
1311
1335
  for match in _re_sym.finditer(r'(?<![A-Za-z0-9])(\^[A-Z0-9]{2,10}|[A-Z]{2,8}=F|[A-Z]{6}=X|DX-Y\.NYB)(?![A-Za-z0-9])', message, _re_sym.I):
1312
1336
  add_hit(match.start(), match.group(1).upper())
1313
1337
 
1338
+ for start, end, symbol in _numeric_listings(message):
1339
+ add_hit(start, symbol)
1340
+ coded_spans.append((start, end))
1341
+
1342
+ def inside_a_listing(match) -> bool:
1343
+ return any(start <= match.start() < end for start, end in coded_spans)
1344
+
1314
1345
  for match in _re_sym.finditer(r'\b([A-Z]{1,5}(?:\.(?:HK|SH|SZ))?)\b', message):
1315
1346
  symbol = match.group(1)
1316
- if not _is_blocked_market_symbol_candidate(symbol) and not _is_english_function_word(message, match):
1347
+ if (not _is_blocked_market_symbol_candidate(symbol) and not _is_english_function_word(message, match)
1348
+ and not inside_a_listing(match)):
1317
1349
  add_hit(match.start(), symbol)
1318
1350
 
1319
1351
  for match in _re_sym.finditer(r'(?<![A-Za-z])([A-Z]{1,5}(?:\.(?:HK|SH|SZ))?)(?![A-Za-z])', message):
1320
1352
  symbol = match.group(1)
1321
- if not _is_blocked_market_symbol_candidate(symbol) and not _is_english_function_word(message, match):
1353
+ if (not _is_blocked_market_symbol_candidate(symbol) and not _is_english_function_word(message, match)
1354
+ and not inside_a_listing(match)):
1322
1355
  add_hit(match.start(), symbol)
1323
1356
 
1324
1357
  ordered: list[str] = []
@@ -4252,9 +4252,14 @@ class ArtheraTerminal:
4252
4252
  or current_id.lower().startswith("gemini")
4253
4253
  or self.config.get("local_provider") in {"vertex", "google"}
4254
4254
  )
4255
+ _missing = ""
4256
+ if _uses_google and not self.config.get("backend_chat"):
4257
+ from apps.cli.providers.base import google_readiness
4258
+ _missing = google_readiness(self.config)
4255
4259
  _health_status = (
4256
4260
  ("Google Cloud · via Arthera API" if _uses_google else "Arthera API · cloud")
4257
4261
  if self.config.get("backend_chat") else
4262
+ f"⚠ {_missing} · /model" if _missing else
4258
4263
  "Cloud model configured" if _cloud_provider else
4259
4264
  self._ollama_status_label(rich=True)
4260
4265
  )
@@ -5334,8 +5339,9 @@ class ArtheraTerminal:
5334
5339
  _tone = "red" if error_presentation.level == "error" else "yellow"
5335
5340
  for idx, ln in enumerate(error_presentation.lines):
5336
5341
  if HAS_RICH:
5342
+ from aria_code.ui.render.output import print_hanging
5337
5343
  style = f"bold {_tone}" if idx == 0 and len(error_presentation.lines) > 1 else _tone
5338
- console.print(f" [{style}]{ln}[/{style}]")
5344
+ print_hanging(console, " ", ln, style)
5339
5345
  else:
5340
5346
  print(f" {ln}")
5341
5347
  console.print() if HAS_RICH else print()
@@ -5480,8 +5486,9 @@ class ArtheraTerminal:
5480
5486
  _tone = "red" if presentation.level == "error" else "yellow"
5481
5487
  for idx, line in enumerate(presentation.lines):
5482
5488
  if HAS_RICH:
5489
+ from aria_code.ui.render.output import print_hanging
5483
5490
  style = f"bold {_tone}" if idx == 0 else _tone
5484
- console.print(f" [{style}]{line}[/{style}]")
5491
+ print_hanging(console, " ", line, style)
5485
5492
  else:
5486
5493
  print(f" {line}")
5487
5494
  return