aria-code 0.76.0__tar.gz → 0.78.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 (736) hide show
  1. {aria_code-0.76.0 → aria_code-0.78.0}/PKG-INFO +36 -10
  2. aria_code-0.78.0/README.md +126 -0
  3. {aria_code-0.76.0 → aria_code-0.78.0}/pyproject.toml +2 -2
  4. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/_version.py +1 -1
  5. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/bootstrap.py +28 -1
  6. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/auth_cmds.py +1 -1
  7. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +14 -5
  8. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +5 -5
  9. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/core_cmds.py +32 -24
  10. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/data_cmds.py +1 -1
  11. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +1 -1
  12. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +71 -78
  13. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +1 -1
  14. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/i18n.py +3 -1
  15. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/intent_router.py +28 -2
  16. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/main.py +7 -0
  17. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prompt_assembly.py +20 -1
  18. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/base.py +110 -12
  19. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/chat_routing.py +12 -0
  20. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +3 -2
  21. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +1 -1
  22. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +5 -7
  23. aria_code-0.78.0/src/aria_code/apps/cli/review_runner.py +111 -0
  24. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/runtime_consumer.py +2 -1
  25. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tool_executor.py +23 -14
  26. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/write_tools.py +54 -10
  27. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/update_check.py +20 -9
  28. aria_code-0.78.0/src/aria_code/apps/cli/updater.py +188 -0
  29. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_cli.py +20 -4
  30. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/aliyun_data_client.py +1 -1
  31. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/domain/strategy_vault.py +1 -1
  32. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/intent_classifier.py +1 -1
  33. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_sdk/client.py +7 -14
  34. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_sdk/streaming.py +7 -15
  35. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/research_protocol.py +30 -4
  36. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/anthropic.py +1 -1
  37. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/ollama.py +1 -1
  38. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/openai_compat.py +1 -1
  39. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/local_llm_provider.py +62 -8
  40. aria_code-0.78.0/src/aria_code/providers/tool_messages.py +100 -0
  41. aria_code-0.78.0/src/aria_code/review_service.py +497 -0
  42. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/safety/permissions.py +7 -0
  43. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/banner.py +61 -151
  44. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/render/market.py +41 -21
  45. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/robot.py +61 -54
  46. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/startup_dashboard.py +2 -1
  47. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code.egg-info/PKG-INFO +36 -10
  48. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code.egg-info/SOURCES.txt +12 -0
  49. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_aria_cli_core.py +18 -1
  50. aria_code-0.78.0/tests/test_cli_updater.py +133 -0
  51. aria_code-0.78.0/tests/test_event_import_roots.py +34 -0
  52. aria_code-0.78.0/tests/test_google_cloud_models.py +136 -0
  53. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_intent_router.py +23 -0
  54. aria_code-0.78.0/tests/test_market_questions_on_backend.py +67 -0
  55. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_release_chain.py +3 -3
  56. aria_code-0.78.0/tests/test_review_service.py +236 -0
  57. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_bridge_fallback.py +2 -2
  58. aria_code-0.78.0/tests/test_runtime_event_identity.py +31 -0
  59. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_startup_dashboard.py +36 -37
  60. aria_code-0.78.0/tests/test_tool_rounds_on_openai_apis.py +140 -0
  61. aria_code-0.78.0/tests/test_ui_language_and_model.py +76 -0
  62. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ui_robot_banner.py +26 -33
  63. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_update_health_routes.py +2 -2
  64. aria_code-0.76.0/README.md +0 -100
  65. {aria_code-0.76.0 → aria_code-0.78.0}/LICENSE +0 -0
  66. {aria_code-0.76.0 → aria_code-0.78.0}/NOTICE +0 -0
  67. {aria_code-0.76.0 → aria_code-0.78.0}/setup.cfg +0 -0
  68. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/__init__.py +0 -0
  69. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/adk_apps/__init__.py +0 -0
  70. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  71. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  72. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  73. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  74. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/__init__.py +0 -0
  75. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/base.py +0 -0
  76. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/code_review.py +0 -0
  77. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/__init__.py +0 -0
  78. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  79. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/critic.py +0 -0
  80. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/deepen.py +0 -0
  81. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/models.py +0 -0
  82. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  83. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  84. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/themes.py +0 -0
  85. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/deep/tiers.py +0 -0
  86. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  87. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/engineering/coder.py +0 -0
  88. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/engineering/tester.py +0 -0
  89. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/__init__.py +0 -0
  90. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  91. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  92. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  93. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/debate.py +0 -0
  94. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/earnings.py +0 -0
  95. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  96. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/macro.py +0 -0
  97. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/news.py +0 -0
  98. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/risk.py +0 -0
  99. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/sector.py +0 -0
  100. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/strategist.py +0 -0
  101. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  102. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  103. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/financial/technical.py +0 -0
  104. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/orchestrator.py +0 -0
  105. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  106. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/__init__.py +0 -0
  107. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  108. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/business_match.py +0 -0
  109. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  110. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  111. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  112. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  113. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  114. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  115. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  116. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/registry.py +0 -0
  117. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/signal_scheme.py +0 -0
  118. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/sports/__init__.py +0 -0
  119. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  120. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/supervisor.py +0 -0
  121. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/team.py +0 -0
  122. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  123. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  124. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  125. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  126. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  127. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  128. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  129. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  130. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  131. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  132. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  133. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aliyun_data_client.py +0 -0
  134. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/README.md +0 -0
  135. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/__init__.py +0 -0
  136. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/README.md +0 -0
  137. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/__init__.py +0 -0
  138. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/approvals.py +0 -0
  139. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/conversation.py +0 -0
  140. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/digest.py +0 -0
  141. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/intake.py +0 -0
  142. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/registry.py +0 -0
  143. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  144. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/README.md +0 -0
  145. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/__init__.py +0 -0
  146. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/_optional.py +0 -0
  147. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  148. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  149. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  150. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  151. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  152. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  153. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  154. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  155. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  156. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  157. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  158. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  159. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  160. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  161. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  162. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  163. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  164. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  165. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  166. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  167. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  168. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  169. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
  170. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  171. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  172. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  173. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  174. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  175. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  176. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  177. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  178. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  179. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  180. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/config_store.py +0 -0
  181. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/constants.py +0 -0
  182. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/context.py +0 -0
  183. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  184. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/direct.py +0 -0
  185. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  186. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  187. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  188. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/google_login.py +0 -0
  189. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  190. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  191. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
  192. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  193. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  194. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  195. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/helpers.py +0 -0
  196. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/hooks.py +0 -0
  197. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/intent.py +0 -0
  198. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  199. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  200. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  201. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  202. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  203. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  204. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  205. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  206. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  207. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  208. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  209. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/preflight.py +0 -0
  210. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  211. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  212. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  213. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  214. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
  215. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  216. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  217. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  218. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  219. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  220. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  221. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  222. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  223. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  224. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  225. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/session_export.py +0 -0
  226. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  227. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/session_store.py +0 -0
  228. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  229. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  230. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  231. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  232. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  233. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  234. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  235. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  236. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  237. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  238. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  239. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  240. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  241. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  242. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/daemon/README.md +0 -0
  243. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/vscode/README.md +0 -0
  244. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/apps/vscode/package.json +0 -0
  245. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_daemon.py +0 -0
  246. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_feishu_bot.py +0 -0
  247. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_mcp_server.py +0 -0
  248. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_relay_client.py +0 -0
  249. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_relay_server.py +0 -0
  250. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/aria_telegram_bot.py +0 -0
  251. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ariarc.py +0 -0
  252. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/artifacts.py +0 -0
  253. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/backtest_engine.py +0 -0
  254. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/backtest_report.py +0 -0
  255. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/__init__.py +0 -0
  256. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/automation.py +0 -0
  257. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/base.py +0 -0
  258. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/capabilities.py +0 -0
  259. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  260. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  261. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  262. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  263. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  264. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  265. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/config.py +0 -0
  266. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  267. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  268. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  269. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  270. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  271. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/paper_broker.py +0 -0
  272. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/planning.py +0 -0
  273. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/registry.py +0 -0
  274. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/brokers/trading.py +0 -0
  275. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/canva_client.py +0 -0
  276. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/change_store.py +0 -0
  277. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/__init__.py +0 -0
  278. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  279. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/canva_client.py +0 -0
  280. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/figma_client.py +0 -0
  281. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/football_data_client.py +0 -0
  282. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/kling_video_client.py +0 -0
  283. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/market_data_client.py +0 -0
  284. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/openai_image_client.py +0 -0
  285. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/runway_video_client.py +0 -0
  286. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  287. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/cloud_memory.py +0 -0
  288. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/command_safety.py +0 -0
  289. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/computer_use_tools.py +0 -0
  290. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/dashboard_generator.py +0 -0
  291. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/data_analysis_tools.py +0 -0
  292. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/data_cleaner.py +0 -0
  293. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/data_service.py +0 -0
  294. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/__init__.py +0 -0
  295. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/base.py +0 -0
  296. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/router.py +0 -0
  297. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  298. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  299. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  300. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  301. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  302. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  303. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  304. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  305. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  306. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  307. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/demo_player.py +0 -0
  308. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/doctor.py +0 -0
  309. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/domain/__init__.py +0 -0
  310. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/domain/backtest_engine.py +0 -0
  311. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/domain/backtest_report.py +0 -0
  312. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/domain/finance_formulas.py +0 -0
  313. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  314. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/evals/__init__.py +0 -0
  315. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/evals/harness.py +0 -0
  316. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/evals/runner.py +0 -0
  317. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/external_agent_runner.py +0 -0
  318. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/figma_client.py +0 -0
  319. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/file_analysis_tools.py +0 -0
  320. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/finance_formulas.py +0 -0
  321. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/football_data_client.py +0 -0
  322. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/image_gen_tools.py +0 -0
  323. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/kling_video_client.py +0 -0
  324. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/licensing.py +0 -0
  325. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/local_finance_tools.py +0 -0
  326. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/local_image_provider.py +0 -0
  327. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/local_llm_provider.py +0 -0
  328. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/macro_tools.py +0 -0
  329. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/markdown_pdf.py +0 -0
  330. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/market_data_client.py +0 -0
  331. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/mcp_client.py +0 -0
  332. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/memory_manager.py +0 -0
  333. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/model_capability.py +0 -0
  334. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/notification_tools.py +0 -0
  335. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/openai_image_client.py +0 -0
  336. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/__init__.py +0 -0
  337. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  338. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  339. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  340. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  341. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  342. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  343. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  344. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_core/export.py +0 -0
  345. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  346. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  347. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  348. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  349. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  350. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  351. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  352. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  353. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  354. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  355. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  356. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  357. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  358. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  359. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  360. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  361. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  362. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  363. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  364. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/context.py +0 -0
  365. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  366. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/data.py +0 -0
  367. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  368. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/references.py +0 -0
  369. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  370. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  371. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  372. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  373. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  374. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  375. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  376. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  377. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  378. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  379. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  380. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  381. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  382. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  383. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  384. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  385. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  386. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  387. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  388. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  389. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  390. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  391. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  392. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  393. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  394. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  395. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  396. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  397. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  398. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  399. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  400. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  401. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  402. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  403. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  404. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  405. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  406. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  407. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  408. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/__init__.py +0 -0
  409. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/base.py +0 -0
  410. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/finance/__init__.py +0 -0
  411. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  412. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/payments/__init__.py +0 -0
  413. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/realty/__init__.py +0 -0
  414. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/registry.py +0 -0
  415. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/packs/rules.py +0 -0
  416. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/plan_utils.py +0 -0
  417. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/plugin_loader.py +0 -0
  418. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/portfolio_ledger.py +0 -0
  419. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/preview_server.py +0 -0
  420. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/privacy/__init__.py +0 -0
  421. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/privacy/feedback.py +0 -0
  422. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/project_review.py +0 -0
  423. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/project_review_api.py +0 -0
  424. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/project_review_server.py +0 -0
  425. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/project_tools.py +0 -0
  426. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/__init__.py +0 -0
  427. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/__init__.py +0 -0
  428. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  429. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/base.py +0 -0
  430. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/custom.py +0 -0
  431. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/llm/registry.py +0 -0
  432. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/providers/local_image_provider.py +0 -0
  433. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/realty_data_tools.py +0 -0
  434. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/relay_store.py +0 -0
  435. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/report_exporters.py +0 -0
  436. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/report_generator.py +0 -0
  437. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/__init__.py +0 -0
  438. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/acceptance.py +0 -0
  439. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/agent_loop.py +0 -0
  440. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/approval.py +0 -0
  441. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/budget.py +0 -0
  442. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/checkpoints.py +0 -0
  443. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/crash_report.py +0 -0
  444. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/events.py +0 -0
  445. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/gateway.py +0 -0
  446. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/lsp.py +0 -0
  447. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/orchestrator.py +0 -0
  448. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/repo_map.py +0 -0
  449. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/run_state.py +0 -0
  450. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/run_store.py +0 -0
  451. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/self_healing.py +0 -0
  452. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/subagent.py +0 -0
  453. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/task_ledger.py +0 -0
  454. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  455. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/tool_executor.py +0 -0
  456. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/tool_policy.py +0 -0
  457. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runtime/worktrees.py +0 -0
  458. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/runway_video_client.py +0 -0
  459. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/safety/__init__.py +0 -0
  460. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/safety/service.py +0 -0
  461. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/setup_wizard.py +0 -0
  462. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/spreadsheet_tools.py +0 -0
  463. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/strategy_vault.py +0 -0
  464. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/__init__.py +0 -0
  465. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/artifact_tools.py +0 -0
  466. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/broker_tools.py +0 -0
  467. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  468. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  469. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  470. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  471. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  472. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/extended_tools.py +0 -0
  473. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  474. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  475. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  476. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  477. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  478. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/logistics_io.py +0 -0
  479. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  480. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/logistics_tools.py +0 -0
  481. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/macro_tools.py +0 -0
  482. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/notification_tools.py +0 -0
  483. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/project_tools.py +0 -0
  484. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  485. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  486. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/tools/stripe_tools.py +0 -0
  487. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/__init__.py +0 -0
  488. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/completer.py +0 -0
  489. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/console.py +0 -0
  490. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/image_render.py +0 -0
  491. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/input_box.py +0 -0
  492. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/picker.py +0 -0
  493. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/render/__init__.py +0 -0
  494. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/render/finance.py +0 -0
  495. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/render/output.py +0 -0
  496. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/render/responsive.py +0 -0
  497. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/ui/render/team.py +0 -0
  498. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/utils/vscode_uri.py +0 -0
  499. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/video_analysis.py +0 -0
  500. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/video_editor.py +0 -0
  501. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace/__init__.py +0 -0
  502. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace/files.py +0 -0
  503. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace/verify.py +0 -0
  504. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace_changes.py +0 -0
  505. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace_context.py +0 -0
  506. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace_service.py +0 -0
  507. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code/workspace_tools.py +0 -0
  508. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  509. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  510. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code.egg-info/requires.txt +0 -0
  511. {aria_code-0.76.0 → aria_code-0.78.0}/src/aria_code.egg-info/top_level.txt +0 -0
  512. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_adk_market_tools.py +0 -0
  513. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_agent_team_fallback.py +0 -0
  514. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_analyze_file_tool.py +0 -0
  515. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_architecture_ledger_is_true.py +0 -0
  516. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_architecture_report.py +0 -0
  517. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_aria_mcp_server.py +0 -0
  518. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_aria_sdk.py +0 -0
  519. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_artifact_publishing.py +0 -0
  520. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_artifacts_and_reports.py +0 -0
  521. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ashare_prediction_cmds.py +0 -0
  522. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_backtest_cmds.py +0 -0
  523. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_backtest_engine.py +0 -0
  524. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_backtest_report.py +0 -0
  525. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  526. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_broken_akshare_is_optional.py +0 -0
  527. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_broker_automation.py +0 -0
  528. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  529. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_broker_planning.py +0 -0
  530. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_broker_safety.py +0 -0
  531. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_broker_tools.py +0 -0
  532. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_budget.py +0 -0
  533. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_business_workflow_cmds.py +0 -0
  534. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_canva_client.py +0 -0
  535. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_canvas_cmds.py +0 -0
  536. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_card_approvals.py +0 -0
  537. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_channel_intake.py +0 -0
  538. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_channels.py +0 -0
  539. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_chart_handlers.py +0 -0
  540. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_chat_bots_fail_closed.py +0 -0
  541. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_chat_routing.py +0 -0
  542. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ci_security_workflow.py +0 -0
  543. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cli_app_split.py +0 -0
  544. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cli_bootstrap.py +0 -0
  545. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cli_config_store.py +0 -0
  546. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  547. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cli_runtime_consumer.py +0 -0
  548. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cli_tool_executor_module.py +0 -0
  549. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_cloud_memory.py +0 -0
  550. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_code_audit_tools.py +0 -0
  551. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_code_review_agent.py +0 -0
  552. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_codegen_output.py +0 -0
  553. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_coder_tester_self_healing.py +0 -0
  554. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_coder_tool_safety.py +0 -0
  555. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_collaboration.py +0 -0
  556. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_command_loggers.py +0 -0
  557. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_command_safety.py +0 -0
  558. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_completions_builder.py +0 -0
  559. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_config_paths.py +0 -0
  560. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_configured_provider.py +0 -0
  561. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_container_entrypoint.py +0 -0
  562. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_container_entrypoints.py +0 -0
  563. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_context_checkpoints.py +0 -0
  564. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_context_references.py +0 -0
  565. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_context_service.py +0 -0
  566. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_conversation_core.py +0 -0
  567. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_crash_report.py +0 -0
  568. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_credential_file_permissions.py +0 -0
  569. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_custom_providers.py +0 -0
  570. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_daemon_gateway_config.py +0 -0
  571. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_dashboard_generator.py +0 -0
  572. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_data_service.py +0 -0
  573. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_data_service_imports.py +0 -0
  574. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_datasource_routing.py +0 -0
  575. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_deep_analysis.py +0 -0
  576. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_degrades_without_quant_engine.py +0 -0
  577. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  578. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_doctor.py +0 -0
  579. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  580. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_doctor_npm_scope.py +0 -0
  581. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_engine_boundary.py +0 -0
  582. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_enterprise_tool_honesty.py +0 -0
  583. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_env_switch_docs.py +0 -0
  584. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_evals_harness.py +0 -0
  585. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_extended_tools.py +0 -0
  586. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_feishu_swarm_config.py +0 -0
  587. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_finalize_release.py +0 -0
  588. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_finance_renderers.py +0 -0
  589. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_finance_service_catalog.py +0 -0
  590. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_first_run_works.py +0 -0
  591. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_football_agent.py +0 -0
  592. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_football_prediction_output.py +0 -0
  593. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_google_cloud_routing.py +0 -0
  594. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_google_login.py +0 -0
  595. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_google_search_provider.py +0 -0
  596. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_headless_is_agentic.py +0 -0
  597. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_honest_surfaces.py +0 -0
  598. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_image_gen_tools.py +0 -0
  599. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_image_inputs.py +0 -0
  600. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_import_graph_budget.py +0 -0
  601. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_intent_signals.py +0 -0
  602. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_kling_video_client.py +0 -0
  603. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_lazy_rebind.py +0 -0
  604. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_legacy_module_imports.py +0 -0
  605. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_license_consistency.py +0 -0
  606. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_licensing.py +0 -0
  607. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_local_image_provider.py +0 -0
  608. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_logistics_3pl.py +0 -0
  609. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_logistics_and_finance_agents.py +0 -0
  610. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_lsp.py +0 -0
  611. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_markdown_pdf.py +0 -0
  612. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_market_data_client.py +0 -0
  613. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_market_history_inheritance.py +0 -0
  614. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_market_history_tool.py +0 -0
  615. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_market_symbol_extraction.py +0 -0
  616. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_market_universe.py +0 -0
  617. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_mcp_circuit.py +0 -0
  618. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_mcp_client.py +0 -0
  619. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_model_capability_registry.py +0 -0
  620. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_model_choice_is_the_users.py +0 -0
  621. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_model_selection_state.py +0 -0
  622. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_native_binary_entrypoints.py +0 -0
  623. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_native_installer.py +0 -0
  624. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_new_modules.py +0 -0
  625. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  626. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_no_uncommitted_imports.py +0 -0
  627. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ollama_stream_imports.py +0 -0
  628. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ollama_stream_tools.py +0 -0
  629. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_openai_image_client.py +0 -0
  630. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_operations_suite.py +0 -0
  631. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_output_rendering.py +0 -0
  632. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_packages_facade.py +0 -0
  633. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_packaging_constraints.py +0 -0
  634. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_packaging_manifest.py +0 -0
  635. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_packs_domains.py +0 -0
  636. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_pdf_report.py +0 -0
  637. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_pick_best_installed_model.py +0 -0
  638. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_plan_mode.py +0 -0
  639. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_platform_package_assembly.py +0 -0
  640. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_platform_packages.py +0 -0
  641. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_plotly_html_output.py +0 -0
  642. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_portfolio_ledger.py +0 -0
  643. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_post_turn_context_decision.py +0 -0
  644. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_preflight.py +0 -0
  645. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_preview_server.py +0 -0
  646. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_privacy_feedback.py +0 -0
  647. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_project_aria.py +0 -0
  648. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_project_review.py +0 -0
  649. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_project_review_api.py +0 -0
  650. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_prompt_assembly.py +0 -0
  651. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_prompt_selection.py +0 -0
  652. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_provider_autoconfig.py +0 -0
  653. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_provider_error_messages.py +0 -0
  654. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_provider_integration.py +0 -0
  655. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_provider_registry.py +0 -0
  656. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_public_service_status.py +0 -0
  657. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_quant_engine_namespace.py +0 -0
  658. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_rebind_contract.py +0 -0
  659. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_rebind_namespace_contract.py +0 -0
  660. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_relay_client_credentials.py +0 -0
  661. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_relay_event_verification.py +0 -0
  662. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_relay_sends_for_clients.py +0 -0
  663. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_relay_store.py +0 -0
  664. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_relay_url.py +0 -0
  665. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_release_commit_identity.py +0 -0
  666. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_release_push_is_atomic.py +0 -0
  667. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_release_reaches_the_registries.py +0 -0
  668. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_release_verification_waits.py +0 -0
  669. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_release_workflow_permissions.py +0 -0
  670. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_report_charts.py +0 -0
  671. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_report_generator.py +0 -0
  672. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_research_protocol.py +0 -0
  673. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_research_quality.py +0 -0
  674. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_responsive_rendering.py +0 -0
  675. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_root_module_budget.py +0 -0
  676. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  677. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_acceptance.py +0 -0
  678. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_agent_loop.py +0 -0
  679. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_approval.py +0 -0
  680. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_bridge.py +0 -0
  681. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_checkpoints.py +0 -0
  682. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_gateway.py +0 -0
  683. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_repo_map.py +0 -0
  684. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_run_store.py +0 -0
  685. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_tool_executor.py +0 -0
  686. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runtime_worktrees.py +0 -0
  687. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_runway_video_client.py +0 -0
  688. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_safety_permissions.py +0 -0
  689. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_safety_service.py +0 -0
  690. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_safety_service_adoption.py +0 -0
  691. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_service_diagnostics_security.py +0 -0
  692. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_session_search.py +0 -0
  693. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_settings_service.py +0 -0
  694. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_shipper_digest.py +0 -0
  695. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_single_import_root.py +0 -0
  696. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_skill_agent_binding.py +0 -0
  697. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_skill_catalog.py +0 -0
  698. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_skill_loader.py +0 -0
  699. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_spreadsheet_tools.py +0 -0
  700. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_sse_stream_contract.py +0 -0
  701. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_startup_latency.py +0 -0
  702. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_streaming_pipeline.py +0 -0
  703. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_stripe_agent.py +0 -0
  704. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_subagent.py +0 -0
  705. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_supervisor_routing.py +0 -0
  706. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_system_prompts.py +0 -0
  707. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_system_tools_output.py +0 -0
  708. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_task_orchestrator.py +0 -0
  709. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_team_synthesis.py +0 -0
  710. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_tls_trust_store.py +0 -0
  711. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_tool_policy.py +0 -0
  712. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_tool_scope.py +0 -0
  713. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_trading_service.py +0 -0
  714. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_tradingview_bridge.py +0 -0
  715. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_turn_planning.py +0 -0
  716. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ui_completer_references.py +0 -0
  717. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ui_console_theme.py +0 -0
  718. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_ui_input_box.py +0 -0
  719. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_verification_hint.py +0 -0
  720. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_verification_policy.py +0 -0
  721. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_version_consistency.py +0 -0
  722. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_version_counter.py +0 -0
  723. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_video_analysis.py +0 -0
  724. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_video_editor.py +0 -0
  725. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_vscode_mcp.py +0 -0
  726. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_warehouse_agents.py +0 -0
  727. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_warehouse_cli_registration.py +0 -0
  728. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_warehouse_erp_client.py +0 -0
  729. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_warehouse_workflow.py +0 -0
  730. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_wheel_is_installable.py +0 -0
  731. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_workspace_changes.py +0 -0
  732. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_workspace_context.py +0 -0
  733. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_workspace_files.py +0 -0
  734. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_workspace_scope.py +0 -0
  735. {aria_code-0.76.0 → aria_code-0.78.0}/tests/test_workspace_service.py +0 -0
  736. {aria_code-0.76.0 → aria_code-0.78.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.76.0
4
- Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
3
+ Version: 0.78.0
4
+ Summary: Open-source AI agent for coding, financial analysis and logistics operations: 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,7 +163,7 @@ Dynamic: license-file
163
163
 
164
164
  <h1 align="center">Aria Code</h1>
165
165
 
166
- <p align="center">An open-source AI agent for logistics and finance work.<br>
166
+ <p align="center">An open-source AI agent for coding, financial analysis and logistics operations.<br>
167
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>
@@ -175,20 +175,33 @@ Numbers you can check, client data kept apart, actions a person approves.</p>
175
175
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-64748b?style=flat-square" alt="Apache License 2.0"></a>
176
176
  </p>
177
177
 
178
- <p align="center"><img src="docs/assets/demo-logistics.gif" alt="Real Aria Code terminal recording: reorder points for one shipper, a refusal to mix two shippers' data, and a carrier scorecard with a saving and two anomalies" width="860"></p>
179
- <p align="center"><sub>Recorded from a real Aria Code session on the sample 3PL data in <code>evals/fixtures</code>. No model is called, so every number on screen comes from the tools; pauses are shortened. <a href="docs/assets/demo-logistics.png">Still screenshot</a> · <a href="scripts/record_logistics_demo.py">Recorder</a> · <a href="scripts/render_logistics_demo.py">Renderer</a>.</sub></p>
178
+ <p align="center"><img src="docs/assets/demo-coding.gif" alt="Real Aria Code session: Gemini 2.5 Pro writes fx.py and its tests, runs them after each step is approved, then /review checks the change" width="860"></p>
179
+ <p align="center"><sub>A real session on Gemini 2.5 Pro (Vertex AI): Aria writes <code>fx.py</code> and its tests, runs them once each step is approved, then <code>/review</code> checks the change and gives its verdict. Waiting is shortened; nothing else is changed. <a href="docs/assets/demo-coding.png">Still</a> · <a href="scripts/record_demo.py">Recorder</a> · <a href="scripts/render_demo.py">Renderer</a></sub></p>
180
180
 
181
181
  ## What Aria Code does
182
182
 
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.
183
+ **Writes code and builds projects.** Describe the task in plain words. Aria reads the project, writes and edits files, runs commands and tests, and shows every change before it lands — nothing is written or run until you say yes. [`/review`](docs/code-review.md) reviews a change the way a careful colleague would: prioritised findings (P0–P3) with file and line, and a verdict; `aria-code review --base main --fail-on P1` gates a pull request in CI. Use a local Ollama model, Gemini on Google Cloud (Vertex AI, with nothing more than a `gcloud` login), or another supported provider.
184
184
 
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.
185
+ **Analyses markets and finances.** Quotes, technical indicators, backtests with an HTML report, risk and factor analysis, SEC filings, and US, Hong Kong, A-share and crypto data. Results name their data source, period and any gaps.
186
+
187
+ <p align="center"><img src="docs/assets/demo-finance.gif" alt="Real Aria Code session: technical indicators for AAPL and a one-year momentum backtest on SPY, with data source, period and completeness stated" width="760"></p>
188
+
189
+ **Runs logistics operations.** For third-party logistics: reorder points, safety stock, ABC/XYZ classes, dead stock, carrier scorecards and freight anomalies — and in Feishu, a daily digest per shipper with approval cards.
190
+
191
+ <p align="center"><img src="docs/assets/demo-logistics.gif" alt="Real Aria Code session: a refusal to mix two shippers' data, reorder points for one shipper, and a carrier scorecard with a saving and two anomalies" width="760"></p>
192
+ <p align="center"><sub>Both recorded from real sessions — market data from yfinance; the logistics data is the sample 3PL in <code>evals/fixtures</code>, with no model call.</sub></p>
193
+
194
+ ## How it works
195
+
196
+ A general-purpose assistant aims for an answer that reads well. In code, markets and warehouses the result gets acted on — a rounding rule in a currency function, one purchase order left out of a reorder quantity. Three rules follow from that.
197
+
198
+ **Numbers you can check.** Reorder points, safety stock, carrier rankings and backtests come from stated formulas and named data, 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
199
 
187
200
  **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
201
 
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.
202
+ **Actions a person approves.** In the terminal, every file write and command waits for your yes, with the diff in front of you. In Feishu, `/补货` 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
203
 
191
- Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes ([recording](docs/assets/demo-coding-workflow.gif)), 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.
204
+ A fresh install has no live business data: the logistics tools read your exports (CSV or JSON), market data comes from public sources, and the chat features need a Feishu app or the Aria relay.
192
205
 
193
206
  ## Quick start
194
207
 
@@ -210,6 +223,19 @@ The installer downloads the binary for your OS from the latest [GitHub release](
210
223
 
211
224
  Alternative package-manager installs: `npm install -g @artheras/aria-code` (requires npm) or `python3 -m pip install --upgrade "aria-code<4"` (requires Python 3.10+; the `<4` skips an older 4.x numbering that PyPI still lists). For development from source, see [CONTRIBUTING.md](CONTRIBUTING.md).
212
225
 
226
+ ### Updates
227
+
228
+ Aria checks for a newer stable version in the background at startup, at most once per day. Cached notices appear immediately; network checks never delay the prompt. It checks GitHub Releases, or scoped npm for npm installs. Pip updates pin the GitHub version and verify that version is available on PyPI, avoiding the older 4.x numbering still listed as PyPI's latest. Source checkouts receive Git update instructions.
229
+
230
+ ```bash
231
+ aria update --check # check without installing
232
+ aria update # install the newest stable version for this install channel
233
+ ```
234
+
235
+ In an interactive session, use `/update --check` or `/update`, then restart Aria. Native updates verify SHA-256 and the downloaded binary's version before switching the command; a failed download or verification leaves the existing command in place. Startup checks only notify. To disable them, set `check_for_update_on_startup` to `false` in `~/.aria-code/config.json`.
236
+
237
+ For GitHub notifications, open [this repository](https://github.com/artheras/aria-code), select **Watch → Custom → Releases**, and save. Notifications follow your GitHub notification settings. Published stable releases appear on the [release page](https://github.com/artheras/aria-code/releases/latest) once the platform assets and package publishing have completed.
238
+
213
239
  To use a local model, install [Ollama](https://ollama.com/download), pull a coding model, and start Aria in local-only mode:
214
240
 
215
241
  ```bash
@@ -231,7 +257,7 @@ Aria may request approval before editing files or running commands, according to
231
257
  | --- | --- |
232
258
  | Local Ollama | An installed and running Ollama model; no cloud account for local inference. |
233
259
  | Direct cloud provider | That provider's API credentials and network access. |
234
- | Direct Google Cloud Vertex AI | `aria-code[google]`, Google Cloud Application Default Credentials, `GOOGLE_CLOUD_PROJECT`, and `GOOGLE_CLOUD_LOCATION`. |
260
+ | Direct Google Cloud Vertex AI | `GOOGLE_CLOUD_PROJECT` and either a `gcloud auth login` (Aria uses Vertex AI's OpenAI-compatible endpoint with that login's token) or Application Default Credentials with `aria-code[google]`. `GOOGLE_CLOUD_LOCATION` defaults to `global`. |
235
261
  | Arthera hosted service | Install `aria-code[google]` and sign in through `/login` in the CLI. Arthera account sign-in does not grant Vertex AI credentials to your own machine. |
236
262
 
237
263
  Install extras only for features you use; see [pyproject.toml](pyproject.toml) for the current package options. Local inference can work offline, but live market data, remote integrations, sign-in, and cloud models cannot.
@@ -0,0 +1,126 @@
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/aria-code-icon.png">
4
+ <img src="docs/assets/aria-code-icon-light.png" alt="Aria Code icon" width="88">
5
+ </picture>
6
+ </p>
7
+
8
+ <h1 align="center">Aria Code</h1>
9
+
10
+ <p align="center">An open-source AI agent for coding, financial analysis and logistics operations.<br>
11
+ Numbers you can check, client data kept apart, actions a person approves.</p>
12
+
13
+ <p align="center"><a href="README_CN.md">简体中文</a> · English</p>
14
+
15
+ <p align="center">
16
+ <a href="https://www.npmjs.com/package/@artheras/aria-code"><img src="https://img.shields.io/npm/v/@artheras/aria-code?style=flat-square&logo=npm&label=npm" alt="npm version"></a>
17
+ <a href="https://pypi.org/project/aria-code/"><img src="https://img.shields.io/pypi/v/aria-code?style=flat-square&logo=pypi&label=PyPI" alt="PyPI version"></a>
18
+ <a href="https://github.com/artheras/aria-code/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/artheras/aria-code/ci.yml?branch=main&style=flat-square&logo=githubactions&label=CI" alt="CI status"></a>
19
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-64748b?style=flat-square" alt="Apache License 2.0"></a>
20
+ </p>
21
+
22
+ <p align="center"><img src="docs/assets/demo-coding.gif" alt="Real Aria Code session: Gemini 2.5 Pro writes fx.py and its tests, runs them after each step is approved, then /review checks the change" width="860"></p>
23
+ <p align="center"><sub>A real session on Gemini 2.5 Pro (Vertex AI): Aria writes <code>fx.py</code> and its tests, runs them once each step is approved, then <code>/review</code> checks the change and gives its verdict. Waiting is shortened; nothing else is changed. <a href="docs/assets/demo-coding.png">Still</a> · <a href="scripts/record_demo.py">Recorder</a> · <a href="scripts/render_demo.py">Renderer</a></sub></p>
24
+
25
+ ## What Aria Code does
26
+
27
+ **Writes code and builds projects.** Describe the task in plain words. Aria reads the project, writes and edits files, runs commands and tests, and shows every change before it lands — nothing is written or run until you say yes. [`/review`](docs/code-review.md) reviews a change the way a careful colleague would: prioritised findings (P0–P3) with file and line, and a verdict; `aria-code review --base main --fail-on P1` gates a pull request in CI. Use a local Ollama model, Gemini on Google Cloud (Vertex AI, with nothing more than a `gcloud` login), or another supported provider.
28
+
29
+ **Analyses markets and finances.** Quotes, technical indicators, backtests with an HTML report, risk and factor analysis, SEC filings, and US, Hong Kong, A-share and crypto data. Results name their data source, period and any gaps.
30
+
31
+ <p align="center"><img src="docs/assets/demo-finance.gif" alt="Real Aria Code session: technical indicators for AAPL and a one-year momentum backtest on SPY, with data source, period and completeness stated" width="760"></p>
32
+
33
+ **Runs logistics operations.** For third-party logistics: reorder points, safety stock, ABC/XYZ classes, dead stock, carrier scorecards and freight anomalies — and in Feishu, a daily digest per shipper with approval cards.
34
+
35
+ <p align="center"><img src="docs/assets/demo-logistics.gif" alt="Real Aria Code session: a refusal to mix two shippers' data, reorder points for one shipper, and a carrier scorecard with a saving and two anomalies" width="760"></p>
36
+ <p align="center"><sub>Both recorded from real sessions — market data from yfinance; the logistics data is the sample 3PL in <code>evals/fixtures</code>, with no model call.</sub></p>
37
+
38
+ ## How it works
39
+
40
+ A general-purpose assistant aims for an answer that reads well. In code, markets and warehouses the result gets acted on — a rounding rule in a currency function, one purchase order left out of a reorder quantity. Three rules follow from that.
41
+
42
+ **Numbers you can check.** Reorder points, safety stock, carrier rankings and backtests come from stated formulas and named data, 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.
43
+
44
+ **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.
45
+
46
+ **Actions a person approves.** In the terminal, every file write and command waits for your yes, with the diff in front of you. In Feishu, `/补货` 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.
47
+
48
+ A fresh install has no live business data: the logistics tools read your exports (CSV or JSON), market data comes from public sources, and the chat features need a Feishu app or the Aria relay.
49
+
50
+ ## Quick start
51
+
52
+ Install the standalone CLI on macOS or Linux without Python, Node.js, or npm:
53
+
54
+ ```bash
55
+ curl -fsSL https://raw.githubusercontent.com/artheras/aria-code/main/scripts/install.sh | sh
56
+ ~/.local/bin/aria
57
+ ```
58
+
59
+ On Windows x64, run this in PowerShell:
60
+
61
+ ```powershell
62
+ irm https://raw.githubusercontent.com/artheras/aria-code/main/scripts/install.ps1 | iex
63
+ aria
64
+ ```
65
+
66
+ The installer downloads the binary for your OS from the latest [GitHub release](https://github.com/artheras/aria-code/releases/latest), checks its SHA-256 digest, and installs it in your user account. Open a new terminal to start the interactive CLI with `aria`, `aria code`, or `aria-code`. Set `ARIA_CODE_VERSION=v0.55.0` to pin a release.
67
+
68
+ Alternative package-manager installs: `npm install -g @artheras/aria-code` (requires npm) or `python3 -m pip install --upgrade "aria-code<4"` (requires Python 3.10+; the `<4` skips an older 4.x numbering that PyPI still lists). For development from source, see [CONTRIBUTING.md](CONTRIBUTING.md).
69
+
70
+ ### Updates
71
+
72
+ Aria checks for a newer stable version in the background at startup, at most once per day. Cached notices appear immediately; network checks never delay the prompt. It checks GitHub Releases, or scoped npm for npm installs. Pip updates pin the GitHub version and verify that version is available on PyPI, avoiding the older 4.x numbering still listed as PyPI's latest. Source checkouts receive Git update instructions.
73
+
74
+ ```bash
75
+ aria update --check # check without installing
76
+ aria update # install the newest stable version for this install channel
77
+ ```
78
+
79
+ In an interactive session, use `/update --check` or `/update`, then restart Aria. Native updates verify SHA-256 and the downloaded binary's version before switching the command; a failed download or verification leaves the existing command in place. Startup checks only notify. To disable them, set `check_for_update_on_startup` to `false` in `~/.aria-code/config.json`.
80
+
81
+ For GitHub notifications, open [this repository](https://github.com/artheras/aria-code), select **Watch → Custom → Releases**, and save. Notifications follow your GitHub notification settings. Published stable releases appear on the [release page](https://github.com/artheras/aria-code/releases/latest) once the platform assets and package publishing have completed.
82
+
83
+ To use a local model, install [Ollama](https://ollama.com/download), pull a coding model, and start Aria in local-only mode:
84
+
85
+ ```bash
86
+ ollama pull qwen2.5-coder:7b
87
+ aria-code --local
88
+ ```
89
+
90
+ Or run a single task in an existing project:
91
+
92
+ ```bash
93
+ aria-code -p "Inspect this project, fix the failing tests, run them, and summarize the diff."
94
+ ```
95
+
96
+ Aria may request approval before editing files or running commands, according to the configured permission mode. Review changes and test results before committing them.
97
+
98
+ ## Models and accounts
99
+
100
+ | Route | What it needs |
101
+ | --- | --- |
102
+ | Local Ollama | An installed and running Ollama model; no cloud account for local inference. |
103
+ | Direct cloud provider | That provider's API credentials and network access. |
104
+ | Direct Google Cloud Vertex AI | `GOOGLE_CLOUD_PROJECT` and either a `gcloud auth login` (Aria uses Vertex AI's OpenAI-compatible endpoint with that login's token) or Application Default Credentials with `aria-code[google]`. `GOOGLE_CLOUD_LOCATION` defaults to `global`. |
105
+ | Arthera hosted service | Install `aria-code[google]` and sign in through `/login` in the CLI. Arthera account sign-in does not grant Vertex AI credentials to your own machine. |
106
+
107
+ Install extras only for features you use; see [pyproject.toml](pyproject.toml) for the current package options. Local inference can work offline, but live market data, remote integrations, sign-in, and cloud models cannot.
108
+
109
+ ## Explore the project
110
+
111
+ | Topic | Start here |
112
+ | --- | --- |
113
+ | Architecture and runtime | [Architecture](docs/architecture.md) |
114
+ | Tool permissions and data boundaries | [Safety notes](docs/aria-code-safety.md) |
115
+ | Warehouse agents and their read-only data contract | [Warehouse ERP agents](docs/warehouse-erp-agents.md) |
116
+ | Strategy and backtesting workflows | [Strategy workspace](docs/strategy_workspace.md) |
117
+ | More examples | [Examples](examples/README.md) |
118
+ | Releases and changes | [Changelog](CHANGELOG.md) |
119
+
120
+ For the current command-line flags, run `aria-code --help`. For help inside the interactive CLI, run `/help`. These are preferable to a copied command inventory that can drift from the product.
121
+
122
+ ## Contributing and license
123
+
124
+ Contributions are welcome; see [CONTRIBUTING.md](CONTRIBUTING.md). Aria Code is open source under the [Apache License, Version 2.0](LICENSE).
125
+
126
+ Releases 4.2.0 through 4.4.5 were published under the Business Source License 1.1 and remain available under those terms; releases up to and including 4.1.2 were MIT. A license grant cannot be withdrawn from someone who already has it, so each version keeps the license it shipped with — see [NOTICE](NOTICE).
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aria-code"
7
- version = "0.76.0"
8
- description = "Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves"
7
+ version = "0.78.0"
8
+ description = "Open-source AI agent for coding, financial analysis and logistics operations: 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.76.0"
20
+ __version__ = "0.78.0"
@@ -58,6 +58,33 @@ def disable_broken_proxy(timeout: float = 1.5) -> None:
58
58
  os.environ.pop(name, None)
59
59
 
60
60
 
61
+ _LOOPBACK = ("localhost", "127.0.0.1", "::1")
62
+
63
+
64
+ def ensure_loopback_bypasses_proxy() -> None:
65
+ """With a proxy set, keep local services (Ollama, LM Studio, the API) off it.
66
+
67
+ HTTP clients honour HTTP(S)_PROXY, so a machine with a system proxy and no
68
+ NO_PROXY would send requests for localhost:11434 to the proxy and fail.
69
+ """
70
+ if not any(os.environ.get(name) for name in ("HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy",
71
+ "ALL_PROXY", "all_proxy")):
72
+ return
73
+ current = os.environ.get("NO_PROXY") or os.environ.get("no_proxy") or ""
74
+ entries = [item.strip() for item in current.split(",") if item.strip()]
75
+ missing = [host for host in _LOOPBACK if host not in entries]
76
+ if missing:
77
+ value = ",".join(entries + missing)
78
+ os.environ["NO_PROXY"] = value
79
+ os.environ["no_proxy"] = value
80
+
81
+
82
+ def prepare_network() -> None:
83
+ """Proxy settings every entry point needs before its first request."""
84
+ disable_broken_proxy()
85
+ ensure_loopback_bypasses_proxy()
86
+
87
+
61
88
  def use_system_trust_store() -> bool:
62
89
  """Verify TLS against the OS trust store instead of certifi's bundle.
63
90
 
@@ -105,7 +132,7 @@ def use_macos_ca_bundle() -> bool:
105
132
  def initialize_cli_environment() -> None:
106
133
  os.environ.setdefault("TQDM_DISABLE", "1")
107
134
  load_aria_env()
108
- disable_broken_proxy()
135
+ prepare_network()
109
136
  if not use_system_trust_store():
110
137
  use_macos_ca_bundle()
111
138
 
@@ -99,7 +99,7 @@ class AuthCommandsMixin:
99
99
  self.context.console.print("[dim]Authenticating...[/dim]")
100
100
 
101
101
  try:
102
- async with aiohttp.ClientSession() as session:
102
+ async with aiohttp.ClientSession(trust_env=True) as session:
103
103
  async with session.post(
104
104
  f"{self.terminal.api_url}/auth/login",
105
105
  json={"email": email, "password": password},
@@ -81,11 +81,15 @@ def _bt_volume_summary(data: dict) -> dict:
81
81
  return summary if isinstance(summary, dict) else {}
82
82
 
83
83
 
84
- def _bt_result_summary(data: dict) -> str:
84
+ def _bt_result_summary(data: dict, lang: str = "zh") -> str:
85
85
  total = _bt_num(data.get("total_return"))
86
86
  benchmark = _bt_num(_bt_value(data, "buy_hold_return", "benchmark_return", default=0))
87
87
  sharpe = _bt_num(data.get("sharpe_ratio"))
88
88
  max_dd = _bt_num(data.get("max_drawdown"))
89
+ if not str(lang).lower().startswith("zh"):
90
+ relation = "above" if total > benchmark else "below" if total < benchmark else "level with"
91
+ return (f"Result: the strategy returned {_bt_pct(total)}, {relation} buy-and-hold at {_bt_pct(benchmark)}; "
92
+ f"Sharpe {sharpe:.2f}, max drawdown {_bt_pct(max_dd)}.")
89
93
  relation = "高于" if total > benchmark else "低于" if total < benchmark else "持平"
90
94
  return (
91
95
  f"结论:策略收益 {_bt_pct(total)},{relation}买入持有 {_bt_pct(benchmark)};"
@@ -475,7 +479,7 @@ class BacktestCommandsMixin:
475
479
  "include_monte_carlo": False,
476
480
  }
477
481
  try:
478
- async with aiohttp.ClientSession() as sess:
482
+ async with aiohttp.ClientSession(trust_env=True) as sess:
479
483
  async with sess.post(f"{api_url}/api/v1/backtest", json=payload, timeout=aiohttp.ClientTimeout(total=60)) as resp:
480
484
  if resp.status == 200:
481
485
  body = await resp.json()
@@ -542,7 +546,8 @@ class BacktestCommandsMixin:
542
546
  for r in rows:
543
547
  tbl.add_row(*r)
544
548
  self.context.console.print(tbl)
545
- self.context.console.print(f" [bold]{self._bt_result_summary(d)}[/bold]")
549
+ self.context.console.print(
550
+ f" [bold]{self._bt_result_summary(d, lang=self.terminal.config.get('ui_lang', 'en') or 'en')}[/bold]")
546
551
 
547
552
  actual_start = self._bt_value(d, "start", "start_date", default=start_date)
548
553
  actual_end = self._bt_value(d, "end", "end_date", default=end_date)
@@ -579,7 +584,11 @@ class BacktestCommandsMixin:
579
584
  else " [#57606a]volume:[/#57606a] unavailable"
580
585
  )
581
586
  if d.get("report_path"):
582
- self.context.console.print(f" [#57606a]report:[/#57606a] {d['report_path']}")
587
+ _report = str(d["report_path"])
588
+ _home = str(pathlib.Path.home())
589
+ if _report.startswith(_home + os.sep):
590
+ _report = "~" + _report[len(_home):]
591
+ self.context.console.print(f" [#57606a]report:[/#57606a] {_report}")
583
592
  if trades == 0:
584
593
  self.context.console.print(
585
594
  " [yellow]注意:[/yellow] # Trades 为 0,表示本次规则没有触发入场;"
@@ -675,7 +684,7 @@ class BacktestCommandsMixin:
675
684
  "end_date": __import__("datetime").date.today().isoformat(),
676
685
  "train_period_days": 252, "test_period_days": 63, "step_days": 21,
677
686
  }
678
- async with aiohttp.ClientSession() as sess:
687
+ async with aiohttp.ClientSession(trust_env=True) as sess:
679
688
  async with sess.post(f"{api_url}/api/v1/backtest/walk-forward", json=payload, timeout=aiohttp.ClientTimeout(total=90)) as resp:
680
689
  if resp.status != 200:
681
690
  raise RuntimeError(f"HTTP {resp.status}")
@@ -61,7 +61,7 @@ class BusinessWorkflowCommandsMixin:
61
61
  api_url = self.terminal.config.get("api_url", "http://localhost:8000")
62
62
  try:
63
63
  import aiohttp
64
- async with aiohttp.ClientSession() as sess:
64
+ async with aiohttp.ClientSession(trust_env=True) as sess:
65
65
  async with sess.get(
66
66
  f"{api_url}/api/realty/assets/{asset_id}",
67
67
  timeout=aiohttp.ClientTimeout(total=5)
@@ -128,7 +128,7 @@ class BusinessWorkflowCommandsMixin:
128
128
  rules = {}
129
129
  try:
130
130
  import aiohttp
131
- async with aiohttp.ClientSession() as sess:
131
+ async with aiohttp.ClientSession(trust_env=True) as sess:
132
132
  async with sess.get(f"{api_url}/api/realty/contracts/{project_id}",
133
133
  timeout=aiohttp.ClientTimeout(total=5)) as resp:
134
134
  if resp.status == 200:
@@ -153,7 +153,7 @@ class BusinessWorkflowCommandsMixin:
153
153
  api_url = self.terminal.config.get("api_url", "http://localhost:8000")
154
154
  try:
155
155
  import aiohttp
156
- async with aiohttp.ClientSession() as sess:
156
+ async with aiohttp.ClientSession(trust_env=True) as sess:
157
157
  async with sess.get(
158
158
  f"{api_url}/api/realty/risks/scan/{project_id}",
159
159
  timeout=aiohttp.ClientTimeout(total=10)
@@ -174,7 +174,7 @@ class BusinessWorkflowCommandsMixin:
174
174
  marketing_data = {}
175
175
  try:
176
176
  import aiohttp
177
- async with aiohttp.ClientSession() as sess:
177
+ async with aiohttp.ClientSession(trust_env=True) as sess:
178
178
  async with sess.get(
179
179
  f"{api_url}/api/realty/assets/{project_id}",
180
180
  timeout=aiohttp.ClientTimeout(total=5)
@@ -224,7 +224,7 @@ class BusinessWorkflowCommandsMixin:
224
224
  "prepayment_received": 0, "renovation_cost": 0}
225
225
  try:
226
226
  import aiohttp
227
- async with aiohttp.ClientSession() as sess:
227
+ async with aiohttp.ClientSession(trust_env=True) as sess:
228
228
  async with sess.get(
229
229
  f"{api_url}/api/realty/contracts/{project_id}",
230
230
  timeout=aiohttp.ClientTimeout(total=5)
@@ -39,6 +39,12 @@ from typing import Dict, Any, Optional
39
39
 
40
40
 
41
41
  class CoreCommandsMixin:
42
+ async def cmd_update(self, args: str):
43
+ """Use the same updater from the REPL and the shell."""
44
+ from aria_code.apps.cli.updater import main
45
+
46
+ await asyncio.to_thread(main, shlex.split(args))
47
+
42
48
  def _cmd_rewind_unavailable(self, args: str):
43
49
  # cmd_rewind lands with the checkpoint store (runtime/checkpoints.py,
44
50
  # still a separate, uncommitted change) — degrade instead of crashing
@@ -194,7 +200,7 @@ class CoreCommandsMixin:
194
200
  ("Session", ["/help","/clear","/compact","/cost","/status","/health",
195
201
  "/regen","/undo","/rewind","/copy","/recap","/btw",
196
202
  "/save","/load","/sessions","/export","/export-pdf"]),
197
- ("Config", ["/model","/thinking","/config","/privacy","/local",
203
+ ("Config", ["/model","/thinking","/config","/privacy","/local","/update",
198
204
  "/setup","/apikey","/doctor","/mcp"]),
199
205
  ("Data", ["/alert","/journal","/watch","/note","/todo","/memory",
200
206
  "/artifacts","/strategy","/accuracy"]),
@@ -869,15 +875,11 @@ class CoreCommandsMixin:
869
875
  else:
870
876
  print(f"Generating: {description}")
871
877
 
872
- # Use best available model for code gen
873
- original_model = self.terminal.config.get("model", "qwen2.5:7b")
874
- self.terminal.config["model"] = "qwen2.5:7b"
875
-
878
+ # The configured model writes the code. This used to switch to
879
+ # qwen2.5:7b for the call, whatever the user had chosen — a Gemini or
880
+ # Claude user got a small local model, or an error without Ollama.
876
881
  await self.terminal.send_message(prompt)
877
882
 
878
- # Restore model
879
- self.terminal.config["model"] = original_model
880
-
881
883
  # Extract code from last AI response and save if requested
882
884
  if save_path or description:
883
885
  last_response = ""
@@ -986,7 +988,7 @@ class CoreCommandsMixin:
986
988
  "response_id": self.terminal.session_id, # latest-in-session match
987
989
  "value": comment or None,
988
990
  }
989
- async with aiohttp.ClientSession() as session:
991
+ async with aiohttp.ClientSession(trust_env=True) as session:
990
992
  async with session.post(
991
993
  f"{self.terminal.api_url}/feedback",
992
994
  json=payload,
@@ -2322,13 +2324,15 @@ class CoreCommandsMixin:
2322
2324
  from aria_cli import _generate_chart_sync, parse_technical_args, print_ta_result
2323
2325
  from aria_code.ui.render.output import display_path as _display_path
2324
2326
  from aria_code.apps.cli.helpers import _chart_period_from_ta_days, _display_value
2327
+ zh = str(self.terminal.config.get("ui_lang", "en")).lower().startswith("zh")
2328
+ T = (lambda zh_text, en_text: zh_text) if zh else (lambda zh_text, en_text: en_text)
2325
2329
  parsed = parse_technical_args(args)
2326
2330
  symbol = parsed.symbol
2327
2331
  days = parsed.days
2328
2332
 
2329
2333
  service_result = None
2330
2334
  if self.context.has_rich:
2331
- with self.context.console.status(f"[dim]计算 {symbol} 技术指标...[/dim]", spinner="dots"):
2335
+ with self.context.console.status(f"[dim]{T(f'计算 {symbol} 技术指标', f'Calculating {symbol} indicators')}...[/dim]", spinner="dots"):
2332
2336
  from packages.aria_services.data import DataService
2333
2337
  service_result = DataService().technical_indicators(symbol, days=days)
2334
2338
  else:
@@ -2343,16 +2347,19 @@ class CoreCommandsMixin:
2343
2347
  # Show current price when we have partial data (e.g. new IPO with 1 bar)
2344
2348
  _price_line = ""
2345
2349
  if _ta_data.get("price"):
2346
- _price_line = f" 当前价格 [bold]{_display_value(_ta_data['price'])}[/bold]"
2350
+ _price_line = f" {T('当前价格', 'Price')} [bold]{_display_value(_ta_data['price'])}[/bold]"
2347
2351
  if _ta_data.get("history_bars"):
2348
- _price_line += f" [dim]({_ta_data['history_bars']} 个交易日数据)[/dim]"
2352
+ _price_line += f" [dim]({_ta_data['history_bars']} {T('个交易日数据', 'trading days of data')})[/dim]"
2349
2353
  _price_line += "\n"
2350
2354
  if "数据不足" in _all_msgs or "新上市" in _all_msgs:
2351
- _reason = f"[yellow]历史数据不足[/yellow] — {symbol} 上市时间较短(< 14 个交易日),TA 指标无法计算\n [dim]可待更多交易日积累后重试,或运行 `/analyze {symbol}` 查看基本面[/dim]"
2355
+ _reason = T(
2356
+ f"[yellow]历史数据不足[/yellow] — {symbol} 上市时间较短(< 14 个交易日),TA 指标无法计算\n [dim]可待更多交易日积累后重试,或运行 `/analyze {symbol}` 查看基本面[/dim]",
2357
+ f"[yellow]Not enough history[/yellow] — {symbol} has fewer than 14 trading days, so indicators cannot be computed\n [dim]Try again later, or run `/analyze {symbol}` for fundamentals[/dim]")
2352
2358
  elif "rate" in _all_msgs or "429" in _all_msgs or "too many" in _all_msgs:
2353
- _reason = "[yellow]数据源频率限制[/yellow] — 稍后重试,或用 `/apikey set finnhub <KEY>` 切换数据源"
2359
+ _reason = T("[yellow]数据源频率限制[/yellow] — 稍后重试,或用 `/apikey set finnhub <KEY>` 切换数据源",
2360
+ "[yellow]Rate-limited by the data source[/yellow] — retry later, or switch sources with `/apikey set finnhub <KEY>`")
2354
2361
  else:
2355
- _err = "; ".join(_ta_errs or _ta_warns) or "数据源暂时不可用"
2362
+ _err = "; ".join(_ta_errs or _ta_warns) or T("数据源暂时不可用", "data source temporarily unavailable")
2356
2363
  _reason = f"[red]{_err[:120]}[/red]"
2357
2364
  if _missing:
2358
2365
  _reason += f" [dim]missing: {_missing}[/dim]"
@@ -2372,6 +2379,7 @@ class CoreCommandsMixin:
2372
2379
  days=days,
2373
2380
  service_result=service_result,
2374
2381
  formatter=_display_value,
2382
+ lang="zh" if zh else "en",
2375
2383
  )
2376
2384
 
2377
2385
  period = _chart_period_from_ta_days(days)
@@ -2383,12 +2391,12 @@ class CoreCommandsMixin:
2383
2391
  }
2384
2392
  chart_result = None
2385
2393
  if self.context.has_rich:
2386
- with self.context.console.status(f"[dim]生成 {symbol} 技术图表 HTML/PNG...[/dim]", spinner="dots"):
2394
+ with self.context.console.status(f"[dim]{T(f'生成 {symbol} 技术图表', f'Drawing the {symbol} chart')} HTML/PNG...[/dim]", spinner="dots"):
2387
2395
  chart_result = await asyncio.get_event_loop().run_in_executor(
2388
2396
  None, lambda: _generate_chart_sync(symbol, period=period)
2389
2397
  )
2390
2398
  else:
2391
- print(f" 生成 {symbol} 技术图表 HTML/PNG...")
2399
+ print(f" {T(f'生成 {symbol} 技术图表', f'Drawing the {symbol} chart')} HTML/PNG...")
2392
2400
  chart_result = await asyncio.get_event_loop().run_in_executor(
2393
2401
  None, lambda: _generate_chart_sync(symbol, period=period)
2394
2402
  )
@@ -2407,27 +2415,27 @@ class CoreCommandsMixin:
2407
2415
  }
2408
2416
  if self.context.has_rich:
2409
2417
  self.context.console.print()
2410
- self.context.console.print(" [green]✓[/green] 技术图表已生成")
2418
+ self.context.console.print(f" [green]✓[/green] {T('技术图表已生成', 'Chart saved')}")
2411
2419
  if html_path:
2412
2420
  self.context.console.print(f" [dim]HTML:[/dim] [link={html_path}]{_display_path(html_path)}[/link]")
2413
2421
  if png_path:
2414
2422
  self.context.console.print(f" [dim]PNG :[/dim] [link={png_path}]{_display_path(png_path)}[/link]")
2415
2423
  elif png_error:
2416
- self.context.console.print(f" [yellow]PNG 跳过:[/yellow] {png_error[:90]}")
2424
+ self.context.console.print(f" [yellow]{T('PNG 跳过', 'PNG skipped')}:[/yellow] {png_error[:90]}")
2417
2425
  else:
2418
- print("\n 技术图表已生成")
2426
+ print(f"\n {T('技术图表已生成', 'Chart saved')}")
2419
2427
  if html_path:
2420
2428
  print(f" HTML: {_display_path(html_path)}")
2421
2429
  if png_path:
2422
2430
  print(f" PNG : {_display_path(png_path)}")
2423
2431
  elif png_error:
2424
- print(f" PNG 跳过: {png_error[:90]}")
2432
+ print(f" {T('PNG 跳过', 'PNG skipped')}: {png_error[:90]}")
2425
2433
  elif chart_result:
2426
- err = chart_result.get("error") or "图表生成失败"
2434
+ err = chart_result.get("error") or T("图表生成失败", "chart failed")
2427
2435
  if self.context.has_rich:
2428
- self.context.console.print(f" [yellow]图表生成跳过:[/yellow] {err[:120]}")
2436
+ self.context.console.print(f" [yellow]{T('图表生成跳过', 'Chart skipped')}:[/yellow] {err[:120]}")
2429
2437
  else:
2430
- print(f" 图表生成跳过: {err[:120]}")
2438
+ print(f" {T('图表生成跳过', 'Chart skipped')}: {err[:120]}")
2431
2439
  def _extract_last_code(self) -> str:
2432
2440
  """从对话历史中提取最后一段 Python 代码块."""
2433
2441
  import re
@@ -356,7 +356,7 @@ class DataCommandsMixin:
356
356
  async def _do():
357
357
  payload = {"symbol": symbol, "strategies": _STRATS,
358
358
  "start_date": start, "end_date": end, "initial_capital": 100000, "commission_rate": 0.0003}
359
- async with aiohttp.ClientSession() as sess:
359
+ async with aiohttp.ClientSession(trust_env=True) as sess:
360
360
  async with sess.post(f"{api_url}/api/v1/backtest/compare-strategies", json=payload, timeout=aiohttp.ClientTimeout(total=90)) as resp:
361
361
  if resp.status != 200:
362
362
  raise RuntimeError(f"HTTP {resp.status}")
@@ -238,7 +238,7 @@ class DiagnosticCommandsMixin:
238
238
  print(f" ? {message}")
239
239
  for label, url, path in urls:
240
240
  try:
241
- async with aiohttp.ClientSession() as session:
241
+ async with aiohttp.ClientSession(trust_env=True) as session:
242
242
  async with session.get(f"{str(url).rstrip('/')}{path}", timeout=aiohttp.ClientTimeout(total=5)) as resp:
243
243
  resp.raise_for_status()
244
244
  data = await resp.json()