aria-code 0.99.0__tar.gz → 0.101.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 (781) hide show
  1. {aria_code-0.99.0/src/aria_code.egg-info → aria_code-0.101.0}/PKG-INFO +1 -1
  2. {aria_code-0.99.0 → aria_code-0.101.0}/pyproject.toml +1 -1
  3. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/chat_turn.py +6 -2
  5. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +5 -3
  6. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/market_cmds.py +29 -11
  7. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +10 -4
  8. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/report.py +53 -14
  9. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +4 -1
  10. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +88 -33
  11. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/terminal_chrome.py +11 -1
  12. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_cli.py +5 -5
  13. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/evals/harness.py +37 -1
  14. aria_code-0.101.0/src/aria_code/evals/summary.py +75 -0
  15. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/logistics_io.py +6 -0
  16. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/macro_tools.py +52 -12
  17. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/render/finance.py +47 -22
  18. {aria_code-0.99.0 → aria_code-0.101.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  19. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code.egg-info/SOURCES.txt +6 -0
  20. aria_code-0.101.0/tests/test_english_output_group.py +82 -0
  21. aria_code-0.101.0/tests/test_eval_summary.py +75 -0
  22. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_evals_harness.py +25 -0
  23. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_output_rendering.py +2 -1
  24. aria_code-0.101.0/tests/test_report_prompt_language.py +43 -0
  25. aria_code-0.101.0/tests/test_startup_keeps_cloud_model.py +50 -0
  26. aria_code-0.101.0/tests/test_vertex_empty_rounds.py +82 -0
  27. {aria_code-0.99.0 → aria_code-0.101.0}/LICENSE +0 -0
  28. {aria_code-0.99.0 → aria_code-0.101.0}/NOTICE +0 -0
  29. {aria_code-0.99.0 → aria_code-0.101.0}/README.md +0 -0
  30. {aria_code-0.99.0 → aria_code-0.101.0}/setup.cfg +0 -0
  31. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/__init__.py +0 -0
  32. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/adk_apps/__init__.py +0 -0
  33. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  34. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  35. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  36. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  37. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/__init__.py +0 -0
  38. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/base.py +0 -0
  39. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/code_review.py +0 -0
  40. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/__init__.py +0 -0
  41. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  42. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/critic.py +0 -0
  43. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/deepen.py +0 -0
  44. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/models.py +0 -0
  45. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  46. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  47. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/themes.py +0 -0
  48. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/deep/tiers.py +0 -0
  49. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  50. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/engineering/coder.py +0 -0
  51. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/engineering/tester.py +0 -0
  52. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/__init__.py +0 -0
  53. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  54. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  55. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  56. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/debate.py +0 -0
  57. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/earnings.py +0 -0
  58. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  59. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/macro.py +0 -0
  60. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/news.py +0 -0
  61. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/risk.py +0 -0
  62. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/sector.py +0 -0
  63. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/strategist.py +0 -0
  64. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  65. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  66. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/financial/technical.py +0 -0
  67. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/orchestrator.py +0 -0
  68. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  69. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/__init__.py +0 -0
  70. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  71. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/business_match.py +0 -0
  72. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  73. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  74. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  75. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  76. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  77. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  78. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  79. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/registry.py +0 -0
  80. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/signal_scheme.py +0 -0
  81. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/sports/__init__.py +0 -0
  82. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  83. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/supervisor.py +0 -0
  84. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/team.py +0 -0
  85. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  86. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  87. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  88. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  89. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  90. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  91. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  92. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  93. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  94. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  95. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  96. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aliyun_data_client.py +0 -0
  97. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/README.md +0 -0
  98. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/__init__.py +0 -0
  99. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/README.md +0 -0
  100. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/__init__.py +0 -0
  101. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/approvals.py +0 -0
  102. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/conversation.py +0 -0
  103. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/digest.py +0 -0
  104. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/intake.py +0 -0
  105. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/registry.py +0 -0
  106. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  107. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/README.md +0 -0
  108. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/__init__.py +0 -0
  109. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/_optional.py +0 -0
  110. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  111. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  112. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  113. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  114. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  115. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  116. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  117. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  118. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  119. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  120. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  121. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  122. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  123. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  124. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  125. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  126. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  127. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  128. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  129. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  130. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  131. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  132. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  133. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  134. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  135. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  136. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  137. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  138. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  139. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  140. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  141. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  142. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  143. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  144. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  145. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  146. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/config_store.py +0 -0
  147. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/constants.py +0 -0
  148. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/context.py +0 -0
  149. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  150. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/direct.py +0 -0
  151. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/earnings_view.py +0 -0
  152. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/exec_events.py +0 -0
  153. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  154. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  155. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  156. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/google_login.py +0 -0
  157. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  158. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  159. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  160. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  161. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  162. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  163. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  164. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/headless.py +0 -0
  165. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/helpers.py +0 -0
  166. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/hooks.py +0 -0
  167. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/i18n.py +0 -0
  168. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/intent.py +0 -0
  169. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  170. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  171. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  172. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  173. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/main.py +0 -0
  174. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  175. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  176. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  177. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  178. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/mixin_binding.py +0 -0
  179. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  180. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  181. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  182. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  183. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  184. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/preflight.py +0 -0
  185. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  186. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  187. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  188. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  189. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  190. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  191. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  192. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  193. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  194. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  195. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  196. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  197. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  198. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  199. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  200. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  201. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  202. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  203. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  204. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  205. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  206. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  207. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/session_export.py +0 -0
  208. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  209. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/session_store.py +0 -0
  210. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  211. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  212. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  213. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  214. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  215. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  216. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  217. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  218. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  219. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  220. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  221. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  222. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  223. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  224. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/update_check.py +0 -0
  225. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/updater.py +0 -0
  226. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  227. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  228. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/cli/workspace_route.py +0 -0
  229. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/daemon/README.md +0 -0
  230. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/vscode/README.md +0 -0
  231. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/apps/vscode/package.json +0 -0
  232. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_daemon.py +0 -0
  233. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_feishu_bot.py +0 -0
  234. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_mcp_server.py +0 -0
  235. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_relay_client.py +0 -0
  236. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_relay_server.py +0 -0
  237. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/aria_telegram_bot.py +0 -0
  238. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ariarc.py +0 -0
  239. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/artifacts.py +0 -0
  240. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/backtest_engine.py +0 -0
  241. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/backtest_report.py +0 -0
  242. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/__init__.py +0 -0
  243. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/automation.py +0 -0
  244. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/base.py +0 -0
  245. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/capabilities.py +0 -0
  246. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  247. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  248. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  249. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  250. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  251. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  252. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/config.py +0 -0
  253. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  254. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  255. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  256. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  257. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  258. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/paper_broker.py +0 -0
  259. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/planning.py +0 -0
  260. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/registry.py +0 -0
  261. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/brokers/trading.py +0 -0
  262. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/canva_client.py +0 -0
  263. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/change_store.py +0 -0
  264. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/__init__.py +0 -0
  265. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  266. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  267. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/canva_client.py +0 -0
  268. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/figma_client.py +0 -0
  269. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/football_data_client.py +0 -0
  270. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/kling_video_client.py +0 -0
  271. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/market_data_client.py +0 -0
  272. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/openai_image_client.py +0 -0
  273. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/runway_video_client.py +0 -0
  274. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  275. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/cloud_memory.py +0 -0
  276. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/command_safety.py +0 -0
  277. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/computer_use_tools.py +0 -0
  278. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/dashboard_generator.py +0 -0
  279. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/data_analysis_tools.py +0 -0
  280. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/data_cleaner.py +0 -0
  281. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/data_service.py +0 -0
  282. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/__init__.py +0 -0
  283. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/base.py +0 -0
  284. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/router.py +0 -0
  285. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  286. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  287. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  288. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  289. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  290. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  291. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  292. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  293. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  294. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  295. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/demo_player.py +0 -0
  296. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/doctor.py +0 -0
  297. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/domain/__init__.py +0 -0
  298. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/domain/backtest_engine.py +0 -0
  299. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/domain/backtest_report.py +0 -0
  300. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/domain/finance_formulas.py +0 -0
  301. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  302. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/domain/strategy_vault.py +0 -0
  303. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/evals/__init__.py +0 -0
  304. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/evals/runner.py +0 -0
  305. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/external_agent_runner.py +0 -0
  306. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/figma_client.py +0 -0
  307. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/file_analysis_tools.py +0 -0
  308. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/finance_formulas.py +0 -0
  309. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/football_data_client.py +0 -0
  310. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/image_gen_tools.py +0 -0
  311. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/intent_classifier.py +0 -0
  312. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/kling_video_client.py +0 -0
  313. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/licensing.py +0 -0
  314. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/local_finance_tools.py +0 -0
  315. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/local_image_provider.py +0 -0
  316. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/local_llm_provider.py +0 -0
  317. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/macro_tools.py +0 -0
  318. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/markdown_pdf.py +0 -0
  319. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/market_data_client.py +0 -0
  320. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/mcp_client.py +0 -0
  321. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/memory_manager.py +0 -0
  322. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/model_capability.py +0 -0
  323. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/notification_tools.py +0 -0
  324. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/openai_image_client.py +0 -0
  325. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/__init__.py +0 -0
  326. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  327. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  328. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  329. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  330. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  331. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  332. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  333. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_core/export.py +0 -0
  334. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  335. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  336. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  337. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  338. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  339. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  340. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  341. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  342. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  343. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  344. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  345. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  346. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  347. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  348. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  349. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  350. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  351. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  352. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  353. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  354. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  355. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/context.py +0 -0
  356. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  357. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/data.py +0 -0
  358. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  359. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/references.py +0 -0
  360. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  361. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  362. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  363. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  364. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  365. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  366. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  367. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  368. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  369. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  370. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  371. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  372. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  373. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  374. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  375. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  376. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  377. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  378. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  379. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  380. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  381. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  382. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  383. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  384. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  385. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  386. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  387. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  388. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  389. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  390. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  391. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  392. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  393. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  394. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  395. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  396. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  397. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  398. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  399. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  400. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/__init__.py +0 -0
  401. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/base.py +0 -0
  402. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/finance/__init__.py +0 -0
  403. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  404. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/payments/__init__.py +0 -0
  405. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/realty/__init__.py +0 -0
  406. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/registry.py +0 -0
  407. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/packs/rules.py +0 -0
  408. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/plan_utils.py +0 -0
  409. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/plugin_loader.py +0 -0
  410. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/portfolio_ledger.py +0 -0
  411. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/preview_server.py +0 -0
  412. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/privacy/__init__.py +0 -0
  413. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/privacy/feedback.py +0 -0
  414. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/project_review.py +0 -0
  415. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/project_review_api.py +0 -0
  416. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/project_review_server.py +0 -0
  417. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/project_tools.py +0 -0
  418. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/__init__.py +0 -0
  419. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/__init__.py +0 -0
  420. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  421. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  422. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/base.py +0 -0
  423. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/custom.py +0 -0
  424. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/ollama.py +0 -0
  425. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  426. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/llm/registry.py +0 -0
  427. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/local_image_provider.py +0 -0
  428. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  429. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/providers/tool_messages.py +0 -0
  430. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/realty_data_tools.py +0 -0
  431. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/relay_store.py +0 -0
  432. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/report_exporters.py +0 -0
  433. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/report_generator.py +0 -0
  434. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/review_service.py +0 -0
  435. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/__init__.py +0 -0
  436. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/acceptance.py +0 -0
  437. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/agent_loop.py +0 -0
  438. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/approval.py +0 -0
  439. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/budget.py +0 -0
  440. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/checkpoints.py +0 -0
  441. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/crash_report.py +0 -0
  442. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/events.py +0 -0
  443. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/gateway.py +0 -0
  444. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/lsp.py +0 -0
  445. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/orchestrator.py +0 -0
  446. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/processes.py +0 -0
  447. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/repo_map.py +0 -0
  448. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/run_state.py +0 -0
  449. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/run_store.py +0 -0
  450. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/self_healing.py +0 -0
  451. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/subagent.py +0 -0
  452. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/task_ledger.py +0 -0
  453. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  454. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/tool_executor.py +0 -0
  455. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/tool_policy.py +0 -0
  456. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runtime/worktrees.py +0 -0
  457. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/runway_video_client.py +0 -0
  458. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/safety/__init__.py +0 -0
  459. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/safety/permissions.py +0 -0
  460. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/safety/sandbox.py +0 -0
  461. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/safety/service.py +0 -0
  462. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/setup_wizard.py +0 -0
  463. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/spreadsheet_tools.py +0 -0
  464. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/strategy_vault.py +0 -0
  465. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/__init__.py +0 -0
  466. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/artifact_tools.py +0 -0
  467. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/broker_tools.py +0 -0
  468. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  469. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  470. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  471. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  472. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  473. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/extended_tools.py +0 -0
  474. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  475. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  476. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  477. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  478. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  479. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  480. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/logistics_tools.py +0 -0
  481. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/notification_tools.py +0 -0
  482. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/project_tools.py +0 -0
  483. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  484. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  485. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/tools/stripe_tools.py +0 -0
  486. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/__init__.py +0 -0
  487. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/banner.py +0 -0
  488. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/completer.py +0 -0
  489. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/console.py +0 -0
  490. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/image_render.py +0 -0
  491. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/input_box.py +0 -0
  492. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/mentions.py +0 -0
  493. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/picker.py +0 -0
  494. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/render/__init__.py +0 -0
  495. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/render/market.py +0 -0
  496. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/render/output.py +0 -0
  497. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/render/responsive.py +0 -0
  498. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/render/team.py +0 -0
  499. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/robot.py +0 -0
  500. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  501. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/utils/vscode_uri.py +0 -0
  502. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/video_analysis.py +0 -0
  503. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/video_editor.py +0 -0
  504. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace/__init__.py +0 -0
  505. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace/files.py +0 -0
  506. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace/verify.py +0 -0
  507. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace_changes.py +0 -0
  508. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace_context.py +0 -0
  509. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace_service.py +0 -0
  510. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code/workspace_tools.py +0 -0
  511. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  512. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  513. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code.egg-info/requires.txt +0 -0
  514. {aria_code-0.99.0 → aria_code-0.101.0}/src/aria_code.egg-info/top_level.txt +0 -0
  515. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_adk_market_tools.py +0 -0
  516. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_agent_key_points_language.py +0 -0
  517. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_agent_team_fallback.py +0 -0
  518. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_analyze_file_tool.py +0 -0
  519. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_architecture_ledger_is_true.py +0 -0
  520. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_architecture_report.py +0 -0
  521. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_aria_cli_core.py +0 -0
  522. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_aria_mcp_server.py +0 -0
  523. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_aria_sdk.py +0 -0
  524. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_artifact_publishing.py +0 -0
  525. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_artifacts_and_reports.py +0 -0
  526. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ashare_prediction_cmds.py +0 -0
  527. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_background_processes.py +0 -0
  528. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_backtest_cmds.py +0 -0
  529. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_backtest_engine.py +0 -0
  530. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_backtest_report.py +0 -0
  531. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_backtest_runs_what_it_names.py +0 -0
  532. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  533. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_broken_akshare_is_optional.py +0 -0
  534. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_broker_automation.py +0 -0
  535. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  536. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_broker_planning.py +0 -0
  537. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_broker_safety.py +0 -0
  538. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_broker_tools.py +0 -0
  539. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_budget.py +0 -0
  540. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_business_workflow_cmds.py +0 -0
  541. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_canva_client.py +0 -0
  542. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_canvas_cmds.py +0 -0
  543. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_card_approvals.py +0 -0
  544. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_channel_intake.py +0 -0
  545. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_channels.py +0 -0
  546. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_chart_handlers.py +0 -0
  547. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_chat_bots_fail_closed.py +0 -0
  548. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_chat_routing.py +0 -0
  549. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ci_security_workflow.py +0 -0
  550. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_app_split.py +0 -0
  551. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_bootstrap.py +0 -0
  552. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_config_store.py +0 -0
  553. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  554. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_runtime_consumer.py +0 -0
  555. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_tool_executor_module.py +0 -0
  556. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cli_updater.py +0 -0
  557. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_cloud_memory.py +0 -0
  558. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_code_audit_tools.py +0 -0
  559. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_code_review_agent.py +0 -0
  560. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_codegen_output.py +0 -0
  561. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_coder_tester_self_healing.py +0 -0
  562. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_coder_tool_safety.py +0 -0
  563. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_collaboration.py +0 -0
  564. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_command_loggers.py +0 -0
  565. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_command_safety.py +0 -0
  566. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_compare_strategies.py +0 -0
  567. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_completions_builder.py +0 -0
  568. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_config_paths.py +0 -0
  569. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_configured_provider.py +0 -0
  570. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_container_entrypoint.py +0 -0
  571. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_container_entrypoints.py +0 -0
  572. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_context_checkpoints.py +0 -0
  573. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_context_references.py +0 -0
  574. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_context_service.py +0 -0
  575. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_conversation_core.py +0 -0
  576. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_crash_report.py +0 -0
  577. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_credential_file_permissions.py +0 -0
  578. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_custom_providers.py +0 -0
  579. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_daemon_gateway_config.py +0 -0
  580. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_dashboard_generator.py +0 -0
  581. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_data_service.py +0 -0
  582. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_data_service_imports.py +0 -0
  583. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_data_without_model.py +0 -0
  584. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_datasource_routing.py +0 -0
  585. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_deep_analysis.py +0 -0
  586. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_degrades_without_quant_engine.py +0 -0
  587. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  588. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_doctor.py +0 -0
  589. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  590. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_doctor_npm_scope.py +0 -0
  591. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_edit_and_command_safety.py +0 -0
  592. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_engine_boundary.py +0 -0
  593. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_enterprise_tool_honesty.py +0 -0
  594. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_env_switch_docs.py +0 -0
  595. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_event_import_roots.py +0 -0
  596. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_exec_events.py +0 -0
  597. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_extended_tools.py +0 -0
  598. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_feishu_swarm_config.py +0 -0
  599. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_file_links.py +0 -0
  600. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_finalize_release.py +0 -0
  601. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_finance_renderers.py +0 -0
  602. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_finance_service_catalog.py +0 -0
  603. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_first_run_output.py +0 -0
  604. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_first_run_works.py +0 -0
  605. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_football_agent.py +0 -0
  606. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_football_prediction_output.py +0 -0
  607. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_google_cloud_models.py +0 -0
  608. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_google_cloud_routing.py +0 -0
  609. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_google_login.py +0 -0
  610. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_google_search_provider.py +0 -0
  611. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_headless_is_agentic.py +0 -0
  612. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_honest_surfaces.py +0 -0
  613. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_image_gen_tools.py +0 -0
  614. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_image_inputs.py +0 -0
  615. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_import_graph_budget.py +0 -0
  616. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_intent_router.py +0 -0
  617. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_intent_signals.py +0 -0
  618. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_kling_video_client.py +0 -0
  619. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_lazy_rebind.py +0 -0
  620. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_legacy_module_imports.py +0 -0
  621. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_license_consistency.py +0 -0
  622. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_licensing.py +0 -0
  623. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_local_image_provider.py +0 -0
  624. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_logistics_3pl.py +0 -0
  625. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_logistics_and_finance_agents.py +0 -0
  626. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_lsp.py +0 -0
  627. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_markdown_pdf.py +0 -0
  628. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_answers_in_english.py +0 -0
  629. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_data_client.py +0 -0
  630. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_history_inheritance.py +0 -0
  631. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_history_tool.py +0 -0
  632. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_hours.py +0 -0
  633. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_questions_on_backend.py +0 -0
  634. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_symbol_extraction.py +0 -0
  635. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_market_universe.py +0 -0
  636. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_mcp_circuit.py +0 -0
  637. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_mcp_client.py +0 -0
  638. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_mentions.py +0 -0
  639. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_model_capability_registry.py +0 -0
  640. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_model_choice_is_the_users.py +0 -0
  641. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_model_selection_state.py +0 -0
  642. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_narrow_chinese_output.py +0 -0
  643. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_native_binary_entrypoints.py +0 -0
  644. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_native_installer.py +0 -0
  645. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_natural_language_routing.py +0 -0
  646. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_new_modules.py +0 -0
  647. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  648. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_no_tools_route.py +0 -0
  649. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_no_uncommitted_imports.py +0 -0
  650. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_numeric_listings.py +0 -0
  651. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ollama_stream_imports.py +0 -0
  652. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ollama_stream_tools.py +0 -0
  653. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_openai_image_client.py +0 -0
  654. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_operations_suite.py +0 -0
  655. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_os_sandbox.py +0 -0
  656. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_packages_facade.py +0 -0
  657. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_packaging_constraints.py +0 -0
  658. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_packaging_manifest.py +0 -0
  659. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_packs_domains.py +0 -0
  660. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_pdf_report.py +0 -0
  661. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_pick_best_installed_model.py +0 -0
  662. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_plan_mode.py +0 -0
  663. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_platform_package_assembly.py +0 -0
  664. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_platform_packages.py +0 -0
  665. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_platform_publish.py +0 -0
  666. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_plotly_html_output.py +0 -0
  667. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_portfolio_language.py +0 -0
  668. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_portfolio_ledger.py +0 -0
  669. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_post_turn_context_decision.py +0 -0
  670. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_preflight.py +0 -0
  671. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_preview_server.py +0 -0
  672. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_privacy_feedback.py +0 -0
  673. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_project_aria.py +0 -0
  674. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_project_context_files.py +0 -0
  675. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_project_review.py +0 -0
  676. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_project_review_api.py +0 -0
  677. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_prompt_assembly.py +0 -0
  678. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_prompt_selection.py +0 -0
  679. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_provider_autoconfig.py +0 -0
  680. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_provider_error_messages.py +0 -0
  681. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_provider_integration.py +0 -0
  682. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_provider_registry.py +0 -0
  683. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_public_service_status.py +0 -0
  684. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_quant_engine_namespace.py +0 -0
  685. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_rebind_contract.py +0 -0
  686. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_rebind_namespace_contract.py +0 -0
  687. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_relay_client_credentials.py +0 -0
  688. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_relay_event_verification.py +0 -0
  689. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_relay_sends_for_clients.py +0 -0
  690. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_relay_store.py +0 -0
  691. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_relay_url.py +0 -0
  692. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_release_chain.py +0 -0
  693. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_release_commit_identity.py +0 -0
  694. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_release_push_is_atomic.py +0 -0
  695. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_release_reaches_the_registries.py +0 -0
  696. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_release_verification_waits.py +0 -0
  697. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_release_workflow_permissions.py +0 -0
  698. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_report_charts.py +0 -0
  699. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_report_generator.py +0 -0
  700. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_research_protocol.py +0 -0
  701. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_research_quality.py +0 -0
  702. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_responsive_rendering.py +0 -0
  703. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_review_service.py +0 -0
  704. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_risk_earnings_ops.py +0 -0
  705. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_root_module_budget.py +0 -0
  706. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  707. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_acceptance.py +0 -0
  708. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_agent_loop.py +0 -0
  709. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_approval.py +0 -0
  710. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_bridge.py +0 -0
  711. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_bridge_fallback.py +0 -0
  712. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_checkpoints.py +0 -0
  713. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_event_identity.py +0 -0
  714. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_gateway.py +0 -0
  715. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_repo_map.py +0 -0
  716. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_run_store.py +0 -0
  717. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_tool_executor.py +0 -0
  718. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runtime_worktrees.py +0 -0
  719. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_runway_video_client.py +0 -0
  720. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_safety_permissions.py +0 -0
  721. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_safety_service.py +0 -0
  722. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_safety_service_adoption.py +0 -0
  723. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_service_diagnostics_security.py +0 -0
  724. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_session_search.py +0 -0
  725. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_settings_service.py +0 -0
  726. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_shell_commands_as_written.py +0 -0
  727. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_shipper_digest.py +0 -0
  728. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_single_import_root.py +0 -0
  729. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_skill_agent_binding.py +0 -0
  730. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_skill_catalog.py +0 -0
  731. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_skill_loader.py +0 -0
  732. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_slash_popup.py +0 -0
  733. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_spreadsheet_tools.py +0 -0
  734. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_sse_stream_contract.py +0 -0
  735. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_startup_dashboard.py +0 -0
  736. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_startup_latency.py +0 -0
  737. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_status_language.py +0 -0
  738. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_streaming_pipeline.py +0 -0
  739. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_stripe_agent.py +0 -0
  740. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_subagent.py +0 -0
  741. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_supervisor_routing.py +0 -0
  742. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_system_prompts.py +0 -0
  743. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_system_tools_output.py +0 -0
  744. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_task_orchestrator.py +0 -0
  745. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_team_analysts.py +0 -0
  746. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_team_synthesis.py +0 -0
  747. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_terminal_mixins.py +0 -0
  748. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_terminal_snapshots.py +0 -0
  749. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_tls_trust_store.py +0 -0
  750. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_tool_policy.py +0 -0
  751. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  752. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_tool_scope.py +0 -0
  753. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_tool_step_output.py +0 -0
  754. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_trading_service.py +0 -0
  755. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_tradingview_bridge.py +0 -0
  756. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_turn_planning.py +0 -0
  757. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ui_completer_references.py +0 -0
  758. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ui_console_theme.py +0 -0
  759. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ui_input_box.py +0 -0
  760. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ui_language_and_model.py +0 -0
  761. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_ui_robot_banner.py +0 -0
  762. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_update_health_routes.py +0 -0
  763. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_verification_hint.py +0 -0
  764. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_verification_policy.py +0 -0
  765. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_version_consistency.py +0 -0
  766. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_version_counter.py +0 -0
  767. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_video_analysis.py +0 -0
  768. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_video_editor.py +0 -0
  769. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_vscode_mcp.py +0 -0
  770. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_warehouse_agents.py +0 -0
  771. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_warehouse_cli_registration.py +0 -0
  772. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_warehouse_erp_client.py +0 -0
  773. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_warehouse_workflow.py +0 -0
  774. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_wheel_is_installable.py +0 -0
  775. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_workspace_changes.py +0 -0
  776. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_workspace_context.py +0 -0
  777. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_workspace_files.py +0 -0
  778. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_workspace_scope.py +0 -0
  779. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_workspace_service.py +0 -0
  780. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_workspace_verify.py +0 -0
  781. {aria_code-0.99.0 → aria_code-0.101.0}/tests/test_wrapped_indent.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.99.0
3
+ Version: 0.101.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.99.0"
7
+ version = "0.101.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.99.0"
20
+ __version__ = "0.101.0"
@@ -14,7 +14,7 @@ class ChatTurnMixin:
14
14
  """send_message for ArtheraTerminal."""
15
15
 
16
16
  async def send_message(self, message: str, system_override: Optional[str] = None,
17
- evidence_grounded: bool = False):
17
+ evidence_grounded: bool = False, route_text: bool = False):
18
18
  """Send message to Aria AI with agentic tool loop, smart fallback, markdown."""
