aria-code 0.106.0__tar.gz → 0.108.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 (788) hide show
  1. {aria_code-0.106.0/src/aria_code.egg-info → aria_code-0.108.0}/PKG-INFO +4 -2
  2. {aria_code-0.106.0 → aria_code-0.108.0}/README.md +3 -1
  3. {aria_code-0.106.0 → aria_code-0.108.0}/pyproject.toml +1 -1
  4. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/_version.py +1 -1
  5. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/chat_turn.py +11 -6
  6. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/headless.py +12 -8
  7. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/base.py +4 -0
  8. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/chat_routing.py +3 -9
  9. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +30 -2
  10. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +11 -6
  11. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/runtime_consumer.py +8 -0
  12. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/file_tools.py +8 -7
  13. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/system_tools.py +4 -2
  14. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/write_tools.py +7 -4
  15. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/workspace_route.py +29 -3
  16. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_cli.py +21 -1
  17. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/settings.py +4 -1
  18. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/acceptance.py +8 -5
  19. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/agent_loop.py +26 -5
  20. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/gateway.py +11 -4
  21. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/tool_executor.py +55 -8
  22. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/safety/sandbox.py +3 -2
  23. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace/files.py +32 -6
  24. {aria_code-0.106.0 → aria_code-0.108.0/src/aria_code.egg-info}/PKG-INFO +4 -2
  25. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code.egg-info/SOURCES.txt +1 -0
  26. aria_code-0.108.0/tests/test_local_workspace_execution.py +257 -0
  27. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_os_sandbox.py +22 -0
  28. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_release_chain.py +23 -2
  29. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_release_verification_waits.py +47 -21
  30. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_agent_loop.py +2 -1
  31. aria_code-0.108.0/tests/test_sse_stream_contract.py +93 -0
  32. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_tool_step_output.py +18 -4
  33. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_wheel_is_installable.py +10 -3
  34. aria_code-0.106.0/tests/test_sse_stream_contract.py +0 -32
  35. {aria_code-0.106.0 → aria_code-0.108.0}/LICENSE +0 -0
  36. {aria_code-0.106.0 → aria_code-0.108.0}/NOTICE +0 -0
  37. {aria_code-0.106.0 → aria_code-0.108.0}/setup.cfg +0 -0
  38. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/__init__.py +0 -0
  39. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/adk_apps/__init__.py +0 -0
  40. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  41. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  42. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  43. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  44. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/__init__.py +0 -0
  45. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/base.py +0 -0
  46. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/code_review.py +0 -0
  47. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/__init__.py +0 -0
  48. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  49. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/critic.py +0 -0
  50. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/deepen.py +0 -0
  51. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/models.py +0 -0
  52. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  53. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  54. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/themes.py +0 -0
  55. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/deep/tiers.py +0 -0
  56. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  57. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/engineering/coder.py +0 -0
  58. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/engineering/tester.py +0 -0
  59. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/__init__.py +0 -0
  60. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  61. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  62. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  63. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/debate.py +0 -0
  64. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/earnings.py +0 -0
  65. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  66. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/macro.py +0 -0
  67. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/news.py +0 -0
  68. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/risk.py +0 -0
  69. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/sector.py +0 -0
  70. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/strategist.py +0 -0
  71. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  72. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  73. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/financial/technical.py +0 -0
  74. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/orchestrator.py +0 -0
  75. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  76. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/__init__.py +0 -0
  77. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  78. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/business_match.py +0 -0
  79. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  80. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  81. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  82. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  83. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  84. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  85. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  86. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/registry.py +0 -0
  87. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/signal_scheme.py +0 -0
  88. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/sports/__init__.py +0 -0
  89. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  90. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/supervisor.py +0 -0
  91. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/team.py +0 -0
  92. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  93. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  94. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  95. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  96. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  97. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  98. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  99. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  100. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  101. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  102. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  103. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aliyun_data_client.py +0 -0
  104. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/README.md +0 -0
  105. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/__init__.py +0 -0
  106. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/README.md +0 -0
  107. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/__init__.py +0 -0
  108. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/approvals.py +0 -0
  109. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/conversation.py +0 -0
  110. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/digest.py +0 -0
  111. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/intake.py +0 -0
  112. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/registry.py +0 -0
  113. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  114. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/README.md +0 -0
  115. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/__init__.py +0 -0
  116. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/_optional.py +0 -0
  117. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  118. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  119. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  120. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  121. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  122. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  123. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  124. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  125. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  126. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  127. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  128. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  129. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  130. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  131. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  132. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  133. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  134. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  135. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  136. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  137. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  138. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  139. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  140. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  141. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  142. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  143. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  144. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  145. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  146. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  147. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  148. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  149. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  150. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  151. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  152. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  153. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  154. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  155. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  156. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  157. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  158. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/config_store.py +0 -0
  159. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/constants.py +0 -0
  160. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/context.py +0 -0
  161. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  162. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/direct.py +0 -0
  163. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/earnings_view.py +0 -0
  164. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/exec_events.py +0 -0
  165. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  166. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  167. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  168. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/google_login.py +0 -0
  169. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  170. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  171. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  172. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  173. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  174. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  175. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  176. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/helpers.py +0 -0
  177. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/hooks.py +0 -0
  178. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/i18n.py +0 -0
  179. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/intent.py +0 -0
  180. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  181. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  182. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  183. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  184. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/main.py +0 -0
  185. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  186. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  187. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  188. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  189. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/mixin_binding.py +0 -0
  190. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  191. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  192. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  193. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  194. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  195. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/preflight.py +0 -0
  196. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  197. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  198. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  199. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  200. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  201. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  202. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  203. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  204. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  205. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  206. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  207. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  208. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  209. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  210. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  211. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  212. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  213. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  214. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/session_export.py +0 -0
  215. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  216. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/session_store.py +0 -0
  217. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  218. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/terminal_chrome.py +0 -0
  219. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  220. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  221. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  222. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  223. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  224. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  225. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  226. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  227. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  228. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  229. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/update_check.py +0 -0
  230. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/updater.py +0 -0
  231. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  232. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  233. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/daemon/README.md +0 -0
  234. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/vscode/README.md +0 -0
  235. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/apps/vscode/package.json +0 -0
  236. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_daemon.py +0 -0
  237. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_feishu_bot.py +0 -0
  238. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_mcp_server.py +0 -0
  239. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_relay_client.py +0 -0
  240. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_relay_server.py +0 -0
  241. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/aria_telegram_bot.py +0 -0
  242. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ariarc.py +0 -0
  243. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/artifacts.py +0 -0
  244. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/backtest_engine.py +0 -0
  245. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/backtest_report.py +0 -0
  246. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/__init__.py +0 -0
  247. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/automation.py +0 -0
  248. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/base.py +0 -0
  249. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/capabilities.py +0 -0
  250. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  251. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  252. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  253. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  254. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  255. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  256. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/config.py +0 -0
  257. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  258. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  259. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  260. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  261. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  262. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/paper_broker.py +0 -0
  263. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/planning.py +0 -0
  264. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/registry.py +0 -0
  265. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/brokers/trading.py +0 -0
  266. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/canva_client.py +0 -0
  267. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/change_store.py +0 -0
  268. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/__init__.py +0 -0
  269. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  270. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  271. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/canva_client.py +0 -0
  272. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/figma_client.py +0 -0
  273. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/football_data_client.py +0 -0
  274. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/kling_video_client.py +0 -0
  275. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/market_data_client.py +0 -0
  276. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/openai_image_client.py +0 -0
  277. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/runway_video_client.py +0 -0
  278. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  279. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/cloud_memory.py +0 -0
  280. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/command_safety.py +0 -0
  281. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/computer_use_tools.py +0 -0
  282. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/dashboard_generator.py +0 -0
  283. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/data_analysis_tools.py +0 -0
  284. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/data_cleaner.py +0 -0
  285. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/data_service.py +0 -0
  286. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/__init__.py +0 -0
  287. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/base.py +0 -0
  288. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/router.py +0 -0
  289. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  290. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  291. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  292. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  293. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  294. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  295. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  296. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  297. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  298. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  299. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/demo_player.py +0 -0
  300. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/doctor.py +0 -0
  301. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/domain/__init__.py +0 -0
  302. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/domain/backtest_engine.py +0 -0
  303. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/domain/backtest_report.py +0 -0
  304. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/domain/finance_formulas.py +0 -0
  305. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  306. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/domain/strategy_vault.py +0 -0
  307. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/evals/__init__.py +0 -0
  308. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/evals/harness.py +0 -0
  309. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/evals/runner.py +0 -0
  310. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/evals/summary.py +0 -0
  311. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/external_agent_runner.py +0 -0
  312. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/figma_client.py +0 -0
  313. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/file_analysis_tools.py +0 -0
  314. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/finance_formulas.py +0 -0
  315. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/football_data_client.py +0 -0
  316. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/image_gen_tools.py +0 -0
  317. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/intent_classifier.py +0 -0
  318. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/kling_video_client.py +0 -0
  319. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/licensing.py +0 -0
  320. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/local_finance_tools.py +0 -0
  321. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/local_image_provider.py +0 -0
  322. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/local_llm_provider.py +0 -0
  323. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/macro_tools.py +0 -0
  324. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/markdown_pdf.py +0 -0
  325. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/market_data_client.py +0 -0
  326. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/mcp_client.py +0 -0
  327. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/memory_manager.py +0 -0
  328. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/model_capability.py +0 -0
  329. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/notification_tools.py +0 -0
  330. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/openai_image_client.py +0 -0
  331. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/__init__.py +0 -0
  332. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  333. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  334. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  335. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  336. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  337. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  338. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  339. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_core/export.py +0 -0
  340. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  341. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  342. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  343. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  344. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  345. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  346. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  347. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  348. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  349. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  350. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  351. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  352. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  353. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  354. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  355. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  356. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  357. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  358. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  359. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  360. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  361. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/context.py +0 -0
  362. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  363. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/data.py +0 -0
  364. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  365. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/references.py +0 -0
  366. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  367. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  368. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  369. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  370. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  371. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  372. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  373. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  374. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  375. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  376. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  377. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  378. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  379. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  380. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  381. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  382. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  383. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  384. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  385. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  386. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  387. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  388. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  389. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  390. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  391. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  392. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  393. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  394. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  395. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  396. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  397. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  398. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  399. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  400. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  401. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  402. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  403. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  404. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  405. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/__init__.py +0 -0
  406. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/base.py +0 -0
  407. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/finance/__init__.py +0 -0
  408. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  409. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/payments/__init__.py +0 -0
  410. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/realty/__init__.py +0 -0
  411. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/registry.py +0 -0
  412. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/packs/rules.py +0 -0
  413. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/plan_utils.py +0 -0
  414. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/plugin_loader.py +0 -0
  415. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/portfolio_ledger.py +0 -0
  416. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/preview_server.py +0 -0
  417. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/privacy/__init__.py +0 -0
  418. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/privacy/feedback.py +0 -0
  419. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/project_review.py +0 -0
  420. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/project_review_api.py +0 -0
  421. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/project_review_server.py +0 -0
  422. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/project_tools.py +0 -0
  423. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/__init__.py +0 -0
  424. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/__init__.py +0 -0
  425. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  426. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  427. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/base.py +0 -0
  428. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/custom.py +0 -0
  429. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/ollama.py +0 -0
  430. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  431. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/llm/registry.py +0 -0
  432. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/local_image_provider.py +0 -0
  433. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  434. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/providers/tool_messages.py +0 -0
  435. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/realty_data_tools.py +0 -0
  436. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/relay_store.py +0 -0
  437. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/report_exporters.py +0 -0
  438. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/report_generator.py +0 -0
  439. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/review_service.py +0 -0
  440. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/__init__.py +0 -0
  441. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/approval.py +0 -0
  442. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/budget.py +0 -0
  443. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/checkpoints.py +0 -0
  444. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/crash_report.py +0 -0
  445. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/events.py +0 -0
  446. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/lsp.py +0 -0
  447. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/orchestrator.py +0 -0
  448. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/processes.py +0 -0
  449. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/repo_map.py +0 -0
  450. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/run_state.py +0 -0
  451. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/run_store.py +0 -0
  452. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/self_healing.py +0 -0
  453. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/subagent.py +0 -0
  454. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/task_ledger.py +0 -0
  455. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  456. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/tool_policy.py +0 -0
  457. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runtime/worktrees.py +0 -0
  458. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/runway_video_client.py +0 -0
  459. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/safety/__init__.py +0 -0
  460. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/safety/permissions.py +0 -0
  461. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/safety/service.py +0 -0
  462. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/setup_wizard.py +0 -0
  463. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/spreadsheet_tools.py +0 -0
  464. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/strategy_vault.py +0 -0
  465. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/__init__.py +0 -0
  466. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/artifact_tools.py +0 -0
  467. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/broker_tools.py +0 -0
  468. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  469. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  470. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  471. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  472. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  473. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/extended_tools.py +0 -0
  474. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  475. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  476. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  477. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  478. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  479. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/logistics_io.py +0 -0
  480. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  481. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/logistics_tools.py +0 -0
  482. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/macro_tools.py +0 -0
  483. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/notification_tools.py +0 -0
  484. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/project_tools.py +0 -0
  485. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  486. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  487. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/tools/stripe_tools.py +0 -0
  488. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/__init__.py +0 -0
  489. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/banner.py +0 -0
  490. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/completer.py +0 -0
  491. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/console.py +0 -0
  492. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/image_render.py +0 -0
  493. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/input_box.py +0 -0
  494. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/mentions.py +0 -0
  495. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/picker.py +0 -0
  496. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/render/__init__.py +0 -0
  497. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/render/finance.py +0 -0
  498. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/render/market.py +0 -0
  499. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/render/output.py +0 -0
  500. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/render/responsive.py +0 -0
  501. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/render/team.py +0 -0
  502. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/robot.py +0 -0
  503. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  504. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/utils/vscode_uri.py +0 -0
  505. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/video_analysis.py +0 -0
  506. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/video_editor.py +0 -0
  507. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace/__init__.py +0 -0
  508. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace/verify.py +0 -0
  509. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace_changes.py +0 -0
  510. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace_context.py +0 -0
  511. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace_service.py +0 -0
  512. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code/workspace_tools.py +0 -0
  513. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  514. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  515. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code.egg-info/requires.txt +0 -0
  516. {aria_code-0.106.0 → aria_code-0.108.0}/src/aria_code.egg-info/top_level.txt +0 -0
  517. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_adk_market_tools.py +0 -0
  518. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_agent_key_points_language.py +0 -0
  519. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_agent_team_fallback.py +0 -0
  520. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_analyze_file_tool.py +0 -0
  521. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_architecture_ledger_is_true.py +0 -0
  522. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_architecture_report.py +0 -0
  523. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_aria_cli_core.py +0 -0
  524. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_aria_mcp_server.py +0 -0
  525. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_aria_sdk.py +0 -0
  526. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_artifact_publishing.py +0 -0
  527. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_artifacts_and_reports.py +0 -0
  528. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ashare_prediction_cmds.py +0 -0
  529. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_background_processes.py +0 -0
  530. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_backtest_cmds.py +0 -0
  531. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_backtest_engine.py +0 -0
  532. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_backtest_report.py +0 -0
  533. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_backtest_runs_what_it_names.py +0 -0
  534. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  535. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_broken_akshare_is_optional.py +0 -0
  536. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_broker_automation.py +0 -0
  537. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  538. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_broker_planning.py +0 -0
  539. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_broker_safety.py +0 -0
  540. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_broker_tools.py +0 -0
  541. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_budget.py +0 -0
  542. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_business_workflow_cmds.py +0 -0
  543. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_canva_client.py +0 -0
  544. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_canvas_cmds.py +0 -0
  545. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_card_approvals.py +0 -0
  546. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_channel_intake.py +0 -0
  547. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_channels.py +0 -0
  548. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_chart_handlers.py +0 -0
  549. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_chat_bots_fail_closed.py +0 -0
  550. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_chat_routing.py +0 -0
  551. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ci_security_workflow.py +0 -0
  552. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_app_split.py +0 -0
  553. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_bootstrap.py +0 -0
  554. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_config_store.py +0 -0
  555. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  556. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_runtime_consumer.py +0 -0
  557. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_tool_executor_module.py +0 -0
  558. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cli_updater.py +0 -0
  559. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_cloud_memory.py +0 -0
  560. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_code_audit_tools.py +0 -0
  561. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_code_review_agent.py +0 -0
  562. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_codegen_output.py +0 -0
  563. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_coder_tester_self_healing.py +0 -0
  564. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_coder_tool_safety.py +0 -0
  565. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_collaboration.py +0 -0
  566. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_command_loggers.py +0 -0
  567. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_command_safety.py +0 -0
  568. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_compare_strategies.py +0 -0
  569. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_completions_builder.py +0 -0
  570. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_config_paths.py +0 -0
  571. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_configured_provider.py +0 -0
  572. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_container_entrypoint.py +0 -0
  573. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_container_entrypoints.py +0 -0
  574. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_context_checkpoints.py +0 -0
  575. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_context_references.py +0 -0
  576. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_context_service.py +0 -0
  577. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_conversation_core.py +0 -0
  578. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_crash_report.py +0 -0
  579. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_credential_file_permissions.py +0 -0
  580. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_custom_providers.py +0 -0
  581. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_daemon_gateway_config.py +0 -0
  582. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_dashboard_generator.py +0 -0
  583. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_data_service.py +0 -0
  584. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_data_service_imports.py +0 -0
  585. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_data_without_model.py +0 -0
  586. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_datasource_routing.py +0 -0
  587. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_deep_analysis.py +0 -0
  588. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_degrades_without_quant_engine.py +0 -0
  589. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  590. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_doctor.py +0 -0
  591. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  592. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_doctor_npm_scope.py +0 -0
  593. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_edit_and_command_safety.py +0 -0
  594. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_engine_boundary.py +0 -0
  595. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_english_output_group.py +0 -0
  596. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_enterprise_tool_honesty.py +0 -0
  597. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_env_switch_docs.py +0 -0
  598. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_eval_summary.py +0 -0
  599. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_eval_task_bank.py +0 -0
  600. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_eval_trajectories.py +0 -0
  601. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_evals_harness.py +0 -0
  602. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_event_import_roots.py +0 -0
  603. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_exec_events.py +0 -0
  604. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_extended_tools.py +0 -0
  605. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_feishu_swarm_config.py +0 -0
  606. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_file_links.py +0 -0
  607. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_finalize_release.py +0 -0
  608. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_finance_renderers.py +0 -0
  609. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_finance_service_catalog.py +0 -0
  610. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_first_run_output.py +0 -0
  611. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_first_run_works.py +0 -0
  612. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_football_agent.py +0 -0
  613. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_football_prediction_output.py +0 -0
  614. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_google_cloud_models.py +0 -0
  615. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_google_cloud_routing.py +0 -0
  616. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_google_login.py +0 -0
  617. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_google_search_provider.py +0 -0
  618. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_headless_command_approval.py +0 -0
  619. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_headless_is_agentic.py +0 -0
  620. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_honest_surfaces.py +0 -0
  621. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_image_gen_tools.py +0 -0
  622. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_image_inputs.py +0 -0
  623. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_import_graph_budget.py +0 -0
  624. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_intent_router.py +0 -0
  625. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_intent_signals.py +0 -0
  626. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_kling_video_client.py +0 -0
  627. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_lazy_rebind.py +0 -0
  628. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_legacy_module_imports.py +0 -0
  629. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_license_consistency.py +0 -0
  630. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_licensing.py +0 -0
  631. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_local_image_provider.py +0 -0
  632. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_logistics_3pl.py +0 -0
  633. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_logistics_and_finance_agents.py +0 -0
  634. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_lsp.py +0 -0
  635. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_markdown_pdf.py +0 -0
  636. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_answers_in_english.py +0 -0
  637. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_data_client.py +0 -0
  638. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_history_inheritance.py +0 -0
  639. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_history_tool.py +0 -0
  640. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_hours.py +0 -0
  641. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_questions_on_backend.py +0 -0
  642. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_symbol_extraction.py +0 -0
  643. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_market_universe.py +0 -0
  644. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_mcp_circuit.py +0 -0
  645. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_mcp_client.py +0 -0
  646. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_mentions.py +0 -0
  647. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_model_capability_registry.py +0 -0
  648. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_model_choice_is_the_users.py +0 -0
  649. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_model_selection_state.py +0 -0
  650. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_narrow_chinese_output.py +0 -0
  651. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_native_binary_entrypoints.py +0 -0
  652. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_native_installer.py +0 -0
  653. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_natural_language_routing.py +0 -0
  654. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_new_modules.py +0 -0
  655. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  656. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_no_tools_route.py +0 -0
  657. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_no_uncommitted_imports.py +0 -0
  658. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_numeric_listings.py +0 -0
  659. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ollama_stream_imports.py +0 -0
  660. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ollama_stream_tools.py +0 -0
  661. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_openai_image_client.py +0 -0
  662. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_operations_suite.py +0 -0
  663. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_output_discipline_prompt.py +0 -0
  664. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_output_rendering.py +0 -0
  665. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_packages_facade.py +0 -0
  666. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_packaging_constraints.py +0 -0
  667. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_packaging_manifest.py +0 -0
  668. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_packs_domains.py +0 -0
  669. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_pdf_report.py +0 -0
  670. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_pick_best_installed_model.py +0 -0
  671. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_plan_mode.py +0 -0
  672. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_platform_package_assembly.py +0 -0
  673. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_platform_packages.py +0 -0
  674. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_platform_publish.py +0 -0
  675. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_plotly_html_output.py +0 -0
  676. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_portfolio_language.py +0 -0
  677. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_portfolio_ledger.py +0 -0
  678. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_post_turn_context_decision.py +0 -0
  679. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_preflight.py +0 -0
  680. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_preview_server.py +0 -0
  681. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_privacy_feedback.py +0 -0
  682. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_project_aria.py +0 -0
  683. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_project_context_files.py +0 -0
  684. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_project_review.py +0 -0
  685. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_project_review_api.py +0 -0
  686. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_prompt_assembly.py +0 -0
  687. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_prompt_selection.py +0 -0
  688. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_provider_autoconfig.py +0 -0
  689. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_provider_error_messages.py +0 -0
  690. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_provider_integration.py +0 -0
  691. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_provider_registry.py +0 -0
  692. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_public_service_status.py +0 -0
  693. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_quant_engine_namespace.py +0 -0
  694. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_rebind_contract.py +0 -0
  695. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_rebind_namespace_contract.py +0 -0
  696. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_relay_client_credentials.py +0 -0
  697. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_relay_event_verification.py +0 -0
  698. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_relay_sends_for_clients.py +0 -0
  699. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_relay_store.py +0 -0
  700. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_relay_url.py +0 -0
  701. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_release_commit_identity.py +0 -0
  702. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_release_push_is_atomic.py +0 -0
  703. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_release_reaches_the_registries.py +0 -0
  704. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_release_workflow_permissions.py +0 -0
  705. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_report_charts.py +0 -0
  706. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_report_generator.py +0 -0
  707. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_report_prompt_language.py +0 -0
  708. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_research_protocol.py +0 -0
  709. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_research_quality.py +0 -0
  710. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_responsive_rendering.py +0 -0
  711. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_review_service.py +0 -0
  712. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_risk_earnings_ops.py +0 -0
  713. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_root_module_budget.py +0 -0
  714. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  715. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_acceptance.py +0 -0
  716. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_approval.py +0 -0
  717. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_bridge.py +0 -0
  718. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_bridge_fallback.py +0 -0
  719. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_checkpoints.py +0 -0
  720. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_event_identity.py +0 -0
  721. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_gateway.py +0 -0
  722. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_repo_map.py +0 -0
  723. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_run_store.py +0 -0
  724. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_tool_executor.py +0 -0
  725. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runtime_worktrees.py +0 -0
  726. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_runway_video_client.py +0 -0
  727. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_safety_permissions.py +0 -0
  728. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_safety_service.py +0 -0
  729. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_safety_service_adoption.py +0 -0
  730. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_service_diagnostics_security.py +0 -0
  731. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_session_search.py +0 -0
  732. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_settings_service.py +0 -0
  733. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_shell_commands_as_written.py +0 -0
  734. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_shipper_digest.py +0 -0
  735. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_single_import_root.py +0 -0
  736. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_skill_agent_binding.py +0 -0
  737. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_skill_catalog.py +0 -0
  738. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_skill_loader.py +0 -0
  739. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_slash_popup.py +0 -0
  740. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_spreadsheet_tools.py +0 -0
  741. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_startup_dashboard.py +0 -0
  742. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_startup_keeps_cloud_model.py +0 -0
  743. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_startup_latency.py +0 -0
  744. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_status_language.py +0 -0
  745. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_streaming_pipeline.py +0 -0
  746. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_stripe_agent.py +0 -0
  747. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_subagent.py +0 -0
  748. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_supervisor_routing.py +0 -0
  749. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_system_prompts.py +0 -0
  750. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_system_tools_output.py +0 -0
  751. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_task_orchestrator.py +0 -0
  752. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_team_analysts.py +0 -0
  753. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_team_synthesis.py +0 -0
  754. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_terminal_mixins.py +0 -0
  755. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_terminal_snapshots.py +0 -0
  756. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_tls_trust_store.py +0 -0
  757. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_tool_policy.py +0 -0
  758. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  759. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_tool_scope.py +0 -0
  760. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_trading_service.py +0 -0
  761. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_tradingview_bridge.py +0 -0
  762. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_turn_planning.py +0 -0
  763. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ui_completer_references.py +0 -0
  764. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ui_console_theme.py +0 -0
  765. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ui_input_box.py +0 -0
  766. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ui_language_and_model.py +0 -0
  767. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_ui_robot_banner.py +0 -0
  768. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_update_health_routes.py +0 -0
  769. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_verification_hint.py +0 -0
  770. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_verification_policy.py +0 -0
  771. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_version_consistency.py +0 -0
  772. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_version_counter.py +0 -0
  773. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_vertex_empty_rounds.py +0 -0
  774. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_vertex_models.py +0 -0
  775. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_video_analysis.py +0 -0
  776. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_video_editor.py +0 -0
  777. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_vscode_mcp.py +0 -0
  778. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_warehouse_agents.py +0 -0
  779. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_warehouse_cli_registration.py +0 -0
  780. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_warehouse_erp_client.py +0 -0
  781. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_warehouse_workflow.py +0 -0
  782. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_workspace_changes.py +0 -0
  783. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_workspace_context.py +0 -0
  784. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_workspace_files.py +0 -0
  785. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_workspace_scope.py +0 -0
  786. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_workspace_service.py +0 -0
  787. {aria_code-0.106.0 → aria_code-0.108.0}/tests/test_workspace_verify.py +0 -0
  788. {aria_code-0.106.0 → aria_code-0.108.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.106.0
3
+ Version: 0.108.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
@@ -246,11 +246,13 @@ aria-code --local
246
246
  Or run a single task in an existing project:
247
247
 
248
248
  ```bash
249
- aria-code -p "Inspect this project, fix the failing tests, run them, and summarize the diff."
249
+ aria-code -C ~/Projects/my-app -p "Inspect this project, fix the failing tests, run them, and summarize the diff."
250
250
  ```
251
251
 
252
252
  Aria may request approval before editing files or running commands, according to the configured permission mode. Review changes and test results before committing them.
253
253
 
254
+ Google Cloud models can use Aria's local file and command tools: inference stays in the cloud while edits and tests run on your computer. Use `--read-dir DIR` for additional file-reading locations and `--add-dir DIR` for additional writable directories. Command-line directory grants last for this invocation only. See [local projects and file access](docs/local-workspace.md) for permissions and Google authentication.
255
+
254
256
  In a script or CI job, `--json` prints one JSON result and `--format jsonl` prints one JSON event per line as the turn runs (`turn.started`, `tool.started`, `tool.completed`, `turn.completed`). Only JSON goes to stdout, and a failed turn exits 1. With no one there to approve, pass `--allow-tools edit_file,run_command` for the tools the job may use.
255
257
 
256
258
  ```bash
@@ -90,11 +90,13 @@ aria-code --local
90
90
  Or run a single task in an existing project:
91
91
 
92
92
  ```bash
93
- aria-code -p "Inspect this project, fix the failing tests, run them, and summarize the diff."
93
+ aria-code -C ~/Projects/my-app -p "Inspect this project, fix the failing tests, run them, and summarize the diff."
94
94
  ```
95
95
 
96
96
  Aria may request approval before editing files or running commands, according to the configured permission mode. Review changes and test results before committing them.
97
97
 
98
+ Google Cloud models can use Aria's local file and command tools: inference stays in the cloud while edits and tests run on your computer. Use `--read-dir DIR` for additional file-reading locations and `--add-dir DIR` for additional writable directories. Command-line directory grants last for this invocation only. See [local projects and file access](docs/local-workspace.md) for permissions and Google authentication.
99
+
98
100
  In a script or CI job, `--json` prints one JSON result and `--format jsonl` prints one JSON event per line as the turn runs (`turn.started`, `tool.started`, `tool.completed`, `turn.completed`). Only JSON goes to stdout, and a failed turn exits 1. With no one there to approve, pass `--allow-tools edit_file,run_command` for the tools the job may use.
99
101
 
100
102
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aria-code"
7
- version = "0.106.0"
7
+ version = "0.108.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.106.0"
20
+ __version__ = "0.108.0"
@@ -203,6 +203,8 @@ class ChatTurnMixin:
203
203
  # 识别公司名 → ticker 并调 get_market_data,不需要硬编码字典。
204
204
  # 本地小模型(<14B)工具调用不稳定,保留确定性路由作降级。
205
205
  _curr_model_id = self.config.get("model", "")
206
+ from aria_code.apps.cli.workspace_route import workspace_config
207
+ _runtime_config = workspace_config(message, _curr_model_id, self.config, self.api_url)
206
208
  _model_has_tools = False
207
209
  if _HAS_MODEL_CAP:
208
210
  try:
@@ -213,7 +215,7 @@ class ChatTurnMixin:
213
215
  if _model_has_tools:
214
216
  try:
215
217
  from apps.cli.providers.chat_routing import model_receives_local_tools
216
- _model_has_tools = model_receives_local_tools(_curr_model_id, self.config, self.api_url)
218
+ _model_has_tools = model_receives_local_tools(_curr_model_id, _runtime_config, self.api_url)
217
219
  except Exception:
218
220
  pass
219
221
 
@@ -505,9 +507,8 @@ class ChatTurnMixin:
505
507
  print(f"{_agent_name}{' · ' + _answer_model if _answer_model else ''}")
506
508
  # A task about this folder on a model that cannot open it gets a guess
507
509
  # that reads like a result (backend_chat answered "5" for a function
508
- # that returns -1). Say so before the answer, once a session; the
509
- # person can still read it, and knows what it is.
510
- if not _model_has_tools and not getattr(self, "_no_tools_notice_shown", False):
510
+ # that returns -1). Stop this task before generating a guessed result.
511
+ if not _model_has_tools:
511
512
  from apps.cli.workspace_route import needs_workspace, no_tools_message
512
513
  if needs_workspace(message):
513
514
  self._no_tools_notice_shown = True
@@ -518,6 +519,7 @@ class ChatTurnMixin:
518
519
  print_hanging(console, " ! ", _why, style="yellow")
519
520
  else:
520
521
  print(f" ! {_why}")
522
+ return
521
523
  # ── Single-shot turn through the shared runtime Gateway ─────────────
522
524
  # The per-round inline agent loop that used to live here was removed
523
525
  # (2026-07) after the runtime path was validated with real turns:
@@ -619,7 +621,7 @@ class ChatTurnMixin:
619
621
  _rt_turn = await run_chat_via_runtime(
620
622
  prompt=current_message, history=self.conversation[:-1],
621
623
  local_tools=LOCAL_TOOLS, tool_schemas=LOCAL_TOOL_SCHEMAS,
622
- model=model, config=self.config, api_url=self.api_url,
624
+ model=model, config=_runtime_config, api_url=self.api_url,
623
625
  ollama_url=self.config.get("ollama_url", "http://localhost:11434"),
624
626
  cancel_event=self.cancel_event,
625
627
  on_token=on_token, on_thinking=on_thinking,
@@ -686,8 +688,11 @@ class ChatTurnMixin:
686
688
  or str(self.config.get("local_provider") or "ollama")
687
689
  )
688
690
  result = {
689
- "success": True,
691
+ "success": bool(getattr(_rt_turn, "ok", False)),
690
692
  "response": _rt_text,
693
+ "error": getattr(_rt_turn, "error", None) or getattr(_rt_final, "error", ""),
694
+ "stop_reason": getattr(_rt_final, "stop_reason", "completed"),
695
+ "acceptance": getattr(_rt_final, "acceptance", None),
691
696
  "provider": _rt_provider,
692
697
  "cancelled": False,
693
698
  "usage": {
@@ -100,8 +100,9 @@ class HeadlessMixin:
100
100
  # The route counts as much as the model: on backend_chat the model gets
101
101
  # no local tools whatever it could do with them. This only looked at the
102
102
  # model, so the deterministic chain skipped its data pre-fetch there.
103
- from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools
104
- _model_has_tools_p = route_has_tools(_curr_model_id_p, self.config, self.api_url)
103
+ from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools, workspace_config
104
+ _runtime_config = workspace_config(prompt, _curr_model_id_p, self.config, self.api_url)
105
+ _model_has_tools_p = route_has_tools(_curr_model_id_p, _runtime_config, self.api_url)
105
106
 
106
107
  # ── Broker guide intent: broad discovery should not start an add wizard ──
107
108
  if _is_broker_guide_intent(prompt):
@@ -171,7 +172,7 @@ class HeadlessMixin:
171
172
  _turn = await run_chat_via_runtime(
172
173
  prompt=prompt, history=[],
173
174
  local_tools=LOCAL_TOOLS, tool_schemas=LOCAL_TOOL_SCHEMAS,
174
- model=model, config=self.config, api_url=self.api_url,
175
+ model=model, config=_runtime_config, api_url=self.api_url,
175
176
  ollama_url=self.config.get("ollama_url", "http://localhost:11434"),
176
177
  thinking_mode=thinking_mode, user_context=user_context,
177
178
  auth_token=auth_token, project_context=_PROJECT_CONTEXT,
@@ -194,13 +195,11 @@ class HeadlessMixin:
194
195
  return_result=True,
195
196
  )
196
197
  _tools_used = list(getattr(_turn.final, "tools", []) or [])
197
- # An empty closing message after the tools already ran is not a
198
- # failed turn. The model did the work and then said nothing;
199
- # exiting 1 there told a script the task failed while the edit
200
- # sat finished on disk. Narrow on purpose — any other error,
201
- # and a turn that ran no tools at all, still fails.
198
+ # A missing closing message can count as success only with
199
+ # passing acceptance evidence, never merely because a tool ran.
202
200
  _empty_after_work = (
203
201
  _turn.error == "empty_response" and bool(_tools_used)
202
+ and (getattr(_turn.final, "acceptance", None) or {}).get("verified") is True
204
203
  )
205
204
  result = {
206
205
  "success": _turn.ok or _empty_after_work,
@@ -213,6 +212,7 @@ class HeadlessMixin:
213
212
  "provider": getattr(_turn.final, "provider", ""),
214
213
  "tools_used": _tools_used,
215
214
  "acceptance": getattr(_turn.final, "acceptance", None),
215
+ "stop_reason": getattr(_turn.final, "stop_reason", "") or _turn.error or "completed",
216
216
  }
217
217
  finally:
218
218
  if _prompt_spinner is not None:
@@ -238,6 +238,10 @@ class HeadlessMixin:
238
238
  # its checks must say so on stderr rather than print a confident summary
239
239
  # and exit 0.
240
240
  _acceptance = (result or {}).get("acceptance") or {}
241
+ if _acceptance.get("verified") is False:
242
+ result["success"] = False
243
+ result["error"] = result.get("error") or "checks_failed"
244
+ result["stop_reason"] = "checks_failed"
241
245
  if _acceptance.get("verified") is False and not quiet:
242
246
  _zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
243
247
  print(f"⚠ {'验收未通过' if _zh else 'Checks failed'}: {_acceptance.get('headline', '')}",
@@ -253,6 +253,7 @@ class AriaSSEProvider:
253
253
  system_override: Optional[str] = None,
254
254
  project_context: str = "",
255
255
  use_react_gateway: bool = False,
256
+ local_tools: bool = False,
256
257
  ) -> None:
257
258
  self.api_url = api_url
258
259
  self.model = model
@@ -262,6 +263,7 @@ class AriaSSEProvider:
262
263
  self.system_override = system_override
263
264
  self.project_context = project_context
264
265
  self.use_react_gateway = use_react_gateway
266
+ self.local_tools = local_tools
265
267
 
266
268
  async def stream(
267
269
  self,
@@ -296,6 +298,8 @@ class AriaSSEProvider:
296
298
  cancel_event=cancel_event,
297
299
  project_context=self.project_context,
298
300
  use_react_gateway=self.use_react_gateway,
301
+ tool_schemas=list(tools or []) if self.local_tools else None,
302
+ local_tool_execution=self.local_tools,
299
303
  )
300
304
 
301
305
  async for event in _stream_callback_provider(_invoke, done_provider="aria_sse"):
@@ -97,15 +97,9 @@ def first_round_route(model: str, config: dict, api_url: Optional[str]) -> str:
97
97
 
98
98
 
99
99
  def model_receives_local_tools(model: str, config: dict, api_url: Optional[str]) -> bool:
100
- """False when the turn goes to the Arthera backend (AriaSSEProvider).
101
-
102
- That route sends the prompt and history but no local tool schemas, so the
103
- model there cannot fetch market data through Aria's tools. Treating it as
104
- tool-capable skipped the local market pre-fetch as well, and a question
105
- like "分析苹果股票" reached the backend with no data at all — the
106
- evidence gate then refused the answer.
107
- """
108
- return first_round_route(model, config, api_url) != "cloud"
100
+ """Legacy chat has no local tools; client execution requires an opt-in
101
+ protocol acknowledgement. Direct inference carries the local schemas."""
102
+ return first_round_route(model, config, api_url) != "cloud" or bool(config.get("backend_local_tools"))
109
103
 
110
104
 
111
105
  def is_placeholder_response(
@@ -19,18 +19,21 @@ def build_chat_payload(
19
19
  user_context: Optional[dict],
20
20
  project_context: str,
21
21
  use_react_gateway: bool,
22
+ tool_schemas: Optional[list] = None,
23
+ local_tool_execution: bool = False,
22
24
  ) -> tuple[str, dict]:
23
25
  """Build either the legacy chat payload or the shared ReAct envelope.
24
26
 
25
27
  This is deliberately pure: it gives CLI, desktop, and iOS an auditable
26
28
  parity point without forcing the local-first CLI to use cloud services.
27
29
  """
30
+ payload: dict
28
31
  if use_react_gateway:
29
32
  context = dict(user_context or {})
30
33
  if project_context:
31
34
  context["project_context"] = project_context
32
35
  mode = str(context.pop("workspace_mode", "code"))
33
- return "/api/v2/chat/react", {
36
+ payload = {
34
37
  "message": {
35
38
  "role": "user",
36
39
  "content": [{"type": "text", "text": message}],
@@ -41,8 +44,11 @@ def build_chat_payload(
41
44
  "model": {"id": model or "auto", "effort": thinking_mode or "auto"},
42
45
  "context": context,
43
46
  }
47
+ if local_tool_execution:
48
+ payload.update(tools=list(tool_schemas or []), tool_execution="client", tool_protocol="aria-local-v1")
49
+ return "/api/v2/chat/react", payload
44
50
 
45
- payload: dict = {
51
+ payload = {
46
52
  "message": message,
47
53
  "conversation_history": history[-20:],
48
54
  "model": model,
@@ -53,6 +59,10 @@ def build_chat_payload(
53
59
  if project_context:
54
60
  user_context = {**user_context, "project_context": project_context}
55
61
  payload["user_context"] = user_context
62
+ elif project_context:
63
+ payload["user_context"] = {"project_context": project_context}
64
+ if local_tool_execution:
65
+ payload.update(tools=list(tool_schemas or []), tool_execution="client", tool_protocol="aria-local-v1")
56
66
  return "/api/v2/ai/chat/stream", payload
57
67
 
58
68
 
@@ -72,6 +82,8 @@ async def stream_chat(
72
82
  cancel_event: Optional[asyncio.Event] = None,
73
83
  project_context: str = "",
74
84
  use_react_gateway: bool = False,
85
+ tool_schemas: Optional[list] = None,
86
+ local_tool_execution: bool = False,
75
87
  ) -> dict:
76
88
  """Stream AI chat via SSE with cancel support and user context.
77
89
 
@@ -88,6 +100,7 @@ async def stream_chat(
88
100
  message, history, model=model, thinking_mode=thinking_mode,
89
101
  user_context=user_context, project_context=project_context,
90
102
  use_react_gateway=use_react_gateway,
103
+ tool_schemas=tool_schemas, local_tool_execution=local_tool_execution,
91
104
  )
92
105
  url = f"{base_url.rstrip('/')}{endpoint}"
93
106
 
@@ -117,6 +130,7 @@ async def stream_chat(
117
130
  tools_used = []
118
131
  sources = []
119
132
  tool_calls_pending = []
133
+ local_tools_acknowledged = False
120
134
  usage = {"prompt_tokens": 0, "completion_tokens": 0, "thinking_tokens": 0}
121
135
 
122
136
  try:
@@ -178,6 +192,17 @@ async def stream_chat(
178
192
  return {"success": False, "error": f"Backend: {err_msg}"}
179
193
 
180
194
  evt = data.get("type", event_type)
195
+ if local_tool_execution:
196
+ local_tools_acknowledged = local_tools_acknowledged or (
197
+ data.get("tool_protocol") == "aria-local-v1"
198
+ and data.get("tool_execution") == "client"
199
+ )
200
+ if evt == "tool_call" and not local_tools_acknowledged:
201
+ return {"success": False, "error": "backend_local_tools_unsupported",
202
+ "response": full_response}
203
+ if evt == "tool_result":
204
+ return {"success": False, "error": "backend_executed_client_tool",
205
+ "response": full_response}
181
206
 
182
207
  if evt == "delta":
183
208
  token = data.get("text", data.get("content", ""))
@@ -222,6 +247,9 @@ async def stream_chat(
222
247
  elif evt == "error":
223
248
  return {"success": False, "error": data.get("message", data.get("error", "Unknown error"))}
224
249
 
250
+ if local_tool_execution and not local_tools_acknowledged:
251
+ return {"success": False, "error": "backend_local_tools_unsupported",
252
+ "response": full_response}
225
253
  return {
226
254
  "success": True,
227
255
  "response": full_response,
@@ -110,22 +110,23 @@ def build_acceptance_gate(executor, config: Optional[dict] = None, message: str
110
110
 
111
111
  import os
112
112
  from aria_code.runtime.acceptance import AcceptanceGate
113
+ from aria_code.runtime.approval import ApprovalDecision
113
114
 
114
115
  timeout = int(cfg.get("acceptance_timeout", 300) or 300)
116
+ root = cfg.get("_session_workspace_root") or cfg.get("workspace_root") or os.getcwd()
117
+ if getattr(executor, "execution_context", None) is not None:
118
+ root = dict(executor.execution_context() or {}).get("_workspace") or root
115
119
 
116
120
  def _runner(command: str) -> dict:
117
121
  return executor.execute_local("run_command", {
118
122
  "command": command,
119
- "policy": "balanced",
120
- "permission_mode": mode,
121
- "network_enabled": bool(cfg.get("network_enabled", True)),
122
- "user_approved": True,
123
+ "cwd": str(root),
123
124
  "timeout": timeout,
124
- })
125
+ }, approval=ApprovalDecision.allow(policy="balanced", user_approved=True))
125
126
 
126
127
  return AcceptanceGate(
127
128
  runner=_runner,
128
- root=os.getcwd(),
129
+ root=root,
129
130
  max_attempts=int(cfg.get("acceptance_max_attempts", 2) or 2),
130
131
  commands=_declared_acceptance_commands(cfg, message),
131
132
  )
@@ -259,6 +260,7 @@ def make_provider_fn(
259
260
  user_context=_cloud_uctx, auth_token=auth_token,
260
261
  project_context=project_context,
261
262
  use_react_gateway=bool(config.get("arthera_react_gateway")),
263
+ local_tools=bool(config.get("backend_local_tools")),
262
264
  ),
263
265
  _on_token,
264
266
  )
@@ -340,6 +342,9 @@ async def run_chat_via_runtime(
340
342
  usage metadata during final rendering.
341
343
  """
342
344
  from aria_code.runtime.gateway import run_turn
345
+ from aria_code.apps.cli.workspace_route import workspace_config
346
+
347
+ config = workspace_config(prompt, model, config, api_url)
343
348
 
344
349
  provider_fn = make_provider_fn(
345
350
  model=model, config=config, api_url=api_url, ollama_url=ollama_url,
@@ -455,6 +455,8 @@ class TerminalRuntimeEventConsumer:
455
455
  )
456
456
  if can_live:
457
457
  now = time.time()
458
+ if self.live_display is not None and now - self.last_live_update < self.live_update_interval:
459
+ return
458
460
  md = self.markdown_cls(self.strip_latex(self.response_text))
459
461
  if self.live_display is None:
460
462
  self.live_display = self.live_cls(
@@ -611,6 +613,12 @@ class TerminalRuntimeEventConsumer:
611
613
  else:
612
614
  print(f" {'✓' if passed else '✗'} {message}")
613
615
  return
616
+ if state in {"max_rounds", "budget_exhausted", "loop_guard", "checks_failed"}:
617
+ if self.has_rich and self.console is not None:
618
+ self.console.print(f" [yellow]Task incomplete: {message}[/yellow]")
619
+ else:
620
+ print(f" Task incomplete: {message}")
621
+ return
614
622
  if state != "fallback":
615
623
  return
616
624
  match = re.search(r"(?:from\s+)?(\w+)\s*(?:→|->|to)\s*(\w+)", message or "", re.I)
@@ -28,7 +28,7 @@ from aria_code.workspace import WorkspaceFiles # noqa: E402
28
28
  from aria_code.workspace.files import WorkspaceSecurity
29
29
  import os
30
30
 
31
- def _get_workspace_files():
31
+ def _get_workspace_files(params=None):
32
32
  """Reads for the local CLI: cwd, home, and the temp dirs.
33
33
 
34
34
  ``allow_home=False`` used to be hardcoded here to "force restrict to the
@@ -42,7 +42,7 @@ def _get_workspace_files():
42
42
  everywhere else: ARIA_RUNTIME_SCOPE=remote, which Dockerfile.review sets.
43
43
  Leaving the flag unset here honours it without disabling the local paths.
44
44
  """
45
- security = WorkspaceSecurity(cwd=os.getcwd())
45
+ security = WorkspaceSecurity.from_tool_params(params or {})
46
46
  return WorkspaceFiles(security=security)
47
47
 
48
48
 
@@ -57,7 +57,7 @@ def tool_read_file(params: dict) -> dict:
57
57
  limit = int(params.get("limit", 0) or 0)
58
58
  if not offset and not limit:
59
59
  limit = 160
60
- result = _get_workspace_files().read_file(path, offset=offset, limit=limit)
60
+ result = _get_workspace_files(params).read_file(path, offset=offset, limit=limit)
61
61
  content = result.content
62
62
  if limit and result.lines >= limit and "use offset/limit to read more" not in content:
63
63
  content += "\n... [default read limit applied — use offset/limit to read more]"
@@ -75,7 +75,7 @@ def tool_list_files(params: dict) -> dict:
75
75
  path = params.get("path", ".")
76
76
  pattern = params.get("pattern", "*")
77
77
  try:
78
- data = _get_workspace_files().list_files(path, pattern)
78
+ data = _get_workspace_files(params).list_files(path, pattern)
79
79
  return {"success": True, "data": {
80
80
  "path": data["path"],
81
81
  "pattern": data["pattern"],
@@ -94,7 +94,7 @@ def tool_search_code(params: dict) -> dict:
94
94
  if not pattern:
95
95
  return {"success": False, "error": "Missing 'pattern' parameter"}
96
96
  try:
97
- data = _get_workspace_files().search_code(pattern, path, file_glob)
97
+ data = _get_workspace_files(params).search_code(pattern, path, file_glob)
98
98
  return {"success": True, "data": {
99
99
  "pattern": data["pattern"],
100
100
  "path": data["path"],
@@ -114,13 +114,14 @@ def tool_glob(params: dict) -> dict:
114
114
  root = (params.get("path", ".") or ".").strip()
115
115
  limit = min(int(params.get("limit", 200)), 1000)
116
116
  try:
117
- p = pathlib.Path(root).expanduser().resolve()
117
+ security = WorkspaceSecurity.from_tool_params(params)
118
+ p = security.require_safe(root)
118
119
  if not p.is_dir():
119
120
  return {"success": False, "error": f"Directory not found: {p}"}
120
121
  results = sorted(
121
122
  str(fp.relative_to(p) if fp.is_relative_to(p) else fp)
122
123
  for fp in p.glob(pattern)
123
- if fp.is_file()
124
+ if fp.is_file() and security.is_safe_path(fp)
124
125
  )[:limit]
125
126
  return {"success": True, "data": {
126
127
  "pattern": pattern,
@@ -218,6 +218,8 @@ def tool_run_command(
218
218
  argv if (argv and not use_shell) else command,
219
219
  use_shell=use_shell, mode=mode, network=network, cwd=cwd,
220
220
  setting=params.get("os_sandbox"),
221
+ workspace=params.get("_workspace"),
222
+ extra=params.get("_allowed_write_roots", ()),
221
223
  )
222
224
  result = subprocess.run(
223
225
  confined or (argv if (argv and not use_shell) else command),
@@ -285,7 +287,8 @@ def _start_background(params, command, argv, use_shell, cwd, mode, network, *, d
285
287
 
286
288
  target = argv if (argv and not use_shell) else command
287
289
  confined = _os_sandbox.wrap(target, use_shell=use_shell, mode=mode, network=network, cwd=cwd,
288
- setting=params.get("os_sandbox"))
290
+ setting=params.get("os_sandbox"), workspace=params.get("_workspace"),
291
+ extra=params.get("_allowed_write_roots", ()))
289
292
  result = processes.start(confined or target, shell=use_shell and not confined, cwd=cwd,
290
293
  label=command, wait=min(float(params.get("wait_seconds", 3) or 0), 30.0),
291
294
  until=params.get("until"))
@@ -639,4 +642,3 @@ def tool_ask_user(params: dict, *, console=None, has_rich: bool = True) -> dict:
639
642
  return {"success": False, "error": "User cancelled the input."}
640
643
 
641
644
  return {"success": True, "data": {"user_answer": answer}}
642
-
@@ -118,7 +118,10 @@ def _print_lsp_diags(diags: list, console, has_rich: bool, limit: int = 6) -> No
118
118
  console.print(f" [dim]… +{extra} more[/dim]") if has_rich else print(f" ... +{extra} more")
119
119
 
120
120
 
121
- def _is_safe(p: pathlib.Path) -> bool:
121
+ def _is_safe(p: pathlib.Path, params: dict | None = None) -> bool:
122
+ if params and params.get("_workspace"):
123
+ from aria_code.workspace.files import WorkspaceSecurity
124
+ return WorkspaceSecurity.from_tool_params(params).is_safe_path(p, write=True)
122
125
  return _ac()._is_safe_path(p)
123
126
 
124
127
 
@@ -458,7 +461,7 @@ def tool_write_file(params: dict) -> dict:
458
461
  if not raw_path.is_absolute():
459
462
  raw_path = _relative_write_base() / raw_path
460
463
  p = raw_path.resolve()
461
- if not _is_safe(p):
464
+ if not _is_safe(p, params):
462
465
  return {"success": False, "error": f"Access denied: path '{p}' is outside allowed directories"}
463
466
 
464
467
  existed = p.exists()
@@ -694,7 +697,7 @@ def tool_edit_file(params: dict) -> dict:
694
697
  p = pathlib.Path(path).expanduser().resolve()
695
698
  if not p.exists():
696
699
  return {"success": False, "error": f"File not found: {p}"}
697
- if not _is_safe(p):
700
+ if not _is_safe(p, params):
698
701
  return {"success": False, "error": f"Access denied: path '{p}' is outside allowed directories"}
699
702
 
700
703
  content = p.read_text(errors="replace")
@@ -813,7 +816,7 @@ def tool_multi_edit(params: dict) -> dict:
813
816
  p = pathlib.Path(path).expanduser().resolve()
814
817
  if not p.exists():
815
818
  return {"success": False, "error": f"File not found: {p}"}
816
- if not _is_safe(p):
819
+ if not _is_safe(p, params):
817
820
  return {"success": False, "error": f"Access denied: path '{p}' is outside allowed directories"}
818
821
 
819
822
  content = p.read_text(errors="replace")
@@ -31,7 +31,8 @@ _RUN_EN = re.compile(r"\b(?:run|execute)\s+(?:`|python3?\b|pytest\b|npm\b|npx\b|
31
31
  _RUN_ZH = re.compile(r"(?:运行|执行|跑一下|跑)\s*(?:`|python|pytest|npm|node|git|make|命令|脚本|测试)", re.I)
32
32
  _IMPORT = re.compile(r"\b(?:import|from)\s+([A-Za-z_]\w*)")
33
33
  _HERE_ZH = ("这个项目", "该项目", "当前项目", "这个仓库", "当前仓库", "这个目录", "当前目录", "这个文件夹",
34
- "当前文件夹", "这个代码库", "本项目", "本仓库", "失败的测试", "我的代码")
34
+ "当前文件夹", "这个代码库", "本项目", "本仓库", "失败的测试", "我的代码",
35
+ "我的项目", "本地项目", "本地文件", "电脑文件", "桌面文件", "创建项目", "新建项目")
35
36
 
