aria-code 0.87.0__tar.gz → 0.89.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 (751) hide show
  1. {aria_code-0.87.0/src/aria_code.egg-info → aria_code-0.89.0}/PKG-INFO +1 -1
  2. {aria_code-0.87.0 → aria_code-0.89.0}/pyproject.toml +1 -1
  3. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +30 -25
  5. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/catalog.py +23 -0
  6. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/core_cmds.py +11 -9
  7. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +6 -4
  8. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +45 -8
  9. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_cli.py +12 -7
  10. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/completer.py +2 -2
  11. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/render/output.py +54 -12
  12. {aria_code-0.87.0 → aria_code-0.89.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  13. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code.egg-info/SOURCES.txt +4 -1
  14. aria_code-0.89.0/tests/test_file_links.py +43 -0
  15. aria_code-0.89.0/tests/test_narrow_chinese_output.py +62 -0
  16. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_output_rendering.py +19 -2
  17. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_platform_publish.py +15 -11
  18. aria_code-0.89.0/tests/test_wrapped_indent.py +33 -0
  19. {aria_code-0.87.0 → aria_code-0.89.0}/LICENSE +0 -0
  20. {aria_code-0.87.0 → aria_code-0.89.0}/NOTICE +0 -0
  21. {aria_code-0.87.0 → aria_code-0.89.0}/README.md +0 -0
  22. {aria_code-0.87.0 → aria_code-0.89.0}/setup.cfg +0 -0
  23. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/__init__.py +0 -0
  24. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/adk_apps/__init__.py +0 -0
  25. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  26. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  27. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  28. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  29. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/__init__.py +0 -0
  30. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/base.py +0 -0
  31. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/code_review.py +0 -0
  32. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/__init__.py +0 -0
  33. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  34. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/critic.py +0 -0
  35. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/deepen.py +0 -0
  36. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/models.py +0 -0
  37. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  38. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  39. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/themes.py +0 -0
  40. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/deep/tiers.py +0 -0
  41. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  42. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/engineering/coder.py +0 -0
  43. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/engineering/tester.py +0 -0
  44. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/__init__.py +0 -0
  45. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  46. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  47. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  48. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/debate.py +0 -0
  49. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/earnings.py +0 -0
  50. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  51. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/macro.py +0 -0
  52. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/news.py +0 -0
  53. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/risk.py +0 -0
  54. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/sector.py +0 -0
  55. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/strategist.py +0 -0
  56. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  57. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  58. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/financial/technical.py +0 -0
  59. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/orchestrator.py +0 -0
  60. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  61. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/__init__.py +0 -0
  62. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  63. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/business_match.py +0 -0
  64. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  65. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  66. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  67. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  68. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  69. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  70. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  71. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/registry.py +0 -0
  72. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/signal_scheme.py +0 -0
  73. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/sports/__init__.py +0 -0
  74. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  75. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/supervisor.py +0 -0
  76. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/team.py +0 -0
  77. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  78. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  79. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  80. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  81. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  82. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  83. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  84. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  85. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  86. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  87. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  88. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aliyun_data_client.py +0 -0
  89. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/README.md +0 -0
  90. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/__init__.py +0 -0
  91. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/README.md +0 -0
  92. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/__init__.py +0 -0
  93. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/approvals.py +0 -0
  94. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/conversation.py +0 -0
  95. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/digest.py +0 -0
  96. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/intake.py +0 -0
  97. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/registry.py +0 -0
  98. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  99. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/README.md +0 -0
  100. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/__init__.py +0 -0
  101. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/_optional.py +0 -0
  102. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  103. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  104. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  105. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  106. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  107. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  108. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  109. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  110. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  111. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  112. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  113. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  114. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  115. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  116. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  117. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  118. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  119. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  120. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  121. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  122. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  123. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  124. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  125. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  126. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  127. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  128. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  129. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  130. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  131. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  132. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  133. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  134. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  135. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  136. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  137. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  138. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/config_store.py +0 -0
  139. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/constants.py +0 -0
  140. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/context.py +0 -0
  141. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  142. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/direct.py +0 -0
  143. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  144. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  145. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  146. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/google_login.py +0 -0
  147. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  148. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  149. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  150. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  151. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  152. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  153. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  154. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/helpers.py +0 -0
  155. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/hooks.py +0 -0
  156. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/i18n.py +0 -0
  157. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/intent.py +0 -0
  158. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  159. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  160. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  161. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  162. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/main.py +0 -0
  163. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  164. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  165. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  166. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  167. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  168. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  169. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  170. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  171. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  172. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/preflight.py +0 -0
  173. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  174. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  175. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  176. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  177. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  178. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  179. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  180. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  181. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  182. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  183. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  184. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  185. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  186. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  187. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  188. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  189. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  190. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  191. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  192. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  193. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  194. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  195. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  196. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/session_export.py +0 -0
  197. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  198. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/session_store.py +0 -0
  199. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  200. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  201. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  202. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  203. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  204. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  205. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  206. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  207. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  208. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  209. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  210. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  211. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  212. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  213. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/update_check.py +0 -0
  214. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/updater.py +0 -0
  215. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  216. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  217. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/daemon/README.md +0 -0
  218. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/vscode/README.md +0 -0
  219. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/apps/vscode/package.json +0 -0
  220. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_daemon.py +0 -0
  221. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_feishu_bot.py +0 -0
  222. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_mcp_server.py +0 -0
  223. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_relay_client.py +0 -0
  224. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_relay_server.py +0 -0
  225. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/aria_telegram_bot.py +0 -0
  226. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ariarc.py +0 -0
  227. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/artifacts.py +0 -0
  228. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/backtest_engine.py +0 -0
  229. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/backtest_report.py +0 -0
  230. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/__init__.py +0 -0
  231. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/automation.py +0 -0
  232. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/base.py +0 -0
  233. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/capabilities.py +0 -0
  234. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  235. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  236. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  237. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  238. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  239. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  240. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/config.py +0 -0
  241. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  242. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  243. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  244. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  245. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  246. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/paper_broker.py +0 -0
  247. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/planning.py +0 -0
  248. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/registry.py +0 -0
  249. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/brokers/trading.py +0 -0
  250. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/canva_client.py +0 -0
  251. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/change_store.py +0 -0
  252. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/__init__.py +0 -0
  253. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  254. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  255. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/canva_client.py +0 -0
  256. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/figma_client.py +0 -0
  257. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/football_data_client.py +0 -0
  258. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/kling_video_client.py +0 -0
  259. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/market_data_client.py +0 -0
  260. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/openai_image_client.py +0 -0
  261. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/runway_video_client.py +0 -0
  262. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  263. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/cloud_memory.py +0 -0
  264. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/command_safety.py +0 -0
  265. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/computer_use_tools.py +0 -0
  266. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/dashboard_generator.py +0 -0
  267. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/data_analysis_tools.py +0 -0
  268. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/data_cleaner.py +0 -0
  269. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/data_service.py +0 -0
  270. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/__init__.py +0 -0
  271. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/base.py +0 -0
  272. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/router.py +0 -0
  273. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  274. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  275. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  276. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  277. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  278. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  279. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  280. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  281. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  282. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  283. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/demo_player.py +0 -0
  284. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/doctor.py +0 -0
  285. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/domain/__init__.py +0 -0
  286. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/domain/backtest_engine.py +0 -0
  287. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/domain/backtest_report.py +0 -0
  288. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/domain/finance_formulas.py +0 -0
  289. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  290. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/domain/strategy_vault.py +0 -0
  291. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/evals/__init__.py +0 -0
  292. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/evals/harness.py +0 -0
  293. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/evals/runner.py +0 -0
  294. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/external_agent_runner.py +0 -0
  295. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/figma_client.py +0 -0
  296. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/file_analysis_tools.py +0 -0
  297. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/finance_formulas.py +0 -0
  298. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/football_data_client.py +0 -0
  299. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/image_gen_tools.py +0 -0
  300. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/intent_classifier.py +0 -0
  301. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/kling_video_client.py +0 -0
  302. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/licensing.py +0 -0
  303. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/local_finance_tools.py +0 -0
  304. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/local_image_provider.py +0 -0
  305. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/local_llm_provider.py +0 -0
  306. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/macro_tools.py +0 -0
  307. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/markdown_pdf.py +0 -0
  308. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/market_data_client.py +0 -0
  309. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/mcp_client.py +0 -0
  310. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/memory_manager.py +0 -0
  311. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/model_capability.py +0 -0
  312. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/notification_tools.py +0 -0
  313. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/openai_image_client.py +0 -0
  314. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/__init__.py +0 -0
  315. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  316. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  317. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  318. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  319. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  320. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  321. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  322. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_core/export.py +0 -0
  323. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  324. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  325. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  326. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  327. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  328. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  329. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  330. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  331. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  332. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  333. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  334. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  335. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  336. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  337. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  338. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  339. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  340. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  341. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  342. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  343. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  344. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/context.py +0 -0
  345. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  346. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/data.py +0 -0
  347. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  348. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/references.py +0 -0
  349. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  350. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  351. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  352. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  353. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  354. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  355. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  356. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  357. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  358. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  359. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  360. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  361. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  362. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  363. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  364. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  365. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  366. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  367. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  368. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  369. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  370. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  371. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  372. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  373. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  374. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  375. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  376. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  377. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  378. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  379. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  380. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  381. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  382. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  383. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  384. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  385. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  386. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  387. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  388. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  389. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/__init__.py +0 -0
  390. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/base.py +0 -0
  391. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/finance/__init__.py +0 -0
  392. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  393. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/payments/__init__.py +0 -0
  394. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/realty/__init__.py +0 -0
  395. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/registry.py +0 -0
  396. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/packs/rules.py +0 -0
  397. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/plan_utils.py +0 -0
  398. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/plugin_loader.py +0 -0
  399. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/portfolio_ledger.py +0 -0
  400. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/preview_server.py +0 -0
  401. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/privacy/__init__.py +0 -0
  402. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/privacy/feedback.py +0 -0
  403. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/project_review.py +0 -0
  404. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/project_review_api.py +0 -0
  405. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/project_review_server.py +0 -0
  406. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/project_tools.py +0 -0
  407. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/__init__.py +0 -0
  408. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/__init__.py +0 -0
  409. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  410. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  411. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/base.py +0 -0
  412. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/custom.py +0 -0
  413. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/ollama.py +0 -0
  414. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  415. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/llm/registry.py +0 -0
  416. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/local_image_provider.py +0 -0
  417. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  418. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/providers/tool_messages.py +0 -0
  419. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/realty_data_tools.py +0 -0
  420. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/relay_store.py +0 -0
  421. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/report_exporters.py +0 -0
  422. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/report_generator.py +0 -0
  423. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/review_service.py +0 -0
  424. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/__init__.py +0 -0
  425. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/acceptance.py +0 -0
  426. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/agent_loop.py +0 -0
  427. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/approval.py +0 -0
  428. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/budget.py +0 -0
  429. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/checkpoints.py +0 -0
  430. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/crash_report.py +0 -0
  431. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/events.py +0 -0
  432. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/gateway.py +0 -0
  433. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/lsp.py +0 -0
  434. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/orchestrator.py +0 -0
  435. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/repo_map.py +0 -0
  436. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/run_state.py +0 -0
  437. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/run_store.py +0 -0
  438. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/self_healing.py +0 -0
  439. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/subagent.py +0 -0
  440. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/task_ledger.py +0 -0
  441. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  442. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/tool_executor.py +0 -0
  443. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/tool_policy.py +0 -0
  444. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runtime/worktrees.py +0 -0
  445. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/runway_video_client.py +0 -0
  446. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/safety/__init__.py +0 -0
  447. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/safety/permissions.py +0 -0
  448. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/safety/service.py +0 -0
  449. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/setup_wizard.py +0 -0
  450. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/spreadsheet_tools.py +0 -0
  451. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/strategy_vault.py +0 -0
  452. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/__init__.py +0 -0
  453. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/artifact_tools.py +0 -0
  454. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/broker_tools.py +0 -0
  455. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  456. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  457. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  458. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  459. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  460. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/extended_tools.py +0 -0
  461. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  462. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  463. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  464. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  465. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  466. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/logistics_io.py +0 -0
  467. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  468. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/logistics_tools.py +0 -0
  469. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/macro_tools.py +0 -0
  470. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/notification_tools.py +0 -0
  471. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/project_tools.py +0 -0
  472. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  473. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  474. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/tools/stripe_tools.py +0 -0
  475. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/__init__.py +0 -0
  476. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/banner.py +0 -0
  477. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/console.py +0 -0
  478. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/image_render.py +0 -0
  479. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/input_box.py +0 -0
  480. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/mentions.py +0 -0
  481. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/picker.py +0 -0
  482. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/render/__init__.py +0 -0
  483. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/render/finance.py +0 -0
  484. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/render/market.py +0 -0
  485. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/render/responsive.py +0 -0
  486. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/render/team.py +0 -0
  487. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/robot.py +0 -0
  488. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  489. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/utils/vscode_uri.py +0 -0
  490. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/video_analysis.py +0 -0
  491. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/video_editor.py +0 -0
  492. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace/__init__.py +0 -0
  493. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace/files.py +0 -0
  494. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace/verify.py +0 -0
  495. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace_changes.py +0 -0
  496. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace_context.py +0 -0
  497. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace_service.py +0 -0
  498. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code/workspace_tools.py +0 -0
  499. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  500. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  501. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code.egg-info/requires.txt +0 -0
  502. {aria_code-0.87.0 → aria_code-0.89.0}/src/aria_code.egg-info/top_level.txt +0 -0
  503. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_adk_market_tools.py +0 -0
  504. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_agent_team_fallback.py +0 -0
  505. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_analyze_file_tool.py +0 -0
  506. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_architecture_ledger_is_true.py +0 -0
  507. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_architecture_report.py +0 -0
  508. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_aria_cli_core.py +0 -0
  509. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_aria_mcp_server.py +0 -0
  510. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_aria_sdk.py +0 -0
  511. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_artifact_publishing.py +0 -0
  512. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_artifacts_and_reports.py +0 -0
  513. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ashare_prediction_cmds.py +0 -0
  514. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_backtest_cmds.py +0 -0
  515. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_backtest_engine.py +0 -0
  516. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_backtest_report.py +0 -0
  517. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  518. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_broken_akshare_is_optional.py +0 -0
  519. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_broker_automation.py +0 -0
  520. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  521. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_broker_planning.py +0 -0
  522. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_broker_safety.py +0 -0
  523. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_broker_tools.py +0 -0
  524. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_budget.py +0 -0
  525. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_business_workflow_cmds.py +0 -0
  526. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_canva_client.py +0 -0
  527. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_canvas_cmds.py +0 -0
  528. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_card_approvals.py +0 -0
  529. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_channel_intake.py +0 -0
  530. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_channels.py +0 -0
  531. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_chart_handlers.py +0 -0
  532. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_chat_bots_fail_closed.py +0 -0
  533. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_chat_routing.py +0 -0
  534. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ci_security_workflow.py +0 -0
  535. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_app_split.py +0 -0
  536. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_bootstrap.py +0 -0
  537. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_config_store.py +0 -0
  538. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  539. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_runtime_consumer.py +0 -0
  540. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_tool_executor_module.py +0 -0
  541. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cli_updater.py +0 -0
  542. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_cloud_memory.py +0 -0
  543. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_code_audit_tools.py +0 -0
  544. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_code_review_agent.py +0 -0
  545. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_codegen_output.py +0 -0
  546. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_coder_tester_self_healing.py +0 -0
  547. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_coder_tool_safety.py +0 -0
  548. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_collaboration.py +0 -0
  549. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_command_loggers.py +0 -0
  550. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_command_safety.py +0 -0
  551. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_completions_builder.py +0 -0
  552. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_config_paths.py +0 -0
  553. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_configured_provider.py +0 -0
  554. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_container_entrypoint.py +0 -0
  555. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_container_entrypoints.py +0 -0
  556. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_context_checkpoints.py +0 -0
  557. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_context_references.py +0 -0
  558. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_context_service.py +0 -0
  559. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_conversation_core.py +0 -0
  560. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_crash_report.py +0 -0
  561. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_credential_file_permissions.py +0 -0
  562. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_custom_providers.py +0 -0
  563. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_daemon_gateway_config.py +0 -0
  564. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_dashboard_generator.py +0 -0
  565. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_data_service.py +0 -0
  566. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_data_service_imports.py +0 -0
  567. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_data_without_model.py +0 -0
  568. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_datasource_routing.py +0 -0
  569. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_deep_analysis.py +0 -0
  570. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_degrades_without_quant_engine.py +0 -0
  571. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  572. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_doctor.py +0 -0
  573. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  574. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_doctor_npm_scope.py +0 -0
  575. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_engine_boundary.py +0 -0
  576. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_enterprise_tool_honesty.py +0 -0
  577. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_env_switch_docs.py +0 -0
  578. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_evals_harness.py +0 -0
  579. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_event_import_roots.py +0 -0
  580. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_extended_tools.py +0 -0
  581. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_feishu_swarm_config.py +0 -0
  582. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_finalize_release.py +0 -0
  583. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_finance_renderers.py +0 -0
  584. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_finance_service_catalog.py +0 -0
  585. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_first_run_output.py +0 -0
  586. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_first_run_works.py +0 -0
  587. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_football_agent.py +0 -0
  588. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_football_prediction_output.py +0 -0
  589. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_google_cloud_models.py +0 -0
  590. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_google_cloud_routing.py +0 -0
  591. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_google_login.py +0 -0
  592. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_google_search_provider.py +0 -0
  593. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_headless_is_agentic.py +0 -0
  594. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_honest_surfaces.py +0 -0
  595. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_image_gen_tools.py +0 -0
  596. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_image_inputs.py +0 -0
  597. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_import_graph_budget.py +0 -0
  598. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_intent_router.py +0 -0
  599. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_intent_signals.py +0 -0
  600. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_kling_video_client.py +0 -0
  601. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_lazy_rebind.py +0 -0
  602. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_legacy_module_imports.py +0 -0
  603. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_license_consistency.py +0 -0
  604. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_licensing.py +0 -0
  605. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_local_image_provider.py +0 -0
  606. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_logistics_3pl.py +0 -0
  607. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_logistics_and_finance_agents.py +0 -0
  608. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_lsp.py +0 -0
  609. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_markdown_pdf.py +0 -0
  610. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_answers_in_english.py +0 -0
  611. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_data_client.py +0 -0
  612. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_history_inheritance.py +0 -0
  613. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_history_tool.py +0 -0
  614. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_hours.py +0 -0
  615. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_questions_on_backend.py +0 -0
  616. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_symbol_extraction.py +0 -0
  617. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_market_universe.py +0 -0
  618. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_mcp_circuit.py +0 -0
  619. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_mcp_client.py +0 -0
  620. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_mentions.py +0 -0
  621. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_model_capability_registry.py +0 -0
  622. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_model_choice_is_the_users.py +0 -0
  623. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_model_selection_state.py +0 -0
  624. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_native_binary_entrypoints.py +0 -0
  625. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_native_installer.py +0 -0
  626. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_natural_language_routing.py +0 -0
  627. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_new_modules.py +0 -0
  628. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  629. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_no_uncommitted_imports.py +0 -0
  630. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_numeric_listings.py +0 -0
  631. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ollama_stream_imports.py +0 -0
  632. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ollama_stream_tools.py +0 -0
  633. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_openai_image_client.py +0 -0
  634. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_operations_suite.py +0 -0
  635. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_packages_facade.py +0 -0
  636. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_packaging_constraints.py +0 -0
  637. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_packaging_manifest.py +0 -0
  638. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_packs_domains.py +0 -0
  639. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_pdf_report.py +0 -0
  640. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_pick_best_installed_model.py +0 -0
  641. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_plan_mode.py +0 -0
  642. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_platform_package_assembly.py +0 -0
  643. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_platform_packages.py +0 -0
  644. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_plotly_html_output.py +0 -0
  645. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_portfolio_ledger.py +0 -0
  646. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_post_turn_context_decision.py +0 -0
  647. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_preflight.py +0 -0
  648. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_preview_server.py +0 -0
  649. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_privacy_feedback.py +0 -0
  650. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_project_aria.py +0 -0
  651. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_project_review.py +0 -0
  652. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_project_review_api.py +0 -0
  653. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_prompt_assembly.py +0 -0
  654. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_prompt_selection.py +0 -0
  655. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_provider_autoconfig.py +0 -0
  656. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_provider_error_messages.py +0 -0
  657. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_provider_integration.py +0 -0
  658. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_provider_registry.py +0 -0
  659. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_public_service_status.py +0 -0
  660. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_quant_engine_namespace.py +0 -0
  661. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_rebind_contract.py +0 -0
  662. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_rebind_namespace_contract.py +0 -0
  663. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_relay_client_credentials.py +0 -0
  664. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_relay_event_verification.py +0 -0
  665. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_relay_sends_for_clients.py +0 -0
  666. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_relay_store.py +0 -0
  667. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_relay_url.py +0 -0
  668. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_release_chain.py +0 -0
  669. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_release_commit_identity.py +0 -0
  670. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_release_push_is_atomic.py +0 -0
  671. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_release_reaches_the_registries.py +0 -0
  672. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_release_verification_waits.py +0 -0
  673. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_release_workflow_permissions.py +0 -0
  674. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_report_charts.py +0 -0
  675. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_report_generator.py +0 -0
  676. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_research_protocol.py +0 -0
  677. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_research_quality.py +0 -0
  678. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_responsive_rendering.py +0 -0
  679. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_review_service.py +0 -0
  680. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_root_module_budget.py +0 -0
  681. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  682. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_acceptance.py +0 -0
  683. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_agent_loop.py +0 -0
  684. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_approval.py +0 -0
  685. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_bridge.py +0 -0
  686. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_bridge_fallback.py +0 -0
  687. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_checkpoints.py +0 -0
  688. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_event_identity.py +0 -0
  689. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_gateway.py +0 -0
  690. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_repo_map.py +0 -0
  691. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_run_store.py +0 -0
  692. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_tool_executor.py +0 -0
  693. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runtime_worktrees.py +0 -0
  694. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_runway_video_client.py +0 -0
  695. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_safety_permissions.py +0 -0
  696. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_safety_service.py +0 -0
  697. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_safety_service_adoption.py +0 -0
  698. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_service_diagnostics_security.py +0 -0
  699. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_session_search.py +0 -0
  700. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_settings_service.py +0 -0
  701. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_shipper_digest.py +0 -0
  702. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_single_import_root.py +0 -0
  703. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_skill_agent_binding.py +0 -0
  704. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_skill_catalog.py +0 -0
  705. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_skill_loader.py +0 -0
  706. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_slash_popup.py +0 -0
  707. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_spreadsheet_tools.py +0 -0
  708. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_sse_stream_contract.py +0 -0
  709. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_startup_dashboard.py +0 -0
  710. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_startup_latency.py +0 -0
  711. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_status_language.py +0 -0
  712. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_streaming_pipeline.py +0 -0
  713. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_stripe_agent.py +0 -0
  714. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_subagent.py +0 -0
  715. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_supervisor_routing.py +0 -0
  716. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_system_prompts.py +0 -0
  717. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_system_tools_output.py +0 -0
  718. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_task_orchestrator.py +0 -0
  719. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_team_synthesis.py +0 -0
  720. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_tls_trust_store.py +0 -0
  721. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_tool_policy.py +0 -0
  722. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  723. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_tool_scope.py +0 -0
  724. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_tool_step_output.py +0 -0
  725. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_trading_service.py +0 -0
  726. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_tradingview_bridge.py +0 -0
  727. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_turn_planning.py +0 -0
  728. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ui_completer_references.py +0 -0
  729. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ui_console_theme.py +0 -0
  730. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ui_input_box.py +0 -0
  731. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ui_language_and_model.py +0 -0
  732. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_ui_robot_banner.py +0 -0
  733. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_update_health_routes.py +0 -0
  734. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_verification_hint.py +0 -0
  735. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_verification_policy.py +0 -0
  736. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_version_consistency.py +0 -0
  737. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_version_counter.py +0 -0
  738. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_video_analysis.py +0 -0
  739. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_video_editor.py +0 -0
  740. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_vscode_mcp.py +0 -0
  741. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_warehouse_agents.py +0 -0
  742. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_warehouse_cli_registration.py +0 -0
  743. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_warehouse_erp_client.py +0 -0
  744. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_warehouse_workflow.py +0 -0
  745. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_wheel_is_installable.py +0 -0
  746. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_workspace_changes.py +0 -0
  747. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_workspace_context.py +0 -0
  748. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_workspace_files.py +0 -0
  749. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_workspace_scope.py +0 -0
  750. {aria_code-0.87.0 → aria_code-0.89.0}/tests/test_workspace_service.py +0 -0
  751. {aria_code-0.87.0 → aria_code-0.89.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.87.0
3
+ Version: 0.89.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.87.0"
7
+ version = "0.89.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.87.0"
20
+ __version__ = "0.89.0"
@@ -553,46 +553,51 @@ class BacktestCommandsMixin:
553
553
  actual_end = self._bt_value(d, "end", "end_date", default=end_date)
554
554
  bars = self._bt_int(d.get("bars"))
555
555
  initial = self._bt_money(d.get("initial_capital", _initial_capital))
556
- self.context.console.print(
557
- f" [#57606a]source:[/#57606a] {src}"
558
- f" [#57606a]period:[/#57606a] {actual_start} → {actual_end}"
559
- f" [#57606a]bars:[/#57606a] {bars}"
560
- f" [#57606a]capital:[/#57606a] {initial}"
561
- )
562
- self.context.console.print(
563
- f" [#57606a]params:[/#57606a] "
564
- f"momentum={_momentum_period} fast={_fast_period} slow={_slow_period}"
565
- )
556
+ # One label per row, values wrapping in their own column: four
557
+ # "label: value" pairs on one line wrapped anywhere in an
558
+ # 80-column terminal, and the report path fell to column 0.
559
+ from rich.padding import Padding
560
+ from rich.style import Style
561
+ from rich.table import Table
562
+ from rich.text import Text
563
+ from aria_code.ui.render.output import file_uri
564
+
565
+ facts: list[tuple[str, object]] = [
566
+ ("source", src),
567
+ ("period", f"{actual_start} → {actual_end} · {bars} bars"),
568
+ ("capital", initial),
569
+ ("params", f"momentum={_momentum_period} fast={_fast_period} slow={_slow_period}"),
570
+ ]
566
571
  if d.get("provider_chain"):
567
572
  chain = " → ".join(str(x) for x in d.get("provider_chain") or [])
568
573
  status = d.get("data_status") or "complete"
569
574
  missing = ", ".join(str(x) for x in (d.get("missing_fields") or [])) or "none"
570
- self.context.console.print(
571
- f" [#57606a]data:[/#57606a] {chain}"
572
- f" [#57606a]status:[/#57606a] {status}"
573
- f" [#57606a]missing:[/#57606a] {missing}"
574
- )
575
+ facts.append(("data", f"{chain} · {status} · missing {missing}"))
575
576
  vol = self._bt_volume_summary(d)
576
577
  if vol:
577
578
  avg = vol.get("average")
578
579
  last = vol.get("last")
579
580
  coverage = self._bt_num(vol.get("coverage"))
580
- self.context.console.print(
581
- f" [#57606a]volume:[/#57606a] "
582
- f"avg {avg:,.0f} · last {last:,.0f} · coverage {coverage:.0%}"
583
- if avg is not None and last is not None
584
- else " [#57606a]volume:[/#57606a] unavailable"
585
- )
581
+ facts.append(("volume", f"avg {avg:,.0f} · last {last:,.0f} · coverage {coverage:.0%}"
582
+ if avg is not None and last is not None else "unavailable"))
586
583
  if d.get("report_path"):
587
584
  _report = str(d["report_path"])
588
585
  _home = str(pathlib.Path.home())
589
- if _report.startswith(_home + os.sep):
590
- _report = "~" + _report[len(_home):]
591
- self.context.console.print(f" [#57606a]report:[/#57606a] {_report}")
586
+ _shown = "~" + _report[len(_home):] if _report.startswith(_home + os.sep) else _report
587
+ facts.append(("report", Text(_shown, style=Style(link=file_uri(_report)))))
588
+ grid = Table.grid(padding=(0, 1))
589
+ grid.add_column(style="#57606a", no_wrap=True)
590
+ grid.add_column(overflow="fold")
591
+ for label, value in facts:
592
+ grid.add_row(f"{label}:", value if isinstance(value, Text) else Text(str(value)))
593
+ self.context.console.print(Padding(grid, (0, 0, 0, 2)))
592
594
  if trades == 0:
595
+ _zh_bt = str(self.terminal.config.get("ui_lang", "en")).lower().startswith("zh")
593
596
  self.context.console.print(
594
597
  " [yellow]注意:[/yellow] # Trades 为 0,表示本次规则没有触发入场;"
595
- "收益可能来自全程空仓/持仓逻辑或上游交易统计口径。"
598
+ "收益可能来自全程空仓/持仓逻辑或上游交易统计口径。" if _zh_bt else
599
+ " [yellow]Note:[/yellow] 0 trades — the rules never triggered an entry; any return "
600
+ "comes from holding or from how the data source counts trades."
596
601
  )
597
602
  else:
598
603
  print(f"Total Return: {d.get('total_return',0)*100:.1f}% Sharpe: {d.get('sharpe_ratio',0):.2f} MaxDD: {d.get('max_drawdown',0)*100:.1f}%")
@@ -158,3 +158,26 @@ def short_description(description: str) -> str:
158
158
  text = str(description or "")
159
159
  cut = text.find(": /")
160
160
  return (text[:cut] if cut > 0 else text).strip()
161
+
162
+
163
+ # What /help and the "/" popup say about the commands they show, in the Chinese
164
+ # UI: the descriptions in the command table are English, so a Chinese session
165
+ # read "Show commands and examples" under 命令.
166
+ COMMAND_DESCRIPTIONS_ZH = {
167
+ "/help": "命令与示例", "/model": "切换模型", "/review": "代码审查", "/plan": "起草计划",
168
+ "/init": "为当前项目生成 ARIA.md", "/status": "运行状态:引擎 · 模型 · 工具 · 上下文",
169
+ "/sessions": "查看与搜索会话", "/clear": "清空对话", "/compact": "压缩上下文",
170
+ "/copy": "复制上一条回答", "/rewind": "恢复代码或对话", "/permissions": "工具权限",
171
+ "/config": "查看与修改配置", "/doctor": "诊断安装、模型与 API Key", "/login": "登录",
172
+ "/code": "生成并运行代码", "/ta": "技术指标", "/backtest": "回测并生成 HTML 报告",
173
+ "/team": "多智能体研究团队", "/report": "研究报告", "/portfolio": "投资组合",
174
+ "/inventory": "3PL 库存策略:补货点、安全库存、ABC/XYZ、呆滞库存",
175
+ "/carriers": "3PL 承运商评分:按线路排名、成本异常与节省",
176
+ }
177
+
178
+
179
+ def describe(name: str, description: str, lang: str = "en") -> str:
180
+ """The short description to show for a command, in the UI language."""
181
+ if str(lang).lower().startswith("zh") and name in COMMAND_DESCRIPTIONS_ZH:
182
+ return COMMAND_DESCRIPTIONS_ZH[name]
183
+ return short_description(description)
@@ -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.ui.render.output import file_uri as _file_uri
16
17
  from aria_code.apps.cli.i18n import ui_text
17
18
  from ._ui import print_error
18
19
 
@@ -263,12 +264,13 @@ class CoreCommandsMixin:
263
264
  commands that matter scrolled out of view. The rest is a topic away.
264
265
  """
265
266
  from aria_code.apps.cli.commands.catalog import (
266
- CORE_SLASH_COMMANDS, ENTRY_SLASH_COMMANDS, HELP_TOPICS, short_description,
267
+ CORE_SLASH_COMMANDS, ENTRY_SLASH_COMMANDS, HELP_TOPICS, describe,
267
268
  )
268
269
  zh = str(self.terminal.config.get("ui_lang", "en")).lower().startswith("zh")
269
270
  T = (lambda a, b: a) if zh else (lambda a, b: b)
270
- core = [(n, short_description(self.commands[n][1])) for n in CORE_SLASH_COMMANDS if n in self.commands]
271
- entry = [(n, short_description(self.commands[n][1])) for n in ENTRY_SLASH_COMMANDS if n in self.commands]
271
+ lang = "zh" if zh else "en"
272
+ core = [(n, describe(n, self.commands[n][1], lang)) for n in CORE_SLASH_COMMANDS if n in self.commands]
273
+ entry = [(n, describe(n, self.commands[n][1], lang)) for n in ENTRY_SLASH_COMMANDS if n in self.commands]
272
274
  examples = (
273
275
  T("给 utils.py 补上测试并运行", "Add tests for utils.py and run them"),
274
276
  T("NVDA 这周走势怎么样?", "How's NVDA this week?"),
@@ -2049,7 +2051,7 @@ class CoreCommandsMixin:
2049
2051
  "command": f"/tv {symbol} --pine",
2050
2052
  }
2051
2053
  if self.context.has_rich:
2052
- self.context.console.print(f" [green]✓[/green] Pine strategy saved: [link={pine_path}]{pine_path}[/link]")
2054
+ self.context.console.print(f" [green]✓[/green] Pine strategy saved: [link={_file_uri(pine_path)}]{pine_path}[/link]")
2053
2055
  self.context.console.print(" [dim]Use: TradingView → Pine Editor → paste script → Save → Add to chart[/dim]")
2054
2056
  else:
2055
2057
  print(f"Pine strategy saved: {pine_path}")
@@ -2058,7 +2060,7 @@ class CoreCommandsMixin:
2058
2060
  companion = _write_text_companion(str(pine_path))
2059
2061
  if companion:
2060
2062
  if self.context.has_rich:
2061
- self.context.console.print(f" [green]✓[/green] Text copy saved: [link={companion}]{companion}[/link]")
2063
+ self.context.console.print(f" [green]✓[/green] Text copy saved: [link={_file_uri(companion)}]{companion}[/link]")
2062
2064
  else:
2063
2065
  print(f"Text copy saved: {companion}")
2064
2066
  if copy_pine:
@@ -2208,7 +2210,7 @@ class CoreCommandsMixin:
2208
2210
  from rich.markup import escape as _esc
2209
2211
 
2210
2212
  self.context.console.print(f" [green]✓[/green] {_T('图表已生成', 'chart generated')} [dim]({elapsed_ms}ms)[/dim]")
2211
- self.context.console.print(f" {_T('已保存', 'saved')}: [link={path}]{path_label}[/link]")
2213
+ self.context.console.print(f" {_T('已保存', 'saved')}: [link={_file_uri(path)}]{path_label}[/link]")
2212
2214
  self.context.console.print(f" [dim]{_esc(_summary)}[/dim]")
2213
2215
  if issues:
2214
2216
  self.context.console.print(f" [yellow]⚠ {_issues_head}[/yellow]")
@@ -2266,7 +2268,7 @@ class CoreCommandsMixin:
2266
2268
  }
2267
2269
  if self.context.has_rich:
2268
2270
  self.context.console.print(f" [green]✓[/green] comparison chart generated [dim]({elapsed_ms}ms)[/dim]")
2269
- self.context.console.print(f" saved: [link={path}]{path_label}[/link]")
2271
+ self.context.console.print(f" saved: [link={_file_uri(path)}]{path_label}[/link]")
2270
2272
  rows = result.get("metrics") or []
2271
2273
  for row in rows[:6]:
2272
2274
  self.context.console.print(
@@ -2537,9 +2539,9 @@ class CoreCommandsMixin:
2537
2539
  self.context.console.print()
2538
2540
  self.context.console.print(f" [green]✓[/green] {T('技术图表已生成', 'Chart saved')}")
2539
2541
  if html_path:
2540
- self.context.console.print(f" [dim]HTML:[/dim] [link={html_path}]{_display_path(html_path)}[/link]")
2542
+ self.context.console.print(f" [dim]HTML:[/dim] [link={_file_uri(html_path)}]{_display_path(html_path)}[/link]")
2541
2543
  if png_path:
2542
- self.context.console.print(f" [dim]PNG :[/dim] [link={png_path}]{_display_path(png_path)}[/link]")
2544
+ self.context.console.print(f" [dim]PNG :[/dim] [link={_file_uri(png_path)}]{_display_path(png_path)}[/link]")
2543
2545
  elif png_error:
2544
2546
  self.context.console.print(f" [yellow]{T('PNG 跳过', 'PNG skipped')}:[/yellow] {png_error[:90]}")
2545
2547
  else:
@@ -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.ui.render.output import file_uri as _file_uri
11
+
10
12
  from aria_code.apps.cli.i18n import ui_text
11
13
 
12
14
  from ._ui import Panel, print_error
@@ -470,7 +472,7 @@ class PortfolioCommandsMixin:
470
472
  if self.context.has_rich:
471
473
  self.context.console.print(
472
474
  f" [green]PDF 导出成功[/green] "
473
- f"[link={_pdf_out}]{_pdf_out.name}[/link]"
475
+ f"[link={_file_uri(_pdf_out)}]{_pdf_out.name}[/link]"
474
476
  )
475
477
  else:
476
478
  print(f" PDF: {_pdf_out}")
@@ -577,7 +579,7 @@ class PortfolioCommandsMixin:
577
579
  else:
578
580
  self.context.console.print(
579
581
  f"\n [green]✅ 研报已保存[/green]"
580
- f" [link={path}]{path_label}[/link]"
582
+ f" [link={_file_uri(path)}]{path_label}[/link]"
581
583
  f" [dim]({_file_kb}KB)[/dim]"
582
584
  )
583
585
  self.context.console.print(f" [dim]文件: {path_label}[/dim]")
@@ -608,7 +610,7 @@ class PortfolioCommandsMixin:
608
610
  if self.context.has_rich:
609
611
  self.context.console.print(
610
612
  f" [green]PDF 导出成功[/green]"
611
- f" [link={_pdf_path}]{_pdf_path.name}[/link]"
613
+ f" [link={_file_uri(_pdf_path)}]{_pdf_path.name}[/link]"
612
614
  f" [dim]({_pdf_kb}KB)[/dim]"
613
615
  )
614
616
  else:
@@ -635,7 +637,7 @@ class PortfolioCommandsMixin:
635
637
  _idx = await update_report_index(out_f.parent)
636
638
  if _idx and self.context.has_rich:
637
639
  self.context.console.print(
638
- f" [dim]索引已更新: [link={_idx}]{_idx.name}[/link][/dim]"
640
+ f" [dim]索引已更新: [link={_file_uri(_idx)}]{_idx.name}[/link][/dim]"
639
641
  )
640
642
  except Exception as _e:
641
643
  logger.debug("[report] index update error: %s", _e)
@@ -156,8 +156,38 @@ _LABELS = {
156
156
  }
157
157
 
158
158
 
159
+ def _inventory_headline(result: dict, zh: bool) -> str:
160
+ """The first line of /inventory, in the UI language.
161
+
162
+ The tool's summary is English; in a Chinese session the detail lines under
163
+ it were Chinese and the headline above them was not. The formulas in the
164
+ basis line stay as the tool writes them.
165
+ """
166
+ if not zh:
167
+ return result["summary"]
168
+ data, counts = result["data"], result["data"].get("counts", {})
169
+ return (f"分析 {len(data['items'])} 个 SKU({result.get('source', '')}):"
170
+ f"{counts.get('reorder', 0)} 个需补货,{counts.get('insufficient_history', 0)} 个历史数据不足,"
171
+ f"{counts.get('no_demand', 0)} 个无需求;呆滞 {data.get('dead_stock', 0)} 个,慢动 {data.get('slow_stock', 0)} 个。")
172
+
173
+
174
+ def _carriers_headline(result: dict, zh: bool) -> str:
175
+ """The first line of /carriers, in the UI language (see _inventory_headline)."""
176
+ if not zh:
177
+ return result["summary"]
178
+ import re
179
+
180
+ data = result["data"]
181
+ waybills = re.match(r"(\d+)", result.get("summary", ""))
182
+ lanes = {c["lane"] for c in data.get("scorecard", [])}
183
+ carriers = {c["carrier"] for c in data.get("scorecard", [])}
184
+ return (f"{waybills.group(1) if waybills else '?'} 张运单,{len(lanes)} 条线路、{len(carriers)} 家承运商"
185
+ f"({result.get('source', '')});{len(data.get('anomalies', []))} 个异常待核实;"
186
+ f"{len(data.get('savings', []))} 个节省机会,预计共 {data.get('estimated_total_saving', 0):,.2f}。")
187
+
188
+
159
189
  def _labels(self) -> dict:
160
- """Labels in the UI language. The tools' summaries and formulas stay English."""
190
+ """Labels in the UI language. The tools' formulas stay as they write them."""
161
191
  config = getattr(getattr(self, "terminal", None), "config", None) or {}
162
192
  lang = str(config.get("ui_lang", "en") or "en").lower()
163
193
  return _LABELS["zh" if lang.startswith("zh") else "en"]
@@ -169,12 +199,19 @@ def _abc_xyz(item: dict) -> str:
169
199
 
170
200
 
171
201
  def _emit(self, text: str, style: str = "") -> None:
172
- if self.context.has_rich and style:
173
- self.context.console.print(f"[{style}]{text}[/{style}]")
174
- elif self.context.has_rich:
175
- self.context.console.print(text)
176
- else:
202
+ """One line of a report, wrapped under its own indent.
203
+
204
+ The indent was typed as leading spaces, so in an 80-column terminal a
205
+ wrapped line went back to column 0 ("cover · ABC/XYZ –/X" under the
206
+ margin). It is plain text, not markup: a SKU or file name may hold "[".
207
+ """
208
+ if not self.context.has_rich:
177
209
  print(text)
210
+ return
211
+ from aria_code.ui.render.output import print_hanging
212
+
213
+ body = text.lstrip(" ")
214
+ print_hanging(self.context.console, text[: len(text) - len(body)], body, style)
178
215
 
179
216
 
180
217
  class LogisticsCommandsMixin:
@@ -207,7 +244,7 @@ class LogisticsCommandsMixin:
207
244
  data = result["data"]
208
245
  if not data["scope"]["client_facing"]:
209
246
  _emit(self, data["scope"]["marker"], "bold red")
210
- _emit(self, result["summary"], "bold")
247
+ _emit(self, _inventory_headline(result, text is _LABELS["zh"]), "bold")
211
248
  for item in data["items"]:
212
249
  if item["action"] != "reorder":
213
250
  continue
@@ -239,7 +276,7 @@ class LogisticsCommandsMixin:
239
276
  data = result["data"]
240
277
  if not data["scope"]["client_facing"]:
241
278
  _emit(self, data["scope"]["marker"], "bold red")
242
- _emit(self, result["summary"], "bold")
279
+ _emit(self, _carriers_headline(result, text is _LABELS["zh"]), "bold")
243
280
  for entry in data["scorecard"]:
244
281
  rank = f"#{entry['rank_in_lane']}" if entry["rank_in_lane"] else text["too_few"]
245
282
  on_time = (text["on_time"].format(rate=entry["on_time_rate"], low=entry["on_time_lower_bound"])
@@ -103,6 +103,7 @@ except ImportError:
103
103
  readline = None
104
104
  import logging
105
105
  import time
106
+ from aria_code.ui.render.output import file_uri as _file_uri
106
107
  import shlex
107
108
  import pathlib
108
109
  import uuid
@@ -2308,13 +2309,13 @@ def _print_pending_artifact_location(pending_artifact: dict) -> None:
2308
2309
  console.print(f" [dim]类型: {kind}[/dim]")
2309
2310
  if paths:
2310
2311
  for label, path in paths:
2311
- console.print(f" [dim]{label}:[/dim] [link={path}]{_display_path(path, fallback=label)}[/link]")
2312
+ console.print(f" [dim]{label}:[/dim] [link={_file_uri(path)}]{_display_path(path, fallback=label)}[/link]")
2312
2313
  elif command:
2313
2314
  console.print(" [yellow]上一项任务只记录了命令,尚未记录具体文件路径。[/yellow]")
2314
2315
  if child_paths:
2315
2316
  console.print(" [dim]包含的单标的图表:[/dim]")
2316
2317
  for child_label, label, path in child_paths:
2317
- console.print(f" [dim]{child_label} {label}:[/dim] [link={path}]{_display_path(path, fallback=child_label)}[/link]")
2318
+ console.print(f" [dim]{child_label} {label}:[/dim] [link={_file_uri(path)}]{_display_path(path, fallback=child_label)}[/link]")
2318
2319
  if command:
2319
2320
  console.print(f" [dim]复现命令: {command}[/dim]")
2320
2321
  console.print()
@@ -2515,7 +2516,7 @@ Plotly.newPlot('chart', [
2515
2516
  "rows": z_rows,
2516
2517
  })
2517
2518
  if HAS_RICH:
2518
- console.print(f" [dim]Z-Score 图表: [link={art.path}]{_display_path(art.path)}[/link][/dim]")
2519
+ console.print(f" [dim]Z-Score 图表: [link={_file_uri(art.path)}]{_display_path(art.path)}[/link][/dim]")
2519
2520
  import subprocess
2520
2521
  try:
2521
2522
  subprocess.Popen(["open", str(art.path)])
@@ -4400,13 +4401,17 @@ class ArtheraTerminal:
4400
4401
  # improve its finance model — so disclose it up front.
4401
4402
  import os as _os
4402
4403
  if not _os.environ.get("ARIA_NO_TELEMETRY"):
4403
- console.print(
4404
- " [dim]隐私:反馈默认[bold]仅存本地[/bold],不上传。"
4404
+ # Padded, not prefixed with spaces: in 80 columns the
4405
+ # second line fell back to column 0.
4406
+ from rich.padding import Padding as _Pad
4407
+ from rich.text import Text as _Txt
4408
+ console.print(_Pad(_Txt.from_markup(
4409
+ "[dim]隐私:反馈默认[bold]仅存本地[/bold],不上传。"
4405
4410
  "opt-in 后可用于改进金融模型 · /privacy 查看与开关 · /bug 报告问题[/dim]"
4406
4411
  if str(_ui_lang).lower().startswith("zh") else
4407
- " [dim]Feedback stays [bold]on this machine[/bold] unless you opt in to "
4412
+ "[dim]Feedback stays [bold]on this machine[/bold] unless you opt in to "
4408
4413
  "help improve Aria · /privacy · /bug[/dim]"
4409
- )
4414
+ ), (0, 0, 0, 2)))
4410
4415
  else:
4411
4416
  if _banner_mode != "off":
4412
4417
  from ui.banner import render_full_banner as _rfb
@@ -21,8 +21,8 @@ from aria_code.apps.cli.commands.catalog import (
21
21
  COMMAND_ALIASES,
22
22
  CORE_SLASH_COMMANDS,
23
23
  ENTRY_SLASH_COMMANDS,
24
+ describe,
24
25
  popup_rank,
25
- short_description,
26
26
  )
27
27
  from aria_code.packages.aria_services.references import REFERENCE_KINDS, reference_search_roots
28
28
 
@@ -307,7 +307,7 @@ if HAS_PT:
307
307
  "设置": "运行设置" if self.lang == "zh" else "Runtime",
308
308
  "系统": "会话" if self.lang == "zh" else "Session",
309
309
  }.get(cat, "")
310
- desc = short_description(desc)
310
+ desc = describe(name, desc, self.lang)
311
311
  meta_body = desc[:44] + ("…" if len(desc) > 44 else "")
312
312
  meta_str = f"{cat_label} · {meta_body}" if cat_label else meta_body
313
313
 
@@ -52,6 +52,43 @@ def _is_markdown_table_separator(line: str) -> bool:
52
52
  return bool(cells) and all(_TABLE_SEPARATOR_CELL.fullmatch(cell) for cell in cells)
53
53
 
54
54
 
55
+ # Column headers that name no dimension — the value column of a key/value table.
56
+ _GENERIC_TABLE_HEADERS = {"value", "values", "meaning", "数值", "值", "含义", "说明"}
57
+
58
+
59
+ def _table_rows_as_lines(headers: list[str], rows: list[list[str]]) -> list[str]:
60
+ """One line per table row: the first cell as its label, the rest after it.
61
+
62
+ Each cell used to become its own bullet — "• 指标:最新价 / • 数值:USD 332.89"
63
+ — so a ten-row snapshot table took about thirty lines in an 80-column
64
+ terminal. Generic value columns ("Value", "数值") lose their header; a
65
+ column that names a dimension keeps it ("观察:价格高于 MA20"). A value
66
+ already contained in the one before it ("51.9,中性" then "中性") is dropped.
67
+ """
68
+ lines: list[str] = []
69
+ for row in rows:
70
+ cells = [(header, (row[pos] if pos < len(row) else "").strip())
71
+ for pos, header in enumerate(headers) if header]
72
+ if not cells:
73
+ continue
74
+ label = cells[0][1] or "—"
75
+ parts: list[str] = []
76
+ previous = ""
77
+ for header, value in cells[1:]:
78
+ if not value or value in ("—", "-") or (previous and value in previous):
79
+ continue
80
+ generic = header.strip().lower() in _GENERIC_TABLE_HEADERS
81
+ parts.append(value if generic else f"{header}{':' if _has_cjk(header) else ': '}{value}")
82
+ previous = value
83
+ colon = ":" if _has_cjk(label) or any(_has_cjk(h) for h, _ in cells) else ": "
84
+ lines.append(f"- **{label}**{colon}{' · '.join(parts) or '—'}")
85
+ return lines
86
+
87
+
88
+ def _has_cjk(text: str) -> bool:
89
+ return any("\u4e00" <= ch <= "\u9fff" for ch in text or "")
90
+
91
+
55
92
  def adapt_markdown_for_width(markup: str, width: int, *, table_breakpoint: int = 96) -> str:
56
93
  """Convert GFM tables to stacked records when the terminal is narrow.
57
94
 
@@ -92,18 +129,7 @@ def adapt_markdown_for_width(markup: str, width: int, *, table_breakpoint: int =
92
129
  cursor += 1
93
130
 
94
131
  if headers and rows:
95
- for row in rows:
96
- pairs = [
97
- (header, row[pos] if pos < len(row) else "—")
98
- for pos, header in enumerate(headers)
99
- if header
100
- ]
101
- if not pairs:
102
- continue
103
- first_header, first_value = pairs[0]
104
- output.append(f"- **{first_header}**:{first_value or '—'}")
105
- for header, value in pairs[1:]:
106
- output.append(f" - **{header}**:{value or '—'}")
132
+ output.extend(_table_rows_as_lines(headers, rows))
107
133
  index = cursor
108
134
  continue
109
135
 
@@ -179,6 +205,22 @@ def format_turn_footer(metadata, *, mode: str = "compact", copy_available: bool
179
205
  return " · ".join(out)
180
206
 
181
207
 
208
+ def file_uri(path: object) -> str:
209
+ """A terminal-hyperlink target for a local file: file:///Users/…/chart.html.
210
+
211
+ Saved files were linked as [link=/Users/…/chart.html]: OSC 8 hyperlinks
212
+ take a URI, so terminals that support them had nothing to open. A value
213
+ that already has a scheme (https://…) is returned unchanged.
214
+ """
215
+ text = str(path or "")
216
+ if not text or "://" in text:
217
+ return text
218
+ try:
219
+ return pathlib.Path(text).expanduser().resolve().as_uri()
220
+ except (OSError, ValueError):
221
+ return text
222
+
223
+
182
224
  def display_path(path: object, *, fallback: str = "file") -> str:
183
225
  """Return a path-safe display value for user-facing UI."""
184
226
  if not path:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.87.0
3
+ Version: 0.89.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
@@ -572,6 +572,7 @@ tests/test_evals_harness.py
572
572
  tests/test_event_import_roots.py
573
573
  tests/test_extended_tools.py
574
574
  tests/test_feishu_swarm_config.py
575
+ tests/test_file_links.py
575
576
  tests/test_finalize_release.py
576
577
  tests/test_finance_renderers.py
577
578
  tests/test_finance_service_catalog.py
@@ -614,6 +615,7 @@ tests/test_mentions.py
614
615
  tests/test_model_capability_registry.py
615
616
  tests/test_model_choice_is_the_users.py
616
617
  tests/test_model_selection_state.py
618
+ tests/test_narrow_chinese_output.py
617
619
  tests/test_native_binary_entrypoints.py
618
620
  tests/test_native_installer.py
619
621
  tests/test_natural_language_routing.py
@@ -743,4 +745,5 @@ tests/test_workspace_context.py
743
745
  tests/test_workspace_files.py
744
746
  tests/test_workspace_scope.py
745
747
  tests/test_workspace_service.py
746
- tests/test_workspace_verify.py
748
+ tests/test_workspace_verify.py
749
+ tests/test_wrapped_indent.py
@@ -0,0 +1,43 @@
1
+ """Saved files are links a terminal can open.
2
+
3
+ They were linked as [link=/Users/…/chart.html]: terminal hyperlinks (OSC 8)
4
+ take a URI, so a terminal that supports them had nothing to open, and the
5
+ line showed only "232347_AAPL_chart.html".
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import io
11
+ import pathlib
12
+ import re
13
+
14
+ from rich.console import Console
15
+
16
+ from aria_code.ui.render.output import file_uri
17
+
18
+ SRC = pathlib.Path(__file__).resolve().parents[1] / "src" / "aria_code"
19
+
20
+
21
+ def test_a_path_becomes_a_file_uri(tmp_path):
22
+ target = tmp_path / "my charts" / "AAPL_chart.html"
23
+ assert file_uri(str(target)) == target.resolve().as_uri()
24
+ assert file_uri(str(target)).startswith("file:///") and "%20" in file_uri(str(target))
25
+ assert file_uri("https://example.com/x") == "https://example.com/x"
26
+ assert file_uri("") == ""
27
+
28
+
29
+ def test_the_terminal_receives_the_uri(tmp_path):
30
+ target = tmp_path / "AAPL_chart.html"
31
+ console = Console(file=io.StringIO(), force_terminal=True, color_system="truecolor")
32
+ console.print(f"saved: [link={file_uri(target)}]AAPL_chart.html[/link]")
33
+ assert f"\x1b]8;id=" in console.file.getvalue() and target.resolve().as_uri() in console.file.getvalue()
34
+
35
+
36
+ def test_every_file_link_goes_through_file_uri():
37
+ raw = []
38
+ for path in SRC.rglob("*.py"):
39
+ for number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
40
+ for target in re.findall(r"\[link=\{([^}]+)\}\]", line):
41
+ if not target.startswith("_file_uri(") and "url" not in target.lower():
42
+ raw.append(f"{path.relative_to(SRC)}:{number}: {target}")
43
+ assert not raw, raw
@@ -0,0 +1,62 @@
1
+ """The Chinese UI in an 80-column terminal reads as Chinese and stays short.
2
+
3
+ Recorded: /help and the "/" popup described commands in English under 命令,
4
+ and /inventory and /carriers put an English headline over Chinese detail
5
+ lines. (Narrow tables are covered in test_output_rendering.)
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import io
11
+ import sys
12
+
13
+ from rich.console import Console
14
+
15
+ from aria_code.apps.cli.commands.catalog import COMMAND_DESCRIPTIONS_ZH, CORE_SLASH_COMMANDS, ENTRY_SLASH_COMMANDS, describe
16
+
17
+
18
+ def test_every_command_help_shows_has_a_chinese_description():
19
+ missing = [n for n in (*CORE_SLASH_COMMANDS, *ENTRY_SLASH_COMMANDS) if n not in COMMAND_DESCRIPTIONS_ZH]
20
+ assert not missing, missing
21
+ assert describe("/help", "Show commands and examples", "zh") == "命令与示例"
22
+ assert describe("/help", "Show commands and examples", "en") == "Show commands and examples"
23
+ assert describe("/realty", "Real-estate data: /realty X", "zh") == "Real-estate data"
24
+
25
+
26
+ def test_help_in_chinese_describes_in_chinese(monkeypatch):
27
+ sys.argv = ["aria-code"]
28
+ import aria_code.aria_cli as cli
29
+
30
+ terminal = cli.ArtheraTerminal(dict(cli.DEFAULT_CONFIG, ui_lang="zh"))
31
+ console = Console(file=io.StringIO(), width=80, color_system=None)
32
+ monkeypatch.setattr(terminal.commands.context, "console", console)
33
+ monkeypatch.setattr(terminal.commands.context, "has_rich", True)
34
+ terminal.commands.cmd_help("")
35
+ text = console.file.getvalue()
36
+ assert "命令与示例" in text and "Show commands and examples" not in text
37
+
38
+
39
+ def test_the_popup_describes_in_chinese():
40
+ from prompt_toolkit.document import Document
41
+
42
+ from aria_code.ui.completer import AriaPTCompleter
43
+
44
+ completer = AriaPTCompleter({"/help": (lambda a: None, "Show commands and examples")}, [], [], lang="zh")
45
+ meta = str(next(completer.get_completions(Document("/he"), None)).display_meta_text)
46
+ assert "命令与示例" in meta
47
+
48
+
49
+ def test_logistics_headlines_follow_the_ui_language():
50
+ from aria_code.apps.cli.commands.warehouse_cmds import _carriers_headline, _inventory_headline
51
+
52
+ inventory = {"summary": "7 SKUs analysed (file:skus.csv): 3 to reorder", "source": "file:skus.csv",
53
+ "data": {"items": [{}] * 7, "counts": {"reorder": 3, "insufficient_history": 1, "no_demand": 1},
54
+ "dead_stock": 0, "slow_stock": 0}}
55
+ assert _inventory_headline(inventory, zh=True) == (
56
+ "分析 7 个 SKU(file:skus.csv):3 个需补货,1 个历史数据不足,1 个无需求;呆滞 0 个,慢动 0 个。")
57
+ assert _inventory_headline(inventory, zh=False) == inventory["summary"]
58
+ carriers = {"summary": "100 waybills across 3 lanes and 5 carriers", "source": "file:waybills.csv",
59
+ "data": {"scorecard": [{"lane": "A", "carrier": "X"}, {"lane": "B", "carrier": "Y"}],
60
+ "anomalies": [1, 2], "savings": [1], "estimated_total_saving": 645.49}}
61
+ assert _carriers_headline(carriers, zh=True) == (
62
+ "100 张运单,2 条线路、2 家承运商(file:waybills.csv);2 个异常待核实;1 个节省机会,预计共 645.49。")