19
19
  if getattr(self, "_streaming", False):
20
20
  is_zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
@@ -103,8 +103,12 @@ class ChatTurnMixin:
103
103
  }
104
104
  _show_market_choices(mention, candidates)
105
105
  return
106
+ # Only what the person typed is routed to a command. A prompt a command
107
+ # built and sent here was routed too: /report's "为 MSFT 生成一份专业
108
+ # Markdown 投研报告" matched the report route and ran /report again.
106
109
  if (
107
- not system_override
110
+ route_text
111
+ and not system_override
108
112
  and self._pending_image is None
109
113
  and not (self._file_session is not None and self._file_session.get_active() is not None)
110
114
  and self._project_session is None
@@ -165,6 +165,7 @@ class AnalysisCommandsMixin:
165
165
  return
166
166
 
167
167
  loop = _asyncio.get_event_loop()
168
+ _lang = "zh" if str(self.terminal.config.get("ui_lang", "en")).lower().startswith("zh") else "en"
168
169
 
169
170
  if region in ("us", "all"):
170
171
  if self.context.has_rich:
@@ -172,7 +173,8 @@ class AnalysisCommandsMixin:
172
173
  r = await loop.run_in_executor(None, lambda: get_us_macro(indicator if region == "us" else "all"))
173
174
  else:
174
175
  r = get_us_macro(indicator if region == "us" else "all")
175
- _render_macro_result(r, "🇺🇸 美国宏观")
176
+ # No flag emoji: they measure one cell short and broke the rule line.
177
+ _render_macro_result(r, ui_text(self, "美国宏观", "US macro"), lang=_lang)
176
178
 
177
179
  if region in ("cn", "all"):
178
180
  if self.context.has_rich:
@@ -180,7 +182,7 @@ class AnalysisCommandsMixin:
180
182
  r_cn = await loop.run_in_executor(None, lambda: get_cn_macro(indicator if region == "cn" else "all"))
181
183
  else:
182
184
  r_cn = get_cn_macro(indicator if region == "cn" else "all")
183
- _render_macro_result(r_cn, "🇨🇳 中国宏观")
185
+ _render_macro_result(r_cn, ui_text(self, "中国宏观", "China macro"), lang=_lang)
184
186
 
185
187
  if region in ("rates", "all"):
186
188
  if self.context.has_rich:
@@ -188,7 +190,7 @@ class AnalysisCommandsMixin:
188
190
  r_rates = await loop.run_in_executor(None, get_central_bank_rates)
189
191
  else:
190
192
  r_rates = get_central_bank_rates()
191
- _render_cb_rates(r_rates)
193
+ _render_cb_rates(r_rates, lang=_lang)
192
194
 
193
195
  if region == "calendar":
194
196
  if self.context.has_rich:
@@ -1056,7 +1056,7 @@ class MarketCommandsMixin:
1056
1056
  info = tickers.tickers[sym].fast_info
1057
1057
  price = getattr(info, "last_price", None) or 0
1058
1058
  mktcap = getattr(info, "market_cap", None) or 0
1059
- pe = getattr(info, "pe_ratio", None)
1059
+ pe = None # filled below: fast_info has no P/E
1060
1060
  yr_return = getattr(info, "year_change", None)
1061
1061
  rows.append({
1062
1062
  "symbol": sym, "price": price,
@@ -1065,17 +1065,31 @@ class MarketCommandsMixin:
1065
1065
  })
1066
1066
  except Exception:
1067
1067
  pass
1068
+ # fast_info has no pe_ratio, so P/E was blank for every row and
1069
+ # the "value" screen (P/E 5-20) never matched anything. info has
1070
+ # trailingPE; fetched in parallel, one request per symbol.
1071
+ from concurrent.futures import ThreadPoolExecutor
1072
+
1073
+ def _pe(row):
1074
+ try:
1075
+ value = tickers.tickers[row["symbol"]].info.get("trailingPE")
1076
+ row["pe"] = float(value) if value else None
1077
+ except Exception:
1078
+ row["pe"] = None
1079
+ with ThreadPoolExecutor(max_workers=10) as pool:
1080
+ list(pool.map(_pe, rows))
1068
1081
  return rows
1069
1082
  except Exception as _e:
1070
1083
  logger.debug("screen US fetch error: %s", _e)
1071
1084
  return []
1072
1085
 
1073
1086
  if self.context.has_rich:
1074
- _status_msg = f"[dim]筛选 {len(_US_POOL)} 只美股 ({criteria or 'top market cap'})…[/dim]"
1087
+ _status_msg = "[dim]" + ui_text(self, f"筛选 {len(_US_POOL)} 只美股 ({criteria or '按市值'})…",
1088
+ f"Screening {len(_US_POOL)} US stocks ({criteria or 'by market cap'})…") + "[/dim]"
1075
1089
  with self.context.console.status(_status_msg, spinner="dots"):
1076
1090
  rows = await _loop.run_in_executor(None, _fetch_pool)
1077
1091
  else:
1078
- print(" 筛选美股中…")
1092
+ print(" " + ui_text(self, "筛选美股中…", "Screening US stocks…"))
1079
1093
  rows = await _loop.run_in_executor(None, _fetch_pool)
1080
1094
 
1081
1095
  if not rows:
@@ -1098,19 +1112,21 @@ class MarketCommandsMixin:
1098
1112
  rows = rows[:15]
1099
1113
 
1100
1114
  if not rows:
1101
- msg = f"[yellow]当前条件 '{criteria}' 无匹配标的(池: {len(_US_POOL)} 只)[/yellow]"
1115
+ msg = "[yellow]" + ui_text(self, f"当前条件 '{criteria}' 无匹配标的(池: {len(_US_POOL)} 只)",
1116
+ f"Nothing matches '{criteria}' (pool: {len(_US_POOL)} stocks)") + "[/yellow]"
1102
1117
  self.context.console.print(msg) if self.context.has_rich else print(msg.replace("[yellow]","").replace("[/yellow]",""))
1103
1118
  return
1104
1119
 
1105
1120
  if self.context.has_rich:
1106
1121
  from rich.table import Table as _Tbl
1107
- t = _Tbl(title=f"美股筛选 {criteria or 'large-cap'} 共 {len(rows)} 只",
1122
+ t = _Tbl(title=ui_text(self, f"美股筛选 {criteria or 'large-cap'} 共 {len(rows)} 只",
1123
+ f"US screen {criteria or 'large-cap'} {len(rows)} stocks"),
1108
1124
  show_header=True, box=None, padding=(0, 1))
1109
- t.add_column("代码", style="bold", width=8)
1110
- t.add_column("价格", justify="right")
1111
- t.add_column("市值(B$)", justify="right", style="dim")
1112
- t.add_column("PE", justify="right", style="dim")
1113
- t.add_column("年涨跌%", justify="right")
1125
+ t.add_column(ui_text(self, "代码", "Symbol"), style="bold", width=8)
1126
+ t.add_column(ui_text(self, "价格", "Price"), justify="right")
1127
+ t.add_column(ui_text(self, "市值(B$)", "Mkt cap ($B)"), justify="right", style="dim")
1128
+ t.add_column(ui_text(self, "市盈率", "P/E (ttm)"), justify="right", style="dim")
1129
+ t.add_column(ui_text(self, "年涨跌%", "1y %"), justify="right")
1114
1130
  for r in rows:
1115
1131
  yr = r.get("yr_return")
1116
1132
  yr_s = f"{yr*100:+.1f}%" if yr is not None else "—"
@@ -1124,7 +1140,9 @@ class MarketCommandsMixin:
1124
1140
  f"[{yr_color}]{yr_s}[/{yr_color}]",
1125
1141
  )
1126
1142
  self.context.console.print(t)
1127
- self.context.console.print(f" [dim]来源: yfinance · 池: {len(_US_POOL)} 只大市值美股[/dim]")
1143
+ self.context.console.print(" [dim]" + ui_text(self, f"来源: yfinance · 池: {len(_US_POOL)} 只大市值美股",
1144
+ f"Source: yfinance · pool: {len(_US_POOL)} large-cap US stocks")
1145
+ + "[/dim]")
1128
1146
  else:
1129
1147
  print(f" 美股筛选 {criteria}")
1130
1148
  for r in rows:
@@ -387,7 +387,8 @@ class PortfolioCommandsMixin:
387
387
 
388
388
  # ── Markdown report mode (works fully offline) ────────────────────────
389
389
  if fmt in ("md", "markdown"):
390
- self.context.console.print(f"\n 📄 生成 [bold]{symbol}[/bold] Markdown 投研报告 ({report_type})...") if self.context.has_rich else print(f"\n Generating {symbol} Markdown report...")
390
+ _gen = ui_text(self, f"生成 {symbol} Markdown 投研报告 ({report_type})", f"Writing the {symbol} Markdown report ({report_type})")
391
+ self.context.console.print(f"\n [dim]{_gen}…[/dim]") if self.context.has_rich else print(f"\n {_gen}…")
391
392
 
392
393
  # Fetch real data through the service boundary so provenance and
393
394
  # quality metadata travel with the report prompt and artifact.
@@ -430,6 +431,7 @@ class PortfolioCommandsMixin:
430
431
  data_quality=data_quality,
431
432
  data_bundle=data_bundle,
432
433
  now=_dt.now(),
434
+ lang=ui_text(self, "zh", "en"),
433
435
  )
