aria-code 0.63.0__tar.gz → 0.65.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 (713) hide show
  1. {aria_code-0.63.0 → aria_code-0.65.0}/PKG-INFO +1 -1
  2. {aria_code-0.63.0 → aria_code-0.65.0}/pyproject.toml +1 -1
  3. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/_version.py +1 -1
  4. aria_code-0.65.0/src/aria_code/apps/channels/README.md +62 -0
  5. aria_code-0.65.0/src/aria_code/apps/channels/conversation.py +280 -0
  6. aria_code-0.65.0/src/aria_code/apps/channels/digest.py +185 -0
  7. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_daemon.py +33 -0
  8. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_feishu_bot.py +171 -21
  9. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/logistics_tenancy.py +39 -1
  10. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code.egg-info/PKG-INFO +1 -1
  11. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code.egg-info/SOURCES.txt +4 -0
  12. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_chat_bots_fail_closed.py +3 -1
  13. aria_code-0.65.0/tests/test_conversation_core.py +273 -0
  14. aria_code-0.65.0/tests/test_shipper_digest.py +241 -0
  15. aria_code-0.63.0/src/aria_code/apps/channels/README.md +0 -15
  16. {aria_code-0.63.0 → aria_code-0.65.0}/LICENSE +0 -0
  17. {aria_code-0.63.0 → aria_code-0.65.0}/NOTICE +0 -0
  18. {aria_code-0.63.0 → aria_code-0.65.0}/README.md +0 -0
  19. {aria_code-0.63.0 → aria_code-0.65.0}/setup.cfg +0 -0
  20. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/__init__.py +0 -0
  21. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/adk_apps/__init__.py +0 -0
  22. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  23. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  24. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  25. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  26. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/__init__.py +0 -0
  27. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/base.py +0 -0
  28. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/code_review.py +0 -0
  29. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/__init__.py +0 -0
  30. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  31. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/critic.py +0 -0
  32. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/deepen.py +0 -0
  33. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/models.py +0 -0
  34. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  35. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  36. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/themes.py +0 -0
  37. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/deep/tiers.py +0 -0
  38. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  39. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/engineering/coder.py +0 -0
  40. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/engineering/tester.py +0 -0
  41. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/__init__.py +0 -0
  42. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  43. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  44. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  45. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/debate.py +0 -0
  46. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/earnings.py +0 -0
  47. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  48. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/macro.py +0 -0
  49. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/news.py +0 -0
  50. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/risk.py +0 -0
  51. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/sector.py +0 -0
  52. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/strategist.py +0 -0
  53. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  54. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  55. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/financial/technical.py +0 -0
  56. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/orchestrator.py +0 -0
  57. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  58. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/__init__.py +0 -0
  59. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  60. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/business_match.py +0 -0
  61. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  62. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  63. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  64. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  65. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  66. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  67. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  68. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/registry.py +0 -0
  69. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/signal_scheme.py +0 -0
  70. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/sports/__init__.py +0 -0
  71. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  72. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/supervisor.py +0 -0
  73. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/team.py +0 -0
  74. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  75. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  76. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  77. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  78. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  79. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  80. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  81. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  82. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  83. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  84. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  85. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aliyun_data_client.py +0 -0
  86. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/README.md +0 -0
  87. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/__init__.py +0 -0
  88. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/channels/__init__.py +0 -0
  89. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/channels/intake.py +0 -0
  90. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/channels/registry.py +0 -0
  91. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  92. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/README.md +0 -0
  93. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/__init__.py +0 -0
  94. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/_optional.py +0 -0
  95. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  96. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  97. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  98. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  99. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  100. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  101. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  102. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  103. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  104. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  105. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  106. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  107. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  108. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  109. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  110. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  111. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  112. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  113. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  114. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  115. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  116. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  117. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  118. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  119. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  120. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  121. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  122. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  123. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  124. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  125. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  126. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  127. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  128. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  129. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  130. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  131. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  132. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  133. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  134. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  135. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  136. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/config_store.py +0 -0
  137. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/constants.py +0 -0
  138. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/context.py +0 -0
  139. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  140. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/direct.py +0 -0
  141. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  142. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  143. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  144. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/google_login.py +0 -0
  145. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  146. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  147. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  148. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  149. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  150. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  151. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  152. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/helpers.py +0 -0
  153. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/hooks.py +0 -0
  154. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/i18n.py +0 -0
  155. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/intent.py +0 -0
  156. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  157. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  158. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  159. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  160. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/main.py +0 -0
  161. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  162. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  163. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  164. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  165. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  166. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  167. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  168. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  169. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/preflight.py +0 -0
  170. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  171. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  172. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  173. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  174. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  175. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  176. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  177. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  178. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  179. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  180. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  181. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  182. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  183. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  184. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  185. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  186. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  187. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  188. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  189. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  190. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  191. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  192. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/session_export.py +0 -0
  193. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  194. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/session_store.py +0 -0
  195. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  196. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  197. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  198. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  199. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  200. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  201. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  202. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  203. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  204. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  205. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  206. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  207. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  208. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  209. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/update_check.py +0 -0
  210. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  211. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  212. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/daemon/README.md +0 -0
  213. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/vscode/README.md +0 -0
  214. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/apps/vscode/package.json +0 -0
  215. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_cli.py +0 -0
  216. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_mcp_server.py +0 -0
  217. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_relay_client.py +0 -0
  218. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_relay_server.py +0 -0
  219. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/aria_telegram_bot.py +0 -0
  220. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ariarc.py +0 -0
  221. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/artifacts.py +0 -0
  222. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/backtest_engine.py +0 -0
  223. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/backtest_report.py +0 -0
  224. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/__init__.py +0 -0
  225. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/automation.py +0 -0
  226. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/base.py +0 -0
  227. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/capabilities.py +0 -0
  228. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  229. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  230. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  231. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  232. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  233. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  234. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/config.py +0 -0
  235. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  236. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  237. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  238. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  239. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  240. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/paper_broker.py +0 -0
  241. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/planning.py +0 -0
  242. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/registry.py +0 -0
  243. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/brokers/trading.py +0 -0
  244. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/canva_client.py +0 -0
  245. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/change_store.py +0 -0
  246. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/__init__.py +0 -0
  247. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  248. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  249. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/canva_client.py +0 -0
  250. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/figma_client.py +0 -0
  251. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/football_data_client.py +0 -0
  252. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/kling_video_client.py +0 -0
  253. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/market_data_client.py +0 -0
  254. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/openai_image_client.py +0 -0
  255. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/runway_video_client.py +0 -0
  256. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  257. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/cloud_memory.py +0 -0
  258. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/command_safety.py +0 -0
  259. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/computer_use_tools.py +0 -0
  260. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/dashboard_generator.py +0 -0
  261. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/data_analysis_tools.py +0 -0
  262. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/data_cleaner.py +0 -0
  263. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/data_service.py +0 -0
  264. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/__init__.py +0 -0
  265. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/base.py +0 -0
  266. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/router.py +0 -0
  267. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  268. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  269. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  270. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  271. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  272. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  273. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  274. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  275. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  276. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  277. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/demo_player.py +0 -0
  278. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/doctor.py +0 -0
  279. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/domain/__init__.py +0 -0
  280. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/domain/backtest_engine.py +0 -0
  281. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/domain/backtest_report.py +0 -0
  282. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/domain/finance_formulas.py +0 -0
  283. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  284. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/domain/strategy_vault.py +0 -0
  285. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/evals/__init__.py +0 -0
  286. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/evals/harness.py +0 -0
  287. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/evals/runner.py +0 -0
  288. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/external_agent_runner.py +0 -0
  289. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/figma_client.py +0 -0
  290. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/file_analysis_tools.py +0 -0
  291. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/finance_formulas.py +0 -0
  292. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/football_data_client.py +0 -0
  293. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/image_gen_tools.py +0 -0
  294. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/intent_classifier.py +0 -0
  295. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/kling_video_client.py +0 -0
  296. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/licensing.py +0 -0
  297. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/local_finance_tools.py +0 -0
  298. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/local_image_provider.py +0 -0
  299. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/local_llm_provider.py +0 -0
  300. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/macro_tools.py +0 -0
  301. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/markdown_pdf.py +0 -0
  302. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/market_data_client.py +0 -0
  303. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/mcp_client.py +0 -0
  304. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/memory_manager.py +0 -0
  305. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/model_capability.py +0 -0
  306. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/notification_tools.py +0 -0
  307. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/openai_image_client.py +0 -0
  308. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/__init__.py +0 -0
  309. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  310. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  311. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  312. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  313. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  314. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  315. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  316. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_core/export.py +0 -0
  317. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  318. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  319. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  320. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  321. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  322. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  323. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  324. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  325. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  326. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  327. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  328. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  329. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  330. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  331. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  332. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  333. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  334. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  335. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  336. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  337. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  338. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/context.py +0 -0
  339. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  340. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/data.py +0 -0
  341. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  342. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/references.py +0 -0
  343. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  344. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  345. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  346. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  347. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  348. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  349. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  350. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  351. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  352. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  353. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  354. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  355. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  356. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  357. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  358. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  359. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  360. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  361. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  362. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  363. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  364. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  365. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  366. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  367. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  368. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  369. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  370. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  371. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  372. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  373. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  374. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  375. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  376. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  377. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  378. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  379. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  380. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  381. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  382. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  383. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/__init__.py +0 -0
  384. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/base.py +0 -0
  385. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/finance/__init__.py +0 -0
  386. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  387. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/payments/__init__.py +0 -0
  388. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/realty/__init__.py +0 -0
  389. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/registry.py +0 -0
  390. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/packs/rules.py +0 -0
  391. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/plan_utils.py +0 -0
  392. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/plugin_loader.py +0 -0
  393. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/portfolio_ledger.py +0 -0
  394. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/preview_server.py +0 -0
  395. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/privacy/__init__.py +0 -0
  396. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/privacy/feedback.py +0 -0
  397. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/project_review.py +0 -0
  398. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/project_review_api.py +0 -0
  399. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/project_review_server.py +0 -0
  400. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/project_tools.py +0 -0
  401. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/__init__.py +0 -0
  402. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/__init__.py +0 -0
  403. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  404. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  405. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/base.py +0 -0
  406. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/custom.py +0 -0
  407. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/ollama.py +0 -0
  408. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  409. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/llm/registry.py +0 -0
  410. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/local_image_provider.py +0 -0
  411. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  412. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/realty_data_tools.py +0 -0
  413. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/report_exporters.py +0 -0
  414. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/report_generator.py +0 -0
  415. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/__init__.py +0 -0
  416. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/acceptance.py +0 -0
  417. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/agent_loop.py +0 -0
  418. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/approval.py +0 -0
  419. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/budget.py +0 -0
  420. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/checkpoints.py +0 -0
  421. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/crash_report.py +0 -0
  422. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/events.py +0 -0
  423. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/gateway.py +0 -0
  424. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/lsp.py +0 -0
  425. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/orchestrator.py +0 -0
  426. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/repo_map.py +0 -0
  427. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/run_state.py +0 -0
  428. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/run_store.py +0 -0
  429. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/self_healing.py +0 -0
  430. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/subagent.py +0 -0
  431. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/task_ledger.py +0 -0
  432. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  433. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/tool_executor.py +0 -0
  434. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/tool_policy.py +0 -0
  435. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runtime/worktrees.py +0 -0
  436. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/runway_video_client.py +0 -0
  437. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/safety/__init__.py +0 -0
  438. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/safety/permissions.py +0 -0
  439. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/safety/service.py +0 -0
  440. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/setup_wizard.py +0 -0
  441. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/spreadsheet_tools.py +0 -0
  442. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/strategy_vault.py +0 -0
  443. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/__init__.py +0 -0
  444. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/artifact_tools.py +0 -0
  445. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/broker_tools.py +0 -0
  446. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  447. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  448. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  449. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  450. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  451. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/extended_tools.py +0 -0
  452. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  453. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  454. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  455. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  456. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  457. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/logistics_io.py +0 -0
  458. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/logistics_tools.py +0 -0
  459. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/macro_tools.py +0 -0
  460. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/notification_tools.py +0 -0
  461. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/project_tools.py +0 -0
  462. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  463. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  464. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/tools/stripe_tools.py +0 -0
  465. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/__init__.py +0 -0
  466. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/banner.py +0 -0
  467. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/completer.py +0 -0
  468. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/console.py +0 -0
  469. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/image_render.py +0 -0
  470. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/input_box.py +0 -0
  471. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/picker.py +0 -0
  472. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/render/__init__.py +0 -0
  473. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/render/finance.py +0 -0
  474. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/render/market.py +0 -0
  475. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/render/output.py +0 -0
  476. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/render/responsive.py +0 -0
  477. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/render/team.py +0 -0
  478. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/robot.py +0 -0
  479. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  480. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/utils/vscode_uri.py +0 -0
  481. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/video_analysis.py +0 -0
  482. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/video_editor.py +0 -0
  483. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace/__init__.py +0 -0
  484. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace/files.py +0 -0
  485. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace/verify.py +0 -0
  486. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace_changes.py +0 -0
  487. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace_context.py +0 -0
  488. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace_service.py +0 -0
  489. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code/workspace_tools.py +0 -0
  490. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  491. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  492. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code.egg-info/requires.txt +0 -0
  493. {aria_code-0.63.0 → aria_code-0.65.0}/src/aria_code.egg-info/top_level.txt +0 -0
  494. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_adk_market_tools.py +0 -0
  495. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_agent_team_fallback.py +0 -0
  496. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_analyze_file_tool.py +0 -0
  497. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_architecture_ledger_is_true.py +0 -0
  498. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_architecture_report.py +0 -0
  499. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_aria_cli_core.py +0 -0
  500. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_aria_mcp_server.py +0 -0
  501. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_aria_sdk.py +0 -0
  502. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_artifact_publishing.py +0 -0
  503. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_artifacts_and_reports.py +0 -0
  504. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ashare_prediction_cmds.py +0 -0
  505. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_backtest_cmds.py +0 -0
  506. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_backtest_engine.py +0 -0
  507. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_backtest_report.py +0 -0
  508. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  509. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_broken_akshare_is_optional.py +0 -0
  510. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_broker_automation.py +0 -0
  511. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  512. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_broker_planning.py +0 -0
  513. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_broker_safety.py +0 -0
  514. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_broker_tools.py +0 -0
  515. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_budget.py +0 -0
  516. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_business_workflow_cmds.py +0 -0
  517. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_canva_client.py +0 -0
  518. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_canvas_cmds.py +0 -0
  519. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_channel_intake.py +0 -0
  520. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_channels.py +0 -0
  521. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_chart_handlers.py +0 -0
  522. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_chat_routing.py +0 -0
  523. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ci_security_workflow.py +0 -0
  524. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cli_app_split.py +0 -0
  525. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cli_bootstrap.py +0 -0
  526. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cli_config_store.py +0 -0
  527. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  528. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cli_runtime_consumer.py +0 -0
  529. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cli_tool_executor_module.py +0 -0
  530. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_cloud_memory.py +0 -0
  531. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_code_audit_tools.py +0 -0
  532. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_code_review_agent.py +0 -0
  533. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_codegen_output.py +0 -0
  534. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_coder_tester_self_healing.py +0 -0
  535. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_coder_tool_safety.py +0 -0
  536. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_collaboration.py +0 -0
  537. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_command_loggers.py +0 -0
  538. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_command_safety.py +0 -0
  539. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_completions_builder.py +0 -0
  540. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_config_paths.py +0 -0
  541. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_configured_provider.py +0 -0
  542. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_container_entrypoint.py +0 -0
  543. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_container_entrypoints.py +0 -0
  544. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_context_checkpoints.py +0 -0
  545. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_context_references.py +0 -0
  546. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_context_service.py +0 -0
  547. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_crash_report.py +0 -0
  548. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_credential_file_permissions.py +0 -0
  549. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_custom_providers.py +0 -0
  550. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_daemon_gateway_config.py +0 -0
  551. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_dashboard_generator.py +0 -0
  552. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_data_service.py +0 -0
  553. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_data_service_imports.py +0 -0
  554. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_datasource_routing.py +0 -0
  555. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_deep_analysis.py +0 -0
  556. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_degrades_without_quant_engine.py +0 -0
  557. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  558. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_doctor.py +0 -0
  559. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  560. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_doctor_npm_scope.py +0 -0
  561. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_engine_boundary.py +0 -0
  562. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_enterprise_tool_honesty.py +0 -0
  563. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_env_switch_docs.py +0 -0
  564. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_evals_harness.py +0 -0
  565. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_extended_tools.py +0 -0
  566. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_feishu_swarm_config.py +0 -0
  567. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_finance_renderers.py +0 -0
  568. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_finance_service_catalog.py +0 -0
  569. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_first_run_works.py +0 -0
  570. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_football_agent.py +0 -0
  571. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_football_prediction_output.py +0 -0
  572. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_google_cloud_routing.py +0 -0
  573. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_google_login.py +0 -0
  574. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_google_search_provider.py +0 -0
  575. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_headless_is_agentic.py +0 -0
  576. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_image_gen_tools.py +0 -0
  577. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_image_inputs.py +0 -0
  578. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_import_graph_budget.py +0 -0
  579. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_intent_router.py +0 -0
  580. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_intent_signals.py +0 -0
  581. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_kling_video_client.py +0 -0
  582. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_lazy_rebind.py +0 -0
  583. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_legacy_module_imports.py +0 -0
  584. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_license_consistency.py +0 -0
  585. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_licensing.py +0 -0
  586. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_local_image_provider.py +0 -0
  587. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_logistics_3pl.py +0 -0
  588. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_logistics_and_finance_agents.py +0 -0
  589. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_lsp.py +0 -0
  590. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_markdown_pdf.py +0 -0
  591. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_market_data_client.py +0 -0
  592. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_market_history_inheritance.py +0 -0
  593. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_market_history_tool.py +0 -0
  594. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_market_symbol_extraction.py +0 -0
  595. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_market_universe.py +0 -0
  596. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_mcp_circuit.py +0 -0
  597. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_mcp_client.py +0 -0
  598. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_model_capability_registry.py +0 -0
  599. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_model_choice_is_the_users.py +0 -0
  600. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_model_selection_state.py +0 -0
  601. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_native_binary_entrypoints.py +0 -0
  602. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_native_installer.py +0 -0
  603. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_new_modules.py +0 -0
  604. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  605. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_no_uncommitted_imports.py +0 -0
  606. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ollama_stream_imports.py +0 -0
  607. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ollama_stream_tools.py +0 -0
  608. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_openai_image_client.py +0 -0
  609. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_operations_suite.py +0 -0
  610. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_output_rendering.py +0 -0
  611. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_packages_facade.py +0 -0
  612. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_packaging_constraints.py +0 -0
  613. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_packaging_manifest.py +0 -0
  614. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_packs_domains.py +0 -0
  615. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_pdf_report.py +0 -0
  616. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_pick_best_installed_model.py +0 -0
  617. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_plan_mode.py +0 -0
  618. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_platform_package_assembly.py +0 -0
  619. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_platform_packages.py +0 -0
  620. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_plotly_html_output.py +0 -0
  621. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_portfolio_ledger.py +0 -0
  622. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_post_turn_context_decision.py +0 -0
  623. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_preflight.py +0 -0
  624. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_preview_server.py +0 -0
  625. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_privacy_feedback.py +0 -0
  626. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_project_aria.py +0 -0
  627. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_project_review.py +0 -0
  628. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_project_review_api.py +0 -0
  629. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_prompt_assembly.py +0 -0
  630. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_prompt_selection.py +0 -0
  631. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_provider_autoconfig.py +0 -0
  632. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_provider_error_messages.py +0 -0
  633. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_provider_integration.py +0 -0
  634. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_provider_registry.py +0 -0
  635. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_public_service_status.py +0 -0
  636. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_quant_engine_namespace.py +0 -0
  637. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_rebind_contract.py +0 -0
  638. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_rebind_namespace_contract.py +0 -0
  639. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_relay_event_verification.py +0 -0
  640. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_release_chain.py +0 -0
  641. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_release_commit_identity.py +0 -0
  642. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_release_push_is_atomic.py +0 -0
  643. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_release_reaches_the_registries.py +0 -0
  644. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_release_verification_waits.py +0 -0
  645. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_release_workflow_permissions.py +0 -0
  646. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_report_charts.py +0 -0
  647. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_report_generator.py +0 -0
  648. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_research_protocol.py +0 -0
  649. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_research_quality.py +0 -0
  650. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_responsive_rendering.py +0 -0
  651. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_root_module_budget.py +0 -0
  652. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  653. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_acceptance.py +0 -0
  654. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_agent_loop.py +0 -0
  655. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_approval.py +0 -0
  656. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_bridge.py +0 -0
  657. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_bridge_fallback.py +0 -0
  658. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_checkpoints.py +0 -0
  659. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_gateway.py +0 -0
  660. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_repo_map.py +0 -0
  661. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_run_store.py +0 -0
  662. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_tool_executor.py +0 -0
  663. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runtime_worktrees.py +0 -0
  664. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_runway_video_client.py +0 -0
  665. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_safety_permissions.py +0 -0
  666. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_safety_service.py +0 -0
  667. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_safety_service_adoption.py +0 -0
  668. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_service_diagnostics_security.py +0 -0
  669. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_session_search.py +0 -0
  670. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_settings_service.py +0 -0
  671. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_single_import_root.py +0 -0
  672. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_skill_agent_binding.py +0 -0
  673. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_skill_catalog.py +0 -0
  674. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_skill_loader.py +0 -0
  675. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_spreadsheet_tools.py +0 -0
  676. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_sse_stream_contract.py +0 -0
  677. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_startup_dashboard.py +0 -0
  678. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_streaming_pipeline.py +0 -0
  679. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_stripe_agent.py +0 -0
  680. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_subagent.py +0 -0
  681. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_supervisor_routing.py +0 -0
  682. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_system_prompts.py +0 -0
  683. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_system_tools_output.py +0 -0
  684. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_task_orchestrator.py +0 -0
  685. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_team_synthesis.py +0 -0
  686. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_tls_trust_store.py +0 -0
  687. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_tool_policy.py +0 -0
  688. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_tool_scope.py +0 -0
  689. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_trading_service.py +0 -0
  690. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_tradingview_bridge.py +0 -0
  691. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_turn_planning.py +0 -0
  692. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ui_completer_references.py +0 -0
  693. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ui_console_theme.py +0 -0
  694. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ui_input_box.py +0 -0
  695. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_ui_robot_banner.py +0 -0
  696. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_verification_hint.py +0 -0
  697. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_verification_policy.py +0 -0
  698. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_version_consistency.py +0 -0
  699. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_version_counter.py +0 -0
  700. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_video_analysis.py +0 -0
  701. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_video_editor.py +0 -0
  702. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_vscode_mcp.py +0 -0
  703. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_warehouse_agents.py +0 -0
  704. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_warehouse_cli_registration.py +0 -0
  705. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_warehouse_erp_client.py +0 -0
  706. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_warehouse_workflow.py +0 -0
  707. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_wheel_is_installable.py +0 -0
  708. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_workspace_changes.py +0 -0
  709. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_workspace_context.py +0 -0
  710. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_workspace_files.py +0 -0
  711. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_workspace_scope.py +0 -0
  712. {aria_code-0.63.0 → aria_code-0.65.0}/tests/test_workspace_service.py +0 -0
  713. {aria_code-0.63.0 → aria_code-0.65.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.65.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.65.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.65.0"
@@ -0,0 +1,62 @@
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.
48
+
49
+ ## The shipper digest (`digest.py`)
50
+
51
+ The first thing the conversation layer enables that a reply-only bot cannot:
52
+ each group bound to a shipper is sent, unprompted, what needs attention —
53
+ reorders, SKUs with too little history to plan, dead stock, waybills to query,
54
+ and safe carrier switches. `run_digests(store, senders)` walks the bindings and
55
+ hands each digest to that channel's sender, so a new channel registers a
56
+ `(conversation_id, title, body) -> bool` function and gets the digest too.
57
+
58
+ Data comes from the operator's `ARIA_SHIPPER_FEEDS` file, never from chat, and
59
+ is read through the logistics tools under `ARIA_OWNER_SCOPE`, so a shared
60
+ multi-shipper export yields only that shipper's lines. Configuration problems
61
+ go to the log, not the client's group; a day with nothing to report sends
62
+ nothing.
@@ -0,0 +1,280 @@
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 bindings(self) -> List[Tuple[str, str]]:
196
+ """Every (conversation key, shipper) binding, for jobs that push to them."""
197
+ with self._db() as db:
198
+ return [tuple(row) for row in db.execute(
199
+ "SELECT conversation, owner_id FROM bindings ORDER BY conversation")]
200
+
201
+ def owner_for(self, key: str) -> Optional[str]:
202
+ with self._db() as db:
203
+ row = db.execute("SELECT owner_id FROM bindings WHERE conversation = ?", (key,)).fetchone()
204
+ return row[0] if row else None
205
+
206
+ # history
207
+ def record(self, key: str, role: str, content: str, *, sender: str = "") -> None:
208
+ if role not in ("user", "assistant") or not (content or "").strip():
209
+ return
210
+ now = self._clock()
211
+ with self._db() as db:
212
+ db.execute("INSERT INTO history (conversation, role, sender, content, at) VALUES (?, ?, ?, ?, ?)",
213
+ (key, role, sender, content, now))
214
+ self._prune(db, key, now)
215
+
216
+ def history(self, key: str) -> List[Dict[str, str]]:
217
+ """Oldest first, in the {role, content} shape model providers take."""
218
+ now = self._clock()
219
+ with self._db() as db:
220
+ self._prune(db, key, now)
221
+ rows = db.execute(
222
+ "SELECT role, content FROM history WHERE conversation = ? ORDER BY id", (key,)
223
+ ).fetchall()
224
+ return [{"role": role, "content": content} for role, content in rows]
225
+
226
+ def forget(self, key: str) -> None:
227
+ with self._db() as db:
228
+ db.execute("DELETE FROM history WHERE conversation = ?", (key,))
229
+
230
+ def _prune(self, db: sqlite3.Connection, key: str, now: float) -> None:
231
+ db.execute("DELETE FROM history WHERE conversation = ? AND at < ?", (key, now - self.ttl_seconds))
232
+ db.execute(
233
+ "DELETE FROM history WHERE conversation = ? AND id NOT IN "
234
+ "(SELECT id FROM history WHERE conversation = ? ORDER BY id DESC LIMIT ?)",
235
+ (key, key, self.max_turns),
236
+ )
237
+
238
+
239
+ # ── Turns ────────────────────────────────────────────────────────────────────
240
+
241
+ @dataclass(frozen=True)
242
+ class ChannelTurn:
243
+ """Everything a model call needs for one message, platform-free."""
244
+
245
+ prompt: str
246
+ history: List[Dict[str, str]] = field(default_factory=list)
247
+ owner_scope: Optional[str] = None
248
+
249
+ @property
250
+ def env(self) -> Dict[str, str]:
251
+ """Environment for a subprocess running this turn's tools."""
252
+ return {OWNER_SCOPE_ENV: self.owner_scope} if self.owner_scope else {}
253
+
254
+ def as_task(self, msg: InboundMessage) -> Dict[str, object]:
255
+ """The same turn as a structured channel task (aria.channel_task.v1)."""
256
+ return {
257
+ "schema": CHANNEL_TASK_SCHEMA,
258
+ "channel": msg.channel,
259
+ "conversation": msg.key,
260
+ "message_id": msg.message_id,
261
+ "prompt": self.prompt,
262
+ "history": list(self.history),
263
+ "owner_scope": self.owner_scope,
264
+ }
265
+
266
+
267
+ def prepare_turn(msg: InboundMessage, store: ConversationStore) -> ChannelTurn:
268
+ """Record the incoming message and build the turn that answers it.
269
+
270
+ History is read before this message is recorded, so the turn carries the
271
+ conversation so far plus the new prompt — not the prompt twice.
272
+ """
273
+ history = store.history(msg.key)
274
+ owner = store.owner_for(msg.key)
275
+ store.record(msg.key, "user", msg.text, sender=msg.sender_id)
276
+ prompt = msg.text
277
+ if owner:
278
+ prompt = (f"[本会话属于货主 {owner}。只分析该货主的数据,回答中不要提及其他货主。]\n"
279
+ f"{msg.text}")
280
+ return ChannelTurn(prompt=prompt, history=history, owner_scope=owner)
@@ -0,0 +1,185 @@
1
+ """The daily shipper digest: what needs attention, pushed to the shipper's group.
2
+
3
+ A bot that only answers questions waits to be asked about the SKU that ran out
4
+ yesterday. This sends each shipper's group, unprompted, what the 3PL would
5
+ otherwise find out too late: what to reorder, what history is too thin to
6
+ plan from, what stock has stopped moving, which waybills to query with the
7
+ carrier, and where a cheaper carrier is at least as reliable.
8
+
9
+ Platform-neutral like the rest of apps/channels: it walks the conversations
10
+ bound to a shipper (ConversationStore) and hands each digest to that
11
+ channel's sender. Feishu is the first sender; another channel registers one.
12
+
13
+ Where the data comes from is the operator's decision, not the chat's:
14
+ ARIA_SHIPPER_FEEDS names a JSON file mapping each shipper to its exports —
15
+
16
+ {"ACME": {"inventory": "/data/acme/skus.csv", "waybills": "/data/acme/waybills.csv"},
17
+ "*": {"inventory": "/data/wms/all_skus.csv"}}
18
+
19
+ "*" is the fallback for shippers without their own entry, typically one
20
+ multi-shipper export. Letting a chat command set a path would let anyone in
21
+ the group read any CSV on the host.
22
+
23
+ Every number comes from plan_inventory_policy and score_carriers, run with
24
+ ARIA_OWNER_SCOPE set to the shipper — the same tool-level confinement a bound
25
+ conversation gets — so a shared multi-shipper export yields only that
26
+ shipper's lines, and a file without owner_id is refused rather than guessed.
27
+ Digests are built one at a time: the scope is process environment, and the
28
+ tools are synchronous, so nothing else runs while it is set.
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import json
34
+ import logging
35
+ import os
36
+ from contextlib import contextmanager
37
+ from dataclasses import dataclass, field
38
+ from pathlib import Path
39
+ from typing import Awaitable, Callable, Dict, Iterator, List, Optional
40
+
41
+ from aria_code.apps.channels.conversation import ConversationStore
42
+ from aria_code.tools.logistics_tenancy import OWNER_SCOPE_ENV
43
+
44
+ logger = logging.getLogger(__name__)
45
+
46
+ FEEDS_ENV = "ARIA_SHIPPER_FEEDS"
47
+ MAX_LINES = 8 # per section; a digest is a prompt to look, not the report
48
+
49
+ # (conversation_id, title, body) -> delivered?
50
+ Sender = Callable[[str, str, str], Awaitable[bool]]
51
+
52
+
53
+ @dataclass
54
+ class Digest:
55
+ owner_id: str
56
+ title: str
57
+ body: str = ""
58
+ items: int = 0
59
+ problems: List[str] = field(default_factory=list)
60
+
61
+ @property
62
+ def worth_sending(self) -> bool:
63
+ return self.items > 0
64
+
65
+
66
+ def load_feeds(path: Optional[str] = None) -> Dict[str, Dict[str, str]]:
67
+ """The operator's shipper → export files map; {} when not configured."""
68
+ source = path or os.environ.get(FEEDS_ENV, "").strip()
69
+ if not source:
70
+ return {}
71
+ data = json.loads(Path(source).expanduser().read_text(encoding="utf-8"))
72
+ if not isinstance(data, dict):
73
+ raise ValueError(f"{FEEDS_ENV} must be a JSON object of shipper -> feeds")
74
+ return {str(k): {kind: str(v) for kind, v in (feeds or {}).items()} for k, feeds in data.items()}
75
+
76
+
77
+ def feeds_for(owner_id: str, feeds: Dict[str, Dict[str, str]]) -> Dict[str, str]:
78
+ return feeds.get(owner_id) or feeds.get("*") or {}
79
+
80
+
81
+ @contextmanager
82
+ def _confined_to(owner_id: str) -> Iterator[None]:
83
+ previous = os.environ.get(OWNER_SCOPE_ENV)
84
+ os.environ[OWNER_SCOPE_ENV] = owner_id
85
+ try:
86
+ yield
87
+ finally:
88
+ if previous is None:
89
+ os.environ.pop(OWNER_SCOPE_ENV, None)
90
+ else:
91
+ os.environ[OWNER_SCOPE_ENV] = previous
92
+
93
+
94
+ def _section(title: str, lines: List[str]) -> str:
95
+ shown = lines[:MAX_LINES]
96
+ more = f"\n- …另有 {len(lines) - MAX_LINES} 项" if len(lines) > MAX_LINES else ""
97
+ return f"**{title}({len(lines)})**\n" + "\n".join(f"- {line}" for line in shown) + more
98
+
99
+
100
+ def build_digest(owner_id: str, feeds: Dict[str, Dict[str, str]]) -> Digest:
101
+ from aria_code.tools.logistics_carriers import tool_score_carriers
102
+ from aria_code.tools.logistics_inventory import tool_plan_inventory_policy
103
+
104
+ digest = Digest(owner_id=owner_id, title=f"📦 {owner_id} 今日库存与运费提醒")
105
+ sources = feeds_for(owner_id, feeds)
106
+ sections: List[str] = []
107
+
108
+ with _confined_to(owner_id):
109
+ if sources.get("inventory"):
110
+ result = tool_plan_inventory_policy({"file_path": sources["inventory"]})
111
+ if result.get("success"):
112
+ items = result["data"]["items"]
113
+ reorder = [i for i in items if i.get("action") == "reorder"]
114
+ thin = [i for i in items if i.get("action") == "insufficient_history"]
115
+ dead = [i for i in items if i.get("movement") == "dead"]
116
+ if reorder:
117
+ sections.append(_section("建议补货", [
118
+ f"{i['sku']}:订 {i['suggested_order_qty']}(现有可用 {i['inventory_position']:g},"
119
+ f"补货点 {i['reorder_point']},约可撑 {i['days_of_cover']} 天)" for i in reorder]))
120
+ if thin:
121
+ sections.append(_section("历史不足、未给建议", [
122
+ f"{i['sku']}:仅 {i['history_days']} 天出库记录" for i in thin]))
123
+ if dead:
124
+ sections.append(_section("呆滞库存", [
125
+ f"{i['sku']}:在库 {i['on_hand']:g}" for i in dead]))
126
+ digest.items += len(reorder) + len(thin) + len(dead)
127
+ else:
128
+ digest.problems.append(f"inventory: {result.get('error')}")
129
+
130
+ if sources.get("waybills"):
131
+ result = tool_score_carriers({"file_path": sources["waybills"]})
132
+ if result.get("success"):
133
+ data = result["data"]
134
+ anomalies, savings = data.get("anomalies") or [], data.get("savings") or []
135
+ if anomalies:
136
+ sections.append(_section("运费待核对", [
137
+ f"{a['waybill_no']}({a['carrier']} {a['lane']}):{a['detail']}" for a in anomalies]))
138
+ if savings:
139
+ sections.append(_section("可节省的线路", [
140
+ f"{s['lane']}:{s['from_carrier']} → {s['to_carrier']},"
141
+ f"按近期运量约省 {s['estimated_saving']:g}(准时率不低于现承运商)" for s in savings]))
142
+ digest.items += len(anomalies) + len(savings)
143
+ else:
144
+ digest.problems.append(f"waybills: {result.get('error')}")
145
+
146
+ if not sources:
147
+ digest.problems.append(f"no feeds configured for {owner_id}")
148
+ digest.body = "\n\n".join(sections) + (
149
+ "\n\n建议数量未计入起订量、箱规和供应商条款;运费异常请先与承运商核对再下结论。" if sections else "")
150
+ return digest
151
+
152
+
153
+ async def run_digests(store: ConversationStore, senders: Dict[str, Sender],
154
+ feeds: Optional[Dict[str, Dict[str, str]]] = None) -> List[Dict[str, str]]:
155
+ """Send today's digest to every bound conversation that has something to say.
156
+
157
+ Returns one record per conversation for the log. Problems — a missing
158
+ feed, a file the tenancy check refused — go to the log only: a client's
159
+ group is not where a 3PL's configuration errors belong.
160
+ """
161
+ feeds = load_feeds() if feeds is None else feeds
162
+ report: List[Dict[str, str]] = []
163
+ built: Dict[str, Digest] = {}
164
+ for conversation, owner_id in store.bindings():
165
+ channel, _, conversation_id = conversation.partition(":")
166
+ send = senders.get(channel)
167
+ if send is None:
168
+ report.append({"conversation": conversation, "status": "no_sender"})
169
+ continue
170
+ if owner_id not in built:
171
+ try:
172
+ built[owner_id] = build_digest(owner_id, feeds)
173
+ except Exception as exc: # one bad feed must not stop the others
174
+ logger.warning("digest for %s failed: %s", owner_id, exc)
175
+ report.append({"conversation": conversation, "status": "error"})
176
+ continue
177
+ digest = built[owner_id]
178
+ for problem in digest.problems:
179
+ logger.warning("digest %s: %s", owner_id, problem)
180
+ if not digest.worth_sending:
181
+ report.append({"conversation": conversation, "status": "nothing_to_report"})
182
+ continue
183
+ delivered = await send(conversation_id, digest.title, digest.body)
184
+ report.append({"conversation": conversation, "status": "sent" if delivered else "send_failed"})
185
+ return report
@@ -1080,6 +1080,25 @@ async def _execute_job(job: dict) -> None:
1080
1080
  conn.commit()
1081
1081
 
1082
1082
 
1083
+ # ── Shipper digest ───────────────────────────────────────────────────────────
1084
+
1085
+ async def _run_shipper_digests() -> None:
1086
+ """Push each bound shipper group its digest (apps/channels/digest.py)."""
1087
+ try:
1088
+ from apps.channels.conversation import ConversationStore
1089
+ from apps.channels.digest import run_digests
1090
+
1091
+ senders = {}
1092
+ if os.environ.get("FEISHU_APP_ID") and os.environ.get("FEISHU_APP_SECRET"):
1093
+ from aria_feishu_bot import send_digest_card
1094
+ senders["feishu"] = send_digest_card
1095
+ report = await run_digests(ConversationStore(), senders)
1096
+ for line in report:
1097
+ logger.info("shipper digest %s: %s", line["conversation"], line["status"])
1098
+ except Exception as exc:
1099
+ logger.error("shipper digest job failed: %s", exc)
1100
+
1101
+
1083
1102
  # ── APScheduler cron ─────────────────────────────────────────────────────────
1084
1103
 
1085
1104
  def _start_scheduler() -> None:
@@ -1152,6 +1171,20 @@ def _start_scheduler() -> None:
1152
1171
  )
1153
1172
  logger.info("Registered 4 default scheduled jobs (morning / US / evening / weekly)")
1154
1173
 
1174
+ # Shipper digest: each group bound to a shipper gets what needs
1175
+ # attention. Only when the operator has said where the data is.
1176
+ if os.environ.get("ARIA_SHIPPER_FEEDS", "").strip():
1177
+ cron = os.environ.get("ARIA_DIGEST_CRON", "30 8 * * 1-6").strip()
1178
+ scheduler.add_job(
1179
+ _run_shipper_digests,
1180
+ CronTrigger.from_crontab(cron, timezone="Asia/Shanghai"),
1181
+ id="default_shipper_digest",
1182
+ name="货主库存与运费提醒",
1183
+ replace_existing=True,
1184
+ misfire_grace_time=1800,
1185
+ )
1186
+ logger.info("Registered shipper digest [%s]", cron)
1187
+
1155
1188
  scheduler.start()
1156
1189
  logger.info("APScheduler started with %d job(s)", len(scheduler.get_jobs()))
1157
1190
  return scheduler