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,723 @@
1
+ """Team command parsing and execution helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import contextlib
7
+ from dataclasses import dataclass
8
+ from datetime import datetime
9
+ import io
10
+ import logging
11
+ import sys
12
+ from pathlib import Path
13
+ from typing import Any, Callable
14
+
15
+
16
+ def _detect_lang(text: str) -> str:
17
+ if not text:
18
+ return "zh"
19
+ zh_chars = sum(1 for c in text if '一' <= c <= '鿿')
20
+ return "zh" if zh_chars / max(len(text), 1) > 0.15 else "en"
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ DEFAULT_TEAM_AGENTS = ["macro", "fundamental", "technical", "risk"]
25
+ FULL_TEAM_AGENTS = ["macro", "fundamental", "technical", "risk", "news", "catalyst", "sector"]
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class TeamArgs:
30
+ symbols_raw: list[str]
31
+ agent_names: list[str] | None = None
32
+ use_full_team: bool = False
33
+ use_pipeline: bool = False
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class TeamAnalysisResult:
38
+ symbol: str
39
+ team_result: Any
40
+ data_bundle: Any = None
41
+ quality_notes: list[str] | None = None
42
+ quality_assessment: dict[str, Any] | None = None
43
+ captured_noise: str = ""
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ class SavedTeamReport:
48
+ path: Path
49
+ metadata_path: Path | None = None
50
+
51
+
52
+ def parse_team_args(args: str) -> TeamArgs:
53
+ parts = args.strip().split()
54
+ agent_names = None
55
+ symbols_raw: list[str] = []
56
+ use_full_team = False
57
+ use_pipeline = False
58
+ idx = 0
59
+ while idx < len(parts):
60
+ part = parts[idx]
61
+ if part == "--agents" and idx + 1 < len(parts):
62
+ agent_names = [agent.strip() for agent in parts[idx + 1].split(",") if agent.strip()]
63
+ idx += 2
64
+ elif part.startswith("--agents="):
65
+ agent_names = [agent.strip() for agent in part.split("=", 1)[1].split(",") if agent.strip()]
66
+ idx += 1
67
+ elif part == "--full":
68
+ use_full_team = True
69
+ idx += 1
70
+ elif part == "--pipeline":
71
+ use_pipeline = True
72
+ idx += 1
73
+ else:
74
+ symbols_raw.append(part)
75
+ idx += 1
76
+ if use_full_team and not agent_names:
77
+ agent_names = list(FULL_TEAM_AGENTS)
78
+ return TeamArgs(symbols_raw=symbols_raw, agent_names=agent_names, use_full_team=use_full_team, use_pipeline=use_pipeline)
79
+
80
+
81
+ def resolve_team_symbols(args: TeamArgs, config: dict[str, Any], limit: int = 3) -> list[str]:
82
+ if not args.symbols_raw or args.symbols_raw[0].lower() == "watchlist":
83
+ return [str(symbol).upper() for symbol in config.get("watchlist", ["AAPL", "MSFT", "NVDA"])[:limit]]
84
+ return [symbol.upper() for symbol in args.symbols_raw[:limit]]
85
+
86
+
87
+ def team_agent_names(args: TeamArgs) -> list[str]:
88
+ return args.agent_names or list(DEFAULT_TEAM_AGENTS)
89
+
90
+
91
+ def compact_market_cap(value: Any, currency: str = "USD") -> str:
92
+ try:
93
+ cap = float(value)
94
+ if cap <= 0:
95
+ return "-"
96
+ if cap >= 1e12:
97
+ return f"{currency} {cap / 1e12:.2f}T"
98
+ if cap >= 1e9:
99
+ return f"{currency} {cap / 1e9:.1f}B"
100
+ if cap >= 1e6:
101
+ return f"{currency} {cap / 1e6:.0f}M"
102
+ return f"{currency} {cap:,.0f}"
103
+ except Exception:
104
+ return "-"
105
+
106
+
107
+ def _first_present(*values: Any) -> Any:
108
+ for value in values:
109
+ if value not in (None, "", [], {}):
110
+ return value
111
+ return None
112
+
113
+
114
+ def _as_float(value: Any) -> float | None:
115
+ try:
116
+ if value in (None, ""):
117
+ return None
118
+ return float(value)
119
+ except Exception:
120
+ return None
121
+
122
+
123
+ def _fmt_num(value: Any, digits: int = 2) -> str:
124
+ number = _as_float(value)
125
+ if number is None:
126
+ return "-"
127
+ return f"{number:.{digits}f}"
128
+
129
+
130
+ def _fmt_pct(value: Any, digits: int = 2) -> str:
131
+ number = _as_float(value)
132
+ if number is None:
133
+ return "-"
134
+ return f"{number:+.{digits}f}%"
135
+
136
+
137
+ def _fmt_compact_number(value: Any) -> str:
138
+ number = _as_float(value)
139
+ if number is None:
140
+ return "-"
141
+ sign = "-" if number < 0 else ""
142
+ number = abs(number)
143
+ if number >= 1e12:
144
+ return f"{sign}{number / 1e12:.2f}T"
145
+ if number >= 1e9:
146
+ return f"{sign}{number / 1e9:.2f}B"
147
+ if number >= 1e6:
148
+ return f"{sign}{number / 1e6:.2f}M"
149
+ if number >= 1e3:
150
+ return f"{sign}{number / 1e3:.1f}K"
151
+ return f"{sign}{number:.0f}"
152
+
153
+
154
+ def _dedupe_missing(values: list[Any]) -> list[str]:
155
+ return list(dict.fromkeys(str(value) for value in values if value not in (None, "", [], {})))
156
+
157
+
158
+ def team_quote_snapshot(data_bundle: Any) -> dict[str, Any]:
159
+ quote = getattr(data_bundle, "quote", {}) or {}
160
+ fundamentals = getattr(data_bundle, "fundamentals", {}) or {}
161
+ technical = getattr(data_bundle, "technical", {}) or {}
162
+ quality = dict(getattr(data_bundle, "quality", {}) or {})
163
+ snapshot = {
164
+ "symbol": getattr(data_bundle, "symbol", "") or quote.get("symbol"),
165
+ "price": quote.get("price") or quote.get("current_price") or quote.get("regular_market_price"),
166
+ "change_pct": quote.get("change_pct") or quote.get("change_percent") or quote.get("pct_change"),
167
+ "currency": quote.get("currency") or quote.get("currency_symbol") or "USD",
168
+ "change": quote.get("change"),
169
+ "volume": quote.get("volume") or technical.get("volume"),
170
+ "high": quote.get("high"),
171
+ "low": quote.get("low"),
172
+ "open": quote.get("open"),
173
+ "prev_close": quote.get("prev_close"),
174
+ "name": quote.get("name") or fundamentals.get("name"),
175
+ "sector": fundamentals.get("sector"),
176
+ "industry": fundamentals.get("industry"),
177
+ "market_cap": quote.get("market_cap") or quote.get("marketCap") or fundamentals.get("market_cap"),
178
+ "pe_ratio": _first_present(fundamentals.get("pe_ratio"), fundamentals.get("pe_ttm"), quote.get("pe_ttm")),
179
+ "fwd_pe": fundamentals.get("fwd_pe"),
180
+ "eps": _first_present(fundamentals.get("eps"), fundamentals.get("fwd_eps")),
181
+ "roe": fundamentals.get("roe"),
182
+ "revenue_growth": fundamentals.get("revenue_growth"),
183
+ "analyst_target": fundamentals.get("analyst_target"),
184
+ "recommendation": fundamentals.get("recommendation"),
185
+ "beta": fundamentals.get("beta"),
186
+ "rsi": technical.get("rsi"),
187
+ "macd_hist": technical.get("macd_hist"),
188
+ "ma20": technical.get("ma20"),
189
+ "ma60": technical.get("ma60"),
190
+ "support": technical.get("support") or technical.get("supports"),
191
+ "resistance": technical.get("resistance") or technical.get("resistances"),
192
+ "history_bars": technical.get("history_bars"),
193
+ "provider_chain": getattr(data_bundle, "provider_chain", []) or [],
194
+ "missing_fields": getattr(data_bundle, "missing_fields", []) or [],
195
+ "warnings": getattr(data_bundle, "warnings", []) or [],
196
+ "errors": getattr(data_bundle, "errors", []) or [],
197
+ "quality": quality,
198
+ "stale": bool(quality.get("stale", False)),
199
+ "status": getattr(data_bundle, "status", "data_unavailable"),
200
+ "timestamp": getattr(data_bundle, "timestamp", ""),
201
+ }
202
+ display_missing = list(snapshot["missing_fields"])
203
+ if snapshot.get("volume") in (None, "", [], {}):
204
+ display_missing.append("volume")
205
+ if snapshot.get("analyst_target") in (None, "", [], {}):
206
+ display_missing.append("analyst_target")
207
+ if snapshot.get("beta") in (None, "", [], {}):
208
+ display_missing.append("risk_metrics")
209
+ snapshot["missing_fields"] = _dedupe_missing(display_missing)
210
+ if snapshot["missing_fields"] and snapshot["status"] in {"complete", "ok"}:
211
+ snapshot["status"] = "partial"
212
+ quality_missing = _dedupe_missing(list(quality.get("missing_fields") or []) + snapshot["missing_fields"])
213
+ if quality_missing:
214
+ quality["missing_fields"] = quality_missing
215
+ if quality.get("status") in {"complete", "ok"}:
216
+ quality["status"] = "partial"
217
+ snapshot["quality"] = quality
218
+ return snapshot
219
+
220
+
221
+ def build_team_market_context(data_bundle: Any) -> dict[str, Any]:
222
+ """Build the deterministic real-data block passed into synthesis."""
223
+ if not data_bundle:
224
+ return {}
225
+ snapshot = team_quote_snapshot(data_bundle)
226
+ quote = getattr(data_bundle, "quote", {}) or {}
227
+ fundamentals = getattr(data_bundle, "fundamentals", {}) or {}
228
+ technical = getattr(data_bundle, "technical", {}) or {}
229
+ quality = snapshot.get("quality") or {}
230
+ lines = [
231
+ f"data_status={snapshot.get('status') or 'unknown'}",
232
+ f"providers={', '.join(snapshot.get('provider_chain') or []) or 'unknown'}",
233
+ f"missing={', '.join(snapshot.get('missing_fields') or []) or 'none'}",
234
+ f"price={snapshot.get('currency') or 'USD'} {snapshot.get('price')}",
235
+ f"change_pct={snapshot.get('change_pct')}",
236
+ f"volume={snapshot.get('volume')}",
237
+ f"market_cap={compact_market_cap(snapshot.get('market_cap'), snapshot.get('currency') or 'USD')}",
238
+ f"pe={snapshot.get('pe_ratio')}",
239
+ f"forward_pe={snapshot.get('fwd_pe')}",
240
+ f"eps={snapshot.get('eps')}",
241
+ f"roe={snapshot.get('roe')}",
242
+ f"revenue_growth={snapshot.get('revenue_growth')}",
243
+ f"analyst_target={snapshot.get('analyst_target')}",
244
+ f"rsi={snapshot.get('rsi')}",
245
+ f"macd_hist={snapshot.get('macd_hist')}",
246
+ f"ma20={snapshot.get('ma20')}",
247
+ f"ma60={snapshot.get('ma60')}",
248
+ f"stale={bool(snapshot.get('stale'))}",
249
+ ]
250
+ return {
251
+ "quote": quote,
252
+ "fundamentals": fundamentals,
253
+ "technical": technical,
254
+ "data_quality": quality,
255
+ "market_snapshot": snapshot,
256
+ "market_data_block": "\n".join(lines),
257
+ }
258
+
259
+
260
+ def build_team_agent_data(data_bundle: Any) -> dict[str, dict[str, Any]]:
261
+ """Adapt one normalized data bundle to each agent's expected input shape."""
262
+ if not data_bundle:
263
+ return {}
264
+ quote = dict(getattr(data_bundle, "quote", {}) or {})
265
+ technical = dict(getattr(data_bundle, "technical", {}) or {})
266
+ fundamentals = dict(getattr(data_bundle, "fundamentals", {}) or {})
267
+ history = dict(getattr(data_bundle, "history", {}) or {})
268
+ prepared: dict[str, dict[str, Any]] = {}
269
+
270
+ if quote and technical:
271
+ prepared["technical"] = {"quote": quote, "history": technical}
272
+ if quote and fundamentals:
273
+ prepared["fundamental"] = {"quote": quote, "fundamentals": fundamentals}
274
+
275
+ rows = history.get("data")
276
+ if quote and isinstance(rows, list) and rows:
277
+ try:
278
+ import pandas as pd
279
+ from agents.financial.risk import _compute_risk
280
+
281
+ metrics = _compute_risk(pd.DataFrame(rows))
282
+ if metrics:
283
+ prepared["risk"] = {"quote": quote, "risk_metrics": metrics}
284
+ except Exception as exc:
285
+ logger.debug("team prefetched risk calculation failed: %s", exc)
286
+ return prepared
287
+
288
+
289
+ def build_team_terminal_summary(data_bundle: Any, lang: str = "zh") -> str:
290
+ """Return compact Rich markup summary for the /team panel, in the UI language."""
291
+ zh = str(lang).lower().startswith("zh")
292
+ L = (lambda a, b: a) if zh else (lambda a, b: b)
293
+ if not data_bundle:
294
+ return f"[#57606a]{L('数据', 'Data')}:[/#57606a] unavailable"
295
+ snapshot = team_quote_snapshot(data_bundle)
296
+ currency = snapshot.get("currency") or "USD"
297
+ price = snapshot.get("price")
298
+ price_text = f"{currency} {_fmt_num(price)}" if price is not None else "unavailable"
299
+ cap_text = compact_market_cap(snapshot.get("market_cap"), currency)
300
+ change_text = _fmt_pct(snapshot.get("change_pct"))
301
+ volume_text = _fmt_compact_number(snapshot.get("volume"))
302
+ rsi_text = _fmt_num(snapshot.get("rsi"), 1)
303
+ macd_text = _fmt_num(snapshot.get("macd_hist"), 4)
304
+ ma20_text = _fmt_num(snapshot.get("ma20"))
305
+ ma60_text = _fmt_num(snapshot.get("ma60"))
306
+ providers = ", ".join(snapshot.get("provider_chain") or []) or "unknown"
307
+ missing = ", ".join(snapshot.get("missing_fields") or []) or "none"
308
+ status = snapshot.get("status") or "unknown"
309
+ stale = "yes" if snapshot.get("stale") else "no"
310
+ return "\n".join([
311
+ f"[bold]{snapshot.get('name') or snapshot.get('symbol') or ''}[/bold] "
312
+ f"{L('价格', 'Price')} {price_text} ({change_text}) · {L('市值', 'Mkt cap')} {cap_text} · "
313
+ f"{L('成交量', 'Volume')} {volume_text}",
314
+ f"{L('技术面', 'Technicals')} RSI {rsi_text} · MACD hist {macd_text} · MA20 {ma20_text} · MA60 {ma60_text}",
315
+ f"[#57606a]{L('数据', 'Data')}:[/#57606a] {providers} · status {status} · stale {stale} · missing {missing}",
316
+ ])
317
+
318
+
319
+ def clean_team_synthesis_text(text: str) -> str:
320
+ """Strip raw Markdown markers that render poorly inside terminal panels."""
321
+ import re
322
+ cleaned = str(text or "").strip()
323
+ cleaned = re.sub(r"\*\*([^*]+)\*\*", r"\1", cleaned)
324
+ # Headings too: "## 团队分析汇总" showed with its hashes inside the panel.
325
+ cleaned = re.sub(r"(?m)^\s*#{1,6}\s+", "", cleaned)
326
+ # Quote markers and emoji variation selectors: "> ⚠️ 1 of 4 analysts…"
327
+ # broke the panel — Rich measures "⚠️" one cell short, and the line wrapped
328
+ # into "> ⚠" and a stray "that did.".
329
+ cleaned = re.sub(r"(?m)^\s*>\s?", "", cleaned).replace("\ufe0f", "")
330
+ cleaned = re.sub(r"(?m)^\s*-\s*$", "", cleaned)
331
+ cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
332
+ return cleaned.strip()
333
+
334
+
335
+ class ConfiguredTeamProvider:
336
+ """The model Aria is configured for, behind the agents' stream() interface.
337
+
338
+ The team was always handed an Ollama provider at localhost:11434 with the
339
+ configured model's name — "google/gemini-2.5-pro" sent to a local Ollama
340
+ that is not running — so every model-driven analyst failed on a cloud
341
+ setup. This streams through the same provider the chat and /review use.
342
+ """
343
+
344
+ def __init__(self, config: dict[str, Any], model: str):
345
+ self.app_config = config
346
+ self.model = model
347
+ self.name = "configured"
348
+
349
+ async def stream(self, messages, tools=None, temperature=None, max_tokens=None, cancel_event=None):
350
+ from aria_code.apps.cli.providers.base import ConfiguredProvider, event_kind
351
+
352
+ plain = [m if isinstance(m, dict) else {"role": m.role, "content": m.content} for m in messages]
353
+ async for event in ConfiguredProvider(self.app_config, self.model).stream(plain, tools=[]):
354
+ kind = event_kind(event)
355
+ if kind == "LLMToken":
356
+ yield {"type": "token", "text": event.text}
357
+ elif kind == "LLMDone":
358
+ if not event.success:
359
+ yield {"type": "error", "message": event.error or "the model call failed"}
360
+ yield {"type": "done"}
361
+ return
362
+
363
+ async def complete(self, messages, tools=None, temperature=None, max_tokens=None):
364
+ text, error = "", ""
365
+ async for event in self.stream(messages, max_tokens=max_tokens):
366
+ if event.get("type") == "token":
367
+ text += event.get("text", "")
368
+ elif event.get("type") == "error":
369
+ error = event.get("message", "")
370
+ return {"text": text, "content": text, "error": error, "tool_calls": []}
371
+
372
+
373
+ def build_team_llm_provider(config: dict[str, Any]) -> Any:
374
+ model = config.get("model", "qwen2.5:7b")
375
+ try:
376
+ from aria_code.apps.cli.providers.chat_routing import first_round_route
377
+
378
+ if first_round_route(model, config, None) != "ollama":
379
+ return ConfiguredTeamProvider(config, model)
380
+ except Exception as exc:
381
+ logger.debug("team route check failed, using Ollama: %s", exc)
382
+ try:
383
+ from providers.llm.base import ProviderConfig
384
+ from providers.llm.ollama import OllamaProvider
385
+
386
+ url = config.get("ollama_url", "http://localhost:11434")
387
+ return OllamaProvider(ProviderConfig(name="ollama", model=model, base_url=url))
388
+ except Exception as exc:
389
+ logger.debug("team LLM provider init failed: %s", exc)
390
+ return None
391
+
392
+
393
+ async def fetch_team_data_bundle(symbol: str) -> Any:
394
+ from packages.aria_services.data import DataService
395
+ try:
396
+ from datasources.router import get_router
397
+ router = get_router()
398
+ except Exception as exc:
399
+ logger.debug("team data router unavailable, using market client only: %s", exc)
400
+ router = False
401
+
402
+ return await asyncio.get_event_loop().run_in_executor(
403
+ None,
404
+ lambda: DataService(router=router).bundle(symbol),
405
+ )
406
+
407
+
408
+ async def run_team_analysis(
409
+ *,
410
+ symbol: str,
411
+ args: TeamArgs,
412
+ config: dict[str, Any],
413
+ sanitize_result: Callable[[Any, Any], list[str]] | None = None,
414
+ lang: str = "zh",
415
+ on_agent_done: Callable[[str, Any], None] | None = None,
416
+ on_token: Callable[[str], None] | None = None,
417
+ on_thought: Callable[[str], None] | None = None,
418
+ on_tool_start: Callable[[str, dict], None] | None = None,
419
+ on_tool_end: Callable[[str, Any], None] | None = None,
420
+ ) -> TeamAnalysisResult:
421
+ from agents.team import run_team
422
+ try:
423
+ from datasources.router import get_router
424
+ data_router = get_router()
425
+ except Exception as exc:
426
+ logger.debug("team data router unavailable for agents: %s", exc)
427
+ data_router = None
428
+
429
+ llm_provider = build_team_llm_provider(config)
430
+ data_bundle = None
431
+ try:
432
+ data_bundle = await fetch_team_data_bundle(symbol)
433
+ except Exception as exc:
434
+ logger.debug("team data bundle fetch failed: %s", exc)
435
+
436
+ noisy_loggers = ["agents.base", "agents.team", "datasources.router", "data_cleaner"]
437
+ saved_levels = {name: logging.getLogger(name).level for name in noisy_loggers}
438
+ for name in noisy_loggers:
439
+ logging.getLogger(name).setLevel(logging.ERROR)
440
+
441
+ captured_stdout = io.StringIO()
442
+ captured_stderr = io.StringIO()
443
+ # The team runs inside a stdout redirect (to swallow noisy agent logs).
444
+ # Restore the real stdout just for the on_agent_done callback so its
445
+ # streaming tree output is actually visible to the user.
446
+ _real_stdout = sys.stdout
447
+
448
+ def _agent_done_proxy(name: str, result: Any) -> None:
449
+ if on_agent_done is None:
450
+ return
451
+ try:
452
+ with contextlib.redirect_stdout(_real_stdout):
453
+ on_agent_done(name, result)
454
+ except Exception as exc:
455
+ logger.debug("on_agent_done render failed: %s", exc)
456
+
457
+ try:
458
+ with contextlib.redirect_stdout(captured_stdout), contextlib.redirect_stderr(captured_stderr):
459
+ team_result = await run_team(
460
+ symbol=symbol,
461
+ agents=args.agent_names,
462
+ llm_provider=llm_provider,
463
+ data_router=data_router,
464
+ on_token=on_token,
465
+ on_thought=on_thought,
466
+ on_tool_start=on_tool_start,
467
+ on_tool_end=on_tool_end,
468
+ on_agent_done=_agent_done_proxy if on_agent_done else None,
469
+ on_synthesis_start=None,
470
+ lang=lang,
471
+ market_context=build_team_market_context(data_bundle),
472
+ agent_data=build_team_agent_data(data_bundle),
473
+ use_pipeline=args.use_pipeline,
474
+ )
475
+ finally:
476
+ for name, level in saved_levels.items():
477
+ logging.getLogger(name).setLevel(level or logging.NOTSET)
478
+
479
+ quality_notes = sanitize_result(team_result, data_bundle) if sanitize_result else []
480
+ from packages.aria_services.research_quality import assess_team_report
481
+
482
+ assessment = assess_team_report(team_result, data_bundle)
483
+ gate_notes = [*assessment.blocking_reasons, *assessment.warnings]
484
+ quality_notes = list(dict.fromkeys([*quality_notes, *gate_notes]))
485
+ if assessment.decision.value == "blocked":
486
+ team_result.confidence = min(float(getattr(team_result, "confidence", 0) or 0), 0.20)
487
+ elif assessment.decision.value == "partial":
488
+ team_result.confidence = min(float(getattr(team_result, "confidence", 0) or 0), 0.55)
489
+ captured_noise = (captured_stdout.getvalue() + captured_stderr.getvalue()).strip()
490
+ if captured_noise:
491
+ logger.debug("captured /team noisy output for %s: %s", symbol, captured_noise[:3000])
492
+
493
+ return TeamAnalysisResult(
494
+ symbol=symbol,
495
+ team_result=team_result,
496
+ data_bundle=data_bundle,
497
+ quality_notes=quality_notes,
498
+ quality_assessment=assessment.to_dict(),
499
+ captured_noise=captured_noise,
500
+ )
501
+
502
+
503
+ async def run_deep_cli(
504
+ *,
505
+ symbol: str,
506
+ args: TeamArgs,
507
+ config: dict[str, Any],
508
+ lang: str = "zh",
509
+ on_agent_done: Callable[[str, Any], None] | None = None,
510
+ ):
511
+ """Run the deep analysis pipeline (P0–P3) reusing the team provider plumbing."""
512
+ from agents.deep.pipeline import DeepAnalysisPipeline
513
+ from datasources.router import get_router
514
+
515
+ llm_provider = build_team_llm_provider(config)
516
+ noisy = ["agents.base", "agents.team", "agents.deep", "datasources.router", "data_cleaner"]
517
+ saved = {name: logging.getLogger(name).level for name in noisy}
518
+ for name in noisy:
519
+ logging.getLogger(name).setLevel(logging.ERROR)
520
+
521
+ _real_stdout = sys.stdout
522
+
523
+ def _agent_done_proxy(name: str, result: Any) -> None:
524
+ if on_agent_done is None:
525
+ return
526
+ try:
527
+ with contextlib.redirect_stdout(_real_stdout):
528
+ on_agent_done(name, result)
529
+ except Exception as exc:
530
+ logger.debug("deep on_agent_done render failed: %s", exc)
531
+
532
+ cap_out, cap_err = io.StringIO(), io.StringIO()
533
+ try:
534
+ pipe = DeepAnalysisPipeline(
535
+ llm_provider=llm_provider, data_router=get_router(), lang=lang,
536
+ )
537
+ with contextlib.redirect_stdout(cap_out), contextlib.redirect_stderr(cap_err):
538
+ result = await pipe.run(
539
+ symbol,
540
+ agents=args.agent_names,
541
+ on_agent_done=_agent_done_proxy if on_agent_done else None,
542
+ )
543
+ finally:
544
+ for name, level in saved.items():
545
+ logging.getLogger(name).setLevel(level or logging.NOTSET)
546
+ return result
547
+
548
+
549
+ def _agent_result_summary(team_result: Any) -> list[dict[str, Any]]:
550
+ return [
551
+ {
552
+ "agent": getattr(result, "agent", ""),
553
+ "success": bool(getattr(result, "success", False)),
554
+ "signal": getattr(result, "signal", None),
555
+ "confidence": getattr(result, "confidence", None),
556
+ "error": getattr(result, "error", None),
557
+ "key_points": getattr(result, "key_points", None),
558
+ "degraded": bool(getattr(result, "degraded", False)),
559
+ "provenance": list(getattr(result, "provenance", None) or []),
560
+ "limitations": list(getattr(result, "limitations", None) or []),
561
+ }
562
+ for result in getattr(team_result, "results", []) or []
563
+ ]
564
+
565
+
566
+ def build_team_report_markdown(
567
+ *,
568
+ symbol: str,
569
+ team_result: Any,
570
+ data_bundle: Any = None,
571
+ quality_notes: list[str] | None = None,
572
+ created_at: datetime | None = None,
573
+ ) -> str:
574
+ from packages.aria_services.research_quality import assess_team_report
575
+
576
+ created = created_at or datetime.now()
577
+ quality_notes = quality_notes or []
578
+ quote_snapshot = team_quote_snapshot(data_bundle) if data_bundle else {}
579
+ currency = quote_snapshot.get("currency") or "USD"
580
+ price = quote_snapshot.get("price")
581
+ cap = quote_snapshot.get("market_cap")
582
+ providers = quote_snapshot.get("provider_chain") or []
583
+ missing = quote_snapshot.get("missing_fields") or []
584
+ warnings = quote_snapshot.get("warnings") or []
585
+ errors = quote_snapshot.get("errors") or []
586
+ quality = quote_snapshot.get("quality") or {}
587
+ stale = bool(quote_snapshot.get("stale"))
588
+ assessment = assess_team_report(team_result, data_bundle)
589
+
590
+ lines = [
591
+ f"# {symbol} 多 Agent 研究报告",
592
+ f"> 生成时间: {created:%Y-%m-%d %H:%M} | 最终信号: **{team_result.final_signal}**"
593
+ f" | 置信度: {team_result.confidence:.0%} | 耗时: {team_result.elapsed_sec:.1f}s",
594
+ "",
595
+ "## 数据质量",
596
+ "",
597
+ f"- 数据状态: `{quote_snapshot.get('status', 'unknown')}`",
598
+ f"- 是否过期: `{'yes' if stale else 'no'}`",
599
+ f"- 当前参考价: `{currency} {price}`" if price is not None else "- 当前参考价: `unavailable`",
600
+ f"- 涨跌幅: `{_fmt_pct(quote_snapshot.get('change_pct'))}`",
601
+ f"- 成交量: `{_fmt_compact_number(quote_snapshot.get('volume'))}`",
602
+ f"- 市值: `{compact_market_cap(cap, currency)}`" if cap else "- 市值: `unavailable`",
603
+ f"- PE / Forward PE / EPS: `{_fmt_num(quote_snapshot.get('pe_ratio'))}` / `{_fmt_num(quote_snapshot.get('fwd_pe'))}` / `{_fmt_num(quote_snapshot.get('eps'))}`",
604
+ f"- ROE / 营收增长: `{_fmt_num(quote_snapshot.get('roe'))}%` / `{_fmt_num(quote_snapshot.get('revenue_growth'))}%`",
605
+ f"- 技术指标: `RSI {_fmt_num(quote_snapshot.get('rsi'), 1)} · MACD hist {_fmt_num(quote_snapshot.get('macd_hist'), 4)} · MA20 {_fmt_num(quote_snapshot.get('ma20'))} · MA60 {_fmt_num(quote_snapshot.get('ma60'))}`",
606
+ f"- 分析师目标价: `{currency} {_fmt_num(quote_snapshot.get('analyst_target'))}`" if quote_snapshot.get("analyst_target") is not None else "- 分析师目标价: `unavailable`",
607
+ f"- 数据源链: `{', '.join(providers) if providers else 'unknown'}`",
608
+ f"- 缺失字段: `{', '.join(missing) if missing else 'none'}`",
609
+ "",
610
+ "## 完成度门禁",
611
+ "",
612
+ f"- 判定: `{assessment.decision.value}`",
613
+ f"- Agent 覆盖: `{assessment.agent_coverage:.0%}`",
614
+ f"- 核心 Agent 覆盖: `{assessment.core_coverage:.0%}`",
615
+ f"- 降级 Agent: `{', '.join(assessment.degraded_agents) or 'none'}`",
616
+ f"- 失败 Agent: `{', '.join(assessment.failed_agents) or 'none'}`",
617
+ ]
618
+ gate_notes = [*assessment.blocking_reasons, *assessment.warnings]
619
+ if gate_notes:
620
+ lines.append(f"- 门禁说明: `{' ; '.join(gate_notes)}`")
621
+ if quality_notes:
622
+ lines.append(f"- 输出校验: `{'; '.join(quality_notes)}`")
623
+ if warnings:
624
+ lines.append(f"- 数据警告: `{'; '.join(str(w) for w in warnings[:5])}`")
625
+ if errors:
626
+ lines.append(f"- 数据错误: `{'; '.join(str(e) for e in errors[:5])}`")
627
+ if quality:
628
+ lines.append(f"- 质量摘要: `{quality.get('status', quote_snapshot.get('status', 'unknown'))}`")
629
+ lines += ["", "---", ""]
630
+
631
+ for result in getattr(team_result, "results", []) or []:
632
+ if getattr(result, "success", False):
633
+ mode = " · DEGRADED" if getattr(result, "degraded", False) else ""
634
+ lines += [
635
+ f"## {result.agent.upper()} ({result.signal}, {result.confidence:.0%}{mode})",
636
+ "",
637
+ result.analysis or "*(无分析文本)*",
638
+ "",
639
+ ]
640
+ provenance = list(getattr(result, "provenance", None) or [])
641
+ limitations = list(getattr(result, "limitations", None) or [])
642
+ if provenance:
643
+ lines += [f"> Provenance: {', '.join(provenance)}", ""]
644
+ if limitations:
645
+ lines += [f"> Limitations: {'; '.join(limitations)}", ""]
646
+ else:
647
+ lines += [
648
+ f"## {result.agent.upper()} (UNUSABLE)",
649
+ "",
650
+ f"> {result.error or 'agent_failed'}",
651
+ "",
652
+ result.analysis or "*(该 Agent 未产生可用分析文本)*",
653
+ "",
654
+ ]
655
+ lines += ["---", "", "## 综合结论", "", clean_team_synthesis_text(team_result.synthesis or "*(无综合结论)*"), ""]
656
+ return "\n".join(lines)
657
+
658
+
659
+ def save_team_report(
660
+ *,
661
+ symbol: str,
662
+ team_result: Any,
663
+ data_bundle: Any = None,
664
+ quality_notes: list[str] | None = None,
665
+ created_at: datetime | None = None,
666
+ ) -> SavedTeamReport:
667
+ from artifacts import create_user_artifact, write_artifact_metadata, write_artifact_raw_data
668
+ from packages.aria_services.research_quality import assess_team_report
669
+
670
+ created = created_at or datetime.now()
671
+ quality_notes = quality_notes or []
672
+ artifact = create_user_artifact("reports/team", symbol, f"{symbol}_team_report", ".md")
673
+ markdown = build_team_report_markdown(
674
+ symbol=symbol,
675
+ team_result=team_result,
676
+ data_bundle=data_bundle,
677
+ quality_notes=quality_notes,
678
+ created_at=created,
679
+ )
680
+ artifact.path.write_text(markdown, encoding="utf-8")
681
+
682
+ quote_snapshot = team_quote_snapshot(data_bundle) if data_bundle else {}
683
+ quality = quote_snapshot.get("quality") or {}
684
+ agent_results = _agent_result_summary(team_result)
685
+ assessment = assess_team_report(team_result, data_bundle)
686
+ write_artifact_metadata(artifact, {
687
+ "kind": "team_report",
688
+ "status": assessment.metadata_status,
689
+ "symbol": symbol,
690
+ "created_at": created.isoformat(timespec="seconds"),
691
+ "data": {
692
+ "agent_count": len(agent_results),
693
+ "successful_agents": sum(1 for result in agent_results if result.get("success")),
694
+ "failed_agents": [result.get("agent") for result in agent_results if not result.get("success")],
695
+ "quote": quote_snapshot,
696
+ "quality": quality,
697
+ "quality_notes": quality_notes,
698
+ "quality_gate": assessment.to_dict(),
699
+ },
700
+ "verdict": {
701
+ "final_signal": getattr(team_result, "final_signal", None),
702
+ "confidence": getattr(team_result, "confidence", None),
703
+ "elapsed_sec": getattr(team_result, "elapsed_sec", None),
704
+ },
705
+ })
706
+ write_artifact_raw_data(artifact, {
707
+ "symbol": symbol,
708
+ "agents": agent_results,
709
+ "synthesis": getattr(team_result, "synthesis", None),
710
+ "data_bundle": {
711
+ "quote": getattr(data_bundle, "quote", {}) if data_bundle else {},
712
+ "history": getattr(data_bundle, "history", {}) if data_bundle else {},
713
+ "fundamentals": getattr(data_bundle, "fundamentals", {}) if data_bundle else {},
714
+ "technical": getattr(data_bundle, "technical", {}) if data_bundle else {},
715
+ "provider_chain": getattr(data_bundle, "provider_chain", []) if data_bundle else [],
716
+ "missing_fields": getattr(data_bundle, "missing_fields", []) if data_bundle else [],
717
+ "warnings": getattr(data_bundle, "warnings", []) if data_bundle else [],
718
+ "errors": getattr(data_bundle, "errors", []) if data_bundle else [],
719
+ "quality": getattr(data_bundle, "quality", {}) if data_bundle else {},
720
+ "status": getattr(data_bundle, "status", None) if data_bundle else None,
721
+ },
722
+ })
723
+ return SavedTeamReport(path=artifact.path, metadata_path=artifact.metadata_path)