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,132 @@
1
+ """Score the independent reviewer on fixed changes: false positives and misses.
2
+
3
+ python -m aria_code.evals.review_probe evals/review/cases.yaml --model <id> [--repeat 3] [--report out.json]
4
+
5
+ The suites measure the builder; the reviewer (runtime/review.py) blocks or
6
+ passes the builder's diff, and nothing measured whether it is right to. Each
7
+ case is a goal and a diff with the verdict it should get: ``expect: pass``
8
+ for a correct change it must not block (a false positive costs a repair
9
+ round and the user's trust), ``expect: block`` for one that misses the goal
10
+ (a miss lets a wrong change through), optionally with ``mentions_any`` — the
11
+ finding must name one of these.
12
+
13
+ A reviewer that errors or answers out of format is an ERROR, not a verdict,
14
+ like an agent that never ran. The exit code is 1 only for errors.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import argparse
20
+ import asyncio
21
+ import json
22
+ import sys
23
+ from dataclasses import dataclass
24
+ from pathlib import Path
25
+ from typing import Any, Awaitable, Callable
26
+
27
+ import yaml
28
+
29
+ PASS, FAIL, ERROR = "pass", "fail", "error"
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class Case:
34
+ id: str
35
+ goal: str
36
+ diff: str
37
+ expect: str # "pass" | "block"
38
+ mentions_any: tuple[str, ...] = ()
39
+
40
+
41
+ def load_cases(path: str | Path) -> list[Case]:
42
+ data = yaml.safe_load(Path(path).read_text(encoding="utf-8")) or {}
43
+ cases = []
44
+ for raw in data.get("cases") or []:
45
+ expect = str(raw.get("expect") or "")
46
+ if expect not in ("pass", "block") or not raw.get("goal") or not raw.get("diff"):
47
+ raise ValueError(f"case {raw.get('id')!r}: needs goal, diff and expect: pass|block")
48
+ cases.append(Case(id=str(raw["id"]), goal=str(raw["goal"]), diff=str(raw["diff"]), expect=expect,
49
+ mentions_any=tuple(str(m) for m in raw.get("mentions_any") or ())))
50
+ return cases
51
+
52
+
53
+ def score(case: Case, report: Any) -> tuple[str, str]:
54
+ """(outcome, detail) for one reviewer answer."""
55
+ if getattr(report, "verdict", "") == "error":
56
+ return ERROR, f"reviewer error: {getattr(report, 'error', '')}"
57
+ blocking = list(getattr(report, "blocking", ()) or ())
58
+ if case.expect == "pass":
59
+ if blocking:
60
+ return FAIL, f"false positive: {len(blocking)} blocking — {blocking[0].issue[:120]}"
61
+ return PASS, "not blocked"
62
+ if not blocking:
63
+ return FAIL, "missed: no blocking finding"
64
+ text = " ".join(f"{getattr(f, 'file', '')} {getattr(f, 'issue', '')}" for f in blocking).lower()
65
+ if case.mentions_any and not any(m.lower() in text for m in case.mentions_any):
66
+ return FAIL, f"blocked, but not for {' / '.join(case.mentions_any)}: {blocking[0].issue[:120]}"
67
+ return PASS, f"blocked: {blocking[0].issue[:120]}"
68
+
69
+
70
+ Review = Callable[..., Awaitable[Any]]
71
+
72
+
73
+ async def run_cases(cases: list[Case], review: Review, *, repeat: int = 1) -> list[dict]:
74
+ results = []
75
+ for attempt in range(1, max(1, repeat) + 1):
76
+ for case in cases:
77
+ try:
78
+ report = await review(goal=case.goal, diff=case.diff)
79
+ outcome, detail = score(case, report)
80
+ except Exception as exc: # a provider outage is not the reviewer's verdict
81
+ outcome, detail = ERROR, f"{type(exc).__name__}: {exc}"
82
+ results.append({"case": case.id, "expect": case.expect, "attempt": attempt,
83
+ "outcome": outcome, "detail": detail})
84
+ return results
85
+
86
+
87
+ def summary(results: list[dict]) -> dict:
88
+ def rate(expect: str) -> dict:
89
+ scored = [r for r in results if r["expect"] == expect and r["outcome"] != ERROR]
90
+ return {"passed": sum(r["outcome"] == PASS for r in scored), "scored": len(scored)}
91
+
92
+ return {"correct_changes_not_blocked": rate("pass"), "wrong_changes_blocked": rate("block"),
93
+ "errors": sum(r["outcome"] == ERROR for r in results), "results": results}
94
+
95
+
96
+ def _gate_review(model: str) -> Review:
97
+ from aria_code.aria_cli import load_config
98
+ from aria_code.apps.cli.providers.runtime_bridge import build_review_gate
99
+
100
+ config = {**load_config(), "review_gate": True}
101
+ if model:
102
+ config["model"] = model
103
+ gate = build_review_gate(config, model=config.get("model", ""), api_url=config.get("api_url"),
104
+ ollama_url=config.get("ollama_url", "http://localhost:11434"))
105
+ return gate.run
106
+
107
+
108
+ def main(argv: list[str] | None = None) -> int:
109
+ parser = argparse.ArgumentParser(prog="review_probe", description=__doc__.splitlines()[0])
110
+ parser.add_argument("cases")
111
+ parser.add_argument("--model", default="")
112
+ parser.add_argument("--repeat", type=int, default=1)
113
+ parser.add_argument("--report", default="")
114
+ args = parser.parse_args(argv)
115
+
116
+ cases = load_cases(args.cases)
117
+ results = asyncio.run(run_cases(cases, _gate_review(args.model), repeat=args.repeat))
118
+ for r in results:
119
+ icon = {PASS: "✓", FAIL: "✗"}.get(r["outcome"], "!")
120
+ print(f" {icon} {r['case']} (expect {r['expect']}) — {r['detail']}")
121
+ data = summary(results)
122
+ ok, wrong = data["correct_changes_not_blocked"], data["wrong_changes_blocked"]
123
+ print(f"\nreviewer: correct changes not blocked {ok['passed']}/{ok['scored']} · "
124
+ f"wrong changes blocked {wrong['passed']}/{wrong['scored']}"
125
+ + (f" · {data['errors']} error" if data["errors"] else ""))
126
+ if args.report:
127
+ Path(args.report).write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
128
+ return 1 if data["errors"] else 0
129
+
130
+
131
+ if __name__ == "__main__":
132
+ sys.exit(main())
@@ -0,0 +1,425 @@
1
+ """Command-line entry point for the verifiable eval suites.
2
+
3
+ python3 -m aria_code.evals.runner evals/suites/core.yaml
4
+ python3 -m aria_code.evals.runner evals/suites/core.yaml --tag logistics
5
+ python3 -m aria_code.evals.runner evals/suites/core.yaml --check # no agent
6
+
7
+ ``--check`` is the mode worth knowing about. It runs every task's pre-flight
8
+ and nothing else, so it answers "is this suite still measuring anything?"
9
+ without a model, an API key, or a minute of runtime. Run it in CI: a fixture
10
+ that has drifted green is a silent scoreboard inflation, and this is what
11
+ catches it on the commit that caused it rather than a month later.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import argparse
17
+ import json
18
+ import sys
19
+ from pathlib import Path
20
+
21
+ from .harness import (
22
+ ERROR,
23
+ FAIL,
24
+ INVALID,
25
+ PASS,
26
+ SuiteResult,
27
+ TaskResult,
28
+ load_suite,
29
+ run_suite,
30
+ write_report,
31
+ )
32
+
33
+ _ICONS = {PASS: "✓", FAIL: "✗", INVALID: "⚠", ERROR: "!"}
34
+
35
+
36
+ class _TimedOut:
37
+ """Marker: the agent was cut off before it could finish.
38
+
39
+ Carries a non-zero ``returncode`` so the harness's existing solver-failure
40
+ check classifies it as ERROR — excluded from the score — rather than as a
41
+ task the model failed.
42
+ """
43
+
44
+ returncode = 124
45
+ # Read by the harness so the report counts timeouts on their own line
46
+ # instead of folding them, unseen, into "error".
47
+ timed_out = True
48
+
49
+ def __init__(self, seconds: int, stdout: str = "", stderr: str = "") -> None:
50
+ self.stderr = f"{stderr}\nthe agent was still working when the {seconds}s budget ran out".strip()
51
+ self.stdout = stdout
52
+
53
+
54
+ class Trajectories:
55
+ """Each attempt's events as JSONL, closed with the outcome the check gave.
56
+
57
+ The material a model learns an agent's job from is the sequence, not the
58
+ final answer: which file it read, what it ran, what came back, what it
59
+ changed, and whether the check then passed. `-p --format jsonl` already
60
+ emits that; this keeps one file per task attempt and, once the suite is
61
+ scored, appends an `eval.outcome` line, so passing runs can be selected.
62
+ """
63
+
64
+ def __init__(self, root: Path, suite: str, model: str) -> None:
65
+ self.root = Path(root) / suite
66
+ self.root.mkdir(parents=True, exist_ok=True)
67
+ self.model = model
68
+ self._files: dict[str, list[Path]] = {}
69
+
70
+ def record(self, task_id: str, prompt: str, stdout: str) -> Path:
71
+ attempt = len(self._files.get(task_id, [])) + 1
72
+ path = self.root / f"{task_id}-{attempt}.jsonl"
73
+ header = json.dumps({"type": "eval.task", "task_id": task_id, "attempt": attempt,
74
+ "model": self.model, "prompt": prompt}, ensure_ascii=False)
75
+ body = "\n".join(line for line in str(stdout or "").splitlines() if line.startswith("{"))
76
+ path.write_text(header + "\n" + (body + "\n" if body else ""), encoding="utf-8")
77
+ self._files.setdefault(task_id, []).append(path)
78
+ return path
79
+
80
+ def close(self, results) -> None:
81
+ """Append each attempt's outcome, in the order the attempts ran."""
82
+ seen: dict[str, int] = {}
83
+ for result in results:
84
+ files = self._files.get(result.task_id, [])
85
+ index = seen.get(result.task_id, 0)
86
+ seen[result.task_id] = index + 1
87
+ if index >= len(files):
88
+ continue
89
+ line = json.dumps({"type": "eval.outcome", "outcome": result.outcome, "detail": result.detail,
90
+ "changed": list(result.changed), "seconds": round(result.seconds, 2)},
91
+ ensure_ascii=False)
92
+ with files[index].open("a", encoding="utf-8") as handle:
93
+ handle.write(line + "\n")
94
+
95
+
96
+ def check_only_solver(prompt: str, workspace: Path) -> None:
97
+ """A solver that does nothing, so only the pre-flight is exercised.
98
+
99
+ Every task should come back FAIL under it. A PASS means the fixture is
100
+ already green; anything else means the fixture or its check is broken.
101
+ """
102
+ return None
103
+
104
+
105
+ def native_command(prompt: str, workspace: Path, *, model: str = "", native: str = "") -> list:
106
+ """The native agent (Rust frontend, Go runtime) over one task, headless.
107
+
108
+ The tuned model is served by the native runtime, so its training
109
+ trajectories must come from it too: the tools it learns are the ones it
110
+ will have.
111
+ """
112
+ import os
113
+ import shutil
114
+
115
+ binary = native or os.environ.get("ARIA_NATIVE_BINARY") or shutil.which("aria-native") or "aria-native"
116
+ command = [binary, "-C", str(workspace), "exec", "--jsonl", prompt, "--", "--dangerously-skip-permissions"]
117
+ if model:
118
+ command.extend(["--model", model])
119
+ return command
120
+
121
+
122
+ def build_agent_solver(*, model: str = "", timeout: int = 900, local: bool = False,
123
+ trajectories: "Trajectories | None" = None, events: bool = False,
124
+ runtime: str = "python", native: str = "", go_runtime: str = ""):
125
+ """Drive the real Aria agent over one task, in the task's own workspace.
126
+
127
+ The agent is invoked as a subprocess in headless mode rather than in this
128
+ process on purpose: a task that leaves the interpreter's cwd, module cache
129
+ or event loop in a strange state then cannot contaminate the next task's
130
+ score.
131
+
132
+ ``--dangerously-skip-permissions`` is not optional here, and it is safe for
133
+ the same reason the flag is dangerous everywhere else: the agent is pointed
134
+ at a throwaway copy of a fixture. Without it every write waits on an
135
+ approval prompt that no one is there to answer, so every task times out and
136
+ the suite scores zero for a reason that has nothing to do with the model.
137
+ """
138
+ import subprocess
139
+
140
+ def _solve(prompt: str, workspace: Path):
141
+ if runtime == "native":
142
+ return _run(native_command(prompt, workspace, model=model, native=native), prompt, workspace)
143
+ command = [
144
+ sys.executable, "-m", "aria_code.aria_cli",
145
+ "-p", prompt,
146
+ "--dangerously-skip-permissions",
147
+ "--no-banner",
148
+ ]
149
+ if trajectories is not None or events:
150
+ # One JSON event per tool call on stdout; the screen output stays
151
+ # on stderr, which is what a failed task's log tail shows. Behaviour
152
+ # checks read these events too.
153
+ command.extend(["--format", "jsonl"])
154
+ if model:
155
+ command.extend(["--model", model])
156
+ if local:
157
+ command.append("--local")
158
+ return _run(command, prompt, workspace)
159
+
160
+ def _run(command: list, prompt: str, workspace: Path):
161
+ try:
162
+ import os
163
+
164
+ # The task's own check runs under `{python}`, this interpreter, which has
165
+ # what the suite `requires:` (pytest). The agent types `python3`: put this
166
+ # interpreter first on its PATH, or its acceptance check meets a different
167
+ # python with no pytest, reports "No module named pytest", and the model
168
+ # spends its budget trying to install it.
169
+ env = {**os.environ, "PATH": os.pathsep.join([str(Path(sys.executable).parent), os.environ.get("PATH", "")])}
170
+ # Each attempt gets its own home, so global memory, sessions and
171
+ # learned preferences one attempt writes cannot reach the next one.
172
+ env.update(trial_home_env(workspace.parent / f".home-{workspace.name}"))
173
+ # The agent reports the tokens it used here, outside the workspace so the
174
+ # file is never mistaken for a change the agent made.
175
+ usage_file = workspace.parent / f".usage-{workspace.name}.json"
176
+ usage_file.unlink(missing_ok=True)
177
+ env["ARIA_USAGE_FILE"] = str(usage_file)
178
+ if trajectories is not None or events or runtime == "native":
179
+ if trajectories is not None or events:
180
+ env["ARIA_EVENTS_FULL"] = "1"
181
+ if runtime == "native" and (go_runtime or os.environ.get("ARIA_GO_RUNTIME_BINARY")):
182
+ env["ARIA_RUNTIME"] = go_runtime or os.environ["ARIA_GO_RUNTIME_BINARY"]
183
+ done = subprocess.run(
184
+ command,
185
+ cwd=str(workspace),
186
+ # A headless agent must never wait for input: inheriting an open stdin
187
+ # (a terminal, a pipe that never closes) stalls it before its first event.
188
+ stdin=subprocess.DEVNULL,
189
+ capture_output=True,
190
+ text=True,
191
+ encoding="utf-8",
192
+ timeout=timeout,
193
+ check=False,
194
+ env=env,
195
+ )
196
+ if trajectories is not None:
197
+ trajectories.record(workspace.name, prompt, done.stdout)
198
+ done.usage = _read_usage(usage_file)
199
+ return done
200
+ except subprocess.TimeoutExpired as exc:
201
+ # A truncated run is not a measured failure.
202
+ #
203
+ # I first scored this as FAIL, reasoning "it had its time and
204
+ # produced nothing". That holds only when the budget is generous
205
+ # relative to how long the work takes. It was not: the same task
206
+ # completed in 78–146s alone and exceeded 600s inside a suite,
207
+ # where back-to-back turns contend and get throttled. Scoring that
208
+ # as FAIL blamed the model for the harness cutting it off — which
209
+ # is precisely the confusion PASS/FAIL vs ERROR exists to prevent.
210
+ # TimeoutExpired may carry bytes even with text=True. Keep partial
211
+ # tool events and diagnostics so a stalled run can be investigated.
212
+ def _text(value):
213
+ return value.decode("utf-8", errors="replace") if isinstance(value, bytes) else (value or "")
214
+ stdout, stderr = _text(exc.stdout), _text(exc.stderr)
215
+ if trajectories is not None:
216
+ trajectories.record(workspace.name, prompt, stdout)
217
+ timed_out = _TimedOut(timeout, stdout, stderr)
218
+ timed_out.usage = _read_usage(workspace.parent / f".usage-{workspace.name}.json")
219
+ return timed_out
220
+
221
+ return _solve
222
+
223
+
224
+ # What a trial home is seeded with from the real Aria home: sign-in and provider
225
+ # settings, so the agent reaches the same model. Nothing it remembers (memory,
226
+ # sessions, the ARIA.md profile, skills it learned) is copied.
227
+ _TRIAL_HOME_SEED = ("config.json", "providers.json", ".env", "license.json")
228
+
229
+
230
+ def trial_home_env(home: Path) -> dict:
231
+ """Environment for one attempt: a fresh HOME / ARIA_HOME / XDG tree under *home*.
232
+
233
+ Provider keys and PATH stay as they are (they come from the inherited
234
+ environment); the user's site-packages stay importable through
235
+ PYTHONUSERBASE, and their git identity through a copied .gitconfig.
236
+ """
237
+ import os
238
+ import shutil
239
+ import site
240
+
241
+ from aria_code.packages.aria_core.paths import aria_home
242
+
243
+ source_aria = aria_home()
244
+ real_home = Path.home()
245
+ shutil.rmtree(home, ignore_errors=True)
246
+ aria = home / ".aria-code"
247
+ aria.mkdir(parents=True)
248
+ for name in _TRIAL_HOME_SEED:
249
+ if (source_aria / name).is_file():
250
+ shutil.copy2(source_aria / name, aria / name)
251
+ if (real_home / ".gitconfig").is_file():
252
+ shutil.copy2(real_home / ".gitconfig", home / ".gitconfig")
253
+ xdg = {key: home / sub for key, sub in (
254
+ ("XDG_CONFIG_HOME", ".config"), ("XDG_DATA_HOME", ".local/share"),
255
+ ("XDG_CACHE_HOME", ".cache"), ("XDG_STATE_HOME", ".local/state"))}
256
+ for path in xdg.values():
257
+ path.mkdir(parents=True, exist_ok=True)
258
+ env = {
259
+ "HOME": str(home),
260
+ "USERPROFILE": str(home),
261
+ "ARIA_HOME": str(aria),
262
+ "ARIA_CONFIG_DIR": str(aria),
263
+ "PYTHONUSERBASE": os.environ.get("PYTHONUSERBASE") or site.getuserbase(),
264
+ **{key: str(path) for key, path in xdg.items()},
265
+ }
266
+ return env
267
+
268
+
269
+ def _read_usage(path: Path) -> dict:
270
+ """What the agent wrote to ARIA_USAGE_FILE, or {} when it wrote nothing."""
271
+ try:
272
+ data = json.loads(path.read_text(encoding="utf-8"))
273
+ except (OSError, ValueError):
274
+ return {}
275
+ finally:
276
+ path.unlink(missing_ok=True)
277
+ return data if isinstance(data, dict) else {}
278
+
279
+
280
+ def _print_result(result: TaskResult) -> None:
281
+ icon = _ICONS.get(result.outcome, "?")
282
+ line = f" {icon} {result.task_id} ({result.seconds:.1f}s)"
283
+ if result.detail:
284
+ line += f" — {result.detail}"
285
+ print(line)
286
+ for item in result.behavior:
287
+ print(f" {'✓' if item['passed'] else '✗'} {item['check']} — {item['detail']}")
288
+ if result.outcome == FAIL and result.changed:
289
+ print(f" changed: {', '.join(result.changed)}")
290
+ if result.outcome in (FAIL, INVALID, ERROR) and result.log:
291
+ for log_line in result.log.splitlines()[-8:]:
292
+ print(f" {log_line}")
293
+
294
+
295
+ def main(argv: list[str] | None = None) -> int:
296
+ parser = argparse.ArgumentParser(prog="aria-evals", description=__doc__)
297
+ parser.add_argument("suite", help="path to a suite YAML file")
298
+ parser.add_argument("--fixtures", default="", help="fixtures root (default: <suite>/../fixtures)")
299
+ parser.add_argument("--only", nargs="*", default=[], help="run only these task ids")
300
+ parser.add_argument("--tag", nargs="*", default=[], help="run only tasks with these tags")
301
+ parser.add_argument("--check", action="store_true",
302
+ help="run only the pre-flight: verify every task still starts red")
303
+ parser.add_argument("--model", default="", help="model to pass to the agent")
304
+ parser.add_argument("--local", action="store_true",
305
+ help="run the agent local-only (Ollama), skipping the cloud backend")
306
+ parser.add_argument("--runtime", choices=("python", "native"), default="python",
307
+ help="agent to run: the Python CLI, or the native Rust/Go runtime that serves Aria's tuned "
308
+ "models (default python)")
309
+ parser.add_argument("--native-binary", default="", help="aria-native for --runtime native (default: $ARIA_NATIVE_BINARY)")
310
+ parser.add_argument("--go-runtime", default="",
311
+ help="aria-runtime for --runtime native (default: $ARIA_GO_RUNTIME_BINARY)")
312
+ parser.add_argument("--solve-timeout", type=int, default=900,
313
+ help="seconds to give the agent per task (default 900)")
314
+ parser.add_argument("--repeat", type=int, default=1, metavar="N",
315
+ help="run the suite N times; pass@1 is then passes/attempts (default 1)")
316
+ parser.add_argument("--report", default="", help="write the scoreboard to this JSON path")
317
+ parser.add_argument("--keep", action="store_true", help="keep task workspaces for inspection")
318
+ parser.add_argument("--trajectories", default="",
319
+ help="write each attempt's events (JSONL) and outcome under this folder")
320
+ parser.add_argument("--scratch", default="", help="scratch root (implies --keep)")
321
+ args = parser.parse_args(argv)
322
+
323
+ suite_path = Path(args.suite).expanduser().resolve()
324
+ fixtures = Path(args.fixtures).expanduser().resolve() if args.fixtures else (
325
+ suite_path.parent.parent / "fixtures"
326
+ )
327
+
328
+ try:
329
+ name, tasks = load_suite(suite_path)
330
+ except Exception as exc:
331
+ print(f"could not load suite: {exc}", file=sys.stderr)
332
+ return 2
333
+
334
+ if not tasks:
335
+ print(f"suite {name} has no tasks", file=sys.stderr)
336
+ return 2
337
+
338
+ trajectories = (Trajectories(Path(args.trajectories), name, args.model)
339
+ if args.trajectories and not args.check else None)
340
+ solver = check_only_solver if args.check else build_agent_solver(
341
+ model=args.model, timeout=args.solve_timeout, local=args.local, trajectories=trajectories,
342
+ events=any(task.behavior for task in tasks), runtime=args.runtime,
343
+ native=args.native_binary, go_runtime=args.go_runtime,
344
+ )
345
+ mode = "pre-flight only" if args.check else f"agent{f' ({args.model})' if args.model else ''}"
346
+ print(f"\n{name} — {len(tasks)} task(s), {mode}\n")
347
+
348
+ repeats = max(1, args.repeat)
349
+ suite: SuiteResult | None = None
350
+ for attempt in range(repeats):
351
+ if repeats > 1:
352
+ print(f" — attempt {attempt + 1}/{repeats} —")
353
+ run = run_suite(
354
+ tasks,
355
+ solver=solver,
356
+ fixtures_root=fixtures,
357
+ name=name,
358
+ only=args.only,
359
+ tags=args.tag,
360
+ scratch_root=args.scratch or None,
361
+ keep_workspace=args.keep,
362
+ on_result=_print_result,
363
+ )
364
+ if suite is None:
365
+ suite = run
366
+ else:
367
+ suite.merge(run)
368
+ assert suite is not None
369
+ if trajectories is not None:
370
+ trajectories.close(suite.results)
371
+ print(f"trajectories → {trajectories.root}")
372
+
373
+ print(f"\n{suite.summary_line()}")
374
+ if repeats > 1:
375
+ # Print the per-task record, because an aggregate hides the tasks that
376
+ # flip. A task at 2/3 is a different engineering problem from two tasks
377
+ # at 1/1 and 1/2.
378
+ for task_id, stats in sorted(suite.per_task().items()):
379
+ if stats["attempts"]:
380
+ print(f" {task_id:<28} {stats['passed']}/{stats['attempts']}")
381
+ by_tag = suite.by_tag()
382
+ if by_tag and not args.check:
383
+ for tag, stats in by_tag.items():
384
+ if stats["scored"]:
385
+ print(f" {tag:<16} {stats['passed']}/{stats['scored']} ({stats['pass_rate']:.0%})")
386
+
387
+ if args.report:
388
+ print(f"\nreport → {write_report(suite, args.report)}")
389
+
390
+ if args.check:
391
+ # In check mode the only acceptable outcome is "every task is still
392
+ # broken". A pass here means a fixture drifted green and the suite is
393
+ # quietly measuring less than it claims.
394
+ #
395
+ # "Could not run" is reported separately from "drifted green" because
396
+ # they call for opposite responses and were previously indistinguishable:
397
+ # CI installed the package without pytest, every task errored with
398
+ # "environment is missing pytest", and the verdict said five fixtures had
399
+ # stopped being red. That reads as a fixture problem and sends whoever
400
+ # sees it to look at the fixtures, which are fine.
401
+ errored = [r for r in suite.results if r.outcome == ERROR]
402
+ drifted = [r.task_id for r in suite.results
403
+ if r.outcome != FAIL and r.outcome != ERROR]
404
+
405
+ if errored:
406
+ print(f"\n✗ {len(errored)} task(s) could not run — this is an "
407
+ f"environment problem, not a drifted fixture:")
408
+ for result in errored:
409
+ print(f" {result.task_id}: {result.detail}")
410
+ print("\n The suite declares what it needs with `requires:`. "
411
+ "Install it and run again;")
412
+ print(" `pip install -e \".[dev]\"` covers the pytest the shipped "
413
+ "suite asks for.")
414
+ if drifted:
415
+ print(f"\n✗ {len(drifted)} task(s) no longer start red: {', '.join(drifted)}")
416
+ if errored or drifted:
417
+ return 1
418
+ print(f"\n✓ all {len(suite.results)} task(s) still start red")
419
+ return 0
420
+
421
+ return 0 if suite.failed == 0 and suite.errored == 0 and suite.invalid == 0 else 1
422
+
423
+
424
+ if __name__ == "__main__":
425
+ raise SystemExit(main())