434
436
 
435
437
  await self.terminal.send_message(ai_prompt)
@@ -452,11 +454,15 @@ class PortfolioCommandsMixin:
452
454
  created_at=_dt.now(),
453
455
  )
454
456
  out_f = saved.path
457
+ # A short, clickable path: the full temp-dir path wrapped over
458
+ # three lines, and the "预览: open …" line repeated it.
459
+ from aria_code.ui.render.output import display_path as _short_path
460
+ _saved = ui_text(self, "报告已保存", "Report saved")
455
461
  if self.context.has_rich:
456
- self.context.console.print(f"\n [green]✅ 报告已保存: {out_f}[/green]")
457
- self.context.console.print(f" [dim]预览: open {out_f}[/dim]\n")
462
+ self.context.console.print(f"\n [green]✓[/green] {_saved}: "
463
+ f"[link={_file_uri(str(out_f))}]{_short_path(str(out_f))}[/link]\n")
458
464
  else:
459
- print(f"\n Saved: {out_f}")
465
+ print(f"\n {_saved}: {out_f}")
460
466
 
461
467
  # ── Markdown 报告 → 排版 PDF(--pdf;中英文模板自动检测)──
462
468
  if export_pdf_flag:
@@ -273,24 +273,29 @@ def metric_line(label: str, value: Any, digits: int = 2, suffix: str = "") -> st
273
273
  return f"- {label}: {rendered}" if rendered != "-" else ""
