aria-code 0.52.0__py3-none-any.whl

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 (478) hide show
  1. aria_code/__init__.py +42 -0
  2. aria_code/_version.py +20 -0
  3. aria_code/adk_apps/__init__.py +1 -0
  4. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  5. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  6. aria_code/adk_apps/aria_research/__init__.py +1 -0
  7. aria_code/adk_apps/aria_research/agent.py +31 -0
  8. aria_code/agents/__init__.py +34 -0
  9. aria_code/agents/base.py +318 -0
  10. aria_code/agents/code_review.py +200 -0
  11. aria_code/agents/deep/__init__.py +37 -0
  12. aria_code/agents/deep/calibration_loop.py +144 -0
  13. aria_code/agents/deep/critic.py +125 -0
  14. aria_code/agents/deep/deepen.py +193 -0
  15. aria_code/agents/deep/models.py +149 -0
  16. aria_code/agents/deep/pipeline.py +164 -0
  17. aria_code/agents/deep/quant_fusion.py +192 -0
  18. aria_code/agents/deep/themes.py +95 -0
  19. aria_code/agents/deep/tiers.py +106 -0
  20. aria_code/agents/engineering/__init__.py +14 -0
  21. aria_code/agents/engineering/coder.py +222 -0
  22. aria_code/agents/engineering/tester.py +145 -0
  23. aria_code/agents/financial/__init__.py +21 -0
  24. aria_code/agents/financial/cashflow_burn.py +119 -0
  25. aria_code/agents/financial/catalyst.py +279 -0
  26. aria_code/agents/financial/corporate_finance.py +175 -0
  27. aria_code/agents/financial/debate.py +224 -0
  28. aria_code/agents/financial/earnings.py +303 -0
  29. aria_code/agents/financial/fundamental.py +191 -0
  30. aria_code/agents/financial/macro.py +99 -0
  31. aria_code/agents/financial/news.py +207 -0
  32. aria_code/agents/financial/risk.py +165 -0
  33. aria_code/agents/financial/sector.py +279 -0
  34. aria_code/agents/financial/strategist.py +121 -0
  35. aria_code/agents/financial/stripe_revenue.py +127 -0
  36. aria_code/agents/financial/synthesis.py +274 -0
  37. aria_code/agents/financial/technical.py +258 -0
  38. aria_code/agents/orchestrator.py +44 -0
  39. aria_code/agents/portfolio_agent.py +363 -0
  40. aria_code/agents/realty/__init__.py +62 -0
  41. aria_code/agents/realty/asset_diagnosis.py +152 -0
  42. aria_code/agents/realty/business_match.py +166 -0
  43. aria_code/agents/realty/cashflow_verify.py +209 -0
  44. aria_code/agents/realty/contract_rules.py +210 -0
  45. aria_code/agents/realty/energy_anomaly.py +189 -0
  46. aria_code/agents/realty/exit_settlement.py +208 -0
  47. aria_code/agents/realty/fulfillment_risk.py +206 -0
  48. aria_code/agents/realty/ops_optimize.py +160 -0
  49. aria_code/agents/realty/revenue_share.py +215 -0
  50. aria_code/agents/registry.py +158 -0
  51. aria_code/agents/signal_scheme.py +111 -0
  52. aria_code/agents/sports/__init__.py +0 -0
  53. aria_code/agents/sports/football_agent.py +197 -0
  54. aria_code/agents/supervisor.py +113 -0
  55. aria_code/agents/team.py +492 -0
  56. aria_code/agents/warehouse/__init__.py +25 -0
  57. aria_code/agents/warehouse/contracts.py +26 -0
  58. aria_code/agents/warehouse/dashboard.py +155 -0
  59. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  60. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  61. aria_code/agents/warehouse/inventory_health.py +24 -0
  62. aria_code/agents/warehouse/local_run.py +71 -0
  63. aria_code/agents/warehouse/local_snapshot.py +132 -0
  64. aria_code/agents/warehouse/logistics_cost.py +84 -0
  65. aria_code/agents/warehouse/logistics_sync.py +21 -0
  66. aria_code/agents/warehouse/workflow.py +31 -0
  67. aria_code/aliyun_data_client.py +4 -0
  68. aria_code/apps/README.md +12 -0
  69. aria_code/apps/__init__.py +2 -0
  70. aria_code/apps/channels/README.md +15 -0
  71. aria_code/apps/channels/__init__.py +17 -0
  72. aria_code/apps/channels/intake.py +92 -0
  73. aria_code/apps/channels/registry.py +95 -0
  74. aria_code/apps/channels/tradingview.py +94 -0
  75. aria_code/apps/cli/README.md +13 -0
  76. aria_code/apps/cli/__init__.py +2 -0
  77. aria_code/apps/cli/_optional.py +120 -0
  78. aria_code/apps/cli/bootstrap.py +145 -0
  79. aria_code/apps/cli/broker_render.py +206 -0
  80. aria_code/apps/cli/codegen_paths.py +29 -0
  81. aria_code/apps/cli/commands/__init__.py +16 -0
  82. aria_code/apps/cli/commands/_business_render.py +78 -0
  83. aria_code/apps/cli/commands/_ui.py +71 -0
  84. aria_code/apps/cli/commands/analysis_cmds.py +369 -0
  85. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  86. aria_code/apps/cli/commands/auth_cmds.py +239 -0
  87. aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
  88. aria_code/apps/cli/commands/broker_cmds.py +1234 -0
  89. aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
  90. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  91. aria_code/apps/cli/commands/catalog.py +87 -0
  92. aria_code/apps/cli/commands/core_cmds.py +2520 -0
  93. aria_code/apps/cli/commands/data_cmds.py +457 -0
  94. aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
  95. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  96. aria_code/apps/cli/commands/file_cmds.py +312 -0
  97. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  98. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  99. aria_code/apps/cli/commands/market.py +434 -0
  100. aria_code/apps/cli/commands/market_cmds.py +1381 -0
  101. aria_code/apps/cli/commands/market_context.py +425 -0
  102. aria_code/apps/cli/commands/market_render.py +7 -0
  103. aria_code/apps/cli/commands/model_cmds.py +2153 -0
  104. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  105. aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
  106. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  107. aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
  108. aria_code/apps/cli/commands/report.py +437 -0
  109. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  110. aria_code/apps/cli/commands/session_cmds.py +236 -0
  111. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  112. aria_code/apps/cli/commands/team.py +669 -0
  113. aria_code/apps/cli/commands/team_render.py +8 -0
  114. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  115. aria_code/apps/cli/commands/warehouse_cmds.py +79 -0
  116. aria_code/apps/cli/commands/workflow_cmds.py +480 -0
  117. aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
  118. aria_code/apps/cli/config_paths.py +73 -0
  119. aria_code/apps/cli/config_store.py +78 -0
  120. aria_code/apps/cli/constants.py +88 -0
  121. aria_code/apps/cli/context.py +34 -0
  122. aria_code/apps/cli/deterministic.py +191 -0
  123. aria_code/apps/cli/direct.py +48 -0
  124. aria_code/apps/cli/finance_service_catalog.py +111 -0
  125. aria_code/apps/cli/football_reports.py +231 -0
  126. aria_code/apps/cli/github_app_auth.py +135 -0
  127. aria_code/apps/cli/google_login.py +196 -0
  128. aria_code/apps/cli/handlers/__init__.py +11 -0
  129. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  130. aria_code/apps/cli/handlers/chart_handlers.py +1309 -0
  131. aria_code/apps/cli/handlers/market_handlers.py +2513 -0
  132. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  133. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  134. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  135. aria_code/apps/cli/helpers.py +302 -0
  136. aria_code/apps/cli/hooks.py +180 -0
  137. aria_code/apps/cli/i18n.py +297 -0
  138. aria_code/apps/cli/intent.py +136 -0
  139. aria_code/apps/cli/intent_router.py +276 -0
  140. aria_code/apps/cli/intent_signals.py +344 -0
  141. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  142. aria_code/apps/cli/local_tool_schemas.py +536 -0
  143. aria_code/apps/cli/main.py +29 -0
  144. aria_code/apps/cli/market_metadata.py +135 -0
  145. aria_code/apps/cli/market_universe.py +487 -0
  146. aria_code/apps/cli/message_processing.py +310 -0
  147. aria_code/apps/cli/model_catalog.py +620 -0
  148. aria_code/apps/cli/pdf_report.py +977 -0
  149. aria_code/apps/cli/plan_mode.py +139 -0
  150. aria_code/apps/cli/plotly_html.py +15 -0
  151. aria_code/apps/cli/prediction_feedback.py +202 -0
  152. aria_code/apps/cli/preflight.py +502 -0
  153. aria_code/apps/cli/project_aria.py +60 -0
  154. aria_code/apps/cli/prompt_assembly.py +59 -0
  155. aria_code/apps/cli/prompts/__init__.py +0 -0
  156. aria_code/apps/cli/prompts/coding.py +53 -0
  157. aria_code/apps/cli/prompts/select.py +142 -0
  158. aria_code/apps/cli/prompts/system_prompts.py +552 -0
  159. aria_code/apps/cli/prompts/ui.py +436 -0
  160. aria_code/apps/cli/provider_endpoints.py +237 -0
  161. aria_code/apps/cli/provider_keys.py +73 -0
  162. aria_code/apps/cli/providers/__init__.py +1 -0
  163. aria_code/apps/cli/providers/base.py +521 -0
  164. aria_code/apps/cli/providers/chat_routing.py +128 -0
  165. aria_code/apps/cli/providers/collaboration.py +98 -0
  166. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  167. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  168. aria_code/apps/cli/providers/llm/ollama_stream.py +1594 -0
  169. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  170. aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
  171. aria_code/apps/cli/providers/runtime_bridge.py +353 -0
  172. aria_code/apps/cli/providers/vertexai_stream.py +316 -0
  173. aria_code/apps/cli/runtime_consumer.py +657 -0
  174. aria_code/apps/cli/sandbox.py +32 -0
  175. aria_code/apps/cli/session_export.py +120 -0
  176. aria_code/apps/cli/session_jsonl.py +208 -0
  177. aria_code/apps/cli/session_store.py +112 -0
  178. aria_code/apps/cli/skills_catalog.py +273 -0
  179. aria_code/apps/cli/todo_tracker.py +190 -0
  180. aria_code/apps/cli/tool_executor.py +823 -0
  181. aria_code/apps/cli/tool_registry.py +34 -0
  182. aria_code/apps/cli/tool_scope.py +106 -0
  183. aria_code/apps/cli/tools/__init__.py +40 -0
  184. aria_code/apps/cli/tools/context.py +46 -0
  185. aria_code/apps/cli/tools/file_tools.py +180 -0
  186. aria_code/apps/cli/tools/market_tools.py +620 -0
  187. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  188. aria_code/apps/cli/tools/system_tools.py +726 -0
  189. aria_code/apps/cli/tools/write_tools.py +845 -0
  190. aria_code/apps/cli/tradingview_bridge.py +529 -0
  191. aria_code/apps/cli/turn_planning.py +137 -0
  192. aria_code/apps/cli/update_check.py +153 -0
  193. aria_code/apps/cli/utils/__init__.py +0 -0
  194. aria_code/apps/cli/utils/market_detect.py +1597 -0
  195. aria_code/apps/daemon/README.md +14 -0
  196. aria_code/apps/vscode/README.md +115 -0
  197. aria_code/apps/vscode/package.json +70 -0
  198. aria_code/aria_cli.py +6743 -0
  199. aria_code/aria_daemon.py +1398 -0
  200. aria_code/aria_feishu_bot.py +1423 -0
  201. aria_code/aria_mcp_server.py +7 -0
  202. aria_code/aria_relay_client.py +4 -0
  203. aria_code/aria_relay_server.py +490 -0
  204. aria_code/aria_telegram_bot.py +202 -0
  205. aria_code/ariarc.py +385 -0
  206. aria_code/artifacts.py +581 -0
  207. aria_code/backtest_engine.py +4 -0
  208. aria_code/backtest_report.py +4 -0
  209. aria_code/brokers/__init__.py +78 -0
  210. aria_code/brokers/automation.py +193 -0
  211. aria_code/brokers/base.py +231 -0
  212. aria_code/brokers/capabilities.py +264 -0
  213. aria_code/brokers/cn/__init__.py +10 -0
  214. aria_code/brokers/cn/easytrader_broker.py +193 -0
  215. aria_code/brokers/cn/futu_broker.py +194 -0
  216. aria_code/brokers/cn/longbridge_broker.py +190 -0
  217. aria_code/brokers/cn/tiger_broker.py +196 -0
  218. aria_code/brokers/cn/xtquant_broker.py +225 -0
  219. aria_code/brokers/config.py +414 -0
  220. aria_code/brokers/intl/__init__.py +5 -0
  221. aria_code/brokers/intl/alpaca_broker.py +183 -0
  222. aria_code/brokers/intl/ibkr_broker.py +215 -0
  223. aria_code/brokers/intl/trading212_broker.py +183 -0
  224. aria_code/brokers/intl/webull_broker.py +156 -0
  225. aria_code/brokers/paper_broker.py +266 -0
  226. aria_code/brokers/planning.py +296 -0
  227. aria_code/brokers/registry.py +213 -0
  228. aria_code/brokers/trading.py +267 -0
  229. aria_code/canva_client.py +4 -0
  230. aria_code/change_store.py +127 -0
  231. aria_code/clients/__init__.py +0 -0
  232. aria_code/clients/aliyun_data_client.py +660 -0
  233. aria_code/clients/aria_relay_client.py +182 -0
  234. aria_code/clients/canva_client.py +284 -0
  235. aria_code/clients/figma_client.py +100 -0
  236. aria_code/clients/football_data_client.py +1671 -0
  237. aria_code/clients/kling_video_client.py +182 -0
  238. aria_code/clients/market_data_client.py +1976 -0
  239. aria_code/clients/openai_image_client.py +242 -0
  240. aria_code/clients/runway_video_client.py +157 -0
  241. aria_code/clients/warehouse_erp_client.py +105 -0
  242. aria_code/cloud_memory.py +181 -0
  243. aria_code/command_safety.py +19 -0
  244. aria_code/computer_use_tools.py +4 -0
  245. aria_code/dashboard_generator.py +579 -0
  246. aria_code/data_analysis_tools.py +4 -0
  247. aria_code/data_cleaner.py +483 -0
  248. aria_code/data_service.py +513 -0
  249. aria_code/datasources/__init__.py +23 -0
  250. aria_code/datasources/base.py +166 -0
  251. aria_code/datasources/router.py +253 -0
  252. aria_code/datasources/sources/__init__.py +15 -0
  253. aria_code/datasources/sources/akshare_source.py +269 -0
  254. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  255. aria_code/datasources/sources/edgar_source.py +219 -0
  256. aria_code/datasources/sources/finnhub_source.py +198 -0
  257. aria_code/datasources/sources/fred_source.py +223 -0
  258. aria_code/datasources/sources/tushare_source.py +143 -0
  259. aria_code/datasources/sources/web_scraper_source.py +278 -0
  260. aria_code/datasources/sources/world_bank_source.py +206 -0
  261. aria_code/datasources/sources/yfinance_source.py +152 -0
  262. aria_code/demo_player.py +207 -0
  263. aria_code/doctor.py +813 -0
  264. aria_code/domain/__init__.py +0 -0
  265. aria_code/domain/backtest_engine.py +354 -0
  266. aria_code/domain/backtest_report.py +472 -0
  267. aria_code/domain/finance_formulas.py +389 -0
  268. aria_code/domain/portfolio_ledger.py +307 -0
  269. aria_code/domain/strategy_vault.py +421 -0
  270. aria_code/evals/__init__.py +37 -0
  271. aria_code/evals/harness.py +598 -0
  272. aria_code/evals/runner.py +238 -0
  273. aria_code/external_agent_runner.py +115 -0
  274. aria_code/figma_client.py +4 -0
  275. aria_code/file_analysis_tools.py +4 -0
  276. aria_code/finance_formulas.py +4 -0
  277. aria_code/football_data_client.py +4 -0
  278. aria_code/image_gen_tools.py +4 -0
  279. aria_code/intent_classifier.py +386 -0
  280. aria_code/kling_video_client.py +4 -0
  281. aria_code/licensing.py +151 -0
  282. aria_code/local_finance_tools.py +4 -0
  283. aria_code/local_image_provider.py +4 -0
  284. aria_code/local_llm_provider.py +4 -0
  285. aria_code/macro_tools.py +4 -0
  286. aria_code/markdown_pdf.py +289 -0
  287. aria_code/market_data_client.py +4 -0
  288. aria_code/mcp_client.py +639 -0
  289. aria_code/memory_manager.py +246 -0
  290. aria_code/model_capability.py +486 -0
  291. aria_code/notification_tools.py +4 -0
  292. aria_code/openai_image_client.py +4 -0
  293. aria_code/packages/__init__.py +23 -0
  294. aria_code/packages/adk_bridge/__init__.py +11 -0
  295. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  296. aria_code/packages/adk_bridge/market_tools.py +125 -0
  297. aria_code/packages/aria_agents/__init__.py +5 -0
  298. aria_code/packages/aria_agents/manifest.py +78 -0
  299. aria_code/packages/aria_core/__init__.py +34 -0
  300. aria_code/packages/aria_core/architecture.py +269 -0
  301. aria_code/packages/aria_core/export.py +147 -0
  302. aria_code/packages/aria_core/manifest.py +65 -0
  303. aria_code/packages/aria_core/paths.py +57 -0
  304. aria_code/packages/aria_core/secure_file.py +68 -0
  305. aria_code/packages/aria_infra/__init__.py +15 -0
  306. aria_code/packages/aria_infra/arthera.py +52 -0
  307. aria_code/packages/aria_infra/doctor.py +246 -0
  308. aria_code/packages/aria_infra/product.py +40 -0
  309. aria_code/packages/aria_mcp/__init__.py +25 -0
  310. aria_code/packages/aria_mcp/bridge.py +201 -0
  311. aria_code/packages/aria_mcp/circuit.py +82 -0
  312. aria_code/packages/aria_mcp/config.py +111 -0
  313. aria_code/packages/aria_mcp/installer.py +95 -0
  314. aria_code/packages/aria_mcp/server.py +1550 -0
  315. aria_code/packages/aria_mcp/tools.py +81 -0
  316. aria_code/packages/aria_sdk/__init__.py +19 -0
  317. aria_code/packages/aria_sdk/client.py +396 -0
  318. aria_code/packages/aria_sdk/providers.py +70 -0
  319. aria_code/packages/aria_sdk/streaming.py +79 -0
  320. aria_code/packages/aria_sdk/types.py +86 -0
  321. aria_code/packages/aria_services/__init__.py +92 -0
  322. aria_code/packages/aria_services/cache.py +60 -0
  323. aria_code/packages/aria_services/context.py +356 -0
  324. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  325. aria_code/packages/aria_services/data.py +11 -0
  326. aria_code/packages/aria_services/provider_health.py +268 -0
  327. aria_code/packages/aria_services/references.py +247 -0
  328. aria_code/packages/aria_services/registry.py +249 -0
  329. aria_code/packages/aria_services/research_protocol.py +57 -0
  330. aria_code/packages/aria_services/research_quality.py +186 -0
  331. aria_code/packages/aria_services/settings.py +157 -0
  332. aria_code/packages/aria_services/usage.py +151 -0
  333. aria_code/packages/aria_skills/__init__.py +46 -0
  334. aria_code/packages/aria_skills/catalog.py +149 -0
  335. aria_code/packages/aria_skills/loader.py +455 -0
  336. aria_code/packages/aria_skills/registry.py +84 -0
  337. aria_code/packages/aria_tools/__init__.py +5 -0
  338. aria_code/packages/aria_tools/financial/__init__.py +8 -0
  339. aria_code/packages/aria_tools/financial/_paths.py +130 -0
  340. aria_code/packages/aria_tools/financial/compliance.py +31 -0
  341. aria_code/packages/aria_tools/financial/factors.py +33 -0
  342. aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
  343. aria_code/packages/aria_tools/financial/strategy.py +31 -0
  344. aria_code/packages/aria_tools/registry.py +128 -0
  345. aria_code/packages/quant_engine/__init__.py +34 -0
  346. aria_code/packages/quant_engine/_namespace.py +62 -0
  347. aria_code/packages/quant_engine/backtest/__init__.py +14 -0
  348. aria_code/packages/quant_engine/backtest/core.py +53 -0
  349. aria_code/packages/quant_engine/backtest/engine.py +96 -0
  350. aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
  351. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  352. aria_code/packages/quant_engine/sports/__init__.py +80 -0
  353. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  354. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  355. aria_code/packages/quant_engine/sports/elo.py +300 -0
  356. aria_code/packages/quant_engine/sports/form.py +188 -0
  357. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  358. aria_code/packages/quant_engine/sports/ml_model.py +377 -0
  359. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  360. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  361. aria_code/packages/quant_engine/stochastic/__init__.py +35 -0
  362. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  363. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  364. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  365. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  366. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  367. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  368. aria_code/packs/__init__.py +85 -0
  369. aria_code/packs/base.py +168 -0
  370. aria_code/packs/finance/__init__.py +250 -0
  371. aria_code/packs/logistics/__init__.py +169 -0
  372. aria_code/packs/payments/__init__.py +139 -0
  373. aria_code/packs/realty/__init__.py +190 -0
  374. aria_code/packs/registry.py +202 -0
  375. aria_code/packs/rules.py +90 -0
  376. aria_code/plan_utils.py +194 -0
  377. aria_code/plugin_loader.py +328 -0
  378. aria_code/portfolio_ledger.py +4 -0
  379. aria_code/preview_server.py +449 -0
  380. aria_code/privacy/__init__.py +5 -0
  381. aria_code/privacy/feedback.py +123 -0
  382. aria_code/project_review.py +278 -0
  383. aria_code/project_review_api.py +235 -0
  384. aria_code/project_review_server.py +18 -0
  385. aria_code/project_tools.py +4 -0
  386. aria_code/providers/__init__.py +30 -0
  387. aria_code/providers/llm/__init__.py +19 -0
  388. aria_code/providers/llm/anthropic.py +184 -0
  389. aria_code/providers/llm/autoconfig.py +213 -0
  390. aria_code/providers/llm/base.py +139 -0
  391. aria_code/providers/llm/custom.py +158 -0
  392. aria_code/providers/llm/ollama.py +129 -0
  393. aria_code/providers/llm/openai_compat.py +313 -0
  394. aria_code/providers/llm/registry.py +444 -0
  395. aria_code/providers/local_image_provider.py +202 -0
  396. aria_code/providers/local_llm_provider.py +589 -0
  397. aria_code/realty_data_tools.py +4 -0
  398. aria_code/report_exporters.py +150 -0
  399. aria_code/report_generator.py +1764 -0
  400. aria_code/runtime/__init__.py +169 -0
  401. aria_code/runtime/acceptance.py +481 -0
  402. aria_code/runtime/agent_loop.py +1520 -0
  403. aria_code/runtime/approval.py +57 -0
  404. aria_code/runtime/budget.py +232 -0
  405. aria_code/runtime/checkpoints.py +432 -0
  406. aria_code/runtime/crash_report.py +174 -0
  407. aria_code/runtime/events.py +113 -0
  408. aria_code/runtime/gateway.py +150 -0
  409. aria_code/runtime/lsp.py +484 -0
  410. aria_code/runtime/orchestrator.py +55 -0
  411. aria_code/runtime/repo_map.py +700 -0
  412. aria_code/runtime/run_state.py +127 -0
  413. aria_code/runtime/run_store.py +450 -0
  414. aria_code/runtime/self_healing.py +422 -0
  415. aria_code/runtime/subagent.py +547 -0
  416. aria_code/runtime/task_ledger.py +86 -0
  417. aria_code/runtime/task_orchestrator.py +90 -0
  418. aria_code/runtime/tool_executor.py +217 -0
  419. aria_code/runtime/tool_policy.py +107 -0
  420. aria_code/runtime/worktrees.py +215 -0
  421. aria_code/runway_video_client.py +4 -0
  422. aria_code/safety/__init__.py +23 -0
  423. aria_code/safety/permissions.py +306 -0
  424. aria_code/safety/service.py +102 -0
  425. aria_code/setup_wizard.py +673 -0
  426. aria_code/spreadsheet_tools.py +4 -0
  427. aria_code/strategy_vault.py +4 -0
  428. aria_code/tools/__init__.py +0 -0
  429. aria_code/tools/artifact_tools.py +252 -0
  430. aria_code/tools/broker_tools.py +92 -0
  431. aria_code/tools/build_quant_engine.py +97 -0
  432. aria_code/tools/code_audit_tools.py +192 -0
  433. aria_code/tools/computer_use_tools.py +504 -0
  434. aria_code/tools/data_analysis_tools.py +809 -0
  435. aria_code/tools/enterprise_finance_tools.py +156 -0
  436. aria_code/tools/extended_tools.py +240 -0
  437. aria_code/tools/file_analysis_tools.py +885 -0
  438. aria_code/tools/image_gen_tools.py +114 -0
  439. aria_code/tools/local_finance_tools.py +3417 -0
  440. aria_code/tools/logistics_tools.py +135 -0
  441. aria_code/tools/macro_tools.py +369 -0
  442. aria_code/tools/notification_tools.py +249 -0
  443. aria_code/tools/project_tools.py +525 -0
  444. aria_code/tools/realty_data_tools.py +659 -0
  445. aria_code/tools/spreadsheet_tools.py +388 -0
  446. aria_code/tools/stripe_tools.py +115 -0
  447. aria_code/ui/__init__.py +105 -0
  448. aria_code/ui/banner.py +508 -0
  449. aria_code/ui/completer.py +501 -0
  450. aria_code/ui/console.py +281 -0
  451. aria_code/ui/image_render.py +243 -0
  452. aria_code/ui/input_box.py +488 -0
  453. aria_code/ui/picker.py +201 -0
  454. aria_code/ui/render/__init__.py +11 -0
  455. aria_code/ui/render/finance.py +1705 -0
  456. aria_code/ui/render/market.py +225 -0
  457. aria_code/ui/render/output.py +775 -0
  458. aria_code/ui/render/responsive.py +75 -0
  459. aria_code/ui/render/team.py +354 -0
  460. aria_code/ui/robot.py +235 -0
  461. aria_code/ui/startup_dashboard.py +109 -0
  462. aria_code/utils/vscode_uri.py +37 -0
  463. aria_code/video_analysis.py +147 -0
  464. aria_code/video_editor.py +271 -0
  465. aria_code/workspace/__init__.py +6 -0
  466. aria_code/workspace/files.py +193 -0
  467. aria_code/workspace/verify.py +113 -0
  468. aria_code/workspace_changes.py +199 -0
  469. aria_code/workspace_context.py +233 -0
  470. aria_code/workspace_service.py +196 -0
  471. aria_code/workspace_tools.py +150 -0
  472. aria_code-0.52.0.dist-info/METADATA +237 -0
  473. aria_code-0.52.0.dist-info/RECORD +478 -0
  474. aria_code-0.52.0.dist-info/WHEEL +5 -0
  475. aria_code-0.52.0.dist-info/entry_points.txt +3 -0
  476. aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
  477. aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
  478. aria_code-0.52.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,306 @@
