aria-code 0.80.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.80.0/src/aria_code.egg-info → aria_code-0.82.0}/PKG-INFO +1 -1
  2. {aria_code-0.80.0 → aria_code-0.82.0}/pyproject.toml +1 -1
  3. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +13 -11
  5. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/broker_cmds.py +5 -3
  6. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +5 -2
  7. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/core_cmds.py +4 -3
  8. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/data_cmds.py +11 -7
  9. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market_cmds.py +8 -6
  10. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +3 -1
  11. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +3 -1
  12. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/market_handlers.py +19 -9
  13. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/i18n.py +11 -0
  14. aria_code-0.82.0/src/aria_code/apps/cli/market_hours.py +100 -0
  15. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/base.py +53 -0
  16. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/utils/market_detect.py +35 -2
  17. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_cli.py +15 -11
  18. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/agent_loop.py +39 -0
  19. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/render/market.py +23 -15
  20. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/render/output.py +19 -2
  21. {aria_code-0.80.0 → aria_code-0.82.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  22. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code.egg-info/SOURCES.txt +5 -0
  23. aria_code-0.82.0/tests/test_first_run_output.py +107 -0
  24. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_answers_in_english.py +15 -0
  25. aria_code-0.82.0/tests/test_market_hours.py +73 -0
  26. aria_code-0.82.0/tests/test_numeric_listings.py +57 -0
  27. aria_code-0.82.0/tests/test_status_language.py +70 -0
  28. {aria_code-0.80.0 → aria_code-0.82.0}/LICENSE +0 -0
  29. {aria_code-0.80.0 → aria_code-0.82.0}/NOTICE +0 -0
  30. {aria_code-0.80.0 → aria_code-0.82.0}/README.md +0 -0
  31. {aria_code-0.80.0 → aria_code-0.82.0}/setup.cfg +0 -0
  32. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/__init__.py +0 -0
  33. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/adk_apps/__init__.py +0 -0
  34. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  35. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  36. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  37. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  38. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/__init__.py +0 -0
  39. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/base.py +0 -0
  40. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/code_review.py +0 -0
  41. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/__init__.py +0 -0
  42. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  43. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/critic.py +0 -0
  44. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/deepen.py +0 -0
  45. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/models.py +0 -0
  46. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  47. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  48. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/themes.py +0 -0
  49. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/deep/tiers.py +0 -0
  50. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  51. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/engineering/coder.py +0 -0
  52. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/engineering/tester.py +0 -0
  53. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/__init__.py +0 -0
  54. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  55. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  56. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  57. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/debate.py +0 -0
  58. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/earnings.py +0 -0
  59. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  60. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/macro.py +0 -0
  61. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/news.py +0 -0
  62. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/risk.py +0 -0
  63. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/sector.py +0 -0
  64. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/strategist.py +0 -0
  65. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  66. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  67. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/financial/technical.py +0 -0
  68. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/orchestrator.py +0 -0
  69. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  70. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/__init__.py +0 -0
  71. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  72. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/business_match.py +0 -0
  73. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  74. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  75. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  76. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  77. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  78. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  79. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  80. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/registry.py +0 -0
  81. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/signal_scheme.py +0 -0
  82. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/sports/__init__.py +0 -0
  83. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  84. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/supervisor.py +0 -0
  85. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/team.py +0 -0
  86. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  87. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  88. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  89. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  90. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  91. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  92. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  93. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  94. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  95. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  96. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  97. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aliyun_data_client.py +0 -0
  98. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/README.md +0 -0
  99. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/__init__.py +0 -0
  100. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/README.md +0 -0
  101. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/__init__.py +0 -0
  102. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/approvals.py +0 -0
  103. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/conversation.py +0 -0
  104. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/digest.py +0 -0
  105. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/intake.py +0 -0
  106. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/registry.py +0 -0
  107. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  108. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/README.md +0 -0
  109. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/__init__.py +0 -0
  110. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/_optional.py +0 -0
  111. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  112. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  113. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  114. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  115. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  116. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  117. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  118. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  119. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  120. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  121. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  122. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  123. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  124. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  125. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  126. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  127. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  128. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  129. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  130. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  131. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  132. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  133. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  134. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  135. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  136. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  137. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  138. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  139. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  140. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  141. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  142. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  143. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  144. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/config_store.py +0 -0
  145. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/constants.py +0 -0
  146. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/context.py +0 -0
  147. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  148. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/direct.py +0 -0
  149. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  150. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  151. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  152. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/google_login.py +0 -0
  153. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  154. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  155. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  156. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  157. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  158. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  159. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/helpers.py +0 -0
  160. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/hooks.py +0 -0
  161. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/intent.py +0 -0
  162. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  163. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  164. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  165. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  166. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/main.py +0 -0
  167. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  168. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  169. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  170. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  171. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  172. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  173. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  174. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  175. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/preflight.py +0 -0
  176. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  177. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  178. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  179. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  180. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  181. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  182. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  183. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  184. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  185. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  186. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  187. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  188. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  189. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  190. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  191. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  192. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  193. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  194. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  195. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  196. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  197. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  198. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/session_export.py +0 -0
  199. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  200. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/session_store.py +0 -0
  201. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  202. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  203. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  204. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  205. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  206. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  207. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  208. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  209. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  210. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  211. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  212. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  213. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  214. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  215. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/update_check.py +0 -0
  216. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/updater.py +0 -0
  217. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  218. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/daemon/README.md +0 -0
  219. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/vscode/README.md +0 -0
  220. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/apps/vscode/package.json +0 -0
  221. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_daemon.py +0 -0
  222. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_feishu_bot.py +0 -0
  223. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_mcp_server.py +0 -0
  224. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_relay_client.py +0 -0
  225. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_relay_server.py +0 -0
  226. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/aria_telegram_bot.py +0 -0
  227. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ariarc.py +0 -0
  228. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/artifacts.py +0 -0
  229. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/backtest_engine.py +0 -0
  230. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/backtest_report.py +0 -0
  231. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/__init__.py +0 -0
  232. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/automation.py +0 -0
  233. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/base.py +0 -0
  234. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/capabilities.py +0 -0
  235. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  236. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  237. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  238. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  239. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  240. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  241. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/config.py +0 -0
  242. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  243. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  244. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  245. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  246. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  247. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/paper_broker.py +0 -0
  248. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/planning.py +0 -0
  249. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/registry.py +0 -0
  250. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/brokers/trading.py +0 -0
  251. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/canva_client.py +0 -0
  252. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/change_store.py +0 -0
  253. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/__init__.py +0 -0
  254. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  255. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  256. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/canva_client.py +0 -0
  257. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/figma_client.py +0 -0
  258. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/football_data_client.py +0 -0
  259. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/kling_video_client.py +0 -0
  260. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/market_data_client.py +0 -0
  261. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/openai_image_client.py +0 -0
  262. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/runway_video_client.py +0 -0
  263. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  264. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/cloud_memory.py +0 -0
  265. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/command_safety.py +0 -0
  266. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/computer_use_tools.py +0 -0
  267. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/dashboard_generator.py +0 -0
  268. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/data_analysis_tools.py +0 -0
  269. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/data_cleaner.py +0 -0
  270. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/data_service.py +0 -0
  271. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/__init__.py +0 -0
  272. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/base.py +0 -0
  273. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/router.py +0 -0
  274. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  275. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  276. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  277. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  278. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  279. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  280. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  281. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  282. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  283. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  284. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/demo_player.py +0 -0
  285. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/doctor.py +0 -0
  286. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/domain/__init__.py +0 -0
  287. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/domain/backtest_engine.py +0 -0
  288. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/domain/backtest_report.py +0 -0
  289. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/domain/finance_formulas.py +0 -0
  290. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  291. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/domain/strategy_vault.py +0 -0
  292. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/evals/__init__.py +0 -0
  293. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/evals/harness.py +0 -0
  294. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/evals/runner.py +0 -0
  295. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/external_agent_runner.py +0 -0
  296. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/figma_client.py +0 -0
  297. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/file_analysis_tools.py +0 -0
  298. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/finance_formulas.py +0 -0
  299. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/football_data_client.py +0 -0
  300. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/image_gen_tools.py +0 -0
  301. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/intent_classifier.py +0 -0
  302. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/kling_video_client.py +0 -0
  303. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/licensing.py +0 -0
  304. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/local_finance_tools.py +0 -0
  305. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/local_image_provider.py +0 -0
  306. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/local_llm_provider.py +0 -0
  307. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/macro_tools.py +0 -0
  308. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/markdown_pdf.py +0 -0
  309. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/market_data_client.py +0 -0
  310. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/mcp_client.py +0 -0
  311. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/memory_manager.py +0 -0
  312. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/model_capability.py +0 -0
  313. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/notification_tools.py +0 -0
  314. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/openai_image_client.py +0 -0
  315. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/__init__.py +0 -0
  316. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  317. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  318. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  319. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  320. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  321. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  322. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  323. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/export.py +0 -0
  324. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  325. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  326. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  327. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  328. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  329. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  330. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  331. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  332. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  333. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  334. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  335. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  336. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  337. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  338. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  339. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  340. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  341. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  342. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  343. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  344. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  345. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/context.py +0 -0
  346. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  347. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/data.py +0 -0
  348. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  349. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/references.py +0 -0
  350. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  351. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  352. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  353. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  354. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  355. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  356. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  357. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  358. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  359. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  360. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  361. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  362. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  363. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  364. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  365. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  366. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  367. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  368. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  369. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  370. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  371. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  372. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  373. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  374. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  375. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  376. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  377. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  378. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  379. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  380. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  381. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  382. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  383. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  384. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  385. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  386. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  387. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  388. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  389. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  390. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/__init__.py +0 -0
  391. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/base.py +0 -0
  392. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/finance/__init__.py +0 -0
  393. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  394. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/payments/__init__.py +0 -0
  395. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/realty/__init__.py +0 -0
  396. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/registry.py +0 -0
  397. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/packs/rules.py +0 -0
  398. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/plan_utils.py +0 -0
  399. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/plugin_loader.py +0 -0
  400. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/portfolio_ledger.py +0 -0
  401. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/preview_server.py +0 -0
  402. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/privacy/__init__.py +0 -0
  403. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/privacy/feedback.py +0 -0
  404. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/project_review.py +0 -0
  405. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/project_review_api.py +0 -0
  406. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/project_review_server.py +0 -0
  407. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/project_tools.py +0 -0
  408. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/__init__.py +0 -0
  409. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/__init__.py +0 -0
  410. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  411. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  412. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/base.py +0 -0
  413. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/custom.py +0 -0
  414. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/ollama.py +0 -0
  415. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  416. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/llm/registry.py +0 -0
  417. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/local_image_provider.py +0 -0
  418. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  419. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/providers/tool_messages.py +0 -0
  420. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/realty_data_tools.py +0 -0
  421. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/relay_store.py +0 -0
  422. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/report_exporters.py +0 -0
  423. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/report_generator.py +0 -0
  424. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/review_service.py +0 -0
  425. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/__init__.py +0 -0
  426. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/acceptance.py +0 -0
  427. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/approval.py +0 -0
  428. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/budget.py +0 -0
  429. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/checkpoints.py +0 -0
  430. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/crash_report.py +0 -0
  431. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/events.py +0 -0
  432. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/gateway.py +0 -0
  433. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/lsp.py +0 -0
  434. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/orchestrator.py +0 -0
  435. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/repo_map.py +0 -0
  436. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/run_state.py +0 -0
  437. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/run_store.py +0 -0
  438. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/self_healing.py +0 -0
  439. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/subagent.py +0 -0
  440. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/task_ledger.py +0 -0
  441. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  442. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/tool_executor.py +0 -0
  443. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/tool_policy.py +0 -0
  444. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runtime/worktrees.py +0 -0
  445. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/runway_video_client.py +0 -0
  446. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/safety/__init__.py +0 -0
  447. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/safety/permissions.py +0 -0
  448. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/safety/service.py +0 -0
  449. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/setup_wizard.py +0 -0
  450. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/spreadsheet_tools.py +0 -0
  451. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/strategy_vault.py +0 -0
  452. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/__init__.py +0 -0
  453. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/artifact_tools.py +0 -0
  454. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/broker_tools.py +0 -0
  455. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  456. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  457. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  458. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  459. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  460. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/extended_tools.py +0 -0
  461. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  462. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  463. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  464. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  465. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  466. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_io.py +0 -0
  467. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  468. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/logistics_tools.py +0 -0
  469. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/macro_tools.py +0 -0
  470. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/notification_tools.py +0 -0
  471. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/project_tools.py +0 -0
  472. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  473. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  474. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/tools/stripe_tools.py +0 -0
  475. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/__init__.py +0 -0
  476. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/banner.py +0 -0
  477. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/completer.py +0 -0
  478. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/console.py +0 -0
  479. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/image_render.py +0 -0
  480. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/input_box.py +0 -0
  481. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/picker.py +0 -0
  482. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/render/__init__.py +0 -0
  483. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/render/finance.py +0 -0
  484. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/render/responsive.py +0 -0
  485. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/render/team.py +0 -0
  486. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/robot.py +0 -0
  487. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  488. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/utils/vscode_uri.py +0 -0
  489. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/video_analysis.py +0 -0
  490. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/video_editor.py +0 -0
  491. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace/__init__.py +0 -0
  492. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace/files.py +0 -0
  493. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace/verify.py +0 -0
  494. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace_changes.py +0 -0
  495. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace_context.py +0 -0
  496. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace_service.py +0 -0
  497. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code/workspace_tools.py +0 -0
  498. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  499. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  500. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code.egg-info/requires.txt +0 -0
  501. {aria_code-0.80.0 → aria_code-0.82.0}/src/aria_code.egg-info/top_level.txt +0 -0
  502. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_adk_market_tools.py +0 -0
  503. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_agent_team_fallback.py +0 -0
  504. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_analyze_file_tool.py +0 -0
  505. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_architecture_ledger_is_true.py +0 -0
  506. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_architecture_report.py +0 -0
  507. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_aria_cli_core.py +0 -0
  508. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_aria_mcp_server.py +0 -0
  509. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_aria_sdk.py +0 -0
  510. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_artifact_publishing.py +0 -0
  511. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_artifacts_and_reports.py +0 -0
  512. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ashare_prediction_cmds.py +0 -0
  513. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_backtest_cmds.py +0 -0
  514. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_backtest_engine.py +0 -0
  515. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_backtest_report.py +0 -0
  516. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  517. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_broken_akshare_is_optional.py +0 -0
  518. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_broker_automation.py +0 -0
  519. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  520. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_broker_planning.py +0 -0
  521. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_broker_safety.py +0 -0
  522. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_broker_tools.py +0 -0
  523. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_budget.py +0 -0
  524. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_business_workflow_cmds.py +0 -0
  525. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_canva_client.py +0 -0
  526. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_canvas_cmds.py +0 -0
  527. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_card_approvals.py +0 -0
  528. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_channel_intake.py +0 -0
  529. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_channels.py +0 -0
  530. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_chart_handlers.py +0 -0
  531. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_chat_bots_fail_closed.py +0 -0
  532. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_chat_routing.py +0 -0
  533. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ci_security_workflow.py +0 -0
  534. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_app_split.py +0 -0
  535. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_bootstrap.py +0 -0
  536. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_config_store.py +0 -0
  537. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  538. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_runtime_consumer.py +0 -0
  539. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_tool_executor_module.py +0 -0
  540. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cli_updater.py +0 -0
  541. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_cloud_memory.py +0 -0
  542. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_code_audit_tools.py +0 -0
  543. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_code_review_agent.py +0 -0
  544. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_codegen_output.py +0 -0
  545. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_coder_tester_self_healing.py +0 -0
  546. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_coder_tool_safety.py +0 -0
  547. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_collaboration.py +0 -0
  548. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_command_loggers.py +0 -0
  549. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_command_safety.py +0 -0
  550. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_completions_builder.py +0 -0
  551. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_config_paths.py +0 -0
  552. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_configured_provider.py +0 -0
  553. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_container_entrypoint.py +0 -0
  554. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_container_entrypoints.py +0 -0
  555. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_context_checkpoints.py +0 -0
  556. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_context_references.py +0 -0
  557. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_context_service.py +0 -0
  558. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_conversation_core.py +0 -0
  559. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_crash_report.py +0 -0
  560. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_credential_file_permissions.py +0 -0
  561. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_custom_providers.py +0 -0
  562. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_daemon_gateway_config.py +0 -0
  563. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_dashboard_generator.py +0 -0
  564. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_data_service.py +0 -0
  565. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_data_service_imports.py +0 -0
  566. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_datasource_routing.py +0 -0
  567. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_deep_analysis.py +0 -0
  568. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_degrades_without_quant_engine.py +0 -0
  569. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  570. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_doctor.py +0 -0
  571. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  572. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_doctor_npm_scope.py +0 -0
  573. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_engine_boundary.py +0 -0
  574. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_enterprise_tool_honesty.py +0 -0
  575. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_env_switch_docs.py +0 -0
  576. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_evals_harness.py +0 -0
  577. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_event_import_roots.py +0 -0
  578. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_extended_tools.py +0 -0
  579. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_feishu_swarm_config.py +0 -0
  580. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_finalize_release.py +0 -0
  581. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_finance_renderers.py +0 -0
  582. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_finance_service_catalog.py +0 -0
  583. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_first_run_works.py +0 -0
  584. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_football_agent.py +0 -0
  585. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_football_prediction_output.py +0 -0
  586. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_google_cloud_models.py +0 -0
  587. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_google_cloud_routing.py +0 -0
  588. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_google_login.py +0 -0
  589. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_google_search_provider.py +0 -0
  590. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_headless_is_agentic.py +0 -0
  591. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_honest_surfaces.py +0 -0
  592. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_image_gen_tools.py +0 -0
  593. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_image_inputs.py +0 -0
  594. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_import_graph_budget.py +0 -0
  595. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_intent_router.py +0 -0
  596. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_intent_signals.py +0 -0
  597. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_kling_video_client.py +0 -0
  598. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_lazy_rebind.py +0 -0
  599. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_legacy_module_imports.py +0 -0
  600. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_license_consistency.py +0 -0
  601. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_licensing.py +0 -0
  602. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_local_image_provider.py +0 -0
  603. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_logistics_3pl.py +0 -0
  604. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_logistics_and_finance_agents.py +0 -0
  605. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_lsp.py +0 -0
  606. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_markdown_pdf.py +0 -0
  607. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_data_client.py +0 -0
  608. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_history_inheritance.py +0 -0
  609. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_history_tool.py +0 -0
  610. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_questions_on_backend.py +0 -0
  611. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_symbol_extraction.py +0 -0
  612. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_market_universe.py +0 -0
  613. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_mcp_circuit.py +0 -0
  614. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_mcp_client.py +0 -0
  615. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_model_capability_registry.py +0 -0
  616. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_model_choice_is_the_users.py +0 -0
  617. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_model_selection_state.py +0 -0
  618. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_native_binary_entrypoints.py +0 -0
  619. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_native_installer.py +0 -0
  620. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_new_modules.py +0 -0
  621. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  622. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_no_uncommitted_imports.py +0 -0
  623. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ollama_stream_imports.py +0 -0
  624. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ollama_stream_tools.py +0 -0
  625. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_openai_image_client.py +0 -0
  626. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_operations_suite.py +0 -0
  627. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_output_rendering.py +0 -0
  628. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_packages_facade.py +0 -0
  629. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_packaging_constraints.py +0 -0
  630. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_packaging_manifest.py +0 -0
  631. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_packs_domains.py +0 -0
  632. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_pdf_report.py +0 -0
  633. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_pick_best_installed_model.py +0 -0
  634. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_plan_mode.py +0 -0
  635. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_platform_package_assembly.py +0 -0
  636. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_platform_packages.py +0 -0
  637. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_plotly_html_output.py +0 -0
  638. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_portfolio_ledger.py +0 -0
  639. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_post_turn_context_decision.py +0 -0
  640. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_preflight.py +0 -0
  641. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_preview_server.py +0 -0
  642. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_privacy_feedback.py +0 -0
  643. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_project_aria.py +0 -0
  644. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_project_review.py +0 -0
  645. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_project_review_api.py +0 -0
  646. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_prompt_assembly.py +0 -0
  647. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_prompt_selection.py +0 -0
  648. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_provider_autoconfig.py +0 -0
  649. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_provider_error_messages.py +0 -0
  650. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_provider_integration.py +0 -0
  651. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_provider_registry.py +0 -0
  652. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_public_service_status.py +0 -0
  653. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_quant_engine_namespace.py +0 -0
  654. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_rebind_contract.py +0 -0
  655. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_rebind_namespace_contract.py +0 -0
  656. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_relay_client_credentials.py +0 -0
  657. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_relay_event_verification.py +0 -0
  658. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_relay_sends_for_clients.py +0 -0
  659. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_relay_store.py +0 -0
  660. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_relay_url.py +0 -0
  661. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_release_chain.py +0 -0
  662. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_release_commit_identity.py +0 -0
  663. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_release_push_is_atomic.py +0 -0
  664. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_release_reaches_the_registries.py +0 -0
  665. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_release_verification_waits.py +0 -0
  666. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_release_workflow_permissions.py +0 -0
  667. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_report_charts.py +0 -0
  668. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_report_generator.py +0 -0
  669. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_research_protocol.py +0 -0
  670. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_research_quality.py +0 -0
  671. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_responsive_rendering.py +0 -0
  672. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_review_service.py +0 -0
  673. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_root_module_budget.py +0 -0
  674. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  675. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_acceptance.py +0 -0
  676. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_agent_loop.py +0 -0
  677. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_approval.py +0 -0
  678. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_bridge.py +0 -0
  679. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_bridge_fallback.py +0 -0
  680. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_checkpoints.py +0 -0
  681. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_event_identity.py +0 -0
  682. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_gateway.py +0 -0
  683. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_repo_map.py +0 -0
  684. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_run_store.py +0 -0
  685. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_tool_executor.py +0 -0
  686. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runtime_worktrees.py +0 -0
  687. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_runway_video_client.py +0 -0
  688. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_safety_permissions.py +0 -0
  689. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_safety_service.py +0 -0
  690. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_safety_service_adoption.py +0 -0
  691. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_service_diagnostics_security.py +0 -0
  692. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_session_search.py +0 -0
  693. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_settings_service.py +0 -0
  694. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_shipper_digest.py +0 -0
  695. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_single_import_root.py +0 -0
  696. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_skill_agent_binding.py +0 -0
  697. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_skill_catalog.py +0 -0
  698. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_skill_loader.py +0 -0
  699. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_spreadsheet_tools.py +0 -0
  700. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_sse_stream_contract.py +0 -0
  701. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_startup_dashboard.py +0 -0
  702. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_startup_latency.py +0 -0
  703. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_streaming_pipeline.py +0 -0
  704. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_stripe_agent.py +0 -0
  705. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_subagent.py +0 -0
  706. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_supervisor_routing.py +0 -0
  707. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_system_prompts.py +0 -0
  708. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_system_tools_output.py +0 -0
  709. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_task_orchestrator.py +0 -0
  710. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_team_synthesis.py +0 -0
  711. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_tls_trust_store.py +0 -0
  712. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_tool_policy.py +0 -0
  713. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  714. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_tool_scope.py +0 -0
  715. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_trading_service.py +0 -0
  716. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_tradingview_bridge.py +0 -0
  717. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_turn_planning.py +0 -0
  718. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ui_completer_references.py +0 -0
  719. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ui_console_theme.py +0 -0
  720. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ui_input_box.py +0 -0
  721. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ui_language_and_model.py +0 -0
  722. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_ui_robot_banner.py +0 -0
  723. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_update_health_routes.py +0 -0
  724. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_verification_hint.py +0 -0
  725. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_verification_policy.py +0 -0
  726. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_version_consistency.py +0 -0
  727. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_version_counter.py +0 -0
  728. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_video_analysis.py +0 -0
  729. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_video_editor.py +0 -0
  730. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_vscode_mcp.py +0 -0
  731. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_warehouse_agents.py +0 -0
  732. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_warehouse_cli_registration.py +0 -0
  733. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_warehouse_erp_client.py +0 -0
  734. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_warehouse_workflow.py +0 -0
  735. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_wheel_is_installable.py +0 -0
  736. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_workspace_changes.py +0 -0
  737. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_workspace_context.py +0 -0
  738. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_workspace_files.py +0 -0
  739. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_workspace_scope.py +0 -0
  740. {aria_code-0.80.0 → aria_code-0.82.0}/tests/test_workspace_service.py +0 -0
  741. {aria_code-0.80.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.80.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.80.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.80.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)
@@ -23,6 +23,7 @@ from aria_code.apps.cli.utils.market_detect import (
23
23
  _detect_market_overview,
24
24
  _PRIVATE_COMPANY_PROFILES,
25
25
  )
26
+ from aria_code.apps.cli.market_hours import market_session
26
27
  from aria_code.apps.cli.market_metadata import enrich_market_quote, market_display_label
27
28
  from aria_code.packages.aria_core.paths import aria_home
28
29
 
@@ -1700,7 +1701,9 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
1700
1701
 
1701
1702
  if not quote.get("success") or price is None or price == 0:
1702
1703
  err = quote.get("error") or _no_price
1703
- 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()):
1704
1707
  err = _no_price