274
274
 
275
275
 
276
- def markdown_data_block(market_data: dict[str, Any]) -> str:
276
+ def markdown_data_block(market_data: dict[str, Any], lang: str = "zh") -> str:
277
+ en = lang == "en"
277
278
  data_lines = [
278
- metric_line("当前价", market_data.get("price")),
279
- metric_line("涨跌", market_data.get("change_pct"), suffix="%"),
279
+ metric_line("Price" if en else "当前价", market_data.get("price")),
280
+ metric_line("Change" if en else "涨跌", market_data.get("change_pct"), suffix="%"),
280
281
  metric_line("RSI(14)", market_data.get("rsi")),
281
282
  metric_line("MACD", market_data.get("macd"), digits=4),
282
283
  metric_line("MA20", market_data.get("ma20")),
283
284
  metric_line("MA60", market_data.get("ma60")),
284
- metric_line("布林上轨", market_data.get("bb_upper")),
285
- metric_line("布林下轨", market_data.get("bb_lower")),
285
+ metric_line("Bollinger upper" if en else "布林上轨", market_data.get("bb_upper")),
286
+ metric_line("Bollinger lower" if en else "布林下轨", market_data.get("bb_lower")),
286
287
  ]
287
288
  data_block = "\n".join(line for line in data_lines if line)
