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,169 @@
1
+ """Explicit model diagnostics using the selected transport, without file tools."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import asyncio
6
+ from dataclasses import asdict, dataclass
7
+ import json
8
+ import time
9
+
10
+ from aria_code.apps.cli.providers.chat_routing import first_round_route
11
+ from aria_code.packages.aria_services.provider_health import classify_provider_error
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class ModelProbe:
16
+ model: str
17
+ route: str
18
+ success: bool
19
+ category: str
20
+ message: str
21
+ duration_ms: int
22
+ text_verified: bool = False
23
+ tools_verified: bool = False
24
+ provider: str = ""
25
+ first_token_ms: int | None = None
26
+ suggestion: str = ""
27
+ schema: str = "aria.model_probe.v1"
28
+
29
+ def to_dict(self) -> dict:
30
+ return asdict(self)
31
+
32
+
33
+ _PROBE_TOOL = {"type": "function", "function": {
34
+ "name": "aria_probe_ping",
35
+ "description": "A diagnostic echo with no file access or side effects.",
36
+ "parameters": {"type": "object", "properties": {"echo": {"type": "string"}}, "required": ["echo"]},
37
+ }}
38
+
39
+
40
+ async def probe_model(config: dict, api_url: str = "", *, tools: bool = False,
41
+ timeout: float = 30) -> ModelProbe:
42
+ """One text request, optionally one inert tool call and its round trip.
43
+
44
+ Do not use the agent gateway: its provider fallback and project tools can
45
+ hide a broken primary route or perform work. Never change saved settings.
46
+ """
47
+ from aria_code.apps.cli.providers.base import AriaSSEProvider, ConfiguredProvider, OllamaProvider
48
+ from aria_code.packages.aria_sdk.streaming import stream_provider_result
49
+
50
+ cfg = dict(config)
51
+ model = str(cfg.get("model") or "")
52
+ route = first_round_route(model, cfg, api_url)
53
+ started = time.monotonic()
54
+ cancel = asyncio.Event()
55
+ text_ok = tool_ok = False
56
+ provider_name = ""
57
+ first_token = None
58
+
59
+ def token(_text):
60
+ nonlocal first_token
61
+ if _text.strip() and first_token is None:
62
+ first_token = round((time.monotonic() - started) * 1000)
63
+
64
+ def result(ok, category, message, suggestion=""):
65
+ return ModelProbe(model, route, ok, category, message,
66
+ round((time.monotonic() - started) * 1000),
67
+ text_ok, tool_ok, provider_name, first_token, suggestion)
68
+
69
+ def failed(error):
70
+ raw = str(error or "empty_response")
71
+ if "ollama_model_unavailable:" in raw:
72
+ return result(False, "model_unavailable", "The selected Ollama model is not installed or could not be verified.",
73
+ "Run ollama list and /model; install the exact model with ollama pull <model> if needed.")
74
+ if "backend_local_tools_unsupported" in raw or "tool_protocol" in raw:
75
+ return result(False, "protocol_unsupported", "Backend does not support the local tool protocol.",
76
+ "Update the backend protocol or use a direct provider for local project tasks.")
77
+ issue = classify_provider_error(provider_name or route, error)
78
+ suggestions = {
79
+ "auth": "Check credentials and project permissions; for Google Cloud, verify gcloud/ADC authorization.",
80
+ "configuration": "Set your Google Cloud project: /config set gcp_project=<project-id> or GOOGLE_CLOUD_PROJECT.",
81
+ "model_unavailable": "Check the selected model ID, project and serving region with /model.",
82
+ "rate_limited": "Wait for the quota cooldown or check the provider quota.",
83
+ "timeout": "Check network and provider latency; increase --timeout if needed.",
84
+ "no_data": "The selected route returned no visible text; check its streaming/model configuration.",
85
+ }
86
+ return result(False, issue.category, issue.message,
87
+ suggestions.get(issue.category, "Check the selected provider and connection settings."))
88
+
89
+ def provider(local_tools=False):
90
+ if route == "cloud":
91
+ return AriaSSEProvider(api_url, model, auth_token=cfg.get("auth_token"),
92
+ use_react_gateway=bool(cfg.get("arthera_react_gateway")),
93
+ local_tools=local_tools)
94
+ if route == "ollama":
95
+ return OllamaProvider(str(cfg.get("ollama_url") or "http://localhost:11434"), model,
96
+ system_override="Only perform the requested diagnostic.",
97
+ show_market_prefetch_status=False, include_ambient_context=False)
98
+ return ConfiguredProvider(cfg, model)
99
+
100
+ async def run():
101
+ nonlocal text_ok, tool_ok, provider_name
102
+ reply = await stream_provider_result(provider(), "Reply with the single word READY.", [],
103
+ tools=[], cancel_event=cancel, on_token=token)
104
+ provider_name = str(reply.get("provider") or route)
105
+ if not reply.get("success") or not str(reply.get("response") or "").strip():
106
+ return failed(reply.get("error") or "empty_response")
107
+ text_ok = True
108
+ if not tools:
109
+ return result(True, "ok", "Selected model returned visible text.")
110
+ diagnostic = provider(local_tools=True)
111
+ request = "Call aria_probe_ping exactly once with echo='READY'. Do not answer in text before calling it."
112
+ call = await stream_provider_result(diagnostic, request, [], tools=[_PROBE_TOOL], cancel_event=cancel)
113
+ if not call.get("success"):
114
+ return failed(call.get("error"))
115
+ calls = list(call.get("tool_calls_pending") or [])
116
+ if len(calls) != 1 or calls[0].get("tool") != "aria_probe_ping" or calls[0].get("params") != {"echo": "READY"}:
117
+ return result(False, "tool_protocol", "Model did not return the requested diagnostic tool call.",
118
+ "Check that this model and transport support function calling.")
119
+ history = [{"role": "user", "content": request},
120
+ {"role": "assistant", "content": "", "tool_calls": [{"id": "aria-probe-1", "type": "function",
121
+ "function": {"name": "aria_probe_ping", "arguments": '{"echo":"READY"}'}}]},
122
+ {"role": "tool", "name": "aria_probe_ping", "tool_call_id": "aria-probe-1", "content": '{"echo":"READY"}'}]
123
+ reply = await stream_provider_result(diagnostic, "The diagnostic tool returned READY. Reply READY.", history,
124
+ tools=[], cancel_event=cancel)
125
+ if not reply.get("success") or not str(reply.get("response") or "").strip():
126
+ return failed(reply.get("error") or "empty_response")
127
+ tool_ok = True
128
+ return result(True, "ok", "Selected model returned text and completed the diagnostic tool round trip.")
129
+
130
+ try:
131
+ return await asyncio.wait_for(run(), timeout=timeout)
132
+ except asyncio.TimeoutError:
133
+ return failed("model probe timed out")
134
+ except Exception as exc:
135
+ return failed(exc)
136
+ finally:
137
+ cancel.set()
138
+
139
+
140
+ def main(argv=None) -> int:
141
+ """Fast standalone equivalent of /health --model; no REPL or agent import."""
142
+ parser = argparse.ArgumentParser(prog="aria health", description="Probe the selected model without accessing project files")
143
+ parser.add_argument("--model", action="store_true", help="Send a short text generation request")
144
+ parser.add_argument("--tools", action="store_true", help="Also verify an inert tool call and its result")
145
+ parser.add_argument("--model-id", help="Probe this model without changing your saved selection")
146
+ parser.add_argument("--timeout", type=float, default=30, help="Total probe deadline in seconds (1–60)")
147
+ parser.add_argument("--json", action="store_true")
148
+ args = parser.parse_args(argv)
149
+ if not 1 <= args.timeout <= 60:
150
+ parser.error("--timeout must be between 1 and 60 seconds")
151
+ from aria_code.apps.cli.bootstrap import initialize_cli_environment, default_config, runtime_paths
152
+ from aria_code.apps.cli.config_store import load_cli_config
153
+
154
+ initialize_cli_environment()
155
+ cfg = load_cli_config(runtime_paths(), default_config())
156
+ if args.model_id:
157
+ cfg["model"] = args.model_id
158
+ if not (args.model or args.tools):
159
+ report = ModelProbe(str(cfg.get("model") or ""), first_round_route(str(cfg.get("model") or ""), cfg, cfg.get("api_url")),
160
+ False, "not_probed", "Run aria health --model to test generation; add --tools to test function calling.", 0)
161
+ else:
162
+ report = asyncio.run(probe_model(cfg, str(cfg.get("api_url") or ""), tools=args.tools, timeout=args.timeout))
163
+ if args.json:
164
+ print(json.dumps(report.to_dict(), ensure_ascii=False))
165
+ else:
166
+ print(f"{report.model} · {report.route} · {report.category}: {report.message}")
167
+ if report.suggestion:
168
+ print(report.suggestion)
169
+ return 0 if report.success else (2 if report.category == "not_probed" else 1)
@@ -0,0 +1,65 @@
1
+ """Models Google has retired, and what Aria moves their users to.
2
+
3
+ Google's Vertex AI lifecycle page retires gemini-2.5-pro, -flash and
4
+ -flash-lite on 20 October 2026 (the release notes give 16 October, so plan
5
+ for the earlier date); the Gemini API already admits only users who have
6
+ used 2.5 before. gemini-2.0-flash and -flash-lite shut down on 1 June 2026,
7
+ and every 1.5 model in 2025. A saved config that still names one of them
8
+ would fail on every request with an error that does not say why.
9
+
10
+ So a retired id is replaced when the config is loaded, and the replacement
11
+ is written back so it happens once: a stable model, not a short-term one,
12
+ so an install that is rarely updated does not break again within months.
13
+ The replacements follow Google's recommendations; 2.5 Flash moves to 3.8
14
+ Flash rather than a Lite model so the user loses nothing in capability.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re
20
+
21
+ # bare id -> bare replacement
22
+ RETIRED: dict[str, str] = {
23
+ "gemini-2.5-pro": "gemini-3.8-flash",
24
+ "gemini-2.5-flash": "gemini-3.8-flash",
25
+ "gemini-2.5-flash-lite": "gemini-3.1-flash-lite",
26
+ "gemini-2.0-flash": "gemini-3.8-flash",
27
+ "gemini-2.0-flash-lite": "gemini-3.1-flash-lite",
28
+ "gemini-1.5-pro": "gemini-3.8-flash",
29
+ "gemini-1.5-flash": "gemini-3.8-flash",
30
+ "gemini-1.0-pro": "gemini-3.8-flash",
31
+ # The previous default. Google deprecated it on 2026-10-08 and routes it to 3.6 Flash.
32
+ "gemini-3.5-flash": "gemini-3.8-flash",
33
+ }
34
+
35
+ # Dated, versioned and preview spellings of the same models:
36
+ # gemini-2.5-pro-preview-06-05, gemini-2.0-flash-001, gemini-1.5-pro-latest.
37
+ _SUFFIX = re.compile(r"(-preview(-[\w-]+)?|-exp(-[\w-]+)?|-latest|-\d{3}|-\d{2}-\d{2}|-\d{2}-\d{4})+$")
38
+
39
+
40
+ def retired_replacement(model: str) -> str | None:
41
+ """The id to use instead of *model*, keeping its provider prefix; None if it is not retired."""
42
+ if not model:
43
+ return None
44
+ text = str(model).strip()
45
+ prefix, _, bare = text.rpartition("/")
46
+ key = _SUFFIX.sub("", bare.lower())
47
+ replacement = RETIRED.get(key)
48
+ if replacement is None:
49
+ return None
50
+ return f"{prefix}/{replacement}" if prefix else replacement
51
+
52
+
53
+ def migrate_config(config: dict, keys: tuple[str, ...] = ("model",)) -> list[tuple[str, str, str]]:
54
+ """Replace retired model ids in *config* in place; return (key, old, new) for each."""
55
+ changes = []
56
+ for key in keys:
57
+ old = config.get(key)
58
+ new = retired_replacement(old) if isinstance(old, str) else None
59
+ if new:
60
+ config[key] = new
61
+ changes.append((key, old, new))
62
+ return changes
63
+
64
+
65
+ __all__ = ["RETIRED", "migrate_config", "retired_replacement"]
@@ -0,0 +1,12 @@
1
+ """Legacy mascot spans for native frontends predating named Rust artwork."""
2
+ from __future__ import annotations
3
+
4
+ import os
5
+
6
+
7
+ def robot_rows(*, hidden: bool = False) -> list:
8
+ if hidden or os.environ.get("ARIA_ROBOT_RENDER", "").strip().lower() == "off":
9
+ return []
10
+ from aria_code.ui.robot import ROBOT_ROW_COUNT, get_robot_row
11
+ return [[{"style": style, "text": text} for style, text in get_robot_row(0, row)]
12
+ for row in range(ROBOT_ROW_COUNT)]
@@ -0,0 +1,118 @@
1
+ """Experimental, workspace-confined JSON-RPC worker for the Rust CLI.
2
+
3
+ The host selects the workspace and approves one named write via process flags.
4
+ Request parameters never establish permissions. Existing CLI handlers retain
5
+ their diff, change-store and verification behavior; stdout is protocol only.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import contextlib
11
+ import json
12
+ import sys
13
+ from pathlib import Path
14
+ from typing import Any
15
+
16
+ MAX_MESSAGE = 1_048_576
17
+ READ_TOOLS = frozenset({"read_file", "list_files", "search_code"})
18
+ WRITE_TOOLS = frozenset({"write_file", "edit_file"})
19
+
20
+
21
+ def error(code: int, message: str, request_id: Any = None) -> dict:
22
+ return {"jsonrpc": "2.0", "id": request_id, "error": {"code": code, "message": message}}
23
+
24
+
25
+ def execute(name: str, arguments: dict, workspace: Path, approved_tool: str | None) -> dict:
26
+ from aria_code.runtime.approval import ApprovalDecision
27
+ from aria_code.runtime.tool_executor import ToolExecutor
28
+ from aria_code.runtime.tool_policy import check_tool_policy
29
+
30
+ if name not in READ_TOOLS | WRITE_TOOLS:
31
+ return {"success": False, "error": f"Tool not exposed by native bridge: {name}"}
32
+ verdict = check_tool_policy(name)
33
+ if verdict == "deny":
34
+ return {"success": False, "error": "Blocked by persistent tool policy"}
35
+ approved = name in WRITE_TOOLS and name == approved_tool
36
+ if verdict == "ask" and not approved:
37
+ return {"success": False, "error": "Tool requires explicit approval; use the interactive Python CLI"}
38
+ if name in WRITE_TOOLS and not approved:
39
+ return {"success": False, "error": "Writes require host --approve-write for this invocation"}
40
+ def handler(params: dict) -> dict:
41
+ # Load UI-dependent write code only after ToolExecutor grants the path.
42
+ if name in READ_TOOLS:
43
+ from aria_code.apps.cli.tools import file_tools
44
+ return getattr(file_tools, "tool_" + name)(params)
45
+ from aria_code.apps.cli.tools import write_tools
46
+ cli = write_tools._ac()
47
+ console = getattr(cli, "console", None)
48
+ previous = console.file if console is not None else None
49
+ try:
50
+ if console is not None:
51
+ console.file = sys.stderr
52
+ return getattr(write_tools, "tool_" + name)(params)
53
+ finally:
54
+ if console is not None:
55
+ console.file = previous
56
+ executor = ToolExecutor(
57
+ {name: (handler,)},
58
+ config={"workspace_root": str(workspace), "permission_mode": "workspace-write" if approved else "read-only"},
59
+ execution_context=lambda: {"_workspace_restricted": True},
60
+ )
61
+ decision = ApprovalDecision.allow(user_approved=True, tool_scope=name) if approved else None
62
+ return executor.execute_local(name, arguments, approval=decision)
63
+
64
+
65
+ def dispatch(request: Any, workspace: Path, approved_tool: str | None = None) -> dict | None:
66
+ if not isinstance(request, dict):
67
+ return error(-32600, "Expected a single JSON-RPC request object")
68
+ request_id = request.get("id")
69
+ valid_id = request_id is None or isinstance(request_id, str) or type(request_id) is int
70
+ if request.get("jsonrpc") != "2.0" or not isinstance(request.get("method"), str) or not valid_id:
71
+ return error(-32600, "Invalid JSON-RPC request")
72
+ # This bridge only executes requests with an ID. Notifications never cause
73
+ # file changes and never produce a response, including unknown methods.
74
+ if "id" not in request:
75
+ return None
76
+ if request["method"] != "tools.call":
77
+ return error(-32601, "Method not found", request_id)
78
+ params = request.get("params")
79
+ if not isinstance(params, dict) or not isinstance(params.get("name"), str) or not isinstance(params.get("arguments"), dict):
80
+ return error(-32602, "Expected name and arguments object", request_id)
81
+ try:
82
+ with contextlib.redirect_stdout(sys.stderr):
83
+ result = execute(params["name"], params["arguments"], workspace, approved_tool)
84
+ return {"jsonrpc": "2.0", "id": request_id, "result": result}
85
+ except Exception as exc:
86
+ return error(-32603, f"Python tool failed: {exc}", request_id)
87
+
88
+
89
+ def main() -> None:
90
+ parser = argparse.ArgumentParser(description=__doc__)
91
+ parser.add_argument("--workspace", type=Path, required=True)
92
+ parser.add_argument("--approve-tool", choices=sorted(WRITE_TOOLS))
93
+ args = parser.parse_args()
94
+ workspace = args.workspace.expanduser().resolve(strict=True)
95
+ if not workspace.is_dir():
96
+ parser.error("workspace must be a directory")
97
+ # One request per process bounds trace memory and approval lifetime. Read
98
+ # size is bounded before JSON decoding; no unbounded readline allocation.
99
+ raw = sys.stdin.buffer.readline(MAX_MESSAGE + 1)
100
+ if len(raw) > MAX_MESSAGE:
101
+ response = error(-32600, "Request exceeds 1 MiB")
102
+ else:
103
+ try:
104
+ request = json.loads(raw)
105
+ except (ValueError, UnicodeDecodeError):
106
+ response = error(-32700, "Parse error")
107
+ else:
108
+ response = dispatch(request, workspace, args.approve_tool)
109
+ if response is not None:
110
+ encoded = json.dumps(response, ensure_ascii=True, allow_nan=False).encode("ascii")
111
+ if len(encoded) + 1 > MAX_MESSAGE:
112
+ encoded = json.dumps(error(-32603, "Response exceeds 1 MiB", response["id"])).encode("ascii")
113
+ sys.stdout.buffer.write(encoded + b"\n")
114
+ sys.stdout.buffer.flush()
115
+
116
+
117
+ if __name__ == "__main__":
118
+ main()
@@ -0,0 +1,58 @@
1
+ """Lightweight native frontend bootstrap and frozen worker entrypoints.
2
+
3
+ Rust owns the terminal; Python remains the provider/tool application service.
4
+ Private worker modes are dispatched before importing the legacy CLI. Setting
5
+ ARIA_FRONTEND=python explicitly keeps the original interface available.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import os
10
+ import subprocess
11
+ import sys
12
+
13
+
14
+ def dispatch_worker() -> None:
15
+ if sys.argv[1:2] != ["--aria-worker"]:
16
+ return
17
+ if len(sys.argv) < 3:
18
+ raise SystemExit("Missing worker mode")
19
+ mode = sys.argv[2]
20
+ del sys.argv[1:3]
21
+ os.environ["ARIA_FRONTEND"] = "python"
22
+ # The host assigns process containment before acknowledging startup.
23
+ if mode in ("app", "stream") and sys.stdin.buffer.read(1) != b"\n":
24
+ raise SystemExit(2)
25
+ if mode == "app":
26
+ from aria_code.apps.cli.app_server import main
27
+ elif mode == "bridge":
28
+ from aria_code.apps.cli.native_bridge import main
29
+ elif mode in ("cli", "stream"):
30
+ from aria_code.apps.cli.main import main
31
+ else:
32
+ raise SystemExit("Unknown worker mode")
33
+ main()
34
+ raise SystemExit(0)
35
+
36
+
37
+ def maybe_native() -> None:
38
+ if os.environ.get("ARIA_FRONTEND", "").lower() == "python":
39
+ return
40
+ # Never change pipe/headless output or load a UI in a non-terminal.
41
+ if not (sys.stdin.isatty() and sys.stdout.isatty()):
42
+ return
43
+ from aria_code.runtime.native_index import native_binary
44
+ binary = native_binary()
45
+ if not binary:
46
+ return # Pure Python wheels remain usable without a Rust installation.
47
+ try:
48
+ capability = subprocess.run([binary, "--entry-protocol"], capture_output=True,
49
+ timeout=3, check=False)
50
+ if capability.returncode or capability.stdout.strip() != b"1":
51
+ return # Old opt-in prototypes do not implement the formal entry.
52
+ except (OSError, subprocess.SubprocessError):
53
+ return
54
+ env = dict(os.environ, ARIA_PYTHON=sys.executable)
55
+ if os.name != "nt":
56
+ os.execve(binary, [binary, "--app", *sys.argv[1:]], env)
57
+ result = subprocess.run([binary, "--app", *sys.argv[1:]], env=env, check=False)
58
+ raise SystemExit(result.returncode)