1705
1708
  is_rate_limit = "rate" in str(err).lower() or "429" in str(err) or "too many" in str(err).lower()
1706
1709
  if is_rate_limit:
@@ -2143,7 +2146,6 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2143
2146
  _chg_abs = abs(chg) if chg is not None else None
2144
2147
 
2145
2148
  # ── Build output ──────────────────────────────────────────────────────
2146
- weekday = datetime.now().weekday()
2147
2149
  ti_provider = ti.get("provider", "")
2148
2150
  quote_chain = quote.get("provider_chain") or [provider]
2149
2151
  data_src = " -> ".join(str(p) for p in quote_chain if p)
@@ -2160,8 +2162,11 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2160
2162
  signal_str = _SIGNAL_LABELS.get(_lang, _SIGNAL_LABELS["zh"])[_sig_key]
2161
2163
  _L = {
2162
2164
  "disclaimer": "Not investment advice" if _en else "不构成投资建议",
2163
- "after_hours": "After-hours" if _en else "休市/盘后",
2164
- "market_open": "Market open" if _en else "盘中",
2165
+ "session_open": "Market open" if _en else "盘中",
2166
+ "session_pre": "Pre-market" if _en else "盘前",
2167
+ "session_post": "After-hours" if _en else "盘后",
2168
+ "session_closed": "Market closed" if _en else "休市",
2169
+ "session_24/7": "24/7 market" if _en else "全天交易",
2165
2170
  "price_hdr": "Metric" if _en else "指标",
2166
2171
  "value_hdr": "Value" if _en else "数值",
2167
2172
  "latest": "Last price" if _en else "最新价",
@@ -2218,7 +2223,9 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2218
2223
  }