36
37
 
37
38
  def needs_workspace(text: str, cwd: Path | str | None = None) -> bool:
@@ -41,13 +42,18 @@ def needs_workspace(text: str, cwd: Path | str | None = None) -> bool:
41
42
  return True
42
43
  if _HERE_EN.search(message) or any(word in message for word in _HERE_ZH):
43
44
  return True
45
+ if re.search(r"\b(?:create|build|scaffold|initialize)\s+(?:a\s+|an\s+|new\s+)?(?:react\s+|next\.js\s+)?(?:app|project|website)\b", message, re.I):
46
+ return True
44
47
  if _RUN_EN.search(message) or _RUN_ZH.search(message):
45
48
  return True
46
49
  base = Path(cwd or Path.cwd())
47
50
  for module in _IMPORT.findall(message):
48
51
  if (base / f"{module}.py").is_file() or (base / module / "__init__.py").is_file():
49
52
  return True
50
- for token in _PATH_TOKEN.findall(message):
53
+ tokens = _PATH_TOKEN.findall(message)
54
+ # Chinese prose can touch an ASCII filename without whitespace (修改calc.py).
55
+ tokens += re.findall(r"[A-Za-z0-9_./~-]+\.[A-Za-z0-9]{1,6}\b", message)
56
+ for token in tokens:
51
57
  candidate = token.strip("./") if token.startswith("./") else token
