aria-code 4.4.0__tar.gz → 4.4.1__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 (569) hide show
  1. {aria_code-4.4.0/aria_code.egg-info → aria_code-4.4.1}/PKG-INFO +1 -1
  2. {aria_code-4.4.0 → aria_code-4.4.1}/agents/portfolio_agent.py +1 -1
  3. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/fulfillment_risk.py +1 -1
  4. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/ashare_prediction_cmds.py +1 -1
  5. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/backtest_cmds.py +30 -17
  6. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/broker_cmds.py +4 -2
  7. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/core_cmds.py +25 -6
  8. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/diagnostic_ops_cmds.py +3 -1
  9. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/market_cmds.py +5 -5
  10. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/model_cmds.py +56 -7
  11. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/portfolio_cmds.py +3 -3
  12. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/workflow_cmds.py +4 -4
  13. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/workspace_cmds.py +23 -16
  14. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/football_reports.py +4 -4
  15. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/handlers/market_handlers.py +15 -12
  16. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/handlers/realty_handlers.py +2 -2
  17. aria_code-4.4.1/apps/cli/local_tool_schemas.py +473 -0
  18. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/market_universe.py +18 -0
  19. aria_code-4.4.1/apps/cli/provider_endpoints.py +237 -0
  20. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/llm/ollama_stream.py +2 -1
  21. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tool_executor.py +2 -2
  22. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/write_tools.py +5 -4
  23. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/utils/market_detect.py +9 -6
  24. {aria_code-4.4.0 → aria_code-4.4.1}/aria_cli.py +35 -653
  25. {aria_code-4.4.0 → aria_code-4.4.1/aria_code.egg-info}/PKG-INFO +1 -1
  26. {aria_code-4.4.0 → aria_code-4.4.1}/aria_code.egg-info/SOURCES.txt +16 -0
  27. {aria_code-4.4.0 → aria_code-4.4.1}/aria_daemon.py +4 -4
  28. {aria_code-4.4.0 → aria_code-4.4.1}/aria_feishu_bot.py +16 -12
  29. {aria_code-4.4.0 → aria_code-4.4.1}/aria_relay_server.py +88 -3
  30. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/cn/xtquant_broker.py +2 -1
  31. {aria_code-4.4.0 → aria_code-4.4.1}/clients/football_data_client.py +1 -1
  32. {aria_code-4.4.0 → aria_code-4.4.1}/clients/market_data_client.py +2 -1
  33. {aria_code-4.4.0 → aria_code-4.4.1}/data_service.py +3 -1
  34. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/edgar_source.py +2 -1
  35. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/fred_source.py +5 -2
  36. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/tushare_source.py +2 -1
  37. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/web_scraper_source.py +4 -4
  38. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/world_bank_source.py +2 -1
  39. {aria_code-4.4.0 → aria_code-4.4.1}/demo_player.py +4 -1
  40. {aria_code-4.4.0 → aria_code-4.4.1}/memory_manager.py +1 -1
  41. aria_code-4.4.1/packages/adk_bridge/__init__.py +11 -0
  42. {aria_code-4.4.0 → aria_code-4.4.1}/packages/adk_bridge/code_review_tools.py +6 -2
  43. aria_code-4.4.1/packages/quant_engine/_namespace.py +62 -0
  44. aria_code-4.4.1/packages/quant_engine/backtest/__init__.py +14 -0
  45. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/backtest/engine.py +4 -1
  46. aria_code-4.4.1/packages/quant_engine/portfolio/__init__.py +13 -0
  47. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/__init__.py +8 -0
  48. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/__init__.py +8 -0
  49. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/gbm_enhanced.py +13 -13
  50. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/monte_carlo_advanced.py +11 -11
  51. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/stochastic_processes.py +6 -6
  52. aria_code-4.4.1/providers/llm/autoconfig.py +213 -0
  53. aria_code-4.4.1/providers/llm/custom.py +158 -0
  54. {aria_code-4.4.0 → aria_code-4.4.1}/providers/llm/ollama.py +2 -1
  55. {aria_code-4.4.0 → aria_code-4.4.1}/providers/llm/registry.py +76 -2
  56. {aria_code-4.4.0 → aria_code-4.4.1}/pyproject.toml +34 -5
  57. {aria_code-4.4.0 → aria_code-4.4.1}/report_generator.py +2 -1
  58. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/agent_loop.py +50 -4
  59. aria_code-4.4.1/runtime/budget.py +232 -0
  60. aria_code-4.4.1/runtime/crash_report.py +174 -0
  61. {aria_code-4.4.0 → aria_code-4.4.1}/setup_wizard.py +1 -1
  62. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_aria_mcp_server.py +14 -0
  63. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ashare_prediction_cmds.py +29 -0
  64. aria_code-4.4.1/tests/test_budget.py +131 -0
  65. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_channels.py +2 -1
  66. aria_code-4.4.1/tests/test_crash_report.py +95 -0
  67. aria_code-4.4.1/tests/test_custom_providers.py +107 -0
  68. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_local_image_provider.py +7 -0
  69. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_new_modules.py +3 -1
  70. aria_code-4.4.1/tests/test_no_uncommitted_imports.py +134 -0
  71. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_openai_image_client.py +7 -0
  72. aria_code-4.4.1/tests/test_provider_autoconfig.py +97 -0
  73. aria_code-4.4.1/tests/test_quant_engine_namespace.py +82 -0
  74. aria_code-4.4.1/tests/test_rebind_namespace_contract.py +109 -0
  75. aria_code-4.4.1/tests/test_relay_event_verification.py +126 -0
  76. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_report_charts.py +18 -0
  77. aria_code-4.4.1/tests/test_root_module_budget.py +105 -0
  78. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_agent_loop.py +2 -1
  79. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_safety_service.py +2 -1
  80. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_version_consistency.py +1 -1
  81. {aria_code-4.4.0 → aria_code-4.4.1}/tools/local_finance_tools.py +6 -3
  82. {aria_code-4.4.0 → aria_code-4.4.1}/ui/picker.py +1 -1
  83. {aria_code-4.4.0 → aria_code-4.4.1}/ui/render/finance.py +8 -8
  84. {aria_code-4.4.0 → aria_code-4.4.1}/ui/render/output.py +3 -3
  85. aria_code-4.4.0/packages/adk_bridge/__init__.py +0 -11
  86. aria_code-4.4.0/packages/quant_engine/backtest/__init__.py +0 -6
  87. aria_code-4.4.0/packages/quant_engine/portfolio/__init__.py +0 -5
  88. {aria_code-4.4.0 → aria_code-4.4.1}/LICENSE +0 -0
  89. {aria_code-4.4.0 → aria_code-4.4.1}/README.md +0 -0
  90. {aria_code-4.4.0 → aria_code-4.4.1}/adk_apps/__init__.py +0 -0
  91. {aria_code-4.4.0 → aria_code-4.4.1}/adk_apps/aria_code_review/__init__.py +0 -0
  92. {aria_code-4.4.0 → aria_code-4.4.1}/adk_apps/aria_code_review/agent.py +0 -0
  93. {aria_code-4.4.0 → aria_code-4.4.1}/adk_apps/aria_research/__init__.py +0 -0
  94. {aria_code-4.4.0 → aria_code-4.4.1}/adk_apps/aria_research/agent.py +0 -0
  95. {aria_code-4.4.0 → aria_code-4.4.1}/agents/__init__.py +0 -0
  96. {aria_code-4.4.0 → aria_code-4.4.1}/agents/base.py +0 -0
  97. {aria_code-4.4.0 → aria_code-4.4.1}/agents/code_review.py +0 -0
  98. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/__init__.py +0 -0
  99. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/calibration_loop.py +0 -0
  100. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/critic.py +0 -0
  101. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/deepen.py +0 -0
  102. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/models.py +0 -0
  103. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/pipeline.py +0 -0
  104. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/quant_fusion.py +0 -0
  105. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/themes.py +0 -0
  106. {aria_code-4.4.0 → aria_code-4.4.1}/agents/deep/tiers.py +0 -0
  107. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/__init__.py +0 -0
  108. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/catalyst.py +0 -0
  109. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/debate.py +0 -0
  110. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/earnings.py +0 -0
  111. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/fundamental.py +0 -0
  112. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/macro.py +0 -0
  113. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/news.py +0 -0
  114. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/risk.py +0 -0
  115. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/sector.py +0 -0
  116. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/synthesis.py +0 -0
  117. {aria_code-4.4.0 → aria_code-4.4.1}/agents/financial/technical.py +0 -0
  118. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/__init__.py +0 -0
  119. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/asset_diagnosis.py +0 -0
  120. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/business_match.py +0 -0
  121. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/cashflow_verify.py +0 -0
  122. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/contract_rules.py +0 -0
  123. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/energy_anomaly.py +0 -0
  124. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/exit_settlement.py +0 -0
  125. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/ops_optimize.py +0 -0
  126. {aria_code-4.4.0 → aria_code-4.4.1}/agents/realty/revenue_share.py +0 -0
  127. {aria_code-4.4.0 → aria_code-4.4.1}/agents/registry.py +0 -0
  128. {aria_code-4.4.0 → aria_code-4.4.1}/agents/signal_scheme.py +0 -0
  129. {aria_code-4.4.0 → aria_code-4.4.1}/agents/sports/__init__.py +0 -0
  130. {aria_code-4.4.0 → aria_code-4.4.1}/agents/sports/football_agent.py +0 -0
  131. {aria_code-4.4.0 → aria_code-4.4.1}/agents/supervisor.py +0 -0
  132. {aria_code-4.4.0 → aria_code-4.4.1}/agents/team.py +0 -0
  133. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/__init__.py +0 -0
  134. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/contracts.py +0 -0
  135. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/dashboard.py +0 -0
  136. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/inbound_exceptions.py +0 -0
  137. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/inventory_health.py +0 -0
  138. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/local_run.py +0 -0
  139. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/local_snapshot.py +0 -0
  140. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/logistics_sync.py +0 -0
  141. {aria_code-4.4.0 → aria_code-4.4.1}/agents/warehouse/workflow.py +0 -0
  142. {aria_code-4.4.0 → aria_code-4.4.1}/aliyun_data_client.py +0 -0
  143. {aria_code-4.4.0 → aria_code-4.4.1}/apps/README.md +0 -0
  144. {aria_code-4.4.0 → aria_code-4.4.1}/apps/__init__.py +0 -0
  145. {aria_code-4.4.0 → aria_code-4.4.1}/apps/channels/README.md +0 -0
  146. {aria_code-4.4.0 → aria_code-4.4.1}/apps/channels/__init__.py +0 -0
  147. {aria_code-4.4.0 → aria_code-4.4.1}/apps/channels/intake.py +0 -0
  148. {aria_code-4.4.0 → aria_code-4.4.1}/apps/channels/registry.py +0 -0
  149. {aria_code-4.4.0 → aria_code-4.4.1}/apps/channels/tradingview.py +0 -0
  150. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/README.md +0 -0
  151. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/__init__.py +0 -0
  152. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/bootstrap.py +0 -0
  153. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/broker_render.py +0 -0
  154. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/codegen_paths.py +0 -0
  155. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/__init__.py +0 -0
  156. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/analysis_cmds.py +0 -0
  157. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/auth_cmds.py +0 -0
  158. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/business_workflow_cmds.py +0 -0
  159. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/canvas_cmds.py +0 -0
  160. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/catalog.py +0 -0
  161. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/data_cmds.py +0 -0
  162. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/diagnostic_cmds.py +0 -0
  163. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/file_cmds.py +0 -0
  164. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/finance_service_cmds.py +0 -0
  165. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/fx_commodity_cmds.py +0 -0
  166. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/market.py +0 -0
  167. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/market_context.py +0 -0
  168. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/market_render.py +0 -0
  169. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/ops_cmds.py +0 -0
  170. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/orchestrator_cmds.py +0 -0
  171. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/pdf_export_cmds.py +0 -0
  172. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/report.py +0 -0
  173. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/scaffold_templates.py +0 -0
  174. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/session_cmds.py +0 -0
  175. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/session_ux_cmds.py +0 -0
  176. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/team.py +0 -0
  177. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/team_render.py +0 -0
  178. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/ui_cmds.py +0 -0
  179. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/commands/warehouse_cmds.py +0 -0
  180. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/config_paths.py +0 -0
  181. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/config_store.py +0 -0
  182. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/deterministic.py +0 -0
  183. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/direct.py +0 -0
  184. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/finance_service_catalog.py +0 -0
  185. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/github_app_auth.py +0 -0
  186. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/handlers/__init__.py +0 -0
  187. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/handlers/broker_handlers.py +0 -0
  188. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/handlers/chart_handlers.py +0 -0
  189. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/handlers/strategy_advice.py +0 -0
  190. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/hooks.py +0 -0
  191. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/i18n.py +0 -0
  192. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/intent.py +0 -0
  193. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/intent_router.py +0 -0
  194. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/lifecycle_hooks.py +0 -0
  195. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/main.py +0 -0
  196. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/market_metadata.py +0 -0
  197. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/message_processing.py +0 -0
  198. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/model_catalog.py +0 -0
  199. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/pdf_report.py +0 -0
  200. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/plan_mode.py +0 -0
  201. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/plotly_html.py +0 -0
  202. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/prediction_feedback.py +0 -0
  203. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/preflight.py +0 -0
  204. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/project_aria.py +0 -0
  205. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/prompt_assembly.py +0 -0
  206. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/prompts/__init__.py +0 -0
  207. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/prompts/coding.py +0 -0
  208. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/prompts/system_prompts.py +0 -0
  209. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/prompts/ui.py +0 -0
  210. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/__init__.py +0 -0
  211. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/base.py +0 -0
  212. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/chat_routing.py +0 -0
  213. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/collaboration.py +0 -0
  214. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/llm/__init__.py +0 -0
  215. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/llm/sse_stream.py +0 -0
  216. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/providers/runtime_bridge.py +0 -0
  217. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/runtime_consumer.py +0 -0
  218. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/session_export.py +0 -0
  219. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/session_jsonl.py +0 -0
  220. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/session_store.py +0 -0
  221. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/skills_catalog.py +0 -0
  222. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/todo_tracker.py +0 -0
  223. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/__init__.py +0 -0
  224. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/context.py +0 -0
  225. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/file_tools.py +0 -0
  226. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/market_tools.py +0 -0
  227. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/notebook_tools.py +0 -0
  228. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tools/system_tools.py +0 -0
  229. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/tradingview_bridge.py +0 -0
  230. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/turn_planning.py +0 -0
  231. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/update_check.py +0 -0
  232. {aria_code-4.4.0 → aria_code-4.4.1}/apps/cli/utils/__init__.py +0 -0
  233. {aria_code-4.4.0 → aria_code-4.4.1}/apps/daemon/README.md +0 -0
  234. {aria_code-4.4.0 → aria_code-4.4.1}/apps/vscode/README.md +0 -0
  235. {aria_code-4.4.0 → aria_code-4.4.1}/apps/vscode/package.json +0 -0
  236. {aria_code-4.4.0 → aria_code-4.4.1}/aria_code.egg-info/dependency_links.txt +0 -0
  237. {aria_code-4.4.0 → aria_code-4.4.1}/aria_code.egg-info/entry_points.txt +0 -0
  238. {aria_code-4.4.0 → aria_code-4.4.1}/aria_code.egg-info/requires.txt +0 -0
  239. {aria_code-4.4.0 → aria_code-4.4.1}/aria_code.egg-info/top_level.txt +0 -0
  240. {aria_code-4.4.0 → aria_code-4.4.1}/aria_mcp_server.py +0 -0
  241. {aria_code-4.4.0 → aria_code-4.4.1}/aria_relay_client.py +0 -0
  242. {aria_code-4.4.0 → aria_code-4.4.1}/aria_telegram_bot.py +0 -0
  243. {aria_code-4.4.0 → aria_code-4.4.1}/ariarc.py +0 -0
  244. {aria_code-4.4.0 → aria_code-4.4.1}/artifacts.py +0 -0
  245. {aria_code-4.4.0 → aria_code-4.4.1}/backtest_engine.py +0 -0
  246. {aria_code-4.4.0 → aria_code-4.4.1}/backtest_report.py +0 -0
  247. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/__init__.py +0 -0
  248. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/automation.py +0 -0
  249. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/base.py +0 -0
  250. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/capabilities.py +0 -0
  251. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/cn/__init__.py +0 -0
  252. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/cn/easytrader_broker.py +0 -0
  253. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/cn/futu_broker.py +0 -0
  254. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/cn/longbridge_broker.py +0 -0
  255. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/cn/tiger_broker.py +0 -0
  256. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/config.py +0 -0
  257. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/intl/__init__.py +0 -0
  258. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/intl/alpaca_broker.py +0 -0
  259. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/intl/ibkr_broker.py +0 -0
  260. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/intl/trading212_broker.py +0 -0
  261. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/intl/webull_broker.py +0 -0
  262. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/paper_broker.py +0 -0
  263. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/planning.py +0 -0
  264. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/registry.py +0 -0
  265. {aria_code-4.4.0 → aria_code-4.4.1}/brokers/trading.py +0 -0
  266. {aria_code-4.4.0 → aria_code-4.4.1}/canva_client.py +0 -0
  267. {aria_code-4.4.0 → aria_code-4.4.1}/change_store.py +0 -0
  268. {aria_code-4.4.0 → aria_code-4.4.1}/clients/__init__.py +0 -0
  269. {aria_code-4.4.0 → aria_code-4.4.1}/clients/aliyun_data_client.py +0 -0
  270. {aria_code-4.4.0 → aria_code-4.4.1}/clients/aria_relay_client.py +0 -0
  271. {aria_code-4.4.0 → aria_code-4.4.1}/clients/canva_client.py +0 -0
  272. {aria_code-4.4.0 → aria_code-4.4.1}/clients/figma_client.py +0 -0
  273. {aria_code-4.4.0 → aria_code-4.4.1}/clients/kling_video_client.py +0 -0
  274. {aria_code-4.4.0 → aria_code-4.4.1}/clients/openai_image_client.py +0 -0
  275. {aria_code-4.4.0 → aria_code-4.4.1}/clients/runway_video_client.py +0 -0
  276. {aria_code-4.4.0 → aria_code-4.4.1}/clients/warehouse_erp_client.py +0 -0
  277. {aria_code-4.4.0 → aria_code-4.4.1}/command_safety.py +0 -0
  278. {aria_code-4.4.0 → aria_code-4.4.1}/computer_use_tools.py +0 -0
  279. {aria_code-4.4.0 → aria_code-4.4.1}/dashboard_generator.py +0 -0
  280. {aria_code-4.4.0 → aria_code-4.4.1}/data_analysis_tools.py +0 -0
  281. {aria_code-4.4.0 → aria_code-4.4.1}/data_cleaner.py +0 -0
  282. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/__init__.py +0 -0
  283. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/base.py +0 -0
  284. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/router.py +0 -0
  285. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/__init__.py +0 -0
  286. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/akshare_source.py +0 -0
  287. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/alpha_vantage_source.py +0 -0
  288. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/finnhub_source.py +0 -0
  289. {aria_code-4.4.0 → aria_code-4.4.1}/datasources/sources/yfinance_source.py +0 -0
  290. {aria_code-4.4.0 → aria_code-4.4.1}/doctor.py +0 -0
  291. {aria_code-4.4.0 → aria_code-4.4.1}/domain/__init__.py +0 -0
  292. {aria_code-4.4.0 → aria_code-4.4.1}/domain/backtest_engine.py +0 -0
  293. {aria_code-4.4.0 → aria_code-4.4.1}/domain/backtest_report.py +0 -0
  294. {aria_code-4.4.0 → aria_code-4.4.1}/domain/finance_formulas.py +0 -0
  295. {aria_code-4.4.0 → aria_code-4.4.1}/domain/portfolio_ledger.py +0 -0
  296. {aria_code-4.4.0 → aria_code-4.4.1}/domain/strategy_vault.py +0 -0
  297. {aria_code-4.4.0 → aria_code-4.4.1}/external_agent_runner.py +0 -0
  298. {aria_code-4.4.0 → aria_code-4.4.1}/figma_client.py +0 -0
  299. {aria_code-4.4.0 → aria_code-4.4.1}/file_analysis_tools.py +0 -0
  300. {aria_code-4.4.0 → aria_code-4.4.1}/finance_formulas.py +0 -0
  301. {aria_code-4.4.0 → aria_code-4.4.1}/football_data_client.py +0 -0
  302. {aria_code-4.4.0 → aria_code-4.4.1}/image_gen_tools.py +0 -0
  303. {aria_code-4.4.0 → aria_code-4.4.1}/intent_classifier.py +0 -0
  304. {aria_code-4.4.0 → aria_code-4.4.1}/kling_video_client.py +0 -0
  305. {aria_code-4.4.0 → aria_code-4.4.1}/licensing.py +0 -0
  306. {aria_code-4.4.0 → aria_code-4.4.1}/local_finance_tools.py +0 -0
  307. {aria_code-4.4.0 → aria_code-4.4.1}/local_image_provider.py +0 -0
  308. {aria_code-4.4.0 → aria_code-4.4.1}/local_llm_provider.py +0 -0
  309. {aria_code-4.4.0 → aria_code-4.4.1}/macro_tools.py +0 -0
  310. {aria_code-4.4.0 → aria_code-4.4.1}/markdown_pdf.py +0 -0
  311. {aria_code-4.4.0 → aria_code-4.4.1}/market_data_client.py +0 -0
  312. {aria_code-4.4.0 → aria_code-4.4.1}/mcp_client.py +0 -0
  313. {aria_code-4.4.0 → aria_code-4.4.1}/model_capability.py +0 -0
  314. {aria_code-4.4.0 → aria_code-4.4.1}/notification_tools.py +0 -0
  315. {aria_code-4.4.0 → aria_code-4.4.1}/openai_image_client.py +0 -0
  316. {aria_code-4.4.0 → aria_code-4.4.1}/packages/__init__.py +0 -0
  317. {aria_code-4.4.0 → aria_code-4.4.1}/packages/adk_bridge/market_tools.py +0 -0
  318. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_agents/__init__.py +0 -0
  319. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_agents/manifest.py +0 -0
  320. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_core/__init__.py +0 -0
  321. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_core/architecture.py +0 -0
  322. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_core/export.py +0 -0
  323. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_core/manifest.py +0 -0
  324. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_core/paths.py +0 -0
  325. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_infra/__init__.py +0 -0
  326. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_infra/arthera.py +0 -0
  327. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_infra/doctor.py +0 -0
  328. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_infra/product.py +0 -0
  329. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_mcp/__init__.py +0 -0
  330. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_mcp/bridge.py +0 -0
  331. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_mcp/circuit.py +0 -0
  332. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_mcp/config.py +0 -0
  333. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_mcp/server.py +0 -0
  334. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_mcp/tools.py +0 -0
  335. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_sdk/__init__.py +0 -0
  336. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_sdk/client.py +0 -0
  337. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_sdk/providers.py +0 -0
  338. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_sdk/streaming.py +0 -0
  339. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_sdk/types.py +0 -0
  340. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/__init__.py +0 -0
  341. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/cache.py +0 -0
  342. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/context.py +0 -0
  343. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/context_checkpoints.py +0 -0
  344. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/data.py +0 -0
  345. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/provider_health.py +0 -0
  346. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/references.py +0 -0
  347. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/registry.py +0 -0
  348. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/research_protocol.py +0 -0
  349. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/research_quality.py +0 -0
  350. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/settings.py +0 -0
  351. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_services/usage.py +0 -0
  352. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_skills/__init__.py +0 -0
  353. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_skills/catalog.py +0 -0
  354. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_skills/loader.py +0 -0
  355. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_skills/registry.py +0 -0
  356. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/__init__.py +0 -0
  357. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/financial/__init__.py +0 -0
  358. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/financial/_paths.py +0 -0
  359. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/financial/compliance.py +0 -0
  360. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/financial/factors.py +0 -0
  361. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/financial/risk_tools.py +0 -0
  362. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/financial/strategy.py +0 -0
  363. {aria_code-4.4.0 → aria_code-4.4.1}/packages/aria_tools/registry.py +0 -0
  364. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/__init__.py +0 -0
  365. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/backtest/core.py +0 -0
  366. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/portfolio/optimizer.py +0 -0
  367. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/calibrator.py +0 -0
  368. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/dixon_coles.py +0 -0
  369. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/elo.py +0 -0
  370. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/form.py +0 -0
  371. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/h2h.py +0 -0
  372. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/ml_model.py +0 -0
  373. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/predictor.py +0 -0
  374. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/sports/tracker.py +0 -0
  375. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  376. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  377. {aria_code-4.4.0 → aria_code-4.4.1}/packages/quant_engine/stochastic/options_pricing.py +0 -0
  378. {aria_code-4.4.0 → aria_code-4.4.1}/plan_utils.py +0 -0
  379. {aria_code-4.4.0 → aria_code-4.4.1}/plugin_loader.py +0 -0
  380. {aria_code-4.4.0 → aria_code-4.4.1}/portfolio_ledger.py +0 -0
  381. {aria_code-4.4.0 → aria_code-4.4.1}/preview_server.py +0 -0
  382. {aria_code-4.4.0 → aria_code-4.4.1}/privacy/__init__.py +0 -0
  383. {aria_code-4.4.0 → aria_code-4.4.1}/privacy/feedback.py +0 -0
  384. {aria_code-4.4.0 → aria_code-4.4.1}/project_tools.py +0 -0
  385. {aria_code-4.4.0 → aria_code-4.4.1}/providers/__init__.py +0 -0
  386. {aria_code-4.4.0 → aria_code-4.4.1}/providers/llm/__init__.py +0 -0
  387. {aria_code-4.4.0 → aria_code-4.4.1}/providers/llm/anthropic.py +0 -0
  388. {aria_code-4.4.0 → aria_code-4.4.1}/providers/llm/base.py +0 -0
  389. {aria_code-4.4.0 → aria_code-4.4.1}/providers/llm/openai_compat.py +0 -0
  390. {aria_code-4.4.0 → aria_code-4.4.1}/providers/local_image_provider.py +0 -0
  391. {aria_code-4.4.0 → aria_code-4.4.1}/providers/local_llm_provider.py +0 -0
  392. {aria_code-4.4.0 → aria_code-4.4.1}/realty_data_tools.py +0 -0
  393. {aria_code-4.4.0 → aria_code-4.4.1}/report_exporters.py +0 -0
  394. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/__init__.py +0 -0
  395. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/approval.py +0 -0
  396. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/checkpoints.py +0 -0
  397. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/events.py +0 -0
  398. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/gateway.py +0 -0
  399. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/lsp.py +0 -0
  400. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/run_state.py +0 -0
  401. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/run_store.py +0 -0
  402. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/subagent.py +0 -0
  403. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/task_ledger.py +0 -0
  404. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/task_orchestrator.py +0 -0
  405. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/tool_executor.py +0 -0
  406. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/tool_policy.py +0 -0
  407. {aria_code-4.4.0 → aria_code-4.4.1}/runtime/worktrees.py +0 -0
  408. {aria_code-4.4.0 → aria_code-4.4.1}/runway_video_client.py +0 -0
  409. {aria_code-4.4.0 → aria_code-4.4.1}/safety/__init__.py +0 -0
  410. {aria_code-4.4.0 → aria_code-4.4.1}/safety/permissions.py +0 -0
  411. {aria_code-4.4.0 → aria_code-4.4.1}/safety/service.py +0 -0
  412. {aria_code-4.4.0 → aria_code-4.4.1}/setup.cfg +0 -0
  413. {aria_code-4.4.0 → aria_code-4.4.1}/spreadsheet_tools.py +0 -0
  414. {aria_code-4.4.0 → aria_code-4.4.1}/strategy_vault.py +0 -0
  415. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_adk_market_tools.py +0 -0
  416. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_agent_team_fallback.py +0 -0
  417. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_analyze_file_tool.py +0 -0
  418. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_architecture_report.py +0 -0
  419. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_aria_cli_core.py +0 -0
  420. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_aria_sdk.py +0 -0
  421. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_artifacts_and_reports.py +0 -0
  422. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_backtest_cmds.py +0 -0
  423. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_backtest_engine.py +0 -0
  424. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_backtest_report.py +0 -0
  425. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_broker_automation.py +0 -0
  426. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_broker_chat_confirm_gate.py +0 -0
  427. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_broker_planning.py +0 -0
  428. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_broker_safety.py +0 -0
  429. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_business_workflow_cmds.py +0 -0
  430. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_canva_client.py +0 -0
  431. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_canvas_cmds.py +0 -0
  432. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_channel_intake.py +0 -0
  433. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_chart_handlers.py +0 -0
  434. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_chat_routing.py +0 -0
  435. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ci_security_workflow.py +0 -0
  436. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_cli_app_split.py +0 -0
  437. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_cli_bootstrap.py +0 -0
  438. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_cli_config_store.py +0 -0
  439. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_cli_lifecycle_hooks.py +0 -0
  440. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_cli_runtime_consumer.py +0 -0
  441. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_cli_tool_executor_module.py +0 -0
  442. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_code_review_agent.py +0 -0
  443. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_codegen_output.py +0 -0
  444. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_collaboration.py +0 -0
  445. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_command_safety.py +0 -0
  446. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_completions_builder.py +0 -0
  447. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_config_paths.py +0 -0
  448. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_configured_provider.py +0 -0
  449. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_context_checkpoints.py +0 -0
  450. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_context_references.py +0 -0
  451. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_context_service.py +0 -0
  452. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_dashboard_generator.py +0 -0
  453. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_data_service.py +0 -0
  454. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_data_service_imports.py +0 -0
  455. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_deep_analysis.py +0 -0
  456. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_doctor.py +0 -0
  457. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_feishu_swarm_config.py +0 -0
  458. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_finance_renderers.py +0 -0
  459. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_finance_service_catalog.py +0 -0
  460. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_football_agent.py +0 -0
  461. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_football_prediction_output.py +0 -0
  462. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_image_gen_tools.py +0 -0
  463. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_image_inputs.py +0 -0
  464. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_intent_router.py +0 -0
  465. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_kling_video_client.py +0 -0
  466. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_legacy_module_imports.py +0 -0
  467. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_licensing.py +0 -0
  468. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_lsp.py +0 -0
  469. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_markdown_pdf.py +0 -0
  470. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_market_data_client.py +0 -0
  471. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_market_history_tool.py +0 -0
  472. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_market_symbol_extraction.py +0 -0
  473. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_market_universe.py +0 -0
  474. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_mcp_circuit.py +0 -0
  475. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_mcp_client.py +0 -0
  476. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_model_selection_state.py +0 -0
  477. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_no_hardcoded_developer_paths.py +0 -0
  478. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ollama_stream_tools.py +0 -0
  479. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_output_rendering.py +0 -0
  480. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_packages_facade.py +0 -0
  481. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_packaging_manifest.py +0 -0
  482. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_pdf_report.py +0 -0
  483. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_pick_best_installed_model.py +0 -0
  484. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_plan_mode.py +0 -0
  485. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_plotly_html_output.py +0 -0
  486. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_portfolio_ledger.py +0 -0
  487. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_preflight.py +0 -0
  488. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_preview_server.py +0 -0
  489. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_privacy_feedback.py +0 -0
  490. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_project_aria.py +0 -0
  491. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_prompt_assembly.py +0 -0
  492. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_provider_integration.py +0 -0
  493. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_provider_registry.py +0 -0
  494. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_public_service_status.py +0 -0
  495. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_report_generator.py +0 -0
  496. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_research_protocol.py +0 -0
  497. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_research_quality.py +0 -0
  498. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_responsive_rendering.py +0 -0
  499. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_approval.py +0 -0
  500. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_bridge.py +0 -0
  501. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_bridge_fallback.py +0 -0
  502. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_checkpoints.py +0 -0
  503. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_gateway.py +0 -0
  504. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_run_store.py +0 -0
  505. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_tool_executor.py +0 -0
  506. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runtime_worktrees.py +0 -0
  507. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_runway_video_client.py +0 -0
  508. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_safety_permissions.py +0 -0
  509. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_service_diagnostics_security.py +0 -0
  510. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_session_search.py +0 -0
  511. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_settings_service.py +0 -0
  512. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_skill_agent_binding.py +0 -0
  513. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_skill_catalog.py +0 -0
  514. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_skill_loader.py +0 -0
  515. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_spreadsheet_tools.py +0 -0
  516. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_startup_dashboard.py +0 -0
  517. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_streaming_pipeline.py +0 -0
  518. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_subagent.py +0 -0
  519. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_supervisor_routing.py +0 -0
  520. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_system_prompts.py +0 -0
  521. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_system_tools_output.py +0 -0
  522. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_task_orchestrator.py +0 -0
  523. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_team_synthesis.py +0 -0
  524. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_tool_policy.py +0 -0
  525. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_trading_service.py +0 -0
  526. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_tradingview_bridge.py +0 -0
  527. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_turn_planning.py +0 -0
  528. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ui_completer_references.py +0 -0
  529. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ui_console_theme.py +0 -0
  530. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ui_input_box.py +0 -0
  531. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_ui_robot_banner.py +0 -0
  532. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_video_analysis.py +0 -0
  533. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_video_editor.py +0 -0
  534. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_warehouse_agents.py +0 -0
  535. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_warehouse_cli_registration.py +0 -0
  536. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_warehouse_erp_client.py +0 -0
  537. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_warehouse_workflow.py +0 -0
  538. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_workspace_context.py +0 -0
  539. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_workspace_files.py +0 -0
  540. {aria_code-4.4.0 → aria_code-4.4.1}/tests/test_workspace_verify.py +0 -0
  541. {aria_code-4.4.0 → aria_code-4.4.1}/tools/__init__.py +0 -0
  542. {aria_code-4.4.0 → aria_code-4.4.1}/tools/build_quant_engine.py +0 -0
  543. {aria_code-4.4.0 → aria_code-4.4.1}/tools/computer_use_tools.py +0 -0
  544. {aria_code-4.4.0 → aria_code-4.4.1}/tools/data_analysis_tools.py +0 -0
  545. {aria_code-4.4.0 → aria_code-4.4.1}/tools/file_analysis_tools.py +0 -0
  546. {aria_code-4.4.0 → aria_code-4.4.1}/tools/image_gen_tools.py +0 -0
  547. {aria_code-4.4.0 → aria_code-4.4.1}/tools/macro_tools.py +0 -0
  548. {aria_code-4.4.0 → aria_code-4.4.1}/tools/notification_tools.py +0 -0
  549. {aria_code-4.4.0 → aria_code-4.4.1}/tools/project_tools.py +0 -0
  550. {aria_code-4.4.0 → aria_code-4.4.1}/tools/realty_data_tools.py +0 -0
  551. {aria_code-4.4.0 → aria_code-4.4.1}/tools/spreadsheet_tools.py +0 -0
  552. {aria_code-4.4.0 → aria_code-4.4.1}/ui/__init__.py +0 -0
  553. {aria_code-4.4.0 → aria_code-4.4.1}/ui/banner.py +0 -0
  554. {aria_code-4.4.0 → aria_code-4.4.1}/ui/completer.py +0 -0
  555. {aria_code-4.4.0 → aria_code-4.4.1}/ui/console.py +0 -0
  556. {aria_code-4.4.0 → aria_code-4.4.1}/ui/image_render.py +0 -0
  557. {aria_code-4.4.0 → aria_code-4.4.1}/ui/input_box.py +0 -0
  558. {aria_code-4.4.0 → aria_code-4.4.1}/ui/render/__init__.py +0 -0
  559. {aria_code-4.4.0 → aria_code-4.4.1}/ui/render/market.py +0 -0
  560. {aria_code-4.4.0 → aria_code-4.4.1}/ui/render/responsive.py +0 -0
  561. {aria_code-4.4.0 → aria_code-4.4.1}/ui/render/team.py +0 -0
  562. {aria_code-4.4.0 → aria_code-4.4.1}/ui/robot.py +0 -0
  563. {aria_code-4.4.0 → aria_code-4.4.1}/ui/startup_dashboard.py +0 -0
  564. {aria_code-4.4.0 → aria_code-4.4.1}/video_analysis.py +0 -0
  565. {aria_code-4.4.0 → aria_code-4.4.1}/video_editor.py +0 -0
  566. {aria_code-4.4.0 → aria_code-4.4.1}/workspace/__init__.py +0 -0
  567. {aria_code-4.4.0 → aria_code-4.4.1}/workspace/files.py +0 -0
  568. {aria_code-4.4.0 → aria_code-4.4.1}/workspace/verify.py +0 -0
  569. {aria_code-4.4.0 → aria_code-4.4.1}/workspace_context.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aria-code
