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,502 @@
1
+ """Intent-aware dependency preflight for Aria CLI.
2
+
3
+ This module is intentionally pure and side-effect free: it detects likely user
4
+ intent, checks local availability, and returns install guidance. It never
5
+ installs packages or mutates config.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass
10
+ import importlib.util
11
+ import os
12
+ import shlex
13
+ import shutil
14
+ from typing import Callable, Iterable, Mapping
15
+
16
+ from aria_code.apps.cli.intent_router import build_intent_route, detect_intents
17
+
18
+
19
+ ModuleChecker = Callable[[str], bool]
20
+ CommandChecker = Callable[[str], bool]
21
+ EnvGetter = Callable[[str], str | None]
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class PythonRequirement:
26
+ module: str
27
+ package: str
28
+ purpose: str
29
+ required: bool = True
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class CommandRequirement:
34
+ command: str
35
+ install_hint: str
36
+ purpose: str
37
+ required: bool = True
38
+
39
+
40
+ @dataclass(frozen=True)
41
+ class EnvRequirement:
42
+ name: str
43
+ purpose: str
44
+ required: bool = False
45
+
46
+
47
+ @dataclass(frozen=True)
48
+ class IntentPreflight:
49
+ intents: tuple[str, ...]
50
+ services: tuple[str, ...]
51
+ python: tuple[PythonRequirement, ...]
52
+ commands: tuple[CommandRequirement, ...]
53
+ env: tuple[EnvRequirement, ...]
54
+ missing_python: tuple[PythonRequirement, ...]
55
+ missing_commands: tuple[CommandRequirement, ...]
56
+ missing_env: tuple[EnvRequirement, ...]
57
+
58
+ @property
59
+ def has_findings(self) -> bool:
60
+ return bool(self.missing_python or self.missing_commands or self.missing_env)
61
+
62
+ @property
63
+ def has_required_findings(self) -> bool:
64
+ return any(req.required for req in self.missing_python + self.missing_commands + self.missing_env)
65
+
66
+ def pip_install_command(self) -> str:
67
+ packages: list[str] = []
68
+ seen: set[str] = set()
69
+ for req in self.missing_python:
70
+ if req.package not in seen:
71
+ packages.append(req.package)
72
+ seen.add(req.package)
73
+ if not packages:
74
+ return ""
75
+ return "python3 -m pip install " + " ".join(shlex.quote(pkg) for pkg in packages)
76
+
77
+
78
+ @dataclass(frozen=True)
79
+ class InstallPlan:
80
+ """User-confirmed install guidance derived from an intent preflight."""
81
+
82
+ services: tuple[str, ...]
83
+ pip_packages: tuple[str, ...]
84
+ pip_command: str
85
+ command_hints: tuple[str, ...]
86
+ env_hints: tuple[str, ...]
87
+ has_required_items: bool
88
+
89
+ @property
90
+ def has_actions(self) -> bool:
91
+ return bool(self.pip_packages or self.command_hints or self.env_hints)
92
+
93
+
94
+ @dataclass(frozen=True)
95
+ class InstallSelection:
96
+ """Resolved user selection for Python package installation."""
97
+
98
+ pip_packages: tuple[str, ...]
99
+ skipped_packages: tuple[str, ...] = ()
100
+ mode: str = "all"
101
+
102
+ @property
103
+ def has_packages(self) -> bool:
104
+ return bool(self.pip_packages)
105
+
106
+
107
+ _PY_REQS: Mapping[str, PythonRequirement] = {
108
+ "aiohttp": PythonRequirement("aiohttp", "aiohttp", "异步 HTTP 请求"),
109
+ "requests": PythonRequirement("requests", "requests", "HTTP 请求"),
110
+ "pandas": PythonRequirement("pandas", "pandas", "表格与行情数据处理"),
111
+ "numpy": PythonRequirement("numpy", "numpy", "数值计算"),
112
+ "yfinance": PythonRequirement("yfinance", "yfinance", "美股/港股/ETF/加密行情"),
113
+ "akshare": PythonRequirement("akshare", "akshare", "A 股与中文市场数据"),
114
+ "matplotlib": PythonRequirement("matplotlib", "matplotlib", "PNG 静态图表渲染", required=False),
115
+ "mplfinance": PythonRequirement("mplfinance", "mplfinance", "K 线 PNG 渲染", required=False),
116
+ "PIL": PythonRequirement("PIL", "Pillow", "图片读取与剪贴板图片"),
117
+ "mss": PythonRequirement("mss", "mss", "屏幕截图"),
118
+ "pyautogui": PythonRequirement("pyautogui", "pyautogui", "桌面自动化"),
119
+ "playwright": PythonRequirement("playwright", "playwright", "浏览器自动化"),
120
+ "openpyxl": PythonRequirement("openpyxl", "openpyxl", "Excel 文件解析"),
121
+ "pdfplumber": PythonRequirement("pdfplumber", "pdfplumber", "PDF 文本与表格解析", required=False),
122
+ "pypdf": PythonRequirement("pypdf", "pypdf", "PDF 解析备用引擎", required=False),
123
+ "docx": PythonRequirement("docx", "python-docx", "Word/DOCX 文件解析"),
124
+ "bs4": PythonRequirement("bs4", "beautifulsoup4", "HTML 文件解析"),
125
+ "duckdb": PythonRequirement("duckdb", "duckdb", "本地分析型 SQL"),
126
+ "vectorbt": PythonRequirement("vectorbt", "vectorbt", "增强向量化回测", required=False),
127
+ "alpaca": PythonRequirement("alpaca", "alpaca-py", "Alpaca 券商连接"),
128
+ "tigeropen": PythonRequirement("tigeropen", "tigeropen", "Tiger 券商连接"),
129
+ "longbridge": PythonRequirement("longbridge", "longbridge", "Longbridge 券商连接"),
130
+ "ib_insync": PythonRequirement("ib_insync", "ib_insync", "IBKR 券商连接"),
131
+ "futu": PythonRequirement("futu", "futu-api", "富途券商连接"),
132
+ "webull": PythonRequirement("webull", "webull", "Webull 券商连接"),
133
+ "easytrader": PythonRequirement("easytrader", "easytrader", "A 股交易客户端连接"),
134
+ "ddgs": PythonRequirement("ddgs", "ddgs", "零配置联网搜索 (web_search 工具)", required=False),
135
+ "ccxt": PythonRequirement("ccxt", "ccxt", "加密货币交易所行情/资金费率", required=False),
136
+ }
137
+
138
+ _CMD_REQS: Mapping[str, CommandRequirement] = {
139
+ "ollama": CommandRequirement("ollama", "https://ollama.com/download", "本地模型运行"),
140
+ "node": CommandRequirement("node", "brew install node", "部分 MCP server 运行时", required=False),
141
+ "gh": CommandRequirement("gh", "brew install gh && gh auth login", "GitHub PR/Issue/CI 操作"),
142
+ "playwright": CommandRequirement("playwright", "python3 -m playwright install chromium", "安装 Chromium 浏览器内核", required=False),
143
+ }
144
+
145
+ _BROKER_MODULES = {
146
+ "alpaca": ("alpaca", ("alpaca", "alpaca-py")),
147
+ "tiger": ("tigeropen", ("tiger", "老虎", "tigeropen")),
148
+ "longbridge": ("longbridge", ("longbridge", "长桥")),
149
+ "ibkr": ("ib_insync", ("ibkr", "interactive brokers", "盈透")),
150
+ "futu": ("futu", ("futu", "富途")),
151
+ "webull": ("webull", ("webull",)),
152
+ "easytrader": ("easytrader", ("easytrader", "同花顺", "雪球")),
153
+ }
154
+
155
+
156
+ def package_to_module(package: str) -> str:
157
+ """Map a pip package name to its import module name (e.g. Pillow → PIL)."""
158
+ for req in _PY_REQS.values():
159
+ if req.package == package:
160
+ return req.module
161
+ # Common fallbacks for packages not in _PY_REQS
162
+ _COMMON = {
163
+ "duckduckgo-search": "duckduckgo_search",
164
+ "scikit-learn": "sklearn",
165
+ "beautifulsoup4": "bs4",
166
+ "python-docx": "docx",
167
+ "Pillow": "PIL",
168
+ "futu-api": "futu",
169
+ "alpaca-py": "alpaca",
170
+ }
171
+ if package in _COMMON:
172
+ return _COMMON[package]
173
+ return package.replace("-", "_")
174
+
175
+
176
+ def _default_module_available(module: str) -> bool:
177
+ return importlib.util.find_spec(module) is not None
178
+
179
+
180
+ def _default_command_available(command: str) -> bool:
181
+ return shutil.which(command) is not None
182
+
183
+
184
+ def _add_req(target: list[PythonRequirement], key: str) -> None:
185
+ req = _PY_REQS[key]
186
+ if not any(item.module == req.module for item in target):
187
+ target.append(req)
188
+
189
+
190
+ def _add_cmd(target: list[CommandRequirement], key: str) -> None:
191
+ req = _CMD_REQS[key]
192
+ if not any(item.command == req.command for item in target):
193
+ target.append(req)
194
+
195
+
196
+ def _contains_any(text: str, keywords: Iterable[str]) -> bool:
197
+ return any(keyword in text for keyword in keywords)
198
+
199
+
200
+ def _detect_intents(message: str) -> tuple[str, ...]:
201
+ return detect_intents(message)
202
+
203
+
204
+ def build_intent_preflight(
205
+ message: str,
206
+ *,
207
+ module_available: ModuleChecker | None = None,
208
+ command_available: CommandChecker | None = None,
209
+ env_get: EnvGetter | None = None,
210
+ ) -> IntentPreflight:
211
+ """Build an intent-aware dependency report for a user request."""
212
+ module_available = module_available or _default_module_available
213
+ command_available = command_available or _default_command_available
214
+ env_get = env_get or os.environ.get
215
+
216
+ low = message.lower().strip()
217
+ route = build_intent_route(message)
218
+ intents = route.intents
219
+ python_reqs: list[PythonRequirement] = []
220
+ command_reqs: list[CommandRequirement] = []
221
+ env_reqs: list[EnvRequirement] = []
222
+ services: list[str] = list(route.services)
223
+
224
+ def service(name: str) -> None:
225
+ if name not in services:
226
+ services.append(name)
227
+
228
+ if any(i in intents for i in ("market_snapshot", "market_analysis", "chart", "dashboard", "report", "backtest", "strategy", "market_research")):
229
+ service("market_data")
230
+ _add_req(python_reqs, "pandas")
231
+ _add_req(python_reqs, "numpy")
232
+ _add_req(python_reqs, "yfinance")
233
+ if any(ch in low for ch in ("a股", "沪", "深", ".sz", ".ss", "港股", "宁德时代", "贵州茅台")):
234
+ _add_req(python_reqs, "akshare")
235
+
236
+ if "chart" in intents:
237
+ service("chart_renderer")
238
+ if _contains_any(low, ("png", "图片", "静态", "k线", "candlestick")):
239
+ _add_req(python_reqs, "matplotlib")
240
+ _add_req(python_reqs, "mplfinance")
241
+
242
+ if "dashboard" in intents:
243
+ service("dashboard_generator")
244
+ _add_req(python_reqs, "akshare")
245
+
246
+ if "report" in intents:
247
+ service("report_generator")
248
+ _add_req(python_reqs, "matplotlib")
249
+
250
+ if "backtest" in intents or "strategy" in intents:
251
+ service("backtest_engine")
252
+ _add_req(python_reqs, "vectorbt")
253
+
254
+ if "vision" in intents:
255
+ service("vision_input")
256
+ _add_req(python_reqs, "PIL")
257
+
258
+ if "screenshot" in intents:
259
+ service("screenshot")
260
+ _add_req(python_reqs, "PIL")
261
+ _add_req(python_reqs, "mss")
262
+
263
+ if "browser" in intents:
264
+ service("browser")
265
+ _add_req(python_reqs, "playwright")
266
+ _add_req(python_reqs, "PIL")
267
+ _add_cmd(command_reqs, "playwright")
268
+
269
+ if "file_analysis" in intents:
270
+ service("file_parser")
271
+ # Request only the parser needed by the referenced file type. Listing
272
+ # every possible parser for two DOCX files made preflight look like a
273
+ # system audit and led users to install unrelated PDF/Excel packages.
274
+ if _contains_any(low, (".xlsx", ".xls", " excel", "excel文件")):
275
+ _add_req(python_reqs, "pandas")
276
+ _add_req(python_reqs, "openpyxl")
277
+ if _contains_any(low, (".csv", ".tsv", "csv文件")):
278
+ _add_req(python_reqs, "pandas")
279
+ if _contains_any(low, (".pdf", "pdf文件")):
280
+ _add_req(python_reqs, "pdfplumber")
281
+ _add_req(python_reqs, "pypdf")
282
+ if _contains_any(low, (".docx", ".doc", "word文件", "word文档")):
283
+ _add_req(python_reqs, "docx")
284
+ if _contains_any(low, (".html", ".htm", "html文件")):
285
+ _add_req(python_reqs, "bs4")
286
+ if _contains_any(low, (".png", ".jpg", ".jpeg", ".webp", "图片文件")):
287
+ _add_req(python_reqs, "PIL")
288
+
289
+ for _, (module, aliases) in _BROKER_MODULES.items():
290
+ if _contains_any(low, aliases):
291
+ service("broker_connector")
292
+ _add_req(python_reqs, module)
293
+
294
+ if "github" in intents:
295
+ service("github_cli")
296
+ _add_cmd(command_reqs, "gh")
297
+
298
+ if "mcp" in intents:
299
+ service("mcp")
300
+ _add_cmd(command_reqs, "node")
301
+
302
+ if "local_model" in intents:
303
+ service("local_llm")
304
+ _add_cmd(command_reqs, "ollama")
305
+
306
+ if "cloud" in intents:
307
+ service("cloud_runtime")
308
+ env_reqs.append(EnvRequirement("ALIYUN_ACCESS_KEY_ID", "阿里云访问密钥", required=False))
309
+
310
+ if "web_search" in intents:
311
+ service("web_search")
312
+ _add_req(python_reqs, "ddgs")
313
+ env_reqs.append(EnvRequirement("BRAVE_SEARCH_API_KEY", "Brave 搜索 (免费 2000 次/月,比 DuckDuckGo 更稳定)", required=False))
314
+
315
+ if "crypto" in intents:
316
+ service("crypto_data")
317
+ _add_req(python_reqs, "ccxt")
318
+
319
+ if "sports" in intents:
320
+ service("sports_data")
321
+ env_reqs.append(EnvRequirement("FOOTBALL_DATA_API_KEY", "football-data.org 实时赛程/积分榜 (免费注册)", required=False))
322
+
323
+ missing_python = tuple(req for req in python_reqs if not module_available(req.module))
324
+ missing_commands = tuple(req for req in command_reqs if not command_available(req.command))
325
+ missing_env = tuple(req for req in env_reqs if not env_get(req.name))
326
+
327
+ return IntentPreflight(
328
+ intents=intents,
329
+ services=tuple(services),
330
+ python=tuple(python_reqs),
331
+ commands=tuple(command_reqs),
332
+ env=tuple(env_reqs),
333
+ missing_python=missing_python,
334
+ missing_commands=missing_commands,
335
+ missing_env=missing_env,
336
+ )
337
+
338
+
339
+ def build_full_dependency_report(
340
+ *,
341
+ module_available: ModuleChecker | None = None,
342
+ command_available: CommandChecker | None = None,
343
+ env_get: EnvGetter | None = None,
344
+ include_optional: bool = True,
345
+ ) -> IntentPreflight:
346
+ """Scan every known requirement (intent-independent) for a full health check.
347
+
348
+ Used by `/install` with no arguments — reports all missing packages/tools
349
+ across the whole project, not just those implied by a single message.
350
+ """
351
+ module_available = module_available or _default_module_available
352
+ command_available = command_available or _default_command_available
353
+ env_get = env_get or os.environ.get
354
+
355
+ # Broker SDKs are intent-specific — a user only needs the one for their
356
+ # broker, so a generic full scan should not propose installing all of them.
357
+ _broker_modules = {module for module, _ in _BROKER_MODULES.values()}
358
+ python_reqs = tuple(
359
+ r for r in _PY_REQS.values() if r.module not in _broker_modules
360
+ )
361
+ command_reqs = tuple(_CMD_REQS.values())
362
+ env_reqs: tuple[EnvRequirement, ...] = (
363
+ EnvRequirement("BRAVE_SEARCH_API_KEY", "Brave 联网搜索 (免费 2000 次/月)", required=False),
364
+ EnvRequirement("FOOTBALL_DATA_API_KEY", "football-data.org 实时足球数据", required=False),
365
+ )
366
+
367
+ def _keep(req) -> bool:
368
+ return include_optional or getattr(req, "required", True)
369
+
370
+ missing_python = tuple(
371
+ r for r in python_reqs if _keep(r) and not module_available(r.module)
372
+ )
373
+ missing_commands = tuple(
374
+ r for r in command_reqs if _keep(r) and not command_available(r.command)
375
+ )
376
+ missing_env = tuple(r for r in env_reqs if not env_get(r.name))
377
+
378
+ return IntentPreflight(
379
+ intents=("full_scan",),
380
+ services=("all",),
381
+ python=python_reqs,
382
+ commands=command_reqs,
383
+ env=env_reqs,
384
+ missing_python=missing_python,
385
+ missing_commands=missing_commands,
386
+ missing_env=missing_env,
387
+ )
388
+
389
+
390
+ def build_install_plan(report: IntentPreflight) -> InstallPlan:
391
+ """Convert preflight findings into explicit user-approved install steps."""
392
+ packages: list[str] = []
393
+ seen: set[str] = set()
394
+ for req in report.missing_python:
395
+ if req.package not in seen:
396
+ packages.append(req.package)
397
+ seen.add(req.package)
398
+
399
+ command_hints = tuple(
400
+ f"{req.command}: {req.install_hint}"
401
+ for req in report.missing_commands
402
+ )
403
+ env_hints = tuple(
404
+ f"{req.name}: {req.purpose}"
405
+ for req in report.missing_env
406
+ )
407
+ pip_command = ""
408
+ if packages:
409
+ pip_command = "python3 -m pip install " + " ".join(shlex.quote(pkg) for pkg in packages)
410
+
411
+ return InstallPlan(
412
+ services=report.services,
413
+ pip_packages=tuple(packages),
414
+ pip_command=pip_command,
415
+ command_hints=command_hints,
416
+ env_hints=env_hints,
417
+ has_required_items=report.has_required_findings,
418
+ )
419
+
420
+
421
+ def select_install_packages(
422
+ plan: InstallPlan,
423
+ report: IntentPreflight | None = None,
424
+ *,
425
+ mode: str = "all",
426
+ custom: Iterable[str] | None = None,
427
+ ) -> InstallSelection:
428
+ """Resolve selector choices into concrete pip packages.
429
+
430
+ Modes:
431
+ - all: install every missing Python package in the plan
432
+ - required: install only required Python packages
433
+ - optional: install only optional Python packages
434
+ - custom: install only packages named in ``custom`` if present in the plan
435
+ - skip/plan: install nothing
436
+ """
437
+ available = list(plan.pip_packages)
438
+ normalized_mode = (mode or "all").strip().lower()
439
+ if normalized_mode in {"skip", "none", "cancel", "plan", "dry-run", "dry_run"}:
440
+ return InstallSelection((), tuple(available), normalized_mode)
441
+
442
+ if normalized_mode == "required" and report is not None:
443
+ selected = [
444
+ req.package for req in report.missing_python
445
+ if req.required and req.package in available
446
+ ]
447
+ elif normalized_mode == "optional" and report is not None:
448
+ selected = [
449
+ req.package for req in report.missing_python
450
+ if not req.required and req.package in available
451
+ ]
452
+ elif normalized_mode == "custom":
453
+ wanted = {str(item).strip() for item in (custom or []) if str(item).strip()}
454
+ selected = [pkg for pkg in available if pkg in wanted]
455
+ else:
456
+ selected = available
457
+
458
+ selected = list(dict.fromkeys(selected))
459
+ skipped = [pkg for pkg in available if pkg not in selected]
460
+ return InstallSelection(tuple(selected), tuple(skipped), normalized_mode)
461
+
462
+
463
+ def format_preflight_plain(report: IntentPreflight) -> str:
464
+ """Return a concise plain-text preflight message."""
465
+ if not report.has_findings:
466
+ return ""
467
+ plan = build_install_plan(report)
468
+
469
+ if not report.has_required_findings:
470
+ lines = ["可选增强未安装;当前任务会继续使用内置或降级实现。"]
471
+ if report.missing_python:
472
+ reqs = "、".join(f"{r.package}({r.purpose})" for r in report.missing_python)
473
+ lines.append("增强包:" + reqs)
474
+ if report.missing_commands:
475
+ tools = ", ".join(plan.command_hints)
476
+ lines.append("增强工具:" + tools)
477
+ if report.missing_env:
478
+ envs = ", ".join(plan.env_hints)
479
+ lines.append("可选配置:" + envs)
480
+ if plan.pip_packages:
481
+ lines.append("需要时运行 /install --auto;安装会进入 Aria 当前环境。")
482
+ elif plan.has_actions:
483
+ lines.append("需要时运行 /setup 查看配置向导。")
484
+ return "\n".join(lines)
485
+
486
+ lines = ["本次任务缺少必要能力:"]
487
+ if report.missing_python:
488
+ for req in report.missing_python:
489
+ requirement = "必要" if req.required else "可选"
490
+ lines.append(f"- {req.package}:{req.purpose}({requirement})")
491
+ if report.missing_commands:
492
+ for hint in plan.command_hints:
493
+ lines.append("- " + hint)
494
+ if report.missing_env:
495
+ envs = ", ".join(plan.env_hints)
496
+ lines.append("可选配置:" + envs)
497
+ if plan.has_actions:
498
+ if plan.pip_packages:
499
+ lines.append("运行 /install --auto 安装到 Aria 当前环境;完成后会自动刷新工具能力。")
500
+ else:
501
+ lines.append("运行 /setup 查看配置向导;Aria 不会静默修改系统环境。")
502
+ return "\n".join(lines)
@@ -0,0 +1,60 @@
1
+ """
2
+ Project-level ARIA.md helpers.
3
+
4
+ Used by /init scaffolds and repository bootstrap to keep project memory files
5
+ structured and consistent.
6
+ """
7
+ from __future__ import annotations
8
+
9
+
10
+ def build_project_aria_md(
11
+ *,
12
+ project_name: str,
13
+ stack: str,
14
+ entry: str = "main.py",
15
+ purpose: str = "",
16
+ notes: list[str] | None = None,
17
+ conventions: list[str] | None = None,
18
+ ) -> str:
19
+ """Build a durable project-level ARIA.md template."""
20
+ notes = notes or []
21
+ conventions = conventions or [
22
+ "Keep CLI output stable and avoid leaking local paths in normal UI.",
23
+ "Prefer thin CLI entry points plus command mixins for implementation.",
24
+ "Treat turn envelopes, traces, exports, and provider health as shared contracts.",
25
+ ]
26
+
27
+ lines = [
28
+ "# Memory",
29
+ "",
30
+ f"- **Project**: {project_name}",
31
+ f"- **Stack**: {stack}",
32
+ f"- **Entry**: {entry}",
33
+ ]
34
+ if purpose:
35
+ lines.append(f"- **Purpose**: {purpose}")
36
+ lines.append("- **Conventions**:")
37
+ lines.extend(f" - {item}" for item in conventions)
38
+ if notes:
39
+ lines.append("- **Notes**:")
40
+ lines.extend(f" - {item}" for item in notes)
41
+
42
+ lines.extend([
43
+ "",
44
+ "## Memory Layers",
45
+ "- Project ARIA.md describes this repository and overrides the global profile when both apply.",
46
+ "- `~/.arthera/ARIA.md` is the user profile and carries cross-project preferences.",
47
+ "- Session history and traces stay ephemeral unless exported explicitly.",
48
+ "",
49
+ "## Operational Rules",
50
+ "- Keep generated code and user artifacts in the user's workspace, not in the source tree, unless the user asks otherwise.",
51
+ "- Prefer deterministic service output envelopes for CLI, trace, and export surfaces.",
52
+ "- Use `/doctor` or the health views before trusting external providers.",
53
+ "",
54
+ "## Workflow Notes",
55
+ "- Use `/init` to refresh project context after substantial structural changes.",
56
+ "- Use `/memory add` for durable project facts and `/memory profile` for user preferences.",
57
+ "- Keep long sessions compacted and avoid relying on chat history as the only source of truth.",
58
+ "",
59
+ ])
60
+ return "\n".join(lines)
@@ -0,0 +1,78 @@
1
+ """Turn-prompt assembly DECISIONS for send_message (pure, testable).
2
+
3
+ Extracted from ``aria_cli.send_message``. These functions decide what text is
4
+ actually sent to the model for a turn — the precedence between analysis-
5
+ commentary mode, a decomposition plan, and the raw message, plus whether a
6
+ file-tool hint or a fetched ML-signal block gets prepended. All of it is pure
7
+ string assembly: the upstream decisions (whether analysis was requested,
8
+ what the decomposition plan says, what the ML signal text is) are computed
9
+ elsewhere and passed in here as plain values, so none of this needs I/O,
10
+ ``self`` state, or mocking to test.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ ANALYSIS_COMMENTARY_PROMPT_ZH = (
16
+ "请基于上方已获取的实时行情数据提供深度分析(约300字):"
17
+ " 当前价格位置与短期趋势判断、多空力量对比"
18
+ "(若涉及多标的则对比两者强弱)、关键支撑/阻力位、操作建议(附风险提示)。"
19
+ " 直接开始分析,不要重复表格数据。"
20
+ )
21
+
22
+
23
+ ANALYSIS_COMMENTARY_PROMPT_EN = (
24
+ "Using the market data just fetched, give an analysis of about 300 words:"
25
+ " where the price stands and the short-term trend, the balance of buyers and"
26
+ " sellers (comparing the instruments if there are several), key support and"
27
+ " resistance, and a suggested course of action with its risks."
28
+ " Start with the analysis; do not repeat the table."
29
+ )
30
+
31
+
32
+ def build_base_message(
33
+ message: str,
34
+ *,
35
+ wants_analysis_commentary: bool,
36
+ decomposition_plan: str = "",
37
+ snapshot: str = "",
38
+ lang: str = "zh",
39
+ ) -> str:
40
+ """Pick the effective prompt body for this turn.
41
+
42
+ Precedence: analysis-commentary mode wins outright (the snapshot data was
43
+ already shown, so the model just needs the fixed commentary instruction —
44
+ a decomposition plan would be redundant). Otherwise a non-empty
45
+ decomposition plan is prefixed onto the raw message. Otherwise the raw
46
+ message is sent unchanged.
47
+ """
48
+ if wants_analysis_commentary:
49
+ # The data goes in the prompt itself. The instruction used to say "the
50
+ # data above", but the turn's history is conversation[:-1], and after a
51
+ # pre-fetch the last entry IS the data — so the model was asked to
52
+ # comment on figures it never received.
53
+ en = not str(lang).lower().startswith("zh")
54
+ prompt = ANALYSIS_COMMENTARY_PROMPT_EN if en else ANALYSIS_COMMENTARY_PROMPT_ZH
55
+ if snapshot.strip():
56
+ prompt += ("\n\n[Market data]\n" if en else "\n\n[行情数据]\n") + snapshot.strip()
57
+ return prompt
58
+ if decomposition_plan:
59
+ return f"[执行计划]\n{decomposition_plan}\n\n[用户请求]\n{message}"
60
+ return message
61
+
62
+
63
+ def should_prepend_file_tool_hint(
64
+ wants_analysis_commentary: bool,
65
+ reference_context: str,
66
+ ) -> bool:
67
+ """A file-tool hint is only useful when the model doesn't already have
68
+ situational grounding — skip it in analysis-commentary mode (grounded by
69
+ the snapshot) and whenever ``@``-reference context is present (grounded
70
+ by the referenced files)."""
71
+ return not wants_analysis_commentary and not reference_context
72
+
73
+
74
+ def with_ml_signal_prefix(current_message: str, ml_signal_text: str) -> str:
75
+ """Prepend a fetched ML-signal reference block, if one was fetched."""
76
+ if not ml_signal_text:
77
+ return current_message
78
+ return f"[ML信号参考 — 仅供分析参考,非投资建议]\n{ml_signal_text}\n\n{current_message}"
File without changes