52
58
  try:
53
59
  if candidate and (base / candidate).exists():
@@ -92,4 +98,24 @@ def no_tools_message(config: dict, *, lang: str = "en") -> str:
92
98
  "qwen2.5-coder), or start with aria-code --local.")
93
99
 
94
100
 
95
- __all__ = ["needs_workspace", "route_has_tools", "no_tools_message"]
101
+ def workspace_config(text: str, model: str, config: dict, api_url: str | None) -> dict:
102
+ """Choose authenticated Google inference with local tools for workspace tasks.
103
+
104
+ Change only this turn's inference transport, never the saved config or
105
+ the user's model. A backend chat setting must not turn edits into guesses.
106
+ """
107
+ from aria_code.apps.cli.providers.chat_routing import force_backend, model_provider, normalize_provider_name
108
+ if not needs_workspace(text) or not force_backend(config, api_url):
109
+ return config
110
+ if config.get("backend_local_tools"):
111
+ return config
112
+ provider = model_provider(model) or normalize_provider_name(config.get("local_provider", ""))
113
+ if provider not in {"google", "vertexai", "vertex-ai", "google-genai"}:
114
+ return config
115
+ from aria_code.apps.cli.providers.base import google_readiness
116
+ if google_readiness(config):
117
+ return config
118
+ return {**config, "backend_chat": False, "_workspace_transport": "google"}
119
+
120
+
121
+ __all__ = ["needs_workspace", "route_has_tools", "no_tools_message", "workspace_config"]
@@ -4963,6 +4963,11 @@ Examples:
4963
4963
  parser.add_argument("--banner", choices=["full", "compact", "off"], help="Banner mode: full|compact|off")
