aria-code 0.94.0__tar.gz → 0.96.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 (769) hide show
  1. {aria_code-0.94.0/src/aria_code.egg-info → aria_code-0.96.0}/PKG-INFO +1 -1
  2. {aria_code-0.94.0 → aria_code-0.96.0}/pyproject.toml +1 -1
  3. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/core_cmds.py +9 -2
  5. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/data_cmds.py +106 -46
  6. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +4 -2
  7. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +6 -1
  8. aria_code-0.96.0/src/aria_code/apps/cli/headless.py +288 -0
  9. aria_code-0.96.0/src/aria_code/apps/cli/workspace_route.py +95 -0
  10. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_cli.py +21 -247
  11. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/local_finance_tools.py +69 -13
  12. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/render/finance.py +8 -6
  13. {aria_code-0.94.0 → aria_code-0.96.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  14. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code.egg-info/SOURCES.txt +6 -0
  15. aria_code-0.96.0/tests/test_compare_strategies.py +119 -0
  16. aria_code-0.96.0/tests/test_headless_module.py +46 -0
  17. aria_code-0.96.0/tests/test_no_tools_route.py +99 -0
  18. aria_code-0.96.0/tests/test_terminal_snapshots.py +229 -0
  19. {aria_code-0.94.0 → aria_code-0.96.0}/LICENSE +0 -0
  20. {aria_code-0.94.0 → aria_code-0.96.0}/NOTICE +0 -0
  21. {aria_code-0.94.0 → aria_code-0.96.0}/README.md +0 -0
  22. {aria_code-0.94.0 → aria_code-0.96.0}/setup.cfg +0 -0
  23. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/__init__.py +0 -0
  24. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/adk_apps/__init__.py +0 -0
  25. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  26. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  27. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  28. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  29. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/__init__.py +0 -0
  30. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/base.py +0 -0
  31. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/code_review.py +0 -0
  32. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/__init__.py +0 -0
  33. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  34. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/critic.py +0 -0
  35. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/deepen.py +0 -0
  36. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/models.py +0 -0
  37. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  38. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  39. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/themes.py +0 -0
  40. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/deep/tiers.py +0 -0
  41. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  42. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/coder.py +0 -0
  43. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/tester.py +0 -0
  44. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/__init__.py +0 -0
  45. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  46. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  47. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  48. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/debate.py +0 -0
  49. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/earnings.py +0 -0
  50. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  51. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/macro.py +0 -0
  52. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/news.py +0 -0
  53. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/risk.py +0 -0
  54. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/sector.py +0 -0
  55. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/strategist.py +0 -0
  56. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  57. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  58. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/financial/technical.py +0 -0
  59. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/orchestrator.py +0 -0
  60. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  61. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/__init__.py +0 -0
  62. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  63. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/business_match.py +0 -0
  64. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  65. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  66. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  67. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  68. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  69. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  70. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  71. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/registry.py +0 -0
  72. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/signal_scheme.py +0 -0
  73. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/sports/__init__.py +0 -0
  74. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  75. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/supervisor.py +0 -0
  76. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/team.py +0 -0
  77. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  78. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  79. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  80. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  81. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  82. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  83. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  84. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  85. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  86. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  87. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  88. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aliyun_data_client.py +0 -0
  89. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/README.md +0 -0
  90. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/__init__.py +0 -0
  91. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/README.md +0 -0
  92. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/__init__.py +0 -0
  93. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/approvals.py +0 -0
  94. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/conversation.py +0 -0
  95. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/digest.py +0 -0
  96. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/intake.py +0 -0
  97. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/registry.py +0 -0
  98. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  99. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/README.md +0 -0
  100. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/__init__.py +0 -0
  101. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/_optional.py +0 -0
  102. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  103. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  104. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  105. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  106. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  107. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  108. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  109. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  110. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  111. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  112. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  113. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  114. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  115. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  116. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  117. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  118. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  119. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  120. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  121. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  122. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  123. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  124. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  125. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  126. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  127. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  128. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  129. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  130. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  131. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  132. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  133. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  134. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  135. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  136. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  137. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  138. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  139. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  140. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/config_store.py +0 -0
  141. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/constants.py +0 -0
  142. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/context.py +0 -0
  143. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  144. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/direct.py +0 -0
  145. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/exec_events.py +0 -0
  146. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  147. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  148. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  149. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/google_login.py +0 -0
  150. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  151. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  152. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  153. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  154. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  155. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  156. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/helpers.py +0 -0
  157. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/hooks.py +0 -0
  158. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/i18n.py +0 -0
  159. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent.py +0 -0
  160. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  161. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  162. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  163. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  164. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/main.py +0 -0
  165. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  166. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  167. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  168. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  169. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  170. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  171. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  172. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  173. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  174. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/preflight.py +0 -0
  175. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  176. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  177. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  178. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  179. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  180. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  181. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  182. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  183. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  184. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  185. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  186. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  187. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  188. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  189. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  190. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  191. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  192. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  193. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  194. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  195. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  196. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  197. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  198. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_export.py +0 -0
  199. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  200. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_store.py +0 -0
  201. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  202. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  203. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  204. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  205. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  206. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  207. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  208. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  209. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  210. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  211. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  212. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  213. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  214. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  215. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/update_check.py +0 -0
  216. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/updater.py +0 -0
  217. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  218. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  219. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/daemon/README.md +0 -0
  220. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/vscode/README.md +0 -0
  221. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/apps/vscode/package.json +0 -0
  222. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_daemon.py +0 -0
  223. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_feishu_bot.py +0 -0
  224. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_mcp_server.py +0 -0
  225. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_relay_client.py +0 -0
  226. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_relay_server.py +0 -0
  227. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/aria_telegram_bot.py +0 -0
  228. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ariarc.py +0 -0
  229. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/artifacts.py +0 -0
  230. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/backtest_engine.py +0 -0
  231. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/backtest_report.py +0 -0
  232. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/__init__.py +0 -0
  233. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/automation.py +0 -0
  234. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/base.py +0 -0
  235. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/capabilities.py +0 -0
  236. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  237. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  238. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  239. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  240. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  241. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  242. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/config.py +0 -0
  243. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  244. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  245. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  246. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  247. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  248. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/paper_broker.py +0 -0
  249. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/planning.py +0 -0
  250. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/registry.py +0 -0
  251. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/brokers/trading.py +0 -0
  252. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/canva_client.py +0 -0
  253. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/change_store.py +0 -0
  254. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/__init__.py +0 -0
  255. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  256. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  257. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/canva_client.py +0 -0
  258. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/figma_client.py +0 -0
  259. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/football_data_client.py +0 -0
  260. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/kling_video_client.py +0 -0
  261. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/market_data_client.py +0 -0
  262. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/openai_image_client.py +0 -0
  263. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/runway_video_client.py +0 -0
  264. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  265. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/cloud_memory.py +0 -0
  266. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/command_safety.py +0 -0
  267. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/computer_use_tools.py +0 -0
  268. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/dashboard_generator.py +0 -0
  269. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/data_analysis_tools.py +0 -0
  270. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/data_cleaner.py +0 -0
  271. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/data_service.py +0 -0
  272. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/__init__.py +0 -0
  273. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/base.py +0 -0
  274. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/router.py +0 -0
  275. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  276. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  277. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  278. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  279. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  280. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  281. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  282. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  283. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  284. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  285. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/demo_player.py +0 -0
  286. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/doctor.py +0 -0
  287. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/domain/__init__.py +0 -0
  288. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/domain/backtest_engine.py +0 -0
  289. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/domain/backtest_report.py +0 -0
  290. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/domain/finance_formulas.py +0 -0
  291. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  292. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/domain/strategy_vault.py +0 -0
  293. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/evals/__init__.py +0 -0
  294. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/evals/harness.py +0 -0
  295. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/evals/runner.py +0 -0
  296. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/external_agent_runner.py +0 -0
  297. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/figma_client.py +0 -0
  298. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/file_analysis_tools.py +0 -0
  299. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/finance_formulas.py +0 -0
  300. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/football_data_client.py +0 -0
  301. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/image_gen_tools.py +0 -0
  302. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/intent_classifier.py +0 -0
  303. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/kling_video_client.py +0 -0
  304. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/licensing.py +0 -0
  305. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/local_finance_tools.py +0 -0
  306. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/local_image_provider.py +0 -0
  307. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/local_llm_provider.py +0 -0
  308. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/macro_tools.py +0 -0
  309. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/markdown_pdf.py +0 -0
  310. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/market_data_client.py +0 -0
  311. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/mcp_client.py +0 -0
  312. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/memory_manager.py +0 -0
  313. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/model_capability.py +0 -0
  314. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/notification_tools.py +0 -0
  315. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/openai_image_client.py +0 -0
  316. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/__init__.py +0 -0
  317. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  318. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  319. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  320. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  321. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  322. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  323. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  324. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/export.py +0 -0
  325. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  326. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  327. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  328. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  329. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  330. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  331. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  332. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  333. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  334. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  335. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  336. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  337. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  338. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  339. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  340. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  341. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  342. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  343. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  344. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  345. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  346. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/context.py +0 -0
  347. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  348. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/data.py +0 -0
  349. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  350. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/references.py +0 -0
  351. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  352. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  353. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  354. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  355. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  356. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  357. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  358. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  359. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  360. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  361. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  362. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  363. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  364. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  365. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  366. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  367. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  368. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  369. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  370. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  371. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  372. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  373. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  374. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  375. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  376. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  377. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  378. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  379. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  380. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  381. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  382. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  383. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  384. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  385. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  386. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  387. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  388. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  389. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  390. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  391. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/__init__.py +0 -0
  392. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/base.py +0 -0
  393. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/finance/__init__.py +0 -0
  394. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  395. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/payments/__init__.py +0 -0
  396. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/realty/__init__.py +0 -0
  397. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/registry.py +0 -0
  398. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/packs/rules.py +0 -0
  399. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/plan_utils.py +0 -0
  400. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/plugin_loader.py +0 -0
  401. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/portfolio_ledger.py +0 -0
  402. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/preview_server.py +0 -0
  403. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/privacy/__init__.py +0 -0
  404. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/privacy/feedback.py +0 -0
  405. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/project_review.py +0 -0
  406. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/project_review_api.py +0 -0
  407. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/project_review_server.py +0 -0
  408. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/project_tools.py +0 -0
  409. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/__init__.py +0 -0
  410. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/__init__.py +0 -0
  411. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  412. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  413. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/base.py +0 -0
  414. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/custom.py +0 -0
  415. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/ollama.py +0 -0
  416. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  417. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/llm/registry.py +0 -0
  418. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/local_image_provider.py +0 -0
  419. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  420. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/providers/tool_messages.py +0 -0
  421. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/realty_data_tools.py +0 -0
  422. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/relay_store.py +0 -0
  423. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/report_exporters.py +0 -0
  424. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/report_generator.py +0 -0
  425. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/review_service.py +0 -0
  426. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/__init__.py +0 -0
  427. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/acceptance.py +0 -0
  428. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/agent_loop.py +0 -0
  429. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/approval.py +0 -0
  430. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/budget.py +0 -0
  431. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/checkpoints.py +0 -0
  432. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/crash_report.py +0 -0
  433. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/events.py +0 -0
  434. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/gateway.py +0 -0
  435. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/lsp.py +0 -0
  436. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/orchestrator.py +0 -0
  437. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/processes.py +0 -0
  438. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/repo_map.py +0 -0
  439. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/run_state.py +0 -0
  440. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/run_store.py +0 -0
  441. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/self_healing.py +0 -0
  442. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/subagent.py +0 -0
  443. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/task_ledger.py +0 -0
  444. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  445. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/tool_executor.py +0 -0
  446. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/tool_policy.py +0 -0
  447. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runtime/worktrees.py +0 -0
  448. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/runway_video_client.py +0 -0
  449. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/safety/__init__.py +0 -0
  450. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/safety/permissions.py +0 -0
  451. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/safety/sandbox.py +0 -0
  452. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/safety/service.py +0 -0
  453. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/setup_wizard.py +0 -0
  454. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/spreadsheet_tools.py +0 -0
  455. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/strategy_vault.py +0 -0
  456. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/__init__.py +0 -0
  457. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/artifact_tools.py +0 -0
  458. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/broker_tools.py +0 -0
  459. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  460. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  461. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  462. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  463. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  464. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/extended_tools.py +0 -0
  465. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  466. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  467. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  468. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  469. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_io.py +0 -0
  470. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  471. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_tools.py +0 -0
  472. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/macro_tools.py +0 -0
  473. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/notification_tools.py +0 -0
  474. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/project_tools.py +0 -0
  475. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  476. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  477. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/tools/stripe_tools.py +0 -0
  478. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/__init__.py +0 -0
  479. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/banner.py +0 -0
  480. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/completer.py +0 -0
  481. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/console.py +0 -0
  482. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/image_render.py +0 -0
  483. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/input_box.py +0 -0
  484. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/mentions.py +0 -0
  485. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/picker.py +0 -0
  486. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/render/__init__.py +0 -0
  487. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/render/market.py +0 -0
  488. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/render/output.py +0 -0
  489. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/render/responsive.py +0 -0
  490. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/render/team.py +0 -0
  491. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/robot.py +0 -0
  492. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  493. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/utils/vscode_uri.py +0 -0
  494. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/video_analysis.py +0 -0
  495. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/video_editor.py +0 -0
  496. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace/__init__.py +0 -0
  497. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace/files.py +0 -0
  498. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace/verify.py +0 -0
  499. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace_changes.py +0 -0
  500. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace_context.py +0 -0
  501. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace_service.py +0 -0
  502. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code/workspace_tools.py +0 -0
  503. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  504. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  505. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code.egg-info/requires.txt +0 -0
  506. {aria_code-0.94.0 → aria_code-0.96.0}/src/aria_code.egg-info/top_level.txt +0 -0
  507. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_adk_market_tools.py +0 -0
  508. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_agent_key_points_language.py +0 -0
  509. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_agent_team_fallback.py +0 -0
  510. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_analyze_file_tool.py +0 -0
  511. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_architecture_ledger_is_true.py +0 -0
  512. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_architecture_report.py +0 -0
  513. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_aria_cli_core.py +0 -0
  514. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_aria_mcp_server.py +0 -0
  515. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_aria_sdk.py +0 -0
  516. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_artifact_publishing.py +0 -0
  517. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_artifacts_and_reports.py +0 -0
  518. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ashare_prediction_cmds.py +0 -0
  519. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_background_processes.py +0 -0
  520. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_backtest_cmds.py +0 -0
  521. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_backtest_engine.py +0 -0
  522. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_backtest_report.py +0 -0
  523. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  524. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_broken_akshare_is_optional.py +0 -0
  525. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_broker_automation.py +0 -0
  526. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  527. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_broker_planning.py +0 -0
  528. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_broker_safety.py +0 -0
  529. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_broker_tools.py +0 -0
  530. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_budget.py +0 -0
  531. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_business_workflow_cmds.py +0 -0
  532. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_canva_client.py +0 -0
  533. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_canvas_cmds.py +0 -0
  534. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_card_approvals.py +0 -0
  535. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_channel_intake.py +0 -0
  536. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_channels.py +0 -0
  537. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_chart_handlers.py +0 -0
  538. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_chat_bots_fail_closed.py +0 -0
  539. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_chat_routing.py +0 -0
  540. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ci_security_workflow.py +0 -0
  541. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_app_split.py +0 -0
  542. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_bootstrap.py +0 -0
  543. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_config_store.py +0 -0
  544. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  545. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_runtime_consumer.py +0 -0
  546. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_tool_executor_module.py +0 -0
  547. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cli_updater.py +0 -0
  548. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_cloud_memory.py +0 -0
  549. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_code_audit_tools.py +0 -0
  550. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_code_review_agent.py +0 -0
  551. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_codegen_output.py +0 -0
  552. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_coder_tester_self_healing.py +0 -0
  553. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_coder_tool_safety.py +0 -0
  554. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_collaboration.py +0 -0
  555. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_command_loggers.py +0 -0
  556. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_command_safety.py +0 -0
  557. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_completions_builder.py +0 -0
  558. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_config_paths.py +0 -0
  559. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_configured_provider.py +0 -0
  560. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_container_entrypoint.py +0 -0
  561. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_container_entrypoints.py +0 -0
  562. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_context_checkpoints.py +0 -0
  563. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_context_references.py +0 -0
  564. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_context_service.py +0 -0
  565. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_conversation_core.py +0 -0
  566. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_crash_report.py +0 -0
  567. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_credential_file_permissions.py +0 -0
  568. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_custom_providers.py +0 -0
  569. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_daemon_gateway_config.py +0 -0
  570. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_dashboard_generator.py +0 -0
  571. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_data_service.py +0 -0
  572. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_data_service_imports.py +0 -0
  573. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_data_without_model.py +0 -0
  574. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_datasource_routing.py +0 -0
  575. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_deep_analysis.py +0 -0
  576. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_degrades_without_quant_engine.py +0 -0
  577. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  578. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_doctor.py +0 -0
  579. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  580. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_doctor_npm_scope.py +0 -0
  581. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_edit_and_command_safety.py +0 -0
  582. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_engine_boundary.py +0 -0
  583. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_enterprise_tool_honesty.py +0 -0
  584. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_env_switch_docs.py +0 -0
  585. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_evals_harness.py +0 -0
  586. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_event_import_roots.py +0 -0
  587. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_exec_events.py +0 -0
  588. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_extended_tools.py +0 -0
  589. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_feishu_swarm_config.py +0 -0
  590. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_file_links.py +0 -0
  591. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_finalize_release.py +0 -0
  592. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_finance_renderers.py +0 -0
  593. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_finance_service_catalog.py +0 -0
  594. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_first_run_output.py +0 -0
  595. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_first_run_works.py +0 -0
  596. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_football_agent.py +0 -0
  597. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_football_prediction_output.py +0 -0
  598. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_google_cloud_models.py +0 -0
  599. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_google_cloud_routing.py +0 -0
  600. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_google_login.py +0 -0
  601. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_google_search_provider.py +0 -0
  602. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_headless_is_agentic.py +0 -0
  603. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_honest_surfaces.py +0 -0
  604. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_image_gen_tools.py +0 -0
  605. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_image_inputs.py +0 -0
  606. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_import_graph_budget.py +0 -0
  607. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_intent_router.py +0 -0
  608. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_intent_signals.py +0 -0
  609. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_kling_video_client.py +0 -0
  610. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_lazy_rebind.py +0 -0
  611. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_legacy_module_imports.py +0 -0
  612. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_license_consistency.py +0 -0
  613. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_licensing.py +0 -0
  614. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_local_image_provider.py +0 -0
  615. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_logistics_3pl.py +0 -0
  616. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_logistics_and_finance_agents.py +0 -0
  617. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_lsp.py +0 -0
  618. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_markdown_pdf.py +0 -0
  619. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_answers_in_english.py +0 -0
  620. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_data_client.py +0 -0
  621. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_history_inheritance.py +0 -0
  622. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_history_tool.py +0 -0
  623. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_hours.py +0 -0
  624. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_questions_on_backend.py +0 -0
  625. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_symbol_extraction.py +0 -0
  626. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_market_universe.py +0 -0
  627. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_mcp_circuit.py +0 -0
  628. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_mcp_client.py +0 -0
  629. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_mentions.py +0 -0
  630. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_model_capability_registry.py +0 -0
  631. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_model_choice_is_the_users.py +0 -0
  632. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_model_selection_state.py +0 -0
  633. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_narrow_chinese_output.py +0 -0
  634. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_native_binary_entrypoints.py +0 -0
  635. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_native_installer.py +0 -0
  636. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_natural_language_routing.py +0 -0
  637. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_new_modules.py +0 -0
  638. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  639. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_no_uncommitted_imports.py +0 -0
  640. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_numeric_listings.py +0 -0
  641. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ollama_stream_imports.py +0 -0
  642. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ollama_stream_tools.py +0 -0
  643. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_openai_image_client.py +0 -0
  644. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_operations_suite.py +0 -0
  645. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_os_sandbox.py +0 -0
  646. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_output_rendering.py +0 -0
  647. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_packages_facade.py +0 -0
  648. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_packaging_constraints.py +0 -0
  649. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_packaging_manifest.py +0 -0
  650. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_packs_domains.py +0 -0
  651. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_pdf_report.py +0 -0
  652. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_pick_best_installed_model.py +0 -0
  653. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_plan_mode.py +0 -0
  654. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_platform_package_assembly.py +0 -0
  655. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_platform_packages.py +0 -0
  656. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_platform_publish.py +0 -0
  657. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_plotly_html_output.py +0 -0
  658. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_portfolio_language.py +0 -0
  659. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_portfolio_ledger.py +0 -0
  660. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_post_turn_context_decision.py +0 -0
  661. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_preflight.py +0 -0
  662. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_preview_server.py +0 -0
  663. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_privacy_feedback.py +0 -0
  664. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_project_aria.py +0 -0
  665. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_project_context_files.py +0 -0
  666. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_project_review.py +0 -0
  667. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_project_review_api.py +0 -0
  668. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_prompt_assembly.py +0 -0
  669. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_prompt_selection.py +0 -0
  670. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_provider_autoconfig.py +0 -0
  671. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_provider_error_messages.py +0 -0
  672. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_provider_integration.py +0 -0
  673. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_provider_registry.py +0 -0
  674. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_public_service_status.py +0 -0
  675. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_quant_engine_namespace.py +0 -0
  676. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_rebind_contract.py +0 -0
  677. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_rebind_namespace_contract.py +0 -0
  678. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_relay_client_credentials.py +0 -0
  679. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_relay_event_verification.py +0 -0
  680. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_relay_sends_for_clients.py +0 -0
  681. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_relay_store.py +0 -0
  682. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_relay_url.py +0 -0
  683. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_release_chain.py +0 -0
  684. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_release_commit_identity.py +0 -0
  685. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_release_push_is_atomic.py +0 -0
  686. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_release_reaches_the_registries.py +0 -0
  687. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_release_verification_waits.py +0 -0
  688. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_release_workflow_permissions.py +0 -0
  689. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_report_charts.py +0 -0
  690. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_report_generator.py +0 -0
  691. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_research_protocol.py +0 -0
  692. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_research_quality.py +0 -0
  693. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_responsive_rendering.py +0 -0
  694. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_review_service.py +0 -0
  695. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_root_module_budget.py +0 -0
  696. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  697. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_acceptance.py +0 -0
  698. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_agent_loop.py +0 -0
  699. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_approval.py +0 -0
  700. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_bridge.py +0 -0
  701. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_bridge_fallback.py +0 -0
  702. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_checkpoints.py +0 -0
  703. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_event_identity.py +0 -0
  704. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_gateway.py +0 -0
  705. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_repo_map.py +0 -0
  706. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_run_store.py +0 -0
  707. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_tool_executor.py +0 -0
  708. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runtime_worktrees.py +0 -0
  709. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_runway_video_client.py +0 -0
  710. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_safety_permissions.py +0 -0
  711. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_safety_service.py +0 -0
  712. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_safety_service_adoption.py +0 -0
  713. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_service_diagnostics_security.py +0 -0
  714. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_session_search.py +0 -0
  715. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_settings_service.py +0 -0
  716. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_shell_commands_as_written.py +0 -0
  717. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_shipper_digest.py +0 -0
  718. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_single_import_root.py +0 -0
  719. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_skill_agent_binding.py +0 -0
  720. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_skill_catalog.py +0 -0
  721. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_skill_loader.py +0 -0
  722. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_slash_popup.py +0 -0
  723. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_spreadsheet_tools.py +0 -0
  724. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_sse_stream_contract.py +0 -0
  725. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_startup_dashboard.py +0 -0
  726. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_startup_latency.py +0 -0
  727. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_status_language.py +0 -0
  728. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_streaming_pipeline.py +0 -0
  729. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_stripe_agent.py +0 -0
  730. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_subagent.py +0 -0
  731. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_supervisor_routing.py +0 -0
  732. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_system_prompts.py +0 -0
  733. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_system_tools_output.py +0 -0
  734. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_task_orchestrator.py +0 -0
  735. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_team_analysts.py +0 -0
  736. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_team_synthesis.py +0 -0
  737. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_tls_trust_store.py +0 -0
  738. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_tool_policy.py +0 -0
  739. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  740. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_tool_scope.py +0 -0
  741. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_tool_step_output.py +0 -0
  742. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_trading_service.py +0 -0
  743. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_tradingview_bridge.py +0 -0
  744. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_turn_planning.py +0 -0
  745. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ui_completer_references.py +0 -0
  746. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ui_console_theme.py +0 -0
  747. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ui_input_box.py +0 -0
  748. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ui_language_and_model.py +0 -0
  749. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_ui_robot_banner.py +0 -0
  750. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_update_health_routes.py +0 -0
  751. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_verification_hint.py +0 -0
  752. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_verification_policy.py +0 -0
  753. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_version_consistency.py +0 -0
  754. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_version_counter.py +0 -0
  755. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_video_analysis.py +0 -0
  756. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_video_editor.py +0 -0
  757. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_vscode_mcp.py +0 -0
  758. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_warehouse_agents.py +0 -0
  759. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_warehouse_cli_registration.py +0 -0
  760. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_warehouse_erp_client.py +0 -0
  761. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_warehouse_workflow.py +0 -0
  762. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_wheel_is_installable.py +0 -0
  763. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_workspace_changes.py +0 -0
  764. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_workspace_context.py +0 -0
  765. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_workspace_files.py +0 -0
  766. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_workspace_scope.py +0 -0
  767. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_workspace_service.py +0 -0
  768. {aria_code-0.94.0 → aria_code-0.96.0}/tests/test_workspace_verify.py +0 -0
  769. {aria_code-0.94.0 → aria_code-0.96.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.94.0
3
+ Version: 0.96.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.94.0"
7
+ version = "0.96.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.94.0"
20
+ __version__ = "0.96.0"
@@ -287,6 +287,7 @@ class CoreCommandsMixin:
287
287
  print("\n" + T(f"更多:/help {topics} · all · <命令>", f"More: /help {topics} · all · <command>"))
288
288
  return
289
289
 
290
+ from rich.cells import cell_len, set_cell_size
290
291
  from rich.text import Text
291
292
 
292
293
  console = self.context.console
@@ -301,8 +302,14 @@ class CoreCommandsMixin:
301
302
  # indent 2, name, gap 2, description, gap 3, name, gap 2, description
302
303
  desc_width = max(12, (console.width - 2 - 2 * name_width - 2 - 3 - 2) // 2)
303
304
 
305
+ # Widths in terminal cells, not characters: a Chinese character takes
306
+ # two. Counted as one, the Chinese /help padded each left description
307
+ # to twice its room and the right column wrapped back to column 0.
304
308
  def cell(text: str) -> str:
305
- return text if len(text) <= desc_width else text[:desc_width - 1] + "…"
309
+ return text if cell_len(text) <= desc_width else set_cell_size(text, desc_width - 1) + "…"
310
+
311
+ def pad(text: str, width: int) -> str:
312
+ return text + " " * max(0, width - cell_len(text))
306
313
 
307
314
  two_columns = console.width >= 96
308
315
  if not two_columns:
@@ -317,7 +324,7 @@ class CoreCommandsMixin:
317
324
  lines = Text()
318
325
  for left, right in pairs:
319
326
  lines.append(" " + left[0].ljust(name_width + 2), style="bold #C08050")
320
- lines.append(cell(left[1]).ljust(desc_width + 3) if right[0] else cell(left[1]), style="dim")
327
+ lines.append(pad(cell(left[1]), desc_width + 3) if right[0] else cell(left[1]), style="dim")
321
328
  if right[0]:
322
329
  lines.append(right[0].ljust(name_width + 2), style="bold #C08050")
323
330
  lines.append(cell(right[1]), style="dim")
@@ -339,23 +339,60 @@ class DataCommandsMixin:
339
339
  with self.context.console.status(f"[dim]{ui_text(self, f'获取 {symbol} 同行数据', f'Fetching {symbol} peer data')}...[/dim]", spinner="dots"):
340
340
  from local_finance_tools import _peer_comparison
341
341
  r = await loop.run_in_executor(None, _peer_comparison,
342
- {"symbol": symbol, "peers": peers})
342
+ {"symbol": symbol, "peers": peers, "lang": ui_text(self, "zh", "en")})
343
343
  else:
344
344
  from local_finance_tools import _peer_comparison
345
- r = _peer_comparison({"symbol": symbol, "peers": peers})
345
+ r = _peer_comparison({"symbol": symbol, "peers": peers, "lang": ui_text(self, "zh", "en")})
346
346
 
347
347
  _render_peer_comparison(r)
348
348
 
349
349
  async def cmd_compare(self, args: str):
350
- """多策略横向对比 → /api/v1/backtest/compare-strategies"""
351
- parts = args.split() if args else ["SPY"]
352
- symbol = parts[0].upper() if parts else "SPY"
353
- start = parts[1] if len(parts) > 1 else "2020-01-01"
354
- end = parts[2] if len(parts) > 2 else __import__("datetime").date.today().isoformat()
350
+ """/compare SYMBOL [start] [end] — several strategies on one symbol, against buy-and-hold.
351
+
352
+ /compare AAPL MSFT read MSFT as the start date, and the local fallback
353
+ ran four of its five strategies as buy-and-hold (the local engine had
354
+ no such names and fell through to it), so the table showed four
355
+ identical rows. Its "start → end" title was the dates asked for, not
356
+ the ones used, and the Buy & Hold row was a total return in the
357
+ annual-return column with a made-up trade count.
358
+ """
359
+ import re as _re
360
+
361
+ parts = args.split() if args and args.strip() else ["SPY"]
362
+ symbol = parts[0].upper()
363
+ rest = parts[1:]
364
+ def is_date(token: str) -> bool:
365
+ # A real date: 2024-13-01 has the shape and reached yfinance, whose
366
+ # failure was then explained as rate limiting.
367
+ try:
368
+ __import__("datetime").date.fromisoformat(token)
369
+ return len(token) == 10
370
+ except ValueError:
371
+ return False
372
+ if rest and not is_date(rest[0]):
373
+ # A symbol has a letter (AAPL, 0700.HK) or is a six-digit A-share code.
374
+ if all(_re.fullmatch(r"(?=.*[A-Za-z])[A-Za-z0-9.^=-]{1,12}|\d{6}", t) for t in rest):
375
+ # Two or more symbols: the user is comparing stocks, which is /peer.
376
+ peers = " ".join(t.upper() for t in rest)
377
+ note = f"→ /peer {symbol} {peers}"
378
+ self.context.console.print(f" [dim]{note}[/dim]") if self.context.has_rich else print(f" {note}")
379
+ await self.cmd_peer(f"{symbol} {peers}")
380
+ return
381
+ print_error(self.context, ui_text(self, f"无法识别的日期:{rest[0]}", f"Not a date: {rest[0]}"),
382
+ "Usage: /compare SYMBOL [YYYY-MM-DD] [YYYY-MM-DD]")
383
+ return
384
+ if len(rest) > 1 and not is_date(rest[1]):
385
+ print_error(self.context, ui_text(self, f"无法识别的日期:{rest[1]}", f"Not a date: {rest[1]}"),
386
+ "Usage: /compare SYMBOL [YYYY-MM-DD] [YYYY-MM-DD]")
387
+ return
388
+ start = rest[0] if rest else "2020-01-01"
389
+ end = rest[1] if len(rest) > 1 else __import__("datetime").date.today().isoformat()
355
390
  api_url = self.terminal.config.get("api_url", "http://localhost:8000")
356
391
  import aiohttp
357
392
 
358
393
  _STRATS = ["momentum", "mean_reversion", "breakout", "turtle", "ma_crossover"]
394
+ # What the local engine can run, under the names /compare shows.
395
+ _LOCAL = {"momentum": "momentum", "mean_reversion": "rsi_mean_revert", "ma_crossover": "sma_cross"}
359
396
 
360
397
  async def _do():
361
398
  payload = {"symbol": symbol, "strategies": _STRATS,
@@ -367,76 +404,90 @@ class DataCommandsMixin:
367
404
  body = await resp.json()
368
405
  return body.get("data", body)
369
406
 
407
+ def _row(name: str, d: dict) -> dict:
408
+ ann = float(d.get("annual_return", 0) or 0)
409
+ mdd = float(d.get("max_drawdown", 0) or 0)
410
+ return {
411
+ "name": name,
412
+ "annualized_return_pct": ann * 100,
413
+ "sharpe_ratio": float(d.get("sharpe_ratio", 0) or 0),
414
+ "max_drawdown_pct": mdd * 100,
415
+ "calmar_ratio": (ann / abs(mdd)) if mdd else 0.0,
416
+ "sortino_ratio": float(d.get("sortino_ratio", 0) or 0),
417
+ "win_rate_pct": float(d.get("win_rate", 0) or 0) * 100,
418
+ "n_trades": int(d.get("total_trades", 0) or 0),
419
+ }
420
+
370
421
  def _do_local():
371
- """Fallback: run each strategy via the local backtest engine and
372
- assemble the same shape the backend endpoint returns. Used when the
373
- backend is down or lacks the compare-strategies endpoint."""
374
- import asyncio as _aio
375
- rows = []
376
- bench_pct = 0.0
377
- for strat in _STRATS:
422
+ """The strategies the local engine has, over the same dates, and
423
+ buy-and-hold run through the same engine as the benchmark."""
424
+ run = _get_LOCAL_TOOLS()["backtest_strategy"][0]
425
+ rows, period, errors = [], None, []
426
+ for shown, local in _LOCAL.items():
378
427
  try:
379
- res = _get_LOCAL_TOOLS()["backtest_strategy"][0](
380
- {"symbol": symbol, "strategy": strat})
381
- except Exception:
428
+ res = run({"symbol": symbol, "strategy": local, "start": start, "end": end})
429
+ except Exception as exc:
430
+ errors.append(f"{shown}: {exc}")
382
431
  continue
383
432
  if not res.get("success"):
433
+ errors.append(f"{shown}: {res.get('error', 'failed')}")
384
434
  continue
385
435
  d = res.get("data", res)
386
- ann = float(d.get("annual_return", 0) or 0)
387
- mdd = float(d.get("max_drawdown", 0) or 0)
388
- calmar = (ann / abs(mdd)) if mdd else 0.0
389
- rows.append({
390
- "name": strat,
391
- "annualized_return_pct": ann * 100,
392
- "sharpe_ratio": float(d.get("sharpe_ratio", 0) or 0),
393
- "max_drawdown_pct": mdd * 100,
394
- "calmar_ratio": calmar,
395
- "sortino_ratio": float(d.get("sortino_ratio", 0) or 0),
396
- "win_rate_pct": float(d.get("win_rate", 0) or 0) * 100,
397
- "n_trades": int(d.get("total_trades", 0) or 0),
398
- })
399
- br = d.get("benchmark_return")
400
- if br is not None and br == br: # not NaN
401
- bench_pct = float(br) * 100
436
+ period = period or (d.get("start"), d.get("end"))
437
+ rows.append(_row(shown, d))
402
438
  rows.sort(key=lambda r: r["sharpe_ratio"], reverse=True)
403
439
  for i, r in enumerate(rows, 1):
404
440
  r["rank_by_sharpe"] = i
405
- return {"strategies": rows, "benchmark": {"annualized_return_pct": bench_pct},
406
- "provider": "local"}
441
+ bench = {}
442
+ try:
443
+ b = run({"symbol": symbol, "strategy": "buy_hold", "start": start, "end": end})
444
+ if b.get("success"):
445
+ bench = _row("buy_hold", b.get("data", b))
446
+ except Exception:
447
+ pass
448
+ return {"strategies": rows, "benchmark": bench, "provider": "local", "period": period,
449
+ "skipped": [s for s in _STRATS if s not in _LOCAL], "errors": errors}
407
450
 
408
451
  async def _do_with_fallback():
409
452
  try:
410
453
  return await _do()
411
454
  except Exception:
412
455
  # Backend unavailable / missing endpoint → local engine
456
+ note = ui_text(self, "后端不可用,使用本地回测引擎对比…",
457
+ "Backend unavailable; comparing with the local backtest engine…")
413
458
  if self.context.has_rich:
414
- self.context.console.print(" [dim]后端不可用,使用本地回测引擎对比…[/dim]")
415
- return _do_local()
459
+ self.context.console.print(f" [dim]{note}[/dim]")
460
+ import asyncio as _aio
461
+ return await _aio.get_event_loop().run_in_executor(None, _do_local)
416
462
 
463
+ status = ui_text(self, f"正在对比 {symbol} 的策略", f"Comparing strategies on {symbol}")
417
464
  if self.context.has_rich:
418
- with self.context.console.status(f"[dim]Comparing strategies on {symbol}...[/dim]", spinner="dots"):
465
+ with self.context.console.status(f"[dim]{status}...[/dim]", spinner="dots"):
419
466
  try:
420
467
  data = await _do_with_fallback()
421
468
  except Exception as e:
422
469
  print_error(self.context, str(e), "tool")
423
470
  return
424
471
  else:
425
- print(f"Comparing strategies on {symbol}...")
472
+ print(f"{status}...")
426
473
  try:
427
474
  data = await _do_with_fallback()
428
475
  except Exception as e:
429
476
  print_error(self.context, str(e), "tool")
430
477
  return
431
478
  if not data.get("strategies"):
432
- print_error(self.context, "策略对比无结果", "本地回测引擎未返回数据,检查标的代码是否正确")
479
+ detail = "; ".join(data.get("errors") or []) or ui_text(
480
+ self, "检查标的代码和日期是否正确", "check the symbol and the dates")
481
+ print_error(self.context, ui_text(self, "策略对比无结果", "No strategy results"), detail)
433
482
  return
434
483
 
435
484
  strategies = data.get("strategies", [])
436
- bh = data.get("benchmark", {})
485
+ bh = data.get("benchmark", {}) or {}
486
+ period = data.get("period") or (start, end)
437
487
  if self.context.has_rich:
438
488
  from rich.table import Table
439
- tbl = Table(title=f"[bold]{symbol} Strategy Comparison[/bold] {start} → {end}", show_header=True, header_style="bold")
489
+ tbl = Table(title=f"[bold]{symbol} Strategy Comparison[/bold] {period[0]} → {period[1]}",
490
+ show_header=True, header_style="bold")
440
491
  for col in ["Rank", "Strategy", "Ann.Ret%", "Sharpe", "MaxDD%", "Calmar", "Sortino", "Win%", "Trades"]:
441
492
  tbl.add_column(col, justify="right")
442
493
  for s in strategies:
@@ -451,11 +502,20 @@ class DataCommandsMixin:
451
502
  f"{s.get('win_rate_pct',0):.0f}%",
452
503
  str(s.get("n_trades",0)),
453
504
  )
454
- tbl.add_row("—", "[dim]Buy & Hold[/dim]",
455
- f"{bh.get('annualized_return_pct',0):+.1f}%",
456
- f"{bh.get('sharpe_ratio',0):.3f}",
457
- f"{bh.get('max_drawdown_pct',0):.1f}%", "—", "—", "—", "2")
505
+ if bh:
506
+ tbl.add_row("—", "[dim]Buy & Hold[/dim]",
507
+ f"{bh.get('annualized_return_pct',0):+.1f}%",
508
+ f"{bh.get('sharpe_ratio',0):.3f}",
509
+ f"{bh.get('max_drawdown_pct',0):.1f}%",
510
+ f"{bh['calmar_ratio']:.2f}" if "calmar_ratio" in bh else "—",
511
+ f"{bh['sortino_ratio']:.2f}" if "sortino_ratio" in bh else "—",
512
+ "—", str(bh["n_trades"]) if "n_trades" in bh else "—")
458
513
  self.context.console.print(tbl)
514
+ if data.get("skipped"):
515
+ self.context.console.print(" [dim]" + ui_text(
516
+ self, f"本地引擎没有 {', '.join(data['skipped'])},需后端才能对比。",
517
+ f"{', '.join(data['skipped'])} need the backend; the local engine does not have them.")
518
+ + "[/dim]")
459
519
  else:
460
520
  for s in strategies:
461
521
  print(f"{s['name']}: Ann={s.get('annualized_return_pct',0):+.1f}% Sharpe={s.get('sharpe_ratio',0):.2f} DD={s.get('max_drawdown_pct',0):.1f}%")
@@ -758,10 +758,12 @@ class PortfolioCommandsMixin:
758
758
  # NEEDS_ATTENTION (signal SELL) came out as HIGH_RISK.
759
759
  _port_verdict = str((result.data_used or {}).get("verdict") or "NEEDS_ATTENTION")
760
760
  if self.context.has_rich:
761
- self.context.console.print()
761
+ # The header already ends in a blank line, and the banner's
762
+ # panel opens with one: two blank lines each side before.
763
+ if tokens:
764
+ self.context.console.print()
762
765
  for pt in (result.key_points or []):
763
766
  self.context.console.print(f" [dim]• {pt}[/dim]")
764
- self.context.console.print()
765
767
  _subtitle = " · ".join(result.key_points[:2]) if result.key_points else ""
766
768
  _print_verdict_banner(_port_verdict, subtitle=_subtitle,
767
769
  confidence=result.confidence, lang=_lang)
@@ -672,7 +672,12 @@ def handle_stock_chart_analysis_direct(symbol: str, period: str = "1y") -> dict:
672
672
  pe = info.get("trailingPE")
673
673
  pb = info.get("priceToBook")
674
674
  roe = info.get("returnOnEquity")
675
- div_yield = info.get("trailingAnnualDividendYield") or info.get("dividendYield")
675
+ # A fraction, as _fv(div_yield, 100, pct=True) below expects. The fallback
676
+ # was dividendYield, which yfinance gives already in percent: 100x too big.
677
+ trailing = info.get("trailingAnnualDividendYield")
678
+ rate = info.get("dividendRate")
679
+ price_now = info.get("regularMarketPrice") or info.get("currentPrice")
680
+ div_yield = trailing or (float(rate) / float(price_now) if rate and price_now else None)
676
681
  market_cap = info.get("marketCap")
677
682
 
678
683
  def _fv(v, mult=1.0, pct=False):
@@ -0,0 +1,288 @@
1
+ """Non-interactive Aria: `aria-code -p "…"` and `--watch`.
2
+
3
+ Moved out of aria_cli.py, where ArtheraTerminal held it alongside the REPL.
4
+ The bodies are unchanged and still use aria_cli's names (console, LOCAL_TOOLS,
5
+ _run_deterministic_chain, …): aria_cli binds a copy of this class to its own
6
+ globals with bind_to() and puts it among ArtheraTerminal's bases. A copy per
7
+ binding, because aria_cli loads under two names (aria_cli and
8
+ aria_code.aria_cli); rebinding one shared class would leave both terminals
9
+ on whichever module loaded last.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import types
15
+
16
+
17
+ class HeadlessMixin:
18
+ """run_prompt, _run_prompt_turn, _finish_prompt and run_watch for ArtheraTerminal."""
19
+
20
+ async def run_prompt(self, prompt: str, json_output: bool = False,
21
+ fmt: str = "table", output_file: str = None, quiet: bool = False,
22
+ machine_out=None):
23
+ """Run a single prompt (non-interactive / pipe mode).
24
+
25
+ ``machine_out`` is the real stdout when the output is JSON (sys.stdout
26
+ then points at stderr). With fmt "jsonl" each step is written there as
27
+ one JSON event per line as it happens.
28
+ """
29
+ from aria_code.apps.cli.exec_events import ExecEvents, json_safe
30
+ events = ExecEvents(machine_out if fmt == "jsonl" else None)
31
+ events.emit("turn.started", prompt=prompt, model=self.config.get("model", ""))
32
+ result = await self._run_prompt_turn(prompt, quiet=quiet, events=events)
33
+ self._finish_prompt(result, json_output=json_output, fmt=fmt, output_file=output_file,
34
+ quiet=quiet, machine_out=machine_out, events=events)
35
+
36
+ async def _run_prompt_turn(self, prompt: str, *, quiet: bool, events) -> dict:
37
+ """The work of run_prompt: a slash command, a deterministic answer, or an agent turn."""
38
+ model = self.config.get("model", "qwen2.5:7b")
39
+ thinking_mode = self.config.get("thinking_mode", "auto")
40
+ auth_token = self.config.get("auth_token")
41
+ user_context = _build_user_context(self.config)
42
+
43
+ local_mode = self.config.get("local_mode", False)
44
+
45
+ # Dispatch slash commands in -p mode (same as interactive REPL loop).
46
+ # Without this, /memory /note /init /review are sent to the LLM as plain text.
47
+ _stripped_prompt = prompt.strip()
48
+ if self.commands.is_command(_stripped_prompt):
49
+ self._maybe_show_intent_preflight(_stripped_prompt, quiet=quiet)
50
+ await self.commands.execute(_stripped_prompt)
51
+ return {"success": True, "command": _stripped_prompt.split()[0], "response": ""}
52
+
53
+ _reference_context = ""
54
+ _reference_service = getattr(self, "_reference_service", None)
55
+ if _reference_service is not None and "@" in prompt:
56
+ _prepared_references = _reference_service.prepare(prompt)
57
+ if _prepared_references.errors:
58
+ self._print_reference_errors(_prepared_references)
59
+ return {"success": False, "response": "", "error": "unresolved @ reference"}
60
+ if _prepared_references.references:
61
+ self._print_reference_summary(_prepared_references)
62
+ prompt = _prepared_references.expanded_text
63
+ _reference_context = _prepared_references.context_block
64
+
65
+ # Keep referenced local files as pointers; the model reads them through
66
+ # audited tools instead of silently embedding their contents.
67
+ if _reference_context:
68
+ prompt = f"{prompt}\n\n{_reference_context}"
69
+ else:
70
+ _file_tool_hint = _build_file_tool_hint(prompt)
71
+ if _file_tool_hint:
72
+ prompt = _file_tool_hint + prompt
73
+ self._maybe_show_intent_preflight(prompt, quiet=quiet)
74
+
75
+ _curr_model_id_p = self.config.get("model", "")
76
+ # The route counts as much as the model: on backend_chat the model gets
77
+ # no local tools whatever it could do with them. This only looked at the
78
+ # model, so the deterministic chain skipped its data pre-fetch there.
79
+ from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools
80
+ _model_has_tools_p = route_has_tools(_curr_model_id_p, self.config, self.api_url)
81
+
82
+ # ── Broker guide intent: broad discovery should not start an add wizard ──
83
+ if _is_broker_guide_intent(prompt):
84
+ if HAS_RICH:
85
+ console.print("\n[bold]Aria[/bold] [dim] 正在打开券商与服务指南…[/dim]\n")
86
+ await self.commands.cmd_broker("guide")
87
+ await self.commands.cmd_broker("services")
88
+ await self.commands.cmd_packages("services")
89
+ return {"success": True, "command": "/broker guide", "response": ""}
90
+
91
+ # ── Broker setup intent: intercept before LLM / deterministic routing ──
92
+ if _is_broker_setup_intent(prompt):
93
+ _btype_p = _detect_broker_type(prompt)
94
+ if HAS_RICH:
95
+ from apps.cli.utils.market_detect import _BROKER_SETUP_NAMES
96
+ _display_p = _BROKER_SETUP_NAMES.get(_btype_p, ("",))[0] if _btype_p else ""
97
+ _label_p = f" 正在启动{_display_p}配置向导…" if _display_p else " 正在启动券商配置向导…"
98
+ console.print(f"\n[bold]Aria[/bold] [dim]{_label_p}[/dim]\n")
99
+ await self.commands._cmd_broker_add(_btype_p)
100
+ return {"success": True, "command": "/broker add", "response": ""}
101
+
102
+ # ── Football prediction intercept → built-in Poisson handler ──────────
103
+ if await self._try_football_nl_intercept(prompt):
104
+ return {"success": True, "command": "football", "response": ""}
105
+
106
+ deterministic = _run_deterministic_chain(
107
+ prompt, model_has_tools=_model_has_tools_p)
108
+ if deterministic.get("success") or _is_stock_chart_analysis_request(prompt):
109
+ result = deterministic
110
+ else:
111
+ # No one reads a headless answer before a script acts on it. A task
112
+ # about this folder on a model that cannot open it would come back as
113
+ # a confident guess with exit 0; fail before sending it instead.
114
+ if not _model_has_tools_p and needs_workspace(prompt):
115
+ _zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
116
+ _why = no_tools_message(self.config, lang="zh" if _zh else "en")
117
+ print(_why, file=sys.stderr)
118
+ return {"success": False, "response": "", "error": "model_cannot_use_tools", "detail": _why}
119
+ # Spinner for terminal usage: gives visual feedback while the model generates.
120
+ # Only starts when we actually need to call the LLM (not for deterministic responses).
121
+ _prompt_spinner = None
122
+ if HAS_RICH and sys.stdout.isatty():
123
+ try:
124
+ _prompt_spinner = console.status("", spinner="dots", spinner_style="dim")
125
+ _prompt_spinner.__enter__()
126
+ except Exception:
127
+ _prompt_spinner = None
128
+ try:
129
+ # Headless -p runs the SAME loop as the REPL.
130
+ #
131
+ # It used to call stream_provider_result directly: one provider
132
+ # round, tool schemas advertised but nothing executing what came
133
+ # back, and a single best-effort pass over tool_calls_pending
134
+ # afterwards whose results the model never saw. So `-p` was not
135
+ # agentic at all — no rounds, no tool results fed back, no loop
136
+ # guard, no acceptance gate. Every non-interactive user (CI, a
137
+ # pipe, the eval harness) got a chat reply where the REPL would
138
+ # have done the work.
139
+ #
140
+ # run_chat_via_runtime is the documented single entry point and
141
+ # already handles provider selection and cloud→Ollama fallback,
142
+ # which is what the two branches here were open-coding.
143
+ from aria_code.apps.cli.providers.runtime_bridge import run_chat_via_runtime
144
+
145
+ _turn = await run_chat_via_runtime(
146
+ prompt=prompt, history=[],
147
+ local_tools=LOCAL_TOOLS, tool_schemas=LOCAL_TOOL_SCHEMAS,
148
+ model=model, config=self.config, api_url=self.api_url,
149
+ ollama_url=self.config.get("ollama_url", "http://localhost:11434"),
150
+ thinking_mode=thinking_mode, user_context=user_context,
151
+ auth_token=auth_token, project_context=_PROJECT_CONTEXT,
152
+ max_rounds=int(self.config.get("max_rounds", 30) or 30),
153
+ # No approval UI exists in headless mode. Leaving the confirm
154
+ # set populated would block every write on a prompt nobody is
155
+ # there to answer; the operator opts in with
156
+ # --dangerously-skip-permissions or --allow-tools.
157
+ confirm_tools=(
158
+ frozenset() if _auto_approve_session
159
+ else frozenset(_CONFIRM_TOOLS) - _session_always_allow
160
+ ),
161
+ on_tool_call=events.tool_started,
162
+ on_tool_result=events.tool_completed,
163
+ return_result=True,
164
+ )
165
+ _tools_used = list(getattr(_turn.final, "tools", []) or [])
166
+ # An empty closing message after the tools already ran is not a
167
+ # failed turn. The model did the work and then said nothing;
168
+ # exiting 1 there told a script the task failed while the edit
169
+ # sat finished on disk. Narrow on purpose — any other error,
170
+ # and a turn that ran no tools at all, still fails.
171
+ _empty_after_work = (
172
+ _turn.error == "empty_response" and bool(_tools_used)
173
+ )
174
+ result = {
175
+ "success": _turn.ok or _empty_after_work,
176
+ "response": (
177
+ _turn.text
178
+ or (f"(模型未给出收尾说明。已执行的工具:{', '.join(_tools_used)})"
179
+ if _empty_after_work else "")
180
+ ),
181
+ "error": "" if _empty_after_work else (_turn.error or ""),
182
+ "provider": getattr(_turn.final, "provider", ""),
183
+ "tools_used": _tools_used,
184
+ "acceptance": getattr(_turn.final, "acceptance", None),
185
+ }
186
+ finally:
187
+ if _prompt_spinner is not None:
188
+ try:
189
+ _prompt_spinner.__exit__(None, None, None)
190
+ except Exception:
191
+ pass
192
+
193
+ return result
194
+
195
+ def _finish_prompt(self, result: dict, *, json_output: bool, fmt: str, output_file,
196
+ quiet: bool, machine_out, events) -> None:
197
+ """Print or save run_prompt's result, and exit 1 if it failed."""
198
+ from aria_code.apps.cli.exec_events import json_safe
199
+ result = result or {"success": False, "response": "", "error": "no result"}
200
+ # The agent loop executes tools now, so there is nothing left over to
201
+ # run here — only stream_provider_result ever populated
202
+ # tool_calls_pending, and the deterministic chain never does. Keeping
203
+ # the old pass would risk running a write twice.
204
+ #
205
+ # What is worth surfacing instead is the acceptance verdict: in headless
206
+ # mode nobody watched the run, so a turn that changed files and failed
207
+ # its checks must say so on stderr rather than print a confident summary
208
+ # and exit 0.
209
+ _acceptance = (result or {}).get("acceptance") or {}
210
+ if _acceptance.get("verified") is False and not quiet:
211
+ _zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
212
+ print(f"⚠ {'验收未通过' if _zh else 'Checks failed'}: {_acceptance.get('headline', '')}",
213
+ file=sys.stderr)
214
+
215
+ events.emit("turn.completed", **json_safe(result))
216
+ out = machine_out or sys.stdout
217
+ if fmt == "jsonl":
218
+ content = None # the events were the output
219
+ elif json_output or fmt == "json":
220
+ content = json.dumps(json_safe(result), ensure_ascii=False, indent=2)
221
+ elif fmt == "csv":
222
+ content = f"role,content\nassistant,\"{result.get('response', '').replace(chr(34), chr(34)+chr(34))}\""
223
+ elif fmt == "md":
224
+ content = f"# Aria Code AI Response\n\n{result.get('response', '')}\n"
225
+ else:
226
+ content = result.get("response", "") if result.get("success") else f"Error: {result.get('error', 'Unknown')}"
227
+
228
+ # Output routing
229
+ if content is None or (fmt == "table" and not json_output and result.get("command") and not content):
230
+ pass # jsonl, or a command that printed its own output
231
+ elif output_file:
232
+ with open(output_file, "w") as f:
233
+ f.write(content)
234
+ if not quiet:
235
+ console.print(f"[green]Saved to {output_file}[/green]" if HAS_RICH
236
+ else f"Saved: {output_file}")
237
+ elif not result.get("success") and fmt == "table" and not json_output:
238
+ print(f"Error: {result.get('error', 'Unknown')}", file=sys.stderr)
239
+ # In default (table) format: render with Rich Markdown when output is
240
+ # a terminal. This gives properly formatted headings, bold, and tables
241
+ # in interactive use. When piped/redirected, fall back to plain text
242
+ # for scripting compatibility.
243
+ elif HAS_RICH and fmt == "table" and not json_output and sys.stdout.isatty() and result.get("success"):
244
+ console.print(make_markdown(_strip_latex(content)))
245
+ else:
246
+ print(content, file=out, flush=True)
247
+ # A failed turn exits 1 in every format. Only table did; with --json a
248
+ # script got exit 0 and had to read the body to learn it had failed.
249
+ if not result.get("success"):
250
+ sys.exit(1)
251
+
252
+ async def run_watch(self, command_fn, interval: int, cmd_args: str):
253
+ """Run a command repeatedly with interval (like Unix watch)."""
254
+ try:
255
+ while True:
256
+ if not self.config.get("_quiet"):
257
+ os.system("clear" if os.name == "posix" else "cls")
258
+ ts = datetime.now().strftime("%H:%M:%S")
259
+ if HAS_RICH:
260
+ console.print(f"[dim]Every {interval}s | {ts} | Ctrl+C to stop[/dim]\n")
261
+ else:
262
+ print(f"Every {interval}s | {ts} | Ctrl+C to stop\n")
263
+
264
+ await command_fn(cmd_args)
265
+
266
+ await asyncio.sleep(interval)
267
+ except (KeyboardInterrupt, asyncio.CancelledError):
268
+ if HAS_RICH:
269
+ console.print("\n[dim]Watch stopped[/dim]")
270
+ else:
271
+ print("\nStopped")
272
+
273
+
274
+ def bind_to(namespace: dict) -> type:
275
+ """A copy of HeadlessMixin whose methods resolve bare names in ``namespace``."""
276
+ methods = {}
277
+ for name, attr in vars(HeadlessMixin).items():
278
+ if isinstance(attr, types.FunctionType):
279
+ bound = types.FunctionType(attr.__code__, namespace, attr.__name__,
280
+ attr.__defaults__, attr.__closure__)
281
+ bound.__kwdefaults__ = attr.__kwdefaults__
282
+ bound.__doc__ = attr.__doc__
283
+ bound.__qualname__ = f"ArtheraTerminal.{attr.__name__}"
284
+ methods[name] = bound
285
+ return type("HeadlessMixin", (), {"__doc__": HeadlessMixin.__doc__, "__module__": __name__, **methods})
286
+
287
+
288
+ __all__ = ["HeadlessMixin", "bind_to"]