288
289
  if data_block:
289
290
  return data_block
291
+ if en:
292
+ return ("- Live market data is unavailable; the report must state this limitation and must not "
293
+ "invent prices or indicators.")
290
294
  return "- 实时行情数据暂不可用;报告必须明确说明数据限制,不得编造价格或指标。"
291
295
 
292
296
 
293
- def markdown_provenance_block(data_quality: dict[str, Any], data_bundle: Any = None) -> str:
297
+ def markdown_provenance_block(data_quality: dict[str, Any], data_bundle: Any = None, lang: str = "zh") -> str:
298
+ en = lang == "en"
294
299
  provider_chain = (
295
300
  data_quality.get("providers")
296
301
  or getattr(data_bundle, "provider_chain", [])
@@ -301,16 +306,26 @@ def markdown_provenance_block(data_quality: dict[str, Any], data_bundle: Any = N
301
306
  or data_quality.get("missing_fields")
302
307
  or []
303
308
  )
309
+ status = data_quality.get('status', getattr(data_bundle, 'status', 'unknown') if data_bundle else 'unknown')
310
+ labels = (("Data status", "Stale", "Provider chain", "Missing fields") if en
311
+ else ("数据状态", "是否过期", "数据源链", "缺失字段"))
304
312
  lines = [
305
- f"- 数据状态: {data_quality.get('status', getattr(data_bundle, 'status', 'unknown') if data_bundle else 'unknown')}",
306
- f"- 是否过期: {'yes' if data_quality.get('stale') else 'no'}",
307
- f"- 数据源链: {', '.join(provider_chain) if provider_chain else 'unknown'}",
308
- f"- 缺失字段: {', '.join(missing_fields) if missing_fields else 'none'}",
313
+ f"- {labels[0]}: {status}",
314
+ f"- {labels[1]}: {'yes' if data_quality.get('stale') else 'no'}",
315
+ f"- {labels[2]}: {', '.join(provider_chain) if provider_chain else 'unknown'}",
316
+ f"- {labels[3]}: {', '.join(missing_fields) if missing_fields else 'none'}",
309
317
  ]
310
318
  return "\n".join(lines)
311
319
 
312
320
 
313
- def report_depth_description(report_type: str) -> str:
321
+ def report_depth_description(report_type: str, lang: str = "zh") -> str:
322
+ if lang == "en":
323
+ if report_type == "deep":
324
+ return ("deep edition (about 8 pages): valuation (DCF and relative), three years of P&L, "
325
+ "management, and the competitive landscape")
326
+ if report_type == "brief":
327
+ return "brief edition: one page, the core view, key numbers and a one-sentence conclusion"
328
+ return "standard edition: cover, technical analysis, fundamentals overview, risk factors"
314
329
  if report_type == "deep":
315
330
  return "深度(8页)版本:包含估值模型(DCF + 相对估值)、财务分析(3年P&L)、管理层分析、行业竞争格局"
316
331
  if report_type == "brief":
@@ -326,11 +341,35 @@ def build_markdown_report_prompt(
326
341
  data_quality: dict[str, Any],
327
342
  data_bundle: Any = None,
328
343
  now: datetime | None = None,
344
+ lang: str = "zh",
329
345
  ) -> str:
346
+ """The prompt for a Markdown research report, in the session's language.
347
+
348
+ It was Chinese only, ending "用中文输出": an English session got a Chinese
349
+ report, and when the model was unavailable the fallback analysis followed
350
+ the prompt into Chinese too.
351
+ """
330
352
  report_date = (now or datetime.now()).strftime("%Y-%m-%d")
331
- data_block = markdown_data_block(market_data)
332
- provenance_block = markdown_provenance_block(data_quality, data_bundle)
333
- depth = report_depth_description(report_type)
353
+ data_block = markdown_data_block(market_data, lang)
354
+ provenance_block = markdown_provenance_block(data_quality, data_bundle, lang)
355
+ depth = report_depth_description(report_type, lang)
356
+ if lang == "en":
357
+ return (
358
+ f"Write a professional Markdown research report on {symbol} ({depth}).\n\n"
359
+ f"**Live data (use only the fields below; do not fill in missing ones)**:\n"
360
+ f"{data_block}\n\n"
361
+ f"**Data quality (state it plainly in the report)**:\n"
362
+ f"{provenance_block}\n\n"
363
+ f"Report structure (Markdown):\n"
364
+ f"# {symbol} Research Report\n"
365
+ f"**Rating**: Buy/Neutral/Reduce **Target price**: X.XX **Date**: {report_date}\n\n"
366
+ f"## Key points\n"
367
+ f"## Technical analysis\n"
368
+ f"## Fundamentals\n"
369
+ f"## Risk factors\n"
370
+ f"## Recommendation\n\n"
371
+ f"Use the real data, no placeholders; where data is missing, say what is missing. Write in English."
372
+ )
334
373
  return (
335
374
  f"为 {symbol} 生成一份专业 Markdown 投研报告({depth})。\n\n"
336
375
  f"**实时数据(仅使用下列已返回字段;缺失字段不要补写)**:\n"
@@ -4,6 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  import json
6
6
 
7
+ from aria_code.apps.cli.i18n import ui_text
8
+
7
9
 
8
10
  import json
9
11
  import asyncio
@@ -42,7 +44,8 @@ class WarehouseCommandsMixin:
42
44
  as_json = "--json" in parts
43
45
  identifiers = [part for part in parts if not part.startswith("--")]
44
46
  if len(identifiers) != 1:
45
- message = "用法: /warehouse <仓库编号> [--json],例如 /warehouse WH-CN-01"
47
+ message = ui_text(self, "用法: /warehouse <仓库编号> [--json],例如 /warehouse WH-CN-01",
48
+ "Usage: /warehouse <warehouse_id> [--json], e.g. /warehouse WH-CN-01")
46
49
  self.context.console.print(f"[yellow]{message}[/yellow]") if self.context.has_rich else print(message)
47
50
  return
48
51
 
@@ -27,6 +27,36 @@ _MISSING_SDK_MESSAGE = (
27
27
  )
28
28
 
29
29
 
30
+ import logging
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+ _EMPTY_ROUND_RETRIES = 2
35
+
36
+
37
+ def _chunk_text(chunk) -> str:
38
+ """The text parts of a chunk, read without chunk.text.
39
+
40
+ chunk.text logs "there are non-text parts in the response: ['function_call']"
41
+ for every chunk that carries a call, which filled the eval logs.
42
+ """
43
+ out = []
44
+ for candidate in (getattr(chunk, "candidates", None) or [])[:1]:
45
+ content = getattr(candidate, "content", None)
46
+ for part in (getattr(content, "parts", None) or []):
47
+ text = getattr(part, "text", None)
48
+ if text and not getattr(part, "thought", False):
49
+ out.append(text)
50
+ if out:
51
+ return "".join(out)
52
+ if not getattr(chunk, "candidates", None):
53
+ try:
54
+ return chunk.text or ""
55
+ except Exception:
56
+ return ""
57
+ return ""
58
+
59
+
30
60
  class VertexAIProvider(LLMProvider):
31
61
  """Native Vertex AI provider using google-genai."""
32
62
 
@@ -265,41 +295,66 @@ class VertexAIProvider(LLMProvider):
265
295
  )
266
296
 
267
297
  try:
268
- # We must use asyncio.to_thread because the google-genai async client might not be used here
269
- # Or we can just use the sync stream generator wrapped in an async generator.
270
- # google-genai provides AsyncClient as well:
271
- # async_client = genai.Client(vertexai=True).aio
272
- response_stream = await client.aio.models.generate_content_stream(
273
- model=self.model,
274
- contents=contents,
275
- config=config,
276
- )
277
-
298
+ # Gemini sometimes ends a round with no text and no function call:
299
+ # finish_reason MALFORMED_FUNCTION_CALL (it wrote a call it could
300
+ # not emit), or an empty STOP after reading tool results. The round
301
+ # then came back empty, the turn ended as "empty_response", and
302
+ # `aria-code -p` exited 1 a few seconds in: three of nine eval tasks
303
+ # on the first Vertex runs, different ones each time. The same
304
+ # request usually succeeds when sent again, so it is, up to twice,
305
+ # and if it is still empty the finish reason goes into the error.
278
306
  full_response = ""
279
307
  usage = {}
280
308
  tool_calls = []
281
-
282
- async for chunk in response_stream:
283
- if cancel_event and cancel_event.is_set():
284
- yield LLMDone(response=full_response, provider="vertexai", success=True, cancelled=True)
285
- return
286
-
287
- if chunk.text:
288
- full_response += chunk.text
289
- yield LLMToken(text=chunk.text)
290
-
291
- if chunk.function_calls:
292
- for fc in chunk.function_calls:
293
- args = {k: v for k, v in fc.args.items()} if fc.args else {}
294
- yield LLMToolCall(tool=fc.name, params=args)
295
- tool_calls.append({"tool": fc.name, "params": args})
296
-
297
- if chunk.usage_metadata:
298
- usage = {
299
- "prompt_tokens": chunk.usage_metadata.prompt_token_count,
300
- "completion_tokens": chunk.usage_metadata.candidates_token_count,
301
- }
302
-
309
+ finish_reasons: list = []
310
+ for attempt in range(1 + _EMPTY_ROUND_RETRIES):
311
+ response_stream = await client.aio.models.generate_content_stream(
312
+ model=self.model,
313
+ contents=contents,
314
+ config=config,
315
+ )
316
+ async for chunk in response_stream:
317
+ if cancel_event and cancel_event.is_set():
318
+ yield LLMDone(response=full_response, provider="vertexai", success=True, cancelled=True)
319
+ return
320
+
321
+ text = _chunk_text(chunk)
322
+ if text:
323
+ full_response += text
324
+ yield LLMToken(text=text)
325
+
326
+ if chunk.function_calls:
327
+ for fc in chunk.function_calls:
328
+ args = {k: v for k, v in fc.args.items()} if fc.args else {}
329
+ yield LLMToolCall(tool=fc.name, params=args)
330
+ tool_calls.append({"tool": fc.name, "params": args})
331
+
332
+ for candidate in (getattr(chunk, "candidates", None) or []):
333
+ reason = getattr(candidate, "finish_reason", None)
334
+ if reason:
335
+ finish_reasons.append(str(getattr(reason, "name", reason)))
336
+
337
+ if chunk.usage_metadata:
338
+ usage = {
339
+ "prompt_tokens": chunk.usage_metadata.prompt_token_count,
340
+ "completion_tokens": chunk.usage_metadata.candidates_token_count,
341
+ }
342
+ if full_response.strip() or tool_calls:
343
+ break
344
+ logger.info("Vertex returned an empty round (finish_reason %s), attempt %d",
345
+ finish_reasons[-1:] or "none", attempt + 1)
346
+ if attempt < _EMPTY_ROUND_RETRIES:
347
+ finish_reasons = []
348
+
349
+ if not full_response.strip() and not tool_calls:
350
+ reason = finish_reasons[-1] if finish_reasons else "none"
351
+ yield LLMDone(
352
+ response="", provider="vertexai", success=False,
353
+ error=f"empty_response (Vertex finish_reason {reason} after "
354
+ f"{1 + _EMPTY_ROUND_RETRIES} attempts)",
355
+ )
356
+ return
357
+
303
358
  yield LLMDone(
304
359
  response=full_response,
305
360
  tool_calls_pending=tool_calls,
@@ -308,7 +363,7 @@ class VertexAIProvider(LLMProvider):
308
363
  success=True,
309
364
  cancelled=False,
310
365
  )
311
-
366
+
312
367
  except APIError as e:
313
368
  yield LLMDone(response="", provider="vertexai", success=False, error=f"Vertex AI API Error: {e.message}")
314
369
  except Exception as e:
@@ -34,7 +34,17 @@ class ChromeMixin:
34
34
  self._ollama_alive = bool(self._installed_models)
35
35
  except Exception:
36
36
  pass
37
- if self._installed_models and current_id not in self._installed_models:
37
+ # Only a model this session would run on Ollama is paired. The check
38
+ # below it looks for a provider prefix, so a bare cloud id such as
39
+ # "gemini-3.8-flash" (with local_provider=vertex, or backend_chat on)
40
+ # read as a missing local model: it was replaced by whatever Ollama
41
+ # had installed — a 1.5B model — and the change saved to the config.
42
+ try:
43
+ from aria_code.apps.cli.providers.chat_routing import first_round_route
44
+ _runs_on_ollama = first_round_route(current_id, self.config, self.api_url) == "ollama"
45
+ except Exception:
46
+ _runs_on_ollama = False
47
+ if _runs_on_ollama and self._installed_models and current_id not in self._installed_models:
38
48
  _resolved = _pick_best_installed_model(self._installed_models, current_id)
39
49
  if _resolved:
40
50
  self._auto_healed_from = current_id
@@ -3137,12 +3137,12 @@ def _print_finance_result(tool_name: str, result: dict) -> None:
3137
3137
  bot_mode=_ARIA_BOT_MODE)