4964
4964
  parser.add_argument("--resume", action="store_true", help="Resume last session")
4965
4965
  parser.add_argument("--session", help="Load specific session ID")
4966
+ parser.add_argument("-C", "--cd", metavar="DIR", help="Open a local project directory")
4967
+ parser.add_argument("--add-dir", action="append", default=[], metavar="DIR",
4968
+ help="Allow reads and writes in an additional directory (repeatable)")
4969
+ parser.add_argument("--read-dir", action="append", default=[], metavar="DIR",
4970
+ help="Allow reads in an additional directory (repeatable)")
4966
4971
  parser.add_argument(
4967
4972
  "--dangerously-skip-permissions",
4968
4973
  action="store_true",
@@ -4977,6 +4982,14 @@ Examples:
4977
4982
  parser.add_argument("args", nargs="*", help="Command arguments")
4978
4983
 
4979
4984
  args = parser.parse_args()
4985
+ # Resolve every path relative to the invocation directory before changing it.
4986
+ _write_roots = [str(pathlib.Path(p).expanduser().resolve()) for p in args.add_dir]
4987
+ _read_roots = [str(pathlib.Path(p).expanduser().resolve()) for p in args.read_dir]
4988
+ if args.cd:
4989
+ _project_dir = pathlib.Path(args.cd).expanduser().resolve()
4990
+ if not _project_dir.is_dir():
4991
+ parser.error(f"Project directory does not exist: {_project_dir}")
4992
+ os.chdir(_project_dir)
4980
4993
 
4981
4994
  # Machine-readable -p output: stdout carries only JSON. Everything else —
4982
4995
  # banners, tool steps, warnings, anything a tool prints — goes to stderr.
@@ -4988,6 +5001,9 @@ Examples:
4988
5001
  sys.stdout = sys.stderr
4989
5002
 
4990
5003
  config = load_config()
5004
+ config["_session_workspace_root"] = str(pathlib.Path.cwd().resolve())
5005
+ config["_session_write_roots"] = _write_roots
5006
+ config["_session_read_roots"] = _read_roots
4991
5007
 
4992
5008
  # ── Start background update check (non-blocking, daemon thread) ──────────
4993
5009
  try:
@@ -5006,9 +5022,13 @@ Examples:
5006
5022
  raw_model = str(args.model).strip()
5007
5023
  if "/" in raw_model and not raw_model.startswith("http"):
5008
5024
  provider_name, selected_model = raw_model.split("/", 1)
5009
- from apps.cli.providers.chat_routing import normalize_provider_name
5025
+ from apps.cli.providers.chat_routing import normalize_provider_name, KNOWN_MODEL_PROVIDERS
5010
5026
 
5011
5027
  provider_name = normalize_provider_name(provider_name)
5028
+ if provider_name in KNOWN_MODEL_PROVIDERS:
5029
+ # --model names the inference provider explicitly, just as /model
5030
+ # does. A stale backend_chat flag must not override that choice.
5031
+ config["backend_chat"] = False
5012
5032
  config["local_provider"] = provider_name
5013
5033
  config["model"] = selected_model
5014
5034
  config["local_mode"] = provider_name in {
@@ -27,7 +27,10 @@ from typing import Any, Optional
27
27
  STALE_ARIA_MODEL_PREFIXES = ("aria-opus", "aria-prelude", "aria-sonata:3", "aria-sonata:4")
28
28
 
29
29
  # Keys that are session state, not configuration — never persisted.
30
- NEVER_PERSIST = frozenset({"conversation_history"})
30
+ NEVER_PERSIST = frozenset({
31
+ "conversation_history", "_session_workspace_root", "_session_write_roots",
32
+ "_session_read_roots", "_workspace_transport",
33
+ })
31
34
 
32
35
 
33
36
  @dataclass