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,432 @@
1
+ """The delivery report — how a coding turn ends, written from evidence.
2
+
3
+ A turn used to end with whatever the model chose to say: "I have successfully
4
+ implemented…", sometimes over a red test run, sometimes with nothing changed.
5
+ The runtime knows better than the model what happened — which files changed and
6
+ by how much, which checks ran and how they came out, what the change contract
7
+ refused, the riskiest thing that ran, and where the checkpoints are — so it
8
+ writes the ending itself, in one fixed shape:
9
+
10
+ DONE
11
+
12
+ Changed
13
+ M src/auth/session.py +43 -18
14
+ A src/auth/refresh.py +82
15
+
16
+ Verified
17
+ ✓ python3 -m pytest -q
18
+
19
+ Review
20
+ Not reviewed
21
+
22
+ Risk
23
+ L1 low · Edit files
24
+
25
+ Checkpoint
26
+ 2 checkpoints · /rewind code <run>
27
+
28
+ Next
29
+ Ready to commit
30
+
31
+ The status comes from evidence, never from the model's text: a turn that
32
+ stopped early, or whose checks are red, is INCOMPLETE however confident its
33
+ last message sounds.
34
+
35
+ A turn that changed nothing, ran no checks and had nothing refused gets no
36
+ report: questions and read-only exploration end as they always did.
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ import re
42
+ from dataclasses import dataclass, field
43
+ from pathlib import Path
44
+ from typing import Any, Iterable, Mapping, Optional, Sequence
45
+
46
+ from aria_code.safety.risk import LEVEL_NAMES, assess_tool
47
+
48
+ from .acceptance import DEFAULT_MUTATING_TOOLS, extract_mutated_paths
49
+
50
+
51
+ @dataclass
52
+ class ChangedFile:
53
+ path: str
54
+ added: int = 0
55
+ removed: int = 0
56
+ created: bool = False
57
+ # Definitions touched, from runtime/semantic_diff: "refresh() modified".
58
+ symbols: tuple = ()
59
+ # Test files that reference what changed (repo_map), relative to the root.
60
+ tested_by: tuple = ()
61
+
62
+ @property
63
+ def mark(self) -> str:
64
+ return "A" if self.created else "M"
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class DeliveryReport:
69
+ status: str # "done" | "incomplete"
70
+ changed: tuple = ()
71
+ checks: tuple = () # ({"command", "passed", "exit_code"}, …)
72
+ not_run: tuple = () # ({"command", "reason"}, …): checks whose tool is missing
73
+ verified: Optional[bool] = None
74
+ review: str = "Not reviewed"
75
+ review_lines: tuple = ()
76
+ behaviour: Optional[dict] = None
77
+ risk_level: Optional[int] = None
78
+ risk_summary: str = ""
79
+ checkpoints: tuple = ()
80
+ refused: tuple = ()
81
+ stop_reason: str = "completed"
82
+ next: str = ""
83
+ impact: str = "" # what depends on the changed files (project graph)
84
+
85
+ @property
86
+ def worth_showing(self) -> bool:
87
+ return bool(self.changed or self.checks or self.refused)
88
+
89
+ @property
90
+ def added(self) -> int:
91
+ return sum(item.added for item in self.changed)
92
+
93
+ @property
94
+ def removed(self) -> int:
95
+ return sum(item.removed for item in self.changed)
96
+
97
+ def as_dict(self) -> dict:
98
+ extra = {"not_run": [dict(item) for item in self.not_run]} if self.not_run else {} # absent when empty, so the two reports stay comparable
99
+ return {
100
+ **extra,
101
+ "status": self.status,
102
+ "changed": [vars(item).copy() for item in self.changed],
103
+ "checks": [dict(item) for item in self.checks],
104
+ "verified": self.verified,
105
+ "review": self.review,
106
+ "review_lines": list(self.review_lines),
107
+ "behaviour": dict(self.behaviour) if self.behaviour else None,
108
+ "risk": None if self.risk_level is None else {
109
+ "level": self.risk_level, "name": LEVEL_NAMES[self.risk_level], "summary": self.risk_summary},
110
+ "checkpoints": list(self.checkpoints),
111
+ "refused": [dict(item) for item in self.refused],
112
+ "stop_reason": self.stop_reason,
113
+ "next": self.next,
114
+ "impact": self.impact,
115
+ }
116
+
117
+ @classmethod
118
+ def from_dict(cls, data: Mapping[str, Any]) -> "DeliveryReport":
119
+ risk = data.get("risk") or {}
120
+ return cls(
121
+ status=str(data.get("status") or "done"),
122
+ changed=tuple(ChangedFile(**{**item, "symbols": tuple(item.get("symbols") or ()),
123
+ "tested_by": tuple(item.get("tested_by") or ())})
124
+ for item in data.get("changed") or ()),
125
+ checks=tuple(dict(item) for item in data.get("checks") or ()),
126
+ not_run=tuple(dict(item) for item in data.get("not_run") or ()),
127
+ verified=data.get("verified"),
128
+ review=str(data.get("review") or "Not reviewed"),
129
+ review_lines=tuple(data.get("review_lines") or ()),
130
+ behaviour=data.get("behaviour") or None,
131
+ risk_level=risk.get("level"),
132
+ risk_summary=str(risk.get("summary") or ""),
133
+ checkpoints=tuple(data.get("checkpoints") or ()),
134
+ refused=tuple(dict(item) for item in data.get("refused") or ()),
135
+ stop_reason=str(data.get("stop_reason") or "completed"),
136
+ next=str(data.get("next") or ""),
137
+ impact=str(data.get("impact") or ""),
138
+ )
139
+
140
+ def render(self, *, rewind_hint: str = "", root: Optional[Path | str] = None) -> str:
141
+ lines = [self.status.upper()]
142
+ if self.changed:
143
+ width = max(len(_display(item.path, root)) for item in self.changed)
144
+ lines += ["", "Changed"]
145
+ for item in self.changed:
146
+ stats = f"+{item.added}" + (f" -{item.removed}" if item.removed or not item.created else "")
147
+ lines.append(f" {item.mark} {_display(item.path, root):<{width}} {stats}")
148
+ if item.symbols:
149
+ shown = " · ".join(item.symbols[:4])
150
+ more = f" · +{len(item.symbols) - 4}" if len(item.symbols) > 4 else ""
151
+ lines.append(f" {shown}{more}")
152
+ if item.tested_by:
153
+ shown = ", ".join(item.tested_by[:3])
154
+ more = f" +{len(item.tested_by) - 3}" if len(item.tested_by) > 3 else ""
155
+ lines.append(f" tested by {shown}{more}")
156
+ if len(self.changed) > 1:
157
+ lines.append(f" {len(self.changed)} files · +{self.added} / -{self.removed}")
158
+ if self.impact:
159
+ lines.append(f" impact {self.impact}")
160
+ lines += ["", "Verified"]
161
+ if self.checks:
162
+ for check in self.checks:
163
+ ok = check.get("passed")
164
+ tail = "" if ok else f" (exit {check.get('exit_code')})"
165
+ if not ok and check.get("preexisting"):
166
+ tail += " — already failing before this change"
167
+ lines.append(f" {'✓' if ok else '✗'} {check.get('command', '')}{tail}")
168
+ new = check.get("new_failures") or ()
169
+ if new:
170
+ shown = ", ".join(new[:3]) + (f" … +{len(new) - 3}" if len(new) > 3 else "")
171
+ lines.append(f" new failures: {shown}")
172
+ if self.verified is None and self.changed:
173
+ lines.append(" ⚠ changed again after the last check")
174
+ elif not self.not_run:
175
+ lines.append(" — no check ran" + (" (none could be inferred)" if self.changed else ""))
176
+ for item in self.not_run:
177
+ lines.append(f" · not run: {item.get('command', '')} — {item.get('reason', '')}")
178
+ if self.behaviour:
179
+ lines += ["", "Behaviour"]
180
+ for key in ("before", "after", "why", "impact"):
181
+ if self.behaviour.get(key):
182
+ lines.append(f" {key.capitalize():<7}{self.behaviour[key]}")
183
+ lines += ["", "Review"] + [f" {line}" for line in (self.review_lines or (self.review,))]
184
+ if self.risk_level is not None:
185
+ lines += ["", "Risk", f" L{self.risk_level} {LEVEL_NAMES[self.risk_level]}"
186
+ + (f" · {self.risk_summary}" if self.risk_summary else "")]
187
+ if self.refused:
188
+ lines += ["", "Contract"]
189
+ lines += [f" × {item.get('tool', '')}: {item.get('reason', '')}" for item in self.refused]
190
+ if self.checkpoints:
191
+ count = len(self.checkpoints)
192
+ label = f"{count} checkpoint{'s' if count != 1 else ''}"
193
+ lines += ["", "Checkpoint", f" {label}" + (f" · {rewind_hint}" if rewind_hint else "")]
194
+ if self.next:
195
+ lines += ["", "Next", f" {self.next}"]
196
+ return "\n".join(lines)
197
+
198
+
199
+ def _display(path: str, root: Optional[Path | str]) -> str:
200
+ if root:
201
+ try:
202
+ return Path(path).resolve().relative_to(Path(root).expanduser().resolve()).as_posix()
203
+ except (ValueError, OSError):
204
+ pass
205
+ return path
206
+
207
+
208
+ _TEST_PATH = re.compile(r"(^|/)(tests?|__tests__|spec)/|(^|/)test_[^/]+$|_test\.[a-z]+$|\.(test|spec)\.[a-z]+$")
209
+
210
+
211
+ def _is_test_path(path: str) -> bool:
212
+ return bool(_TEST_PATH.search(path.replace("\\", "/")))
213
+
214
+
215
+ def _diff_stats(diff: str) -> tuple[int, int, bool]:
216
+ added = removed = 0
217
+ created = False
218
+ for line in (diff or "").splitlines():
219
+ if line.startswith("+++") or line.startswith("---"):
220
+ if line.startswith("--- /dev/null"):
221
+ created = True
222
+ continue
223
+ if line.startswith("+"):
224
+ added += 1
225
+ elif line.startswith("-"):
226
+ removed += 1
227
+ return added, removed, created
228
+
229
+
230
+ def _data(result: Any) -> Mapping:
231
+ if not isinstance(result, Mapping):
232
+ return {}
233
+ data = result.get("data")
234
+ return data if isinstance(data, Mapping) else result
235
+
236
+
237
+ @dataclass
238
+ class DeliveryLedger:
239
+ """What a turn did, recorded as it happens; turned into a report at the end."""
240
+
241
+ root: Optional[str] = None
242
+ mutating_tools: frozenset = DEFAULT_MUTATING_TOOLS
243
+ _changed: dict = field(default_factory=dict)
244
+ _checkpoints: list = field(default_factory=list)
245
+ _diffs: list = field(default_factory=list)
246
+ _file_diffs: dict = field(default_factory=dict)
247
+ _risk: Optional[tuple] = None
248
+
249
+ def record(self, tool: str, params: Mapping | None, result: Any) -> None:
250
+ if isinstance(result, Mapping) and result.get("contract_violation"):
251
+ return # refused calls did not run; the contract summary has them
252
+ if isinstance(result, Mapping) and result.get("success") is not False:
253
+ assessment = assess_tool(tool, params or {}, root=self.root)
254
+ if self._risk is None or assessment.level > self._risk[0]:
255
+ self._risk = (assessment.level, assessment.summary)
256
+ paths = extract_mutated_paths(tool, result, mutating_tools=self.mutating_tools)
257
+ if not paths:
258
+ return
259
+ data = _data(result)
260
+ diff = str(data.get("diff") or "")
261
+ if diff.strip():
262
+ self._diffs.append(diff if diff.endswith("\n") else diff + "\n")
263
+ added, removed, created = _diff_stats(diff)
264
+ action = str(data.get("action") or "").lower()
265
+ created = created or action in {"created", "create", "write new file"}
266
+ for index, path in enumerate(paths):
267
+ entry = self._changed.get(path)
268
+ if entry is None:
269
+ entry = self._changed[path] = ChangedFile(path=path, created=created)
270
+ if index == 0: # one diff per call; attribute it to the first path
271
+ entry.added += added
272
+ entry.removed += removed
273
+ if diff.strip():
274
+ self._file_diffs.setdefault(path, []).append(diff)
275
+ checkpoint = data.get("checkpoint_id")
276
+ if checkpoint and checkpoint not in self._checkpoints:
277
+ self._checkpoints.append(str(checkpoint))
278
+
279
+ @property
280
+ def changed(self) -> bool:
281
+ return bool(self._changed)
282
+
283
+ def _symbol_changes(self, path: str) -> list:
284
+ diffs = self._file_diffs.get(path)
285
+ if not diffs:
286
+ return []
287
+ try:
288
+ from .semantic_diff import file_symbol_changes
289
+
290
+ return list(file_symbol_changes(path, diffs) or [])
291
+ except Exception:
292
+ return []
293
+
294
+ def _tested_by(self, changes: Sequence) -> tuple:
295
+ """Test files that reference a definition this change added or modified.
296
+
297
+ A method counts only where its class is referenced too: "get" alone
298
+ appears in half the tests of any project.
299
+ """
300
+ wanted = [c.name.split(".") for c in changes if c.kind != "removed"]
301
+ if not wanted or not self.root:
302
+ return ()
303
+ try:
304
+ from .repo_map import get_repo_map
305
+
306
+ refs = get_repo_map(self.root).refs
307
+ except Exception:
308
+ return ()
309
+ found: set = set()
310
+ for parts in wanted:
311
+ files = set(refs.get(parts[-1], ()))
312
+ for outer in parts[:-1]:
313
+ files &= set(refs.get(outer, ()))
314
+ found |= {f for f in files if _is_test_path(f)}
315
+ return tuple(sorted(found))
316
+
317
+ @staticmethod
318
+ def _impact(changed) -> str:
319
+ sources = [item.path for item in changed if not _is_test_path(item.path)]
320
+ if not sources:
321
+ return ""
322
+ try:
323
+ from .project_graph import impact_line, impact_of_paths
324
+
325
+ return impact_line(impact_of_paths(sources))
326
+ except Exception:
327
+ return ""
328
+
329
+ def diff_text(self) -> str:
330
+ """Every applied change's diff, in order — what a reviewer reads."""
331
+ return "".join(self._diffs)
332
+
333
+ def report(
334
+ self,
335
+ *,
336
+ acceptance: Optional[Mapping] = None,
337
+ contract: Optional[Mapping] = None,
338
+ review: Optional[Mapping] = None,
339
+ stop_reason: str = "completed",
340
+ ) -> DeliveryReport:
341
+ checks: list = []
342
+ not_run: list = []
343
+ reports = list((acceptance or {}).get("reports") or [])
344
+ if reports:
345
+ for c in reports[-1].get("checks") or []:
346
+ if c.get("not_run"):
347
+ not_run.append({"command": c.get("command", ""), "reason": str(c["not_run"])})
348
+ continue
349
+ checks.append(
350
+ {"command": c.get("command", ""), "passed": bool(c.get("passed")), "exit_code": c.get("exit_code"),
351
+ **({"preexisting": True} if c.get("preexisting") else {}),
352
+ **({"new_failures": list(c["new_failures"])} if c.get("new_failures") else {})})
353
+ verified = (acceptance or {}).get("verified")
354
+ refused = tuple(dict(item) for item in (contract or {}).get("refused") or ())
355
+ changed = tuple(self._changed.values())
356
+ for item in changed:
357
+ changes = self._symbol_changes(item.path)
358
+ item.symbols = tuple(change.label() for change in changes)
359
+ item.tested_by = self._tested_by(changes)
360
+
361
+ if stop_reason != "completed":
362
+ status = "incomplete"
363
+ next_step = {
364
+ "max_rounds": "Ran out of rounds — continue, or narrow the task",
365
+ "budget_exhausted": "Budget reached — raise it or narrow the task",
366
+ "loop_guard": "Stopped repeating a failing call — look at the error above",
367
+ "checks_failed": "Fix the failing checks",
368
+ "text_tool_calls": "The model wrote tool calls as text — retry the turn",
369
+ "prompt_echo": "The model stopped without an answer — retry the turn",
370
+ }.get(stop_reason, f"Stopped: {stop_reason}")
371
+ elif verified is False and checks and all(c["passed"] or c.get("preexisting") for c in checks):
372
+ # Red only where it was red before this change (runtime/baseline.py).
373
+ status = "done"
374
+ next_step = "Ready to commit — the failing checks already failed before this change"
375
+ elif verified is False or any(not c["passed"] for c in checks):
376
+ status = "incomplete"
377
+ next_step = "Fix the failing checks"
378
+ elif not_run and changed and verified is None:
379
+ # What could run passed; the tests did not run. Not verified, and not a failure.
380
+ status = "done"
381
+ next_step = f"Run the tests yourself — {not_run[0]['reason']}"
382
+ elif changed:
383
+ status = "done"
384
+ next_step = ("Ready to commit" if verified else
385
+ "Review the changes — no check ran" if not checks else
386
+ "Re-run the checks: files changed after the last run")
387
+ else:
388
+ status = "done"
389
+ next_step = ""
390
+ review_blocks = bool(review) and review.get("verdict") == "blocking"
391
+ if review_blocks and status == "done":
392
+ status = "incomplete"
393
+ next_step = "Address the review's blocking findings"
394
+ if refused and status == "done":
395
+ next_step = "Some calls were refused by the change contract — see above" if not changed \
396
+ else next_step + " · some calls were refused by the contract"
397
+
398
+ return DeliveryReport(
399
+ status=status,
400
+ changed=changed,
401
+ checks=tuple(checks),
402
+ not_run=tuple(not_run),
403
+ verified=verified,
404
+ impact=self._impact(changed),
405
+ review=str((review or {}).get("headline") or "Not reviewed"),
406
+ review_lines=tuple((review or {}).get("lines") or ()),
407
+ behaviour=(review or {}).get("behaviour") or None,
408
+ risk_level=self._risk[0] if self._risk else None,
409
+ risk_summary=self._risk[1] if self._risk else "",
410
+ checkpoints=tuple(self._checkpoints),
411
+ refused=refused,
412
+ stop_reason=stop_reason,
413
+ next=next_step,
414
+ )
415
+
416
+
417
+ def report_from_activities(
418
+ activities: Iterable[tuple[str, Mapping, Any]],
419
+ *,
420
+ root: Optional[str] = None,
421
+ acceptance: Optional[Mapping] = None,
422
+ contract: Optional[Mapping] = None,
423
+ review: Optional[Mapping] = None,
424
+ stop_reason: str = "completed",
425
+ ) -> DeliveryReport:
426
+ ledger = DeliveryLedger(root=root)
427
+ for tool, params, result in activities:
428
+ ledger.record(tool, params, result)
429
+ return ledger.report(acceptance=acceptance, contract=contract, review=review, stop_reason=stop_reason)
430
+
431
+
432
+ __all__ = ["ChangedFile", "DeliveryLedger", "DeliveryReport", "report_from_activities"]
@@ -0,0 +1,113 @@
1
+ """Runtime event and trace records for Aria Code."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import time
6
+ import uuid
7
+ from dataclasses import asdict, dataclass, field
8
+ from typing import Any, Callable, Dict, List, Optional
9
+
10
+
11
+ @dataclass(frozen=True)
12
+ class RuntimeEvent:
13
+ event_id: str
14
+ type: str
15
+ timestamp: float
16
+ data: Dict[str, Any] = field(default_factory=dict)
17
+
18
+ @classmethod
19
+ def create(cls, event_type: str, data: Dict[str, Any] | None = None) -> "RuntimeEvent":
20
+ return cls(uuid.uuid4().hex[:12], event_type, time.time(), data or {})
21
+
22
+ def to_dict(self) -> Dict[str, Any]:
23
+ return asdict(self)
24
+
25
+
26
+ @dataclass(frozen=True)
27
+ class ToolCallRecord:
28
+ tool: str
29
+ params: Dict[str, Any]
30
+ result: Dict[str, Any]
31
+ elapsed_ms: float
32
+ started_at: float
33
+ ended_at: float
34
+
35
+ def to_dict(self) -> Dict[str, Any]:
36
+ return asdict(self)
37
+
38
+
39
+ @dataclass(frozen=True)
40
+ class TurnResultRecord:
41
+ status: str
42
+ success: bool
43
+ cancelled: bool
44
+ provider: str
45
+ error: str
46
+ final_text: str
47
+ summary: str
48
+ metadata: Dict[str, Any] = field(default_factory=dict)
49
+ timestamp: float = field(default_factory=time.time)
50
+
51
+ def to_dict(self) -> Dict[str, Any]:
52
+ return asdict(self)
53
+
54
+
55
+ class RuntimeTrace:
56
+ """In-memory trace of runtime events for session replay/debugging."""
57
+
58
+ def __init__(
59
+ self,
60
+ event_sink: Optional[Callable[[RuntimeEvent], None]] = None,
61
+ ) -> None:
62
+ self.events: List[RuntimeEvent] = []
63
+ self.tool_calls: List[ToolCallRecord] = []
64
+ self.turn_results: List[TurnResultRecord] = []
65
+ self.event_sink = event_sink
66
+
67
+ def emit(self, event_type: str, data: Dict[str, Any] | None = None) -> RuntimeEvent:
68
+ event = RuntimeEvent.create(event_type, data)
69
+ self.events.append(event)
70
+ if self.event_sink is not None:
71
+ try:
72
+ self.event_sink(event)
73
+ except Exception:
74
+ # Observability must never turn a successful tool call into a
75
+ # failed one. The in-memory trace remains available as fallback.
76
+ pass
77
+ return event
78
+
79
+ def add_tool_call(self, record: ToolCallRecord) -> None:
80
+ self.tool_calls.append(record)
81
+ self.emit("tool_result", {
82
+ "tool": record.tool,
83
+ "success": bool(record.result.get("success")),
84
+ "elapsed_ms": record.elapsed_ms,
85
+ })
86
+
87
+ def add_turn_result(self, record: Dict[str, Any]) -> TurnResultRecord:
88
+ turn = TurnResultRecord(
89
+ status=str(record.get("status", "")),
90
+ success=bool(record.get("success")),
91
+ cancelled=bool(record.get("cancelled")),
92
+ provider=str(record.get("provider", "")),
93
+ error=str(record.get("error", "")),
94
+ final_text=str(record.get("final_text", "")),
95
+ summary=str(record.get("summary", "")),
96
+ metadata=dict(record.get("metadata") or {}),
97
+ )
98
+ self.turn_results.append(turn)
99
+ self.emit("turn_complete", {
100
+ "status": turn.status,
101
+ "success": turn.success,
102
+ "cancelled": turn.cancelled,
103
+ "provider": turn.provider,
104
+ "summary": turn.summary,
105
+ })
106
+ return turn
107
+
108
+ def to_dict(self) -> Dict[str, Any]:
109
+ return {
110
+ "events": [event.to_dict() for event in self.events],
111
+ "tool_calls": [call.to_dict() for call in self.tool_calls],
112
+ "turn_results": [turn.to_dict() for turn in self.turn_results],
113
+ }