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,125 @@
1
+ """Install a verified update in the background, the way Claude Code does.
2
+
3
+ The session keeps running on the version it started with. When a newer native
4
+ release is out, it is downloaded, checked and switched in behind the scenes,
5
+ and the header says "restart to use it". Nothing is interrupted: the new
6
+ version only takes over the next time Aria starts.
7
+
8
+ Only managed native installs update themselves. pip, npm and source checkouts
9
+ belong to their own tools, so they keep the plain "update available" notice.
10
+ Turn it off with `auto_update: false` in the config or `ARIA_AUTO_UPDATE=0`.
11
+ A version that failed to install is not retried for a day, and two sessions
12
+ never install at once.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ import os
19
+ import subprocess
20
+ import time
21
+ from pathlib import Path
22
+ from typing import Callable, Optional
23
+
24
+ RETRY_AFTER_FAILURE_S = 86_400
25
+ LOCK_STALE_S = 900
26
+
27
+
28
+ def enabled(config: dict) -> bool:
29
+ if os.environ.get("ARIA_AUTO_UPDATE", "").lower() in {"0", "false", "no", "off"}:
30
+ return False
31
+ if os.environ.get("ARIA_OFFLINE", "").lower() in {"1", "true", "yes", "on"}:
32
+ return False
33
+ return bool(config.get("auto_update", True))
34
+
35
+
36
+ def _state_path(app_root: Path) -> Path:
37
+ return app_root / "auto-update.json"
38
+
39
+
40
+ def _recently_failed(app_root: Path, version: str, now: float) -> bool:
41
+ try:
42
+ data = json.loads(_state_path(app_root).read_text())
43
+ except (OSError, ValueError):
44
+ return False
45
+ return data.get("failed") == version and now - float(data.get("at", 0)) < RETRY_AFTER_FAILURE_S
46
+
47
+
48
+ def _remember_failure(app_root: Path, version: str, now: float) -> None:
49
+ try:
50
+ _state_path(app_root).write_text(json.dumps({"failed": version, "at": now}))
51
+ except OSError:
52
+ pass
53
+
54
+
55
+ def _take_lock(app_root: Path, now: float) -> Optional[Path]:
56
+ lock = app_root / "auto-update.lock"
57
+ try:
58
+ if lock.exists() and now - lock.stat().st_mtime > LOCK_STALE_S:
59
+ lock.unlink()
60
+ fd = os.open(lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
61
+ except OSError:
62
+ return None
63
+ os.close(fd)
64
+ return lock
65
+
66
+
67
+ def install_if_newer(
68
+ current: str,
69
+ channel: str,
70
+ config: dict,
71
+ *,
72
+ check: Callable[..., tuple],
73
+ install: Callable[[str, dict], Path],
74
+ newer: Callable[[str, str], bool],
75
+ app_root: Path,
76
+ now: Optional[float] = None,
77
+ ) -> Optional[str]:
78
+ """Install the latest release when there is one; return its version, else None.
79
+
80
+ Blocking: run it off the event loop. Any failure leaves the installed
81
+ version untouched and returns None.
82
+ """
83
+ if channel != "native" or not enabled(config):
84
+ return None
85
+ try:
86
+ # New managed packages let Rust own retry state, update locking and
87
+ # install orchestration. Keep the Python implementation below for
88
+ # older bundles and source/wheel installs without the native helper.
89
+ from aria_code.apps.cli.updater import _native_update_helper
90
+
91
+ helper = _native_update_helper()
92
+ if helper is not None:
93
+ result = subprocess.run(
94
+ [str(helper), "update", "auto-install", "--current", current],
95
+ capture_output=True,
96
+ text=True,
97
+ timeout=600,
98
+ check=False,
99
+ )
100
+ if result.returncode == 0:
101
+ payload = json.loads(result.stdout)
102
+ if payload.get("status") in {"installed", "skipped", "failed"}:
103
+ version = payload.get("version")
104
+ return version if payload["status"] == "installed" and isinstance(version, str) else None
105
+ except Exception:
106
+ pass
107
+ stamp = time.time() if now is None else now
108
+ try:
109
+ app_root.mkdir(parents=True, exist_ok=True)
110
+ latest, release = check("native")
111
+ if not newer(latest, current) or _recently_failed(app_root, latest, stamp):
112
+ return None
113
+ lock = _take_lock(app_root, stamp)
114
+ if lock is None:
115
+ return None
116
+ try:
117
+ install(latest, release)
118
+ except Exception:
119
+ _remember_failure(app_root, latest, stamp)
120
+ return None
121
+ finally:
122
+ lock.unlink(missing_ok=True)
123
+ return latest
124
+ except Exception:
125
+ return None
@@ -0,0 +1,206 @@
1
+ """CLI bootstrap utilities shared by legacy and packaged entrypoints."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import socket
7
+ import ssl
8
+ import sys
9
+ import urllib.parse
10
+ from pathlib import Path
11
+
12
+ from aria_code.apps.cli.config_paths import resolve_paths
13
+
14
+
15
+ def load_aria_env(env_file: Path | None = None) -> None:
16
+ """Load persisted CLI environment values without overriding the process."""
17
+ target = env_file or (Path.home() / ".aria" / ".env")
18
+ if not target.exists():
19
+ return
20
+ try:
21
+ for line in target.read_text(encoding="utf-8").splitlines():
22
+ line = line.strip()
23
+ if not line or line.startswith("#") or "=" not in line:
24
+ continue
25
+ key, _, value = line.partition("=")
26
+ key = key.strip()
27
+ value = value.strip()
28
+ if key and value:
29
+ os.environ.setdefault(key, value)
30
+ except Exception:
31
+ return
32
+
33
+
34
+ def disable_broken_proxy(timeout: float = 1.5) -> None:
35
+ """Unset proxy variables when the configured proxy cannot be reached."""
36
+ proxy = (
37
+ os.environ.get("HTTPS_PROXY")
38
+ or os.environ.get("https_proxy")
39
+ or os.environ.get("HTTP_PROXY")
40
+ or os.environ.get("http_proxy")
41
+ )
42
+ if not proxy:
43
+ return
44
+ try:
45
+ parsed = urllib.parse.urlparse(proxy if "://" in proxy else f"http://{proxy}")
46
+ host = parsed.hostname
47
+ port = parsed.port or 80
48
+ if not host:
49
+ return
50
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
51
+ sock.settimeout(timeout)
52
+ alive = sock.connect_ex((host, port)) == 0
53
+ sock.close()
54
+ except Exception:
55
+ alive = False
56
+ if not alive:
57
+ for name in ("HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy", "ALL_PROXY", "all_proxy"):
58
+ os.environ.pop(name, None)
59
+
60
+
61
+ _LOOPBACK = ("localhost", "127.0.0.1", "::1")
62
+
63
+
64
+ def ensure_loopback_bypasses_proxy() -> None:
65
+ """With a proxy set, keep local services (Ollama, LM Studio, the API) off it.
66
+
67
+ HTTP clients honour HTTP(S)_PROXY, so a machine with a system proxy and no
68
+ NO_PROXY would send requests for localhost:11434 to the proxy and fail.
69
+ """
70
+ if not any(os.environ.get(name) for name in ("HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy",
71
+ "ALL_PROXY", "all_proxy")):
72
+ return
73
+ current = os.environ.get("NO_PROXY") or os.environ.get("no_proxy") or ""
74
+ entries = [item.strip() for item in current.split(",") if item.strip()]
75
+ missing = [host for host in _LOOPBACK if host not in entries]
76
+ if missing:
77
+ value = ",".join(entries + missing)
78
+ os.environ["NO_PROXY"] = value
79
+ os.environ["no_proxy"] = value
80
+
81
+
82
+ def prepare_network() -> None:
83
+ """Proxy settings every entry point needs before its first request."""
84
+ disable_broken_proxy()
85
+ ensure_loopback_bypasses_proxy()
86
+
87
+
88
+ def use_system_trust_store() -> bool:
89
+ """Verify TLS against the OS trust store instead of certifi's bundle.
90
+
91
+ Corporate and local TLS-intercepting proxies present their own CA. That CA
92
+ is installed in the system keychain — which is why ``curl`` works on such a
93
+ machine — but Python verifies against certifi, which has never heard of it,
94
+ so every HTTPS call fails with CERTIFICATE_VERIFY_FAILED.
95
+
96
+ This was not hypothetical: on a machine behind an intercepting proxy,
97
+ ``oauth2.googleapis.com`` failed 5 times out of 5 from Python and returned
98
+ 404 from curl, so roughly a third of Vertex turns died fetching an OAuth
99
+ token. Trusting the OS store fixed it without disabling verification —
100
+ which is the tempting wrong fix, and would accept any certificate at all.
101
+
102
+ Returns whether the injection happened, and never raises: an environment
103
+ without ``truststore`` keeps certifi's behaviour exactly as before.
104
+ """
105
+ try:
106
+ import truststore
107
+
108
+ truststore.inject_into_ssl()
109
+ return True
110
+ except Exception:
111
+ return False
112
+
113
+
114
+ def use_macos_ca_bundle() -> bool:
115
+ """Use macOS's verified CA bundle when Python has no default CA file.
116
+
117
+ Some standalone Python runtimes have no configured OpenSSL CA path, while
118
+ curl and the system browser can verify the same HTTPS service. This keeps
119
+ verification enabled and respects an explicit SSL_CERT_FILE override.
120
+ """
121
+ if sys.platform != "darwin" or os.environ.get("SSL_CERT_FILE"):
122
+ return False
123
+ if ssl.get_default_verify_paths().cafile:
124
+ return False
125
+ bundle = Path("/etc/ssl/cert.pem")
126
+ if not bundle.is_file():
127
+ return False
128
+ os.environ["SSL_CERT_FILE"] = str(bundle)
129
+ return True
130
+
131
+
132
+ def initialize_cli_environment() -> None:
133
+ os.environ.setdefault("TQDM_DISABLE", "1")
134
+ load_aria_env()
135
+ prepare_network()
136
+ if not use_system_trust_store():
137
+ use_macos_ca_bundle()
138
+
139
+
140
+ # The model used when nothing has been configured yet.
141
+ #
142
+ # This exists so there is ONE place that answers "which model by default".
143
+ # Call sites used to spell their own fallback — `config.get("model",
144
+ # "qwen2.5:7b")`, ten times over — which quietly made Ollama the answer
145
+ # whenever a config key was missing, no matter what the user had chosen.
146
+ # Provider configuration is the user's to make (that is what `/model` and
147
+ # `.ariarc` are for); the code's job is to have a sane default and then get
148
+ # out of the way.
149
+ DEFAULT_MODEL = os.getenv("ARIA_DEFAULT_MODEL", "google/gemini-3.8-flash")
150
+ # A stable model (Google: available until at least May 2027), not a short-term
151
+ # one: an install that is rarely updated should not lose its default within
152
+ # months. gemini-2.5-pro, the previous default, retires in October 2026.
153
+
154
+
155
+ def default_config() -> dict:
156
+ return {
157
+ # The Arthera backend and gateway. Not localhost: see endpoint_migration.
158
+ "api_url": os.getenv("ARTHERA_API_URL", "").strip() or "https://api.arthera.xyz",
159
+ "local_url": "http://localhost:8000",
160
+ "ollama_url": os.getenv("OLLAMA_URL") or os.getenv("OLLAMA_HOST") or "http://127.0.0.1:11434",
161
+ # Which backend serves a bare, unprefixed model name. Only consulted
162
+ # for names that do not name their own provider ("qwen2.5:7b"); a
163
+ # prefixed id like "google/gemini-3.8-flash" always wins.
164
+ "local_provider": os.getenv("ARIA_LLM_PROVIDER", "ollama"),
165
+ "provider_fallback": "configured",
166
+ "model": DEFAULT_MODEL,
167
+ "thinking_mode": "auto",
168
+ "watchlist": ["AAPL", "MSFT", "GOOGL", "TSLA", "NVDA"],
169
+ "auth_token": None,
170
+ "user_id": None,
171
+ "last_session_id": None,
172
+ "auto_save_sessions": True,
173
+ "auto_compact_context": True,
174
+ "auto_compact_threshold": 0.78,
175
+ "command_policy": "safe",
176
+ "permission_mode": "workspace-write",
177
+ # Approval by risk level (safety/risk.py): "manual" asks as before;
178
+ # "risk" runs actions at or below auto_approve_level (0-2) without a
179
+ # prompt. L4 always asks, even after "always allow".
180
+ "approval_mode": "manual",
181
+ "auto_approve_level": 1,
182
+ # Independent review of a turn's changes by a fresh-context reviewer
183
+ # before it ends (runtime/review.py). Costs one extra model call.
184
+ "review_gate": False,
185
+ # A different model for that review (provider/model); "" = the builder itself.
186
+ "review_model": "",
187
+ # The runtime's DONE/INCOMPLETE report under coding answers.
188
+ "delivery_report": True,
189
+ "network_enabled": True,
190
+ "data_sharing": False,
191
+ "feedback_upload": False,
192
+ "write_policy": "desktop_only",
193
+ "lsp_autocheck": False,
194
+ "input_style": "panel",
195
+ "input_theme": "auto",
196
+ "response_footer": "compact",
197
+ "report_agent_timeout": 40.0,
198
+ "report_synthesis_timeout": 20.0,
199
+ "local_mode": False,
200
+ "conversation_history": [],
201
+ "ui_lang": "",
202
+ }
203
+
204
+
205
+ def runtime_paths():
206
+ return resolve_paths()
@@ -0,0 +1,206 @@
1
+ """券商账户 / 持仓 / 订单的终端渲染 —— 从 aria_cli.py 抽出的第二块。
2
+
3
+ 原本在 aria_cli.py 的 4399-4578 行。跟 football_reports 一样,这些函数依赖
4
+ aria_cli 的模块级状态(``console`` / ``HAS_RICH`` / ``Panel`` / ``rich_box``),
5
+ 所以必须由 aria_cli 用 ``_rebind_module_function_globals`` 绑回它自己的
6
+ globals,不能只是普通 import。
7
+
8
+ 调用方有两种形态,重绑后都成立:
9
+ - ``apps/cli/commands/broker_cmds.py`` 用显式 ``from aria_cli import
10
+ _print_broker_account`` —— 读的是 aria_cli 的命名空间;
11
+ - ``tests/test_responsive_rendering.py`` 用 ``aria_cli._print_broker_positions``
12
+ —— 同上。
13
+
14
+ (这一组不像 football 那样被 mixin 裸名调用,但依赖 aria_cli 模块级 rich
15
+ 状态,所以约束是一样的。)
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ __all__ = [
21
+ "_print_broker_account",
22
+ "_print_broker_positions",
23
+ "_print_broker_orders",
24
+ ]
25
+
26
+
27
+ def _print_broker_account(acct: "AccountInfo"):
28
+ """Render AccountInfo in a Rich Panel."""
29
+ if not HAS_RICH:
30
+ print(f"{acct.label} 总资产:{acct.total_assets:,.2f} 可用:{acct.cash:,.2f} 市值:{acct.market_value:,.2f}")
31
+ return
32
+ pnl_color = "green" if acct.pnl_today >= 0 else "red"
33
+ pnl_sign = "+" if acct.pnl_today >= 0 else ""
34
+ body = (
35
+ f"[dim]账户:[/dim] [bold]{acct.masked_account}[/bold] [dim]({acct.broker_type})[/dim]\n\n"
36
+ f" 总资产 [bold]{acct.currency} {acct.total_assets:>14,.2f}[/bold]\n"
37
+ f" 持仓市值 [bold]{acct.market_value:>14,.2f}[/bold]\n"
38
+ f" 可用现金 [bold]{acct.cash:>14,.2f}[/bold]\n"
39
+ f" 冻结资金 [dim]{acct.frozen:>14,.2f}[/dim]\n"
40
+ f" 当日盈亏 [{pnl_color}]{pnl_sign}{acct.pnl_today:>14,.2f}[/{pnl_color}]\n"
41
+ )
42
+ if acct.pnl_total:
43
+ tp_color = "green" if acct.pnl_total >= 0 else "red"
44
+ body += f" 累计盈亏 [{tp_color}]{pnl_sign}{acct.pnl_total:>14,.2f}[/{tp_color}]\n"
45
+ console.print(Panel(body, title=f"[bold]{acct.label}[/bold]",
46
+ border_style="dim", box=rich_box.ROUNDED, padding=(0, 1)))
47
+
48
+
49
+ def _print_broker_positions(positions: list, broker_label: str, currency: str = "CNY"):
50
+ """Render Position list as a Rich Table."""
51
+ if not HAS_RICH:
52
+ for p in positions:
53
+ print(f" {p.symbol:<8} {p.name:<12} 持仓:{p.quantity} 市值:{p.market_value:,.2f} 盈亏:{p.pnl:+,.2f} ({p.pnl_pct:+.2f}%)")
54
+ return
55
+ if not positions:
56
+ console.print(f"[dim]{broker_label} — 当前无持仓[/dim]")
57
+ return
58
+ from rich.markup import escape as _esc
59
+ from ui.render.responsive import StackedRecord, render_stacked_records, structured_layout
60
+
61
+ ordered = sorted(positions, key=lambda x: -abs(x.market_value))
62
+ total_mv = sum(p.market_value for p in positions)
63
+ total_pnl = sum(p.pnl for p in positions)
64
+ total_color = "green" if total_pnl >= 0 else "red"
65
+ layout = structured_layout(console)
66
+ if layout == "stacked":
67
+ records = []
68
+ for p in ordered:
69
+ pnl_color = "green" if p.pnl >= 0 else "red"
70
+ records.append(StackedRecord(
71
+ headline=f"{_esc(str(p.symbol))} {_esc(str(p.name or '—'))}",
72
+ lines=(
73
+ f"[dim]持仓[/dim] {p.quantity:,.0f} · [dim]可卖[/dim] {p.available_qty:,.0f}",
74
+ f"[dim]成本[/dim] {p.cost_price:.3f} · [dim]现价[/dim] {p.current_price:.3f}",
75
+ f"[dim]市值[/dim] {p.market_value:,.2f} · "
76
+ f"[dim]盈亏[/dim] [{pnl_color}]{p.pnl:+,.2f} ({p.pnl_pct:+.2f}%)[/{pnl_color}]",
77
+ ),
78
+ ))
79
+ render_stacked_records(
80
+ console,
81
+ title=f"{_esc(str(broker_label))} 持仓",
82
+ records=records,
83
+ footer=(
84
+ f"共 {len(positions)} 只 · 总市值 {currency} {total_mv:,.2f} · "
85
+ f"总盈亏 [{total_color}]{total_pnl:+,.2f}[/{total_color}]"
86
+ ),
87
+ )
88
+ return
89
+ from rich.table import Table
90
+ tbl = Table(title=f"[bold]{broker_label}[/bold] 持仓", show_header=True, header_style="bold")
91
+ tbl.add_column("代码", style="bold", no_wrap=True)
92
+ tbl.add_column("名称", max_width=12)
93
+ tbl.add_column("持仓", justify="right")
94
+ if layout == "full":
95
+ tbl.add_column("可卖", justify="right", style="dim")
96
+ tbl.add_column("成本", justify="right", style="dim")
97
+ tbl.add_column("现价", justify="right")
98
+ tbl.add_column("市值", justify="right")
99
+ tbl.add_column("盈亏", justify="right")
100
+ tbl.add_column("盈亏%", justify="right")
101
+ for p in ordered:
102
+ pnl_color = "green" if p.pnl >= 0 else "red"
103
+ pnl_sign = "+" if p.pnl >= 0 else ""
104
+ row = [p.symbol, p.name[:12] or "—", f"{p.quantity:,.0f}"]
105
+ if layout == "full":
106
+ row.extend([
107
+ f"{p.available_qty:,.0f}",
108
+ f"{p.cost_price:.3f}",
109
+ f"{p.current_price:.3f}",
110
+ ])
111
+ row.extend([
112
+ f"{p.market_value:,.2f}",
113
+ f"[{pnl_color}]{pnl_sign}{p.pnl:,.2f}[/{pnl_color}]",
114
+ f"[{pnl_color}]{pnl_sign}{p.pnl_pct:.2f}%[/{pnl_color}]",
115
+ ])
116
+ tbl.add_row(*row)
117
+ console.print(tbl)
118
+ console.print(
119
+ f" [dim]共 {len(positions)} 只 总市值 {total_mv:,.2f} "
120
+ f"总盈亏 [{total_color}]{'+' if total_pnl>=0 else ''}{total_pnl:,.2f}[/{total_color}][/dim]"
121
+ )
122
+
123
+
124
+ def _print_broker_orders(orders: list, broker_label: str, status_filter: str = "all"):
125
+ """Render Order list as a Rich Table."""
126
+ if not HAS_RICH:
127
+ for o in orders:
128
+ print(f" {o.order_id[:8]} {o.symbol:<8} {o.side:<4} {o.quantity:>8.0f} @ {o.price:.3f} {o.status}")
129
+ return
130
+ if not orders:
131
+ console.print(f"[dim]{broker_label} — 无 {status_filter} 订单[/dim]")
132
+ return
133
+ from rich.markup import escape as _esc
134
+ from ui.render.responsive import StackedRecord, render_stacked_records, structured_layout
135
+
136
+ layout = structured_layout(console)
137
+ _STATUS_STYLE = {"filled":"[green]成交[/green]","partial":"[yellow]部成[/yellow]",
138
+ "open":"[cyan]委托中[/cyan]","cancelled":"[dim]已撤[/dim]"}
139
+ _SIDE_STYLE = {"buy":"[green]买入[/green]","sell":"[red]卖出[/red]"}
140
+ if layout == "stacked":
141
+ records = []
142
+ for o in orders:
143
+ avg_price = f"{o.avg_price:.3f}" if o.avg_price else "—"
144
+ records.append(StackedRecord(
145
+ headline=(
146
+ f"{_esc(str(o.symbol))} {_esc(str(o.name or '—'))} "
147
+ f"[dim]#{_esc(str(o.order_id[-8:]))}[/dim]"
148
+ ),
149
+ lines=(
150
+ f"[dim]方向[/dim] {_SIDE_STYLE.get(o.side, _esc(str(o.side)))} · "
151
+ f"[dim]状态[/dim] {_STATUS_STYLE.get(o.status, _esc(str(o.status)))}",
152
+ f"[dim]委托[/dim] {o.quantity:,.0f} @ {o.price:.3f}",
153
+ f"[dim]成交[/dim] {o.filled_qty:,.0f} @ {avg_price}",
154
+ f"[dim]时间[/dim] {_esc(str(o.created_at[:16] if o.created_at else '—'))}",
155
+ ),
156
+ ))
157
+ render_stacked_records(
158
+ console,
159
+ title=f"{_esc(str(broker_label))} 订单 · {_esc(str(status_filter))}",
160
+ records=records,
161
+ footer=f"共 {len(orders)} 笔",
162
+ )
163
+ return
164
+ from rich.table import Table
165
+ tbl = Table(title=f"[bold]{broker_label}[/bold] 订单 [dim]({status_filter})[/dim]",
166
+ show_header=True, header_style="bold")
167
+ if layout == "full":
168
+ tbl.add_column("订单号", style="dim", max_width=12)
169
+ tbl.add_column("代码", style="bold", no_wrap=True)
170
+ tbl.add_column("名称", max_width=10)
171
+ tbl.add_column("方向", justify="center")
172
+ tbl.add_column("类型", style="dim")
173
+ tbl.add_column("委托量", justify="right")
174
+ tbl.add_column("成交量", justify="right")
175
+ tbl.add_column("委托价", justify="right", style="dim")
176
+ tbl.add_column("均价", justify="right")
177
+ tbl.add_column("状态")
178
+ tbl.add_column("时间", style="dim", max_width=16)
179
+ else:
180
+ tbl.add_column("代码", style="bold", no_wrap=True)
181
+ tbl.add_column("方向", justify="center")
182
+ tbl.add_column("委托量", justify="right")
183
+ tbl.add_column("委托价", justify="right", style="dim")
184
+ tbl.add_column("状态")
185
+ tbl.add_column("时间", style="dim", max_width=16)
186
+ for o in orders:
187
+ if layout == "full":
188
+ row = [
189
+ o.order_id[-8:], o.symbol, o.name[:10] or "—",
190
+ _SIDE_STYLE.get(o.side, o.side), o.order_type,
191
+ f"{o.quantity:,.0f}", f"{o.filled_qty:,.0f}",
192
+ f"{o.price:.3f}", f"{o.avg_price:.3f}" if o.avg_price else "—",
193
+ _STATUS_STYLE.get(o.status, o.status),
194
+ o.created_at[:16] if o.created_at else "—",
195
+ ]
196
+ else:
197
+ row = [
198
+ o.symbol, _SIDE_STYLE.get(o.side, o.side),
199
+ f"{o.quantity:,.0f}", f"{o.price:.3f}",
200
+ _STATUS_STYLE.get(o.status, o.status),
201
+ o.created_at[:16] if o.created_at else "—",
202
+ ]
203
+ tbl.add_row(*row)
204
+ console.print(tbl)
205
+
206
+