3138
3138
 
3139
3139
 
3140
- def _render_macro_result(r: dict, title: str) -> None:
3141
- render_macro_result(r, title, console=console, has_rich=HAS_RICH)
3140
+ def _render_macro_result(r: dict, title: str, lang: str = "zh") -> None:
3141
+ render_macro_result(r, title, console=console, has_rich=HAS_RICH, lang=lang)
3142
3142
 
3143
3143
 
3144
- def _render_cb_rates(r: dict) -> None:
3145
- render_cb_rates(r, console=console, has_rich=HAS_RICH)
3144
+ def _render_cb_rates(r: dict, lang: str = "zh") -> None:
3145
+ render_cb_rates(r, console=console, has_rich=HAS_RICH, lang=lang)
3146
3146
 
3147
3147
 
3148
3148
  def _render_econ_calendar(r: dict) -> None:
@@ -4894,7 +4894,7 @@ class ArtheraTerminal(_ChatTurn, _Chrome, _HeadlessMixin):
4894
4894
  if _mem_fact:
4895
4895
  self.commands.cmd_note(_mem_fact)
4896
4896
 
4897
- await self.send_message(user_input)
4897
+ await self.send_message(user_input, route_text=True)
4898
4898
 
4899
4899
  except KeyboardInterrupt:
