aria-code 0.70.0__tar.gz → 0.72.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 (721) hide show
  1. {aria_code-0.70.0 → aria_code-0.72.0}/PKG-INFO +12 -6
  2. {aria_code-0.70.0 → aria_code-0.72.0}/README.md +10 -4
  3. {aria_code-0.70.0 → aria_code-0.72.0}/pyproject.toml +2 -2
  4. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/_version.py +1 -1
  5. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_cli.py +1 -1
  6. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_relay_server.py +52 -119
  7. aria_code-0.72.0/src/aria_code/relay_store.py +194 -0
  8. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/PKG-INFO +12 -6
  9. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/SOURCES.txt +2 -0
  10. aria_code-0.72.0/tests/test_relay_store.py +177 -0
  11. {aria_code-0.70.0 → aria_code-0.72.0}/LICENSE +0 -0
  12. {aria_code-0.70.0 → aria_code-0.72.0}/NOTICE +0 -0
  13. {aria_code-0.70.0 → aria_code-0.72.0}/setup.cfg +0 -0
  14. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/__init__.py +0 -0
  15. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/__init__.py +0 -0
  16. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  17. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  18. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  19. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  20. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/__init__.py +0 -0
  21. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/base.py +0 -0
  22. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/code_review.py +0 -0
  23. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/__init__.py +0 -0
  24. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  25. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/critic.py +0 -0
  26. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/deepen.py +0 -0
  27. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/models.py +0 -0
  28. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  29. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  30. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/themes.py +0 -0
  31. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/tiers.py +0 -0
  32. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  33. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/engineering/coder.py +0 -0
  34. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/engineering/tester.py +0 -0
  35. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/__init__.py +0 -0
  36. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  37. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  38. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  39. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/debate.py +0 -0
  40. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/earnings.py +0 -0
  41. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  42. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/macro.py +0 -0
  43. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/news.py +0 -0
  44. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/risk.py +0 -0
  45. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/sector.py +0 -0
  46. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/strategist.py +0 -0
  47. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  48. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  49. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/technical.py +0 -0
  50. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/orchestrator.py +0 -0
  51. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  52. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/__init__.py +0 -0
  53. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  54. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/business_match.py +0 -0
  55. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  56. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  57. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  58. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  59. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  60. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  61. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  62. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/registry.py +0 -0
  63. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/signal_scheme.py +0 -0
  64. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/sports/__init__.py +0 -0
  65. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  66. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/supervisor.py +0 -0
  67. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/team.py +0 -0
  68. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  69. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  70. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  71. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  72. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  73. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  74. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  75. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  76. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  77. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  78. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  79. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aliyun_data_client.py +0 -0
  80. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/README.md +0 -0
  81. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/__init__.py +0 -0
  82. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/README.md +0 -0
  83. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/__init__.py +0 -0
  84. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/approvals.py +0 -0
  85. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/conversation.py +0 -0
  86. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/digest.py +0 -0
  87. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/intake.py +0 -0
  88. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/registry.py +0 -0
  89. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  90. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/README.md +0 -0
  91. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/__init__.py +0 -0
  92. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/_optional.py +0 -0
  93. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  94. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  95. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  96. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  97. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  98. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  99. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  100. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  101. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  102. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  103. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  104. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  105. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  106. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  107. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  108. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  109. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  110. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  111. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  112. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  113. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  114. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  115. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  116. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  117. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  118. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  119. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  120. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  121. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  122. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  123. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  124. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  125. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  126. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  127. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  128. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  129. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  130. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  131. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  132. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  133. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  134. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/config_store.py +0 -0
  135. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/constants.py +0 -0
  136. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/context.py +0 -0
  137. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  138. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/direct.py +0 -0
  139. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  140. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  141. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  142. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/google_login.py +0 -0
  143. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  144. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  145. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  146. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  147. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  148. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  149. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  150. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/helpers.py +0 -0
  151. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/hooks.py +0 -0
  152. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/i18n.py +0 -0
  153. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/intent.py +0 -0
  154. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  155. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  156. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  157. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  158. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/main.py +0 -0
  159. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  160. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  161. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  162. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  163. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  164. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  165. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  166. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  167. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/preflight.py +0 -0
  168. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  169. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  170. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  171. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  172. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  173. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  174. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  175. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  176. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  177. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  178. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  179. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  180. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  181. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  182. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  183. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  184. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  185. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  186. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  187. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  188. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  189. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  190. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/session_export.py +0 -0
  191. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  192. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/session_store.py +0 -0
  193. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  194. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  195. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  196. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  197. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  198. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  199. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  200. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  201. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  202. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  203. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  204. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  205. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  206. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  207. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/update_check.py +0 -0
  208. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  209. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  210. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/daemon/README.md +0 -0
  211. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/vscode/README.md +0 -0
  212. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/vscode/package.json +0 -0
  213. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_daemon.py +0 -0
  214. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_feishu_bot.py +0 -0
  215. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_mcp_server.py +0 -0
  216. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_relay_client.py +0 -0
  217. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_telegram_bot.py +0 -0
  218. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ariarc.py +0 -0
  219. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/artifacts.py +0 -0
  220. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/backtest_engine.py +0 -0
  221. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/backtest_report.py +0 -0
  222. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/__init__.py +0 -0
  223. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/automation.py +0 -0
  224. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/base.py +0 -0
  225. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/capabilities.py +0 -0
  226. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  227. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  228. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  229. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  230. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  231. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  232. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/config.py +0 -0
  233. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  234. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  235. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  236. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  237. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  238. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/paper_broker.py +0 -0
  239. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/planning.py +0 -0
  240. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/registry.py +0 -0
  241. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/trading.py +0 -0
  242. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/canva_client.py +0 -0
  243. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/change_store.py +0 -0
  244. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/__init__.py +0 -0
  245. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  246. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  247. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/canva_client.py +0 -0
  248. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/figma_client.py +0 -0
  249. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/football_data_client.py +0 -0
  250. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/kling_video_client.py +0 -0
  251. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/market_data_client.py +0 -0
  252. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/openai_image_client.py +0 -0
  253. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/runway_video_client.py +0 -0
  254. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  255. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/cloud_memory.py +0 -0
  256. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/command_safety.py +0 -0
  257. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/computer_use_tools.py +0 -0
  258. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/dashboard_generator.py +0 -0
  259. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/data_analysis_tools.py +0 -0
  260. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/data_cleaner.py +0 -0
  261. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/data_service.py +0 -0
  262. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/__init__.py +0 -0
  263. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/base.py +0 -0
  264. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/router.py +0 -0
  265. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  266. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  267. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  268. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  269. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  270. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  271. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  272. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  273. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  274. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  275. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/demo_player.py +0 -0
  276. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/doctor.py +0 -0
  277. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/__init__.py +0 -0
  278. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/backtest_engine.py +0 -0
  279. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/backtest_report.py +0 -0
  280. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/finance_formulas.py +0 -0
  281. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  282. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/strategy_vault.py +0 -0
  283. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/evals/__init__.py +0 -0
  284. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/evals/harness.py +0 -0
  285. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/evals/runner.py +0 -0
  286. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/external_agent_runner.py +0 -0
  287. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/figma_client.py +0 -0
  288. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/file_analysis_tools.py +0 -0
  289. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/finance_formulas.py +0 -0
  290. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/football_data_client.py +0 -0
  291. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/image_gen_tools.py +0 -0
  292. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/intent_classifier.py +0 -0
  293. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/kling_video_client.py +0 -0
  294. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/licensing.py +0 -0
  295. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/local_finance_tools.py +0 -0
  296. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/local_image_provider.py +0 -0
  297. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/local_llm_provider.py +0 -0
  298. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/macro_tools.py +0 -0
  299. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/markdown_pdf.py +0 -0
  300. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/market_data_client.py +0 -0
  301. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/mcp_client.py +0 -0
  302. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/memory_manager.py +0 -0
  303. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/model_capability.py +0 -0
  304. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/notification_tools.py +0 -0
  305. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/openai_image_client.py +0 -0
  306. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/__init__.py +0 -0
  307. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  308. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  309. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  310. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  311. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  312. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  313. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  314. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/export.py +0 -0
  315. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  316. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  317. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  318. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  319. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  320. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  321. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  322. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  323. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  324. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  325. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  326. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  327. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  328. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  329. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  330. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  331. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  332. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  333. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  334. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  335. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  336. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/context.py +0 -0
  337. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  338. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/data.py +0 -0
  339. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  340. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/references.py +0 -0
  341. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  342. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  343. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  344. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  345. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  346. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  347. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  348. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  349. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  350. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  351. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  352. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  353. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  354. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  355. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  356. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  357. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  358. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  359. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  360. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  361. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  362. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  363. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  364. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  365. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  366. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  367. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  368. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  369. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  370. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  371. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  372. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  373. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  374. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  375. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  376. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  377. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  378. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  379. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  380. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  381. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/__init__.py +0 -0
  382. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/base.py +0 -0
  383. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/finance/__init__.py +0 -0
  384. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  385. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/payments/__init__.py +0 -0
  386. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/realty/__init__.py +0 -0
  387. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/registry.py +0 -0
  388. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/rules.py +0 -0
  389. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/plan_utils.py +0 -0
  390. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/plugin_loader.py +0 -0
  391. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/portfolio_ledger.py +0 -0
  392. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/preview_server.py +0 -0
  393. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/privacy/__init__.py +0 -0
  394. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/privacy/feedback.py +0 -0
  395. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_review.py +0 -0
  396. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_review_api.py +0 -0
  397. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_review_server.py +0 -0
  398. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_tools.py +0 -0
  399. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/__init__.py +0 -0
  400. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/__init__.py +0 -0
  401. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  402. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  403. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/base.py +0 -0
  404. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/custom.py +0 -0
  405. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/ollama.py +0 -0
  406. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  407. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/registry.py +0 -0
  408. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/local_image_provider.py +0 -0
  409. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  410. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/realty_data_tools.py +0 -0
  411. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/report_exporters.py +0 -0
  412. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/report_generator.py +0 -0
  413. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/__init__.py +0 -0
  414. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/acceptance.py +0 -0
  415. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/agent_loop.py +0 -0
  416. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/approval.py +0 -0
  417. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/budget.py +0 -0
  418. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/checkpoints.py +0 -0
  419. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/crash_report.py +0 -0
  420. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/events.py +0 -0
  421. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/gateway.py +0 -0
  422. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/lsp.py +0 -0
  423. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/orchestrator.py +0 -0
  424. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/repo_map.py +0 -0
  425. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/run_state.py +0 -0
  426. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/run_store.py +0 -0
  427. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/self_healing.py +0 -0
  428. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/subagent.py +0 -0
  429. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/task_ledger.py +0 -0
  430. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  431. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/tool_executor.py +0 -0
  432. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/tool_policy.py +0 -0
  433. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/worktrees.py +0 -0
  434. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runway_video_client.py +0 -0
  435. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/safety/__init__.py +0 -0
  436. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/safety/permissions.py +0 -0
  437. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/safety/service.py +0 -0
  438. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/setup_wizard.py +0 -0
  439. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/spreadsheet_tools.py +0 -0
  440. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/strategy_vault.py +0 -0
  441. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/__init__.py +0 -0
  442. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/artifact_tools.py +0 -0
  443. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/broker_tools.py +0 -0
  444. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  445. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  446. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  447. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  448. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  449. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/extended_tools.py +0 -0
  450. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  451. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  452. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  453. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  454. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  455. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_io.py +0 -0
  456. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  457. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_tools.py +0 -0
  458. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/macro_tools.py +0 -0
  459. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/notification_tools.py +0 -0
  460. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/project_tools.py +0 -0
  461. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  462. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  463. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/stripe_tools.py +0 -0
  464. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/__init__.py +0 -0
  465. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/banner.py +0 -0
  466. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/completer.py +0 -0
  467. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/console.py +0 -0
  468. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/image_render.py +0 -0
  469. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/input_box.py +0 -0
  470. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/picker.py +0 -0
  471. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/__init__.py +0 -0
  472. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/finance.py +0 -0
  473. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/market.py +0 -0
  474. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/output.py +0 -0
  475. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/responsive.py +0 -0
  476. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/team.py +0 -0
  477. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/robot.py +0 -0
  478. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  479. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/utils/vscode_uri.py +0 -0
  480. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/video_analysis.py +0 -0
  481. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/video_editor.py +0 -0
  482. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace/__init__.py +0 -0
  483. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace/files.py +0 -0
  484. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace/verify.py +0 -0
  485. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_changes.py +0 -0
  486. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_context.py +0 -0
  487. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_service.py +0 -0
  488. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_tools.py +0 -0
  489. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  490. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  491. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/requires.txt +0 -0
  492. {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/top_level.txt +0 -0
  493. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_adk_market_tools.py +0 -0
  494. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_agent_team_fallback.py +0 -0
  495. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_analyze_file_tool.py +0 -0
  496. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_architecture_ledger_is_true.py +0 -0
  497. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_architecture_report.py +0 -0
  498. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_aria_cli_core.py +0 -0
  499. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_aria_mcp_server.py +0 -0
  500. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_aria_sdk.py +0 -0
  501. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_artifact_publishing.py +0 -0
  502. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_artifacts_and_reports.py +0 -0
  503. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ashare_prediction_cmds.py +0 -0
  504. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_backtest_cmds.py +0 -0
  505. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_backtest_engine.py +0 -0
  506. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_backtest_report.py +0 -0
  507. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  508. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broken_akshare_is_optional.py +0 -0
  509. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_automation.py +0 -0
  510. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  511. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_planning.py +0 -0
  512. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_safety.py +0 -0
  513. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_tools.py +0 -0
  514. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_budget.py +0 -0
  515. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_business_workflow_cmds.py +0 -0
  516. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_canva_client.py +0 -0
  517. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_canvas_cmds.py +0 -0
  518. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_card_approvals.py +0 -0
  519. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_channel_intake.py +0 -0
  520. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_channels.py +0 -0
  521. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_chart_handlers.py +0 -0
  522. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_chat_bots_fail_closed.py +0 -0
  523. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_chat_routing.py +0 -0
  524. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ci_security_workflow.py +0 -0
  525. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_app_split.py +0 -0
  526. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_bootstrap.py +0 -0
  527. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_config_store.py +0 -0
  528. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  529. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_runtime_consumer.py +0 -0
  530. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_tool_executor_module.py +0 -0
  531. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cloud_memory.py +0 -0
  532. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_code_audit_tools.py +0 -0
  533. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_code_review_agent.py +0 -0
  534. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_codegen_output.py +0 -0
  535. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_coder_tester_self_healing.py +0 -0
  536. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_coder_tool_safety.py +0 -0
  537. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_collaboration.py +0 -0
  538. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_command_loggers.py +0 -0
  539. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_command_safety.py +0 -0
  540. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_completions_builder.py +0 -0
  541. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_config_paths.py +0 -0
  542. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_configured_provider.py +0 -0
  543. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_container_entrypoint.py +0 -0
  544. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_container_entrypoints.py +0 -0
  545. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_context_checkpoints.py +0 -0
  546. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_context_references.py +0 -0
  547. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_context_service.py +0 -0
  548. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_conversation_core.py +0 -0
  549. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_crash_report.py +0 -0
  550. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_credential_file_permissions.py +0 -0
  551. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_custom_providers.py +0 -0
  552. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_daemon_gateway_config.py +0 -0
  553. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_dashboard_generator.py +0 -0
  554. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_data_service.py +0 -0
  555. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_data_service_imports.py +0 -0
  556. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_datasource_routing.py +0 -0
  557. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_deep_analysis.py +0 -0
  558. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_degrades_without_quant_engine.py +0 -0
  559. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  560. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_doctor.py +0 -0
  561. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  562. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_doctor_npm_scope.py +0 -0
  563. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_engine_boundary.py +0 -0
  564. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_enterprise_tool_honesty.py +0 -0
  565. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_env_switch_docs.py +0 -0
  566. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_evals_harness.py +0 -0
  567. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_extended_tools.py +0 -0
  568. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_feishu_swarm_config.py +0 -0
  569. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_finalize_release.py +0 -0
  570. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_finance_renderers.py +0 -0
  571. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_finance_service_catalog.py +0 -0
  572. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_first_run_works.py +0 -0
  573. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_football_agent.py +0 -0
  574. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_football_prediction_output.py +0 -0
  575. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_google_cloud_routing.py +0 -0
  576. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_google_login.py +0 -0
  577. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_google_search_provider.py +0 -0
  578. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_headless_is_agentic.py +0 -0
  579. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_image_gen_tools.py +0 -0
  580. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_image_inputs.py +0 -0
  581. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_import_graph_budget.py +0 -0
  582. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_intent_router.py +0 -0
  583. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_intent_signals.py +0 -0
  584. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_kling_video_client.py +0 -0
  585. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_lazy_rebind.py +0 -0
  586. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_legacy_module_imports.py +0 -0
  587. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_license_consistency.py +0 -0
  588. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_licensing.py +0 -0
  589. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_local_image_provider.py +0 -0
  590. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_logistics_3pl.py +0 -0
  591. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_logistics_and_finance_agents.py +0 -0
  592. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_lsp.py +0 -0
  593. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_markdown_pdf.py +0 -0
  594. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_data_client.py +0 -0
  595. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_history_inheritance.py +0 -0
  596. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_history_tool.py +0 -0
  597. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_symbol_extraction.py +0 -0
  598. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_universe.py +0 -0
  599. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_mcp_circuit.py +0 -0
  600. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_mcp_client.py +0 -0
  601. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_model_capability_registry.py +0 -0
  602. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_model_choice_is_the_users.py +0 -0
  603. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_model_selection_state.py +0 -0
  604. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_native_binary_entrypoints.py +0 -0
  605. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_native_installer.py +0 -0
  606. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_new_modules.py +0 -0
  607. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  608. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_no_uncommitted_imports.py +0 -0
  609. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ollama_stream_imports.py +0 -0
  610. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ollama_stream_tools.py +0 -0
  611. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_openai_image_client.py +0 -0
  612. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_operations_suite.py +0 -0
  613. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_output_rendering.py +0 -0
  614. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packages_facade.py +0 -0
  615. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packaging_constraints.py +0 -0
  616. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packaging_manifest.py +0 -0
  617. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packs_domains.py +0 -0
  618. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_pdf_report.py +0 -0
  619. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_pick_best_installed_model.py +0 -0
  620. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_plan_mode.py +0 -0
  621. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_platform_package_assembly.py +0 -0
  622. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_platform_packages.py +0 -0
  623. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_plotly_html_output.py +0 -0
  624. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_portfolio_ledger.py +0 -0
  625. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_post_turn_context_decision.py +0 -0
  626. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_preflight.py +0 -0
  627. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_preview_server.py +0 -0
  628. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_privacy_feedback.py +0 -0
  629. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_project_aria.py +0 -0
  630. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_project_review.py +0 -0
  631. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_project_review_api.py +0 -0
  632. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_prompt_assembly.py +0 -0
  633. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_prompt_selection.py +0 -0
  634. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_autoconfig.py +0 -0
  635. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_error_messages.py +0 -0
  636. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_integration.py +0 -0
  637. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_registry.py +0 -0
  638. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_public_service_status.py +0 -0
  639. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_quant_engine_namespace.py +0 -0
  640. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_rebind_contract.py +0 -0
  641. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_rebind_namespace_contract.py +0 -0
  642. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_relay_client_credentials.py +0 -0
  643. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_relay_event_verification.py +0 -0
  644. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_relay_sends_for_clients.py +0 -0
  645. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_chain.py +0 -0
  646. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_commit_identity.py +0 -0
  647. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_push_is_atomic.py +0 -0
  648. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_reaches_the_registries.py +0 -0
  649. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_verification_waits.py +0 -0
  650. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_workflow_permissions.py +0 -0
  651. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_report_charts.py +0 -0
  652. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_report_generator.py +0 -0
  653. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_research_protocol.py +0 -0
  654. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_research_quality.py +0 -0
  655. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_responsive_rendering.py +0 -0
  656. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_root_module_budget.py +0 -0
  657. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  658. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_acceptance.py +0 -0
  659. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_agent_loop.py +0 -0
  660. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_approval.py +0 -0
  661. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_bridge.py +0 -0
  662. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_bridge_fallback.py +0 -0
  663. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_checkpoints.py +0 -0
  664. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_gateway.py +0 -0
  665. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_repo_map.py +0 -0
  666. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_run_store.py +0 -0
  667. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_tool_executor.py +0 -0
  668. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_worktrees.py +0 -0
  669. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runway_video_client.py +0 -0
  670. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_safety_permissions.py +0 -0
  671. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_safety_service.py +0 -0
  672. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_safety_service_adoption.py +0 -0
  673. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_service_diagnostics_security.py +0 -0
  674. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_session_search.py +0 -0
  675. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_settings_service.py +0 -0
  676. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_shipper_digest.py +0 -0
  677. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_single_import_root.py +0 -0
  678. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_skill_agent_binding.py +0 -0
  679. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_skill_catalog.py +0 -0
  680. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_skill_loader.py +0 -0
  681. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_spreadsheet_tools.py +0 -0
  682. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_sse_stream_contract.py +0 -0
  683. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_startup_dashboard.py +0 -0
  684. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_startup_latency.py +0 -0
  685. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_streaming_pipeline.py +0 -0
  686. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_stripe_agent.py +0 -0
  687. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_subagent.py +0 -0
  688. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_supervisor_routing.py +0 -0
  689. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_system_prompts.py +0 -0
  690. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_system_tools_output.py +0 -0
  691. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_task_orchestrator.py +0 -0
  692. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_team_synthesis.py +0 -0
  693. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tls_trust_store.py +0 -0
  694. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tool_policy.py +0 -0
  695. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tool_scope.py +0 -0
  696. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_trading_service.py +0 -0
  697. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tradingview_bridge.py +0 -0
  698. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_turn_planning.py +0 -0
  699. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_completer_references.py +0 -0
  700. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_console_theme.py +0 -0
  701. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_input_box.py +0 -0
  702. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_robot_banner.py +0 -0
  703. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_update_health_routes.py +0 -0
  704. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_verification_hint.py +0 -0
  705. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_verification_policy.py +0 -0
  706. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_version_consistency.py +0 -0
  707. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_version_counter.py +0 -0
  708. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_video_analysis.py +0 -0
  709. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_video_editor.py +0 -0
  710. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_vscode_mcp.py +0 -0
  711. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_agents.py +0 -0
  712. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_cli_registration.py +0 -0
  713. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_erp_client.py +0 -0
  714. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_workflow.py +0 -0
  715. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_wheel_is_installable.py +0 -0
  716. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_changes.py +0 -0
  717. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_context.py +0 -0
  718. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_files.py +0 -0
  719. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_scope.py +0 -0
  720. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_service.py +0 -0
  721. {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_verify.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.70.0
4
- Summary: AI coding and research workspace with optional finance and connected-domain tools
3
+ Version: 0.72.0
4
+ Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/artheras/aria-code
7
7
  Project-URL: Repository, https://github.com/artheras/aria-code
@@ -163,8 +163,8 @@ Dynamic: license-file
163
163
 
164
164
  <h1 align="center">Aria Code</h1>
165
165
 
166
- <p align="center">A terminal-first AI workspace for code and research.<br>
167
- Work in your project, use local or cloud models, and connect domain tools when you need them.</p>
166
+ <p align="center">An open-source AI agent for logistics and finance work.<br>
167
+ Numbers you can check, client data kept apart, actions a person approves.</p>
168
168
 
169
169
  <p align="center"><a href="README_CN.md">简体中文</a> · English</p>
170
170
 
@@ -180,9 +180,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
180
180
 
181
181
  ## What Aria Code does
182
182
 
183
- Aria Code can inspect project files, propose and apply edits, run commands and tests, and explain the resulting changes. It also supports research and optional domain tools, including financial analysis and read-only warehouse operations. Those tools require their own data sources or integrations; a fresh install does not provide live business data.
183
+ A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
184
184
 
185
- The same core runtime is used by the CLI and other Aria surfaces. Model choice and tool permissions are separate: you can use a local Ollama model, configure a supported cloud provider, or sign in to the Arthera service. A cloud model or live data source needs network access.
185
+ **Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
186
+
187
+ **Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
188
+
189
+ **Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
190
+
191
+ Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
186
192
 
187
193
  ## Quick start
188
194
 
@@ -7,8 +7,8 @@
7
7
 
8
8
  <h1 align="center">Aria Code</h1>
9
9
 
10
- <p align="center">A terminal-first AI workspace for code and research.<br>
11
- Work in your project, use local or cloud models, and connect domain tools when you need them.</p>
10
+ <p align="center">An open-source AI agent for logistics and finance work.<br>
11
+ Numbers you can check, client data kept apart, actions a person approves.</p>
12
12
 
13
13
  <p align="center"><a href="README_CN.md">简体中文</a> · English</p>
14
14
 
@@ -24,9 +24,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
24
24
 
25
25
  ## What Aria Code does
26
26
 
27
- Aria Code can inspect project files, propose and apply edits, run commands and tests, and explain the resulting changes. It also supports research and optional domain tools, including financial analysis and read-only warehouse operations. Those tools require their own data sources or integrations; a fresh install does not provide live business data.
27
+ A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
28
28
 
29
- The same core runtime is used by the CLI and other Aria surfaces. Model choice and tool permissions are separate: you can use a local Ollama model, configure a supported cloud provider, or sign in to the Arthera service. A cloud model or live data source needs network access.
29
+ **Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
30
+
31
+ **Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
32
+
33
+ **Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
34
+
35
+ Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
30
36
 
31
37
  ## Quick start
32
38
 
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aria-code"
7
- version = "0.70.0"
8
- description = "AI coding and research workspace with optional finance and connected-domain tools"
7
+ version = "0.72.0"
8
+ description = "Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
11
11
  # Upper bound is real, not defensive: the core dep pandas_ta pulls numba, and
@@ -17,4 +17,4 @@ from __future__ import annotations
17
17
 
18
18
  __all__ = ["__version__"]
19
19
 
20
- __version__ = "0.70.0"
20
+ __version__ = "0.72.0"
@@ -6555,7 +6555,7 @@ async def main():
6555
6555
  # describe one product. It used to say "Quantitative Investment
6556
6556
  # Terminal" here while the package metadata had been repositioned;
6557
6557
  # tests/test_first_run_works.py keeps the two in step.
6558
- description="Aria Code — AI coding and research workspace with optional finance and connected-domain tools",
6558
+ description="Aria Code — Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves",
6559
6559
  formatter_class=argparse.RawDescriptionHelpFormatter,
6560
6560
  epilog="""
6561
6561
  Examples:
@@ -40,6 +40,9 @@ WebSocket 注册流程:
40
40
  仅本地联调可设 RELAY_ALLOW_UNVERIFIED_EVENTS=1 绕过。
41
41
  RELAY_SECRET 部署级别的注册口令(可选)。每台电脑另有自己的令牌和绑定码,
42
42
  见下方 client_credentials:没有它们,任何人都能冒充或绑定别人的电脑。
43
+ RELAY_STORE 状态存储:sqlite(默认,DB_PATH)或 firestore。Cloud Run 上必须用
44
+ firestore——容器文件系统每次部署都会清空,SQLite 里的绑定和电脑凭证会丢。
45
+ RELAY_FIRESTORE_PROJECT / RELAY_FIRESTORE_DATABASE 可选,默认当前项目和 (default) 数据库
43
46
  DB_PATH SQLite 路径(默认 ./relay.db)
44
47
  MESSAGE_TIMEOUT 等待用户本机回复的超时秒数(默认 90)
45
48
  """
@@ -78,106 +81,44 @@ _MSG_TIMEOUT = int(os.environ.get("MESSAGE_TIMEOUT", "90"))
78
81
  _FEISHU_API = "https://open.feishu.cn/open-apis"
79
82
 
80
83
 
81
- # ── SQLite store ──────────────────────────────────────────────────────────────
84
+ # ── Persistent state (relay_store.py) ─────────────────────────────────────────
85
+ #
86
+ # SQLite by default; RELAY_STORE=firestore on Cloud Run, where the container
87
+ # filesystem — and with it a SQLite file — is discarded on every deploy.
88
+ #
89
+ # Each machine's credentials are recorded on its first registration (trust on
90
+ # first use), only as hashes: the token proves a later connection is the same
91
+ # machine; the bind code is the only thing /bind accepts. The bind code used to
92
+ # be the client_id, so anyone who learned one could bind their own Feishu
93
+ # account to someone else's machine.
94
+
95
+ _store_instance = None
82
96
 
83
- def _db() -> sqlite3.Connection:
84
- conn = sqlite3.connect(_DB_PATH, check_same_thread=False)
85
- conn.row_factory = sqlite3.Row
86
- conn.execute("""
87
- CREATE TABLE IF NOT EXISTS bindings (
88
- feishu_user_id TEXT PRIMARY KEY,
89
- client_id TEXT NOT NULL,
90
- bound_at REAL NOT NULL
91
- )
92
- """)
93
- conn.execute("""
94
- CREATE TABLE IF NOT EXISTS pending_binds (
95
- client_id TEXT PRIMARY KEY,
96
- created_at REAL NOT NULL
97
- )
98
- """)
99
- # Each machine's own credentials, recorded the first time it registers
100
- # (trust on first use) and only as hashes:
101
- # token_hash — later registrations of this client_id must present the
102
- # same token, so knowing a client_id is not enough to
103
- # impersonate the machine and take over its messages;
104
- # bind_code_hash — /bind accepts only this code, which is generated and
105
- # shown on the machine itself. The bind code used to be the
106
- # client_id, so anyone who learned one could bind their own
107
- # Feishu account to someone else's machine.
108
- conn.execute("""
109
- CREATE TABLE IF NOT EXISTS client_credentials (
110
- client_id TEXT PRIMARY KEY,
111
- token_hash TEXT NOT NULL,
112
- bind_code_hash TEXT NOT NULL,
113
- created_at REAL NOT NULL
114
- )
115
- """)
116
- # Chats a client's bound user has spoken to the bot in: the only chats the
117
- # client may later send to unprompted (the daily digest).
118
- conn.execute("""
119
- CREATE TABLE IF NOT EXISTS client_chats (
120
- client_id TEXT NOT NULL,
121
- chat_id TEXT NOT NULL,
122
- last_seen REAL NOT NULL,
123
- PRIMARY KEY (client_id, chat_id)
124
- )
125
- """)
126
- # Cards the relay posted for a client: a press on one is routed back to
127
- # that client, which holds the approval it belongs to.
128
- conn.execute("""
129
- CREATE TABLE IF NOT EXISTS card_origins (
130
- message_id TEXT PRIMARY KEY,
131
- client_id TEXT NOT NULL,
132
- created_at REAL NOT NULL
133
- )
134
- """)
135
- conn.commit()
136
- return conn
137
97
 
98
+ def _store():
99
+ global _store_instance
100
+ if _store_instance is None:
101
+ from aria_code.relay_store import open_store
102
+ _store_instance = open_store()
103
+ return _store_instance
138
104
 
139
- _db_conn: Optional[sqlite3.Connection] = None
105
+
106
+ def _ephemeral_store() -> bool:
107
+ """SQLite inside a Cloud Run container is discarded with the container."""
108
+ return bool(os.environ.get("K_SERVICE")) and _store().kind == "sqlite"
140
109
 
141
110
 
142
111
  def get_db() -> sqlite3.Connection:
143
- global _db_conn
144
- if _db_conn is None:
145
- _db_conn = _db()
146
- return _db_conn
112
+ """The SQLite connection, when that is the store (tests and local use)."""
113
+ return _store().db
147
114
 
148
115
 
149
116
  def _lookup_client(feishu_user_id: str) -> Optional[str]:
150
- row = get_db().execute(
151
- "SELECT client_id FROM bindings WHERE feishu_user_id = ?",
152
- (feishu_user_id,),
153
- ).fetchone()
154
- return row["client_id"] if row else None
117
+ return _store().client_for_user(feishu_user_id)
155
118
 
156
119
 
157
120
  def _bind(feishu_user_id: str, client_id: str) -> None:
158
- get_db().execute(
159
- "INSERT OR REPLACE INTO bindings VALUES (?, ?, ?)",
160
- (feishu_user_id, client_id, time.time()),
161
- )
162
- get_db().execute(
163
- "DELETE FROM pending_binds WHERE client_id = ?", (client_id,)
164
- )
165
- get_db().commit()
166
-
167
-
168
- def _register_pending(client_id: str) -> None:
169
- get_db().execute(
170
- "INSERT OR REPLACE INTO pending_binds VALUES (?, ?)",
171
- (client_id, time.time()),
172
- )
173
- get_db().commit()
174
-
175
-
176
- def _is_valid_client_id(client_id: str) -> bool:
177
- row = get_db().execute(
178
- "SELECT client_id FROM pending_binds WHERE client_id = ?", (client_id,)
179
- ).fetchone()
180
- return row is not None
121
+ _store().bind_user(feishu_user_id, client_id)
181
122
 
182
123
 
183
124
  def _digest(value: str) -> str:
@@ -194,19 +135,18 @@ def _admit_client(client_id: str, token: str, bind_code: str) -> str:
194
135
  return "this Aria version is too old for the relay; upgrade aria-code"
195
136
  if len(_normalise_bind_code(bind_code or "")) < 10:
196
137
  return "bind code missing; upgrade aria-code"
197
- row = get_db().execute(
198
- "SELECT token_hash FROM client_credentials WHERE client_id = ?", (client_id,)).fetchone()
199
- if row is None:
200
- get_db().execute("INSERT INTO client_credentials VALUES (?, ?, ?, ?)",
201
- (client_id, _digest(token), _digest(_normalise_bind_code(bind_code)), time.time()))
202
- get_db().commit()
203
- return ""
204
- if not hmac.compare_digest(row["token_hash"], _digest(token)):
138
+ store = _store()
139
+ code_hash = _digest(_normalise_bind_code(bind_code))
140
+ known = store.credentials(client_id)
141
+ if known is None:
142
+ if store.claim_credentials(client_id, _digest(token), code_hash):
143
+ return ""
144
+ known = store.credentials(client_id) # lost a race for the same id
145
+ if not known or not hmac.compare_digest(known["token_hash"], _digest(token)):
205
146
  return "client_id is registered to another installation"
206
147
  # The machine may rotate its bind code; the token proves it is the same one.
207
- get_db().execute("UPDATE client_credentials SET bind_code_hash = ? WHERE client_id = ?",
208
- (_digest(_normalise_bind_code(bind_code)), client_id))
209
- get_db().commit()
148
+ if known["bind_code_hash"] != code_hash:
149
+ store.set_bind_code(client_id, code_hash)
210
150
  return ""
211
151
 
212
152
 
@@ -214,9 +154,7 @@ def _client_for_bind_code(code: str) -> Optional[str]:
214
154
  normalised = _normalise_bind_code(code)
215
155
  if len(normalised) < 10:
216
156
  return None
217
- row = get_db().execute("SELECT client_id FROM client_credentials WHERE bind_code_hash = ?",
218
- (_digest(normalised),)).fetchone()
219
- return row["client_id"] if row else None
157
+ return _store().client_for_bind_code(_digest(normalised))
220
158
 
221
159
 
222
160
  # ── WebSocket connection registry ─────────────────────────────────────────────
@@ -253,9 +191,7 @@ def _remember_forward(client_id: str, message_id: str, chat_id: str) -> None:
253
191
  if message_id:
254
192
  _forwarded[message_id] = (client_id, now + _FORWARD_TTL)
255
193
  if chat_id:
256
- get_db().execute(
257
- "INSERT OR REPLACE INTO client_chats VALUES (?, ?, ?)", (client_id, chat_id, now))
258
- get_db().commit()
194
+ _store().remember_chat(client_id, chat_id)
259
195
 
260
196
 
261
197
  def _may_send(client_id: str, request: dict) -> str:
@@ -272,10 +208,7 @@ def _may_send(client_id: str, request: dict) -> str:
272
208
  elif op == "send":
273
209
  if request.get("receive_id_type", "chat_id") != "chat_id":
274
210
  return "send is only to chats"
275
- row = get_db().execute(
276
- "SELECT 1 FROM client_chats WHERE client_id = ? AND chat_id = ?", (client_id, target)
277
- ).fetchone()
278
- if not row:
211
+ if not _store().has_chat(client_id, target):
279
212
  return "this client has no conversation in that chat"
280
213
  else:
281
214
  return "op must be reply or send"
@@ -309,17 +242,13 @@ async def _send_for_client(client_id: str, request: dict) -> dict:
309
242
  return {"code": -1, "msg": "relay could not reach Feishu"}
310
243
  sent_id = ((result.get("data") or {}).get("message_id") or "")
311
244
  if result.get("code") == 0 and request["msg_type"] == "interactive" and sent_id:
312
- get_db().execute("INSERT OR REPLACE INTO card_origins VALUES (?, ?, ?)",
313
- (sent_id, client_id, time.time()))
314
- get_db().commit()
245
+ _store().remember_card(sent_id, client_id)
315
246
  return {"code": result.get("code"), "msg": result.get("msg", ""),
316
247
  "data": {"message_id": sent_id} if sent_id else {}}
317
248
 
318
249
 
319
250
  def _card_origin(message_id: str) -> Optional[str]:
320
- row = get_db().execute("SELECT client_id FROM card_origins WHERE message_id = ?",
321
- (message_id,)).fetchone()
322
- return row["client_id"] if row else None
251
+ return _store().card_origin(message_id) if message_id else None
323
252
 
324
253
 
325
254
  # ── Feishu API helpers ────────────────────────────────────────────────────────
@@ -430,7 +359,10 @@ async def lifespan(app: FastAPI):
430
359
  datefmt="%H:%M:%S",
431
360
  )
432
361
  logger.info("Aria Relay Server started db=%s", _DB_PATH)
433
- get_db() # init tables
362
+ logger.info("Relay state store: %s", _store().kind)
363
+ if _ephemeral_store():
364
+ logger.warning("Running on Cloud Run with SQLite: bindings and machine credentials are "
365
+ "lost on every deploy. Set RELAY_STORE=firestore.")
434
366
  yield
435
367
  logger.info("Relay Server shutting down")
436
368
 
@@ -472,8 +404,6 @@ async def ws_endpoint(websocket: WebSocket):
472
404
 
473
405
  # Register in-memory + mark as pending bind (if first time)
474
406
  _connections[client_id] = websocket
475
- if _lookup_client.__module__: # always true; used as noop to be explicit
476
- _register_pending(client_id)
477
407
 
478
408
  await websocket.send_text(json.dumps({"ok": True, "client_id": client_id}))
479
409
  logger.info("Client connected: %s", client_id)
@@ -675,7 +605,10 @@ async def status(request: Request):
675
605
  """
676
606
  body = {
677
607
  "connected_clients": len(_connections),
678
- "total_bindings": get_db().execute("SELECT COUNT(*) FROM bindings").fetchone()[0],
608
+ "total_bindings": _store().binding_count(),
609
+ "store": _store().kind,
610
+ **({"store_warning": "sqlite on Cloud Run — bindings are lost on every deploy; "
611
+ "set RELAY_STORE=firestore"} if _ephemeral_store() else {}),
679
612
  "feishu_app_configured": bool(_FEISHU_APP_ID),
680
613
  "event_verification": (
681
614
  "encrypt_key" if _FEISHU_ENCRYPT_KEY
@@ -0,0 +1,194 @@
1
+ """Where the relay keeps what it must not forget.
2
+
3
+ Bindings (which Feishu user reaches which machine), each machine's
4
+ credentials, the chats a client may post to, and which client posted which
5
+ card. All of it used to live in a SQLite file inside the container — and a
6
+ Cloud Run container's filesystem is discarded on every deploy and restart, so
7
+ every merge to main unbound every user and reset every machine's credentials
8
+ to "first use". `RELAY_STORE=firestore` keeps it in Firestore instead.
9
+
10
+ SQLite stays the default: right for local development and for a self-hosted
11
+ relay with a persistent disk.
12
+
13
+ Both stores implement the same small contract, and tests/test_relay_store.py
14
+ runs one set of tests against both. The one operation that must be atomic is
15
+ claim_credentials: the first registration of a client_id wins, and two
16
+ connections racing for the same id cannot both. SQLite gets that from the
17
+ primary key, Firestore from create(), which fails if the document exists.
18
+
19
+ Firestore layout — every read is by document id, never a query:
20
+ relay_bindings/{feishu_user_id} {client_id, bound_at}
21
+ relay_clients/{client_id} {token_hash, bind_code_hash, created_at}
22
+ relay_bind_codes/{bind_code_hash} {client_id}
23
+ relay_client_chats/{sha256(client:chat)} {client_id, chat_id, last_seen}
24
+ relay_card_origins/{message_id} {client_id, created_at}
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import hashlib
30
+ import os
31
+ import sqlite3
32
+ import time
33
+ from typing import Optional
34
+
35
+
36
+ class SqliteStore:
37
+ kind = "sqlite"
38
+
39
+ def __init__(self, path: str) -> None:
40
+ self.db = sqlite3.connect(path, check_same_thread=False)
41
+ self.db.row_factory = sqlite3.Row
42
+ self.db.executescript("""
43
+ CREATE TABLE IF NOT EXISTS bindings (
44
+ feishu_user_id TEXT PRIMARY KEY, client_id TEXT NOT NULL, bound_at REAL NOT NULL);
45
+ CREATE TABLE IF NOT EXISTS client_credentials (
46
+ client_id TEXT PRIMARY KEY, token_hash TEXT NOT NULL,
47
+ bind_code_hash TEXT NOT NULL, created_at REAL NOT NULL);
48
+ CREATE TABLE IF NOT EXISTS client_chats (
49
+ client_id TEXT NOT NULL, chat_id TEXT NOT NULL, last_seen REAL NOT NULL,
50
+ PRIMARY KEY (client_id, chat_id));
51
+ CREATE TABLE IF NOT EXISTS card_origins (
52
+ message_id TEXT PRIMARY KEY, client_id TEXT NOT NULL, created_at REAL NOT NULL);
53
+ """)
54
+ self.db.commit()
55
+
56
+ def client_for_user(self, feishu_user_id: str) -> Optional[str]:
57
+ row = self.db.execute("SELECT client_id FROM bindings WHERE feishu_user_id = ?",
58
+ (feishu_user_id,)).fetchone()
59
+ return row["client_id"] if row else None
60
+
61
+ def bind_user(self, feishu_user_id: str, client_id: str) -> None:
62
+ self.db.execute("INSERT OR REPLACE INTO bindings VALUES (?, ?, ?)",
63
+ (feishu_user_id, client_id, time.time()))
64
+ self.db.commit()
65
+
66
+ def binding_count(self) -> int:
67
+ return self.db.execute("SELECT COUNT(*) FROM bindings").fetchone()[0]
68
+
69
+ def credentials(self, client_id: str) -> Optional[dict]:
70
+ row = self.db.execute("SELECT token_hash, bind_code_hash FROM client_credentials "
71
+ "WHERE client_id = ?", (client_id,)).fetchone()
72
+ return dict(row) if row else None
73
+
74
+ def claim_credentials(self, client_id: str, token_hash: str, bind_code_hash: str) -> bool:
75
+ try:
76
+ self.db.execute("INSERT INTO client_credentials VALUES (?, ?, ?, ?)",
77
+ (client_id, token_hash, bind_code_hash, time.time()))
78
+ self.db.commit()
79
+ return True
80
+ except sqlite3.IntegrityError:
81
+ return False
82
+
83
+ def set_bind_code(self, client_id: str, bind_code_hash: str) -> None:
84
+ self.db.execute("UPDATE client_credentials SET bind_code_hash = ? WHERE client_id = ?",
85
+ (bind_code_hash, client_id))
86
+ self.db.commit()
87
+
88
+ def client_for_bind_code(self, bind_code_hash: str) -> Optional[str]:
89
+ row = self.db.execute("SELECT client_id FROM client_credentials WHERE bind_code_hash = ?",
90
+ (bind_code_hash,)).fetchone()
91
+ return row["client_id"] if row else None
92
+
93
+ def remember_chat(self, client_id: str, chat_id: str) -> None:
94
+ self.db.execute("INSERT OR REPLACE INTO client_chats VALUES (?, ?, ?)",
95
+ (client_id, chat_id, time.time()))
96
+ self.db.commit()
97
+
98
+ def has_chat(self, client_id: str, chat_id: str) -> bool:
99
+ return self.db.execute("SELECT 1 FROM client_chats WHERE client_id = ? AND chat_id = ?",
100
+ (client_id, chat_id)).fetchone() is not None
101
+
102
+ def remember_card(self, message_id: str, client_id: str) -> None:
103
+ self.db.execute("INSERT OR REPLACE INTO card_origins VALUES (?, ?, ?)",
104
+ (message_id, client_id, time.time()))
105
+ self.db.commit()
106
+
107
+ def card_origin(self, message_id: str) -> Optional[str]:
108
+ row = self.db.execute("SELECT client_id FROM card_origins WHERE message_id = ?",
109
+ (message_id,)).fetchone()
110
+ return row["client_id"] if row else None
111
+
112
+
113
+ class FirestoreStore:
114
+ kind = "firestore"
115
+
116
+ def __init__(self, client, already_exists: type = Exception) -> None:
117
+ self.client = client
118
+ self._already_exists = already_exists
119
+
120
+ def _doc(self, collection: str, doc_id: str):
121
+ return self.client.collection(collection).document(doc_id)
122
+
123
+ def _get(self, collection: str, doc_id: str) -> Optional[dict]:
124
+ if not doc_id:
125
+ return None
126
+ snapshot = self._doc(collection, doc_id).get()
127
+ return snapshot.to_dict() if snapshot.exists else None
128
+
129
+ @staticmethod
130
+ def _chat_key(client_id: str, chat_id: str) -> str:
131
+ return hashlib.sha256(f"{client_id}\0{chat_id}".encode("utf-8")).hexdigest()
132
+
133
+ def client_for_user(self, feishu_user_id: str) -> Optional[str]:
134
+ return (self._get("relay_bindings", feishu_user_id) or {}).get("client_id")
135
+
136
+ def bind_user(self, feishu_user_id: str, client_id: str) -> None:
137
+ self._doc("relay_bindings", feishu_user_id).set({"client_id": client_id, "bound_at": time.time()})
138
+
139
+ def binding_count(self) -> int:
140
+ # Fine at a relay's scale; an aggregation query would need an index.
141
+ return sum(1 for _ in self.client.collection("relay_bindings").list_documents())
142
+
143
+ def credentials(self, client_id: str) -> Optional[dict]:
144
+ data = self._get("relay_clients", client_id)
145
+ return {"token_hash": data["token_hash"], "bind_code_hash": data["bind_code_hash"]} if data else None
146
+
147
+ def claim_credentials(self, client_id: str, token_hash: str, bind_code_hash: str) -> bool:
148
+ try:
149
+ self._doc("relay_clients", client_id).create(
150
+ {"token_hash": token_hash, "bind_code_hash": bind_code_hash, "created_at": time.time()})
151
+ except self._already_exists:
152
+ return False
153
+ self._doc("relay_bind_codes", bind_code_hash).set({"client_id": client_id})
154
+ return True
155
+
156
+ def set_bind_code(self, client_id: str, bind_code_hash: str) -> None:
157
+ old = (self._get("relay_clients", client_id) or {}).get("bind_code_hash")
158
+ if old and old != bind_code_hash:
159
+ self._doc("relay_bind_codes", old).delete()
160
+ self._doc("relay_bind_codes", bind_code_hash).set({"client_id": client_id})
161
+ self._doc("relay_clients", client_id).set({"bind_code_hash": bind_code_hash}, merge=True)
162
+
163
+ def client_for_bind_code(self, bind_code_hash: str) -> Optional[str]:
164
+ return (self._get("relay_bind_codes", bind_code_hash) or {}).get("client_id")
165
+
166
+ def remember_chat(self, client_id: str, chat_id: str) -> None:
167
+ self._doc("relay_client_chats", self._chat_key(client_id, chat_id)).set(
168
+ {"client_id": client_id, "chat_id": chat_id, "last_seen": time.time()})
169
+
170
+ def has_chat(self, client_id: str, chat_id: str) -> bool:
171
+ return self._get("relay_client_chats", self._chat_key(client_id, chat_id)) is not None
172
+
173
+ def remember_card(self, message_id: str, client_id: str) -> None:
174
+ self._doc("relay_card_origins", message_id).set({"client_id": client_id, "created_at": time.time()})
175
+
176
+ def card_origin(self, message_id: str) -> Optional[str]:
177
+ return (self._get("relay_card_origins", message_id) or {}).get("client_id")
178
+
179
+
180
+ def open_store():
181
+ """The store RELAY_STORE names: "sqlite" (default, DB_PATH) or "firestore"."""
182
+ kind = os.environ.get("RELAY_STORE", "sqlite").strip().lower()
183
+ if kind == "firestore":
184
+ from google.api_core.exceptions import AlreadyExists
185
+ from google.cloud import firestore
186
+
187
+ client = firestore.Client(
188
+ project=os.environ.get("RELAY_FIRESTORE_PROJECT") or None,
189
+ database=os.environ.get("RELAY_FIRESTORE_DATABASE") or "(default)",
190
+ )
191
+ return FirestoreStore(client, already_exists=AlreadyExists)
192
+ if kind != "sqlite":
193
+ raise ValueError(f"RELAY_STORE must be sqlite or firestore, not {kind!r}")
194
+ return SqliteStore(os.environ.get("DB_PATH", "./relay.db"))
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.70.0
4
- Summary: AI coding and research workspace with optional finance and connected-domain tools
3
+ Version: 0.72.0
4
+ Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://github.com/artheras/aria-code
7
7
  Project-URL: Repository, https://github.com/artheras/aria-code
@@ -163,8 +163,8 @@ Dynamic: license-file
163
163
 
164
164
  <h1 align="center">Aria Code</h1>
165
165
 
166
- <p align="center">A terminal-first AI workspace for code and research.<br>
167
- Work in your project, use local or cloud models, and connect domain tools when you need them.</p>
166
+ <p align="center">An open-source AI agent for logistics and finance work.<br>
167
+ Numbers you can check, client data kept apart, actions a person approves.</p>
168
168
 
169
169
  <p align="center"><a href="README_CN.md">简体中文</a> · English</p>
170
170
 
@@ -180,9 +180,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
180
180
 
181
181
  ## What Aria Code does
182
182
 
183
- Aria Code can inspect project files, propose and apply edits, run commands and tests, and explain the resulting changes. It also supports research and optional domain tools, including financial analysis and read-only warehouse operations. Those tools require their own data sources or integrations; a fresh install does not provide live business data.
183
+ A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
184
184
 
185
- The same core runtime is used by the CLI and other Aria surfaces. Model choice and tool permissions are separate: you can use a local Ollama model, configure a supported cloud provider, or sign in to the Arthera service. A cloud model or live data source needs network access.
185
+ **Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
186
+
187
+ **Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
188
+
189
+ **Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
190
+
191
+ Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
186
192
 
187
193
  ## Quick start
188
194
 
@@ -56,6 +56,7 @@ src/aria_code/project_review_api.py
56
56
  src/aria_code/project_review_server.py
57
57
  src/aria_code/project_tools.py
58
58
  src/aria_code/realty_data_tools.py
59
+ src/aria_code/relay_store.py
59
60
  src/aria_code/report_exporters.py
60
61
  src/aria_code/report_generator.py
61
62
  src/aria_code/runway_video_client.py
@@ -638,6 +639,7 @@ tests/test_rebind_namespace_contract.py
638
639
  tests/test_relay_client_credentials.py
639
640
  tests/test_relay_event_verification.py
640
641
  tests/test_relay_sends_for_clients.py
642
+ tests/test_relay_store.py
641
643
  tests/test_release_chain.py
642
644
  tests/test_release_commit_identity.py
643
645
  tests/test_release_push_is_atomic.py