aria-code 0.69.0__tar.gz → 0.71.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 (719) hide show
  1. {aria_code-0.69.0 → aria_code-0.71.0}/PKG-INFO +12 -6
  2. {aria_code-0.69.0 → aria_code-0.71.0}/README.md +10 -4
  3. {aria_code-0.69.0 → aria_code-0.71.0}/pyproject.toml +2 -2
  4. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/_version.py +1 -1
  5. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_cli.py +1 -1
  6. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_relay_server.py +79 -10
  7. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/aria_relay_client.py +63 -4
  8. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/setup_wizard.py +13 -5
  9. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/PKG-INFO +12 -6
  10. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/SOURCES.txt +1 -0
  11. aria_code-0.71.0/tests/test_relay_client_credentials.py +161 -0
  12. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_relay_sends_for_clients.py +2 -1
  13. {aria_code-0.69.0 → aria_code-0.71.0}/LICENSE +0 -0
  14. {aria_code-0.69.0 → aria_code-0.71.0}/NOTICE +0 -0
  15. {aria_code-0.69.0 → aria_code-0.71.0}/setup.cfg +0 -0
  16. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/__init__.py +0 -0
  17. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/__init__.py +0 -0
  18. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  19. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  20. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  21. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  22. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/__init__.py +0 -0
  23. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/base.py +0 -0
  24. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/code_review.py +0 -0
  25. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/__init__.py +0 -0
  26. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  27. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/critic.py +0 -0
  28. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/deepen.py +0 -0
  29. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/models.py +0 -0
  30. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  31. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  32. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/themes.py +0 -0
  33. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/tiers.py +0 -0
  34. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  35. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/engineering/coder.py +0 -0
  36. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/engineering/tester.py +0 -0
  37. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/__init__.py +0 -0
  38. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  39. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  40. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  41. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/debate.py +0 -0
  42. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/earnings.py +0 -0
  43. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  44. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/macro.py +0 -0
  45. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/news.py +0 -0
  46. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/risk.py +0 -0
  47. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/sector.py +0 -0
  48. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/strategist.py +0 -0
  49. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  50. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  51. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/technical.py +0 -0
  52. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/orchestrator.py +0 -0
  53. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  54. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/__init__.py +0 -0
  55. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  56. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/business_match.py +0 -0
  57. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  58. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  59. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  60. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  61. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  62. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  63. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  64. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/registry.py +0 -0
  65. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/signal_scheme.py +0 -0
  66. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/sports/__init__.py +0 -0
  67. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  68. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/supervisor.py +0 -0
  69. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/team.py +0 -0
  70. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  71. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  72. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  73. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  74. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  75. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  76. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  77. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  78. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  79. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  80. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  81. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aliyun_data_client.py +0 -0
  82. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/README.md +0 -0
  83. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/__init__.py +0 -0
  84. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/README.md +0 -0
  85. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/__init__.py +0 -0
  86. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/approvals.py +0 -0
  87. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/conversation.py +0 -0
  88. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/digest.py +0 -0
  89. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/intake.py +0 -0
  90. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/registry.py +0 -0
  91. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  92. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/README.md +0 -0
  93. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/__init__.py +0 -0
  94. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/_optional.py +0 -0
  95. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  96. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  97. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  98. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  99. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  100. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  101. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  102. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  103. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  104. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  105. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  106. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  107. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  108. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  109. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
  110. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  111. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  112. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  113. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  114. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  115. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  116. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  117. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  118. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  119. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  120. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  121. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  122. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  123. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  124. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  125. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  126. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  127. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  128. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  129. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  130. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  131. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  132. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  133. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  134. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  135. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  136. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/config_store.py +0 -0
  137. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/constants.py +0 -0
  138. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/context.py +0 -0
  139. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  140. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/direct.py +0 -0
  141. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  142. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  143. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  144. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/google_login.py +0 -0
  145. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  146. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  147. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  148. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  149. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  150. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  151. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  152. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/helpers.py +0 -0
  153. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/hooks.py +0 -0
  154. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/i18n.py +0 -0
  155. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/intent.py +0 -0
  156. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  157. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  158. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  159. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  160. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/main.py +0 -0
  161. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  162. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  163. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  164. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  165. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  166. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  167. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  168. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  169. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/preflight.py +0 -0
  170. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  171. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  172. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  173. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  174. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  175. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  176. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  177. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  178. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  179. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  180. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  181. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  182. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  183. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  184. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  185. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  186. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  187. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  188. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  189. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  190. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  191. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  192. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/session_export.py +0 -0
  193. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  194. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/session_store.py +0 -0
  195. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  196. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  197. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  198. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  199. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  200. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  201. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  202. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  203. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  204. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  205. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  206. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  207. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  208. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  209. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/update_check.py +0 -0
  210. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  211. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  212. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/daemon/README.md +0 -0
  213. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/vscode/README.md +0 -0
  214. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/vscode/package.json +0 -0
  215. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_daemon.py +0 -0
  216. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_feishu_bot.py +0 -0
  217. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_mcp_server.py +0 -0
  218. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_relay_client.py +0 -0
  219. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_telegram_bot.py +0 -0
  220. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ariarc.py +0 -0
  221. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/artifacts.py +0 -0
  222. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/backtest_engine.py +0 -0
  223. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/backtest_report.py +0 -0
  224. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/__init__.py +0 -0
  225. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/automation.py +0 -0
  226. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/base.py +0 -0
  227. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/capabilities.py +0 -0
  228. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  229. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  230. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  231. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  232. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  233. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  234. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/config.py +0 -0
  235. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  236. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  237. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  238. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  239. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  240. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/paper_broker.py +0 -0
  241. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/planning.py +0 -0
  242. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/registry.py +0 -0
  243. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/trading.py +0 -0
  244. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/canva_client.py +0 -0
  245. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/change_store.py +0 -0
  246. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/__init__.py +0 -0
  247. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  248. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/canva_client.py +0 -0
  249. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/figma_client.py +0 -0
  250. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/football_data_client.py +0 -0
  251. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/kling_video_client.py +0 -0
  252. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/market_data_client.py +0 -0
  253. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/openai_image_client.py +0 -0
  254. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/runway_video_client.py +0 -0
  255. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  256. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/cloud_memory.py +0 -0
  257. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/command_safety.py +0 -0
  258. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/computer_use_tools.py +0 -0
  259. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/dashboard_generator.py +0 -0
  260. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/data_analysis_tools.py +0 -0
  261. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/data_cleaner.py +0 -0
  262. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/data_service.py +0 -0
  263. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/__init__.py +0 -0
  264. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/base.py +0 -0
  265. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/router.py +0 -0
  266. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  267. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  268. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  269. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  270. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  271. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  272. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  273. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  274. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  275. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  276. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/demo_player.py +0 -0
  277. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/doctor.py +0 -0
  278. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/__init__.py +0 -0
  279. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/backtest_engine.py +0 -0
  280. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/backtest_report.py +0 -0
  281. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/finance_formulas.py +0 -0
  282. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  283. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/strategy_vault.py +0 -0
  284. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/evals/__init__.py +0 -0
  285. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/evals/harness.py +0 -0
  286. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/evals/runner.py +0 -0
  287. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/external_agent_runner.py +0 -0
  288. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/figma_client.py +0 -0
  289. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/file_analysis_tools.py +0 -0
  290. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/finance_formulas.py +0 -0
  291. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/football_data_client.py +0 -0
  292. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/image_gen_tools.py +0 -0
  293. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/intent_classifier.py +0 -0
  294. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/kling_video_client.py +0 -0
  295. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/licensing.py +0 -0
  296. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/local_finance_tools.py +0 -0
  297. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/local_image_provider.py +0 -0
  298. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/local_llm_provider.py +0 -0
  299. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/macro_tools.py +0 -0
  300. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/markdown_pdf.py +0 -0
  301. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/market_data_client.py +0 -0
  302. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/mcp_client.py +0 -0
  303. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/memory_manager.py +0 -0
  304. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/model_capability.py +0 -0
  305. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/notification_tools.py +0 -0
  306. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/openai_image_client.py +0 -0
  307. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/__init__.py +0 -0
  308. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  309. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  310. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  311. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  312. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  313. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  314. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  315. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/export.py +0 -0
  316. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  317. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  318. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  319. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  320. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  321. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  322. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  323. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  324. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  325. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  326. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  327. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  328. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  329. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  330. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  331. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  332. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  333. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  334. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  335. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  336. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  337. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/context.py +0 -0
  338. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  339. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/data.py +0 -0
  340. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  341. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/references.py +0 -0
  342. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  343. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  344. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  345. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  346. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  347. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  348. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  349. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  350. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  351. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  352. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  353. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  354. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  355. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  356. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  357. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  358. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  359. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  360. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  361. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  362. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  363. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  364. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  365. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  366. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  367. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  368. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  369. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  370. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  371. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  372. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  373. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  374. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  375. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  376. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  377. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  378. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  379. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  380. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  381. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  382. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/__init__.py +0 -0
  383. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/base.py +0 -0
  384. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/finance/__init__.py +0 -0
  385. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  386. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/payments/__init__.py +0 -0
  387. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/realty/__init__.py +0 -0
  388. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/registry.py +0 -0
  389. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/rules.py +0 -0
  390. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/plan_utils.py +0 -0
  391. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/plugin_loader.py +0 -0
  392. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/portfolio_ledger.py +0 -0
  393. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/preview_server.py +0 -0
  394. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/privacy/__init__.py +0 -0
  395. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/privacy/feedback.py +0 -0
  396. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_review.py +0 -0
  397. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_review_api.py +0 -0
  398. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_review_server.py +0 -0
  399. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_tools.py +0 -0
  400. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/__init__.py +0 -0
  401. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/__init__.py +0 -0
  402. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  403. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  404. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/base.py +0 -0
  405. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/custom.py +0 -0
  406. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/ollama.py +0 -0
  407. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  408. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/registry.py +0 -0
  409. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/local_image_provider.py +0 -0
  410. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  411. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/realty_data_tools.py +0 -0
  412. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/report_exporters.py +0 -0
  413. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/report_generator.py +0 -0
  414. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/__init__.py +0 -0
  415. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/acceptance.py +0 -0
  416. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/agent_loop.py +0 -0
  417. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/approval.py +0 -0
  418. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/budget.py +0 -0
  419. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/checkpoints.py +0 -0
  420. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/crash_report.py +0 -0
  421. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/events.py +0 -0
  422. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/gateway.py +0 -0
  423. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/lsp.py +0 -0
  424. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/orchestrator.py +0 -0
  425. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/repo_map.py +0 -0
  426. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/run_state.py +0 -0
  427. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/run_store.py +0 -0
  428. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/self_healing.py +0 -0
  429. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/subagent.py +0 -0
  430. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/task_ledger.py +0 -0
  431. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  432. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/tool_executor.py +0 -0
  433. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/tool_policy.py +0 -0
  434. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/worktrees.py +0 -0
  435. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runway_video_client.py +0 -0
  436. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/safety/__init__.py +0 -0
  437. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/safety/permissions.py +0 -0
  438. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/safety/service.py +0 -0
  439. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/spreadsheet_tools.py +0 -0
  440. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/strategy_vault.py +0 -0
  441. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/__init__.py +0 -0
  442. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/artifact_tools.py +0 -0
  443. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/broker_tools.py +0 -0
  444. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  445. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  446. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  447. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  448. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  449. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/extended_tools.py +0 -0
  450. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  451. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  452. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  453. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  454. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  455. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_io.py +0 -0
  456. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  457. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_tools.py +0 -0
  458. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/macro_tools.py +0 -0
  459. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/notification_tools.py +0 -0
  460. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/project_tools.py +0 -0
  461. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  462. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  463. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/stripe_tools.py +0 -0
  464. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/__init__.py +0 -0
  465. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/banner.py +0 -0
  466. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/completer.py +0 -0
  467. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/console.py +0 -0
  468. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/image_render.py +0 -0
  469. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/input_box.py +0 -0
  470. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/picker.py +0 -0
  471. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/__init__.py +0 -0
  472. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/finance.py +0 -0
  473. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/market.py +0 -0
  474. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/output.py +0 -0
  475. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/responsive.py +0 -0
  476. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/team.py +0 -0
  477. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/robot.py +0 -0
  478. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  479. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/utils/vscode_uri.py +0 -0
  480. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/video_analysis.py +0 -0
  481. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/video_editor.py +0 -0
  482. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace/__init__.py +0 -0
  483. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace/files.py +0 -0
  484. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace/verify.py +0 -0
  485. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_changes.py +0 -0
  486. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_context.py +0 -0
  487. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_service.py +0 -0
  488. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_tools.py +0 -0
  489. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  490. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  491. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/requires.txt +0 -0
  492. {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/top_level.txt +0 -0
  493. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_adk_market_tools.py +0 -0
  494. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_agent_team_fallback.py +0 -0
  495. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_analyze_file_tool.py +0 -0
  496. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_architecture_ledger_is_true.py +0 -0
  497. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_architecture_report.py +0 -0
  498. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_aria_cli_core.py +0 -0
  499. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_aria_mcp_server.py +0 -0
  500. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_aria_sdk.py +0 -0
  501. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_artifact_publishing.py +0 -0
  502. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_artifacts_and_reports.py +0 -0
  503. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ashare_prediction_cmds.py +0 -0
  504. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_backtest_cmds.py +0 -0
  505. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_backtest_engine.py +0 -0
  506. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_backtest_report.py +0 -0
  507. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  508. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broken_akshare_is_optional.py +0 -0
  509. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_automation.py +0 -0
  510. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  511. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_planning.py +0 -0
  512. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_safety.py +0 -0
  513. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_tools.py +0 -0
  514. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_budget.py +0 -0
  515. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_business_workflow_cmds.py +0 -0
  516. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_canva_client.py +0 -0
  517. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_canvas_cmds.py +0 -0
  518. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_card_approvals.py +0 -0
  519. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_channel_intake.py +0 -0
  520. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_channels.py +0 -0
  521. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_chart_handlers.py +0 -0
  522. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_chat_bots_fail_closed.py +0 -0
  523. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_chat_routing.py +0 -0
  524. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ci_security_workflow.py +0 -0
  525. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_app_split.py +0 -0
  526. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_bootstrap.py +0 -0
  527. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_config_store.py +0 -0
  528. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  529. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_runtime_consumer.py +0 -0
  530. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_tool_executor_module.py +0 -0
  531. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cloud_memory.py +0 -0
  532. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_code_audit_tools.py +0 -0
  533. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_code_review_agent.py +0 -0
  534. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_codegen_output.py +0 -0
  535. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_coder_tester_self_healing.py +0 -0
  536. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_coder_tool_safety.py +0 -0
  537. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_collaboration.py +0 -0
  538. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_command_loggers.py +0 -0
  539. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_command_safety.py +0 -0
  540. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_completions_builder.py +0 -0
  541. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_config_paths.py +0 -0
  542. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_configured_provider.py +0 -0
  543. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_container_entrypoint.py +0 -0
  544. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_container_entrypoints.py +0 -0
  545. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_context_checkpoints.py +0 -0
  546. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_context_references.py +0 -0
  547. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_context_service.py +0 -0
  548. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_conversation_core.py +0 -0
  549. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_crash_report.py +0 -0
  550. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_credential_file_permissions.py +0 -0
  551. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_custom_providers.py +0 -0
  552. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_daemon_gateway_config.py +0 -0
  553. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_dashboard_generator.py +0 -0
  554. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_data_service.py +0 -0
  555. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_data_service_imports.py +0 -0
  556. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_datasource_routing.py +0 -0
  557. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_deep_analysis.py +0 -0
  558. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_degrades_without_quant_engine.py +0 -0
  559. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  560. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_doctor.py +0 -0
  561. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  562. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_doctor_npm_scope.py +0 -0
  563. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_engine_boundary.py +0 -0
  564. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_enterprise_tool_honesty.py +0 -0
  565. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_env_switch_docs.py +0 -0
  566. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_evals_harness.py +0 -0
  567. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_extended_tools.py +0 -0
  568. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_feishu_swarm_config.py +0 -0
  569. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_finalize_release.py +0 -0
  570. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_finance_renderers.py +0 -0
  571. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_finance_service_catalog.py +0 -0
  572. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_first_run_works.py +0 -0
  573. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_football_agent.py +0 -0
  574. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_football_prediction_output.py +0 -0
  575. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_google_cloud_routing.py +0 -0
  576. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_google_login.py +0 -0
  577. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_google_search_provider.py +0 -0
  578. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_headless_is_agentic.py +0 -0
  579. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_image_gen_tools.py +0 -0
  580. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_image_inputs.py +0 -0
  581. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_import_graph_budget.py +0 -0
  582. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_intent_router.py +0 -0
  583. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_intent_signals.py +0 -0
  584. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_kling_video_client.py +0 -0
  585. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_lazy_rebind.py +0 -0
  586. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_legacy_module_imports.py +0 -0
  587. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_license_consistency.py +0 -0
  588. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_licensing.py +0 -0
  589. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_local_image_provider.py +0 -0
  590. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_logistics_3pl.py +0 -0
  591. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_logistics_and_finance_agents.py +0 -0
  592. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_lsp.py +0 -0
  593. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_markdown_pdf.py +0 -0
  594. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_data_client.py +0 -0
  595. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_history_inheritance.py +0 -0
  596. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_history_tool.py +0 -0
  597. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_symbol_extraction.py +0 -0
  598. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_universe.py +0 -0
  599. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_mcp_circuit.py +0 -0
  600. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_mcp_client.py +0 -0
  601. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_model_capability_registry.py +0 -0
  602. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_model_choice_is_the_users.py +0 -0
  603. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_model_selection_state.py +0 -0
  604. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_native_binary_entrypoints.py +0 -0
  605. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_native_installer.py +0 -0
  606. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_new_modules.py +0 -0
  607. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  608. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_no_uncommitted_imports.py +0 -0
  609. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ollama_stream_imports.py +0 -0
  610. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ollama_stream_tools.py +0 -0
  611. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_openai_image_client.py +0 -0
  612. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_operations_suite.py +0 -0
  613. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_output_rendering.py +0 -0
  614. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packages_facade.py +0 -0
  615. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packaging_constraints.py +0 -0
  616. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packaging_manifest.py +0 -0
  617. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packs_domains.py +0 -0
  618. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_pdf_report.py +0 -0
  619. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_pick_best_installed_model.py +0 -0
  620. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_plan_mode.py +0 -0
  621. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_platform_package_assembly.py +0 -0
  622. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_platform_packages.py +0 -0
  623. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_plotly_html_output.py +0 -0
  624. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_portfolio_ledger.py +0 -0
  625. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_post_turn_context_decision.py +0 -0
  626. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_preflight.py +0 -0
  627. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_preview_server.py +0 -0
  628. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_privacy_feedback.py +0 -0
  629. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_project_aria.py +0 -0
  630. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_project_review.py +0 -0
  631. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_project_review_api.py +0 -0
  632. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_prompt_assembly.py +0 -0
  633. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_prompt_selection.py +0 -0
  634. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_autoconfig.py +0 -0
  635. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_error_messages.py +0 -0
  636. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_integration.py +0 -0
  637. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_registry.py +0 -0
  638. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_public_service_status.py +0 -0
  639. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_quant_engine_namespace.py +0 -0
  640. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_rebind_contract.py +0 -0
  641. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_rebind_namespace_contract.py +0 -0
  642. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_relay_event_verification.py +0 -0
  643. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_chain.py +0 -0
  644. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_commit_identity.py +0 -0
  645. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_push_is_atomic.py +0 -0
  646. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_reaches_the_registries.py +0 -0
  647. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_verification_waits.py +0 -0
  648. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_workflow_permissions.py +0 -0
  649. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_report_charts.py +0 -0
  650. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_report_generator.py +0 -0
  651. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_research_protocol.py +0 -0
  652. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_research_quality.py +0 -0
  653. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_responsive_rendering.py +0 -0
  654. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_root_module_budget.py +0 -0
  655. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  656. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_acceptance.py +0 -0
  657. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_agent_loop.py +0 -0
  658. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_approval.py +0 -0
  659. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_bridge.py +0 -0
  660. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_bridge_fallback.py +0 -0
  661. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_checkpoints.py +0 -0
  662. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_gateway.py +0 -0
  663. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_repo_map.py +0 -0
  664. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_run_store.py +0 -0
  665. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_tool_executor.py +0 -0
  666. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_worktrees.py +0 -0
  667. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runway_video_client.py +0 -0
  668. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_safety_permissions.py +0 -0
  669. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_safety_service.py +0 -0
  670. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_safety_service_adoption.py +0 -0
  671. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_service_diagnostics_security.py +0 -0
  672. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_session_search.py +0 -0
  673. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_settings_service.py +0 -0
  674. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_shipper_digest.py +0 -0
  675. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_single_import_root.py +0 -0
  676. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_skill_agent_binding.py +0 -0
  677. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_skill_catalog.py +0 -0
  678. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_skill_loader.py +0 -0
  679. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_spreadsheet_tools.py +0 -0
  680. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_sse_stream_contract.py +0 -0
  681. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_startup_dashboard.py +0 -0
  682. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_startup_latency.py +0 -0
  683. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_streaming_pipeline.py +0 -0
  684. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_stripe_agent.py +0 -0
  685. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_subagent.py +0 -0
  686. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_supervisor_routing.py +0 -0
  687. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_system_prompts.py +0 -0
  688. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_system_tools_output.py +0 -0
  689. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_task_orchestrator.py +0 -0
  690. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_team_synthesis.py +0 -0
  691. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tls_trust_store.py +0 -0
  692. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tool_policy.py +0 -0
  693. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tool_scope.py +0 -0
  694. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_trading_service.py +0 -0
  695. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tradingview_bridge.py +0 -0
  696. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_turn_planning.py +0 -0
  697. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_completer_references.py +0 -0
  698. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_console_theme.py +0 -0
  699. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_input_box.py +0 -0
  700. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_robot_banner.py +0 -0
  701. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_update_health_routes.py +0 -0
  702. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_verification_hint.py +0 -0
  703. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_verification_policy.py +0 -0
  704. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_version_consistency.py +0 -0
  705. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_version_counter.py +0 -0
  706. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_video_analysis.py +0 -0
  707. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_video_editor.py +0 -0
  708. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_vscode_mcp.py +0 -0
  709. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_agents.py +0 -0
  710. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_cli_registration.py +0 -0
  711. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_erp_client.py +0 -0
  712. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_workflow.py +0 -0
  713. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_wheel_is_installable.py +0 -0
  714. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_changes.py +0 -0
  715. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_context.py +0 -0
  716. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_files.py +0 -0
  717. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_scope.py +0 -0
  718. {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_service.py +0 -0
  719. {aria_code-0.69.0 → aria_code-0.71.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.69.0
4
- Summary: AI coding and research workspace with optional finance and connected-domain tools
3
+ Version: 0.71.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.69.0"
8
- description = "AI coding and research workspace with optional finance and connected-domain tools"
7
+ version = "0.71.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.69.0"
20
+ __version__ = "0.71.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:
@@ -38,7 +38,8 @@ WebSocket 注册流程:
38
38
  飞书 Verification Token(次选)——校验事件体里的 token
39
39
  ⚠️ 二者至少配一个,否则 /feishu/event 一律拒绝。
40
40
  仅本地联调可设 RELAY_ALLOW_UNVERIFIED_EVENTS=1 绕过。
41
- RELAY_SECRET WebSocket 注册鉴权(可选,留空则不鉴权)
41
+ RELAY_SECRET 部署级别的注册口令(可选)。每台电脑另有自己的令牌和绑定码,
42
+ 见下方 client_credentials:没有它们,任何人都能冒充或绑定别人的电脑。
42
43
  DB_PATH SQLite 路径(默认 ./relay.db)
43
44
  MESSAGE_TIMEOUT 等待用户本机回复的超时秒数(默认 90)
44
45
  """
@@ -95,6 +96,23 @@ def _db() -> sqlite3.Connection:
95
96
  created_at REAL NOT NULL
96
97
  )
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
+ """)
98
116
  # Chats a client's bound user has spoken to the bot in: the only chats the
99
117
  # client may later send to unprompted (the daily digest).
100
118
  conn.execute("""
@@ -162,6 +180,45 @@ def _is_valid_client_id(client_id: str) -> bool:
162
180
  return row is not None
163
181
 
164
182
 
183
+ def _digest(value: str) -> str:
184
+ return hashlib.sha256(value.encode("utf-8")).hexdigest()
185
+
186
+
187
+ def _normalise_bind_code(code: str) -> str:
188
+ return "".join(ch for ch in code.upper() if ch.isalnum())
189
+
190
+
191
+ def _admit_client(client_id: str, token: str, bind_code: str) -> str:
192
+ """"" when this registration may proceed, otherwise why not."""
193
+ if len(token or "") < 32:
194
+ return "this Aria version is too old for the relay; upgrade aria-code"
195
+ if len(_normalise_bind_code(bind_code or "")) < 10:
196
+ 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)):
205
+ return "client_id is registered to another installation"
206
+ # 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()
210
+ return ""
211
+
212
+
213
+ def _client_for_bind_code(code: str) -> Optional[str]:
214
+ normalised = _normalise_bind_code(code)
215
+ if len(normalised) < 10:
216
+ 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
220
+
221
+
165
222
  # ── WebSocket connection registry ─────────────────────────────────────────────
166
223
 
167
224
  _connections: dict[str, WebSocket] = {} # client_id → WebSocket
@@ -402,11 +459,17 @@ async def ws_endpoint(websocket: WebSocket):
402
459
  await websocket.send_text(json.dumps({"ok": False, "reason": "client_id required"}))
403
460
  return
404
461
 
405
- # Validate RELAY_SECRET if configured
406
- if _RELAY_SECRET and msg.get("secret") != _RELAY_SECRET:
462
+ # Validate RELAY_SECRET if configured (constant-time: it is a secret)
463
+ if _RELAY_SECRET and not hmac.compare_digest(str(msg.get("secret") or ""), _RELAY_SECRET):
407
464
  await websocket.send_text(json.dumps({"ok": False, "reason": "invalid secret"}))
408
465
  return
409
466
 
467
+ refused = _admit_client(client_id, str(msg.get("token") or ""), str(msg.get("bind_code") or ""))
468
+ if refused:
469
+ logger.warning("refused registration for %s: %s", client_id, refused)
470
+ await websocket.send_text(json.dumps({"ok": False, "reason": refused}))
471
+ return
472
+
410
473
  # Register in-memory + mark as pending bind (if first time)
411
474
  _connections[client_id] = websocket
412
475
  if _lookup_client.__module__: # always true; used as noop to be explicit
@@ -561,15 +624,21 @@ async def feishu_event(request: Request):
561
624
  text_content = ""
562
625
 
563
626
  if text_content.upper().startswith("/BIND ") or text_content.upper().startswith("ARIA-BIND-"):
564
- raw_code = text_content.upper().replace("/BIND ", "").strip()
565
- # Normalize: "ARIA-BIND-ARIA-XXXX" → "aria-xxxx"
566
- client_id_upper = raw_code.replace("ARIA-BIND-", "").replace("ARIA-", "aria-").lower()
567
- _bind(feishu_user_id, client_id_upper)
627
+ raw_code = text_content.upper().replace("/BIND ", "").strip().replace("ARIA-BIND-", "")
628
+ # Only the code generated and shown on the machine binds it. The
629
+ # client_id is not accepted any more: it was the bind code, so
630
+ # whoever learned one could route their messages to another
631
+ # person's machine.
632
+ client_id = _client_for_bind_code(raw_code)
633
+ if not client_id:
634
+ await _send_feishu_text(
635
+ feishu_user_id,
636
+ "❌ 绑定码无效。请在你电脑上运行 aria-code 的配置向导,使用它显示的绑定码。")
637
+ return {"code": 0}
638
+ _bind(feishu_user_id, client_id)
568
639
  await _send_feishu_text(
569
640
  feishu_user_id,
570
- f"✅ 绑定成功!你的 Aria 实例已连接。\n"
571
- f"Client ID: {client_id_upper}\n"
572
- f"现在可以直接发消息与你的 Aria 交互了。"
641
+ "✅ 绑定成功!你的 Aria 实例已连接。\n现在可以直接发消息与你的 Aria 交互了。"
573
642
  )
574
643
  return {"code": 0}
575
644
 
@@ -42,6 +42,56 @@ def _load_env() -> None:
42
42
 
43
43
  _load_env()
44
44
 
45
+ # ── This machine's relay credentials ──────────────────────────────────────────
46
+ #
47
+ # The relay records both on first registration (as hashes): the token proves a
48
+ # later connection is this machine, and the bind code is what a Feishu user
49
+ # sends to bind to it. Both stay in ~/.aria/.env. Before 2026-10-04 there were
50
+ # neither: the client_id was the only identity and also the bind code, so
51
+ # anyone who learned it could impersonate the machine or bind their own Feishu
52
+ # account to it.
53
+
54
+ _BIND_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" # nothing to misread: no 0/O, 1/I
55
+
56
+
57
+ def new_token() -> str:
58
+ import secrets
59
+ return secrets.token_urlsafe(32)
60
+
61
+
62
+ def new_bind_code() -> str:
63
+ import secrets
64
+ return "".join(secrets.choice(_BIND_ALPHABET) for _ in range(12))
65
+
66
+
67
+ def format_bind_code(code: str) -> str:
68
+ """ABCDEFGHJKLM → ARIA-BIND-ABCD-EFGH-JKLM, the form a person types."""
69
+ code = "".join(ch for ch in code.upper() if ch.isalnum())
70
+ return "ARIA-BIND-" + "-".join(code[i:i + 4] for i in range(0, len(code), 4))
71
+
72
+
73
+ def ensure_credentials(env_file: Path = Path.home() / ".aria" / ".env") -> tuple[str, str]:
74
+ """This machine's (token, bind code), created and saved on first use."""
75
+ token = os.environ.get("ARIA_RELAY_CLIENT_TOKEN", "").strip()
76
+ code = os.environ.get("ARIA_RELAY_BIND_CODE", "").strip()
77
+ fresh = {}
78
+ if len(token) < 32:
79
+ token = fresh["ARIA_RELAY_CLIENT_TOKEN"] = new_token()
80
+ if len(code) < 10:
81
+ code = fresh["ARIA_RELAY_BIND_CODE"] = new_bind_code()
82
+ if fresh:
83
+ env_file.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
84
+ with env_file.open("a", encoding="utf-8") as handle:
85
+ for key, value in fresh.items():
86
+ handle.write(f"{key}={value}\n")
87
+ env_file.chmod(0o600)
88
+ os.environ.update(fresh)
89
+ if "ARIA_RELAY_BIND_CODE" in fresh:
90
+ logger.info("New relay bind code — send this to the Aria bot in Feishu: /bind %s",
91
+ format_bind_code(code))
92
+ return token, code
93
+
94
+
45
95
  _RELAY_URL = os.environ.get("ARIA_RELAY_URL", "wss://relay.aria.ai")
46
96
  _CLIENT_ID = os.environ.get("ARIA_RELAY_CLIENT_ID", "")
47
97
  _RECONNECT_DELAY_MAX = 60 # seconds
@@ -91,6 +141,14 @@ async def _handle_message(raw_msg: dict, ws) -> None:
91
141
  await ws.send(reply)
92
142
 
93
143
 
144
+ def register_frame(client_id: str, token: str, bind_code: str) -> dict:
145
+ frame = {"type": "register", "client_id": client_id, "token": token, "bind_code": bind_code}
146
+ secret = os.environ.get("ARIA_RELAY_SECRET", "").strip()
147
+ if secret:
148
+ frame["secret"] = secret # the deployment-wide gate, when the relay sets one
149
+ return frame
150
+
151
+
94
152
  # ── Sending through the relay ─────────────────────────────────────────────────
95
153
  #
96
154
  # This machine has no Feishu app credentials in relay mode, so the bot hands
@@ -151,14 +209,15 @@ async def _connect_and_serve(once: bool = False) -> None:
151
209
  open_timeout=15,
152
210
  ) as ws:
153
211
  # Register with server
154
- await ws.send(json.dumps({
155
- "type": "register",
156
- "client_id": _CLIENT_ID,
157
- }))
212
+ token, bind_code = ensure_credentials()
213
+ await ws.send(json.dumps(register_frame(_CLIENT_ID, token, bind_code)))
158
214
  ack_raw = await asyncio.wait_for(ws.recv(), timeout=10)
159
215
  ack = json.loads(ack_raw)
160
216
  if not ack.get("ok"):
161
217
  logger.error("Registration rejected: %s", ack.get("reason", "unknown"))
218
+ if "another installation" in str(ack.get("reason", "")):
219
+ logger.error("This client_id belongs to a different machine on the relay. "
220
+ "Run the setup wizard to create a new one.")
162
221
  await asyncio.sleep(delay)
163
222
  continue
164
223
 
@@ -376,26 +376,34 @@ def _setup_feishu_relay(env: dict[str, str]) -> None:
376
376
  env["ARIA_RELAY_URL"] = relay_url
377
377
  env["ARIA_RELAY_MODE"] = "relay"
378
378
 
379
- # Generate or reuse client_id
379
+ # Generate or reuse client_id, plus this machine's token and bind code. The
380
+ # bind code — not the client_id — is what a Feishu user sends to bind:
381
+ # only someone who can see this screen has it.
382
+ from aria_code.clients.aria_relay_client import format_bind_code, new_bind_code, new_token
380
383
  client_id = env.get("ARIA_RELAY_CLIENT_ID") or f"aria-{uuid.uuid4().hex[:12]}"
381
384
  env["ARIA_RELAY_CLIENT_ID"] = client_id
385
+ if len(env.get("ARIA_RELAY_CLIENT_TOKEN", "")) < 32:
386
+ env["ARIA_RELAY_CLIENT_TOKEN"] = new_token()
387
+ if len(env.get("ARIA_RELAY_BIND_CODE", "")) < 10:
388
+ env["ARIA_RELAY_BIND_CODE"] = new_bind_code()
389
+ bind_code = format_bind_code(env["ARIA_RELAY_BIND_CODE"])
382
390
 
383
391
  if _rich:
384
392
  console.print(Panel(
385
393
  f"[bold]你的绑定码:[/bold]\n\n"
386
- f"[bold yellow on black] ARIA-BIND-{client_id.upper()} [/bold yellow on black]\n\n"
394
+ f"[bold yellow on black] {bind_code} [/bold yellow on black]\n\n"
387
395
  f"[dim]操作步骤:[/dim]\n"
388
396
  f"1. 在飞书搜索 [cyan]Aria Bot[/cyan] 并添加好友\n"
389
- f"2. 发送:[cyan]/bind ARIA-BIND-{client_id.upper()}[/cyan]\n"
397
+ f"2. 发送:[cyan]/bind {bind_code}[/cyan]\n"
390
398
  f"3. 收到 [green]\"绑定成功\"[/green] 后,飞书消息将转发到你的 Aria\n\n"
391
399
  f"[dim](中继客户端会在 daemon 启动时自动连接)[/dim]",
392
400
  title="📱 飞书绑定步骤",
393
401
  border_style="yellow",
394
402
  ))
395
403
  else:
396
- print(f"\n你的绑定码: ARIA-BIND-{client_id.upper()}")
404
+ print(f"\n你的绑定码: {bind_code} (只发给你自己的飞书账号里的 Aria,不要给别人)")
397
405
  print("1. 在飞书搜索 Aria Bot 并添加好友")
398
- print(f"2. 发送: /bind ARIA-BIND-{client_id.upper()}")
406
+ print(f"2. 发送: /bind {bind_code}")
399
407
  print("3. 收到绑定成功后继续\n")
400
408
 
401
409
  if _confirm("是否已完成绑定?(可以稍后运行向导再完成)", default=False):
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 0.69.0
4
- Summary: AI coding and research workspace with optional finance and connected-domain tools
3
+ Version: 0.71.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
 
@@ -635,6 +635,7 @@ tests/test_public_service_status.py
635
635
  tests/test_quant_engine_namespace.py
636
636
  tests/test_rebind_contract.py
637
637
  tests/test_rebind_namespace_contract.py
638
+ tests/test_relay_client_credentials.py
638
639
  tests/test_relay_event_verification.py
639
640
  tests/test_relay_sends_for_clients.py
640
641
  tests/test_release_chain.py
@@ -0,0 +1,161 @@
1
+ """Knowing a client_id must not let anyone impersonate or bind that machine.
2
+
3
+ Before 2026-10-04 the client_id was a relay client's only identity and also
4
+ its bind code. Two consequences, both closed here:
5
+
6
+ 1. Registering with someone's client_id replaced their connection, and their
7
+ Feishu messages went to the newcomer.
8
+ 2. Sending "/bind ARIA-BIND-<their client_id>" from your own, properly signed
9
+ Feishu account bound you to their machine, so your messages ran there —
10
+ on their model quota, against their local data.
11
+
12
+ Now each machine registers a token (trust on first use) and a bind code it
13
+ generated and shows only on its own screen; the relay stores hashes of both.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import importlib
19
+ import json
20
+ import os
21
+ from unittest import mock
22
+
23
+ import pytest
24
+
25
+ if os.environ.get("GITHUB_ACTIONS"):
26
+ import fastapi # noqa: F401 — CI must run these, not skip them
27
+
28
+ fastapi_testclient = pytest.importorskip("fastapi.testclient", reason="relay server dependency")
29
+ TestClient = fastapi_testclient.TestClient
30
+
31
+ TOKEN_A, TOKEN_B = "a" * 43, "b" * 43
32
+ CODE_A, CODE_B = "ABCDEFGHJKLM", "NPQRSTUVWXYZ"
33
+
34
+
35
+ @pytest.fixture
36
+ def relay(monkeypatch, tmp_path):
37
+ monkeypatch.setenv("DB_PATH", str(tmp_path / "relay.db"))
38
+ for key in ("FEISHU_ENCRYPT_KEY", "RELAY_ALLOW_UNVERIFIED_EVENTS", "RELAY_SECRET"):
39
+ monkeypatch.delenv(key, raising=False)
40
+ monkeypatch.setenv("FEISHU_VERIFICATION_TOKEN", "tok")
41
+ import aria_relay_server
42
+ return importlib.reload(aria_relay_server)
43
+
44
+
45
+ def _register(relay, client_id="aria-victim", token=TOKEN_A, code=CODE_A, **extra):
46
+ with TestClient(relay.app).websocket_connect("/ws") as ws:
47
+ ws.send_text(json.dumps({"type": "register", "client_id": client_id,
48
+ "token": token, "bind_code": code, **extra}))
49
+ return json.loads(ws.receive_text())
50
+
51
+
52
+ class TestRegistration:
53
+ def test_the_first_registration_is_accepted(self, relay):
54
+ assert _register(relay)["ok"]
55
+
56
+ def test_only_hashes_are_stored(self, relay):
57
+ _register(relay)
58
+ row = relay.get_db().execute("SELECT * FROM client_credentials").fetchone()
59
+ assert TOKEN_A not in tuple(row) and CODE_A not in tuple(row)
60
+
61
+ def test_the_same_machine_reconnects(self, relay):
62
+ _register(relay)
63
+ assert _register(relay)["ok"]
64
+
65
+ def test_someone_else_with_the_client_id_is_refused(self, relay):
66
+ _register(relay)
67
+ answer = _register(relay, token=TOKEN_B)
68
+ assert not answer["ok"] and "another installation" in answer["reason"]
69
+
70
+ def test_a_client_without_credentials_is_told_to_upgrade(self, relay):
71
+ with TestClient(relay.app).websocket_connect("/ws") as ws:
72
+ ws.send_text(json.dumps({"type": "register", "client_id": "aria-old"}))
73
+ answer = json.loads(ws.receive_text())
74
+ assert not answer["ok"] and "upgrade" in answer["reason"]
75
+
76
+ def test_the_deployment_secret_still_gates_registration(self, relay, monkeypatch):
77
+ monkeypatch.setattr(relay, "_RELAY_SECRET", "s3cret")
78
+ assert not _register(relay, secret="wrong")["ok"]
79
+ assert _register(relay, client_id="aria-other", secret="s3cret")["ok"]
80
+
81
+
82
+ def _bind_event(open_id, text):
83
+ return {"token": "tok", "header": {"event_type": "im.message.receive_v1"}, "event": {
84
+ "sender": {"sender_id": {"open_id": open_id}},
85
+ "message": {"message_id": "om_1", "chat_id": "oc_dm", "message_type": "text",
86
+ "content": json.dumps({"text": text})}}}
87
+
88
+
89
+ class TestBinding:
90
+ def _post(self, relay, open_id, text):
91
+ sent = []
92
+
93
+ async def send_text(to, text):
94
+ sent.append(text)
95
+
96
+ with mock.patch.object(relay, "_send_feishu_text", send_text):
97
+ TestClient(relay.app).post("/feishu/event", json=_bind_event(open_id, text))
98
+ return sent
99
+
100
+ def test_the_machines_own_code_binds_it(self, relay):
101
+ _register(relay)
102
+ replies = self._post(relay, "ou_owner", "/bind ARIA-BIND-ABCD-EFGH-JKLM")
103
+ assert "绑定成功" in replies[0]
104
+ assert relay._lookup_client("ou_owner") == "aria-victim"
105
+
106
+ def test_the_client_id_no_longer_binds(self, relay):
107
+ _register(relay)
108
+ replies = self._post(relay, "ou_attacker", "/bind ARIA-BIND-ARIA-VICTIM")
109
+ assert "无效" in replies[0]
110
+ assert relay._lookup_client("ou_attacker") is None
111
+
112
+ def test_a_guessed_code_does_not_bind(self, relay):
113
+ _register(relay)
114
+ self._post(relay, "ou_attacker", f"/bind ARIA-BIND-{CODE_B}")
115
+ assert relay._lookup_client("ou_attacker") is None
116
+
117
+ def test_a_rotated_code_replaces_the_old_one(self, relay):
118
+ _register(relay)
119
+ _register(relay, code=CODE_B)
120
+ self._post(relay, "ou_x", f"/bind {CODE_A}")
121
+ assert relay._lookup_client("ou_x") is None
122
+ self._post(relay, "ou_owner", f"/bind {CODE_B}")
123
+ assert relay._lookup_client("ou_owner") == "aria-victim"
124
+
125
+ def test_a_rotation_needs_the_token(self, relay):
126
+ _register(relay)
127
+ _register(relay, token=TOKEN_B, code=CODE_B) # refused, so nothing changes
128
+ self._post(relay, "ou_attacker", f"/bind {CODE_B}")
129
+ assert relay._lookup_client("ou_attacker") is None
130
+
131
+
132
+ # ── The client side ──────────────────────────────────────────────────────────
133
+
134
+ from aria_code.clients import aria_relay_client as client # noqa: E402
135
+
136
+
137
+ class TestClientCredentials:
138
+ def test_created_once_saved_privately_and_reused(self, tmp_path, monkeypatch):
139
+ # setenv (not delenv) so monkeypatch restores whatever
140
+ # ensure_credentials writes into os.environ.
141
+ monkeypatch.setenv("ARIA_RELAY_CLIENT_TOKEN", "")
142
+ monkeypatch.setenv("ARIA_RELAY_BIND_CODE", "")
143
+ env_file = tmp_path / ".aria" / ".env"
144
+ first = client.ensure_credentials(env_file)
145
+ assert oct(env_file.stat().st_mode & 0o777) == "0o600"
146
+ assert len(first[0]) >= 32 and len(first[1]) == 12
147
+ assert client.ensure_credentials(env_file) == first
148
+ assert env_file.read_text().count("ARIA_RELAY_CLIENT_TOKEN=") == 1
149
+
150
+ def test_bind_codes_avoid_characters_people_misread(self):
151
+ codes = "".join(client.new_bind_code() for _ in range(200))
152
+ assert not set(codes) & set("0O1I")
153
+
154
+ def test_the_bind_code_is_typed_in_groups(self):
155
+ assert client.format_bind_code("abcdefghjklm") == "ARIA-BIND-ABCD-EFGH-JKLM"
156
+
157
+ def test_the_register_frame_carries_the_credentials(self, monkeypatch):
158
+ monkeypatch.setenv("ARIA_RELAY_SECRET", "s3cret")
159
+ frame = client.register_frame("aria-a", TOKEN_A, CODE_A)
160
+ assert frame == {"type": "register", "client_id": "aria-a", "token": TOKEN_A,
161
+ "bind_code": CODE_A, "secret": "s3cret"}
@@ -184,7 +184,8 @@ class TestCardPresses:
184
184
  class TestOverTheWebSocket:
185
185
  def test_a_refused_send_comes_back_as_a_send_result(self, relay):
186
186
  with TestClient(relay.app).websocket_connect("/ws") as ws:
187
- ws.send_text(json.dumps({"type": "register", "client_id": "aria-a"}))
187
+ ws.send_text(json.dumps({"type": "register", "client_id": "aria-a",
188
+ "token": "t" * 43, "bind_code": "ABCDEFGHJKLM"}))
188
189
  assert json.loads(ws.receive_text())["ok"]
189
190
  ws.send_text(json.dumps({"type": "send", "id": "s1", **_send("oc_not_mine")}))
190
191
  answer = json.loads(ws.receive_text())
File without changes
File without changes
File without changes