aria-code 0.95.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.95.0/src/aria_code.egg-info → aria_code-0.96.0}/PKG-INFO +1 -1
  2. {aria_code-0.95.0 → aria_code-0.96.0}/pyproject.toml +1 -1
  3. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/core_cmds.py +9 -2
  5. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +4 -2
  6. aria_code-0.96.0/src/aria_code/apps/cli/headless.py +288 -0
  7. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_cli.py +6 -253
  8. {aria_code-0.95.0 → aria_code-0.96.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  9. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/SOURCES.txt +3 -0
  10. aria_code-0.96.0/tests/test_headless_module.py +46 -0
  11. aria_code-0.96.0/tests/test_terminal_snapshots.py +229 -0
  12. {aria_code-0.95.0 → aria_code-0.96.0}/LICENSE +0 -0
  13. {aria_code-0.95.0 → aria_code-0.96.0}/NOTICE +0 -0
  14. {aria_code-0.95.0 → aria_code-0.96.0}/README.md +0 -0
  15. {aria_code-0.95.0 → aria_code-0.96.0}/setup.cfg +0 -0
  16. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/__init__.py +0 -0
  17. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/__init__.py +0 -0
  18. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  19. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  20. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  21. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  22. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/__init__.py +0 -0
  23. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/base.py +0 -0
  24. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/code_review.py +0 -0
  25. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/__init__.py +0 -0
  26. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  27. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/critic.py +0 -0
  28. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/deepen.py +0 -0
  29. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/models.py +0 -0
  30. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  31. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  32. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/themes.py +0 -0
  33. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/tiers.py +0 -0
  34. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  35. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/coder.py +0 -0
  36. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/tester.py +0 -0
  37. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/__init__.py +0 -0
  38. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  39. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  40. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  41. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/debate.py +0 -0
  42. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/earnings.py +0 -0
  43. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  44. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/macro.py +0 -0
  45. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/news.py +0 -0
  46. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/risk.py +0 -0
  47. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/sector.py +0 -0
  48. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/strategist.py +0 -0
  49. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  50. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  51. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/technical.py +0 -0
  52. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/orchestrator.py +0 -0
  53. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  54. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/__init__.py +0 -0
  55. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  56. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/business_match.py +0 -0
  57. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  58. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  59. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  60. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  61. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  62. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  63. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  64. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/registry.py +0 -0
  65. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/signal_scheme.py +0 -0
  66. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/sports/__init__.py +0 -0
  67. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  68. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/supervisor.py +0 -0
  69. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/team.py +0 -0
  70. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  71. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  72. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  73. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  74. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  75. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  76. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  77. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  78. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  79. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  80. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  81. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aliyun_data_client.py +0 -0
  82. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/README.md +0 -0
  83. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/__init__.py +0 -0
  84. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/README.md +0 -0
  85. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/__init__.py +0 -0
  86. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/approvals.py +0 -0
  87. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/conversation.py +0 -0
  88. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/digest.py +0 -0
  89. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/intake.py +0 -0
  90. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/registry.py +0 -0
  91. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  92. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/README.md +0 -0
  93. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/__init__.py +0 -0
  94. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/_optional.py +0 -0
  95. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  96. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  97. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  98. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  99. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  100. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  101. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  102. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  103. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  104. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  105. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  106. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  107. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  108. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  109. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  110. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  111. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  112. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  113. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  114. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  115. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  116. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  117. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  118. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  119. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  120. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  121. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  122. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  123. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  124. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  125. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  126. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  127. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  128. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  129. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  130. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  131. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  132. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  133. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  134. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/config_store.py +0 -0
  135. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/constants.py +0 -0
  136. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/context.py +0 -0
  137. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  138. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/direct.py +0 -0
  139. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/exec_events.py +0 -0
  140. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  141. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  142. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  143. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/google_login.py +0 -0
  144. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  145. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  146. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  147. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  148. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  149. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  150. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  151. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/helpers.py +0 -0
  152. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/hooks.py +0 -0
  153. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/i18n.py +0 -0
  154. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent.py +0 -0
  155. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  156. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  157. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  158. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  159. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/main.py +0 -0
  160. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  161. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  162. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  163. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  164. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  165. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  166. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  167. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  168. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  169. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/preflight.py +0 -0
  170. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  171. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  172. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  173. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  174. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  175. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  176. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  177. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  178. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  179. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  180. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  181. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  182. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  183. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  184. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  185. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  186. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  187. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  188. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  189. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  190. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  191. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  192. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  193. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_export.py +0 -0
  194. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  195. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_store.py +0 -0
  196. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  197. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  198. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  199. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  200. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  201. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  202. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  203. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  204. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  205. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  206. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  207. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  208. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  209. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  210. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/update_check.py +0 -0
  211. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/updater.py +0 -0
  212. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  213. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  214. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/workspace_route.py +0 -0
  215. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/daemon/README.md +0 -0
  216. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/vscode/README.md +0 -0
  217. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/vscode/package.json +0 -0
  218. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_daemon.py +0 -0
  219. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_feishu_bot.py +0 -0
  220. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_mcp_server.py +0 -0
  221. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_relay_client.py +0 -0
  222. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_relay_server.py +0 -0
  223. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_telegram_bot.py +0 -0
  224. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ariarc.py +0 -0
  225. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/artifacts.py +0 -0
  226. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/backtest_engine.py +0 -0
  227. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/backtest_report.py +0 -0
  228. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/__init__.py +0 -0
  229. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/automation.py +0 -0
  230. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/base.py +0 -0
  231. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/capabilities.py +0 -0
  232. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  233. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  234. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  235. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  236. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  237. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  238. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/config.py +0 -0
  239. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  240. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  241. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  242. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  243. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  244. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/paper_broker.py +0 -0
  245. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/planning.py +0 -0
  246. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/registry.py +0 -0
  247. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/trading.py +0 -0
  248. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/canva_client.py +0 -0
  249. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/change_store.py +0 -0
  250. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/__init__.py +0 -0
  251. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  252. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  253. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/canva_client.py +0 -0
  254. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/figma_client.py +0 -0
  255. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/football_data_client.py +0 -0
  256. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/kling_video_client.py +0 -0
  257. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/market_data_client.py +0 -0
  258. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/openai_image_client.py +0 -0
  259. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/runway_video_client.py +0 -0
  260. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  261. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/cloud_memory.py +0 -0
  262. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/command_safety.py +0 -0
  263. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/computer_use_tools.py +0 -0
  264. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/dashboard_generator.py +0 -0
  265. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/data_analysis_tools.py +0 -0
  266. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/data_cleaner.py +0 -0
  267. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/data_service.py +0 -0
  268. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/__init__.py +0 -0
  269. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/base.py +0 -0
  270. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/router.py +0 -0
  271. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  272. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  273. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  274. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  275. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  276. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  277. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  278. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  279. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  280. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  281. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/demo_player.py +0 -0
  282. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/doctor.py +0 -0
  283. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/__init__.py +0 -0
  284. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/backtest_engine.py +0 -0
  285. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/backtest_report.py +0 -0
  286. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/finance_formulas.py +0 -0
  287. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  288. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/strategy_vault.py +0 -0
  289. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/evals/__init__.py +0 -0
  290. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/evals/harness.py +0 -0
  291. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/evals/runner.py +0 -0
  292. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/external_agent_runner.py +0 -0
  293. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/figma_client.py +0 -0
  294. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/file_analysis_tools.py +0 -0
  295. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/finance_formulas.py +0 -0
  296. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/football_data_client.py +0 -0
  297. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/image_gen_tools.py +0 -0
  298. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/intent_classifier.py +0 -0
  299. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/kling_video_client.py +0 -0
  300. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/licensing.py +0 -0
  301. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/local_finance_tools.py +0 -0
  302. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/local_image_provider.py +0 -0
  303. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/local_llm_provider.py +0 -0
  304. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/macro_tools.py +0 -0
  305. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/markdown_pdf.py +0 -0
  306. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/market_data_client.py +0 -0
  307. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/mcp_client.py +0 -0
  308. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/memory_manager.py +0 -0
  309. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/model_capability.py +0 -0
  310. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/notification_tools.py +0 -0
  311. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/openai_image_client.py +0 -0
  312. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/__init__.py +0 -0
  313. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  314. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  315. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  316. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  317. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  318. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  319. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  320. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/export.py +0 -0
  321. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  322. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  323. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  324. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  325. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  326. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  327. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  328. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  329. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  330. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  331. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  332. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  333. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  334. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  335. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  336. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  337. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  338. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  339. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  340. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  341. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  342. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/context.py +0 -0
  343. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  344. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/data.py +0 -0
  345. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  346. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/references.py +0 -0
  347. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  348. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  349. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  350. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  351. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  352. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  353. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  354. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  355. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  356. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  357. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  358. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  359. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  360. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  361. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  362. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  363. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  364. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  365. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  366. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  367. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  368. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  369. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  370. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  371. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  372. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  373. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  374. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  375. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  376. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  377. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  378. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  379. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  380. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  381. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  382. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  383. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  384. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  385. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  386. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  387. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/__init__.py +0 -0
  388. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/base.py +0 -0
  389. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/finance/__init__.py +0 -0
  390. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  391. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/payments/__init__.py +0 -0
  392. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/realty/__init__.py +0 -0
  393. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/registry.py +0 -0
  394. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/rules.py +0 -0
  395. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/plan_utils.py +0 -0
  396. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/plugin_loader.py +0 -0
  397. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/portfolio_ledger.py +0 -0
  398. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/preview_server.py +0 -0
  399. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/privacy/__init__.py +0 -0
  400. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/privacy/feedback.py +0 -0
  401. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_review.py +0 -0
  402. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_review_api.py +0 -0
  403. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_review_server.py +0 -0
  404. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_tools.py +0 -0
  405. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/__init__.py +0 -0
  406. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/__init__.py +0 -0
  407. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  408. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  409. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/base.py +0 -0
  410. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/custom.py +0 -0
  411. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/ollama.py +0 -0
  412. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  413. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/registry.py +0 -0
  414. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/local_image_provider.py +0 -0
  415. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  416. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/tool_messages.py +0 -0
  417. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/realty_data_tools.py +0 -0
  418. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/relay_store.py +0 -0
  419. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/report_exporters.py +0 -0
  420. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/report_generator.py +0 -0
  421. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/review_service.py +0 -0
  422. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/__init__.py +0 -0
  423. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/acceptance.py +0 -0
  424. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/agent_loop.py +0 -0
  425. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/approval.py +0 -0
  426. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/budget.py +0 -0
  427. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/checkpoints.py +0 -0
  428. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/crash_report.py +0 -0
  429. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/events.py +0 -0
  430. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/gateway.py +0 -0
  431. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/lsp.py +0 -0
  432. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/orchestrator.py +0 -0
  433. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/processes.py +0 -0
  434. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/repo_map.py +0 -0
  435. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/run_state.py +0 -0
  436. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/run_store.py +0 -0
  437. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/self_healing.py +0 -0
  438. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/subagent.py +0 -0
  439. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/task_ledger.py +0 -0
  440. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  441. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/tool_executor.py +0 -0
  442. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/tool_policy.py +0 -0
  443. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/worktrees.py +0 -0
  444. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runway_video_client.py +0 -0
  445. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/__init__.py +0 -0
  446. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/permissions.py +0 -0
  447. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/sandbox.py +0 -0
  448. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/service.py +0 -0
  449. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/setup_wizard.py +0 -0
  450. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/spreadsheet_tools.py +0 -0
  451. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/strategy_vault.py +0 -0
  452. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/__init__.py +0 -0
  453. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/artifact_tools.py +0 -0
  454. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/broker_tools.py +0 -0
  455. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  456. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  457. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  458. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  459. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  460. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/extended_tools.py +0 -0
  461. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  462. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  463. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  464. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  465. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  466. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_io.py +0 -0
  467. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  468. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_tools.py +0 -0
  469. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/macro_tools.py +0 -0
  470. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/notification_tools.py +0 -0
  471. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/project_tools.py +0 -0
  472. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  473. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  474. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/stripe_tools.py +0 -0
  475. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/__init__.py +0 -0
  476. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/banner.py +0 -0
  477. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/completer.py +0 -0
  478. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/console.py +0 -0
  479. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/image_render.py +0 -0
  480. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/input_box.py +0 -0
  481. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/mentions.py +0 -0
  482. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/picker.py +0 -0
  483. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/__init__.py +0 -0
  484. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/finance.py +0 -0
  485. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/market.py +0 -0
  486. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/output.py +0 -0
  487. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/responsive.py +0 -0
  488. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/team.py +0 -0
  489. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/robot.py +0 -0
  490. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  491. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/utils/vscode_uri.py +0 -0
  492. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/video_analysis.py +0 -0
  493. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/video_editor.py +0 -0
  494. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace/__init__.py +0 -0
  495. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace/files.py +0 -0
  496. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace/verify.py +0 -0
  497. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_changes.py +0 -0
  498. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_context.py +0 -0
  499. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_service.py +0 -0
  500. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_tools.py +0 -0
  501. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  502. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  503. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/requires.txt +0 -0
  504. {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/top_level.txt +0 -0
  505. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_adk_market_tools.py +0 -0
  506. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_agent_key_points_language.py +0 -0
  507. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_agent_team_fallback.py +0 -0
  508. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_analyze_file_tool.py +0 -0
  509. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_architecture_ledger_is_true.py +0 -0
  510. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_architecture_report.py +0 -0
  511. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_aria_cli_core.py +0 -0
  512. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_aria_mcp_server.py +0 -0
  513. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_aria_sdk.py +0 -0
  514. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_artifact_publishing.py +0 -0
  515. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_artifacts_and_reports.py +0 -0
  516. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ashare_prediction_cmds.py +0 -0
  517. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_background_processes.py +0 -0
  518. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_backtest_cmds.py +0 -0
  519. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_backtest_engine.py +0 -0
  520. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_backtest_report.py +0 -0
  521. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  522. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broken_akshare_is_optional.py +0 -0
  523. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_automation.py +0 -0
  524. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  525. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_planning.py +0 -0
  526. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_safety.py +0 -0
  527. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_tools.py +0 -0
  528. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_budget.py +0 -0
  529. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_business_workflow_cmds.py +0 -0
  530. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_canva_client.py +0 -0
  531. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_canvas_cmds.py +0 -0
  532. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_card_approvals.py +0 -0
  533. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_channel_intake.py +0 -0
  534. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_channels.py +0 -0
  535. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_chart_handlers.py +0 -0
  536. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_chat_bots_fail_closed.py +0 -0
  537. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_chat_routing.py +0 -0
  538. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ci_security_workflow.py +0 -0
  539. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_app_split.py +0 -0
  540. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_bootstrap.py +0 -0
  541. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_config_store.py +0 -0
  542. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  543. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_runtime_consumer.py +0 -0
  544. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_tool_executor_module.py +0 -0
  545. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_updater.py +0 -0
  546. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cloud_memory.py +0 -0
  547. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_code_audit_tools.py +0 -0
  548. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_code_review_agent.py +0 -0
  549. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_codegen_output.py +0 -0
  550. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_coder_tester_self_healing.py +0 -0
  551. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_coder_tool_safety.py +0 -0
  552. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_collaboration.py +0 -0
  553. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_command_loggers.py +0 -0
  554. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_command_safety.py +0 -0
  555. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_compare_strategies.py +0 -0
  556. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_completions_builder.py +0 -0
  557. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_config_paths.py +0 -0
  558. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_configured_provider.py +0 -0
  559. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_container_entrypoint.py +0 -0
  560. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_container_entrypoints.py +0 -0
  561. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_context_checkpoints.py +0 -0
  562. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_context_references.py +0 -0
  563. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_context_service.py +0 -0
  564. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_conversation_core.py +0 -0
  565. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_crash_report.py +0 -0
  566. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_credential_file_permissions.py +0 -0
  567. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_custom_providers.py +0 -0
  568. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_daemon_gateway_config.py +0 -0
  569. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_dashboard_generator.py +0 -0
  570. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_data_service.py +0 -0
  571. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_data_service_imports.py +0 -0
  572. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_data_without_model.py +0 -0
  573. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_datasource_routing.py +0 -0
  574. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_deep_analysis.py +0 -0
  575. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_degrades_without_quant_engine.py +0 -0
  576. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  577. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_doctor.py +0 -0
  578. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  579. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_doctor_npm_scope.py +0 -0
  580. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_edit_and_command_safety.py +0 -0
  581. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_engine_boundary.py +0 -0
  582. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_enterprise_tool_honesty.py +0 -0
  583. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_env_switch_docs.py +0 -0
  584. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_evals_harness.py +0 -0
  585. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_event_import_roots.py +0 -0
  586. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_exec_events.py +0 -0
  587. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_extended_tools.py +0 -0
  588. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_feishu_swarm_config.py +0 -0
  589. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_file_links.py +0 -0
  590. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_finalize_release.py +0 -0
  591. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_finance_renderers.py +0 -0
  592. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_finance_service_catalog.py +0 -0
  593. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_first_run_output.py +0 -0
  594. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_first_run_works.py +0 -0
  595. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_football_agent.py +0 -0
  596. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_football_prediction_output.py +0 -0
  597. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_cloud_models.py +0 -0
  598. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_cloud_routing.py +0 -0
  599. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_login.py +0 -0
  600. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_search_provider.py +0 -0
  601. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_headless_is_agentic.py +0 -0
  602. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_honest_surfaces.py +0 -0
  603. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_image_gen_tools.py +0 -0
  604. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_image_inputs.py +0 -0
  605. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_import_graph_budget.py +0 -0
  606. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_intent_router.py +0 -0
  607. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_intent_signals.py +0 -0
  608. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_kling_video_client.py +0 -0
  609. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_lazy_rebind.py +0 -0
  610. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_legacy_module_imports.py +0 -0
  611. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_license_consistency.py +0 -0
  612. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_licensing.py +0 -0
  613. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_local_image_provider.py +0 -0
  614. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_logistics_3pl.py +0 -0
  615. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_logistics_and_finance_agents.py +0 -0
  616. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_lsp.py +0 -0
  617. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_markdown_pdf.py +0 -0
  618. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_answers_in_english.py +0 -0
  619. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_data_client.py +0 -0
  620. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_history_inheritance.py +0 -0
  621. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_history_tool.py +0 -0
  622. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_hours.py +0 -0
  623. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_questions_on_backend.py +0 -0
  624. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_symbol_extraction.py +0 -0
  625. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_universe.py +0 -0
  626. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_mcp_circuit.py +0 -0
  627. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_mcp_client.py +0 -0
  628. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_mentions.py +0 -0
  629. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_model_capability_registry.py +0 -0
  630. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_model_choice_is_the_users.py +0 -0
  631. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_model_selection_state.py +0 -0
  632. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_narrow_chinese_output.py +0 -0
  633. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_native_binary_entrypoints.py +0 -0
  634. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_native_installer.py +0 -0
  635. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_natural_language_routing.py +0 -0
  636. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_new_modules.py +0 -0
  637. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  638. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_no_tools_route.py +0 -0
  639. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_no_uncommitted_imports.py +0 -0
  640. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_numeric_listings.py +0 -0
  641. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ollama_stream_imports.py +0 -0
  642. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ollama_stream_tools.py +0 -0
  643. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_openai_image_client.py +0 -0
  644. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_operations_suite.py +0 -0
  645. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_os_sandbox.py +0 -0
  646. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_output_rendering.py +0 -0
  647. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packages_facade.py +0 -0
  648. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packaging_constraints.py +0 -0
  649. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packaging_manifest.py +0 -0
  650. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packs_domains.py +0 -0
  651. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_pdf_report.py +0 -0
  652. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_pick_best_installed_model.py +0 -0
  653. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_plan_mode.py +0 -0
  654. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_platform_package_assembly.py +0 -0
  655. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_platform_packages.py +0 -0
  656. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_platform_publish.py +0 -0
  657. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_plotly_html_output.py +0 -0
  658. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_portfolio_language.py +0 -0
  659. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_portfolio_ledger.py +0 -0
  660. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_post_turn_context_decision.py +0 -0
  661. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_preflight.py +0 -0
  662. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_preview_server.py +0 -0
  663. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_privacy_feedback.py +0 -0
  664. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_aria.py +0 -0
  665. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_context_files.py +0 -0
  666. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_review.py +0 -0
  667. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_review_api.py +0 -0
  668. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_prompt_assembly.py +0 -0
  669. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_prompt_selection.py +0 -0
  670. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_autoconfig.py +0 -0
  671. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_error_messages.py +0 -0
  672. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_integration.py +0 -0
  673. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_registry.py +0 -0
  674. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_public_service_status.py +0 -0
  675. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_quant_engine_namespace.py +0 -0
  676. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_rebind_contract.py +0 -0
  677. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_rebind_namespace_contract.py +0 -0
  678. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_client_credentials.py +0 -0
  679. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_event_verification.py +0 -0
  680. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_sends_for_clients.py +0 -0
  681. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_store.py +0 -0
  682. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_url.py +0 -0
  683. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_chain.py +0 -0
  684. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_commit_identity.py +0 -0
  685. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_push_is_atomic.py +0 -0
  686. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_reaches_the_registries.py +0 -0
  687. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_verification_waits.py +0 -0
  688. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_workflow_permissions.py +0 -0
  689. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_report_charts.py +0 -0
  690. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_report_generator.py +0 -0
  691. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_research_protocol.py +0 -0
  692. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_research_quality.py +0 -0
  693. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_responsive_rendering.py +0 -0
  694. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_review_service.py +0 -0
  695. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_root_module_budget.py +0 -0
  696. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  697. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_acceptance.py +0 -0
  698. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_agent_loop.py +0 -0
  699. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_approval.py +0 -0
  700. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_bridge.py +0 -0
  701. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_bridge_fallback.py +0 -0
  702. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_checkpoints.py +0 -0
  703. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_event_identity.py +0 -0
  704. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_gateway.py +0 -0
  705. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_repo_map.py +0 -0
  706. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_run_store.py +0 -0
  707. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_tool_executor.py +0 -0
  708. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_worktrees.py +0 -0
  709. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runway_video_client.py +0 -0
  710. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_safety_permissions.py +0 -0
  711. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_safety_service.py +0 -0
  712. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_safety_service_adoption.py +0 -0
  713. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_service_diagnostics_security.py +0 -0
  714. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_session_search.py +0 -0
  715. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_settings_service.py +0 -0
  716. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_shell_commands_as_written.py +0 -0
  717. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_shipper_digest.py +0 -0
  718. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_single_import_root.py +0 -0
  719. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_skill_agent_binding.py +0 -0
  720. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_skill_catalog.py +0 -0
  721. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_skill_loader.py +0 -0
  722. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_slash_popup.py +0 -0
  723. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_spreadsheet_tools.py +0 -0
  724. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_sse_stream_contract.py +0 -0
  725. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_startup_dashboard.py +0 -0
  726. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_startup_latency.py +0 -0
  727. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_status_language.py +0 -0
  728. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_streaming_pipeline.py +0 -0
  729. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_stripe_agent.py +0 -0
  730. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_subagent.py +0 -0
  731. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_supervisor_routing.py +0 -0
  732. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_system_prompts.py +0 -0
  733. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_system_tools_output.py +0 -0
  734. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_task_orchestrator.py +0 -0
  735. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_team_analysts.py +0 -0
  736. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_team_synthesis.py +0 -0
  737. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tls_trust_store.py +0 -0
  738. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_policy.py +0 -0
  739. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  740. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_scope.py +0 -0
  741. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_step_output.py +0 -0
  742. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_trading_service.py +0 -0
  743. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tradingview_bridge.py +0 -0
  744. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_turn_planning.py +0 -0
  745. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_completer_references.py +0 -0
  746. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_console_theme.py +0 -0
  747. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_input_box.py +0 -0
  748. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_language_and_model.py +0 -0
  749. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_robot_banner.py +0 -0
  750. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_update_health_routes.py +0 -0
  751. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_verification_hint.py +0 -0
  752. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_verification_policy.py +0 -0
  753. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_version_consistency.py +0 -0
  754. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_version_counter.py +0 -0
  755. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_video_analysis.py +0 -0
  756. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_video_editor.py +0 -0
  757. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_vscode_mcp.py +0 -0
  758. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_agents.py +0 -0
  759. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_cli_registration.py +0 -0
  760. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_erp_client.py +0 -0
  761. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_workflow.py +0 -0
  762. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_wheel_is_installable.py +0 -0
  763. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_changes.py +0 -0
  764. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_context.py +0 -0
  765. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_files.py +0 -0
  766. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_scope.py +0 -0
  767. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_service.py +0 -0
  768. {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_verify.py +0 -0
  769. {aria_code-0.95.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.95.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.95.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.95.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")
@@ -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)
@@ -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"]
@@ -3999,8 +3999,13 @@ class SlashCommands(
3999
3999
  # ============================================================================
4000
4000
 
4001
4001
  from aria_code.apps.cli.context import AriaContext
4002
+ from aria_code.apps.cli.headless import bind_to as _bind_headless
4002
4003
 
4003
- class ArtheraTerminal:
4004
+ # -p and --watch live in apps/cli/headless.py, bound to this module's names.
4005
+ _HeadlessMixin = _bind_headless(globals())
4006
+
4007
+
4008
+ class ArtheraTerminal(_HeadlessMixin):
4004
4009
  """Interactive REPL inspired by Claude Code CLI."""
4005
4010
 
4006
4011
  def __init__(self, config: dict):
@@ -6482,258 +6487,6 @@ class ArtheraTerminal:
6482
6487
 
6483
6488
  save_config(self.config)
6484
6489
 
6485
- async def run_prompt(self, prompt: str, json_output: bool = False,
6486
- fmt: str = "table", output_file: str = None, quiet: bool = False,
6487
- machine_out=None):
6488
- """Run a single prompt (non-interactive / pipe mode).
6489
-
6490
- ``machine_out`` is the real stdout when the output is JSON (sys.stdout
6491
- then points at stderr). With fmt "jsonl" each step is written there as
6492
- one JSON event per line as it happens.
6493
- """
6494
- from aria_code.apps.cli.exec_events import ExecEvents, json_safe
6495
- events = ExecEvents(machine_out if fmt == "jsonl" else None)
6496
- events.emit("turn.started", prompt=prompt, model=self.config.get("model", ""))
6497
- result = await self._run_prompt_turn(prompt, quiet=quiet, events=events)
6498
- self._finish_prompt(result, json_output=json_output, fmt=fmt, output_file=output_file,
6499
- quiet=quiet, machine_out=machine_out, events=events)
6500
-
6501
- async def _run_prompt_turn(self, prompt: str, *, quiet: bool, events) -> dict:
6502
- """The work of run_prompt: a slash command, a deterministic answer, or an agent turn."""
6503
- model = self.config.get("model", "qwen2.5:7b")
6504
- thinking_mode = self.config.get("thinking_mode", "auto")
6505
- auth_token = self.config.get("auth_token")
6506
- user_context = _build_user_context(self.config)
6507
-
6508
- local_mode = self.config.get("local_mode", False)
6509
-
6510
- # Dispatch slash commands in -p mode (same as interactive REPL loop).
6511
- # Without this, /memory /note /init /review are sent to the LLM as plain text.
6512
- _stripped_prompt = prompt.strip()
6513
- if self.commands.is_command(_stripped_prompt):
6514
- self._maybe_show_intent_preflight(_stripped_prompt, quiet=quiet)
6515
- await self.commands.execute(_stripped_prompt)
6516
- return {"success": True, "command": _stripped_prompt.split()[0], "response": ""}
6517
-
6518
- _reference_context = ""
6519
- _reference_service = getattr(self, "_reference_service", None)
6520
- if _reference_service is not None and "@" in prompt:
6521
- _prepared_references = _reference_service.prepare(prompt)
6522
- if _prepared_references.errors:
6523
- self._print_reference_errors(_prepared_references)
6524
- return {"success": False, "response": "", "error": "unresolved @ reference"}
6525
- if _prepared_references.references:
6526
- self._print_reference_summary(_prepared_references)
6527
- prompt = _prepared_references.expanded_text
6528
- _reference_context = _prepared_references.context_block
6529
-
6530
- # Keep referenced local files as pointers; the model reads them through
6531
- # audited tools instead of silently embedding their contents.
6532
- if _reference_context:
6533
- prompt = f"{prompt}\n\n{_reference_context}"
6534
- else:
6535
- _file_tool_hint = _build_file_tool_hint(prompt)
6536
- if _file_tool_hint:
6537
- prompt = _file_tool_hint + prompt
6538
- self._maybe_show_intent_preflight(prompt, quiet=quiet)
6539
-
6540
- _curr_model_id_p = self.config.get("model", "")
6541
- # The route counts as much as the model: on backend_chat the model gets
6542
- # no local tools whatever it could do with them. This only looked at the
6543
- # model, so the deterministic chain skipped its data pre-fetch there.
6544
- from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools
6545
- _model_has_tools_p = route_has_tools(_curr_model_id_p, self.config, self.api_url)
6546
-
6547
- # ── Broker guide intent: broad discovery should not start an add wizard ──
6548
- if _is_broker_guide_intent(prompt):
6549
- if HAS_RICH:
6550
- console.print("\n[bold]Aria[/bold] [dim] 正在打开券商与服务指南…[/dim]\n")
6551
- await self.commands.cmd_broker("guide")
6552
- await self.commands.cmd_broker("services")
6553
- await self.commands.cmd_packages("services")
6554
- return {"success": True, "command": "/broker guide", "response": ""}
6555
-
6556
- # ── Broker setup intent: intercept before LLM / deterministic routing ──
6557
- if _is_broker_setup_intent(prompt):
6558
- _btype_p = _detect_broker_type(prompt)
6559
- if HAS_RICH:
6560
- from apps.cli.utils.market_detect import _BROKER_SETUP_NAMES
6561
- _display_p = _BROKER_SETUP_NAMES.get(_btype_p, ("",))[0] if _btype_p else ""
6562
- _label_p = f" 正在启动{_display_p}配置向导…" if _display_p else " 正在启动券商配置向导…"
6563
- console.print(f"\n[bold]Aria[/bold] [dim]{_label_p}[/dim]\n")
6564
- await self.commands._cmd_broker_add(_btype_p)
6565
- return {"success": True, "command": "/broker add", "response": ""}
6566
-
6567
- # ── Football prediction intercept → built-in Poisson handler ──────────
6568
- if await self._try_football_nl_intercept(prompt):
6569
- return {"success": True, "command": "football", "response": ""}
6570
-
6571
- deterministic = _run_deterministic_chain(
6572
- prompt, model_has_tools=_model_has_tools_p)
6573
- if deterministic.get("success") or _is_stock_chart_analysis_request(prompt):
6574
- result = deterministic
6575
- else:
6576
- # No one reads a headless answer before a script acts on it. A task
6577
- # about this folder on a model that cannot open it would come back as
6578
- # a confident guess with exit 0; fail before sending it instead.
6579
- if not _model_has_tools_p and needs_workspace(prompt):
6580
- _zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
6581
- _why = no_tools_message(self.config, lang="zh" if _zh else "en")
6582
- print(_why, file=sys.stderr)
6583
- return {"success": False, "response": "", "error": "model_cannot_use_tools", "detail": _why}
6584
- # Spinner for terminal usage: gives visual feedback while the model generates.
6585
- # Only starts when we actually need to call the LLM (not for deterministic responses).
6586
- _prompt_spinner = None
6587
- if HAS_RICH and sys.stdout.isatty():
6588
- try:
6589
- _prompt_spinner = console.status("", spinner="dots", spinner_style="dim")
6590
- _prompt_spinner.__enter__()
6591
- except Exception:
6592
- _prompt_spinner = None
6593
- try:
6594
- # Headless -p runs the SAME loop as the REPL.
6595
- #
6596
- # It used to call stream_provider_result directly: one provider
6597
- # round, tool schemas advertised but nothing executing what came
6598
- # back, and a single best-effort pass over tool_calls_pending
6599
- # afterwards whose results the model never saw. So `-p` was not
6600
- # agentic at all — no rounds, no tool results fed back, no loop
6601
- # guard, no acceptance gate. Every non-interactive user (CI, a
6602
- # pipe, the eval harness) got a chat reply where the REPL would
6603
- # have done the work.
6604
- #
6605
- # run_chat_via_runtime is the documented single entry point and
6606
- # already handles provider selection and cloud→Ollama fallback,
6607
- # which is what the two branches here were open-coding.
6608
- from aria_code.apps.cli.providers.runtime_bridge import run_chat_via_runtime
6609
-
6610
- _turn = await run_chat_via_runtime(
6611
- prompt=prompt, history=[],
6612
- local_tools=LOCAL_TOOLS, tool_schemas=LOCAL_TOOL_SCHEMAS,
6613
- model=model, config=self.config, api_url=self.api_url,
6614
- ollama_url=self.config.get("ollama_url", "http://localhost:11434"),
6615
- thinking_mode=thinking_mode, user_context=user_context,
6616
- auth_token=auth_token, project_context=_PROJECT_CONTEXT,
6617
- max_rounds=int(self.config.get("max_rounds", 30) or 30),
6618
- # No approval UI exists in headless mode. Leaving the confirm
6619
- # set populated would block every write on a prompt nobody is
6620
- # there to answer; the operator opts in with
6621
- # --dangerously-skip-permissions or --allow-tools.
6622
- confirm_tools=(
6623
- frozenset() if _auto_approve_session
6624
- else frozenset(_CONFIRM_TOOLS) - _session_always_allow
6625
- ),
6626
- on_tool_call=events.tool_started,
6627
- on_tool_result=events.tool_completed,
6628
- return_result=True,
6629
- )
6630
- _tools_used = list(getattr(_turn.final, "tools", []) or [])
6631
- # An empty closing message after the tools already ran is not a
6632
- # failed turn. The model did the work and then said nothing;
6633
- # exiting 1 there told a script the task failed while the edit
6634
- # sat finished on disk. Narrow on purpose — any other error,
6635
- # and a turn that ran no tools at all, still fails.
6636
- _empty_after_work = (
6637
- _turn.error == "empty_response" and bool(_tools_used)
6638
- )
6639
- result = {
6640
- "success": _turn.ok or _empty_after_work,
6641
- "response": (
6642
- _turn.text
6643
- or (f"(模型未给出收尾说明。已执行的工具:{', '.join(_tools_used)})"
6644
- if _empty_after_work else "")
6645
- ),
6646
- "error": "" if _empty_after_work else (_turn.error or ""),
6647
- "provider": getattr(_turn.final, "provider", ""),
6648
- "tools_used": _tools_used,
6649
- "acceptance": getattr(_turn.final, "acceptance", None),
6650
- }
6651
- finally:
6652
- if _prompt_spinner is not None:
6653
- try:
6654
- _prompt_spinner.__exit__(None, None, None)
6655
- except Exception:
6656
- pass
6657
-
6658
- return result
6659
-
6660
- def _finish_prompt(self, result: dict, *, json_output: bool, fmt: str, output_file,
6661
- quiet: bool, machine_out, events) -> None:
6662
- """Print or save run_prompt's result, and exit 1 if it failed."""
6663
- from aria_code.apps.cli.exec_events import json_safe
6664
- result = result or {"success": False, "response": "", "error": "no result"}
6665
- # The agent loop executes tools now, so there is nothing left over to
6666
- # run here — only stream_provider_result ever populated
6667
- # tool_calls_pending, and the deterministic chain never does. Keeping
6668
- # the old pass would risk running a write twice.
6669
- #
6670
- # What is worth surfacing instead is the acceptance verdict: in headless
6671
- # mode nobody watched the run, so a turn that changed files and failed
6672
- # its checks must say so on stderr rather than print a confident summary
6673
- # and exit 0.
6674
- _acceptance = (result or {}).get("acceptance") or {}
6675
- if _acceptance.get("verified") is False and not quiet:
6676
- _zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
6677
- print(f"⚠ {'验收未通过' if _zh else 'Checks failed'}: {_acceptance.get('headline', '')}",
6678
- file=sys.stderr)
6679
-
6680
- events.emit("turn.completed", **json_safe(result))
6681
- out = machine_out or sys.stdout
6682
- if fmt == "jsonl":
6683
- content = None # the events were the output
6684
- elif json_output or fmt == "json":
6685
- content = json.dumps(json_safe(result), ensure_ascii=False, indent=2)
6686
- elif fmt == "csv":
6687
- content = f"role,content\nassistant,\"{result.get('response', '').replace(chr(34), chr(34)+chr(34))}\""
6688
- elif fmt == "md":
6689
- content = f"# Aria Code AI Response\n\n{result.get('response', '')}\n"
6690
- else:
6691
- content = result.get("response", "") if result.get("success") else f"Error: {result.get('error', 'Unknown')}"
6692
-
6693
- # Output routing
6694
- if content is None or (fmt == "table" and not json_output and result.get("command") and not content):
6695
- pass # jsonl, or a command that printed its own output
6696
- elif output_file:
6697
- with open(output_file, "w") as f:
6698
- f.write(content)
6699
- if not quiet:
6700
- console.print(f"[green]Saved to {output_file}[/green]" if HAS_RICH
6701
- else f"Saved: {output_file}")
6702
- elif not result.get("success") and fmt == "table" and not json_output:
6703
- print(f"Error: {result.get('error', 'Unknown')}", file=sys.stderr)
6704
- # In default (table) format: render with Rich Markdown when output is
6705
- # a terminal. This gives properly formatted headings, bold, and tables
6706
- # in interactive use. When piped/redirected, fall back to plain text
6707
- # for scripting compatibility.
6708
- elif HAS_RICH and fmt == "table" and not json_output and sys.stdout.isatty() and result.get("success"):
6709
- console.print(make_markdown(_strip_latex(content)))
6710
- else:
6711
- print(content, file=out, flush=True)
6712
- # A failed turn exits 1 in every format. Only table did; with --json a
6713
- # script got exit 0 and had to read the body to learn it had failed.
6714
- if not result.get("success"):
6715
- sys.exit(1)
6716
-
6717
- async def run_watch(self, command_fn, interval: int, cmd_args: str):
6718
- """Run a command repeatedly with interval (like Unix watch)."""
6719
- try:
6720
- while True:
6721
- if not self.config.get("_quiet"):
6722
- os.system("clear" if os.name == "posix" else "cls")
6723
- ts = datetime.now().strftime("%H:%M:%S")
6724
- if HAS_RICH:
6725
- console.print(f"[dim]Every {interval}s | {ts} | Ctrl+C to stop[/dim]\n")
6726
- else:
6727
- print(f"Every {interval}s | {ts} | Ctrl+C to stop\n")
6728
-
6729
- await command_fn(cmd_args)
6730
-
6731
- await asyncio.sleep(interval)
6732
- except (KeyboardInterrupt, asyncio.CancelledError):
6733
- if HAS_RICH:
6734
- console.print("\n[dim]Watch stopped[/dim]")
6735
- else:
6736
- print("\nStopped")
6737
6490
 
6738
6491
 
6739
6492
  # ============================================================================
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.95.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