4900
4900
  _esc_watcher.stop()
@@ -55,6 +55,7 @@ from __future__ import annotations
55
55
 
56
56
  import importlib.util
57
57
  import json
58
+ import re
58
59
  import os
59
60
  import shlex
60
61
  import shutil
@@ -155,6 +156,26 @@ class TaskSpec:
155
156
  )
156
157
 
157
158
 
159
+ _SECRET = re.compile(
160
+ r"(?i)\b(api[_-]?key|token|password|secret)(\s*[=:]\s*)\S+"
161
+ r"|\b(?:bearer)\s+\S+"
162
+ r"|\b(?:sk|pk|rk)-[A-Za-z0-9_-]{8,}|\bgh[pousr]_[A-Za-z0-9]{12,}|\bAIza[0-9A-Za-z_-]{20,}"
163
+ r"|\bya29\.[0-9A-Za-z_-]+"
164
+ )
165
+
166
+
167
+ def _mask(line: str) -> str:
168
+ def repl(match: re.Match) -> str:
169
+ return f"{match.group(1)}{match.group(2)}***" if match.group(1) else "***"
170
+ return _SECRET.sub(repl, line)
171
+
172
+
173
+ def _log_tail(log: str, lines: int = 23) -> list:
174
+ """The last lines of a task's log, secret-shaped values masked."""
175
+ kept = [line.rstrip() for line in str(log or "").splitlines() if line.strip()]
176
+ return [_mask(line)[:300] for line in kept[-lines:]]
177
+
178
+
158
179
  @dataclass(frozen=True)
