aria-code 0.167.0__py3-none-win_amd64.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 (601) hide show
  1. aria_bots/__init__.py +7 -0
  2. aria_bots/channels/README.md +97 -0
  3. aria_bots/channels/__init__.py +1 -0
  4. aria_bots/channels/approvals.py +263 -0
  5. aria_bots/channels/conversation.py +280 -0
  6. aria_bots/channels/digest.py +186 -0
  7. aria_bots/channels/registry.py +95 -0
  8. aria_bots/engine.py +144 -0
  9. aria_bots/feishu_bot.py +1385 -0
  10. aria_bots/logistics/__init__.py +1 -0
  11. aria_bots/logistics/carriers.py +253 -0
  12. aria_bots/logistics/freight.py +154 -0
  13. aria_bots/logistics/inventory.py +242 -0
  14. aria_bots/logistics/mcp_server.py +156 -0
  15. aria_bots/logistics/records.py +119 -0
  16. aria_bots/logistics/tenancy.py +152 -0
  17. aria_bots/market.py +91 -0
  18. aria_bots/relay_client.py +326 -0
  19. aria_bots/telegram_bot.py +299 -0
  20. aria_code/__init__.py +111 -0
  21. aria_code/_bin/aria-native.exe +0 -0
  22. aria_code/_bin/aria-runtime.exe +0 -0
  23. aria_code/_version.py +20 -0
  24. aria_code/account_memory.py +296 -0
  25. aria_code/account_session.py +166 -0
  26. aria_code/adk_apps/__init__.py +1 -0
  27. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  28. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  29. aria_code/adk_apps/aria_research/__init__.py +1 -0
  30. aria_code/adk_apps/aria_research/agent.py +31 -0
  31. aria_code/agents/__init__.py +49 -0
  32. aria_code/agents/base.py +329 -0
  33. aria_code/agents/code_review.py +200 -0
  34. aria_code/agents/deep/__init__.py +37 -0
  35. aria_code/agents/deep/calibration_loop.py +144 -0
  36. aria_code/agents/deep/critic.py +125 -0
  37. aria_code/agents/deep/deepen.py +193 -0
  38. aria_code/agents/deep/models.py +149 -0
  39. aria_code/agents/deep/pipeline.py +164 -0
  40. aria_code/agents/deep/quant_fusion.py +192 -0
  41. aria_code/agents/deep/themes.py +95 -0
  42. aria_code/agents/deep/tiers.py +106 -0
  43. aria_code/agents/engineering/__init__.py +14 -0
  44. aria_code/agents/engineering/coder.py +222 -0
  45. aria_code/agents/engineering/tester.py +145 -0
  46. aria_code/agents/financial/__init__.py +21 -0
  47. aria_code/agents/financial/cashflow_burn.py +119 -0
  48. aria_code/agents/financial/catalyst.py +279 -0
  49. aria_code/agents/financial/corporate_finance.py +175 -0
  50. aria_code/agents/financial/debate.py +224 -0
  51. aria_code/agents/financial/earnings.py +315 -0
  52. aria_code/agents/financial/fundamental.py +178 -0
  53. aria_code/agents/financial/macro.py +111 -0
  54. aria_code/agents/financial/news.py +231 -0
  55. aria_code/agents/financial/risk.py +146 -0
  56. aria_code/agents/financial/sector.py +279 -0
  57. aria_code/agents/financial/strategist.py +121 -0
  58. aria_code/agents/financial/stripe_revenue.py +127 -0
  59. aria_code/agents/financial/synthesis.py +274 -0
  60. aria_code/agents/financial/technical.py +277 -0
  61. aria_code/agents/orchestrator.py +44 -0
  62. aria_code/agents/portfolio_agent.py +392 -0
  63. aria_code/agents/realty/__init__.py +62 -0
  64. aria_code/agents/realty/asset_diagnosis.py +152 -0
  65. aria_code/agents/realty/business_match.py +166 -0
  66. aria_code/agents/realty/cashflow_verify.py +209 -0
  67. aria_code/agents/realty/contract_rules.py +210 -0
  68. aria_code/agents/realty/energy_anomaly.py +189 -0
  69. aria_code/agents/realty/exit_settlement.py +208 -0
  70. aria_code/agents/realty/fulfillment_risk.py +206 -0
  71. aria_code/agents/realty/ops_optimize.py +160 -0
  72. aria_code/agents/realty/revenue_share.py +215 -0
  73. aria_code/agents/registry.py +168 -0
  74. aria_code/agents/signal_scheme.py +111 -0
  75. aria_code/agents/sports/__init__.py +0 -0
  76. aria_code/agents/sports/football_agent.py +197 -0
  77. aria_code/agents/supervisor.py +113 -0
  78. aria_code/agents/team.py +500 -0
  79. aria_code/agents/video/__init__.py +16 -0
  80. aria_code/agents/video/director.py +376 -0
  81. aria_code/agents/video/qa_agent.py +143 -0
  82. aria_code/agents/video/script_doctor.py +112 -0
  83. aria_code/agents/warehouse/__init__.py +25 -0
  84. aria_code/agents/warehouse/contracts.py +26 -0
  85. aria_code/agents/warehouse/dashboard.py +155 -0
  86. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  87. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  88. aria_code/agents/warehouse/inventory_health.py +24 -0
  89. aria_code/agents/warehouse/local_run.py +71 -0
  90. aria_code/agents/warehouse/local_snapshot.py +132 -0
  91. aria_code/agents/warehouse/logistics_cost.py +84 -0
  92. aria_code/agents/warehouse/logistics_sync.py +21 -0
  93. aria_code/agents/warehouse/navigation.schema.json +110 -0
  94. aria_code/agents/warehouse/task_agent.py +172 -0
  95. aria_code/agents/warehouse/workflow.py +31 -0
  96. aria_code/aliyun_data_client.py +4 -0
  97. aria_code/apps/README.md +12 -0
  98. aria_code/apps/__init__.py +2 -0
  99. aria_code/apps/channels/README.md +9 -0
  100. aria_code/apps/channels/__init__.py +17 -0
  101. aria_code/apps/channels/approvals.py +11 -0
  102. aria_code/apps/channels/conversation.py +11 -0
  103. aria_code/apps/channels/digest.py +11 -0
  104. aria_code/apps/channels/intake.py +92 -0
  105. aria_code/apps/channels/registry.py +11 -0
  106. aria_code/apps/channels/tradingview.py +94 -0
  107. aria_code/apps/cli/README.md +13 -0
  108. aria_code/apps/cli/__init__.py +2 -0
  109. aria_code/apps/cli/_optional.py +120 -0
  110. aria_code/apps/cli/app_server.py +656 -0
  111. aria_code/apps/cli/auto_update.py +125 -0
  112. aria_code/apps/cli/bootstrap.py +206 -0
  113. aria_code/apps/cli/broker_render.py +206 -0
  114. aria_code/apps/cli/chat_turn.py +1327 -0
  115. aria_code/apps/cli/cloud_models.py +231 -0
  116. aria_code/apps/cli/codegen_paths.py +29 -0
  117. aria_code/apps/cli/commands/__init__.py +34 -0
  118. aria_code/apps/cli/commands/_business_render.py +78 -0
  119. aria_code/apps/cli/commands/_ui.py +71 -0
  120. aria_code/apps/cli/commands/analysis_cmds.py +378 -0
  121. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  122. aria_code/apps/cli/commands/auth_cmds.py +215 -0
  123. aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
  124. aria_code/apps/cli/commands/broker_cmds.py +1236 -0
  125. aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
  126. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  127. aria_code/apps/cli/commands/catalog.py +189 -0
  128. aria_code/apps/cli/commands/core_cmds.py +2748 -0
  129. aria_code/apps/cli/commands/data_cmds.py +521 -0
  130. aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
  131. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  132. aria_code/apps/cli/commands/engineering_cmds.py +399 -0
  133. aria_code/apps/cli/commands/file_cmds.py +312 -0
  134. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  135. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  136. aria_code/apps/cli/commands/market.py +544 -0
  137. aria_code/apps/cli/commands/market_cmds.py +1419 -0
  138. aria_code/apps/cli/commands/market_context.py +432 -0
  139. aria_code/apps/cli/commands/market_render.py +7 -0
  140. aria_code/apps/cli/commands/model_cmds.py +2374 -0
  141. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  142. aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
  143. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  144. aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
  145. aria_code/apps/cli/commands/report.py +476 -0
  146. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  147. aria_code/apps/cli/commands/session_cmds.py +236 -0
  148. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  149. aria_code/apps/cli/commands/team.py +723 -0
  150. aria_code/apps/cli/commands/team_render.py +8 -0
  151. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  152. aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
  153. aria_code/apps/cli/commands/workflow_cmds.py +629 -0
  154. aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
  155. aria_code/apps/cli/config_paths.py +73 -0
  156. aria_code/apps/cli/config_store.py +158 -0
  157. aria_code/apps/cli/constants.py +88 -0
  158. aria_code/apps/cli/context.py +34 -0
  159. aria_code/apps/cli/conversation_policy.py +53 -0
  160. aria_code/apps/cli/deterministic.py +200 -0
  161. aria_code/apps/cli/direct.py +48 -0
  162. aria_code/apps/cli/earnings_view.py +172 -0
  163. aria_code/apps/cli/endpoint_migration.py +64 -0
  164. aria_code/apps/cli/exec_events.py +255 -0
  165. aria_code/apps/cli/file_references.py +155 -0
  166. aria_code/apps/cli/finance_service_catalog.py +111 -0
  167. aria_code/apps/cli/football_reports.py +231 -0
  168. aria_code/apps/cli/github_app_auth.py +135 -0
  169. aria_code/apps/cli/google_login.py +239 -0
  170. aria_code/apps/cli/handlers/__init__.py +11 -0
  171. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  172. aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
  173. aria_code/apps/cli/handlers/market_handlers.py +2570 -0
  174. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  175. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  176. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  177. aria_code/apps/cli/headless.py +352 -0
  178. aria_code/apps/cli/helpers.py +326 -0
  179. aria_code/apps/cli/hooks.py +180 -0
  180. aria_code/apps/cli/i18n.py +310 -0
  181. aria_code/apps/cli/intent.py +136 -0
  182. aria_code/apps/cli/intent_router.py +305 -0
  183. aria_code/apps/cli/intent_shadow.py +72 -0
  184. aria_code/apps/cli/intent_signals.py +347 -0
  185. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  186. aria_code/apps/cli/local_tool_schemas.py +550 -0
  187. aria_code/apps/cli/main.py +39 -0
  188. aria_code/apps/cli/market_hours.py +100 -0
  189. aria_code/apps/cli/market_metadata.py +135 -0
  190. aria_code/apps/cli/market_universe.py +487 -0
  191. aria_code/apps/cli/message_processing.py +310 -0
  192. aria_code/apps/cli/mixin_binding.py +32 -0
  193. aria_code/apps/cli/model_catalog.py +652 -0
  194. aria_code/apps/cli/model_probe.py +169 -0
  195. aria_code/apps/cli/model_retirement.py +65 -0
  196. aria_code/apps/cli/native_branding.py +12 -0
  197. aria_code/apps/cli/native_bridge.py +118 -0
  198. aria_code/apps/cli/native_entry.py +58 -0
  199. aria_code/apps/cli/pdf_report.py +977 -0
  200. aria_code/apps/cli/plan_mode.py +139 -0
  201. aria_code/apps/cli/plotly_html.py +15 -0
  202. aria_code/apps/cli/prediction_feedback.py +202 -0
  203. aria_code/apps/cli/preflight.py +502 -0
  204. aria_code/apps/cli/project_aria.py +60 -0
  205. aria_code/apps/cli/prompt_assembly.py +78 -0
  206. aria_code/apps/cli/prompts/__init__.py +0 -0
  207. aria_code/apps/cli/prompts/coding.py +71 -0
  208. aria_code/apps/cli/prompts/select.py +193 -0
  209. aria_code/apps/cli/prompts/system_prompts.py +562 -0
  210. aria_code/apps/cli/prompts/ui.py +436 -0
  211. aria_code/apps/cli/provider_endpoints.py +237 -0
  212. aria_code/apps/cli/provider_keys.py +73 -0
  213. aria_code/apps/cli/providers/__init__.py +1 -0
  214. aria_code/apps/cli/providers/base.py +775 -0
  215. aria_code/apps/cli/providers/chat_routing.py +139 -0
  216. aria_code/apps/cli/providers/collaboration.py +98 -0
  217. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  218. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  219. aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
  220. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  221. aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
  222. aria_code/apps/cli/providers/runtime_bridge.py +586 -0
  223. aria_code/apps/cli/providers/vertexai_stream.py +592 -0
  224. aria_code/apps/cli/release_download.py +159 -0
  225. aria_code/apps/cli/review_runner.py +111 -0
  226. aria_code/apps/cli/runtime_consumer.py +769 -0
  227. aria_code/apps/cli/sandbox.py +32 -0
  228. aria_code/apps/cli/session_export.py +120 -0
  229. aria_code/apps/cli/session_jsonl.py +208 -0
  230. aria_code/apps/cli/session_refresh.py +123 -0
  231. aria_code/apps/cli/session_store.py +125 -0
  232. aria_code/apps/cli/skills_catalog.py +273 -0
  233. aria_code/apps/cli/task_isolation.py +211 -0
  234. aria_code/apps/cli/terminal_chrome.py +412 -0
  235. aria_code/apps/cli/todo_tracker.py +190 -0
  236. aria_code/apps/cli/tool_executor.py +932 -0
  237. aria_code/apps/cli/tool_registry.py +34 -0
  238. aria_code/apps/cli/tool_scope.py +113 -0
  239. aria_code/apps/cli/tools/__init__.py +40 -0
  240. aria_code/apps/cli/tools/context.py +46 -0
  241. aria_code/apps/cli/tools/file_tools.py +181 -0
  242. aria_code/apps/cli/tools/market_tools.py +626 -0
  243. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  244. aria_code/apps/cli/tools/system_tools.py +656 -0
  245. aria_code/apps/cli/tools/write_tools.py +961 -0
  246. aria_code/apps/cli/tradingview_bridge.py +529 -0
  247. aria_code/apps/cli/transactions.py +269 -0
  248. aria_code/apps/cli/turn_planning.py +137 -0
  249. aria_code/apps/cli/update_check.py +257 -0
  250. aria_code/apps/cli/updater.py +373 -0
  251. aria_code/apps/cli/utils/__init__.py +0 -0
  252. aria_code/apps/cli/utils/market_detect.py +1663 -0
  253. aria_code/apps/cli/web_login.py +136 -0
  254. aria_code/apps/cli/workflow_runner.py +127 -0
  255. aria_code/apps/cli/workspace_route.py +121 -0
  256. aria_code/apps/daemon/README.md +14 -0
  257. aria_code/apps/vscode/README.md +115 -0
  258. aria_code/apps/vscode/package.json +70 -0
  259. aria_code/aria_cli.py +5244 -0
  260. aria_code/aria_daemon.py +1372 -0
  261. aria_code/aria_feishu_bot.py +16 -0
  262. aria_code/aria_mcp_server.py +61 -0
  263. aria_code/aria_relay_client.py +4 -0
  264. aria_code/aria_telegram_bot.py +11 -0
  265. aria_code/ariarc.py +385 -0
  266. aria_code/artifacts.py +581 -0
  267. aria_code/backtest_engine.py +4 -0
  268. aria_code/backtest_report.py +4 -0
  269. aria_code/brokers/__init__.py +78 -0
  270. aria_code/brokers/automation.py +193 -0
  271. aria_code/brokers/base.py +231 -0
  272. aria_code/brokers/capabilities.py +264 -0
  273. aria_code/brokers/cn/__init__.py +10 -0
  274. aria_code/brokers/cn/easytrader_broker.py +193 -0
  275. aria_code/brokers/cn/futu_broker.py +194 -0
  276. aria_code/brokers/cn/longbridge_broker.py +190 -0
  277. aria_code/brokers/cn/tiger_broker.py +196 -0
  278. aria_code/brokers/cn/xtquant_broker.py +225 -0
  279. aria_code/brokers/config.py +414 -0
  280. aria_code/brokers/intl/__init__.py +5 -0
  281. aria_code/brokers/intl/alpaca_broker.py +183 -0
  282. aria_code/brokers/intl/ibkr_broker.py +215 -0
  283. aria_code/brokers/intl/trading212_broker.py +183 -0
  284. aria_code/brokers/intl/webull_broker.py +156 -0
  285. aria_code/brokers/paper_broker.py +266 -0
  286. aria_code/brokers/planning.py +296 -0
  287. aria_code/brokers/registry.py +213 -0
  288. aria_code/brokers/trading.py +267 -0
  289. aria_code/canva_client.py +4 -0
  290. aria_code/change_store.py +127 -0
  291. aria_code/clients/__init__.py +0 -0
  292. aria_code/clients/aliyun_data_client.py +660 -0
  293. aria_code/clients/aria_relay_client.py +16 -0
  294. aria_code/clients/canva_client.py +284 -0
  295. aria_code/clients/figma_client.py +100 -0
  296. aria_code/clients/football_data_client.py +1671 -0
  297. aria_code/clients/kling_video_client.py +182 -0
  298. aria_code/clients/market_data_client.py +1985 -0
  299. aria_code/clients/openai_image_client.py +242 -0
  300. aria_code/clients/runway_video_client.py +157 -0
  301. aria_code/clients/warehouse_erp_client.py +105 -0
  302. aria_code/cloud_memory.py +190 -0
  303. aria_code/command_safety.py +19 -0
  304. aria_code/computer_use_server.py +276 -0
  305. aria_code/computer_use_tools.py +4 -0
  306. aria_code/dashboard_generator.py +579 -0
  307. aria_code/data_analysis_tools.py +4 -0
  308. aria_code/data_cleaner.py +483 -0
  309. aria_code/data_service.py +513 -0
  310. aria_code/datasources/__init__.py +23 -0
  311. aria_code/datasources/base.py +166 -0
  312. aria_code/datasources/router.py +253 -0
  313. aria_code/datasources/sec_statements.py +217 -0
  314. aria_code/datasources/sources/__init__.py +15 -0
  315. aria_code/datasources/sources/akshare_source.py +269 -0
  316. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  317. aria_code/datasources/sources/edgar_source.py +219 -0
  318. aria_code/datasources/sources/finnhub_source.py +198 -0
  319. aria_code/datasources/sources/fred_source.py +223 -0
  320. aria_code/datasources/sources/tushare_source.py +143 -0
  321. aria_code/datasources/sources/web_scraper_source.py +278 -0
  322. aria_code/datasources/sources/world_bank_source.py +206 -0
  323. aria_code/datasources/sources/yfinance_source.py +152 -0
  324. aria_code/doctor.py +860 -0
  325. aria_code/domain/__init__.py +0 -0
  326. aria_code/domain/_finance_core/__init__.py +5 -0
  327. aria_code/domain/_finance_core/backtest_engine.py +325 -0
  328. aria_code/domain/_finance_core/performance_stats.py +101 -0
  329. aria_code/domain/backtest_engine.py +75 -0
  330. aria_code/domain/backtest_report.py +488 -0
  331. aria_code/domain/finance_formulas.py +389 -0
  332. aria_code/domain/performance_stats.py +6 -0
  333. aria_code/domain/portfolio_ledger.py +307 -0
  334. aria_code/domain/strategy_vault.py +421 -0
  335. aria_code/evals/__init__.py +37 -0
  336. aria_code/evals/behavior.py +113 -0
  337. aria_code/evals/gap.py +93 -0
  338. aria_code/evals/harness.py +949 -0
  339. aria_code/evals/review_probe.py +132 -0
  340. aria_code/evals/runner.py +425 -0
  341. aria_code/evals/scorecard.py +322 -0
  342. aria_code/evals/summary.py +125 -0
  343. aria_code/external_agent_runner.py +115 -0
  344. aria_code/figma_client.py +4 -0
  345. aria_code/file_analysis_tools.py +4 -0
  346. aria_code/finance_formulas.py +4 -0
  347. aria_code/football_data_client.py +4 -0
  348. aria_code/image_gen_tools.py +4 -0
  349. aria_code/intent_classifier.py +459 -0
  350. aria_code/kling_video_client.py +4 -0
  351. aria_code/licensing.py +151 -0
  352. aria_code/local_finance_tools.py +4 -0
  353. aria_code/local_image_provider.py +4 -0
  354. aria_code/local_llm_provider.py +4 -0
  355. aria_code/macro_tools.py +4 -0
  356. aria_code/markdown_pdf.py +289 -0
  357. aria_code/market_data_client.py +4 -0
  358. aria_code/mcp_client.py +744 -0
  359. aria_code/memory_manager.py +273 -0
  360. aria_code/model_capability.py +512 -0
  361. aria_code/notification_tools.py +4 -0
  362. aria_code/openai_image_client.py +4 -0
  363. aria_code/packages/__init__.py +26 -0
  364. aria_code/packages/adk_bridge/__init__.py +11 -0
  365. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  366. aria_code/packages/adk_bridge/market_tools.py +125 -0
  367. aria_code/packages/aria_agents/__init__.py +5 -0
  368. aria_code/packages/aria_agents/manifest.py +78 -0
  369. aria_code/packages/aria_core/__init__.py +34 -0
  370. aria_code/packages/aria_core/architecture.py +269 -0
  371. aria_code/packages/aria_core/export.py +147 -0
  372. aria_code/packages/aria_core/manifest.py +65 -0
  373. aria_code/packages/aria_core/paths.py +57 -0
  374. aria_code/packages/aria_core/secure_file.py +68 -0
  375. aria_code/packages/aria_infra/__init__.py +15 -0
  376. aria_code/packages/aria_infra/arthera.py +58 -0
  377. aria_code/packages/aria_infra/doctor.py +246 -0
  378. aria_code/packages/aria_infra/product.py +40 -0
  379. aria_code/packages/aria_mcp/__init__.py +25 -0
  380. aria_code/packages/aria_mcp/bridge.py +232 -0
  381. aria_code/packages/aria_mcp/circuit.py +82 -0
  382. aria_code/packages/aria_mcp/config.py +162 -0
  383. aria_code/packages/aria_mcp/installer.py +95 -0
  384. aria_code/packages/aria_mcp/server.py +1705 -0
  385. aria_code/packages/aria_mcp/tools.py +81 -0
  386. aria_code/packages/aria_sdk/__init__.py +19 -0
  387. aria_code/packages/aria_sdk/client.py +393 -0
  388. aria_code/packages/aria_sdk/providers.py +70 -0
  389. aria_code/packages/aria_sdk/streaming.py +75 -0
  390. aria_code/packages/aria_sdk/types.py +86 -0
  391. aria_code/packages/aria_services/__init__.py +92 -0
  392. aria_code/packages/aria_services/cache.py +60 -0
  393. aria_code/packages/aria_services/context.py +356 -0
  394. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  395. aria_code/packages/aria_services/data.py +11 -0
  396. aria_code/packages/aria_services/provider_health.py +304 -0
  397. aria_code/packages/aria_services/references.py +247 -0
  398. aria_code/packages/aria_services/registry.py +249 -0
  399. aria_code/packages/aria_services/research_protocol.py +137 -0
  400. aria_code/packages/aria_services/research_quality.py +186 -0
  401. aria_code/packages/aria_services/settings.py +160 -0
  402. aria_code/packages/aria_services/usage.py +151 -0
  403. aria_code/packages/aria_skills/__init__.py +46 -0
  404. aria_code/packages/aria_skills/catalog.py +149 -0
  405. aria_code/packages/aria_skills/loader.py +455 -0
  406. aria_code/packages/aria_skills/registry.py +84 -0
  407. aria_code/packages/aria_tools/__init__.py +5 -0
  408. aria_code/packages/aria_tools/financial/__init__.py +5 -0
  409. aria_code/packages/aria_tools/financial/_paths.py +92 -0
  410. aria_code/packages/aria_tools/registry.py +129 -0
  411. aria_code/packages/quant_engine/__init__.py +33 -0
  412. aria_code/packages/quant_engine/_namespace.py +24 -0
  413. aria_code/packages/quant_engine/backtest/__init__.py +10 -0
  414. aria_code/packages/quant_engine/backtest/core.py +53 -0
  415. aria_code/packages/quant_engine/backtest/engine.py +102 -0
  416. aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
  417. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  418. aria_code/packages/quant_engine/sports/__init__.py +76 -0
  419. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  420. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  421. aria_code/packages/quant_engine/sports/elo.py +300 -0
  422. aria_code/packages/quant_engine/sports/form.py +188 -0
  423. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  424. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  425. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  426. aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
  427. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  428. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  429. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  430. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  431. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  432. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  433. aria_code/packs/__init__.py +85 -0
  434. aria_code/packs/base.py +168 -0
  435. aria_code/packs/finance/__init__.py +250 -0
  436. aria_code/packs/healthcare/__init__.py +40 -0
  437. aria_code/packs/logistics/__init__.py +171 -0
  438. aria_code/packs/payments/__init__.py +139 -0
  439. aria_code/packs/realty/__init__.py +190 -0
  440. aria_code/packs/registry.py +202 -0
  441. aria_code/packs/rules.py +90 -0
  442. aria_code/plan_utils.py +194 -0
  443. aria_code/plugin_loader.py +328 -0
  444. aria_code/portfolio_ledger.py +4 -0
  445. aria_code/preview_server.py +449 -0
  446. aria_code/privacy/__init__.py +5 -0
  447. aria_code/privacy/feedback.py +123 -0
  448. aria_code/project_review.py +278 -0
  449. aria_code/project_review_api.py +235 -0
  450. aria_code/project_review_server.py +18 -0
  451. aria_code/project_tools.py +4 -0
  452. aria_code/providers/__init__.py +30 -0
  453. aria_code/providers/google_video_provider.py +256 -0
  454. aria_code/providers/llm/__init__.py +19 -0
  455. aria_code/providers/llm/anthropic.py +184 -0
  456. aria_code/providers/llm/arthera_gateway.py +90 -0
  457. aria_code/providers/llm/autoconfig.py +213 -0
  458. aria_code/providers/llm/base.py +139 -0
  459. aria_code/providers/llm/custom.py +158 -0
  460. aria_code/providers/llm/ollama.py +137 -0
  461. aria_code/providers/llm/openai_compat.py +350 -0
  462. aria_code/providers/llm/registry.py +457 -0
  463. aria_code/providers/local_image_provider.py +202 -0
  464. aria_code/providers/local_llm_provider.py +549 -0
  465. aria_code/providers/ollama_models.py +79 -0
  466. aria_code/providers/openai_params.py +32 -0
  467. aria_code/providers/tool_messages.py +100 -0
  468. aria_code/realty_data_tools.py +4 -0
  469. aria_code/report_exporters.py +150 -0
  470. aria_code/report_generator.py +1764 -0
  471. aria_code/review_service.py +497 -0
  472. aria_code/runtime/__init__.py +176 -0
  473. aria_code/runtime/acceptance.py +632 -0
  474. aria_code/runtime/agent_loop.py +1851 -0
  475. aria_code/runtime/agent_profiles.py +75 -0
  476. aria_code/runtime/approval.py +71 -0
  477. aria_code/runtime/baseline.py +219 -0
  478. aria_code/runtime/budget.py +232 -0
  479. aria_code/runtime/checkpoints.py +481 -0
  480. aria_code/runtime/consult.py +65 -0
  481. aria_code/runtime/contract.py +282 -0
  482. aria_code/runtime/delivery.py +432 -0
  483. aria_code/runtime/events.py +113 -0
  484. aria_code/runtime/gateway.py +167 -0
  485. aria_code/runtime/lsp.py +484 -0
  486. aria_code/runtime/native_index.py +153 -0
  487. aria_code/runtime/orchestrator.py +55 -0
  488. aria_code/runtime/processes.py +343 -0
  489. aria_code/runtime/project_graph.py +614 -0
  490. aria_code/runtime/repo_map.py +712 -0
  491. aria_code/runtime/research_bundle.py +105 -0
  492. aria_code/runtime/review.py +269 -0
  493. aria_code/runtime/run_state.py +127 -0
  494. aria_code/runtime/run_store.py +522 -0
  495. aria_code/runtime/scoped_runs.py +113 -0
  496. aria_code/runtime/self_healing.py +422 -0
  497. aria_code/runtime/semantic_diff.py +171 -0
  498. aria_code/runtime/subagent.py +721 -0
  499. aria_code/runtime/symbol_edit.py +117 -0
  500. aria_code/runtime/task_brief.py +46 -0
  501. aria_code/runtime/task_context.py +145 -0
  502. aria_code/runtime/task_ledger.py +108 -0
  503. aria_code/runtime/task_orchestrator.py +90 -0
  504. aria_code/runtime/task_outcome.py +33 -0
  505. aria_code/runtime/task_verification.py +266 -0
  506. aria_code/runtime/task_worktree.py +448 -0
  507. aria_code/runtime/tool_executor.py +329 -0
  508. aria_code/runtime/tool_policy.py +107 -0
  509. aria_code/runtime/transactions.py +216 -0
  510. aria_code/runtime/windows_job.py +115 -0
  511. aria_code/runtime/workflows.py +222 -0
  512. aria_code/runtime/worktrees.py +215 -0
  513. aria_code/runway_video_client.py +4 -0
  514. aria_code/safety/__init__.py +27 -0
  515. aria_code/safety/client_isolation.py +178 -0
  516. aria_code/safety/permissions.py +339 -0
  517. aria_code/safety/risk.py +699 -0
  518. aria_code/safety/sandbox.py +148 -0
  519. aria_code/safety/service.py +102 -0
  520. aria_code/service_endpoints.py +14 -0
  521. aria_code/setup_wizard.py +684 -0
  522. aria_code/spreadsheet_tools.py +4 -0
  523. aria_code/strategy_vault.py +4 -0
  524. aria_code/tools/__init__.py +0 -0
  525. aria_code/tools/artifact_tools.py +252 -0
  526. aria_code/tools/broker_tools.py +92 -0
  527. aria_code/tools/build_quant_engine.py +97 -0
  528. aria_code/tools/code_audit_tools.py +192 -0
  529. aria_code/tools/computer_use_tools.py +509 -0
  530. aria_code/tools/data_analysis_tools.py +831 -0
  531. aria_code/tools/enterprise_finance_tools.py +202 -0
  532. aria_code/tools/extended_tools.py +240 -0
  533. aria_code/tools/file_analysis_tools.py +880 -0
  534. aria_code/tools/image_gen_tools.py +114 -0
  535. aria_code/tools/local_finance_tools.py +3488 -0
  536. aria_code/tools/logistics_carriers.py +11 -0
  537. aria_code/tools/logistics_inventory.py +11 -0
  538. aria_code/tools/logistics_io.py +11 -0
  539. aria_code/tools/logistics_tenancy.py +11 -0
  540. aria_code/tools/logistics_tools.py +11 -0
  541. aria_code/tools/macro_tools.py +412 -0
  542. aria_code/tools/notification_tools.py +249 -0
  543. aria_code/tools/project_tools.py +525 -0
  544. aria_code/tools/realty_data_tools.py +662 -0
  545. aria_code/tools/spreadsheet_tools.py +399 -0
  546. aria_code/tools/stripe_tools.py +115 -0
  547. aria_code/tools/video_tools.py +500 -0
  548. aria_code/training/__init__.py +1 -0
  549. aria_code/training/compare.py +117 -0
  550. aria_code/training/prelude_commands.py +111 -0
  551. aria_code/training/prelude_eval.py +390 -0
  552. aria_code/training/prelude_real.py +183 -0
  553. aria_code/training/prelude_train.py +248 -0
  554. aria_code/training/sft_dataset.py +230 -0
  555. aria_code/training/trajectory_dataset.py +263 -0
  556. aria_code/ui/__init__.py +105 -0
  557. aria_code/ui/banner.py +404 -0
  558. aria_code/ui/completer.py +571 -0
  559. aria_code/ui/console.py +285 -0
  560. aria_code/ui/input_box.py +505 -0
  561. aria_code/ui/mentions.py +206 -0
  562. aria_code/ui/picker.py +248 -0
  563. aria_code/ui/render/__init__.py +11 -0
  564. aria_code/ui/render/actions.py +297 -0
  565. aria_code/ui/render/finance.py +1732 -0
  566. aria_code/ui/render/market.py +253 -0
  567. aria_code/ui/render/output.py +954 -0
  568. aria_code/ui/render/responsive.py +75 -0
  569. aria_code/ui/render/team.py +367 -0
  570. aria_code/ui/robot.py +239 -0
  571. aria_code/ui/startup_dashboard.py +110 -0
  572. aria_code/video_analysis.py +147 -0
  573. aria_code/video_editor.py +518 -0
  574. aria_code/video_workflow/__init__.py +8 -0
  575. aria_code/video_workflow/__main__.py +61 -0
  576. aria_code/video_workflow/engines/__init__.py +18 -0
  577. aria_code/video_workflow/engines/base.py +69 -0
  578. aria_code/video_workflow/engines/custom_model.py +204 -0
  579. aria_code/video_workflow/engines/google_veo.py +94 -0
  580. aria_code/video_workflow/engines/local_engine.py +71 -0
  581. aria_code/video_workflow/engines/registry.py +98 -0
  582. aria_code/video_workflow/google_models.py +278 -0
  583. aria_code/video_workflow/music/__init__.py +5 -0
  584. aria_code/video_workflow/music/foley_service.py +132 -0
  585. aria_code/video_workflow/music/service.py +212 -0
  586. aria_code/video_workflow/pipeline.py +620 -0
  587. aria_code/video_workflow/plan.py +202 -0
  588. aria_code/video_workflow/session.py +297 -0
  589. aria_code/workspace/__init__.py +6 -0
  590. aria_code/workspace/files.py +219 -0
  591. aria_code/workspace/verify.py +167 -0
  592. aria_code/workspace_changes.py +199 -0
  593. aria_code/workspace_service.py +196 -0
  594. aria_code/workspace_tools.py +150 -0
  595. aria_code-0.167.0.dist-info/METADATA +330 -0
  596. aria_code-0.167.0.dist-info/RECORD +601 -0
  597. aria_code-0.167.0.dist-info/WHEEL +5 -0
  598. aria_code-0.167.0.dist-info/entry_points.txt +5 -0
  599. aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
  600. aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
  601. aria_code-0.167.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,586 @@