3
- Version: 4.4.0
3
+ Version: 4.4.1
4
4
  Summary: AI-powered financial terminal — local LLM + multi-source market data
5
5
  License: BUSL-1.1
6
6
  Project-URL: Homepage, https://github.com/artherahq/aria-code
@@ -264,7 +264,7 @@ def _format_portfolio_stats(d: Dict) -> str:
264
264
 
265
265
  high_corr = d.get("high_corr", [])
266
266
  if high_corr:
267
- lines.append(f"\nHigh-Correlation Pairs (|r|>0.70):")
267
+ lines.append("\nHigh-Correlation Pairs (|r|>0.70):")
268
268
  for p in high_corr[:5]:
269
269
  lines.append(f" {p['sym1']} ↔ {p['sym2']}: {p['corr']:+.2f}")
270
270
 
@@ -199,7 +199,7 @@ def _template_risk_report(risk: Dict, rules: Dict) -> str:
199
199
  f" 保证金: {risk['deposit_balance']:,.2f}/{risk['deposit_required']:,.2f}元\n"
200
200
  f" 风险事项 ({risk['risk_count']}项):\n"
201
201
  + "\n".join(f" [{r['level']}] {r['desc']}" for r in risk["risk_items"])
202
- + f"\n 处置建议: "
202
+ + "\n 处置建议: "
203
203
  + ("立即启动退出清算程序" if overall == "极高" else
204
204
  "发出整改通知,7日内未整改启动违约程序" if overall == "高" else
205
205
  "发出催缴通知,持续监控" if overall == "中" else "保持正常监控")
