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,231 @@
1
+ """The models each cloud provider offers, read from the provider itself.
2
+
3
+ `/model` used to list Aria's own catalogue and, for a cloud provider, only the
4
+ model already selected: a hand-kept list is out of date within weeks (Google
5
+ retired Gemini 3.5 Flash a month after this catalogue called it stable). So for
6
+ every provider with a key, the model list endpoint is asked what it serves now.
7
+
8
+ The answer is cached for a few hours. An expired cache is shown straight away
9
+ and refreshed behind it, so opening the picker never waits on a slow provider;
10
+ only a provider with no cache at all is waited for, and only for a few seconds.
11
+ Offline, or when a provider is down, the cache (however old) is used, and a
12
+ provider with neither simply has no section.
13
+
14
+ Keys are used for the request and never written to the cache.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import json
20
+ import os
21
+ import re
22
+ import threading
23
+ import time
24
+ import urllib.error
25
+ import urllib.request
26
+ from concurrent.futures import ThreadPoolExecutor
27
+ from pathlib import Path
28
+ from typing import Callable, Dict, List, Optional
29
+
30
+ CACHE_TTL_S = 6 * 3600
31
+ FETCH_TIMEOUT_S = 4.0
32
+ MAX_PER_PROVIDER = 60
33
+
34
+ #: provider -> (heading, kind, models URL). The URL for Google carries the key
35
+ #: as a header, not in the query string.
36
+ PROVIDERS: Dict[str, tuple] = {
37
+ "google": ("Google Gemini", "google", "https://generativelanguage.googleapis.com/v1beta/models?pageSize=200"),
38
+ "openai": ("OpenAI", "openai", "https://api.openai.com/v1/models"),
39
+ "anthropic": ("Anthropic Claude", "anthropic", "https://api.anthropic.com/v1/models?limit=100"),
40
+ "deepseek": ("DeepSeek", "openai", "https://api.deepseek.com/models"),
41
+ "groq": ("Groq", "openai", "https://api.groq.com/openai/v1/models"),
42
+ "together": ("Together AI", "openai", "https://api.together.xyz/v1/models"),
43
+ "dashscope": ("Alibaba DashScope", "openai", "https://dashscope.aliyuncs.com/compatible-mode/v1/models"),
44
+ "siliconflow": ("SiliconFlow", "openai", "https://api.siliconflow.cn/v1/models"),
45
+ "moonshot": ("Moonshot", "openai", "https://api.moonshot.cn/v1/models"),
46
+ "zhipu": ("Zhipu GLM", "openai", "https://open.bigmodel.cn/api/paas/v4/models"),
47
+ }
48
+
49
+ #: Not chat models: embeddings, speech, images, video, music, moderation, live audio.
50
+ _NOT_CHAT = re.compile(
51
+ r"embed|whisper|tts|transcribe|speech|audio|realtime|dall-e|image|imagen|veo|lyria|"
52
+ r"omni-|nano-banana|moderation|rerank|guard|-live|robotics|computer-use|sora|deep-research|"
53
+ r"search-preview|davinci|babbage|aqa|text-bison|vision-preview",
54
+ re.IGNORECASE,
55
+ )
56
+
57
+ _refreshing: set = set()
58
+ _lock = threading.Lock()
59
+
60
+
61
+ def cache_dir() -> Path:
62
+ from aria_code.packages.aria_core.paths import aria_home
63
+
64
+ return Path(aria_home()) / "cloud_models"
65
+
66
+
67
+ def _http_json(url: str, headers: Dict[str, str], timeout: float) -> object:
68
+ request = urllib.request.Request(url, headers={"User-Agent": "aria-code", "Accept": "application/json", **headers})
69
+ with urllib.request.urlopen(request, timeout=timeout) as response: # noqa: S310 - fixed https endpoints above
70
+ return json.load(response)
71
+
72
+
73
+ def _natural_key(text: str):
74
+ """Sort key where 3.10 follows 3.9 and a higher version sorts later."""
75
+ return [int(part) if part.isdigit() else part for part in re.split(r"(\d+)", text.lower())]
76
+
77
+
78
+ def _ctx_label(tokens) -> str:
79
+ try:
80
+ n = int(tokens)
81
+ except (TypeError, ValueError):
82
+ return ""
83
+ if n >= 900_000:
84
+ return f"ctx {round(n / 1_048_576)}M"
85
+ return f"ctx {n // 1000}K" if n >= 1000 else ""
86
+
87
+
88
+ def _date(epoch: int) -> str:
89
+ import datetime
90
+
91
+ try:
92
+ return datetime.date.fromtimestamp(epoch).isoformat()
93
+ except (OverflowError, OSError, ValueError):
94
+ return ""
95
+
96
+
97
+ def _is_shut_down(value: object, today: Optional[float] = None) -> bool:
98
+ """True when a provider's `shutdown_date` (epoch seconds or ISO date) has passed."""
99
+ now = time.time() if today is None else today
100
+ if isinstance(value, (int, float)) and value > 0:
101
+ return float(value) < now
102
+ if isinstance(value, str) and value:
103
+ import datetime
104
+
105
+ try:
106
+ return datetime.date.fromisoformat(value[:10]) < datetime.date.fromtimestamp(now)
107
+ except ValueError:
108
+ return False
109
+ return False
110
+
111
+
112
+ def parse(provider: str, payload: object) -> List[dict]:
113
+ """The chat models in a provider's list response, newest first: [{id, name, detail}]."""
114
+ kind = PROVIDERS[provider][1]
115
+ rows: List[dict] = []
116
+ if kind == "google":
117
+ for item in (payload or {}).get("models", []) if isinstance(payload, dict) else []:
118
+ methods = item.get("supportedGenerationMethods") or []
119
+ ident = str(item.get("name", "")).removeprefix("models/")
120
+ if "generateContent" not in methods or not ident or _NOT_CHAT.search(ident):
121
+ continue
122
+ detail = " · ".join(x for x in (_ctx_label(item.get("inputTokenLimit")),) if x)
123
+ rows.append({"id": ident, "name": item.get("displayName") or ident, "detail": detail})
124
+ elif kind == "anthropic":
125
+ for item in (payload or {}).get("data", []) if isinstance(payload, dict) else []:
126
+ ident = str(item.get("id", ""))
127
+ if ident:
128
+ rows.append({"id": ident, "name": item.get("display_name") or ident, "detail": ""})
129
+ else:
130
+ items = payload.get("data", []) if isinstance(payload, dict) else payload
131
+ for item in items if isinstance(items, list) else []:
132
+ ident = str(item.get("id", "")) if isinstance(item, dict) else ""
133
+ if not ident or _NOT_CHAT.search(ident) or _is_shut_down(item.get("shutdown_date")):
134
+ continue
135
+ created = item.get("created")
136
+ created = int(created) if isinstance(created, (int, float)) and created > 0 else 0
137
+ detail = _date(created) if created else ""
138
+ rows.append({"id": ident, "name": ident, "detail": detail, "created": created})
139
+ # Newest first by the provider's own creation date where it gives one (OpenAI does);
140
+ # otherwise by version number in the id, which is only a rough proxy.
141
+ rows.sort(key=lambda r: (r.get("created", 0), _natural_key(r["id"])), reverse=True)
142
+ return [{k: v for k, v in r.items() if k != "created"} for r in rows[:MAX_PER_PROVIDER]]
143
+
144
+
145
+ def fetch(provider: str, key: str, timeout: float = FETCH_TIMEOUT_S) -> Optional[List[dict]]:
146
+ """Ask the provider; None when it cannot be reached or refuses the key."""
147
+ _heading, kind, url = PROVIDERS[provider]
148
+ if kind == "google":
149
+ headers = {"x-goog-api-key": key}
150
+ elif kind == "anthropic":
151
+ headers = {"x-api-key": key, "anthropic-version": "2023-06-01"}
152
+ else:
153
+ headers = {"Authorization": f"Bearer {key}"}
154
+ try:
155
+ return parse(provider, _http_json(url, headers, timeout))
156
+ except (OSError, urllib.error.URLError, ValueError):
157
+ return None
158
+
159
+
160
+ def _read_cache(provider: str) -> Optional[dict]:
161
+ try:
162
+ data = json.loads((cache_dir() / f"{provider}.json").read_text(encoding="utf-8"))
163
+ if isinstance(data.get("models"), list):
164
+ return data
165
+ except (OSError, ValueError):
166
+ pass
167
+ return None
168
+
169
+
170
+ def _write_cache(provider: str, models: List[dict], now: float) -> None:
171
+ try:
172
+ directory = cache_dir()
173
+ directory.mkdir(parents=True, exist_ok=True)
174
+ (directory / f"{provider}.json").write_text(json.dumps({"at": now, "models": models}), encoding="utf-8")
175
+ except OSError:
176
+ pass
177
+
178
+
179
+ def _refresh_later(provider: str, key: str) -> None:
180
+ with _lock:
181
+ if provider in _refreshing:
182
+ return
183
+ _refreshing.add(provider)
184
+
185
+ def run() -> None:
186
+ try:
187
+ models = fetch(provider, key)
188
+ if models:
189
+ _write_cache(provider, models, time.time())
190
+ finally:
191
+ with _lock:
192
+ _refreshing.discard(provider)
193
+
194
+ threading.Thread(target=run, daemon=True, name=f"aria-models-{provider}").start()
195
+
196
+
197
+ def models_for(provider: str, key: str, *, offline: bool = False, now: Optional[float] = None) -> List[dict]:
198
+ """The provider's models: fresh cache, else stale cache (refreshed behind), else a live request."""
199
+ stamp = time.time() if now is None else now
200
+ cached = _read_cache(provider)
201
+ if cached and (offline or stamp - float(cached.get("at", 0)) < CACHE_TTL_S):
202
+ return cached["models"]
203
+ if cached:
204
+ _refresh_later(provider, key)
205
+ return cached["models"]
206
+ if offline:
207
+ return []
208
+ models = fetch(provider, key)
209
+ if models:
210
+ _write_cache(provider, models, stamp)
211
+ return models or []
212
+
213
+
214
+ def collect(key_for: Callable[[str], str], *, offline: Optional[bool] = None) -> Dict[str, List[dict]]:
215
+ """Models for every provider that has a key, looked up in parallel: {provider: [models]}."""
216
+ if offline is None:
217
+ offline = os.environ.get("ARIA_OFFLINE", "").lower() in {"1", "true", "yes", "on"}
218
+ keyed = {p: key for p in PROVIDERS if (key := key_for(p))}
219
+ if not keyed:
220
+ return {}
221
+ with ThreadPoolExecutor(max_workers=min(8, len(keyed))) as pool:
222
+ futures = {p: pool.submit(models_for, p, key, offline=offline) for p, key in keyed.items()}
223
+ out = {}
224
+ for provider, future in futures.items():
225
+ try:
226
+ models = future.result(timeout=FETCH_TIMEOUT_S + 2)
227
+ except Exception:
228
+ models = []
229
+ if models:
230
+ out[provider] = models
231
+ return out
@@ -0,0 +1,29 @@
1
+ """Path helpers for generated code and strategy artifacts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+
8
+ def resolve_user_code_path(
9
+ description: str,
10
+ save_path: str | None = None,
11
+ *,
12
+ user_generated_dir: Path,
13
+ ) -> Path:
14
+ """Resolve a code output path into the user's generated workspace."""
15
+ from artifacts import slugify_topic
16
+
17
+ if save_path:
18
+ p = Path(save_path).expanduser()
19
+ if not p.is_absolute():
20
+ p = user_generated_dir / p
21
+ if p.suffix != ".py":
22
+ p = p.with_suffix(".py")
23
+ return p
24
+
25
+ desc_slug = slugify_topic(description, fallback="generated_code")
26
+ if any(k in description.lower() for k in ("backtest", "strategy", "quant", "portfolio")):
27
+ desc_slug = f"strategy_{desc_slug}"
28
+ return user_generated_dir / f"{desc_slug}.py"
29
+
@@ -0,0 +1,34 @@
1
+ """CLI command adapters, imported only when used.
2
+
3
+ Importing a lightweight command such as /architecture must not initialize the
4
+ finance stack (pandas/numpy) through this package's __init__.
5
+ """
6
+
7
+ from importlib import import_module
8
+
9
+ __all__ = [
10
+ "BrokerCommandsMixin",
11
+ "BacktestCommandsMixin",
12
+ "WorkspaceCommandsMixin",
13
+ "ModelCommandsMixin",
14
+ "MarketCommandsMixin",
15
+ "PortfolioCommandsMixin",
16
+ ]
17
+
18
+ _MIXIN_MODULES = {
19
+ "BrokerCommandsMixin": "broker_cmds",
20
+ "BacktestCommandsMixin": "backtest_cmds",
21
+ "WorkspaceCommandsMixin": "workspace_cmds",
22
+ "ModelCommandsMixin": "model_cmds",
23
+ "MarketCommandsMixin": "market_cmds",
24
+ "PortfolioCommandsMixin": "portfolio_cmds",
25
+ }
26
+
27
+
28
+ def __getattr__(name: str):
29
+ module_name = _MIXIN_MODULES.get(name)
30
+ if module_name is None:
31
+ raise AttributeError(name)
32
+ value = getattr(import_module(f".{module_name}", __name__), name)
33
+ globals()[name] = value
34
+ return value
@@ -0,0 +1,78 @@
1
+ """Business-workflow renderers, taking the context instead of aria_cli's globals.
2
+
3
+ These three drew through aria_cli's module-level ``console`` and ``HAS_RICH``,
4
+ so business_workflow_cmds reached into a 7000-line module for three functions
5
+ totalling 56 lines. The state they need is on ``self.context`` already — the
6
+ same move print_error made in _ui.py.
7
+
8
+ Names lost their leading underscore on the way over: they are this module's
9
+ public surface now, not aria_cli privates borrowed by bare name.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from typing import Any
15
+
16
+ __all__ = ["p", "print_realty_result", "print_risk_scan"]
17
+
18
+
19
+ def p(context, msg: str, style: str = ""):
20
+ """快速打印辅助(rich 可用时带样式)"""
21
+ if context.has_rich:
22
+ tag = {"dim": "dim", "error": "red", "ok": "green"}.get(style, style)
23
+ context.console.print(f"[{tag}]{msg}[/{tag}]" if tag else msg)
24
+ else:
25
+ print(msg)
26
+
27
+
28
+ def print_realty_result(context, result, agent_name: str):
29
+ """格式化打印 realty Agent 结果(地产健康度词汇,见 agents/signal_scheme.py::REALTY_SCHEME)"""
30
+ _SIGNAL_LABELS = {
31
+ "GOOD": "[green]正常/推荐[/green]",
32
+ "WATCH": "[yellow]需观察[/yellow]",
33
+ "CONCERN": "[red]警示[/red]",
34
+ "SEVERE": "[bold red]极高风险[/bold red]",
35
+ }
36
+ if not context.has_rich:
37
+ print(f"\n[{agent_name}] Signal: {result.signal} Confidence: {result.confidence:.0%}")
38
+ print(result.analysis)
39
+ return
40
+
41
+ context.console.print()
42
+ context.console.print(f" [bold]{agent_name.upper().replace('_',' ')}[/bold]"
43
+ f" {_SIGNAL_LABELS.get(result.signal, result.signal)}"
44
+ f" [dim]置信度 {result.confidence:.0%}[/dim]")
45
+ context.console.print()
46
+ for pt in (result.key_points or []):
47
+ context.console.print(f" • {pt}")
48
+ if result.analysis:
49
+ context.console.print()
50
+ text = result.analysis[:1200] + ("…" if len(result.analysis) > 1200 else "")
51
+ context.console.print(f" [dim]{text}[/dim]")
52
+ context.console.print()
53
+
54
+
55
+ def print_risk_scan(context, data: dict):
56
+ """格式化打印风险扫描结果"""
57
+ if not context.has_rich:
58
+ print(f"Risk scan: {data.get('overall_level','?')} "
59
+ f"(score={data.get('risk_score',0)})")
60
+ for alert in data.get("alerts", []):
61
+ print(f" [{alert['level']}] {alert['desc']}")
62
+ return
63
+
64
+ level = data.get("overall_level", "未知")
65
+ score = data.get("risk_score", 0)
66
+ color = {"低": "green", "中": "yellow", "高": "red", "极高": "bold red"}.get(level, "white")
67
+ context.console.print()
68
+ context.console.print(f" 风险等级: [{color}]{level}[/{color}] "
69
+ f"风险分值: {score} "
70
+ f"预警项: {data.get('alert_count',0)}")
71
+ context.console.print()
72
+ for alert in data.get("alerts", []):
73
+ ac = {"低": "dim", "中": "yellow", "高": "red", "极高": "bold red"}.get(
74
+ alert["level"], "white")
75
+ context.console.print(f" [{ac}][{alert['level']}][/{ac}] {alert['desc']}")
76
+ if data.get("suggestion"):
77
+ context.console.print(f"\n [dim]建议: {data['suggestion']}[/dim]")
78
+ context.console.print()
@@ -0,0 +1,71 @@
1
+ """Rendering helpers for the command mixins.
2
+
3
+ Two different things used to come from aria_cli's module globals, and only one
4
+ of them was ever state:
5
+
6
+ * ``console`` / ``HAS_RICH`` are per-session state. They belong on
7
+ ``self.context`` — which 40f23c8 started and this package is finishing.
8
+ * ``rich_box`` and ``Panel`` are not state at all. They are ``rich.box`` and
9
+ ``rich.panel.Panel``, sitting behind aria_cli's guarded import purely because
10
+ that is where the try/except happened to live. Reaching into a 7000-line
11
+ module for them bought nothing, so they are resolved here instead.
12
+
13
+ ``print_error`` takes the context explicitly rather than reading a global, so a
14
+ mixin can render without knowing anything about aria_cli.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from contextlib import contextmanager
20
+ from typing import Any
21
+
22
+ __all__ = ["Panel", "Syntax", "null_ctx", "print_error", "rich_box", "has_rich"]
23
+
24
+ try: # Optional: the CLI degrades to plain print when rich is absent.
25
+ from rich import box as rich_box
26
+ from rich.panel import Panel
27
+ from rich.syntax import Syntax
28
+ except ImportError: # pragma: no cover - exercised only without rich installed
29
+ rich_box = None # type: ignore[assignment]
30
+ Panel = None # type: ignore[assignment]
31
+ Syntax = None # type: ignore[assignment]
32
+
33
+
34
+ @contextmanager
35
+ def null_ctx():
36
+ """No-op context manager, for `with x if cond else null_ctx():`.
37
+
38
+ Three lines with no dependencies, defined in aria_cli only because that is
39
+ where the first caller was. Note the *theme* these renderers use
40
+ (_SYNTAX_THEME) is deliberately not here: it is read from user config and
41
+ changes with /theme, so it is session state and belongs on the context.
42
+ """
43
+ yield
44
+
45
+
46
+ def has_rich() -> bool:
47
+ """Whether rich is importable.
48
+
49
+ For module-level helpers that have no ``self`` and so cannot read
50
+ ``self.context.has_rich``. Anything with a context should use that instead —
51
+ a session can be configured without a console even where rich is installed.
52
+ """
53
+ return rich_box is not None
54
+
55
+
56
+ def print_error(context: Any, msg: str, hint: str = "") -> None:
57
+ """Render an error through the context's console.
58
+
59
+ ``context`` is an AriaContext, or anything exposing ``console`` and
60
+ ``has_rich``; the renderer already falls back to plain print when console is
61
+ None, so a context built without one still works.
62
+ """
63
+ from aria_code.ui.render.output import print_error as _render
64
+
65
+ _render(
66
+ msg,
67
+ hint,
68
+ console=getattr(context, "console", None),
69
+ has_rich=bool(getattr(context, "has_rich", False)),
70
+ rich_box=rich_box,
71
+ )