2219
2224
 
2220
2225
  _sep = ": " if _en else ":"
2221
- session_note = _L["after_hours"] if weekday >= 5 else _L["market_open"]
2226
+ # On the exchange's clock, not this machine's; nothing when it is unknown.
2227
+ _session = market_session(symbol)
2228
+ session_note = _L.get(f"session_{_session}", "") if _session else ""
2222
2229
 
2223
2230
  def _money(v: float | int | None) -> str:
2224
2231
  try:
@@ -2314,10 +2321,13 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2314
2321
  lines.append(f"## {_header_name} `{symbol}`")
2315
2322
  else:
2316
2323
  lines.append(f"## `{symbol}`")
2317
- lines.append(f"*{data_src} · {_now_str} · {session_note} · {_L['disclaimer']}*")
2324
+ lines.append("*" + " · ".join(p for p in (data_src, _now_str, session_note, _L["disclaimer"]) if p) + "*")
2318
2325
  lines.append("")
2319
- lines.append(f"**{'Takeaway' if _en else '结论'}**{_sep}{_summary_line}")
2320
- 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}")
2321
2331
  lines.append("")
2322
2332
 
2323
2333
  # ── Price table ──
@@ -2385,7 +2395,7 @@ def _try_handle_market_snapshot_analysis(message: str, history: list = None, *,
2385
2395
  if _en else
2386
2396
  f" · 量化分 {_signal_score:+d} · 置信度 {_signal_confidence:.0%}"
2387
2397
  )