159
180
  class TaskResult:
160
181
  task_id: str
@@ -185,6 +206,9 @@ class TaskResult:
185
206
  "detail": self.detail,
186
207
  "tags": list(self.tags),
187
208
  "changed": list(self.changed),
209
+ # Why it did not pass. The first CI run's report said only "the
210
+ # agent did not complete (exit 1)"; the reason was in the job log.
211
+ "log_tail": _log_tail(self.log) if self.outcome != PASS else [],
188
212
  }
189
213
 
190
214
 
@@ -579,9 +603,21 @@ def run_task(
579
603
  detail = f"`{task.verify}` exited {after_code}"
580
604
  if not changed:
581
605
  detail += " — the agent changed nothing"
606
+ # The check's output says what is wrong; the agent's last words say
607
+ # what it thought it did. inventory-reorder failed twice on "reorder.json
608
+ # was not written" with nothing to show whether the agent computed the
609
+ # policy and only reported it, or never got that far.
610
+ agent_said = "\n".join(
611
+ part for part in (str(getattr(outcome, "stdout", "") or ""), str(getattr(outcome, "stderr", "") or ""))
612
+ if part.strip()
613
+ )
614
+ agent_tail = "\n".join([line for line in agent_said.splitlines() if line.strip()][-8:])
615
+ log = _trim(after_log)
616
+ if agent_tail:
617
+ log = f"{log}\n--- agent, last lines ---\n{agent_tail}"
582
618
  return _result(
583
619
  FAIL, exit_code=after_code, detail=detail,
584
- log=_trim(after_log), changed=changed,
620
+ log=log, changed=changed,
585
621
  )
586
622
  finally:
587
623
  if not keep_workspace and scratch_root is None: