aria-code 0.63.0__tar.gz → 0.64.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 (711) hide show
  1. {aria_code-0.63.0 → aria_code-0.64.0}/PKG-INFO +1 -1
  2. {aria_code-0.63.0 → aria_code-0.64.0}/pyproject.toml +1 -1
  3. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/_version.py +1 -1
  4. aria_code-0.64.0/src/aria_code/apps/channels/README.md +47 -0
  5. aria_code-0.64.0/src/aria_code/apps/channels/conversation.py +274 -0
  6. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_feishu_bot.py +123 -16
  7. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_tenancy.py +39 -1
  8. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/PKG-INFO +1 -1
  9. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/SOURCES.txt +2 -0
  10. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_chat_bots_fail_closed.py +3 -1
  11. aria_code-0.64.0/tests/test_conversation_core.py +273 -0
  12. aria_code-0.63.0/src/aria_code/apps/channels/README.md +0 -15
  13. {aria_code-0.63.0 → aria_code-0.64.0}/LICENSE +0 -0
  14. {aria_code-0.63.0 → aria_code-0.64.0}/NOTICE +0 -0
  15. {aria_code-0.63.0 → aria_code-0.64.0}/README.md +0 -0
  16. {aria_code-0.63.0 → aria_code-0.64.0}/setup.cfg +0 -0
  17. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/__init__.py +0 -0
  18. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/__init__.py +0 -0
  19. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  20. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  21. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  22. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  23. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/__init__.py +0 -0
  24. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/base.py +0 -0
  25. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/code_review.py +0 -0
  26. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/__init__.py +0 -0
  27. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  28. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/critic.py +0 -0
  29. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/deepen.py +0 -0
  30. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/models.py +0 -0
  31. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  32. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  33. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/themes.py +0 -0
  34. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/tiers.py +0 -0
  35. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  36. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/engineering/coder.py +0 -0
  37. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/engineering/tester.py +0 -0
  38. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/__init__.py +0 -0
  39. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  40. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  41. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  42. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/debate.py +0 -0
  43. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/earnings.py +0 -0
  44. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  45. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/macro.py +0 -0
  46. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/news.py +0 -0
  47. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/risk.py +0 -0
  48. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/sector.py +0 -0
  49. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/strategist.py +0 -0
  50. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  51. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  52. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/technical.py +0 -0
  53. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/orchestrator.py +0 -0
  54. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  55. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/__init__.py +0 -0
  56. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  57. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/business_match.py +0 -0
  58. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  59. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  60. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  61. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  62. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  63. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  64. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  65. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/registry.py +0 -0
  66. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/signal_scheme.py +0 -0
  67. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/sports/__init__.py +0 -0
  68. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  69. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/supervisor.py +0 -0
  70. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/team.py +0 -0
  71. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  72. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  73. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  74. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  75. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  76. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  77. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  78. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  79. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  80. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  81. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  82. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aliyun_data_client.py +0 -0
  83. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/README.md +0 -0
  84. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/__init__.py +0 -0
  85. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/__init__.py +0 -0
  86. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/intake.py +0 -0
  87. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/registry.py +0 -0
  88. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  89. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/README.md +0 -0
  90. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/__init__.py +0 -0
  91. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/_optional.py +0 -0
  92. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  93. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  94. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  95. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  96. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  97. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  98. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  99. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  100. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  101. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  102. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  103. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  104. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  105. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  106. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  107. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  108. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  109. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  110. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  111. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  112. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  113. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  114. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  115. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  116. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  117. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  118. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  119. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  120. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  121. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  122. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  123. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  124. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  125. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  126. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  127. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  128. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  129. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  130. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  131. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  132. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  133. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/config_store.py +0 -0
  134. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/constants.py +0 -0
  135. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/context.py +0 -0
  136. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  137. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/direct.py +0 -0
  138. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  139. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  140. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  141. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/google_login.py +0 -0
  142. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  143. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  144. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  145. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  146. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  147. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  148. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  149. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/helpers.py +0 -0
  150. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/hooks.py +0 -0
  151. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/i18n.py +0 -0
  152. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/intent.py +0 -0
  153. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  154. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  155. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  156. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  157. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/main.py +0 -0
  158. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  159. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  160. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  161. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  162. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  163. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  164. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  165. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  166. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/preflight.py +0 -0
  167. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  168. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  169. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  170. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  171. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  172. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  173. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  174. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  175. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  176. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  177. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  178. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  179. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  180. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  181. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  182. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  183. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  184. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  185. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  186. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  187. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  188. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  189. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/session_export.py +0 -0
  190. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  191. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/session_store.py +0 -0
  192. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  193. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  194. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  195. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  196. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  197. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  198. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  199. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  200. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  201. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  202. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  203. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  204. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  205. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  206. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/update_check.py +0 -0
  207. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  208. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  209. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/daemon/README.md +0 -0
  210. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/vscode/README.md +0 -0
  211. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/vscode/package.json +0 -0
  212. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_cli.py +0 -0
  213. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_daemon.py +0 -0
  214. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_mcp_server.py +0 -0
  215. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_relay_client.py +0 -0
  216. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_relay_server.py +0 -0
  217. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_telegram_bot.py +0 -0
  218. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ariarc.py +0 -0
  219. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/artifacts.py +0 -0
  220. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/backtest_engine.py +0 -0
  221. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/backtest_report.py +0 -0
  222. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/__init__.py +0 -0
  223. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/automation.py +0 -0
  224. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/base.py +0 -0
  225. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/capabilities.py +0 -0
  226. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  227. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  228. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  229. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  230. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  231. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  232. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/config.py +0 -0
  233. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  234. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  235. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  236. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  237. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  238. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/paper_broker.py +0 -0
  239. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/planning.py +0 -0
  240. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/registry.py +0 -0
  241. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/trading.py +0 -0
  242. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/canva_client.py +0 -0
  243. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/change_store.py +0 -0
  244. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/__init__.py +0 -0
  245. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  246. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  247. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/canva_client.py +0 -0
  248. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/figma_client.py +0 -0
  249. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/football_data_client.py +0 -0
  250. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/kling_video_client.py +0 -0
  251. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/market_data_client.py +0 -0
  252. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/openai_image_client.py +0 -0
  253. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/runway_video_client.py +0 -0
  254. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  255. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/cloud_memory.py +0 -0
  256. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/command_safety.py +0 -0
  257. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/computer_use_tools.py +0 -0
  258. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/dashboard_generator.py +0 -0
  259. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/data_analysis_tools.py +0 -0
  260. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/data_cleaner.py +0 -0
  261. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/data_service.py +0 -0
  262. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/__init__.py +0 -0
  263. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/base.py +0 -0
  264. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/router.py +0 -0
  265. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  266. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  267. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  268. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  269. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  270. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  271. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  272. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  273. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  274. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  275. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/demo_player.py +0 -0
  276. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/doctor.py +0 -0
  277. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/__init__.py +0 -0
  278. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/backtest_engine.py +0 -0
  279. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/backtest_report.py +0 -0
  280. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/finance_formulas.py +0 -0
  281. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  282. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/strategy_vault.py +0 -0
  283. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/evals/__init__.py +0 -0
  284. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/evals/harness.py +0 -0
  285. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/evals/runner.py +0 -0
  286. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/external_agent_runner.py +0 -0
  287. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/figma_client.py +0 -0
  288. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/file_analysis_tools.py +0 -0
  289. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/finance_formulas.py +0 -0
  290. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/football_data_client.py +0 -0
  291. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/image_gen_tools.py +0 -0
  292. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/intent_classifier.py +0 -0
  293. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/kling_video_client.py +0 -0
  294. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/licensing.py +0 -0
  295. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/local_finance_tools.py +0 -0
  296. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/local_image_provider.py +0 -0
  297. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/local_llm_provider.py +0 -0
  298. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/macro_tools.py +0 -0
  299. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/markdown_pdf.py +0 -0
  300. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/market_data_client.py +0 -0
  301. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/mcp_client.py +0 -0
  302. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/memory_manager.py +0 -0
  303. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/model_capability.py +0 -0
  304. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/notification_tools.py +0 -0
  305. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/openai_image_client.py +0 -0
  306. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/__init__.py +0 -0
  307. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  308. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  309. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  310. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  311. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  312. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  313. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  314. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/export.py +0 -0
  315. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  316. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  317. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  318. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  319. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  320. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  321. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  322. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  323. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  324. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  325. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  326. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  327. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  328. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  329. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  330. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  331. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  332. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  333. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  334. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  335. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  336. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/context.py +0 -0
  337. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  338. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/data.py +0 -0
  339. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  340. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/references.py +0 -0
  341. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  342. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  343. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  344. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  345. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  346. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  347. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  348. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  349. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  350. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  351. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  352. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  353. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  354. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  355. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  356. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  357. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  358. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  359. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  360. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  361. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  362. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  363. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  364. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  365. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  366. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  367. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  368. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  369. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  370. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  371. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  372. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  373. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  374. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  375. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  376. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  377. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  378. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  379. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  380. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  381. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/__init__.py +0 -0
  382. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/base.py +0 -0
  383. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/finance/__init__.py +0 -0
  384. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  385. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/payments/__init__.py +0 -0
  386. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/realty/__init__.py +0 -0
  387. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/registry.py +0 -0
  388. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/rules.py +0 -0
  389. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/plan_utils.py +0 -0
  390. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/plugin_loader.py +0 -0
  391. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/portfolio_ledger.py +0 -0
  392. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/preview_server.py +0 -0
  393. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/privacy/__init__.py +0 -0
  394. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/privacy/feedback.py +0 -0
  395. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_review.py +0 -0
  396. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_review_api.py +0 -0
  397. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_review_server.py +0 -0
  398. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_tools.py +0 -0
  399. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/__init__.py +0 -0
  400. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/__init__.py +0 -0
  401. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  402. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  403. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/base.py +0 -0
  404. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/custom.py +0 -0
  405. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/ollama.py +0 -0
  406. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  407. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/registry.py +0 -0
  408. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/local_image_provider.py +0 -0
  409. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  410. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/realty_data_tools.py +0 -0
  411. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/report_exporters.py +0 -0
  412. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/report_generator.py +0 -0
  413. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/__init__.py +0 -0
  414. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/acceptance.py +0 -0
  415. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/agent_loop.py +0 -0
  416. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/approval.py +0 -0
  417. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/budget.py +0 -0
  418. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/checkpoints.py +0 -0
  419. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/crash_report.py +0 -0
  420. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/events.py +0 -0
  421. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/gateway.py +0 -0
  422. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/lsp.py +0 -0
  423. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/orchestrator.py +0 -0
  424. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/repo_map.py +0 -0
  425. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/run_state.py +0 -0
  426. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/run_store.py +0 -0
  427. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/self_healing.py +0 -0
  428. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/subagent.py +0 -0
  429. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/task_ledger.py +0 -0
  430. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  431. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/tool_executor.py +0 -0
  432. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/tool_policy.py +0 -0
  433. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/worktrees.py +0 -0
  434. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runway_video_client.py +0 -0
  435. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/safety/__init__.py +0 -0
  436. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/safety/permissions.py +0 -0
  437. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/safety/service.py +0 -0
  438. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/setup_wizard.py +0 -0
  439. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/spreadsheet_tools.py +0 -0
  440. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/strategy_vault.py +0 -0
  441. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/__init__.py +0 -0
  442. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/artifact_tools.py +0 -0
  443. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/broker_tools.py +0 -0
  444. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  445. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  446. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  447. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  448. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  449. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/extended_tools.py +0 -0
  450. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  451. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  452. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  453. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  454. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  455. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_io.py +0 -0
  456. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_tools.py +0 -0
  457. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/macro_tools.py +0 -0
  458. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/notification_tools.py +0 -0
  459. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/project_tools.py +0 -0
  460. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  461. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  462. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/stripe_tools.py +0 -0
  463. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/__init__.py +0 -0
  464. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/banner.py +0 -0
  465. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/completer.py +0 -0
  466. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/console.py +0 -0
  467. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/image_render.py +0 -0
  468. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/input_box.py +0 -0
  469. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/picker.py +0 -0
  470. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/__init__.py +0 -0
  471. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/finance.py +0 -0
  472. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/market.py +0 -0
  473. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/output.py +0 -0
  474. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/responsive.py +0 -0
  475. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/team.py +0 -0
  476. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/robot.py +0 -0
  477. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  478. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/utils/vscode_uri.py +0 -0
  479. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/video_analysis.py +0 -0
  480. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/video_editor.py +0 -0
  481. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace/__init__.py +0 -0
  482. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace/files.py +0 -0
  483. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace/verify.py +0 -0
  484. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_changes.py +0 -0
  485. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_context.py +0 -0
  486. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_service.py +0 -0
  487. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_tools.py +0 -0
  488. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  489. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  490. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/requires.txt +0 -0
  491. {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/top_level.txt +0 -0
  492. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_adk_market_tools.py +0 -0
  493. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_agent_team_fallback.py +0 -0
  494. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_analyze_file_tool.py +0 -0
  495. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_architecture_ledger_is_true.py +0 -0
  496. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_architecture_report.py +0 -0
  497. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_aria_cli_core.py +0 -0
  498. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_aria_mcp_server.py +0 -0
  499. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_aria_sdk.py +0 -0
  500. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_artifact_publishing.py +0 -0
  501. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_artifacts_and_reports.py +0 -0
  502. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ashare_prediction_cmds.py +0 -0
  503. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_backtest_cmds.py +0 -0
  504. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_backtest_engine.py +0 -0
  505. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_backtest_report.py +0 -0
  506. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  507. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broken_akshare_is_optional.py +0 -0
  508. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_automation.py +0 -0
  509. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  510. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_planning.py +0 -0
  511. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_safety.py +0 -0
  512. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_tools.py +0 -0
  513. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_budget.py +0 -0
  514. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_business_workflow_cmds.py +0 -0
  515. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_canva_client.py +0 -0
  516. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_canvas_cmds.py +0 -0
  517. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_channel_intake.py +0 -0
  518. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_channels.py +0 -0
  519. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_chart_handlers.py +0 -0
  520. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_chat_routing.py +0 -0
  521. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ci_security_workflow.py +0 -0
  522. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_app_split.py +0 -0
  523. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_bootstrap.py +0 -0
  524. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_config_store.py +0 -0
  525. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  526. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_runtime_consumer.py +0 -0
  527. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_tool_executor_module.py +0 -0
  528. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cloud_memory.py +0 -0
  529. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_code_audit_tools.py +0 -0
  530. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_code_review_agent.py +0 -0
  531. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_codegen_output.py +0 -0
  532. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_coder_tester_self_healing.py +0 -0
  533. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_coder_tool_safety.py +0 -0
  534. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_collaboration.py +0 -0
  535. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_command_loggers.py +0 -0
  536. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_command_safety.py +0 -0
  537. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_completions_builder.py +0 -0
  538. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_config_paths.py +0 -0
  539. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_configured_provider.py +0 -0
  540. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_container_entrypoint.py +0 -0
  541. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_container_entrypoints.py +0 -0
  542. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_context_checkpoints.py +0 -0
  543. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_context_references.py +0 -0
  544. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_context_service.py +0 -0
  545. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_crash_report.py +0 -0
  546. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_credential_file_permissions.py +0 -0
  547. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_custom_providers.py +0 -0
  548. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_daemon_gateway_config.py +0 -0
  549. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_dashboard_generator.py +0 -0
  550. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_data_service.py +0 -0
  551. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_data_service_imports.py +0 -0
  552. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_datasource_routing.py +0 -0
  553. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_deep_analysis.py +0 -0
  554. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_degrades_without_quant_engine.py +0 -0
  555. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  556. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_doctor.py +0 -0
  557. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  558. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_doctor_npm_scope.py +0 -0
  559. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_engine_boundary.py +0 -0
  560. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_enterprise_tool_honesty.py +0 -0
  561. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_env_switch_docs.py +0 -0
  562. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_evals_harness.py +0 -0
  563. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_extended_tools.py +0 -0
  564. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_feishu_swarm_config.py +0 -0
  565. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_finance_renderers.py +0 -0
  566. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_finance_service_catalog.py +0 -0
  567. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_first_run_works.py +0 -0
  568. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_football_agent.py +0 -0
  569. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_football_prediction_output.py +0 -0
  570. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_google_cloud_routing.py +0 -0
  571. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_google_login.py +0 -0
  572. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_google_search_provider.py +0 -0
  573. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_headless_is_agentic.py +0 -0
  574. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_image_gen_tools.py +0 -0
  575. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_image_inputs.py +0 -0
  576. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_import_graph_budget.py +0 -0
  577. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_intent_router.py +0 -0
  578. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_intent_signals.py +0 -0
  579. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_kling_video_client.py +0 -0
  580. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_lazy_rebind.py +0 -0
  581. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_legacy_module_imports.py +0 -0
  582. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_license_consistency.py +0 -0
  583. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_licensing.py +0 -0
  584. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_local_image_provider.py +0 -0
  585. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_logistics_3pl.py +0 -0
  586. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_logistics_and_finance_agents.py +0 -0
  587. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_lsp.py +0 -0
  588. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_markdown_pdf.py +0 -0
  589. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_data_client.py +0 -0
  590. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_history_inheritance.py +0 -0
  591. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_history_tool.py +0 -0
  592. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_symbol_extraction.py +0 -0
  593. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_universe.py +0 -0
  594. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_mcp_circuit.py +0 -0
  595. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_mcp_client.py +0 -0
  596. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_model_capability_registry.py +0 -0
  597. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_model_choice_is_the_users.py +0 -0
  598. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_model_selection_state.py +0 -0
  599. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_native_binary_entrypoints.py +0 -0
  600. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_native_installer.py +0 -0
  601. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_new_modules.py +0 -0
  602. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  603. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_no_uncommitted_imports.py +0 -0
  604. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ollama_stream_imports.py +0 -0
  605. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ollama_stream_tools.py +0 -0
  606. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_openai_image_client.py +0 -0
  607. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_operations_suite.py +0 -0
  608. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_output_rendering.py +0 -0
  609. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packages_facade.py +0 -0
  610. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packaging_constraints.py +0 -0
  611. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packaging_manifest.py +0 -0
  612. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packs_domains.py +0 -0
  613. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_pdf_report.py +0 -0
  614. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_pick_best_installed_model.py +0 -0
  615. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_plan_mode.py +0 -0
  616. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_platform_package_assembly.py +0 -0
  617. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_platform_packages.py +0 -0
  618. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_plotly_html_output.py +0 -0
  619. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_portfolio_ledger.py +0 -0
  620. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_post_turn_context_decision.py +0 -0
  621. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_preflight.py +0 -0
  622. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_preview_server.py +0 -0
  623. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_privacy_feedback.py +0 -0
  624. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_project_aria.py +0 -0
  625. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_project_review.py +0 -0
  626. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_project_review_api.py +0 -0
  627. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_prompt_assembly.py +0 -0
  628. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_prompt_selection.py +0 -0
  629. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_autoconfig.py +0 -0
  630. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_error_messages.py +0 -0
  631. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_integration.py +0 -0
  632. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_registry.py +0 -0
  633. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_public_service_status.py +0 -0
  634. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_quant_engine_namespace.py +0 -0
  635. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_rebind_contract.py +0 -0
  636. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_rebind_namespace_contract.py +0 -0
  637. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_relay_event_verification.py +0 -0
  638. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_chain.py +0 -0
  639. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_commit_identity.py +0 -0
  640. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_push_is_atomic.py +0 -0
  641. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_reaches_the_registries.py +0 -0
  642. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_verification_waits.py +0 -0
  643. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_workflow_permissions.py +0 -0
  644. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_report_charts.py +0 -0
  645. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_report_generator.py +0 -0
  646. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_research_protocol.py +0 -0
  647. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_research_quality.py +0 -0
  648. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_responsive_rendering.py +0 -0
  649. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_root_module_budget.py +0 -0
  650. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  651. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_acceptance.py +0 -0
  652. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_agent_loop.py +0 -0
  653. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_approval.py +0 -0
  654. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_bridge.py +0 -0
  655. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_bridge_fallback.py +0 -0
  656. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_checkpoints.py +0 -0
  657. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_gateway.py +0 -0
  658. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_repo_map.py +0 -0
  659. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_run_store.py +0 -0
  660. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_tool_executor.py +0 -0
  661. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_worktrees.py +0 -0
  662. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runway_video_client.py +0 -0
  663. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_safety_permissions.py +0 -0
  664. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_safety_service.py +0 -0
  665. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_safety_service_adoption.py +0 -0
  666. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_service_diagnostics_security.py +0 -0
  667. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_session_search.py +0 -0
  668. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_settings_service.py +0 -0
  669. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_single_import_root.py +0 -0
  670. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_skill_agent_binding.py +0 -0
  671. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_skill_catalog.py +0 -0
  672. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_skill_loader.py +0 -0
  673. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_spreadsheet_tools.py +0 -0
  674. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_sse_stream_contract.py +0 -0
  675. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_startup_dashboard.py +0 -0
  676. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_streaming_pipeline.py +0 -0
  677. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_stripe_agent.py +0 -0
  678. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_subagent.py +0 -0
  679. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_supervisor_routing.py +0 -0
  680. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_system_prompts.py +0 -0
  681. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_system_tools_output.py +0 -0
  682. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_task_orchestrator.py +0 -0
  683. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_team_synthesis.py +0 -0
  684. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tls_trust_store.py +0 -0
  685. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tool_policy.py +0 -0
  686. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tool_scope.py +0 -0
  687. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_trading_service.py +0 -0
  688. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tradingview_bridge.py +0 -0
  689. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_turn_planning.py +0 -0
  690. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_completer_references.py +0 -0
  691. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_console_theme.py +0 -0
  692. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_input_box.py +0 -0
  693. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_robot_banner.py +0 -0
  694. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_verification_hint.py +0 -0
  695. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_verification_policy.py +0 -0
  696. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_version_consistency.py +0 -0
  697. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_version_counter.py +0 -0
  698. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_video_analysis.py +0 -0
  699. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_video_editor.py +0 -0
  700. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_vscode_mcp.py +0 -0
  701. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_agents.py +0 -0
  702. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_cli_registration.py +0 -0
  703. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_erp_client.py +0 -0
  704. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_workflow.py +0 -0
  705. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_wheel_is_installable.py +0 -0
  706. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_changes.py +0 -0
  707. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_context.py +0 -0
  708. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_files.py +0 -0
  709. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_scope.py +0 -0
  710. {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_service.py +0 -0
  711. {aria_code-0.63.0 → aria_code-0.64.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.63.0
3
+ Version: 0.64.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.63.0"
7
+ version = "0.64.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.63.0"
20
+ __version__ = "0.64.0"
@@ -0,0 +1,47 @@
1
+ # Channel Apps
2
+
3
+ Target role: adapters for non-terminal entrypoints.
4
+
5
+ Examples:
6
+
7
+ - relay server/client;
8
+ - Feishu bot;
9
+ - Telegram bot;
10
+ - webhooks;
11
+ - future desktop or browser UI.
12
+
13
+ Each channel should translate inbound messages into gateway requests and render
14
+ gateway responses back to the channel. It should not bypass safety, runtime, or
15
+ artifact policies.
16
+
17
+ ## The conversation layer (`conversation.py`)
18
+
19
+ Everything a chat bot decides that does not depend on the platform lives in
20
+ one module, so every channel — Feishu today, Arthera's own bot later — gets
21
+ the same rules from the same code:
22
+
23
+ | Rule | Where |
24
+ |------|-------|
25
+ | In a group, answer only when addressed; in a direct chat, always | `should_respond` |
26
+ | One group = one shipper (货主), bound by an admin with `/owner <id>` | `handle_owner_command`, `ConversationStore` |
27
+ | Admins are per channel: `ARIA_CHANNEL_ADMINS=feishu:ou_x,telegram:42` | `is_admin` |
28
+ | Context is the conversation's own recent messages, never another's; capped at 20 messages and 7 days | `ConversationStore.history` |
29
+ | A bound conversation runs every turn with `ARIA_OWNER_SCOPE`, enforced by the logistics tools themselves | `ChannelTurn.env`, `tools/logistics_tenancy.py` |
30
+
31
+ A new channel is an adapter: turn the platform's event into an
32
+ `InboundMessage`, then
33
+
34
+ ```python
35
+ if not should_respond(msg):
36
+ return
37
+ reply = handle_owner_command(msg, store) # /owner commands
38
+ if reply is None:
39
+ turn = prepare_turn(msg, store) # context + shipper scope
40
+ reply = await run_model(turn.prompt, history=turn.history, env=turn.env)
41
+ store.record(msg.key, "assistant", reply)
42
+ send(reply)
43
+ ```
44
+
45
+ `aria_feishu_bot.feishu_inbound` is the Feishu version of that first step.
46
+ Conversation keys are `<channel>:<conversation id>`, so the same chat id on
47
+ two platforms is two conversations.
@@ -0,0 +1,274 @@
1
+ """The platform-neutral half of every chat channel.
2
+
3
+ A chat bot does the same five things on any platform: decide whether a
4
+ message is for it, know which client a conversation belongs to, remember what
5
+ was just said there, keep each conversation's memory to itself, and hand the
6
+ model a turn. Only parsing the platform's event and sending its reply differ.
7
+ This module is the part that does not differ, so Feishu, Telegram, and a bot
8
+ on Arthera's own app or website share one implementation of the rules that
9
+ matter — and a new channel is an adapter of a few dozen lines:
10
+
11
+ msg = InboundMessage(channel="myapp", conversation_id=room_id, kind="group",
12
+ sender_id=user_id, text=text, mentions_bot=True)
13
+ if not should_respond(msg):
14
+ return
15
+ turn = prepare_turn(msg, store)
16
+ reply = await run_my_model(turn.prompt, history=turn.history, env=turn.env)
17
+ store.record(msg.key, "assistant", reply)
18
+
19
+ The guarantees, each tested in tests/test_conversation_core.py:
20
+
21
+ - In a group the bot answers only when addressed; in a direct chat, always.
22
+ - A conversation bound to a shipper (货主) runs every turn with
23
+ ARIA_OWNER_SCOPE set, which the logistics tools enforce themselves
24
+ (tools/logistics_tenancy.py) — the binding does not rely on the prompt.
25
+ - Only channel admins (ARIA_CHANNEL_ADMINS) can bind or unbind.
26
+ - History is per conversation and never crosses: the context for a turn is
27
+ built from that conversation's own messages and nothing else.
28
+ - History is bounded twice: the last `max_turns` messages, none older than
29
+ `ttl_seconds`. A chat bot that keeps every client message forever is a
30
+ liability, not a feature.
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ import os
36
+ import re
37
+ import sqlite3
38
+ import time
39
+ from dataclasses import dataclass, field
40
+ from pathlib import Path
41
+ from typing import Callable, Dict, List, Optional, Tuple
42
+
43
+ from aria_code.apps.channels.registry import CHANNEL_TASK_SCHEMA
44
+ from aria_code.tools.logistics_tenancy import OWNER_SCOPE_ENV
45
+
46
+ ADMINS_ENV = "ARIA_CHANNEL_ADMINS"
47
+ DB_ENV = "ARIA_CONVERSATIONS_DB"
48
+ _OWNER_ID = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_.\-]{0,63}$")
49
+
50
+
51
+ @dataclass(frozen=True)
52
+ class InboundMessage:
53
+ """One message, as any channel adapter normalises it."""
54
+
55
+ channel: str # "feishu", "telegram", "web", ...
56
+ conversation_id: str # the chat / group / room on that channel
57
+ kind: str # "direct" or "group"
58
+ sender_id: str
59
+ text: str
60
+ message_id: str = ""
61
+ mentions_bot: bool = False
62
+ reply_to: str = "" # the message this one answers, if any
63
+ sender_aliases: Tuple[str, ...] = () # other ids for the same person
64
+
65
+ @property
66
+ def key(self) -> str:
67
+ """Unique across channels: two platforms may reuse the same chat id."""
68
+ return f"{self.channel}:{self.conversation_id}"
69
+
70
+ @property
71
+ def sender_ids(self) -> Tuple[str, ...]:
72
+ return tuple(i for i in (self.sender_id, *self.sender_aliases) if i)
73
+
74
+
75
+ def should_respond(msg: InboundMessage) -> bool:
76
+ """Direct chats always; groups only when the bot is addressed."""
77
+ if msg.kind == "direct":
78
+ return True
79
+ return bool(msg.mentions_bot)
80
+
81
+
82
+ def is_admin(msg: InboundMessage, env: Optional[Dict[str, str]] = None) -> bool:
83
+ """ARIA_CHANNEL_ADMINS="feishu:ou_abc,telegram:12345" — per channel, fail closed."""
84
+ raw = (env if env is not None else os.environ).get(ADMINS_ENV, "")
85
+ admins = {item.strip() for item in raw.split(",") if item.strip()}
86
+ return any(f"{msg.channel}:{sid}" in admins for sid in msg.sender_ids)
87
+
88
+
89
+ # ── Admin commands ───────────────────────────────────────────────────────────
90
+
91
+ _OWNER_COMMAND = re.compile(r"^/(?:owner|货主)(?:\s+(\S+))?\s*$", re.IGNORECASE)
92
+ _UNBIND_WORDS = {"off", "clear", "none", "解除", "取消"}
93
+
94
+
95
+ def parse_owner_command(text: str) -> Optional[Tuple[str, str]]:
96
+ """'/owner' → show; '/owner ACME' → bind; '/owner off' → unbind. None otherwise."""
97
+ match = _OWNER_COMMAND.match((text or "").strip())
98
+ if not match:
99
+ return None
100
+ arg = (match.group(1) or "").strip()
101
+ if not arg:
102
+ return ("show", "")
103
+ if arg.lower() in _UNBIND_WORDS:
104
+ return ("unbind", "")
105
+ return ("bind", arg)
106
+
107
+
108
+ def handle_owner_command(msg: InboundMessage, store: "ConversationStore",
109
+ env: Optional[Dict[str, str]] = None) -> Optional[str]:
110
+ """Run an /owner command and return the reply text, or None if it is not one."""
111
+ command = parse_owner_command(msg.text)
112
+ if command is None:
113
+ return None
114
+ action, owner = command
115
+ current = store.owner_for(msg.key)
116
+ if action == "show":
117
+ return (f"本会话绑定的货主:{current}" if current
118
+ else "本会话未绑定货主。管理员可发送 /owner <货主ID> 绑定。")
119
+ if not is_admin(msg, env):
120
+ return "只有管理员可以修改本会话绑定的货主。"
121
+ if msg.kind != "group":
122
+ # A direct chat is one person, not a client; binding it would confine
123
+ # an operator's own chat to one shipper and surprise them later.
124
+ return "货主只能绑定到群聊:一个群对应一个货主。"
125
+ if action == "unbind":
126
+ store.unbind_owner(msg.key)
127
+ return "已解除本会话的货主绑定。"
128
+ if not _OWNER_ID.match(owner):
129
+ return "货主 ID 只能包含字母、数字、下划线、点和短横线,最长 64 个字符。"
130
+ store.bind_owner(msg.key, owner, bound_by=f"{msg.channel}:{msg.sender_id}")
131
+ return f"已绑定:本会话之后的分析只会使用货主 {owner} 的数据。"
132
+
133
+
134
+ # ── Storage ──────────────────────────────────────────────────────────────────
135
+
136
+ def default_db_path() -> Path:
137
+ configured = os.environ.get(DB_ENV, "").strip()
138
+ if configured:
139
+ return Path(configured).expanduser()
140
+ return Path.home() / ".aria" / "conversations.db"
141
+
142
+
143
+ class ConversationStore:
144
+ """Owner bindings and bounded per-conversation history, in one SQLite file."""
145
+
146
+ def __init__(self, path: Optional[Path | str] = None, *, max_turns: int = 20,
147
+ ttl_seconds: float = 7 * 86400, clock: Callable[[], float] = time.time) -> None:
148
+ self.path = Path(path) if path else default_db_path()
149
+ self.path.parent.mkdir(parents=True, exist_ok=True)
150
+ self.max_turns = max(1, int(max_turns))
151
+ self.ttl_seconds = float(ttl_seconds)
152
+ self._clock = clock
153
+ with self._db() as db:
154
+ db.executescript(
155
+ """
156
+ CREATE TABLE IF NOT EXISTS bindings (
157
+ conversation TEXT PRIMARY KEY,
158
+ owner_id TEXT NOT NULL,
159
+ bound_by TEXT NOT NULL,
160
+ bound_at REAL NOT NULL
161
+ );
162
+ CREATE TABLE IF NOT EXISTS history (
163
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
164
+ conversation TEXT NOT NULL,
165
+ role TEXT NOT NULL,
166
+ sender TEXT NOT NULL DEFAULT '',
167
+ content TEXT NOT NULL,
168
+ at REAL NOT NULL
169
+ );
170
+ CREATE INDEX IF NOT EXISTS history_by_conversation ON history (conversation, id);
171
+ """
172
+ )
173
+ try:
174
+ os.chmod(self.path, 0o600) # client messages: owner-readable only
175
+ except OSError:
176
+ pass
177
+
178
+ def _db(self) -> sqlite3.Connection:
179
+ return sqlite3.connect(str(self.path))
180
+
181
+ # bindings
182
+ def bind_owner(self, key: str, owner_id: str, *, bound_by: str) -> None:
183
+ with self._db() as db:
184
+ db.execute(
185
+ "INSERT INTO bindings (conversation, owner_id, bound_by, bound_at) VALUES (?, ?, ?, ?) "
186
+ "ON CONFLICT(conversation) DO UPDATE SET owner_id=excluded.owner_id, "
187
+ "bound_by=excluded.bound_by, bound_at=excluded.bound_at",
188
+ (key, owner_id, bound_by, self._clock()),
189
+ )
190
+
191
+ def unbind_owner(self, key: str) -> None:
192
+ with self._db() as db:
193
+ db.execute("DELETE FROM bindings WHERE conversation = ?", (key,))
194
+
195
+ def owner_for(self, key: str) -> Optional[str]:
196
+ with self._db() as db:
197
+ row = db.execute("SELECT owner_id FROM bindings WHERE conversation = ?", (key,)).fetchone()
198
+ return row[0] if row else None
199
+
200
+ # history
201
+ def record(self, key: str, role: str, content: str, *, sender: str = "") -> None:
202
+ if role not in ("user", "assistant") or not (content or "").strip():
203
+ return
204
+ now = self._clock()
205
+ with self._db() as db:
206
+ db.execute("INSERT INTO history (conversation, role, sender, content, at) VALUES (?, ?, ?, ?, ?)",
207
+ (key, role, sender, content, now))
208
+ self._prune(db, key, now)
209
+
210
+ def history(self, key: str) -> List[Dict[str, str]]:
211
+ """Oldest first, in the {role, content} shape model providers take."""
212
+ now = self._clock()
213
+ with self._db() as db:
214
+ self._prune(db, key, now)
215
+ rows = db.execute(
216
+ "SELECT role, content FROM history WHERE conversation = ? ORDER BY id", (key,)
217
+ ).fetchall()
218
+ return [{"role": role, "content": content} for role, content in rows]
219
+
220
+ def forget(self, key: str) -> None:
221
+ with self._db() as db:
222
+ db.execute("DELETE FROM history WHERE conversation = ?", (key,))
223
+
224
+ def _prune(self, db: sqlite3.Connection, key: str, now: float) -> None:
225
+ db.execute("DELETE FROM history WHERE conversation = ? AND at < ?", (key, now - self.ttl_seconds))
226
+ db.execute(
227
+ "DELETE FROM history WHERE conversation = ? AND id NOT IN "
228
+ "(SELECT id FROM history WHERE conversation = ? ORDER BY id DESC LIMIT ?)",
229
+ (key, key, self.max_turns),
230
+ )
231
+
232
+
233
+ # ── Turns ────────────────────────────────────────────────────────────────────
234
+
235
+ @dataclass(frozen=True)
236
+ class ChannelTurn:
237
+ """Everything a model call needs for one message, platform-free."""
238
+
239
+ prompt: str
240
+ history: List[Dict[str, str]] = field(default_factory=list)
241
+ owner_scope: Optional[str] = None
242
+
243
+ @property
244
+ def env(self) -> Dict[str, str]:
245
+ """Environment for a subprocess running this turn's tools."""
246
+ return {OWNER_SCOPE_ENV: self.owner_scope} if self.owner_scope else {}
247
+
248
+ def as_task(self, msg: InboundMessage) -> Dict[str, object]:
249
+ """The same turn as a structured channel task (aria.channel_task.v1)."""
250
+ return {
251
+ "schema": CHANNEL_TASK_SCHEMA,
252
+ "channel": msg.channel,
253
+ "conversation": msg.key,
254
+ "message_id": msg.message_id,
255
+ "prompt": self.prompt,
256
+ "history": list(self.history),
257
+ "owner_scope": self.owner_scope,
258
+ }
259
+
260
+
261
+ def prepare_turn(msg: InboundMessage, store: ConversationStore) -> ChannelTurn:
262
+ """Record the incoming message and build the turn that answers it.
263
+
264
+ History is read before this message is recorded, so the turn carries the
265
+ conversation so far plus the new prompt — not the prompt twice.
266
+ """
267
+ history = store.history(msg.key)
268
+ owner = store.owner_for(msg.key)
269
+ store.record(msg.key, "user", msg.text, sender=msg.sender_id)
270
+ prompt = msg.text
271
+ if owner:
272
+ prompt = (f"[本会话属于货主 {owner}。只分析该货主的数据,回答中不要提及其他货主。]\n"
273
+ f"{msg.text}")
274
+ return ChannelTurn(prompt=prompt, history=history, owner_scope=owner)
@@ -53,9 +53,20 @@ import re
53
53
  import sys
54
54
  import tempfile
55
55
  import time
56
+ from contextvars import ContextVar
56
57
  from pathlib import Path
57
58
  from typing import Any, Dict, Optional
58
59
 
60
+ from aria_code.apps.channels.conversation import (
61
+ ChannelTurn,
62
+ ConversationStore,
63
+ InboundMessage,
64
+ handle_owner_command,
65
+ prepare_turn,
66
+ should_respond,
67
+ )
68
+ from aria_code.tools.logistics_tenancy import OWNER_SCOPE_ENV
69
+
59
70
  logger = logging.getLogger(__name__)
60
71
 
61
72
  # Strip ANSI escape codes from aria CLI output
@@ -695,7 +706,7 @@ def _bot_cli_flags() -> list[str]:
695
706
  return ["--allow-tools", ",".join(tools)] if tools else []
696
707
 
697
708
 
698
- async def _query_aria_direct(text: str, timeout: int = 90) -> str:
709
+ async def _query_aria_direct(text: str, timeout: int = 90, history: Optional[list] = None) -> str:
699
710
  """
700
711
  Query the LLM directly via providers/llm/registry.py — no subprocess, no tool use.
701
712
  Used for conversational NL queries where we want a clean text answer.
@@ -709,7 +720,7 @@ async def _query_aria_direct(text: str, timeout: int = 90) -> str:
709
720
 
710
721
  collected: list[str] = []
711
722
  result = await _aio.wait_for(
712
- stream_cloud_fallback(text, history=[], on_token=collected.append),
723
+ stream_cloud_fallback(text, history=list(history or []), on_token=collected.append),
713
724
  timeout=timeout,
714
725
  )
715
726
  if result.get("success") and collected:
@@ -738,6 +749,11 @@ async def _query_aria_llm(text: str, timeout: int = 120) -> str:
738
749
  # ARIA_BOT_MODE=1: plain output for a chat card. It no longer approves
739
750
  # tools; see _bot_cli_flags.
740
751
  bot_env = {**os.environ, "ARIA_BOT_MODE": "1"}
752
+ # A conversation bound to a shipper confines every tool in this run to
753
+ # that shipper; the logistics tools enforce it (logistics_tenancy).
754
+ bot_env.pop(OWNER_SCOPE_ENV, None)
755
+ if _TURN_OWNER.get():
756
+ bot_env[OWNER_SCOPE_ENV] = _TURN_OWNER.get()
741
757
  proc = await asyncio.create_subprocess_exec(
742
758
  sys.executable, str(aria_cli), "-p", text, *_bot_cli_flags(),
743
759
  stdin=asyncio.subprocess.DEVNULL, # no interactive prompts
@@ -1006,6 +1022,66 @@ def verify_feishu_request(headers: Dict[str, str], body: bytes, payload: Dict[st
1006
1022
  "unverified events are refused")
1007
1023
 
1008
1024
 
1025
+ # ── Conversation layer (apps/channels/conversation.py) ───────────────────────
1026
+
1027
+ # The shipper the current conversation is bound to, for every task it spawns.
1028
+ _TURN_OWNER: ContextVar[Optional[str]] = ContextVar("aria_feishu_turn_owner", default=None)
1029
+ _STORE: Optional[ConversationStore] = None
1030
+ _MENTION_TOKEN = re.compile(r"@_user_\d+")
1031
+
1032
+
1033
+ def _conversation_store() -> ConversationStore:
1034
+ global _STORE
1035
+ if _STORE is None or str(_STORE.path) != str(_conversation_db_path()):
1036
+ _STORE = ConversationStore(_conversation_db_path())
1037
+ return _STORE
1038
+
1039
+
1040
+ def _conversation_db_path() -> Path:
1041
+ from aria_code.apps.channels.conversation import default_db_path
1042
+ return default_db_path()
1043
+
1044
+
1045
+ def _strip_mentions(text: str) -> str:
1046
+ """Feishu writes each @ as a placeholder (@_user_1); the model needs the words."""
1047
+ return re.sub(r"\s+", " ", _MENTION_TOKEN.sub(" ", text or "")).strip()
1048
+
1049
+
1050
+ def _mentions_bot(message: Dict[str, Any]) -> bool:
1051
+ """Whether a group message addresses this bot.
1052
+
1053
+ With FEISHU_BOT_OPEN_ID set, the bot's own id must be among the mentions.
1054
+ Without it, any mention counts — correct for an app without the
1055
+ read-all-group-messages permission, which receives only @-mentions of
1056
+ itself; set the id if the app has that permission.
1057
+ """
1058
+ mentions = message.get("mentions") or []
1059
+ own_id = os.environ.get("FEISHU_BOT_OPEN_ID", "").strip()
1060
+ if own_id:
1061
+ return any((m.get("id") or {}).get("open_id") == own_id for m in mentions)
1062
+ return bool(mentions)
1063
+
1064
+
1065
+ def feishu_inbound(event: Dict[str, Any], text: str) -> InboundMessage:
1066
+ """A Feishu im.message.receive_v1 event as a platform-neutral message."""
1067
+ message = event.get("message") or {}
1068
+ sender = (event.get("sender") or {}).get("sender_id") or {}
1069
+ open_id = sender.get("open_id", "")
1070
+ user_id = sender.get("user_id", "")
1071
+ direct = message.get("chat_type") == "p2p"
1072
+ return InboundMessage(
1073
+ channel="feishu",
1074
+ conversation_id=message.get("chat_id", ""),
1075
+ kind="direct" if direct else "group",
1076
+ sender_id=open_id or user_id,
1077
+ sender_aliases=(user_id,) if open_id and user_id else (),
1078
+ text=text,
1079
+ message_id=message.get("message_id", ""),
1080
+ mentions_bot=direct or _mentions_bot(message),
1081
+ reply_to=message.get("parent_id", ""),
1082
+ )
1083
+
1084
+
1009
1085
  # ── Main event dispatcher (called by feishu_routes.py or standalone) ──────────
1010
1086
 
1011
1087
  async def dispatch_event(raw: Dict[str, Any], *, authorized_by_binding: bool = False) -> Dict[str, Any]:
@@ -1066,22 +1142,44 @@ async def dispatch_event(raw: Dict[str, Any], *, authorized_by_binding: bool = F
1066
1142
  except Exception:
1067
1143
  content = {}
1068
1144
 
1145
+ # Groups: only what is addressed to the bot. Feishu delivers just the
1146
+ # @-mentions unless the app holds the read-all-group-messages permission;
1147
+ # with it, this is what stops the bot answering every message in the room.
1148
+ # Images, audio and files cannot @ anyone, so in a group they are ignored.
1149
+ if msg.get("chat_type") != "p2p" and msg_type not in ("text", "post"):
1150
+ return {"code": 0}
1151
+
1069
1152
  # ── Text message ──────────────────────────────────────────────────────────
1070
1153
  if msg_type == "text":
1071
- text = content.get("text", "").strip()
1072
- # Strip @bot mention (飞书群里 @ 机器人会带前缀)
1073
- if text.startswith("@"):
1074
- text = " ".join(text.split()[1:]).strip()
1154
+ text = _strip_mentions(content.get("text", ""))
1075
1155
  if not text:
1076
1156
  return {"code": 0}
1157
+ inbound = feishu_inbound(event, text)
1158
+ if not should_respond(inbound):
1159
+ return {"code": 0}
1077
1160
 
1078
- if text.startswith("/"):
1079
- logger.info("Feishu /cmd from %s: %s", user_id, text[:80])
1080
- asyncio.create_task(_handle_command(text, msg_id, user_id, chat_id))
1081
- else:
1082
- # Free-form natural language → Aria LLM
1083
- logger.info("Feishu NL query from %s: %s", user_id, text[:80])
1084
- asyncio.create_task(_handle_nl_query(text, msg_id, chat_id))
1161
+ store = _conversation_store()
1162
+ owner_reply = handle_owner_command(inbound, store)
1163
+ if owner_reply is not None:
1164
+ await reply_text(msg_id, owner_reply)
1165
+ return {"code": 0}
1166
+
1167
+ # A task copies the context it is created in, so every aria subprocess
1168
+ # the tasks below start runs under this conversation's shipper scope.
1169
+ # Reset afterwards: dispatch_event runs in its caller's context.
1170
+ scope_token = _TURN_OWNER.set(store.owner_for(inbound.key))
1171
+ try:
1172
+ if text.startswith("/"):
1173
+ logger.info("Feishu /cmd from %s: %s", user_id, text[:80])
1174
+ asyncio.create_task(_handle_command(text, msg_id, user_id, chat_id))
1175
+ else:
1176
+ # Free-form natural language → Aria LLM, with this conversation's context
1177
+ logger.info("Feishu NL query from %s: %s", user_id, text[:80])
1178
+ turn = prepare_turn(inbound, store)
1179
+ asyncio.create_task(_handle_nl_query(text, msg_id, chat_id, turn=turn,
1180
+ conversation=inbound.key))
1181
+ finally:
1182
+ _TURN_OWNER.reset(scope_token)
1085
1183
 
1086
1184
  # ── Voice / Audio ─────────────────────────────────────────────────────────
1087
1185
  elif msg_type == "audio":
@@ -1341,7 +1439,8 @@ def _resolve_cn_company(text: str) -> str:
1341
1439
  return result
1342
1440
 
1343
1441
 
1344
- async def _handle_nl_query(text: str, message_id: str, chat_id: str = "") -> None:
1442
+ async def _handle_nl_query(text: str, message_id: str, chat_id: str = "", *,
1443
+ turn: Optional[ChannelTurn] = None, conversation: str = "") -> None:
1345
1444
  """Route free-form natural language to Aria LLM and reply."""
1346
1445
  import re as _re_nl
1347
1446
  _low = text.strip().lower()
@@ -1406,8 +1505,16 @@ async def _handle_nl_query(text: str, message_id: str, chat_id: str = "") -> Non
1406
1505
  return
1407
1506
 
1408
1507
  await reply_or_send(message_id, chat_id, "🤔 思考中…", f"> {_orig[:120]}", "blue")
1409
- # Use direct LLM call (no subprocess, no tool execution) for conversational queries
1410
- result = await _query_aria_direct(text, timeout=120)
1508
+ # Use direct LLM call (no subprocess, no tool execution) for conversational queries.
1509
+ # With a turn, the model sees this conversation's recent messages and, when
1510
+ # the conversation is bound to a shipper, which one.
1511
+ if turn is not None:
1512
+ prompt = turn.prompt if resolved == _orig else f"{turn.prompt}\n({text})"
1513
+ result = await _query_aria_direct(prompt, timeout=120, history=turn.history)
1514
+ if conversation and not result.startswith("❌"):
1515
+ _conversation_store().record(conversation, "assistant", result[:2000])
1516
+ else:
1517
+ result = await _query_aria_direct(text, timeout=120)
1411
1518
  color = "red" if result.startswith("❌") else "green"
1412
1519
  await reply_or_send(message_id, chat_id, "💡 Aria 回答", result[:2000], color,
1413
1520
  footer="Aria Code · AI 分析")
@@ -19,13 +19,27 @@ fails closed.
19
19
  What an error message says is part of the guarantee: it may say how many
20
20
  shippers the data spans, but never which, so a refusal does not itself
21
21
  disclose another client's name.
22
+
23
+ Conversation scope
24
+ ------------------
25
+ A chat bound to one shipper (a 3PL usually keeps one group per client) sets
26
+ ARIA_OWNER_SCOPE for every turn it runs. Then, whatever the model asks for:
27
+ - owner_id defaults to that shipper, and naming another is refused;
28
+ - all_owners is refused — the internal view has no place in a client chat;
29
+ - records without owner_id are refused, because nothing shows they are this
30
+ shipper's (a file on the host could be anyone's).
31
+ This is enforced here rather than in a prompt, so it holds for the CLI, the
32
+ MCP server and every chat channel alike, and does not depend on the model
33
+ choosing to comply.
22
34
  """
23
35
 
24
36
  from __future__ import annotations
25
37
 
38
+ import os
26
39
  from typing import Any, Iterable
27
40
 
28
41
  OWNER_FIELD = "owner_id"
42
+ OWNER_SCOPE_ENV = "ARIA_OWNER_SCOPE"
29
43
 
30
44
  INTERNAL_MARKER = "INTERNAL — cross-shipper view; not for client distribution"
31
45
 
@@ -34,6 +48,11 @@ class TenancyError(ValueError):
34
48
  """The records cannot be analysed without mixing shippers."""
35
49
 
36
50
 
51
+ def active_owner_scope() -> str:
52
+ """The shipper this process is confined to, or "" when unconfined."""
53
+ return os.environ.get(OWNER_SCOPE_ENV, "").strip()
54
+
55
+
37
56
  def _owner_of(record: dict[str, Any]) -> str:
38
57
  value = record.get(OWNER_FIELD)
39
58
  return "" if value is None else str(value).strip()
@@ -55,10 +74,26 @@ def scope_records(
55
74
  if wanted and all_owners:
56
75
  raise TenancyError("Pass owner_id or all_owners, not both")
57
76
 
77
+ scope = active_owner_scope()
78
+ if scope:
79
+ if all_owners:
80
+ raise TenancyError(
81
+ "This conversation is confined to one shipper; the cross-shipper view "
82
+ "is not available here"
83
+ )
84
+ if wanted and wanted != scope:
85
+ raise TenancyError("This conversation is confined to one shipper and cannot analyse another")
86
+ wanted = scope
87
+
58
88
  labelled = [r for r in records if _owner_of(r)]
59
89
  unlabelled = len(records) - len(labelled)
60
90
 
61
91
  if not labelled:
92
+ if scope:
93
+ raise TenancyError(
94
+ f"This conversation is confined to one shipper, so every record must carry "
95
+ f"{OWNER_FIELD} to show it is theirs; these records have none"
96
+ )
62
97
  if wanted:
63
98
  raise TenancyError(
64
99
  f"owner_id {wanted!r} was requested, but the records carry no {OWNER_FIELD}"
@@ -79,7 +114,10 @@ def scope_records(
79
114
  if not in_scope:
80
115
  # Deliberately does not list the owners that *are* present.
81
116
  raise TenancyError(f"No records for owner_id {wanted!r}")
82
- return in_scope, {"mode": "single_owner", "owner_id": wanted, "client_facing": True}
117
+ result_scope = {"mode": "single_owner", "owner_id": wanted, "client_facing": True}
118
+ if scope:
119
+ result_scope["conversation_scoped"] = True
120
+ return in_scope, result_scope
83
121
 
84
122
  if len(owners) == 1:
85
123
  (only,) = owners
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.63.0
3
+ Version: 0.64.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
@@ -142,6 +142,7 @@ src/aria_code/apps/README.md
142
142
  src/aria_code/apps/__init__.py
143
143
  src/aria_code/apps/channels/README.md
144
144
  src/aria_code/apps/channels/__init__.py
145
+ src/aria_code/apps/channels/conversation.py
145
146
  src/aria_code/apps/channels/intake.py
146
147
  src/aria_code/apps/channels/registry.py
147
148
  src/aria_code/apps/channels/tradingview.py
@@ -537,6 +538,7 @@ tests/test_container_entrypoints.py
537
538
  tests/test_context_checkpoints.py
538
539
  tests/test_context_references.py
539
540
  tests/test_context_service.py
541
+ tests/test_conversation_core.py
540
542
  tests/test_crash_report.py
541
543
  tests/test_credential_file_permissions.py
542
544
  tests/test_custom_providers.py
@@ -36,9 +36,11 @@ ENV_KEYS = ("FEISHU_ALLOWED_USER_IDS", "FEISHU_ENCRYPT_KEY", "FEISHU_VERIFICATIO
36
36
 
37
37
 
38
38
  @pytest.fixture(autouse=True)
39
- def clean_env(monkeypatch):
39
+ def clean_env(monkeypatch, tmp_path):
40
40
  for key in ENV_KEYS:
41
41
  monkeypatch.delenv(key, raising=False)
42
+ # Served messages are recorded per conversation; keep that out of ~/.aria.
43
+ monkeypatch.setenv("ARIA_CONVERSATIONS_DB", str(tmp_path / "conversations.db"))
42
44
 
43
45
 
44
46
  def _event(text="/run /price AAPL", *, open_id="ou_stranger", user_id="", chat_type="p2p"):