2388
- 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} ")
2389
2399
  _reason_parts = []
2390
2400
  if _positive_reasons:
2391
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
 
@@ -0,0 +1,100 @@
1
+ """Whether a symbol's exchange is in session, judged on the exchange's clock.
2
+
3
+ Two places judged it on the clock of the machine running Aria. The snapshot
4
+ header said "Market open" on any local weekday, so at 09:00 on Monday in
5
+ Shanghai — Sunday evening in New York — AAPL was "Market open". The context
6
+ sent to the model compared local hours with New York's 09:30–16:00, so a user
7
+ in Beijing had the US market "open" through the New York night.
8
+
9
+ Exchange holidays are not known here: on a holiday the usual hours still read
10
+ as a session. An unknown exchange, or a time zone this machine lacks, gives
11
+ ``None``, and callers then say nothing rather than guess.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import re
17
+ from datetime import datetime, time, timezone
18
+
19
+ try:
20
+ from zoneinfo import ZoneInfo
21
+ except ImportError: # pragma: no cover - Python < 3.9
22
+ ZoneInfo = None # type: ignore[assignment]
23
+
24
+ _EU = ((time(9, 0), time(17, 30)),)
25
+
26
+ # Exchange -> (time zone, regular sessions in local time).
27
+ _EXCHANGES: dict[str, tuple[str, tuple[tuple[time, time], ...]]] = {
28
+ "US": ("America/New_York", ((time(9, 30), time(16, 0)),)),
29
+ "CN": ("Asia/Shanghai", ((time(9, 30), time(11, 30)), (time(13, 0), time(15, 0)))),
30
+ "HK": ("Asia/Hong_Kong", ((time(9, 30), time(12, 0)), (time(13, 0), time(16, 0)))),
31
+ "JP": ("Asia/Tokyo", ((time(9, 0), time(11, 30)), (time(12, 30), time(15, 30)))),
32
+ "UK": ("Europe/London", ((time(8, 0), time(16, 30)),)),
33
+ "FR": ("Europe/Paris", _EU),
34
+ "DE": ("Europe/Berlin", _EU),
35
+ "NL": ("Europe/Amsterdam", _EU),
36
+ "IT": ("Europe/Rome", _EU),
37
+ "ES": ("Europe/Madrid", _EU),
38
+ }
39
+
40
+ _SUFFIXES = {
41
+ ".HK": "HK", ".SS": "CN", ".SZ": "CN", ".SH": "CN", ".T": "JP", ".L": "UK",
42
+ ".PA": "FR", ".DE": "DE", ".AS": "NL", ".MI": "IT", ".MC": "ES",
43
+ }
44
+
45
+ # US extended hours, New York time.
46
+ _US_PRE = (time(4, 0), time(9, 30))
47
+ _US_POST = (time(16, 0), time(20, 0))
48
+
49
+
50
+ def exchange_for(symbol: str) -> str | None:
51
+ """"US", "CN", "HK", … for a symbol; "CRYPTO" for a coin pair; None if unknown."""
52
+ s = str(symbol or "").strip().upper()
53
+ if not s or s.startswith("^") or s.endswith(("=X", "=F")):
54
+ return None
55
+ if re.fullmatch(r"[A-Z0-9]{2,10}-(USD|USDT|USDC|EUR)", s):
56
+ return "CRYPTO"
57
+ for suffix, exchange in _SUFFIXES.items():
58
+ if s.endswith(suffix):
59
+ return exchange
60
+ if re.fullmatch(r"(SH|SZ)?\d{6}", s):
61
+ return "CN"
62
+ if re.fullmatch(r"[A-Z]{1,5}([.-][A-Z])?", s):
63
+ return "US"
64
+ return None
65
+
66
+
67
+ def _local_now(exchange: str, now: datetime | None) -> datetime | None:
68
+ if ZoneInfo is None:
69
+ return None
70
+ try:
71
+ zone = ZoneInfo(_EXCHANGES[exchange][0])
72
+ except Exception: # no tz database on this machine
73
+ return None
74
+ moment = now or datetime.now(timezone.utc)
75
+ if moment.tzinfo is None:
76
+ moment = moment.astimezone() # a naive time is this machine's local time
77
+ return moment.astimezone(zone)
78
+
79
+
80
+ def market_session(symbol: str, now: datetime | None = None) -> str | None:
81
+ """"open", "pre", "post", "closed" or "24/7" for the symbol's exchange; None if unknown."""
82
+ exchange = exchange_for(symbol)
83
+ if exchange == "CRYPTO":
84
+ return "24/7"
85
+ if exchange is None:
86
+ return None
87
+ local = _local_now(exchange, now)
88
+ if local is None:
89
+ return None
90
+ if local.weekday() >= 5:
91
+ return "closed"
92
+ clock = local.time()
93
+ if any(start <= clock < end for start, end in _EXCHANGES[exchange][1]):
94
+ return "open"
95
+ if exchange == "US":
96
+ if _US_PRE[0] <= clock < _US_PRE[1]:
97
+ return "pre"
98
+ if _US_POST[0] <= clock < _US_POST[1]:
99
+ return "post"
100
+ return "closed"