aria-code 0.61.0__tar.gz → 0.63.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 (708) hide show
  1. {aria_code-0.61.0 → aria_code-0.63.0}/PKG-INFO +1 -1
  2. {aria_code-0.61.0 → aria_code-0.63.0}/pyproject.toml +1 -1
  3. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_cli.py +7 -2
  5. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_feishu_bot.py +121 -33
  6. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_telegram_bot.py +8 -2
  7. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/aria_relay_client.py +3 -1
  8. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/evals/harness.py +36 -1
  9. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/PKG-INFO +1 -1
  10. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/SOURCES.txt +1 -0
  11. aria_code-0.63.0/tests/test_chat_bots_fail_closed.py +178 -0
  12. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_coder_tool_safety.py +4 -1
  13. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_evals_harness.py +28 -0
  14. {aria_code-0.61.0 → aria_code-0.63.0}/LICENSE +0 -0
  15. {aria_code-0.61.0 → aria_code-0.63.0}/NOTICE +0 -0
  16. {aria_code-0.61.0 → aria_code-0.63.0}/README.md +0 -0
  17. {aria_code-0.61.0 → aria_code-0.63.0}/setup.cfg +0 -0
  18. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/__init__.py +0 -0
  19. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/__init__.py +0 -0
  20. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  21. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  22. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  23. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  24. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/__init__.py +0 -0
  25. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/base.py +0 -0
  26. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/code_review.py +0 -0
  27. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/__init__.py +0 -0
  28. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  29. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/critic.py +0 -0
  30. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/deepen.py +0 -0
  31. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/models.py +0 -0
  32. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  33. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  34. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/themes.py +0 -0
  35. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/tiers.py +0 -0
  36. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  37. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/coder.py +0 -0
  38. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/tester.py +0 -0
  39. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/__init__.py +0 -0
  40. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  41. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  42. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  43. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/debate.py +0 -0
  44. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/earnings.py +0 -0
  45. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  46. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/macro.py +0 -0
  47. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/news.py +0 -0
  48. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/risk.py +0 -0
  49. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/sector.py +0 -0
  50. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/strategist.py +0 -0
  51. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  52. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  53. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/technical.py +0 -0
  54. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/orchestrator.py +0 -0
  55. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  56. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/__init__.py +0 -0
  57. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  58. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/business_match.py +0 -0
  59. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  60. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  61. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  62. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  63. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  64. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  65. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  66. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/registry.py +0 -0
  67. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/signal_scheme.py +0 -0
  68. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/sports/__init__.py +0 -0
  69. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  70. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/supervisor.py +0 -0
  71. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/team.py +0 -0
  72. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  73. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  74. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  75. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  76. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  77. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  78. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  79. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  80. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  81. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  82. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  83. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aliyun_data_client.py +0 -0
  84. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/README.md +0 -0
  85. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/__init__.py +0 -0
  86. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/README.md +0 -0
  87. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/__init__.py +0 -0
  88. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/intake.py +0 -0
  89. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/registry.py +0 -0
  90. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  91. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/README.md +0 -0
  92. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/__init__.py +0 -0
  93. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/_optional.py +0 -0
  94. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  95. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  96. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  97. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  98. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  99. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  100. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  101. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  102. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  103. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  104. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  105. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  106. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  107. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  108. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  109. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  110. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  111. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  112. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  113. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  114. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  115. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  116. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  117. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  118. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  119. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  120. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  121. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  122. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  123. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  124. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  125. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  126. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  127. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  128. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  129. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  130. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  131. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  132. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  133. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  134. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  135. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/config_store.py +0 -0
  136. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/constants.py +0 -0
  137. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/context.py +0 -0
  138. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  139. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/direct.py +0 -0
  140. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  141. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  142. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  143. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/google_login.py +0 -0
  144. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  145. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  146. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  147. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  148. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  149. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  150. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  151. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/helpers.py +0 -0
  152. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/hooks.py +0 -0
  153. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/i18n.py +0 -0
  154. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent.py +0 -0
  155. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  156. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  157. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  158. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  159. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/main.py +0 -0
  160. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  161. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  162. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  163. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  164. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  165. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  166. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  167. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  168. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/preflight.py +0 -0
  169. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  170. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  171. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  172. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  173. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  174. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  175. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  176. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  177. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  178. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  179. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  180. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  181. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  182. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  183. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  184. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  185. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  186. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  187. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  188. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  189. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  190. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  191. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_export.py +0 -0
  192. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  193. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_store.py +0 -0
  194. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  195. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  196. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  197. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  198. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  199. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  200. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  201. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  202. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  203. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  204. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  205. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  206. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  207. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  208. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/update_check.py +0 -0
  209. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  210. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  211. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/daemon/README.md +0 -0
  212. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/vscode/README.md +0 -0
  213. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/vscode/package.json +0 -0
  214. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_daemon.py +0 -0
  215. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_mcp_server.py +0 -0
  216. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_relay_client.py +0 -0
  217. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_relay_server.py +0 -0
  218. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ariarc.py +0 -0
  219. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/artifacts.py +0 -0
  220. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/backtest_engine.py +0 -0
  221. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/backtest_report.py +0 -0
  222. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/__init__.py +0 -0
  223. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/automation.py +0 -0
  224. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/base.py +0 -0
  225. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/capabilities.py +0 -0
  226. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  227. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  228. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  229. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  230. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  231. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  232. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/config.py +0 -0
  233. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  234. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  235. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  236. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  237. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  238. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/paper_broker.py +0 -0
  239. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/planning.py +0 -0
  240. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/registry.py +0 -0
  241. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/trading.py +0 -0
  242. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/canva_client.py +0 -0
  243. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/change_store.py +0 -0
  244. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/__init__.py +0 -0
  245. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  246. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/canva_client.py +0 -0
  247. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/figma_client.py +0 -0
  248. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/football_data_client.py +0 -0
  249. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/kling_video_client.py +0 -0
  250. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/market_data_client.py +0 -0
  251. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/openai_image_client.py +0 -0
  252. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/runway_video_client.py +0 -0
  253. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  254. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/cloud_memory.py +0 -0
  255. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/command_safety.py +0 -0
  256. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/computer_use_tools.py +0 -0
  257. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/dashboard_generator.py +0 -0
  258. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/data_analysis_tools.py +0 -0
  259. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/data_cleaner.py +0 -0
  260. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/data_service.py +0 -0
  261. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/__init__.py +0 -0
  262. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/base.py +0 -0
  263. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/router.py +0 -0
  264. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  265. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  266. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  267. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  268. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  269. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  270. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  271. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  272. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  273. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  274. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/demo_player.py +0 -0
  275. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/doctor.py +0 -0
  276. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/__init__.py +0 -0
  277. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/backtest_engine.py +0 -0
  278. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/backtest_report.py +0 -0
  279. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/finance_formulas.py +0 -0
  280. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  281. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/strategy_vault.py +0 -0
  282. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/evals/__init__.py +0 -0
  283. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/evals/runner.py +0 -0
  284. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/external_agent_runner.py +0 -0
  285. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/figma_client.py +0 -0
  286. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/file_analysis_tools.py +0 -0
  287. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/finance_formulas.py +0 -0
  288. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/football_data_client.py +0 -0
  289. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/image_gen_tools.py +0 -0
  290. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/intent_classifier.py +0 -0
  291. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/kling_video_client.py +0 -0
  292. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/licensing.py +0 -0
  293. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/local_finance_tools.py +0 -0
  294. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/local_image_provider.py +0 -0
  295. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/local_llm_provider.py +0 -0
  296. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/macro_tools.py +0 -0
  297. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/markdown_pdf.py +0 -0
  298. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/market_data_client.py +0 -0
  299. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/mcp_client.py +0 -0
  300. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/memory_manager.py +0 -0
  301. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/model_capability.py +0 -0
  302. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/notification_tools.py +0 -0
  303. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/openai_image_client.py +0 -0
  304. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/__init__.py +0 -0
  305. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  306. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  307. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  308. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  309. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  310. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  311. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  312. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/export.py +0 -0
  313. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  314. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  315. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  316. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  317. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  318. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  319. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  320. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  321. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  322. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  323. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  324. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  325. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  326. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  327. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  328. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  329. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  330. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  331. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  332. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  333. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  334. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/context.py +0 -0
  335. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  336. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/data.py +0 -0
  337. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  338. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/references.py +0 -0
  339. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  340. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  341. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  342. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  343. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  344. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  345. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  346. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  347. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  348. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  349. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  350. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  351. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  352. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  353. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  354. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  355. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  356. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  357. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  358. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  359. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  360. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  361. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  362. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  363. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  364. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  365. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  366. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  367. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  368. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  369. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  370. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  371. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  372. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  373. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  374. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  375. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  376. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  377. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  378. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  379. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/__init__.py +0 -0
  380. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/base.py +0 -0
  381. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/finance/__init__.py +0 -0
  382. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  383. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/payments/__init__.py +0 -0
  384. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/realty/__init__.py +0 -0
  385. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/registry.py +0 -0
  386. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/rules.py +0 -0
  387. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/plan_utils.py +0 -0
  388. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/plugin_loader.py +0 -0
  389. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/portfolio_ledger.py +0 -0
  390. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/preview_server.py +0 -0
  391. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/privacy/__init__.py +0 -0
  392. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/privacy/feedback.py +0 -0
  393. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_review.py +0 -0
  394. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_review_api.py +0 -0
  395. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_review_server.py +0 -0
  396. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_tools.py +0 -0
  397. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/__init__.py +0 -0
  398. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/__init__.py +0 -0
  399. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  400. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  401. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/base.py +0 -0
  402. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/custom.py +0 -0
  403. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/ollama.py +0 -0
  404. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  405. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/registry.py +0 -0
  406. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/local_image_provider.py +0 -0
  407. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  408. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/realty_data_tools.py +0 -0
  409. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/report_exporters.py +0 -0
  410. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/report_generator.py +0 -0
  411. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/__init__.py +0 -0
  412. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/acceptance.py +0 -0
  413. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/agent_loop.py +0 -0
  414. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/approval.py +0 -0
  415. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/budget.py +0 -0
  416. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/checkpoints.py +0 -0
  417. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/crash_report.py +0 -0
  418. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/events.py +0 -0
  419. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/gateway.py +0 -0
  420. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/lsp.py +0 -0
  421. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/orchestrator.py +0 -0
  422. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/repo_map.py +0 -0
  423. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/run_state.py +0 -0
  424. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/run_store.py +0 -0
  425. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/self_healing.py +0 -0
  426. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/subagent.py +0 -0
  427. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/task_ledger.py +0 -0
  428. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  429. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/tool_executor.py +0 -0
  430. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/tool_policy.py +0 -0
  431. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/worktrees.py +0 -0
  432. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runway_video_client.py +0 -0
  433. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/safety/__init__.py +0 -0
  434. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/safety/permissions.py +0 -0
  435. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/safety/service.py +0 -0
  436. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/setup_wizard.py +0 -0
  437. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/spreadsheet_tools.py +0 -0
  438. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/strategy_vault.py +0 -0
  439. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/__init__.py +0 -0
  440. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/artifact_tools.py +0 -0
  441. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/broker_tools.py +0 -0
  442. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  443. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  444. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  445. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  446. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  447. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/extended_tools.py +0 -0
  448. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  449. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  450. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  451. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  452. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  453. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_io.py +0 -0
  454. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  455. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_tools.py +0 -0
  456. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/macro_tools.py +0 -0
  457. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/notification_tools.py +0 -0
  458. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/project_tools.py +0 -0
  459. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  460. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  461. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/stripe_tools.py +0 -0
  462. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/__init__.py +0 -0
  463. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/banner.py +0 -0
  464. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/completer.py +0 -0
  465. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/console.py +0 -0
  466. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/image_render.py +0 -0
  467. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/input_box.py +0 -0
  468. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/picker.py +0 -0
  469. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/__init__.py +0 -0
  470. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/finance.py +0 -0
  471. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/market.py +0 -0
  472. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/output.py +0 -0
  473. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/responsive.py +0 -0
  474. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/team.py +0 -0
  475. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/robot.py +0 -0
  476. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  477. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/utils/vscode_uri.py +0 -0
  478. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/video_analysis.py +0 -0
  479. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/video_editor.py +0 -0
  480. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace/__init__.py +0 -0
  481. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace/files.py +0 -0
  482. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace/verify.py +0 -0
  483. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_changes.py +0 -0
  484. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_context.py +0 -0
  485. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_service.py +0 -0
  486. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_tools.py +0 -0
  487. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  488. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  489. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/requires.txt +0 -0
  490. {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/top_level.txt +0 -0
  491. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_adk_market_tools.py +0 -0
  492. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_agent_team_fallback.py +0 -0
  493. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_analyze_file_tool.py +0 -0
  494. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_architecture_ledger_is_true.py +0 -0
  495. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_architecture_report.py +0 -0
  496. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_aria_cli_core.py +0 -0
  497. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_aria_mcp_server.py +0 -0
  498. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_aria_sdk.py +0 -0
  499. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_artifact_publishing.py +0 -0
  500. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_artifacts_and_reports.py +0 -0
  501. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ashare_prediction_cmds.py +0 -0
  502. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_backtest_cmds.py +0 -0
  503. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_backtest_engine.py +0 -0
  504. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_backtest_report.py +0 -0
  505. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  506. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broken_akshare_is_optional.py +0 -0
  507. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_automation.py +0 -0
  508. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  509. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_planning.py +0 -0
  510. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_safety.py +0 -0
  511. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_tools.py +0 -0
  512. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_budget.py +0 -0
  513. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_business_workflow_cmds.py +0 -0
  514. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_canva_client.py +0 -0
  515. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_canvas_cmds.py +0 -0
  516. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_channel_intake.py +0 -0
  517. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_channels.py +0 -0
  518. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_chart_handlers.py +0 -0
  519. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_chat_routing.py +0 -0
  520. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ci_security_workflow.py +0 -0
  521. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_app_split.py +0 -0
  522. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_bootstrap.py +0 -0
  523. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_config_store.py +0 -0
  524. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  525. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_runtime_consumer.py +0 -0
  526. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_tool_executor_module.py +0 -0
  527. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cloud_memory.py +0 -0
  528. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_code_audit_tools.py +0 -0
  529. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_code_review_agent.py +0 -0
  530. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_codegen_output.py +0 -0
  531. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_coder_tester_self_healing.py +0 -0
  532. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_collaboration.py +0 -0
  533. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_command_loggers.py +0 -0
  534. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_command_safety.py +0 -0
  535. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_completions_builder.py +0 -0
  536. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_config_paths.py +0 -0
  537. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_configured_provider.py +0 -0
  538. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_container_entrypoint.py +0 -0
  539. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_container_entrypoints.py +0 -0
  540. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_context_checkpoints.py +0 -0
  541. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_context_references.py +0 -0
  542. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_context_service.py +0 -0
  543. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_crash_report.py +0 -0
  544. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_credential_file_permissions.py +0 -0
  545. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_custom_providers.py +0 -0
  546. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_daemon_gateway_config.py +0 -0
  547. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_dashboard_generator.py +0 -0
  548. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_data_service.py +0 -0
  549. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_data_service_imports.py +0 -0
  550. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_datasource_routing.py +0 -0
  551. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_deep_analysis.py +0 -0
  552. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_degrades_without_quant_engine.py +0 -0
  553. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  554. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_doctor.py +0 -0
  555. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  556. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_doctor_npm_scope.py +0 -0
  557. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_engine_boundary.py +0 -0
  558. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_enterprise_tool_honesty.py +0 -0
  559. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_env_switch_docs.py +0 -0
  560. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_extended_tools.py +0 -0
  561. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_feishu_swarm_config.py +0 -0
  562. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_finance_renderers.py +0 -0
  563. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_finance_service_catalog.py +0 -0
  564. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_first_run_works.py +0 -0
  565. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_football_agent.py +0 -0
  566. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_football_prediction_output.py +0 -0
  567. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_google_cloud_routing.py +0 -0
  568. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_google_login.py +0 -0
  569. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_google_search_provider.py +0 -0
  570. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_headless_is_agentic.py +0 -0
  571. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_image_gen_tools.py +0 -0
  572. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_image_inputs.py +0 -0
  573. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_import_graph_budget.py +0 -0
  574. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_intent_router.py +0 -0
  575. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_intent_signals.py +0 -0
  576. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_kling_video_client.py +0 -0
  577. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_lazy_rebind.py +0 -0
  578. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_legacy_module_imports.py +0 -0
  579. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_license_consistency.py +0 -0
  580. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_licensing.py +0 -0
  581. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_local_image_provider.py +0 -0
  582. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_logistics_3pl.py +0 -0
  583. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_logistics_and_finance_agents.py +0 -0
  584. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_lsp.py +0 -0
  585. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_markdown_pdf.py +0 -0
  586. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_data_client.py +0 -0
  587. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_history_inheritance.py +0 -0
  588. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_history_tool.py +0 -0
  589. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_symbol_extraction.py +0 -0
  590. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_universe.py +0 -0
  591. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_mcp_circuit.py +0 -0
  592. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_mcp_client.py +0 -0
  593. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_model_capability_registry.py +0 -0
  594. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_model_choice_is_the_users.py +0 -0
  595. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_model_selection_state.py +0 -0
  596. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_native_binary_entrypoints.py +0 -0
  597. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_native_installer.py +0 -0
  598. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_new_modules.py +0 -0
  599. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  600. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_no_uncommitted_imports.py +0 -0
  601. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ollama_stream_imports.py +0 -0
  602. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ollama_stream_tools.py +0 -0
  603. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_openai_image_client.py +0 -0
  604. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_operations_suite.py +0 -0
  605. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_output_rendering.py +0 -0
  606. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packages_facade.py +0 -0
  607. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packaging_constraints.py +0 -0
  608. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packaging_manifest.py +0 -0
  609. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packs_domains.py +0 -0
  610. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_pdf_report.py +0 -0
  611. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_pick_best_installed_model.py +0 -0
  612. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_plan_mode.py +0 -0
  613. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_platform_package_assembly.py +0 -0
  614. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_platform_packages.py +0 -0
  615. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_plotly_html_output.py +0 -0
  616. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_portfolio_ledger.py +0 -0
  617. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_post_turn_context_decision.py +0 -0
  618. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_preflight.py +0 -0
  619. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_preview_server.py +0 -0
  620. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_privacy_feedback.py +0 -0
  621. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_project_aria.py +0 -0
  622. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_project_review.py +0 -0
  623. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_project_review_api.py +0 -0
  624. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_prompt_assembly.py +0 -0
  625. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_prompt_selection.py +0 -0
  626. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_autoconfig.py +0 -0
  627. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_error_messages.py +0 -0
  628. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_integration.py +0 -0
  629. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_registry.py +0 -0
  630. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_public_service_status.py +0 -0
  631. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_quant_engine_namespace.py +0 -0
  632. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_rebind_contract.py +0 -0
  633. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_rebind_namespace_contract.py +0 -0
  634. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_relay_event_verification.py +0 -0
  635. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_chain.py +0 -0
  636. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_commit_identity.py +0 -0
  637. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_push_is_atomic.py +0 -0
  638. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_reaches_the_registries.py +0 -0
  639. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_verification_waits.py +0 -0
  640. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_workflow_permissions.py +0 -0
  641. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_report_charts.py +0 -0
  642. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_report_generator.py +0 -0
  643. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_research_protocol.py +0 -0
  644. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_research_quality.py +0 -0
  645. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_responsive_rendering.py +0 -0
  646. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_root_module_budget.py +0 -0
  647. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  648. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_acceptance.py +0 -0
  649. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_agent_loop.py +0 -0
  650. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_approval.py +0 -0
  651. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_bridge.py +0 -0
  652. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_bridge_fallback.py +0 -0
  653. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_checkpoints.py +0 -0
  654. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_gateway.py +0 -0
  655. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_repo_map.py +0 -0
  656. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_run_store.py +0 -0
  657. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_tool_executor.py +0 -0
  658. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_worktrees.py +0 -0
  659. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runway_video_client.py +0 -0
  660. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_safety_permissions.py +0 -0
  661. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_safety_service.py +0 -0
  662. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_safety_service_adoption.py +0 -0
  663. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_service_diagnostics_security.py +0 -0
  664. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_session_search.py +0 -0
  665. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_settings_service.py +0 -0
  666. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_single_import_root.py +0 -0
  667. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_skill_agent_binding.py +0 -0
  668. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_skill_catalog.py +0 -0
  669. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_skill_loader.py +0 -0
  670. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_spreadsheet_tools.py +0 -0
  671. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_sse_stream_contract.py +0 -0
  672. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_startup_dashboard.py +0 -0
  673. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_streaming_pipeline.py +0 -0
  674. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_stripe_agent.py +0 -0
  675. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_subagent.py +0 -0
  676. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_supervisor_routing.py +0 -0
  677. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_system_prompts.py +0 -0
  678. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_system_tools_output.py +0 -0
  679. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_task_orchestrator.py +0 -0
  680. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_team_synthesis.py +0 -0
  681. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tls_trust_store.py +0 -0
  682. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tool_policy.py +0 -0
  683. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tool_scope.py +0 -0
  684. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_trading_service.py +0 -0
  685. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tradingview_bridge.py +0 -0
  686. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_turn_planning.py +0 -0
  687. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_completer_references.py +0 -0
  688. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_console_theme.py +0 -0
  689. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_input_box.py +0 -0
  690. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_robot_banner.py +0 -0
  691. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_verification_hint.py +0 -0
  692. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_verification_policy.py +0 -0
  693. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_version_consistency.py +0 -0
  694. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_version_counter.py +0 -0
  695. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_video_analysis.py +0 -0
  696. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_video_editor.py +0 -0
  697. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_vscode_mcp.py +0 -0
  698. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_agents.py +0 -0
  699. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_cli_registration.py +0 -0
  700. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_erp_client.py +0 -0
  701. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_workflow.py +0 -0
  702. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_wheel_is_installable.py +0 -0
  703. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_changes.py +0 -0
  704. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_context.py +0 -0
  705. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_files.py +0 -0
  706. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_scope.py +0 -0
  707. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_service.py +0 -0
  708. {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.61.0
3
+ Version: 0.63.0
4
4
  Summary: AI coding and research workspace with optional finance and connected-domain tools
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/artheras/aria-code
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aria-code"
7
- version = "0.61.0"
7
+ version = "0.63.0"
8
8
  description = "AI coding and research workspace with optional finance and connected-domain tools"
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.61.0"
20
+ __version__ = "0.63.0"
@@ -1241,9 +1241,14 @@ _dedup_tool_schemas()
1241
1241
 
1242
1242
  # Tools that require user confirmation before execution
1243
1243
  _CONFIRM_TOOLS = {"write_file", "edit_file", "multi_edit", "run_command"}
1244
- # In bot mode (ARIA_BOT_MODE=1): auto-approve all tools and suppress visual output
1244
+ # Bot mode (ARIA_BOT_MODE=1) is about output only: plain text for a chat card.
1245
+ # It used to start the session with every tool approved, and the Feishu and
1246
+ # Telegram bots set it — so whoever could message a bot could run shell
1247
+ # commands and write files on its host. Tools that need confirmation are now
1248
+ # refused in bot runs (nobody in a chat can answer the prompt); a bot that
1249
+ # needs one passes --allow-tools for exactly that tool.
1245
1250
  _ARIA_BOT_MODE: bool = bool(os.environ.get("ARIA_BOT_MODE"))
1246
- _auto_approve_session: bool = _ARIA_BOT_MODE # Set True when user chooses "Yes, allow all"
1251
+ _auto_approve_session: bool = False # Set True when user chooses "Yes, allow all"
1247
1252
 
1248
1253
  # Per-tool session allow list — populated by "Always allow [tool] this session" choice.
1249
1254
  # More granular than _auto_approve_session: allows write_file without approving run_command.
@@ -15,7 +15,18 @@ OpenClaw 同款设计:任意输入(文字/语音/图片/文件)→ Aria AI
15
15
  FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx
16
16
  ANTHROPIC_API_KEY=xxx # 图片理解 / LLM
17
17
  OPENAI_API_KEY=xxx # Whisper 语音转文字(可选)
18
- FEISHU_ALLOWED_USER_IDS=uid1,uid2 # 留空=不限制
18
+ FEISHU_ALLOWED_USER_IDS=ou_xxx,ou_yyy # 必填:留空 = 谁都不能用
19
+ FEISHU_ENCRYPT_KEY=xxx 或 FEISHU_VERIFICATION_TOKEN=xxx # 独立运行时必填其一
20
+ ARIA_BOT_ALLOW_TOOLS=write_file # 可选:机器人可免审批使用的工具
21
+
22
+ 安全边界(2026-10-03):
23
+ - 白名单为空时拒绝所有人。之前留空 = 不限制,而机器人调用 aria 时自动批准
24
+ 全部工具,于是任何能给它发消息的人都能在这台机器上跑 shell 命令。
25
+ - 机器人不再自动批准需要确认的工具(run_command / write_file / edit_file /
26
+ multi_edit);没有人能在飞书里点「同意」,这些调用会被拒绝。确实需要的,
27
+ 由管理员用 ARIA_BOT_ALLOW_TOOLS 逐个列出。
28
+ - 独立运行时校验飞书事件签名;未配置 Encrypt Key 或 Verification Token 时
29
+ 拒绝一切事件。之前任何能访问端口的人都能伪造发件人。
19
30
 
20
31
  支持的消息类型:
21
32
  📝 文字(非命令)→ Aria LLM 自然语言回答
@@ -661,12 +672,27 @@ async def _async_run_aria(cmd: str, message_id: str) -> None:
661
672
 
662
673
  # ── Multimodal helpers ────────────────────────────────────────────────────────
663
674
 
664
- def _is_allowed_user(user_id: str) -> bool:
665
- """Check FEISHU_ALLOWED_USER_IDS allowlist (empty = allow all)."""
666
- raw = os.environ.get("FEISHU_ALLOWED_USER_IDS", "").strip()
667
- if not raw:
668
- return True
669
- return user_id in {u.strip() for u in raw.split(",") if u.strip()}
675
+ def _is_allowed_user(*sender_ids: str) -> bool:
676
+ """Whether any of the sender's ids (user_id, open_id) is on the allowlist.
677
+
678
+ Fails closed: an empty FEISHU_ALLOWED_USER_IDS allows nobody. It used to
679
+ allow everybody, and the bot runs aria with tools — so an unconfigured
680
+ deployment answered anyone who could message it.
681
+ """
682
+ raw = os.environ.get("FEISHU_ALLOWED_USER_IDS", "")
683
+ allowed = {u.strip() for u in raw.split(",") if u.strip()}
684
+ return any(i in allowed for i in sender_ids if i)
685
+
686
+
687
+ def _bot_cli_flags() -> list[str]:
688
+ """Extra aria CLI flags for bot-run commands: only an explicit tool allowlist.
689
+
690
+ Bot mode no longer approves every tool. A tool that needs confirmation is
691
+ refused, because nobody in the chat can answer the prompt; an operator who
692
+ needs one names it in ARIA_BOT_ALLOW_TOOLS.
693
+ """
694
+ tools = [t.strip() for t in os.environ.get("ARIA_BOT_ALLOW_TOOLS", "").split(",") if t.strip()]
695
+ return ["--allow-tools", ",".join(tools)] if tools else []
670
696
 
671
697
 
672
698
  async def _query_aria_direct(text: str, timeout: int = 90) -> str:
@@ -709,10 +735,11 @@ async def _query_aria_llm(text: str, timeout: int = 120) -> str:
709
735
  if not aria_cli.exists():
710
736
  return "❌ aria_cli.py 未找到,请检查 ARIA_CODE_DIR 配置。"
711
737
  try:
712
- # ARIA_BOT_MODE=1: auto-approves tools + suppresses visual diffs in aria_cli
738
+ # ARIA_BOT_MODE=1: plain output for a chat card. It no longer approves
739
+ # tools; see _bot_cli_flags.
713
740
  bot_env = {**os.environ, "ARIA_BOT_MODE": "1"}
714
741
  proc = await asyncio.create_subprocess_exec(
715
- sys.executable, str(aria_cli), "-p", text,
742
+ sys.executable, str(aria_cli), "-p", text, *_bot_cli_flags(),
716
743
  stdin=asyncio.subprocess.DEVNULL, # no interactive prompts
717
744
  stdout=asyncio.subprocess.PIPE,
718
745
  stderr=asyncio.subprocess.PIPE,
@@ -939,23 +966,57 @@ async def _analyze_file(file_bytes: bytes, filename: str) -> str:
939
966
 
940
967
  # ── Event verifier ────────────────────────────────────────────────────────────
941
968
 
942
- def verify_feishu_signature(timestamp: str, nonce: str, body_bytes: bytes,
943
- encrypt_key: str) -> bool:
944
- """Verify Feishu event signature (optional but recommended in production)."""
945
- if not encrypt_key:
946
- return True
947
- s = (timestamp + nonce + encrypt_key).encode() + body_bytes
948
- return hmac.compare_digest(
949
- hashlib.sha256(s).hexdigest(),
950
- "" # caller should pass the X-Lark-Signature header value
951
- )
969
+ def verify_feishu_request(headers: Dict[str, str], body: bytes, payload: Dict[str, Any]) -> tuple[bool, str]:
970
+ """(trusted, reason) for an event received directly from Feishu.
971
+
972
+ The same two checks the relay applies (aria_relay_server._verify_feishu_request),
973
+ kept separate because the relay ships without this module's dependencies:
974
+ - Encrypt Key: X-Lark-Signature = sha256(timestamp + nonce + key + body)
975
+ - Verification Token: the token field in the event body
976
+ With neither configured every event is refused, unless
977
+ FEISHU_ALLOW_UNVERIFIED_EVENTS=1 is set for local testing.
978
+
979
+ This replaces verify_feishu_signature, which compared the digest with an
980
+ empty string and was never called: the standalone server dispatched any
981
+ POST, so anyone who could reach the port chose the sender — including one
982
+ on the allowlist.
983
+ """
984
+ headers = {k.lower(): v for k, v in (headers or {}).items()}
985
+ encrypt_key = os.environ.get("FEISHU_ENCRYPT_KEY", "")
986
+ token = os.environ.get("FEISHU_VERIFICATION_TOKEN", "")
987
+ if encrypt_key:
988
+ signature = headers.get("x-lark-signature", "")
989
+ if not signature:
990
+ return False, "missing X-Lark-Signature"
991
+ digest = hashlib.sha256(
992
+ (headers.get("x-lark-request-timestamp", "") + headers.get("x-lark-request-nonce", "")
993
+ + encrypt_key).encode("utf-8") + body
994
+ ).hexdigest()
995
+ if not hmac.compare_digest(digest, signature):
996
+ return False, "signature mismatch"
997
+ return True, ""
998
+ if token:
999
+ sent = payload.get("token") or (payload.get("header") or {}).get("token", "")
1000
+ if not hmac.compare_digest(str(sent), token):
1001
+ return False, "verification token mismatch"
1002
+ return True, ""
1003
+ if os.environ.get("FEISHU_ALLOW_UNVERIFIED_EVENTS", "").strip().lower() in {"1", "true", "yes", "on"}:
1004
+ return True, ""
1005
+ return False, ("neither FEISHU_ENCRYPT_KEY nor FEISHU_VERIFICATION_TOKEN is set; "
1006
+ "unverified events are refused")
952
1007
 
953
1008
 
954
1009
  # ── Main event dispatcher (called by feishu_routes.py or standalone) ──────────
955
1010
 
956
- async def dispatch_event(raw: Dict[str, Any]) -> Dict[str, Any]:
1011
+ async def dispatch_event(raw: Dict[str, Any], *, authorized_by_binding: bool = False) -> Dict[str, Any]:
957
1012
  """
958
1013
  Handle one Feishu event payload.
1014
+
1015
+ authorized_by_binding: the relay client passes True. The relay forwards an
1016
+ event only to the machine its sender bound with a code shown on that
1017
+ machine, so the binding is the authorization; a local allowlist would add
1018
+ nothing, since the relay knows the bound id. What limits a compromised
1019
+ relay is that bot-run commands cannot use confirmation-required tools.
959
1020
  Supports: text / audio / image / file / post (富文本)
960
1021
  Returns a dict to be sent as JSON response (HTTP 200 required by Feishu).
961
1022
  """
@@ -985,8 +1046,18 @@ async def dispatch_event(raw: Dict[str, Any]) -> Dict[str, Any]:
985
1046
  json.dumps(raw, ensure_ascii=False)[:600])
986
1047
  return {"code": 0}
987
1048
 
988
- if not _is_allowed_user(user_id):
989
- logger.warning("Blocked user %s (not in FEISHU_ALLOWED_USER_IDS)", user_id)
1049
+ open_id = sender.get("open_id", "")
1050
+ if not authorized_by_binding and not _is_allowed_user(sender.get("user_id", ""), open_id):
1051
+ logger.warning("Blocked sender user_id=%s open_id=%s (not in FEISHU_ALLOWED_USER_IDS)",
1052
+ sender.get("user_id", ""), open_id)
1053
+ # Say why only in a direct chat: in a group the bot would answer every
1054
+ # message from everyone not on the list.
1055
+ if msg.get("chat_type") == "p2p":
1056
+ await reply_text(
1057
+ msg_id,
1058
+ "⛔ 你还没有使用 Aria 的权限。请把下面的 ID 发给管理员,"
1059
+ f"加入 FEISHU_ALLOWED_USER_IDS:\n{open_id or sender.get('user_id', '')}",
1060
+ )
990
1061
  return {"code": 0}
991
1062
 
992
1063
  content_raw = msg.get("content", "{}")
@@ -1386,6 +1457,33 @@ async def _handle_file(file_key: str, filename: str, message_id: str) -> None:
1386
1457
 
1387
1458
  # ── Standalone HTTP server (for testing without FastAPI) ──────────────────────
1388
1459
 
1460
+ async def _standalone_handle(request):
1461
+ """POST /feishu/event for the standalone server: verify, then dispatch."""
1462
+ from aiohttp import web
1463
+
1464
+ raw = await request.read()
1465
+ try:
1466
+ body = json.loads(raw)
1467
+ except Exception:
1468
+ return web.json_response({"code": 1, "msg": "bad json"}, status=400)
1469
+ # Before anything else, the URL-verification challenge included: it
1470
+ # carries the token too, and answering it unverified is a free probe.
1471
+ trusted, reason = verify_feishu_request(dict(request.headers), raw, body)
1472
+ if not trusted:
1473
+ logger.warning("refused an unverified Feishu event: %s", reason)
1474
+ return web.json_response({"code": 1, "msg": "unverified event"}, status=401)
1475
+ return web.json_response(await dispatch_event(body))
1476
+
1477
+
1478
+ def _standalone_app():
1479
+ from aiohttp import web
1480
+
1481
+ app = web.Application()
1482
+ app.router.add_post("/feishu/event", _standalone_handle)
1483
+ app.router.add_post("/api/v1/feishu/event", _standalone_handle)
1484
+ return app
1485
+
1486
+
1389
1487
  async def _standalone_server(host: str = "0.0.0.0", port: int = 8888) -> None:
1390
1488
  """Minimal aiohttp-based server for standalone Feishu event reception."""
1391
1489
  try:
@@ -1394,17 +1492,7 @@ async def _standalone_server(host: str = "0.0.0.0", port: int = 8888) -> None:
1394
1492
  logger.error("aiohttp not installed. pip install aiohttp")
1395
1493
  return
1396
1494
 
1397
- async def handle(request):
1398
- try:
1399
- body = await request.json()
1400
- except Exception:
1401
- return web.json_response({"code": 1, "msg": "bad json"}, status=400)
1402
- result = await dispatch_event(body)
1403
- return web.json_response(result)
1404
-
1405
- app = web.Application()
1406
- app.router.add_post("/feishu/event", handle)
1407
- app.router.add_post("/api/v1/feishu/event", handle)
1495
+ app = _standalone_app()
1408
1496
 
1409
1497
  runner = web.AppRunner(app)
1410
1498
  await runner.setup()
@@ -45,6 +45,10 @@ class TelegramBot:
45
45
  self._running = False
46
46
  self._client: Optional[httpx.AsyncClient] = None
47
47
 
48
+ def is_allowed(self, chat_id: int) -> bool:
49
+ """Fails closed: an empty allowlist allows nobody."""
50
+ return chat_id in self.allowed_chat_ids
51
+
48
52
  # ── Low-level API ─────────────────────────────────────────────────────────
49
53
 
50
54
  def _url(self, method: str) -> str:
@@ -157,8 +161,10 @@ class TelegramBot:
157
161
  if not text or not chat_id:
158
162
  continue
159
163
 
160
- # ACL check
161
- if self.allowed_chat_ids and chat_id not in self.allowed_chat_ids:
164
+ # ACL check. Fails closed: an empty TELEGRAM_ALLOWED_IDS allows
165
+ # nobody. It used to allow everybody — anyone who found the bot
166
+ # could drive the daemon's commands.
167
+ if not self.is_allowed(chat_id):
162
168
  await self.send_message(
163
169
  chat_id,
164
170
  "⛔ 未授权。请将你的 Chat ID 添加到 `TELEGRAM_ALLOWED_IDS`。\n你的 ID: `" + str(chat_id) + "`",
@@ -80,7 +80,9 @@ async def _handle_message(raw_msg: dict, ws) -> None:
80
80
  result = {"error": "aria_feishu_bot unavailable"}
81
81
  else:
82
82
  try:
83
- result = await bot.dispatch_event(payload)
83
+ # The relay routes an event only to the machine its sender bound
84
+ # with a code shown here, so that binding is the authorization.
85
+ result = await bot.dispatch_event(payload, authorized_by_binding=True)
84
86
  except Exception as e:
85
87
  logger.exception("dispatch_event error")
86
88
  result = {"error": str(e)[:300]}
@@ -55,6 +55,8 @@ from __future__ import annotations
55
55
 
56
56
  import importlib.util
57
57
  import json
58
+ import os
59
+ import shlex
58
60
  import shutil
59
61
  import subprocess
60
62
  import sys
@@ -299,8 +301,34 @@ def _resolve(command: str) -> str:
299
301
  Without this a suite silently verifies against whatever ``python3`` means
300
302
  on PATH, which is how five tasks once reported red because that
301
303
  interpreter had no pytest installed.
304
+
305
+ The path is quoted, because the command runs through a shell. Unquoted, an
306
+ interpreter under "Application Support" — where the macOS app keeps its
307
+ projects — split at the space, every check exited 126, and the pre-flight
308
+ reported all four tasks red: measuring nothing while saying it was fine.
302
309
  """
303
- return (command or "").replace("{python}", sys.executable)
310
+ if os.name == "nt":
311
+ interpreter = subprocess.list2cmdline([sys.executable])
312
+ else:
313
+ interpreter = shlex.quote(sys.executable)
314
+ return (command or "").replace("{python}", interpreter)
315
+
316
+
317
+ # Exit codes with which the shell says it never ran the check at all: 125 is
318
+ # _run's own "could not start", 126 not executable, 127 not found, 9009 the
319
+ # Windows not-found. A red result for any of these is not a broken fixture and
320
+ # not a failed agent — counting it as either lets an environment problem pose
321
+ # as a measurement.
322
+ _COULD_NOT_RUN = {125: "could not start", 126: "not executable", 127: "command not found",
323
+ 9009: "command not found"}
324
+
325
+
326
+ def _could_not_run(code: int, log: str) -> str:
327
+ reason = _COULD_NOT_RUN.get(code)
328
+ if reason is None:
329
+ return ""
330
+ last = (log or "").strip().splitlines()[-1:] or [""]
331
+ return f"the check itself could not run (exit {code}, {reason}): {last[0]}".rstrip(": ")
304
332
 
305
333
 
306
334
  def _missing_modules(names: Iterable[str]) -> list[str]:
@@ -488,6 +516,9 @@ def run_task(
488
516
  # ── the pre-flight ────────────────────────────────────────────────
489
517
  # Confirm the task is actually broken before asking anyone to fix it.
490
518
  before_code, before_log = _run(task.verify, workspace, task.timeout)
519
+ broken = _could_not_run(before_code, before_log)
520
+ if broken:
521
+ return _result(ERROR, exit_code=before_code, detail=broken, log=_trim(before_log))
491
522
  if before_code == 0 and not task.allow_green_start:
492
523
  return _result(
493
524
  INVALID, exit_code=0,
@@ -526,6 +557,10 @@ def run_task(
526
557
  after_code, after_log = _run(task.verify, workspace, task.timeout)
527
558
  if after_code == 0:
528
559
  return _result(PASS, exit_code=0, changed=changed)
560
+ broken = _could_not_run(after_code, after_log)
561
+ if broken:
562
+ return _result(ERROR, exit_code=after_code, detail=broken,
563
+ log=_trim(after_log), changed=changed)
529
564
 
530
565
  # Red — now the solver's status decides who is to blame. A subprocess
531
566
  # that died in seconds on a provider outage or a crash never gave the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.61.0
3
+ Version: 0.63.0
4
4
  Summary: AI coding and research workspace with optional finance and connected-domain tools
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/artheras/aria-code
@@ -511,6 +511,7 @@ tests/test_canvas_cmds.py
511
511
  tests/test_channel_intake.py
512
512
  tests/test_channels.py
513
513
  tests/test_chart_handlers.py
514
+ tests/test_chat_bots_fail_closed.py
514
515
  tests/test_chat_routing.py
515
516
  tests/test_ci_security_workflow.py
516
517
  tests/test_cli_app_split.py
@@ -0,0 +1,178 @@
1
+ """Chat bots must refuse by default and must not approve tools on anyone's behalf.
2
+
3
+ Before 2026-10-03 three things combined on the Feishu bot:
4
+
5
+ 1. FEISHU_ALLOWED_USER_IDS empty meant "allow everybody";
6
+ 2. the bot ran aria with ARIA_BOT_MODE=1, which started the session with
7
+ every tool approved — run_command, write_file, edit_file, multi_edit;
8
+ 3. the standalone server dispatched any POST without checking it came from
9
+ Feishu, so the sender (allowlisted or not) was whatever the POST said.
10
+
11
+ Together: anyone who could reach the port, or message an unconfigured bot,
12
+ could run shell commands on its host. The Telegram bot had (1) too. Each test
13
+ here pins one link of that chain.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import asyncio
19
+ import hashlib
20
+ import json
21
+ import os
22
+ import subprocess
23
+ import sys
24
+ from pathlib import Path
25
+ from unittest import mock
26
+
27
+ import pytest
28
+
29
+ import aria_feishu_bot as bot
30
+ from aria_telegram_bot import TelegramBot
31
+
32
+ ROOT = Path(__file__).resolve().parents[1]
33
+
34
+ ENV_KEYS = ("FEISHU_ALLOWED_USER_IDS", "FEISHU_ENCRYPT_KEY", "FEISHU_VERIFICATION_TOKEN",
35
+ "FEISHU_ALLOW_UNVERIFIED_EVENTS", "ARIA_BOT_ALLOW_TOOLS")
36
+
37
+
38
+ @pytest.fixture(autouse=True)
39
+ def clean_env(monkeypatch):
40
+ for key in ENV_KEYS:
41
+ monkeypatch.delenv(key, raising=False)
42
+
43
+
44
+ def _event(text="/run /price AAPL", *, open_id="ou_stranger", user_id="", chat_type="p2p"):
45
+ return {
46
+ "header": {"event_type": "im.message.receive_v1"},
47
+ "event": {
48
+ "sender": {"sender_id": {"open_id": open_id, "user_id": user_id}},
49
+ "message": {"message_id": "om_1", "chat_id": "oc_1", "chat_type": chat_type,
50
+ "message_type": "text", "content": json.dumps({"text": text})},
51
+ },
52
+ }
53
+
54
+
55
+ def _dispatch(event, **kwargs):
56
+ """Run dispatch_event and report (replies sent, commands started)."""
57
+ replies, commands = [], []
58
+
59
+ async def fake_reply(message_id, text):
60
+ replies.append(text)
61
+
62
+ async def fake_command(text, message_id, user_id, chat_id):
63
+ commands.append(text)
64
+
65
+ async def run():
66
+ with mock.patch.object(bot, "reply_text", fake_reply), \
67
+ mock.patch.object(bot, "_handle_command", fake_command):
68
+ await bot.dispatch_event(event, **kwargs)
69
+ await asyncio.sleep(0) # let create_task'd handlers run
70
+
71
+ asyncio.run(run())
72
+ return replies, commands
73
+
74
+
75
+ class TestFeishuAllowlist:
76
+ def test_an_empty_allowlist_allows_nobody(self):
77
+ assert not bot._is_allowed_user("ou_anyone", "u_anyone")
78
+
79
+ def test_either_sender_id_can_be_listed(self, monkeypatch):
80
+ monkeypatch.setenv("FEISHU_ALLOWED_USER_IDS", "ou_alice, u_bob")
81
+ assert bot._is_allowed_user("", "ou_alice")
82
+ assert bot._is_allowed_user("u_bob", "ou_other")
83
+ assert not bot._is_allowed_user("u_eve", "ou_eve")
84
+
85
+ def test_an_unlisted_sender_runs_nothing_and_is_told_their_id(self):
86
+ replies, commands = _dispatch(_event())
87
+ assert commands == []
88
+ assert len(replies) == 1 and "ou_stranger" in replies[0]
89
+
90
+ def test_in_a_group_an_unlisted_sender_is_ignored_silently(self):
91
+ replies, commands = _dispatch(_event(chat_type="group"))
92
+ assert (replies, commands) == ([], [])
93
+
94
+ def test_a_listed_sender_is_served(self, monkeypatch):
95
+ monkeypatch.setenv("FEISHU_ALLOWED_USER_IDS", "ou_alice")
96
+ _, commands = _dispatch(_event(open_id="ou_alice"))
97
+ assert commands == ["/run /price AAPL"]
98
+
99
+ def test_the_relay_binding_authorizes_its_sender(self):
100
+ # The relay only forwards to the machine the sender bound.
101
+ _, commands = _dispatch(_event(), authorized_by_binding=True)
102
+ assert commands == ["/run /price AAPL"]
103
+
104
+ def test_the_relay_client_says_so(self):
105
+ source = (ROOT / "src" / "aria_code" / "clients" / "aria_relay_client.py").read_text(encoding="utf-8")
106
+ assert "dispatch_event(payload, authorized_by_binding=True)" in source
107
+
108
+
109
+ class TestFeishuEventVerification:
110
+ BODY = json.dumps({"token": "tok", "challenge": "c"}).encode()
111
+
112
+ def test_nothing_configured_refuses_everything(self):
113
+ trusted, reason = bot.verify_feishu_request({}, self.BODY, json.loads(self.BODY))
114
+ assert not trusted and "refused" in reason
115
+
116
+ def test_the_local_testing_escape_hatch_is_explicit(self, monkeypatch):
117
+ monkeypatch.setenv("FEISHU_ALLOW_UNVERIFIED_EVENTS", "1")
118
+ assert bot.verify_feishu_request({}, self.BODY, {})[0]
119
+
120
+ def test_verification_token(self, monkeypatch):
121
+ monkeypatch.setenv("FEISHU_VERIFICATION_TOKEN", "tok")
122
+ assert bot.verify_feishu_request({}, self.BODY, {"token": "tok"})[0]
123
+ assert not bot.verify_feishu_request({}, self.BODY, {"token": "forged"})[0]
124
+
125
+ def test_signature(self, monkeypatch):
126
+ monkeypatch.setenv("FEISHU_ENCRYPT_KEY", "key")
127
+ good = hashlib.sha256(b"17" + b"n" + b"key" + self.BODY).hexdigest()
128
+ headers = {"X-Lark-Request-Timestamp": "17", "X-Lark-Request-Nonce": "n"}
129
+ assert bot.verify_feishu_request({**headers, "X-Lark-Signature": good}, self.BODY, {})[0]
130
+ assert not bot.verify_feishu_request({**headers, "X-Lark-Signature": "0" * 64}, self.BODY, {})[0]
131
+ assert not bot.verify_feishu_request(headers, self.BODY, {})[0]
132
+
133
+ def test_the_standalone_server_refuses_a_forged_event(self, monkeypatch):
134
+ aiohttp_test = pytest.importorskip("aiohttp.test_utils")
135
+ monkeypatch.setenv("FEISHU_VERIFICATION_TOKEN", "tok")
136
+ monkeypatch.setenv("FEISHU_ALLOWED_USER_IDS", "ou_admin")
137
+ dispatched = []
138
+
139
+ async def fake_dispatch(body, **kwargs):
140
+ dispatched.append(body)
141
+ return {"code": 0}
142
+
143
+ async def run():
144
+ with mock.patch.object(bot, "dispatch_event", fake_dispatch):
145
+ async with aiohttp_test.TestClient(aiohttp_test.TestServer(bot._standalone_app())) as client:
146
+ forged = _event(open_id="ou_admin") # claims to be the admin, has no token
147
+ refused = await client.post("/feishu/event", data=json.dumps(forged))
148
+ genuine = await client.post("/feishu/event", data=json.dumps({**forged, "token": "tok"}))
149
+ return refused.status, genuine.status
150
+
151
+ refused, genuine = asyncio.run(run())
152
+ assert refused == 401
153
+ assert genuine == 200
154
+ assert len(dispatched) == 1
155
+
156
+
157
+ class TestBotsDoNotApproveTools:
158
+ def test_bot_mode_starts_with_nothing_approved(self):
159
+ proc = subprocess.run(
160
+ [sys.executable, "-c", "import aria_code.aria_cli as c; print(c._auto_approve_session)"],
161
+ capture_output=True, text=True, timeout=120, env={**os.environ, "ARIA_BOT_MODE": "1"},
162
+ )
163
+ assert proc.returncode == 0, proc.stderr[-1000:]
164
+ assert proc.stdout.strip().splitlines()[-1] == "False"
165
+
166
+ def test_no_tools_are_allowed_unless_the_operator_names_them(self, monkeypatch):
167
+ assert bot._bot_cli_flags() == []
168
+ monkeypatch.setenv("ARIA_BOT_ALLOW_TOOLS", "write_file, edit_file")
169
+ assert bot._bot_cli_flags() == ["--allow-tools", "write_file,edit_file"]
170
+
171
+
172
+ class TestTelegramAllowlist:
173
+ def test_an_empty_allowlist_allows_nobody(self):
174
+ assert not TelegramBot(token="t").is_allowed(12345)
175
+
176
+ def test_a_listed_chat_is_allowed(self):
177
+ assert TelegramBot(token="t", allowed_chat_ids={12345}).is_allowed(12345)
178
+ assert not TelegramBot(token="t", allowed_chat_ids={12345}).is_allowed(999)
@@ -1,6 +1,7 @@
1
1
  """Regression checks for model-facing code tools."""
2
2
 
3
3
  import asyncio
4
+ import shlex
4
5
  import sys
5
6
 
6
7
  from aria_code.agents.engineering.coder import CoderAgent
@@ -13,7 +14,9 @@ def call(agent, name, args):
13
14
  def test_command_requires_real_approval(tmp_path):
14
15
  agent = CoderAgent(output_dir=tmp_path)
15
16
  marker = tmp_path / "executed"
16
- command = f'{sys.executable} -c "open(\'executed\', \'w\').write(\'yes\')"'
17
+ # Quoted: run_command splits with shlex, and an interpreter under
18
+ # "Application Support" would otherwise split at the space.
19
+ command = f'{shlex.quote(sys.executable)} -c "open(\'executed\', \'w\').write(\'yes\')"'
17
20
  assert "approval is unavailable" in call(agent, "run_command", {"command": command})
18
21
  assert not marker.exists()
19
22
  agent.command_approval = lambda argv, cwd: True
@@ -129,6 +129,34 @@ class EnvironmentTests(HarnessBase):
129
129
  # Green start, so INVALID — which proves the interpreter matched.
130
130
  self.assertEqual(result.outcome, INVALID)
131
131
 
132
+ def test_an_interpreter_path_with_a_space_still_runs_the_check(self):
133
+ # The macOS app keeps projects under "Application Support". Unquoted,
134
+ # {python} split there and every check exited 126.
135
+ import os
136
+ import sys
137
+ from unittest import mock
138
+
139
+ from aria_code.evals import harness
140
+
141
+ if os.name == "nt":
142
+ self.skipTest("symlinking an interpreter needs privileges on Windows")
143
+ spaced = self.fixtures.parent / "Application Support" / "python"
144
+ spaced.parent.mkdir(parents=True)
145
+ spaced.symlink_to(sys.executable)
146
+ _fixture(self.fixtures, "broken", {"check.py": "import sys; sys.exit(1)\n"})
147
+ with mock.patch.object(harness.sys, "executable", str(spaced)):
148
+ result = self._run(self._task(), lambda p, w: None)
149
+ self.assertEqual(result.outcome, FAIL, result.detail)
150
+ self.assertEqual(result.exit_code, 1)
151
+
152
+ def test_a_check_the_shell_cannot_run_is_an_error_not_a_red_task(self):
153
+ # A pre-flight that counts "command not found" as red reports a healthy
154
+ # suite while measuring nothing.
155
+ _fixture(self.fixtures, "broken", {"check.py": _GUARD})
156
+ result = self._run(self._task(verify="definitely_not_a_command_xyz"), lambda p, w: None)
157
+ self.assertEqual(result.outcome, ERROR)
158
+ self.assertIn("could not run", result.detail)
159
+
132
160
  def test_a_check_that_never_finishes_is_a_failure(self):
133
161
  _fixture(self.fixtures, "broken", {"check.py": "import time; time.sleep(30)\n"})
134
162
  result = self._run(self._task(timeout=1), lambda p, w: None)
File without changes
File without changes
File without changes
File without changes