@@ -208,7 +208,7 @@ class ASharePredictionCommandsMixin:
208
208
  )
209
209
  console.print(f"[dim]{notice}[/dim]") if HAS_RICH else print(notice)
210
210
  try:
211
- service = build_prediction_service(config)
211
+ service = build_prediction_service(self.terminal.config)
212
212
  result = await asyncio.to_thread(
213
213
  service.run_once, symbols=symbols, universe=parsed.universe, limit=limit,
214
214
  period=parsed.period, strategy=parsed.strategy,
@@ -221,6 +221,23 @@ class BacktestCommandsMixin:
221
221
  if _symbol_flag:
222
222
  symbol = _symbol_flag
223
223
 
224
+ # Positional start/end dates only accepted if they look like YYYY-MM-DD
225
+ #
226
+ # 2026-08-19 修复 UnboundLocalError:这段原本在 ML / Agent 两个分支
227
+ # **之后**(第 240 行),但那两个分支在第 226/233 行就把 start_date /
228
+ # end_date 当关键字参数传了出去。也就是说 `/backtest ml ...` 和
229
+ # `/backtest agent ...` 这两条路径必然抛 UnboundLocalError——只有走到
230
+ # 后面通用分支的调用才碰巧能工作。
231
+ # mypy 的 used-before-def 一次就报了出来(4 处),AST 独立复核确认:
232
+ # start_date 首次赋值在第 240 行,而使用出现在 226、233。
233
+ _date_re = _re_bt.compile(r'^\d{4}-\d{2}-\d{2}$')
234
+ _raw_start = parts[2] if len(parts) > 2 else None
235
+ _raw_end = parts[3] if len(parts) > 3 else None
236
+ start_date = (_raw_start if _raw_start and _date_re.match(_raw_start) else None) \
237
+ or _resolved_start or "2023-01-01"
238
+ end_date = (_raw_end if _raw_end and _date_re.match(_raw_end) else None) \
239
+ or today.isoformat()
240
+
224
241
  # ── ML 信号组合回测 ──────────────────────────────────────────────────
225
242
  if strategy.lower() in ("ml", "ml_signal"):
226
243
  await self._cmd_ml_signal_backtest(parts[1:], start_date=start_date,
@@ -233,15 +250,6 @@ class BacktestCommandsMixin:
233
250
  await self._cmd_agent_backtest(symbol, start_date=start_date, end_date=end_date, capital=_initial_capital)
234
251
  return
235
252
 
236
- # Positional start/end dates only accepted if they look like YYYY-MM-DD
237
- _date_re = _re_bt.compile(r'^\d{4}-\d{2}-\d{2}$')
238
- _raw_start = parts[2] if len(parts) > 2 else None
239
- _raw_end = parts[3] if len(parts) > 3 else None
240
- start_date = (_raw_start if _raw_start and _date_re.match(_raw_start) else None) \
241
- or _resolved_start or "2023-01-01"
242
- end_date = (_raw_end if _raw_end and _date_re.match(_raw_end) else None) \
243
- or today.isoformat()
244
-
245
253
  label = f"Backtesting {strategy} on {symbol} ({start_date}→{end_date})"
246
254
  api_url = self.terminal.config.get("api_url", "http://localhost:8000")
247
255
 
@@ -504,7 +512,7 @@ class BacktestCommandsMixin:
504
512
  f" [#57606a]volume:[/#57606a] "
505
513
  f"avg {avg:,.0f} · last {last:,.0f} · coverage {coverage:.0%}"
506
514
  if avg is not None and last is not None
507
- else f" [#57606a]volume:[/#57606a] unavailable"
515
+ else " [#57606a]volume:[/#57606a] unavailable"
508
516
  )
509
517
  if d.get("report_path"):
510
518
  console.print(f" [#57606a]report:[/#57606a] {d['report_path']}")
@@ -665,7 +673,8 @@ class BacktestCommandsMixin:
665
673
  /auto-strategy momentum SPY --target sharpe=1.5
666
674
  /auto-strategy meanrev AAPL --target sharpe=1.2 --rounds 3
667
675
  """
668
- import re as _re, time as _time
676
+ import re as _re
677
+ import time as _time
669
678
 
670
679
  parts = args.split()
671
680
  strategy_type = parts[0].lower() if parts else "momentum"
@@ -719,7 +728,7 @@ class BacktestCommandsMixin:
719
728
  from artifacts import user_generated_dir as _user_generated_dir
720
729
  _fpath = _user_generated_dir() / _fname
721
730
 
722
- console.print(f" [dim]生成策略代码...[/dim]") if HAS_RICH else print(" Generating strategy...")
731
+ console.print(" [dim]生成策略代码...[/dim]") if HAS_RICH else print(" Generating strategy...")
723
732
  await self.terminal.send_message(gen_prompt)
724
733
 
725
734
  # Extract code from last response
@@ -744,7 +753,7 @@ class BacktestCommandsMixin:
744
753
  console.print(f" [dim]策略已保存: {_fpath.name}[/dim]") if HAS_RICH else print(f" Saved: {_fpath.name}")
745
754
 
746
755
  # ── Step 2: Run backtest ─────────────────────────────────────────
747
- console.print(f" [dim]运行回测...[/dim]") if HAS_RICH else print(" Running backtest...")
756
+ console.print(" [dim]运行回测...[/dim]") if HAS_RICH else print(" Running backtest...")
748
757
  bt_result = _tool_run_command({
749
758
  "command": f"python3 {_fpath}",
750
759
  "timeout": 120,
@@ -963,7 +972,10 @@ class BacktestCommandsMixin:
963
972
 
964
973
  def _scaffold_with_llm(self, project_name: str, description: str, base_dir) -> None:
965
974
  """Call the configured LLM to generate a custom project structure and write files."""
966
- import json, urllib.request, textwrap, pathlib
975
+ import json
976
+ import urllib.request
977
+ import textwrap
978
+ import pathlib
967
979
 
968
980
  ollama_url = self.terminal.config.get("ollama_url", "http://localhost:11434")
969
981
  model = self.terminal.config.get("model", "qwen2.5:7b")
@@ -1801,7 +1813,7 @@ class BacktestCommandsMixin:
1801
1813
  console.print(f"\n [green]✓ 已平仓 {name}[/green] [dim]{len(done)} 笔[/dim]")
1802
1814
  for tid, s, q, px in done:
1803
1815
  console.print(f" [red]SELL[/red] {s} × {q:g} @ {px:,.2f} [dim]#{tid}[/dim]")
1804
- console.print(f" [dim]撤销: /journal delete <id>[/dim]\n")
1816
+ console.print(" [dim]撤销: /journal delete <id>[/dim]\n")
1805
1817
  else:
1806
1818
  for tid, s, q, px in done:
1807
1819
  print(f" SELL {s} {q} @ {px} #{tid}")
@@ -1864,7 +1876,7 @@ class BacktestCommandsMixin:
1864
1876
  except Exception as e:
1865
1877
  errs.append(f"{tok} ({e})")
1866
1878
  if not targets:
1867
- console.print(f" [yellow]需要目标权重:SYM:pct% … | equal | like <策略>[/yellow]"
1879
+ console.print(" [yellow]需要目标权重:SYM:pct% … | equal | like <策略>[/yellow]"
1868
1880
  if HAS_RICH else "need targets")
1869
1881
  return
1870
1882
  syms = sorted(set(cur) | set(targets))
@@ -2376,7 +2388,8 @@ class BacktestCommandsMixin:
2376
2388
  # ML signal backtest is part of the private Arthera engine (alpha IP).
2377
2389
  # If a local Arthera checkout is present (dev), make it importable;
2378
2390
  # otherwise the import below fails and we show a Pro-feature notice.
2379
- import sys, os
2391
+ import sys
2392
+ import os
2380
2393
  _arthera_pkgs = os.environ.get("ARTHERA_ROOT") or os.path.expanduser("~/Desktop/Arthera")
2381
2394
  _arthera_pkgs = os.path.join(_arthera_pkgs, "packages")
2382
2395
  if os.path.isdir(_arthera_pkgs) and _arthera_pkgs not in sys.path:
@@ -1134,7 +1134,8 @@ class BrokerCommandsMixin:
1134
1134
  """未配置券商时显示可导航的操作菜单,选择后直接路由到对应功能。"""
1135
1135
  from aria_cli import (HAS_RICH, console, Panel, rich_box, _BROKERS_CONFIG_PATH)
1136
1136
  from ui.picker import arrow_select
1137
- import subprocess, sys as _sys
1137
+ import subprocess
1138
+ import sys as _sys
1138
1139
 
1139
1140
  if HAS_RICH:
1140
1141
  console.print(Panel(
@@ -1154,7 +1155,8 @@ class BrokerCommandsMixin:
1154
1155
  await self._cmd_broker_add("")
1155
1156
  elif idx == 1:
1156
1157
  try:
1157
- import pathlib as _pl, json as _json
1158
+ import pathlib as _pl
1159
+ import json as _json
1158
1160
  from brokers.config import print_all_templates
1159
1161
  path = _pl.Path(str(_BROKERS_CONFIG_PATH or
1160
1162
  aria_home() / "brokers.json"))
@@ -1,3 +1,20 @@
1
+ """Core slash commands mixin.
2
+
3
+ 本文件绝大多数名字(console / HAS_RICH / MODELS …)是有意留作裸名的,由
4
+ aria_cli 的 _rebind_mixin_globals() 把方法 __globals__ 指向它的命名空间来解析。
5
+
6
+ 但 pathlib 不能这么处理:它出现在 _create_scaffold() 的**参数注解**里,而注解
7
+ 在 class 语句执行时就要求值——那时候 rebind 还没发生(rebind 作用于已定义好的
8
+ 类)。所以这一个必须真的 import。
9
+
10
+ 2026-08-19 发现:此前没有这行,导致本模块在 Python 3.10–3.13 上 import 即
11
+ NameError,而这正是 requires-python = "<3.14,>=3.10" 声明支持的全部范围。
12
+ 开发机 .venv 是 3.14(PEP 649 注解惰性求值)所以一直没暴露,1352 个测试也
13
+ 全绿。已发布的 4.3.0 同样中招:pip install 后运行 aria-code 直接崩溃。
14
+ """
15
+
16
+ import pathlib
17
+
1
18
 
2
19
  class CoreCommandsMixin:
3
20
  def _cmd_rewind_unavailable(self, args: str):
@@ -1443,7 +1460,7 @@ class CoreCommandsMixin:
1443
1460
  elif not reg:
1444
1461
  config_path = str(MCP_CONFIG_PATH)
1445
1462
  console.print(f" [dim]No servers started. Configure: {config_path}[/dim]")
1446
- console.print(f" [dim]Example: add quant_engine MCP server pointing to your mcp_server.py[/dim]")
1463
+ console.print(" [dim]Example: add quant_engine MCP server pointing to your mcp_server.py[/dim]")
1447
1464
  else:
1448
1465
  for s in reg.status():
1449
1466
  color = "green" if s["running"] else "red"
@@ -1847,7 +1864,7 @@ class CoreCommandsMixin:
1847
1864
  }
1848
1865
  if HAS_RICH:
1849
1866
  console.print(f" [green]✓[/green] Pine strategy saved: [link={pine_path}]{pine_path}[/link]")
1850
- console.print(f" [dim]Use: TradingView → Pine Editor → paste script → Save → Add to chart[/dim]")
1867
+ console.print(" [dim]Use: TradingView → Pine Editor → paste script → Save → Add to chart[/dim]")
1851
1868
  else:
1852
1869
  print(f"Pine strategy saved: {pine_path}")
1853
1870
  print("Use: TradingView -> Pine Editor -> paste script -> Save -> Add to chart")
@@ -2083,7 +2100,8 @@ class CoreCommandsMixin:
2083
2100
  Usage: /shortterm
2084
2101
  /shortterm 000333 601138 300750
2085
2102
  """
2086
- import subprocess, sys as _sys
2103
+ import subprocess
2104
+ import sys as _sys
2087
2105
  _base = pathlib.Path(__file__).parent.parent.parent / "research" / "shortterm"
2088
2106
  script = _base / "run_shortterm.py"
2089
2107
  if not script.exists():
@@ -2107,7 +2125,8 @@ class CoreCommandsMixin:
2107
2125
  /longterm --quick (只分析 core 级标的)
2108
2126
  /longterm 600519 000858
2109
2127
  """
2110
- import subprocess, sys as _sys
2128
+ import subprocess
2129
+ import sys as _sys
2111
2130
  _base = pathlib.Path(__file__).parent.parent.parent / "research" / "longterm"
2112
2131
  script = _base / "run_longterm.py"
2113
2132
  if not script.exists():
@@ -2242,7 +2261,7 @@ class CoreCommandsMixin:
2242
2261
  if "数据不足" in _all_msgs or "新上市" in _all_msgs:
2243
2262
  _reason = f"[yellow]历史数据不足[/yellow] — {symbol} 上市时间较短(< 14 个交易日),TA 指标无法计算\n [dim]可待更多交易日积累后重试,或运行 `/analyze {symbol}` 查看基本面[/dim]"
2244
2263
  elif "rate" in _all_msgs or "429" in _all_msgs or "too many" in _all_msgs:
2245
- _reason = f"[yellow]数据源频率限制[/yellow] — 稍后重试,或用 `/apikey set finnhub <KEY>` 切换数据源"
2264
+ _reason = "[yellow]数据源频率限制[/yellow] — 稍后重试,或用 `/apikey set finnhub <KEY>` 切换数据源"
2246
2265
  else:
2247
2266
  _err = "; ".join(_ta_errs or _ta_warns) or "数据源暂时不可用"
2248
2267
  _reason = f"[red]{_err[:120]}[/red]"
@@ -2299,7 +2318,7 @@ class CoreCommandsMixin:
2299
2318
  }
2300
2319
  if HAS_RICH:
2301
2320
  console.print()
2302
- console.print(f" [green]✓[/green] 技术图表已生成")
2321
+ console.print(" [green]✓[/green] 技术图表已生成")
2303
2322
  if html_path:
2304
2323
  console.print(f" [dim]HTML:[/dim] [link={html_path}]{_display_path(html_path)}[/link]")
2305
2324
  if png_path:
@@ -289,7 +289,9 @@ class DiagnosticOpsCommandsMixin:
289
289
  except Exception as exc:
290
290
  console.print(f"[yellow]doctor module unavailable, using legacy checks: {exc}[/yellow]" if HAS_RICH else f"doctor module unavailable: {exc}")
291
291
 
292
- import importlib as _il, subprocess as _sp, shutil as _sh
292
+ import importlib as _il
293
+ import subprocess as _sp
294
+ import shutil as _sh
293
295
  cfg = self.terminal.config
294
296
  ollama_url = cfg.get("ollama_url", "http://localhost:11434")
295
297
  api_url = cfg.get("api_url", "http://localhost:8000")
@@ -850,7 +850,7 @@ class MarketCommandsMixin:
850
850
  _aform = getattr(pred, "away_form", "")
851
851
 
852
852
  if pred.key_factors:
853
- console.print(f"\n [bold]实力对比[/bold]")
853
+ console.print("\n [bold]实力对比[/bold]")
854
854
  for f_ in pred.key_factors:
855
855
  console.print(f" [#57606a] • {f_}[/#57606a]")
856
856
 
@@ -864,7 +864,7 @@ class MarketCommandsMixin:
864
864
  elif c == "L": out.append("[red]L[/red]")
865
865
  else: out.append(c)
866
866
  return "".join(out)
867
- console.print(f"\n [bold]近期表现[/bold]")
867
+ console.print("\n [bold]近期表现[/bold]")
868
868
  console.print(f" {_h_name_d} {_form_colored(_hform)}")
869
869
  if _aform and _aform not in ("?????", ""):
870
870
  console.print(f" {_a_name_d} {_form_colored(_aform)}")
@@ -878,7 +878,7 @@ class MarketCommandsMixin:
878
878
  ))
879
879
 
880
880
  console.print(f"\n [bold green]{pred.verdict}[/bold green]")
881
- console.print(f" [#6e7781]提示:准确比分概率通常较分散,请按候选区间参考,不构成投注建议。[/#6e7781]\n")
881
+ console.print(" [#6e7781]提示:准确比分概率通常较分散,请按候选区间参考,不构成投注建议。[/#6e7781]\n")
882
882
 
883
883
  async def cmd_screen(self, args: str):
884
884
  """股票筛选: CN → screen_ashare; US → yfinance 大盘成分筛选."""
@@ -1137,7 +1137,7 @@ class MarketCommandsMixin:
1137
1137
  _has_newsapi = bool(_data_keys.get("newsapi"))
1138
1138
  if HAS_RICH:
1139
1139
  console.print()
1140
- console.print(f" [yellow]⚠ 新闻服务不可用[/yellow]")
1140
+ console.print(" [yellow]⚠ 新闻服务不可用[/yellow]")
1141
1141
  if not _has_finnhub and not _has_newsapi:
1142
1142
  console.print(" [dim]配置以下任意一个数据服务 key 即可获取新闻:[/dim]")
1143
1143
  console.print(" [dim] Finnhub (免费60次/分) → /apikey set finnhub <key> 注册: https://finnhub.io/register[/dim]")
@@ -1147,7 +1147,7 @@ class MarketCommandsMixin:
1147
1147
  console.print(f" [dim]或使用: /web {topic} latest news — 通过 Brave 搜索[/dim]")
1148
1148
  console.print()
1149
1149
  else:
1150
- print(f" News unavailable. Configure: /apikey set finnhub <key>")
1150
+ print(" News unavailable. Configure: /apikey set finnhub <key>")
1151
1151
 
1152
1152
  async def cmd_quote(self, args: str):
1153
1153
  symbols = parse_symbols(args, self.terminal.config.get("watchlist", ["AAPL"]))
@@ -1113,7 +1113,7 @@ class ModelCommandsMixin:
1113
1113
  console.print(f"[green] {msg}[/green]") if HAS_RICH else print(f" {msg}")
1114
1114
 
1115
1115
  # ── 连接测试 ──────────────────────────────────────────────────────
1116
- print(f" 正在测试连接…", end="", flush=True)
1116
+ print(" 正在测试连接…", end="", flush=True)
1117
1117
  import asyncio as _aio
1118
1118
  loop = _aio.get_event_loop()
1119
1119
  ok, result_msg = await loop.run_in_executor(None, _test_api_key, provider, raw_key)
@@ -1134,8 +1134,57 @@ class ModelCommandsMixin:
1134
1134
  console.print("[dim] 向导已完成。输入 /apikey list 查看所有配置。[/dim]") if HAS_RICH else print("向导完成")
1135
1135
  return
1136
1136
 
1137
+ def _providers_init(self, *, force: bool = False):
1138
+ """按本机实际环境生成 ~/.aria/providers.yaml。"""
1139
+ from pathlib import Path as _P
1140
+
1141
+ try:
1142
+ from providers.llm.autoconfig import probe_environment, render_providers_yaml
1143
+ except Exception as exc:
1144
+ console.print(f"[red]无法加载配置生成器: {exc}[/red]" if HAS_RICH else f"无法加载配置生成器: {exc}")
1145
+ return
1146
+
1147
+ console.print("[dim]正在探测本机可用的模型来源…[/dim]" if HAS_RICH else "正在探测…")
1148
+ findings = probe_environment()
1149
+
1150
+ for f in findings:
1151
+ mark = "[green]✓[/green]" if f.available else "[dim]·[/dim]"
1152
+ line = f" {mark} {f.provider:<14} {f.detail}"
1153
+ console.print(line if HAS_RICH else line.replace("[green]✓[/green]", "✓").replace("[dim]·[/dim]", "·"))
1154
+
1155
+ target = _P.home() / ".aria" / "providers.yaml"
1156
+ content = render_providers_yaml(findings)
1157
+
1158
+ # 已有配置绝不静默覆盖——那可能是用户手写并调试了很久的东西。
1159
+ if target.exists() and not force:
1160
+ preview = target.with_suffix(".yaml.generated")
1161
+ preview.parent.mkdir(parents=True, exist_ok=True)
1162
+ preview.write_text(content, encoding="utf-8")
1163
+ msg = (f"\n已有配置 {target} 未改动。\n"
1164
+ f"生成结果写到 {preview},比对满意后自行替换,\n"
1165
+ f"或用 /providers init --force 直接覆盖。")
1166
+ console.print(f"[yellow]{msg}[/yellow]" if HAS_RICH else msg)
1167
+ return
1168
+
1169
+ target.parent.mkdir(parents=True, exist_ok=True)
1170
+ target.write_text(content, encoding="utf-8")
1171
+ console.print(f"\n[green]✓[/green] 已写入 {target}" if HAS_RICH else f"\n✓ 已写入 {target}")
1172
+
1173
+ if not any(f.available for f in findings):
1174
+ tip = "这台机器上还没有可用来源。最快:brew install ollama && ollama serve && ollama pull qwen2.5:7b"
1175
+ console.print(f"[yellow]{tip}[/yellow]" if HAS_RICH else tip)
1176
+
1177
+
1137
1178
  def cmd_providers(self, args: str):
1138
- """Show all LLM providers: local backends + cloud API status (Open Interpreter style)."""
1179
+ """Show all LLM providers: local backends + cloud API status (Open Interpreter style).
1180
+
1181
+ `/providers init` 额外生成一份按本机实际环境定制的 providers.yaml——
1182
+ 探测到什么就写什么,缺什么就把"去哪拿"写成注释放进同一个文件,
1183
+ 用户不必在文档和配置之间来回对照。
1184
+ """
1185
+ if args.strip().lower().startswith("init"):
1186
+ return self._providers_init(force="--force" in args)
1187
+
1139
1188
  if HAS_RICH:
1140
1189
  console.print()
1141
1190
 
@@ -1341,7 +1390,7 @@ class ModelCommandsMixin:
1341
1390
  AliyunDataClient.reset()
1342
1391
  if HAS_RICH:
1343
1392
  console.print(f" [green]Cloud API URL set to: {url}[/green]")
1344
- console.print(f" [dim]Saved to ~/.arthera/config.json[/dim]")
1393
+ console.print(" [dim]Saved to ~/.arthera/config.json[/dim]")
1345
1394
  return
1346
1395
 
1347
1396
  if sub == "data" and len(parts) >= 2:
@@ -1350,7 +1399,7 @@ class ModelCommandsMixin:
1350
1399
  AliyunDataClient.reset()
1351
1400
  if HAS_RICH:
1352
1401
  console.print(f" [green]AKShare Data URL set to: {url}[/green]")
1353
- console.print(f" [dim]Saved to ~/.arthera/config.json[/dim]")
1402
+ console.print(" [dim]Saved to ~/.arthera/config.json[/dim]")
1354
1403
  return
1355
1404
 
1356
1405
  if sub == "token" and len(parts) >= 2:
@@ -1585,7 +1634,7 @@ class ModelCommandsMixin:
1585
1634
  # Show notification/search config from resolved config.json
1586
1635
  try:
1587
1636
  import json as _j
1588
- _ncfg_path = Path(snap["config_file"])
1637
+ _ncfg_path = pathlib.Path(snap["config_file"])
1589
1638
  _ncfg = _j.loads(_ncfg_path.read_text()) if _ncfg_path.exists() else {}
1590
1639
  if _wh := _ncfg.get("notify_webhook"):
1591
1640
  console.print(f" [dim]{'notify_webhook':<24s}[/dim]{_wh[:50]}{'…' if len(_wh)>50 else ''}")
@@ -1597,7 +1646,7 @@ class ModelCommandsMixin:
1597
1646
  else:
1598
1647
  console.print(f" [dim]{'brave_key':<24s}[/dim][dim]未设置 — /config set brave_key=BSAAxxx[/dim]")
1599
1648
  # Security check: warn if providers.json has plaintext api_key
1600
- _pf = Path(snap["providers_file"])
1649
+ _pf = pathlib.Path(snap["providers_file"])
1601
1650
  if _pf.exists():
1602
1651
  try:
1603
1652
  _pd = _j.loads(_pf.read_text())
@@ -1774,7 +1823,7 @@ class ModelCommandsMixin:
1774
1823
  return
1775
1824
  elif key == "brave_key":
1776
1825
  # /config set brave_key=BSAAxxx → 写入 ~/.aria/.env
1777
- _env_path = Path.home() / ".aria" / ".env"
1826
+ _env_path = pathlib.Path.home() / ".aria" / ".env"
1778
1827
  _env_path.parent.mkdir(parents=True, exist_ok=True)
1779
1828
  existing = _env_path.read_text() if _env_path.exists() else ""
1780
1829
  import re as _re_cfg
@@ -243,8 +243,8 @@ class PortfolioCommandsMixin:
243
243
  )
244
244
  console.print(tbl)
245
245
  console.print(
246
- f" [dim]更多命令: /journal pnl | /journal trades | "
247
- f"/journal realized | /journal export[/dim]"
246
+ " [dim]更多命令: /journal pnl | /journal trades | "
247
+ "/journal realized | /journal export[/dim]"
248
248
  )
249
249
  else:
250
250
  print(f"当前持仓 ({len(positions)} 只):")
@@ -672,7 +672,7 @@ class PortfolioCommandsMixin:
672
672
  })
673
673
  if result.get("success") and result.get("data"):
674
674
  if HAS_RICH:
675
- console.print(f"\n [bold]Portfolio Risk[/bold]\n")
675
+ console.print("\n [bold]Portfolio Risk[/bold]\n")
676
676
  console.print(f"[dim]{json.dumps(result['data'], indent=2, ensure_ascii=False)[:1000]}[/dim]")
677
677
  else:
678
678
  print(json.dumps(result.get("data", {}), indent=2, ensure_ascii=False))
@@ -70,11 +70,11 @@ class WorkflowCommandsMixin:
70
70
  found.append((str(hdir), f.name, str(f)))
71
71
  if not found:
72
72
  if HAS_RICH:
73
- console.print(f" [dim]No hooks found.[/dim]")
74
- console.print(f" [dim]Hook dirs:[/dim]")
73
+ console.print(" [dim]No hooks found.[/dim]")
74
+ console.print(" [dim]Hook dirs:[/dim]")
75
75
  for d in hooks_dirs:
76
76
  console.print(f" [dim]{_display_path(d, fallback='hook dir')}[/dim]")
77
- console.print(f" [dim]Events: prompt_submit response_done tool_use compact[/dim]")
77
+ console.print(" [dim]Events: prompt_submit response_done tool_use compact[/dim]")
78
78
  else:
79
79
  print("No hooks. Dirs:", [str(d) for d in hooks_dirs])
80
80
  return
@@ -308,7 +308,7 @@ class WorkflowCommandsMixin:
308
308
  if HAS_RICH:
309
309
  console.print(f"[dim]Retrying with temperature {MODELS[orig_model_key]['temperature']:.1f}...[/dim]")
310
310
  else:
311
- print(f"Retrying (temp +0.3)...")
311
+ print("Retrying (temp +0.3)...")
312
312
  try:
313
313
  await self.terminal.send_message(last_user_msg)
314
314
  finally:
@@ -463,10 +463,10 @@ class WorkspaceCommandsMixin:
463
463
  val = v[:5] if isinstance(v, list) else v
464
464
  info_lines.append(f"[dim]{k}: {val}[/dim]")
465
465
  if fc.truncated:
466
- info_lines.append(f"[yellow]⚠ 内容已截断(文件较大)[/yellow]")
466
+ info_lines.append("[yellow]⚠ 内容已截断(文件较大)[/yellow]")
467
467
  if fc.tables:
468
468
  info_lines.append(f"[dim]包含 {len(fc.tables)} 个表格[/dim]")
469
- info_lines.append(f"\n[dim]发送任何消息即可开始分析,或使用 /file analyze 1-4[/dim]")
469
+ info_lines.append("\n[dim]发送任何消息即可开始分析,或使用 /file analyze 1-4[/dim]")
470
470
  console.print(_P("\n".join(info_lines),
471
471
  title="[bold]📄 文件已加载[/bold]",
472
472
  border_style="green", box=_box.ROUNDED))
@@ -510,7 +510,7 @@ class WorkspaceCommandsMixin:
510
510
  if len(layers_to_run) > 1 and layer < layers_to_run[-1]:
511
511
  if HAS_RICH:
512
512
  console.print(f"\n[dim]{'═'*60}[/dim]")
513
- console.print(f"[dim]进入下一层分析...[/dim]\n")
513
+ console.print("[dim]进入下一层分析...[/dim]\n")
514
514
 
515
515
  # ────────────────── /file ask ──────────────────────────────────────────
516
516
  elif sub == "ask":
@@ -638,6 +638,11 @@ class WorkspaceCommandsMixin:
638
638
 
639
639
  async def cmd_project(self, args: str):
640
640
  """项目分析 (Claude Code / Codex 风格): /project load|tree|grep|ask|task|status|info <参数>"""
641
+ # 本方法体内三处用到 _T / _box,但导入只写在别的方法里。普通方法的
642
+ # __globals__ 被 _rebind_mixin_globals 换成了 aria_cli 的,本文件模块级
643
+ # 的名字一律看不见——所以必须在方法内自己导入,跟本文件其它方法一致。
644
+ from rich.table import Table as _T
645
+ from rich import box as _box
641
646
  try:
642
647
  from project_tools import ProjectSession, scan_project, format_grep_results
643
648
  _HAS_PT = True
@@ -701,7 +706,7 @@ class WorkspaceCommandsMixin:
701
706
  tb.add_row("Git 分支", s["git"]["branch"])
702
707
  if s["git"].get("changed_count"):
703
708
  tb.add_row("变更文件", str(s["git"]["changed_count"]))
704
- console.print(f"\n[bold]项目已加载 ✓[/bold]")
709
+ console.print("\n[bold]项目已加载 ✓[/bold]")
705
710
  console.print(tb)
706
711
  console.print(f"\n[dim]关键文件: {', '.join(s['key_files'][:6])}[/dim]")
707
712
  console.print("[dim]现在可以直接对话,Aria 将根据项目上下文回答。[/dim]\n")
@@ -822,7 +827,7 @@ class WorkspaceCommandsMixin:
822
827
  tb.add_column("说明", style="dim")
823
828
  for cmd, desc in rows:
824
829
  tb.add_row(cmd, desc)
825
- console.print(f"\n[bold]/project — 项目分析命令[/bold]\n")
830
+ console.print("\n[bold]/project — 项目分析命令[/bold]\n")
826
831
  console.print(tb)
827
832
  console.print()
828
833
 
@@ -918,7 +923,7 @@ class WorkspaceCommandsMixin:
918
923
  force = "--force" in args
919
924
 
920
925
  if aria_md.exists() and not force:
921
- msg = f"ARIA.md already exists. Use /init --force to regenerate."
926
+ msg = "ARIA.md already exists. Use /init --force to regenerate."
922
927
  console.print(f"[yellow]{msg}[/yellow]") if HAS_RICH else print(msg)
923
928
  return
924
929
 
@@ -1136,7 +1141,7 @@ class WorkspaceCommandsMixin:
1136
1141
  # ── Step 4: Messaging channels (Feishu / Telegram) ──────────────────
1137
1142
  if sub in ("feishu", "telegram", "notify", "all", ""):
1138
1143
  console.print(" [bold]Step 4/5 · 消息通知连接[/bold]") if HAS_RICH else print("Step 4: Messaging")
1139
- _env_path = Path.home() / ".aria" / ".env"
1144
+ _env_path = pathlib.Path.home() / ".aria" / ".env"
1140
1145
  _env_vars: dict = {}
1141
1146
  if _env_path.exists():
1142
1147
  for _line in _env_path.read_text().splitlines():
@@ -1174,11 +1179,13 @@ class WorkspaceCommandsMixin:
1174
1179
  if sub in ("feishu", "telegram"):
1175
1180
  console.print() if HAS_RICH else print()
1176
1181
  try:
1177
- import importlib.util as _ilu
1178
- _wiz_path = Path(__file__).parent.parent.parent.parent / "setup_wizard.py"
1179
- _spec = _ilu.spec_from_file_location("_aria_setup_wizard", str(_wiz_path))
1180
- _wiz = _ilu.module_from_spec(_spec)
1181
- _spec.loader.exec_module(_wiz)
1182
+ # setup_wizard 是随包发布的顶层模块(见 pyproject py-modules),
1183
+ # 直接 import 即可。原先用 __file__ 往上数四层拼路径:这个方法
1184
+ # 的 __globals__ 被 _rebind_mixin_globals 换成了 aria_cli 的,
1185
+ # __file__ 因此指向仓库根的 aria_cli.py 而非本文件,四层 parent
1186
+ # 算出 /Users/setup_wizard.py,永远不存在——异常被下面的
1187
+ # except 吞掉,这条分支一直静默退化成"请手动运行"提示。
1188
+ import setup_wizard as _wiz
1182
1189
  _e = _wiz._load_env()
1183
1190
  if sub == "feishu":
1184
1191
  _wiz.setup_feishu(_e)
@@ -1316,7 +1323,7 @@ class WorkspaceCommandsMixin:
1316
1323
  if gsub == "show":
1317
1324
  if not _profile_path.exists():
1318
1325
  if HAS_RICH:
1319
- console.print(f"[dim]~/.arthera/ARIA.md 还不存在。用 /memory profile add <内容> 创建。[/dim]")
1326
+ console.print("[dim]~/.arthera/ARIA.md 还不存在。用 /memory profile add <内容> 创建。[/dim]")
1320
1327
  else:
1321
1328
  print("~/.arthera/ARIA.md not found. Use /memory profile add <text> to create.")
1322
1329
  return
@@ -1325,7 +1332,7 @@ class WorkspaceCommandsMixin:
1325
1332
  try:
1326
1333
  from rich.markdown import Markdown as _RMd3
1327
1334
  console.print()
1328
- console.print(f" [dim]~/.arthera/ARIA.md[/dim]")
1335
+ console.print(" [dim]~/.arthera/ARIA.md[/dim]")
1329
1336
  console.print(_RMd3(content))
1330
1337
  except Exception:
1331
1338
  console.print(content)
@@ -1352,9 +1359,9 @@ class WorkspaceCommandsMixin:
1352
1359
  # Refresh project context so change takes effect immediately
1353
1360
  _PROJECT_CONTEXT = _load_project_context()
1354
1361
  if HAS_RICH:
1355
- console.print(f" [dim]✓ 已写入 ~/.arthera/ARIA.md — 下次对话自动注入[/dim]")
1362
+ console.print(" [dim]✓ 已写入 ~/.arthera/ARIA.md — 下次对话自动注入[/dim]")
1356
1363
  else:
1357
- print(f"Saved to ~/.arthera/ARIA.md")
1364
+ print("Saved to ~/.arthera/ARIA.md")
1358
1365
 
1359
1366
  elif gsub == "clear":
1360
1367
  if _profile_path.exists():
@@ -42,10 +42,10 @@ def _football_standings(league: str) -> None:
42
42
  if not data:
43
43
  comp = _resolve_league(league)
44
44
  console.print(
45
- f"[yellow]无法获取数据。请设置 FOOTBALL_DATA_API_KEY:[/yellow]\n"
46
- f" 1. 访问 football-data.org 免费注册\n"
47
- f" 2. 在 ~/.aria/.env 中添加:\n"
48
- f" [cyan]FOOTBALL_DATA_API_KEY=your_key_here[/cyan]"
45
+ "[yellow]无法获取数据。请设置 FOOTBALL_DATA_API_KEY:[/yellow]\n"
46
+ " 1. 访问 football-data.org 免费注册\n"
47
+ " 2. 在 ~/.aria/.env 中添加:\n"
48
+ " [cyan]FOOTBALL_DATA_API_KEY=your_key_here[/cyan]"
49
49
  )
50
50
  return
51
51