1
+ """Unified permission and command-risk policy for Aria Code."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shlex
6
+ from dataclasses import dataclass
7
+ from enum import Enum
8
+ from typing import Any, Dict
9
+
10
+
11
+ SAFE_POLICIES = {"safe", "balanced", "full"}
12
+
13
+
14
+ class PermissionMode(str, Enum):
15
+ READ_ONLY = "read-only"
16
+ WORKSPACE_WRITE = "workspace-write"
17
+ FULL_ACCESS = "full-access"
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class PolicyDecision:
22
+ allowed: bool
23
+ normalized_command: str
24
+ policy: str
25
+ risk: str
26
+ reason: str = ""
27
+ requires_approval: bool = False
28
+ network: bool = False
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class PermissionDecision:
33
+ allowed: bool
34
+ requires_approval: bool
35
+ risk: str
36
+ reason: str
37
+ normalized_command: str = ""
38
+ network: bool = False
39
+
40
+
41
+ def normalize_command(command) -> str:
42
+ """Normalize common macOS command aliases used by models/users."""
43
+ if isinstance(command, list):
44
+ import shlex as _shlex
45
+ command = _shlex.join(str(c) for c in command)
46
+ raw = (command or "").strip()
47
+ if not raw:
48
+ return ""
49
+ try:
50
+ parts = shlex.split(raw)
51
+ except ValueError:
52
+ parts = []
53
+ if parts:
54
+ if parts[0] == "python":
55
+ parts[0] = "python3"
56
+ elif parts[0] == "pip":
57
+ parts[0] = "pip3"
58
+ return shlex.join(parts)
59
+ if raw.startswith("python ") and not raw.startswith("python3"):
60
+ return "python3" + raw[6:]
61
+ if raw == "python":
62
+ return "python3"
63
+ if raw.startswith("pip ") and not raw.startswith("pip3"):
64
+ return "pip3" + raw[3:]
65
+ if raw == "pip":
66
+ return "pip3"
67
+ return raw
68
+
69
+
70
+ def command_uses_network(command: str) -> bool:
71
+ stripped = command.lower().strip()
72
+ network_prefixes = (
73
+ "curl ", "wget ", "http ", "https ", "gh ", "git fetch", "git pull",
74
+ "git push", "pip3 install", "pip install", "npm install", "npm i ",
75
+ "pnpm install", "yarn install", "brew install",
76
+ )
77
+ return any(stripped.startswith(prefix) for prefix in network_prefixes)
78
+
79
+
80
+ def is_verification_command(command: str) -> bool:
81
+ stripped = command.lower().strip()
82
+ prefixes = (
83
+ "python3 -m py_compile",
84
+ "python -m py_compile",
85
+ "python3 -m pytest",
86
+ "python -m pytest",
87
+ "pytest",
88
+ "npm test",
89
+ "npm run test",
90
+ "npm run build",
91
+ "npx tsc --noemit",
92
+ "npx tsc --noEmit".lower(),
93
+ "tsc --noemit",
94
+ "go test",
95
+ "cargo test",
96
+ "mypy",
97
+ "ruff check",
98
+ )
99
+ return any(stripped.startswith(prefix) for prefix in prefixes)
100
+
101
+
102
+ def classify_command_risk(command) -> str:
103
+ """Classify command risk into low/medium/high."""
104
+ if isinstance(command, list):
105
+ import shlex as _shlex
106
+ command = _shlex.join(str(c) for c in command)
107
+ normalized = f" {str(command).lower().strip()} "
108
+ stripped = normalized.strip()
109
+
110
+ high_risk_patterns = (
111
+ " rm ", " rm -", "chmod ", "chown ", "mkfs", "dd if=", "docker ", "kubectl ",
112
+ "shutdown", "reboot", "systemctl ", "launchctl ", "passwd", "sudo ",
113
+ "git push", "git reset --hard", "git checkout --", "mv ",
114
+ "> /dev/", ":(){ :", "fork bomb",
115
+ )
116
+ low_risk_prefixes = (
117
+ "ls", "pwd", "echo", "cat ", "head ", "tail ", "rg ", "find ", "git status",
118
+ "git diff", "git log", "which ", "whoami", "date", "uname ", "env",
119
+ "python3 --version", "node --version", "npm --version",
120
+ )
121
+ medium_risk_prefixes = (
122
+ "pip ", "pip3 ", "npm install", "npm i ", "npm run ", "python ", "python3 ",
123
+ "pytest", "make ", "go test", "cargo test", "git commit", "git pull", "git merge",
124
+ "gh ", "curl ", "wget ",
125
+ )
126
+
127
+ if any(pattern in normalized for pattern in high_risk_patterns):
128
+ return "high"
129
+ if stripped.startswith(low_risk_prefixes):
130
+ return "low"
131
+ if stripped.startswith(medium_risk_prefixes) or is_verification_command(stripped):
132
+ return "medium"
133
+ return "medium"
134
+
135
+
136
+ class PermissionService:
137
+ """Central policy for tools and shell-command execution."""
138
+
139
+ READ_TOOLS = {"read_file", "list_files", "search_code", "project_context", "git_status", "git_diff"}
140
+ WRITE_TOOLS = {"write_file", "edit_file", "apply_change", "apply_patch", "reject_change"}
141
+
142
+ def __init__(
143
+ self,
144
+ mode: PermissionMode | str = PermissionMode.WORKSPACE_WRITE,
145
+ command_policy: str = "safe",
146
+ network_enabled: bool = True,
147
+ ) -> None:
148
+ try:
149
+ self.mode = PermissionMode(mode)
150
+ except ValueError:
151
+ self.mode = PermissionMode.WORKSPACE_WRITE
152
+ self.command_policy = command_policy if command_policy in SAFE_POLICIES else "safe"
153
+ self.network_enabled = network_enabled
154
+
155
+ def evaluate_tool(self, tool_name: str, params: Dict[str, Any] | None = None) -> PermissionDecision:
156
+ name = (tool_name or "").strip()
157
+ if name in self.READ_TOOLS:
158
+ return PermissionDecision(True, False, "low", "Read-only tool allowed.")
159
+ if name in self.WRITE_TOOLS:
160
+ if self.mode == PermissionMode.READ_ONLY:
161
+ return PermissionDecision(False, False, "medium", "Writes are blocked in read-only mode.")
162
+ return PermissionDecision(
163
+ True,
164
+ self.mode != PermissionMode.FULL_ACCESS,
165
+ "medium",
166
+ "Write requires review or explicit approval before disk mutation.",
167
+ )
168
+ if name == "run_command":
169
+ return self.evaluate_command(str((params or {}).get("command", "")))
170
+ return PermissionDecision(False, False, "unknown", f"Unknown tool '{name}' is blocked.")
171
+
172
+ def evaluate_command(self, command: str, policy: str | None = None) -> PermissionDecision:
173
+ decision = evaluate_command_policy(
174
+ command,
175
+ policy or self.command_policy,
176
+ mode=self.mode.value,
177
+ network_enabled=self.network_enabled,
178
+ )
179
+ return PermissionDecision(
180
+ allowed=decision.allowed,
181
+ requires_approval=decision.requires_approval,
182
+ risk=decision.risk,
183
+ reason=decision.reason or "Command allowed.",
184
+ normalized_command=decision.normalized_command,
185
+ network=decision.network,
186
+ )
187
+
188
+
189
+ def evaluate_command_policy(
190
+ command: str,
191
+ policy: str = "safe",
192
+ *,
193
+ mode: str = PermissionMode.WORKSPACE_WRITE.value,
194
+ network_enabled: bool = True,
195
+ ) -> PolicyDecision:
196
+ """Return policy decision for command execution."""
197
+ normalized = normalize_command(command)
198
+ selected_policy = (policy or "safe").strip().lower()
199
+ if selected_policy not in SAFE_POLICIES:
200
+ selected_policy = "safe"
201
+ try:
202
+ selected_mode = PermissionMode(mode)
203
+ except ValueError:
204
+ # Fail closed. An unrecognised mode used to resolve to WORKSPACE_WRITE,
205
+ # which is more permissive than READ_ONLY, not less: under read-only a
206
+ # write command is a hard block, while under workspace-write it is a
207
+ # block the user can unlock by approving. Resolving an invalid value to
208
+ # the laxer of the two turns a typo โ€” or a caller passing a *policy*
209
+ # name into the *mode* slot โ€” into an approval prompt that should never
210
+ # have been offered.
211
+ selected_mode = PermissionMode.READ_ONLY
212
+
213
+ risk = classify_command_risk(normalized)
214
+ network = command_uses_network(normalized)
215
+ if network and not network_enabled:
216
+ return PolicyDecision(
217
+ allowed=False,
218
+ normalized_command=normalized,
219
+ policy=selected_policy,
220
+ risk=risk,
221
+ reason=f"Network command blocked by policy: {normalized}",
222
+ requires_approval=False,
223
+ network=True,
224
+ )
225
+ if selected_mode == PermissionMode.READ_ONLY and risk != "low":
226
+ return PolicyDecision(
227
+ allowed=False,
228
+ normalized_command=normalized,
229
+ policy=selected_policy,
230
+ risk=risk,
231
+ reason=f"Command blocked by read-only mode (risk={risk}): {normalized}",
232
+ requires_approval=False,
233
+ network=network,
234
+ )
235
+ if risk == "high" and selected_policy != "full":
236
+ return PolicyDecision(
237
+ allowed=False,
238
+ normalized_command=normalized,
239
+ policy=selected_policy,
240
+ risk=risk,
241
+ reason=(
242
+ f"Command blocked by policy '{selected_policy}' (risk={risk}): {normalized}. "
243
+ "Use /config set command_policy=full only if you understand the risk."
244
+ ),
245
+ requires_approval=selected_policy == "balanced",
246
+ network=network,
247
+ )
248
+ # Verification is the one class of command the agent must be able to run
249
+ # under the default policy. `safe` blocked pytest, py_compile, npm test and
250
+ # tsc --noEmit, so the loop could write a fix and then had no way to find
251
+ # out whether it worked โ€” and the model said so out loud: "็”ฑไบŽๅฎ‰ๅ…จ็ญ–็•ฅ็š„
252
+ # ้™ๅˆถ๏ผŒๆˆ‘ๆ— ๆณ•ๆ‰ง่กŒ pytest ... ไฝ†ๆˆ‘็›ธไฟกๆต‹่ฏ•ๅบ”่ฏฅ่ƒฝๅคŸ้€š่ฟ‡". An agent that
253
+ # cannot check its own work is guessing, and the whole acceptance gate rests
254
+ # on being able to run exactly these commands.
255
+ #
256
+ # The exposure is small and bounded by what `is_verification_command`
257
+ # matches: test and type-check runners, anchored at the start of the
258
+ # command. It stays subject to read-only mode and to the network rule
259
+ # above, and `high` risk was already rejected before this point โ€” so a
260
+ # command like `pytest && rm -rf /` never reaches here.
261
+ if selected_policy == "safe" and risk != "low" and is_verification_command(normalized):
262
+ return PolicyDecision(
263
+ allowed=True,
264
+ normalized_command=normalized,
265
+ policy=selected_policy,
266
+ risk=risk,
267
+ reason="",
268
+ requires_approval=False,
269
+ network=network,
270
+ )
271
+
272
+ if selected_policy == "safe" and risk != "low":
273
+ extra = ""
274
+ norm_low = normalized.lower()
275
+ if "pip3" in norm_low or "pip " in norm_low or norm_low.startswith("pip"):
276
+ extra = (
277
+ "\n\n๐Ÿ’ก ไพ่ต–ๅฎ‰่ฃ…ๆ็คบ๏ผš่ฟ่กŒ `/config set command_policy=balanced` ๅŽ้‡่ฏ•๏ผŒ"
278
+ "ๆˆ–ๆ‰‹ๅŠจๅœจ็ปˆ็ซฏๆ‰ง่กŒ่ฏฅๅ‘ฝไปคใ€‚ไธ่ฆ้‡่ฏ•็›ธๅŒๅ‘ฝไปค๏ผ"
279
+ )
280
+ elif "python" in norm_low and ("~/" in normalized or "/Desktop/" in normalized):
281
+ extra = (
282
+ "\n\n๐Ÿ’ก ่„šๆœฌๆ‰ง่กŒๆ็คบ๏ผš่ฟ่กŒ `/config set command_policy=balanced` ๅŽ้‡่ฏ•ใ€‚"
283
+ "ไธ่ฆ้‡่ฏ•็›ธๅŒๅ‘ฝไปค๏ผ"
284
+ )
285
+ return PolicyDecision(
286
+ allowed=False,
287
+ normalized_command=normalized,
288
+ policy=selected_policy,
289
+ risk=risk,
290
+ reason=(
291
+ f"Command blocked by policy '{selected_policy}' (risk={risk}): {normalized}. "
292
+ "Use /config set command_policy=balanced or /run --dry-run <cmd> first."
293
+ + extra
294
+ ),
295
+ requires_approval=True,
296
+ network=network,
297
+ )
298
+ return PolicyDecision(
299
+ allowed=True,
300
+ normalized_command=normalized,
301
+ policy=selected_policy,
302
+ risk=risk,
303
+ reason="",
304
+ requires_approval=False,
305
+ network=network,
306
+ )
@@ -0,0 +1,102 @@
1
+ """SafetyService โ€” one facade over Aria's three safety domains.
2
+
3
+ The architecture contract's safety layer calls for command policy, broker
4
+ risk policy, and privacy controls to be reachable through a single service
5
+ (registry spec ``safety`` โ†’ SafetyService, capabilities: command.policy,
6
+ privacy, audit, sandbox). The three implementations already exist and stay
7
+ where they are; this facade composes them behind one config-driven object so
8
+ launcher/daemon/CLI/MCP consumers stop reaching into three packages with
9
+ three different conventions:
10
+
11
+ โ€ข command/tool policy โ†’ safety.permissions.PermissionService
12
+ โ€ข privacy controls โ†’ privacy.PrivacySettings (lazy import)
13
+ โ€ข broker/trading risk โ†’ brokers.trading policy helpers (lazy import)
14
+
15
+ Cross-domain imports are deferred to call time, so importing ``safety``
16
+ never drags in broker or privacy modules (mirrors SettingsService's
17
+ injection-clean layering).
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ from typing import Any, Dict, Optional
23
+
24
+ from .permissions import PermissionDecision, PermissionService, classify_command_risk
25
+
26
+
27
+ class SafetyService:
28
+ """Config-driven facade over command, privacy, and trading safety."""
29
+
30
+ def __init__(self, config: Optional[Dict[str, Any]] = None) -> None:
31
+ self._config: Dict[str, Any] = dict(config or {})
32
+ self._permissions = self._build_permissions(self._config)
33
+
34
+ # โ”€โ”€ lifecycle โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
35
+
36
+ @staticmethod
37
+ def _build_permissions(config: Dict[str, Any]) -> PermissionService:
38
+ return PermissionService(
39
+ mode=config.get("permission_mode", "workspace-write"),
40
+ command_policy=config.get("command_policy", "safe"),
41
+ network_enabled=bool(config.get("network_enabled", True)),
42
+ )
43
+
44
+ def refresh(self, config: Dict[str, Any]) -> None:
45
+ """Rebuild policy state after a config change (e.g. /config set)."""
46
+ self._config = dict(config)
47
+ self._permissions = self._build_permissions(self._config)
48
+
49
+ # โ”€โ”€ command / tool policy (capability: command.policy) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
50
+
51
+ @property
52
+ def permissions(self) -> PermissionService:
53
+ return self._permissions
54
+
55
+ def evaluate_tool(self, tool_name: str, params: Optional[Dict[str, Any]] = None) -> PermissionDecision:
56
+ return self._permissions.evaluate_tool(tool_name, params)
57
+
58
+ def evaluate_command(self, command: str, policy: Optional[str] = None) -> PermissionDecision:
59
+ return self._permissions.evaluate_command(command, policy)
60
+
61
+ def classify_risk(self, command: str) -> str:
62
+ return classify_command_risk(command)
63
+
64
+ # โ”€โ”€ privacy controls (capability: privacy) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
65
+
66
+ def privacy(self):
67
+ """Current PrivacySettings derived from config."""
68
+ # Package-qualified on purpose. The bare `privacy` and the packaged
69
+ # `aria_code.privacy` are distinct module objects with distinct class
70
+ # objects, and every other caller in the tree uses the packaged form โ€”
71
+ # importing it bare here handed those callers a PrivacySettings that
72
+ # was not the PrivacySettings they compare against.
73
+ #
74
+ # The trading helpers below stay bare precisely because the opposite is
75
+ # true there: every brokers.trading caller in the tree is bare, so the
76
+ # packaged form is what would split the class.
77
+ from aria_code.privacy import PrivacySettings
78
+ return PrivacySettings.from_config(self._config)
79
+
80
+ # โ”€โ”€ broker / trading risk (capability: audit โ€” trading is the audited
81
+ # domain today; the jsonl audit sink lives with the trading policy) โ”€โ”€โ”€
82
+
83
+ def trading_policy(self, broker_type: str = ""):
84
+ """TradingPolicy resolved from config (paper/live, confirm, limits)."""
85
+ from brokers.trading import policy_from_config
86
+ return policy_from_config(self._config, broker_type)
87
+
88
+ def trading_mode(self, broker_type: str = "") -> str:
89
+ from brokers.trading import resolve_trading_mode
90
+ return resolve_trading_mode(self._config, broker_type)
91
+
92
+ def trading_dry_run(self) -> bool:
93
+ """Global operational kill-switch (env ARIA_DRY_RUN).
94
+
95
+ The name matters: this docstring is the only documentation the switch
96
+ has โ€” no .md file mentions it โ€” and it used to name a variable that
97
+ nothing reads. Anyone who followed it to freeze live trading got no
98
+ freeze and no error. tests/test_env_switch_docs.py now fails if any
99
+ docstring names an ARIA_* variable the tree never reads.
100
+ """
101
+ from brokers.trading import global_dry_run
102
+ return global_dry_run()