1
+ """Phase-3 bridge: run one chat turn through the shared ``runtime.run_agent``.
2
+
3
+ The documented runtime next step is to route the CLI tool loop through
4
+ ``run_agent`` and keep aria_cli as orchestration glue. This module is that engine
5
+ — the two adapters run_agent needs plus a thin driver:
6
+
7
+ • build_tool_executor() — wraps the CLI's ``LOCAL_TOOLS`` ({name: (handler, schema)})
8
+ • make_provider_fn() — selects the provider (chat_routing) + streams it
9
+ • run_chat_via_runtime() — drives run_agent, renders via callbacks, returns text
10
+
11
+ This is THE chat path: ``send_message`` runs every turn through it (the old
12
+ inline per-round loop was retired in 2026-07 after the runtime path was
13
+ validated with real turns). Tool approval and execution context are threaded
14
+ through to run_agent's tool loop; on failure send_message attempts one direct
15
+ cloud rescue (``providers/llm/registry.stream_cloud_fallback``) before
16
+ presenting the error.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ from typing import Any, Callable, List, Optional
22
+
23
+ from .chat_routing import first_round_route, is_placeholder_response, should_fallback
24
+
25
+
26
+ def build_tool_executor(
27
+ local_tools,
28
+ config: Optional[dict] = None,
29
+ execution_context: Optional[Callable[[], dict]] = None,
30
+ ):
31
+ """Wrap the CLI's LOCAL_TOOLS registry for run_agent."""
32
+ from aria_code.runtime.tool_executor import ToolExecutor
33
+ return ToolExecutor(
34
+ local_tools,
35
+ config=config or {},
36
+ execution_context=execution_context,
37
+ )
38
+
39
+
40
+ # Modes in which nothing can be written, so nothing can need verifying.
41
+ _READ_ONLY_MODES = frozenset({"read-only", "readonly", "read_only", "plan"})
42
+
43
+
44
+ def _declared_acceptance_commands(cfg: dict, message: str) -> tuple:
45
+ """What this workspace says "correct" means for this particular message.
46
+
47
+ Precedence, most specific first:
48
+
49
+ 1. ``acceptance_commands`` in the session config — the user said it out
50
+ loud for this session, so nothing overrides it.
51
+ 2. The active domain packs' commands. A pack contributes only when it
52
+ resolved a concrete entity from *this* message, so a declared
53
+ logistics check cannot fire on a payments question.
54
+ 3. The workspace's ``acceptance.default`` from ``.ariarc``.
55
+
56
+ Nothing declared falls through to inference from the changed files, which
57
+ is the behaviour that existed before packs could speak here at all.
58
+ """
59
+ explicit = tuple(cfg.get("acceptance_commands") or ())
60
+ if explicit:
61
+ return explicit
62
+
63
+ commands: list = []
64
+ try:
65
+ from aria_code.packs import (
66
+ activate_packs,
67
+ active_acceptance_commands,
68
+ load_builtin_packs,
69
+ )
70
+
71
+ load_builtin_packs()
72
+ commands.extend(active_acceptance_commands(activate_packs(message or "")))
73
+ except Exception:
74
+ pass
75
+
76
+ try:
77
+ from aria_code.packs.rules import default_acceptance_commands
78
+
79
+ for command in default_acceptance_commands():
80
+ if command not in commands:
81
+ commands.append(command)
82
+ except Exception:
83
+ pass
84
+
85
+ return tuple(commands)
86
+
87
+
88
+ def _workspace_root(cfg: dict, executor=None) -> str:
89
+ """Where this turn's tools act: the executor's workspace if it names one."""
90
+ import os
91
+
92
+ root = cfg.get("_session_workspace_root") or cfg.get("workspace_root") or os.getcwd()
93
+ if getattr(executor, "execution_context", None) is not None:
94
+ root = dict(executor.execution_context() or {}).get("_workspace") or root
95
+ return str(root)
96
+
97
+
98
+ def build_acceptance_gate(executor, config: Optional[dict] = None, message: str = ""):
99
+ """The CLI's acceptance gate, or ``None`` when this session shouldn't have one.
100
+
101
+ The gate runs its checks through the session's own ``run_command`` tool
102
+ rather than spawning subprocesses itself, so the workspace sandbox, the
103
+ command policy and the trace all apply to a verification run exactly as
104
+ they apply to a command the model asked for.
105
+
106
+ ``user_approved`` is set because the commands are the *planner's*, not the
107
+ model's or the user's prose — the same inferred plan ``/verify`` already
108
+ runs on request. Anything else would put an approval prompt between the
109
+ model finishing and the check that tells us whether it finished correctly,
110
+ which is the one place a prompt cannot help.
111
+ """
112
+ cfg = config or {}
113
+ if not cfg.get("acceptance_gate", True):
114
+ return None
115
+ mode = str(cfg.get("permission_mode", "workspace-write") or "")
116
+ if mode in _READ_ONLY_MODES:
117
+ return None
118
+ if "run_command" not in getattr(executor, "local_tools", {}):
119
+ return None
120
+
121
+ from aria_code.runtime.acceptance import AcceptanceGate
122
+ from aria_code.runtime.approval import ApprovalDecision
123
+
124
+ timeout = int(cfg.get("acceptance_timeout", 300) or 300)
125
+ root = _workspace_root(cfg, executor)
126
+
127
+ def _runner(command: str) -> dict:
128
+ return executor.execute_local("run_command", {
129
+ "command": command,
130
+ "cwd": str(root),
131
+ "timeout": timeout,
132
+ }, approval=ApprovalDecision.allow(policy="balanced", user_approved=True))
133
+
134
+ return AcceptanceGate(
135
+ runner=_runner,
136
+ root=root,
137
+ max_attempts=int(cfg.get("acceptance_max_attempts", 2) or 2),
138
+ commands=_declared_acceptance_commands(cfg, message),
139
+ baseline=_build_baseline(executor, cfg, timeout),
140
+ revision_inputs=cfg.get("acceptance_revision_inputs") or (),
141
+ )
142
+
143
+
144
+ def _build_baseline(executor, cfg: dict, timeout: int):
145
+ """Reruns a failed check on the code before the change; None when off.
146
+
147
+ In a task worktree the "before" is the task's starting snapshot, in the
148
+ user's own repository. Otherwise it is the working tree with this turn's
149
+ edits undone from the checkpoints recorded after this point.
150
+ """
151
+ if not cfg.get("test_baseline", True):
152
+ return None
153
+ try:
154
+ import os
155
+
156
+ from aria_code.packages.aria_core.paths import aria_home
157
+ from aria_code.runtime.approval import ApprovalDecision
158
+ from aria_code.runtime.baseline import Baseline
159
+ from aria_code.runtime.checkpoints import CheckpointStore
160
+
161
+ context = dict(executor.execution_context() or {}) if getattr(executor, "execution_context", None) else {}
162
+ base_commit = str(context.get("_task_base") or "")
163
+ workspace = cfg.get("_session_workspace_root") or os.getcwd()
164
+
165
+ def run(command: str, cwd: str) -> dict:
166
+ return executor.execute_local("run_command", {"command": command, "cwd": cwd, "timeout": timeout},
167
+ approval=ApprovalDecision.allow(policy="balanced", user_approved=True))
168
+
169
+ return Baseline(
170
+ workspace, run=run, base_commit=base_commit,
171
+ undo_since=None if base_commit else CheckpointStore().max_sequence(),
172
+ session_id=str(context.get("_session_id") or ""),
173
+ scratch_root=aria_home() / "worktrees" / "baselines",
174
+ )
175
+ except Exception:
176
+ return None
177
+
178
+
179
+ def build_change_contract(config: Optional[dict] = None, message: str = "", executor=None):
180
+ """The project's change contract with this request as its goal, or None.
181
+
182
+ Declared in ``.aria/policy.yaml`` under the workspace root. A file that
183
+ cannot be read yields a fail-closed contract rather than none — see
184
+ ``ChangeContract.fail_closed``.
185
+ """
186
+ from aria_code.runtime.contract import ChangeContract, ContractError
187
+
188
+ root = _workspace_root(config or {}, executor)
189
+ try:
190
+ contract = ChangeContract.load(root)
191
+ except ContractError as exc:
192
+ contract = ChangeContract.fail_closed(root, str(exc))
193
+ except Exception as exc: # unreadable file, missing yaml, …: still fail closed
194
+ contract = ChangeContract.fail_closed(root, f"{type(exc).__name__}: {exc}")
195
+ return contract.with_goal(message) if contract is not None else None
196
+
197
+
198
+ def build_review_gate(config: Optional[dict] = None, *, model: str, api_url: Optional[str],
199
+ ollama_url: str, thinking_mode: str = "auto", auth_token: Optional[str] = None):
200
+ """The independent reviewer for this turn, or None unless review_gate is on.
201
+
202
+ Fresh context: no history, no tools, no project context — the reviewer
203
+ judges the diff it is given, not the conversation that made it. By default
204
+ it is the same model; ``review_model`` (``anthropic/claude-sonnet-5-5``,
205
+ ``openai/...``, ``google/...``) hands the review to a different one, so the
206
+ model that wrote the change is not also the one that approves it. That sends
207
+ the diff, the goal and the check results to that provider, which is why it
208
+ is a setting and never a default.
209
+ """
210
+ cfg = config or {}
211
+ if not cfg.get("review_gate", False):
212
+ return None
213
+ if str(cfg.get("permission_mode", "workspace-write") or "") in _READ_ONLY_MODES:
214
+ return None
215
+ from aria_code.runtime.review import REVIEWER_SYSTEM, ReviewGate
216
+
217
+ other = str(cfg.get("review_model") or "").strip()
218
+ separate = bool(other) and other != model
219
+ reviewer_fn = make_provider_fn(
220
+ model=other if separate else model, config=cfg,
221
+ # A separate reviewer names its own provider, so it must not go through the
222
+ # builder's Aria backend (api_url) or its auth token.
223
+ api_url=None if separate else api_url, ollama_url=ollama_url,
224
+ tool_schemas=[], thinking_mode=thinking_mode, auth_token=None if separate else auth_token,
225
+ system_override=REVIEWER_SYSTEM,
226
+ )
227
+
228
+ async def _review(prompt: str) -> str:
229
+ result = await reviewer_fn(prompt, [])
230
+ if not result.get("success", True):
231
+ raise RuntimeError(result.get("error") or "reviewer call failed")
232
+ return str(result.get("response") or "")
233
+
234
+ try:
235
+ attempts = int(cfg.get("review_max_attempts", 1))
236
+ except (TypeError, ValueError):
237
+ attempts = 1
238
+ return ReviewGate(reviewer=_review, max_attempts=max(0, attempts), reviewer_name=other if separate else "")
239
+
240
+
241
+ async def run_with_fallback(
242
+ route: str,
243
+ *,
244
+ run_cloud: Callable,
245
+ run_ollama: Callable,
246
+ on_token: Optional[Callable[[str], None]] = None,
247
+ ) -> dict:
248
+ """Primary generation per ``route``, with cloud→Ollama fallback parity.
249
+
250
+ Mirrors ``send_message``'s inline fallback, but keyed on *route* (via
251
+ ``should_fallback``) so a genuinely-good forced-backend answer is kept
252
+ instead of being discarded and re-run:
253
+
254
+ • ``skip`` / ``ollama`` → run local Ollama directly (no cloud round)
255
+ • ``cloud`` → run cloud; if it fails or returns an empty answer,
256
+ fall back to
257
+ local Ollama
258
+
259
+ ``run_cloud`` / ``run_ollama`` are async ``(on_token) -> result dict``
260
+ closures; injecting them keeps this orchestration unit-testable without
261
+ real providers or network.
262
+ """
263
+ if route in ("skip", "ollama", "configured"):
264
+ return await run_ollama(on_token)
265
+
266
+ # Route == "cloud": track streamed chunks for telemetry only. A response
267
+ # delivered in one final event is still a valid answer.
268
+ _tokens = [0]
269
+
270
+ def _counting_on_token(tok: str) -> None:
271
+ _tokens[0] += 1
272
+ if on_token is not None:
273
+ on_token(tok)
274
+
275
+ result = await run_cloud(_counting_on_token)
276
+ if result.get("cancelled"):
277
+ return result # user-cancelled — never silently re-run on a different provider
278
+
279
+ placeholder = is_placeholder_response(result.get("response", ""), _tokens[0])
280
+ if should_fallback("cloud", result, is_placeholder=placeholder):
281
+ return await run_ollama(on_token)
282
+ return result
283
+
284
+
285
+ def make_provider_fn(
286
+ *,
287
+ model: str,
288
+ config: dict,
289
+ api_url: Optional[str],
290
+ ollama_url: str,
291
+ tool_schemas: List[dict],
292
+ thinking_mode: str = "auto",
293
+ user_context: Optional[dict] = None,
294
+ auth_token: Optional[str] = None,
295
+ project_context: Any = None,
296
+ system_override: Optional[str] = None,
297
+ ) -> Callable:
298
+ """Build an async ``provider_fn`` for run_agent.
299
+
300
+ Selects the provider per chat_routing (cloud → AriaSSE backend; ollama/skip →
301
+ local Ollama) and streams it through the shared ``stream_provider_result``.
302
+ A pending system-role override is threaded the same way ``send_message`` does
303
+ it: cloud via ``user_context['system_role_override']``, Ollama via the
304
+ provider's ``system_override`` argument.
305
+ """
306
+ # Event identity is part of the streaming contract. Importing the bare
307
+ # compatibility root creates a second LLMToken/LLMDone class, which the
308
+ # SDK's isinstance checks silently discard even when the API answered.
309
+ from aria_code.apps.cli.providers.base import AriaSSEProvider, ConfiguredProvider, OllamaProvider
310
+ from aria_code.packages.aria_sdk.streaming import stream_provider_result
311
+
312
+ from aria_code.memory_manager import MemoryManager
313
+ account_context = MemoryManager(config=config).load_context(max_chars=1000)
314
+ _cloud_uctx = dict(user_context or {})
315
+ if account_context and not system_override:
316
+ _cloud_uctx["account_memory"] = account_context
317
+ if system_override:
318
+ _cloud_uctx["system_role_override"] = system_override
319
+
320
+ task_prompt: Optional[str] = None
321
+
322
+ def _scoped_tools(prompt: str) -> List[dict]:
323
+ """Tools this message may use: core always, domain only when claimed."""
324
+ try:
325
+ from aria_code.apps.cli.tool_scope import select_tool_schemas
326
+
327
+ return select_tool_schemas(tool_schemas, task_prompt if task_prompt is not None else prompt, allow_social_tools=bool((system_override or "").strip()))
328
+ except Exception:
329
+ return list(tool_schemas)
330
+
331
+ def _system_for(prompt: str) -> str:
332
+ """The rules this turn runs under, for the non-Ollama providers.
333
+
334
+ ollama_stream assembles its own (with prefetched data and sized
335
+ project context); everything else used to get nothing at all, so a
336
+ cloud model was never told the tool discipline. Built per message
337
+ because the right prompt depends on what was asked.
338
+ """
339
+ try:
340
+ from aria_code.apps.cli.prompts.select import build_turn_system_prompt
341
+
342
+ return build_turn_system_prompt(
343
+ task_prompt if task_prompt is not None else prompt,
344
+ override=system_override,
345
+ project_context="\n\n".join(filter(None, [str(project_context or ""), account_context])),
346
+ )
347
+ except Exception:
348
+ return system_override or ""
349
+
350
+ async def _provider_fn(prompt, history, *, on_token=None, on_thinking=None,
351
+ on_tool_call=None, on_tool_result=None, on_status=None,
352
+ cancel_event=None):
353
+ nonlocal task_prompt
354
+ if task_prompt is None:
355
+ task_prompt = prompt
356
+ route = first_round_route(model, config, api_url)
357
+
358
+ # ollama_stream does its own intent-based selection; the other
359
+ # providers had none, so a coding turn reached Gemini carrying all 74
360
+ # tool schemas including 34 domain tools. Scoped per message because
361
+ # what a turn may call depends on what it asked.
362
+ _scoped = _scoped_tools(prompt)
363
+
364
+ async def _stream(provider, _on_token):
365
+ return await stream_provider_result(
366
+ provider, prompt, history, tools=_scoped,
367
+ cancel_event=cancel_event, on_token=_on_token, on_thinking=on_thinking,
368
+ on_tool_call=on_tool_call, on_tool_result=on_tool_result, on_status=on_status,
369
+ )
370
+
371
+ async def run_cloud(_on_token):
372
+ return await _stream(
373
+ AriaSSEProvider(
374
+ api_url, model, thinking_mode=thinking_mode,
375
+ user_context=_cloud_uctx, auth_token=auth_token,
376
+ project_context="\n\n".join(filter(None, [str(project_context or ""), account_context])),
377
+ use_react_gateway=bool(config.get("arthera_react_gateway")),
378
+ local_tools=bool(config.get("backend_local_tools")),
379
+ ),
380
+ _on_token,
381
+ )
382
+
383
+ async def run_ollama(_on_token):
384
+ if route == "ollama":
385
+ # stream_ollama still borrows 12 names from aria_cli's module
386
+ # globals and only resolves them after that module's import-time
387
+ # rebind, so an out-of-CLI caller has to import it first. Doing
388
+ # it here rather than at the caller's import time means only the
389
+ # route that needs it pays: measured, `import aria_cli` is 1766ms
390
+ # against 63ms for the daemon's own dependencies, and a
391
+ # Vertex/Gemini config routes to "configured", which never
392
+ # touches stream_ollama. The daemon was paying 1.7s to forward an
393
+ # alert it then analysed through the cloud.
394
+ #
395
+ # Idempotent and cached by sys.modules, so the second alert pays
396
+ # nothing. Inside the function, not the module, because importing
397
+ # aria_cli at this module's import time would put the cost back
398
+ # on every consumer.
399
+ import aria_cli # noqa: F401 (side effect: rebinds stream_ollama)
400
+
401
+ selected = (
402
+ OllamaProvider(ollama_url, model, system_override=system_override,
403
+ **({"include_ambient_context": False} if config.get("_delegate_context_only") else {}))
404
+ if route == "ollama" else
405
+ ConfiguredProvider(config, model, system_override=_system_for(prompt))
406
+ )
407
+ return await _stream(
408
+ selected,
409
+ _on_token,
410
+ )
411
+
412
+ return await run_with_fallback(
413
+ route, run_cloud=run_cloud, run_ollama=run_ollama, on_token=on_token,
414
+ )
415
+
416
+ return _provider_fn
417
+
418
+
419
+ async def run_chat_via_runtime(
420
+ *,
421
+ prompt: str,
422
+ history: list,
423
+ local_tools,
424
+ tool_schemas: List[dict],
425
+ model: str,
426
+ config: dict,
427
+ api_url: Optional[str],
428
+ ollama_url: str,
429
+ cancel_event=None,
430
+ on_token: Optional[Callable[[str], None]] = None,
431
+ on_thinking: Optional[Callable[[str], None]] = None,
432
+ on_tool_call: Optional[Callable[[str, dict], None]] = None,
433
+ on_tool_result: Optional[Callable[[str, dict], None]] = None,
434
+ on_status: Optional[Callable[[str, str], None]] = None,
435
+ thinking_mode: str = "auto",
436
+ user_context: Optional[dict] = None,
437
+ auth_token: Optional[str] = None,
438
+ project_context: Any = None,
439
+ system_override: Optional[str] = None,
440
+ max_rounds: int = 30,
441
+ return_result: bool = False,
442
+ execution_context: Optional[Callable[[], dict]] = None,
443
+ confirm_tools=(),
444
+ approval_callback: Optional[Callable] = None,
445
+ approval_applier: Optional[Callable] = None,
446
+ requires_evidence: bool = False,
447
+ grounding_tools=(),
448
+ evidence_already_grounded: bool = False,
449
+ tool_record_sink: Optional[Callable] = None,
450
+ ):
451
+ """Run one chat turn through the shared runtime Gateway.
452
+
453
+ This is the CLI *adapter* for ``runtime.gateway.run_turn``: it builds the
454
+ CLI's ``provider_fn`` (AriaSSE/Ollama selection + cloud→Ollama fallback) and
455
+ tool executor (the LOCAL_TOOLS registry), then hands them to the neutral
456
+ gateway, which drives ``run_agent`` and streams via the callbacks. By
457
+ default this returns assistant text for compatibility. ``return_result``
458
+ exposes the gateway result so terminal adapters can preserve provider and
459
+ usage metadata during final rendering.
460
+ """
461
+ from aria_code.runtime.gateway import run_turn
462
+ from aria_code.apps.cli.workspace_route import workspace_config
463
+ from aria_code.apps.cli.conversation_policy import is_conversation_only_message
464
+
465
+ config = workspace_config(prompt, model, config, api_url)
466
+ social_only = not (system_override or "").strip() and is_conversation_only_message(prompt)
467
+ if social_only:
468
+ # Host-owned policy, also enforced at execution if a provider returns
469
+ # an unsolicited call despite receiving no schemas. Never save it.
470
+ config = {**config, "_conversation_only": True}
471
+ requires_evidence = False
472
+ grounding_tools = ()
473
+ tool_schemas = []
474
+ project_context = None
475
+
476
+ provider_fn = make_provider_fn(
477
+ model=model, config=config, api_url=api_url, ollama_url=ollama_url,
478
+ tool_schemas=tool_schemas, thinking_mode=thinking_mode,
479
+ user_context=user_context, auth_token=auth_token, project_context=project_context,
480
+ system_override=system_override,
481
+ )
482
+ executor = build_tool_executor(local_tools, config, execution_context)
483
+ gate = None if social_only else build_acceptance_gate(executor, config, prompt)
484
+ contract = None if social_only else build_change_contract(config, prompt, executor)
485
+ review = None if social_only else build_review_gate(config, model=model, api_url=api_url, ollama_url=ollama_url,
486
+ thinking_mode=thinking_mode, auth_token=auth_token)
487
+
488
+ try:
489
+ result = await run_turn(
490
+ prompt, history,
491
+ provider_fn=provider_fn, tool_executor=executor,
492
+ tool_schemas=list(tool_schemas),
493
+ on_token=on_token, on_thinking=on_thinking,
494
+ on_tool_call=on_tool_call, on_tool_result=on_tool_result, on_status=on_status,
495
+ cancel_event=cancel_event, max_rounds=max_rounds,
496
+ confirm_tools=confirm_tools,
497
+ approval_callback=approval_callback,
498
+ approval_applier=approval_applier,
499
+ requires_evidence=requires_evidence,
500
+ grounding_tools=grounding_tools,
501
+ evidence_already_grounded=evidence_already_grounded,
502
+ acceptance=gate,
503
+ contract=contract,
504
+ review=review,
505
+ )
506
+ finally:
507
+ if tool_record_sink is not None:
508
+ for record in executor.trace.tool_calls:
509
+ tool_record_sink(record)
510
+ return result if return_result else result.text
511
+
512
+
513
+ def subagent_run_options(config: dict, task: Any) -> tuple[dict, dict]:
514
+ """The config and execution context a background task's turn runs under.
515
+
516
+ A task names its own workspace (its worktree, for an isolated one) and its
517
+ own mode; the session's are not its. Without this the runner sent every
518
+ task's tools to the session's directory, whatever the task said.
519
+ """
520
+ cfg = dict(config or {})
521
+ cfg["_delegate_context_only"] = True
522
+ mode = str(getattr(task, "mode", "") or "read-only")
523
+ if mode != "read-only" and cfg.get("permission_mode") in _READ_ONLY_MODES:
524
+ raise PermissionError("A child cannot exceed the parent permission mode")
525
+ cfg["permission_mode"] = "read-only" if mode == "read-only" else "workspace-write"
526
+ context: dict = {"_session_id": str(getattr(task, "session_id", "") or "")}
527
+ workspace = str(getattr(task, "workspace", "") or "")
528
+ if workspace:
529
+ cfg["_session_workspace_root"] = workspace
530
+ context["_workspace"] = workspace
531
+ spec = getattr(task, "worktree_spec", None)
532
+ if spec is not None:
533
+ context["_workspace_origin"] = str(spec.repository)
534
+ context["_workspace_restricted"] = True
535
+ return cfg, context
536
+
537
+
538
+ async def run_subagent_turn(prompt: str, task: Any, *, local_tools, tool_schemas: List[dict],
539
+ config: dict, api_url: Optional[str]) -> str:
540
+ """Run one background task through the same runtime as a chat turn."""
541
+ cfg, context = subagent_run_options(config, task)
542
+ from aria_code.runtime.agent_profiles import get_profile
543
+ profile = get_profile(str(getattr(task, "agent", "general")))
544
+ delegation = {"spawn_task", "task_cancel", "task_status", "task_result", "task_list", "list_agents", "list_task_context"}
545
+ allowed = set(local_tools) - delegation
546
+ if profile.tools is not None:
547
+ allowed.intersection_update(profile.tools)
548
+ if "_agent_allowed_tools" in cfg:
549
+ allowed.intersection_update(cfg["_agent_allowed_tools"])
550
+ cfg["_agent_allowed_tools"] = sorted(allowed)
551
+ tools = {name: value for name, value in local_tools.items() if name in allowed}
552
+ schemas = [s for s in tool_schemas if (s.get("function") or s).get("name") in allowed]
553
+ from aria_code.runtime.task_context import CONTEXT_POLICY
554
+ from aria_code.runtime.task_verification import MAX_RECEIPTS, receipt_from_record
555
+
556
+ def record_evidence(record):
557
+ if task is None:
558
+ return
559
+ if not hasattr(task, "evidence"):
560
+ task.evidence = []
561
+ if len(task.evidence) >= MAX_RECEIPTS:
562
+ task.evidence_truncated = True
563
+ return
564
+ task.evidence.append(receipt_from_record(record, str(getattr(task, "workspace", "") or ".")))
565
+
566
+ result = await run_chat_via_runtime(
567
+ prompt=prompt, history=[], local_tools=tools, tool_schemas=schemas,
568
+ model=str(cfg.get("model") or ""), config=cfg, api_url=api_url,
569
+ ollama_url=str(cfg.get("ollama_url") or "http://localhost:11434"),
570
+ execution_context=lambda: dict(context), return_result=True,
571
+ tool_record_sink=record_evidence,
572
+ max_rounds=min(int(getattr(task, "max_rounds", profile.max_rounds)), profile.max_rounds),
573
+ system_override=("You are a delegated Aria task agent. Stay within the task goal, available tools and inherited permissions. "
574
+ "Never delegate, publish, send messages, deploy or claim unexecuted checks. "
575
+ "End with FINDINGS: ...; CHANGED_FILES: ...; VERIFICATION: ...; BLOCKERS: ... . "
576
+ "Report actual source locations and executed checks; say when checks were not run.\n"
577
+ + CONTEXT_POLICY + profile.instructions),
578
+ )
579
+ if getattr(result, "error", None):
580
+ raise RuntimeError(str(result.error))
581
+ final = getattr(result, "final", None)
582
+ if (getattr(result, "cancelled", False) or (final is not None and
583
+ (not getattr(final, "success", False) or (getattr(final, "acceptance", None) or {}).get("verified") is False))):
584
+ raise RuntimeError("The delegated runtime did not complete with accepted execution")
585
+ return str(getattr(result, "text", "") or "")
586
+