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,75 @@
1
+ """Shared responsive layout primitives for structured terminal output."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ import shutil
7
+ from typing import Literal, Sequence
8
+
9
+
10
+ StructuredLayout = Literal["stacked", "compact", "full"]
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class StackedRecord:
15
+ """One narrow-terminal record with a headline and readable detail rows."""
16
+
17
+ headline: str
18
+ lines: tuple[str, ...]
19
+
20
+
21
+ def terminal_width(console=None, *, fallback: int = 80) -> int:
22
+ """Return a stable terminal width for real and recording consoles."""
23
+ try:
24
+ width = int(getattr(console, "width", 0) or 0)
25
+ if width > 0:
26
+ return width
27
+ except (TypeError, ValueError):
28
+ pass
29
+ return int(shutil.get_terminal_size((fallback, 24)).columns or fallback)
30
+
31
+
32
+ def select_structured_layout(
33
+ width: int,
34
+ *,
35
+ stacked_below: int = 96,
36
+ full_at: int = 120,
37
+ ) -> StructuredLayout:
38
+ """Choose stacked cards, a reduced table, or the full table."""
39
+ if width < stacked_below:
40
+ return "stacked"
41
+ if width < full_at:
42
+ return "compact"
43
+ return "full"
44
+
45
+
46
+ def structured_layout(
47
+ console=None,
48
+ *,
49
+ width: int | None = None,
50
+ stacked_below: int = 96,
51
+ full_at: int = 120,
52
+ ) -> StructuredLayout:
53
+ return select_structured_layout(
54
+ width if width is not None else terminal_width(console),
55
+ stacked_below=stacked_below,
56
+ full_at=full_at,
57
+ )
58
+
59
+
60
+ def render_stacked_records(
61
+ console,
62
+ *,
63
+ title: str,
64
+ records: Sequence[StackedRecord],
65
+ footer: str = "",
66
+ ) -> None:
67
+ """Render narrow structured data without a wide table or panel border."""
68
+ console.print(f"[bold]{title}[/bold]")
69
+ for index, record in enumerate(records, start=1):
70
+ console.print(f" [bold]#{index} {record.headline}[/bold]")
71
+ for line in record.lines:
72
+ if str(line).strip():
73
+ console.print(f" {line}")
74
+ if footer:
75
+ console.print(f" [dim]{footer}[/dim]")
@@ -0,0 +1,367 @@
1
+ """Rendering helpers for /team output — table, verdict banner, adaptive widths."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shutil
6
+ from dataclasses import dataclass
7
+ from typing import TYPE_CHECKING, Any
8
+
9
+ if TYPE_CHECKING:
10
+ from rich.console import Console
11
+
12
+ # ── Signal → Rich style ──────────────────────────────────────────────────────
13
+
14
+ SIGNAL_COLORS: dict[str, str] = {
15
+ "BUY": "green",
16
+ "STRONG_BUY": "bold green",
17
+ "SELL": "red",
18
+ "STRONG_SELL": "bold red",
19
+ "HOLD": "yellow",
20
+ }
21
+
22
+ # ── Verdict banner ────────────────────────────────────────────────────────────
23
+
24
+ VERDICT_STYLE: dict[str, tuple[str, str]] = {
25
+ # Text glyphs, not emoji: "🔴" drew as an empty box in common terminal
26
+ # fonts, and the variation selector in "⚠️" threw the panel width off.
27
+ "HEALTHY": ("green", "✓ "),
28
+ "NEEDS_ATTENTION": ("yellow", "! "),
29
+ "HIGH_RISK": ("red", "✗ "),
30
+ "STRONG_BUY": ("bold green", "▲▲"),
31
+ "BUY": ("green", "▲ "),
32
+ "HOLD": ("dim", "─ "),
33
+ "SELL": ("red", "▼ "),
34
+ "STRONG_SELL": ("bold red", "▼▼"),
35
+ }
36
+
37
+
38
+ # ── Streaming agent tree (Claude Code-style nested ⏺ rendering) ────────────────
39
+
40
+ AGENT_LABELS: dict[str, str] = {
41
+ "fundamental": "基本面", "technical": "技术面", "macro": "宏观",
42
+ "risk": "风险", "news": "新闻", "catalyst": "催化剂",
43
+ "sector": "行业", "sentiment": "情绪", "debate": "分歧调解",
44
+ "valuation": "估值", "quant": "量化", "synthesis": "综合",
45
+ }
46
+
47
+
48
+ def agent_label(name: str, lang: str = "zh") -> str:
49
+ if not str(lang).lower().startswith("zh"):
50
+ return (name or "?").replace("_", " ").title()
51
+ return AGENT_LABELS.get((name or "").lower(), name or "?")
52
+
53
+
54
+ def render_agent_tree_root(console, sym: str, n_agents: int, lang: str = "zh") -> None:
55
+ """Print the root of the agent tree: ⏺ 多代理分析 SYM N 个分析师并行"""
56
+ head = "多代理分析" if lang == "zh" else "Multi-agent analysis"
57
+ sub = (f"{n_agents} 个分析师并行" if lang == "zh"
58
+ else f"{n_agents} analysts in parallel")
59
+ console.print(f"\n [#C08050]⏺[/#C08050] [bold]{head} {sym}[/bold] [dim]{sub}[/dim]")
60
+
61
+
62
+ def render_agent_node(console, name: str, signal: str | None,
63
+ key_point: str | None, success: bool = True,
64
+ error: str | None = None,
65
+ degraded: bool = False, lang: str = "zh") -> None:
66
+ """Print one completed-agent leaf: ⎿ ⏺ 基本面 BUY ROE 24%·PE 32 偏高 (Fundamental … in English)"""
67
+ zh = str(lang).lower().startswith("zh")
68
+ label = agent_label(name, lang)
69
+ if not success or error:
70
+ _err_label = ({
71
+ "timeout": "超时", "rate_limited": "数据源限流",
72
+ "no_data": "无数据", "": "失败",
73
+ } if zh else {
74
+ "timeout": "timed out", "rate_limited": "data source rate-limited",
75
+ "no_data": "no data", "": "failed",
76
+ }).get((error or "").lower(), error or ("失败" if zh else "failed"))
77
+ console.print(f" [dim]⎿ ⏺ {label} {_err_label}[/dim]")
78
+ return
79
+ sig = (signal or "").upper()
80
+ color = SIGNAL_COLORS.get(sig, "dim")
81
+ sig_disp = f"[{color}]{sig}[/{color}] " if sig else ""
82
+ kp = (key_point or "").strip().replace("\n", " ")
83
+ if len(kp) > 52:
84
+ kp = kp[:52] + "…"
85
+ if degraded:
86
+ tag = "降级" if zh else "degraded"
87
+ kp = f"{tag} · {kp}" if kp else (f"{tag}执行" if zh else tag)
88
+ console.print(
89
+ f" [dim]⎿[/dim] [#C08050]⏺[/#C08050] [bold]{label}[/bold] "
90
+ f"{sig_disp}[dim]{kp}[/dim]"
91
+ )
92
+
93
+
94
+ def render_agent_synthesis_leaf(console, signal: str | None,
95
+ confidence: float | None, elapsed: float | None,
96
+ lang: str = "zh") -> None:
97
+ """Print the synthesis leaf: ⎿ 综合: ▲ BUY (置信 68%) 耗时 4.2s"""
98
+ sig = (signal or "").upper()
99
+ color, icon = VERDICT_STYLE.get(sig, ("dim", "●"))
100
+ zh = str(lang).lower().startswith("zh")
101
+ conf = (f" [dim]{'置信' if zh else 'confidence'} {confidence:.0%}[/dim]" if confidence else "")
102
+ el = (f" [dim]{'耗时' if zh else 'took'} {elapsed:.1f}s[/dim]" if elapsed else "")
103
+ lab = "综合" if zh else "Synthesis"
104
+ console.print(
105
+ f" [dim]⎿[/dim] [bold]{lab}[/bold] [{color}]{icon} {sig}[/{color}]{conf}{el}"
106
+ )
107
+
108
+
109
+ def build_verdict_body(
110
+ verdict: str,
111
+ subtitle: str = "",
112
+ confidence: float | None = None,
113
+ lang: str = "zh",
114
+ ) -> str:
115
+ """Return a Rich markup string suitable for a Panel body."""
116
+ verdict_upper = verdict.upper()
117
+ style, icon = VERDICT_STYLE.get(verdict_upper, ("dim", "●"))
118
+ label = "置信度" if str(lang).lower().startswith("zh") else "confidence"
119
+ conf_str = f" [dim]{label} {confidence:.0%}[/dim]" if confidence else ""
120
+ body = f"[{style}]{icon} {verdict_upper}[/{style}]{conf_str}"
121
+ if subtitle:
122
+ body += f"\n[dim]{subtitle}[/dim]"
123
+ return body
124
+
125
+
126
+ def render_verdict_banner(
127
+ verdict: str,
128
+ subtitle: str = "",
129
+ confidence: float | None = None,
130
+ *,
131
+ console: "Console | None" = None,
132
+ has_rich: bool = True,
133
+ lang: str = "zh",
134
+ ) -> None:
135
+ """Print a visually prominent verdict/signal result.
136
+
137
+ Falls back to a plain print when Rich is unavailable or *console* is None.
138
+ """
139
+ if not verdict:
140
+ return
141
+ verdict_upper = verdict.upper()
142
+
143
+ if not has_rich or console is None:
144
+ conf_str = f" ({confidence:.0%})" if confidence else ""
145
+ sub_str = f" {subtitle}" if subtitle else ""
146
+ print(f"\n {verdict_upper}{conf_str}{sub_str}\n")
147
+ return
148
+
149
+ try:
150
+ from rich import box as _rbox
151
+ from rich.panel import Panel
152
+ body = build_verdict_body(verdict_upper, subtitle, confidence, lang)
153
+ console.print(Panel(body, box=_rbox.SIMPLE, padding=(0, 2)))
154
+ except Exception:
155
+ conf_str = f" ({confidence:.0%})" if confidence else ""
156
+ console.print(f"\n {verdict_upper}{conf_str}\n")
157
+
158
+
159
+ # ── Team table ────────────────────────────────────────────────────────────────
160
+
161
+ @dataclass(frozen=True)
162
+ class TeamTableRow:
163
+ agent: str
164
+ signal: str
165
+ confidence: str
166
+ key_point: str
167
+ success: bool
168
+ signal_color: str = "dim"
169
+ is_debate: bool = False
170
+ degraded: bool = False
171
+
172
+
173
+ # Minimum usable terminal width before we drop the key_point column entirely.
174
+ _KEY_POINT_MIN_TERMINAL = 72
175
+
176
+
177
+ def calc_column_widths(terminal_width: int) -> tuple[int, int, int, int]:
178
+ """Return ``(agent_w, signal_w, conf_w, key_w)`` adaptive to *terminal_width*.
179
+
180
+ Column budget (chars used by content only, excluding Rich padding/borders):
181
+
182
+ +-----------+---------+-----------+--------------------+
183
+ | Agent | Signal | Conf | Key point |
184
+ +-----------+---------+-----------+--------------------+
185
+ Fixed overhead per row: ~7 chars (borders + padding × 4 cols).
186
+
187
+ Width tiers
188
+ -----------
189
+ ≥ 120 cols full layout 14 | 10 | 7 | 38
190
+ ≥ 100 cols medium 12 | 9 | 6 | 30
191
+ ≥ 80 cols compact 10 | 8 | 6 | 20
192
+ ≥ 72 cols tight 9 | 8 | 6 | 12
193
+ < 72 cols no key col 9 | 8 | 6 | 0 (column omitted)
194
+ """
195
+ if terminal_width >= 120:
196
+ return (14, 10, 7, 38)
197
+ if terminal_width >= 100:
198
+ return (12, 9, 6, 30)
199
+ if terminal_width >= 80:
200
+ return (10, 8, 6, 20)
201
+ if terminal_width >= _KEY_POINT_MIN_TERMINAL:
202
+ return ( 9, 8, 6, 12)
203
+ return (9, 8, 6, 0)
204
+
205
+
206
+ def truncate_cell(value: Any, width: int = 36) -> str:
207
+ text = str(value or "").strip().replace("\n", " ")
208
+ if width <= 0:
209
+ return ""
210
+ if width <= 1:
211
+ return text[:width]
212
+ if len(text) <= width:
213
+ return text
214
+ return text[: width - 1].rstrip() + "…"
215
+
216
+
217
+ def team_mode_label(results: list[Any], use_full: bool = False) -> str:
218
+ non_debate = [r for r in results if getattr(r, "agent", None) != "debate"]
219
+ return f"{len(non_debate)}-agent {'完整分析' if use_full else '分析'}"
220
+
221
+
222
+ _AGENT_DISPLAY = {
223
+ "fundamental": "fundmntl",
224
+ "synthesis": "synthsis",
225
+ "catalyst": "catalyst",
226
+ }
227
+
228
+
229
+ def build_team_table_rows(results: list[Any], key_width: int = 36) -> list[TeamTableRow]:
230
+ rows: list[TeamTableRow] = []
231
+ debate_rows: list[TeamTableRow] = []
232
+
233
+ for result in results:
234
+ agent = str(getattr(result, "agent", "") or "")
235
+ agent = _AGENT_DISPLAY.get(agent, agent)
236
+ success = bool(getattr(result, "success", False))
237
+ raw_signal = str(getattr(result, "signal", "") or "")
238
+ signal = raw_signal or "N/A"
239
+ conf_val = float(getattr(result, "confidence", 0.0) or 0.0)
240
+ confidence = f"{conf_val:.0%}" if success else "-"
241
+ degraded = bool(getattr(result, "degraded", False))
242
+ color = SIGNAL_COLORS.get(raw_signal.upper(), "dim")
243
+
244
+ if agent == "debate":
245
+ debate_rows.append(TeamTableRow(
246
+ agent="debate",
247
+ signal=raw_signal or "ADJ",
248
+ confidence=confidence,
249
+ key_point="信号分歧调解",
250
+ success=success,
251
+ signal_color="orange1",
252
+ is_debate=True,
253
+ ))
254
+ continue
255
+
256
+ if success:
257
+ kpts = getattr(result, "key_points", []) or []
258
+ key_point = truncate_cell(kpts[0] if kpts else "", key_width)
259
+ if degraded:
260
+ key_point = truncate_cell(f"降级 · {key_point}" if key_point else "降级执行", key_width)
261
+ else:
262
+ _raw_err = getattr(result, "error", None) or "failed"
263
+ _err_display = {
264
+ "stale_or_conflicting_price": "数据冲突 — 价格与行情不符",
265
+ "timeout": "分析超时",
266
+ "no_data": "数据不可用",
267
+ "agent_failed": "Agent 执行失败",
268
+ }.get(_raw_err, _raw_err)
269
+ key_point = truncate_cell(_err_display, key_width)
270
+
271
+ rows.append(TeamTableRow(
272
+ agent=agent,
273
+ signal=signal,
274
+ confidence=confidence,
275
+ key_point=key_point,
276
+ success=success,
277
+ signal_color=color,
278
+ degraded=degraded,
279
+ ))
280
+
281
+ return rows + debate_rows
282
+
283
+
284
+ def render_team_rows_plain(rows: list[TeamTableRow]) -> list[str]:
285
+ """Plain-text fallback (no Rich)."""
286
+ lines: list[str] = []
287
+ for row in rows:
288
+ icon = "DEG" if row.degraded else "OK" if row.success else "WARN"
289
+ lines.append(
290
+ f" {icon} [{row.agent}] {row.signal} ({row.confidence}) {row.key_point}".rstrip()
291
+ )
292
+ return lines
293
+
294
+
295
+ def render_team_table(
296
+ sym: str,
297
+ rows: list[TeamTableRow],
298
+ use_full: bool = False,
299
+ *,
300
+ console: "Console | None" = None,
301
+ terminal_width: int | None = None,
302
+ has_rich: bool = True,
303
+ ) -> None:
304
+ """Print the /team results table, adapting column widths to *terminal_width*.
305
+
306
+ Falls back to :func:`render_team_rows_plain` when Rich is unavailable.
307
+ """
308
+ if not has_rich or console is None:
309
+ for line in render_team_rows_plain(rows):
310
+ print(line)
311
+ return
312
+
313
+ try:
314
+ from rich import box as _rbox
315
+ from rich.table import Table as _Table
316
+ except ImportError:
317
+ for line in render_team_rows_plain(rows):
318
+ console.print(line)
319
+ return
320
+
321
+ # Determine terminal width from console if not supplied
322
+ if terminal_width is None:
323
+ terminal_width = getattr(console, "width", None) or shutil.get_terminal_size().columns
324
+
325
+ agent_w, signal_w, conf_w, key_w = calc_column_widths(terminal_width)
326
+ mode_label = team_mode_label(rows, use_full) # rows already built; agent count approximate
327
+
328
+ tbl = _Table(
329
+ title=f"[bold]/team {sym}[/bold] · [dim]{mode_label}[/dim]",
330
+ box=_rbox.ROUNDED,
331
+ border_style="dim",
332
+ show_header=True,
333
+ header_style="bold dim",
334
+ padding=(0, 1),
335
+ )
336
+ tbl.add_column("Agent", width=agent_w)
337
+ tbl.add_column("信号", width=signal_w)
338
+ tbl.add_column("置信度", justify="right", width=conf_w)
339
+ if key_w > 0:
340
+ tbl.add_column("关键点", width=key_w)
341
+
342
+ for row in rows:
343
+ # Re-truncate key_point to the current adaptive width
344
+ kp = truncate_cell(row.key_point, key_w) if key_w > 0 else None
345
+
346
+ agent_cell = (
347
+ f"[orange1]{row.agent}[/orange1]"
348
+ if row.is_debate
349
+ else f"[dim]{row.agent}[/dim]"
350
+ )
351
+ key_cell = (
352
+ "[dim][orange1]信号分歧调解[/orange1][/dim]"
353
+ if row.is_debate
354
+ else f"[dim]{kp}[/dim]"
355
+ ) if key_w > 0 else None
356
+
357
+ cells = [
358
+ agent_cell,
359
+ f"[{row.signal_color}]{row.signal}[/{row.signal_color}]",
360
+ f"[dim]{row.confidence}[/dim]" if row.success else "[dim]—[/dim]",
361
+ ]
362
+ if key_cell is not None:
363
+ cells.append(key_cell)
364
+ tbl.add_row(*cells)
365
+
366
+ console.print()
367
+ console.print(tbl)
aria_code/ui/robot.py ADDED
@@ -0,0 +1,239 @@
1
+ """Aria robot mascot — the terminal rendition of the robot artwork.
2
+
3
+ Drawn the way Claude Code draws its mascot: a few flat colours and Unicode
4
+ quadrant blocks (▗▖▘▝▛▜▙▟), each character cell holding 2×2 sub-pixels. That
5
+ keeps the robot small (4 rows × 9 columns, beside four lines of text) and its
6
+ edges exact in any terminal and font, with no image and no blending.
7
+
8
+ The grid is the artwork's own: 18 units wide × 16 tall (ear, body, ear; cap,
9
+ screen, base, feet), each unit one sub-pixel across and half a sub-pixel down
10
+ — which, with terminal cells twice as tall as wide, keeps the units square.
11
+ Each eye is two quadrants (a square) and the two are identical,
12
+ the cap corners ▛ ▜, the ears ▌ ▐, the four feet ▀. Colours are sampled from
13
+ the artwork (docs/assets/aria-robot.png) on this grid; only the light-theme
14
+ greys and body are deepened, where the artwork's would vanish against a
15
+ white background. The orange seam between body and base is left out: at
16
+ this size it would share a cell with two other colours, and a cell has two.
17
+
18
+ Runtime state is shown by the compact status dot, not by the mascot.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import os
24
+ import sys
25
+ import threading
26
+ import time
27
+ from enum import Enum
28
+
29
+
30
+ class RobotState(Enum):
31
+ IDLE = "idle"
32
+ THINKING = "thinking"
33
+ STREAMING = "streaming"
34
+ ERROR = "error"
35
+ DONE = "done"
36
+
37
+
38
+ # ── Shared mutable state (written by aria_cli, read by input_box) ─────────────
39
+ _state = RobotState.IDLE
40
+ _state_lock = threading.Lock()
41
+ _done_at: float | None = None # timestamp when DONE state was set
42
+
43
+
44
+ def set_robot_state(state: RobotState) -> None:
45
+ global _state, _done_at
46
+ with _state_lock:
47
+ _state = state
48
+ _done_at = time.monotonic() if state is RobotState.DONE else None
49
+
50
+
51
+ def get_robot_state() -> RobotState:
52
+ with _state_lock:
53
+ # Auto-revert DONE → IDLE after 1.5 s
54
+ if _state is RobotState.DONE and _done_at is not None:
55
+ if time.monotonic() - _done_at > 1.5:
56
+ return RobotState.IDLE
57
+ return _state
58
+
59
+
60
+ # Eye symbols per state. IDLE mirrors the mascot art: two matching square eyes.
61
+ _EYES = {
62
+ RobotState.IDLE: ("■", "■"),
63
+ RobotState.THINKING: ("◐", "◑"),
64
+ RobotState.STREAMING: ("▸", "▸"),
65
+ RobotState.ERROR: ("×", "×"),
66
+ RobotState.DONE: ("✓", "✓"),
67
+ }
68
+
69
+ # Accent colour per state
70
+ _COLOUR = {
71
+ RobotState.IDLE: "#C08050",
72
+ RobotState.THINKING: "#d29922",
73
+ RobotState.STREAMING: "#3fb950",
74
+ RobotState.ERROR: "#f85149",
75
+ RobotState.DONE: "#3fb950",
76
+ }
77
+
78
+ # Status text per state (used by status bar dot)
79
+ _STATUS = {
80
+ RobotState.IDLE: "",
81
+ RobotState.THINKING: "thinking…",
82
+ RobotState.STREAMING: "generating…",
83
+ RobotState.ERROR: "error",
84
+ RobotState.DONE: "done",
85
+ }
86
+
87
+ # ── Theme-aware palette ───────────────────────────────────────────────────────
88
+ # Colours sampled from the robot artwork. Roles name what a cell shows; each
89
+ # resolves to a Rich style ("<fg> on <bg>").
90
+ _COLOURS = {
91
+ "dark": {
92
+ "body": "#F4EBE4", # cream shell
93
+ "screen": "#0E0E0E", # black screen
94
+ "eye": "#FFFDF5", # square eye, brighter than the shell
95
+ "ear": "#B6ADA4", # grey ear nub
96
+ "base": "#B6ADA4", # grey underside
97
+ "leg": "#D5CCC3", # light grey feet
98
+ },
99
+ "light": {
100
+ "body": "#E6DDD0", # deeper cream: the artwork's would vanish on white
101
+ "screen": "#0E0E0E",
102
+ "eye": "#FFFDF5",
103
+ "ear": "#9C948B",
104
+ "base": "#9C948B",
105
+ "leg": "#B8AFA6",
106
+ },
107
+ }
108
+
109
+
110
+ def _palette(theme: str) -> dict:
111
+ c = _COLOURS[theme]
112
+ return {
113
+ "body": c["body"],
114
+ "body_screen": f"{c['body']} on {c['screen']}",
115
+ "eye": f"{c['eye']} on {c['screen']}",
116
+ "screen": f"on {c['screen']}",
117
+ "ear_body": f"{c['ear']} on {c['body']}",
118
+ "base": c["base"],
119
+ "base_leg": f"{c['base']} on {c['leg']}",
120
+ }
121
+
122
+
123
+ _PALETTES = {theme: _palette(theme) for theme in _COLOURS}
124
+
125
+ _theme_cache: str | None = None
126
+
127
+
128
+ def _resolve_theme() -> str:
129
+ pref = os.environ.get("ARIA_THEME", "").strip().lower()
130
+ if pref in ("light", "dark"):
131
+ return pref
132
+ if sys.platform == "darwin":
133
+ try:
134
+ import subprocess
135
+ r = subprocess.run(
136
+ ["defaults", "read", "-g", "AppleInterfaceStyle"],
137
+ capture_output=True, text=True, timeout=1,
138
+ )
139
+ # `defaults` prints "Dark" in dark mode and errors (non-zero) in light.
140
+ return "dark" if (r.returncode == 0 and "dark" in r.stdout.lower()) else "light"
141
+ except Exception:
142
+ pass
143
+ # xterm-style COLORFGBG ("fg;bg"): bg 0-6/8 → dark, 7/9-15 → light.
144
+ cfb = os.environ.get("COLORFGBG", "")
145
+ if ";" in cfb:
146
+ try:
147
+ bg = int(cfb.split(";")[-1])
148
+ return "light" if (bg == 7 or bg >= 9) else "dark"
149
+ except Exception:
150
+ pass
151
+ return "dark"
152
+
153
+
154
+ def detect_theme() -> str:
155
+ """Return 'light' or 'dark' for the mascot, auto-detected once and cached.
156
+
157
+ Order: ``ARIA_THEME`` env override → macOS system appearance → ``COLORFGBG``
158
+ → default dark.
159
+ """
160
+ global _theme_cache
161
+ if _theme_cache is None:
162
+ _theme_cache = _resolve_theme()
163
+ return _theme_cache
164
+
165
+
166
+ # 9 columns × 4 rows; each cell is (palette-role, glyphs).
167
+ _MASCOT_TEMPLATE = [
168
+ [("body", "▗"), ("body_screen", "▛▀▀▀▀▀▜"), ("body", "▖")], # cap, screen top
169
+ [("ear_body", "▌"), ("body_screen", "▌"), ("eye", "▗▖"), ("screen", " "), # ears, two matching eyes
170
+ ("eye", "▗▖"), ("body_screen", "▐"), ("ear_body", "▐")],
171
+ [("body", "▐"), ("body_screen", "▙▄▄▄▄▄▟"), ("body", "▌")], # screen bottom, body
172
+ [("base", "▝"), ("base_leg", "▀"), ("base", "▀"), ("base_leg", "▀"), ("base", "▀"), # base and four feet
173
+ ("base_leg", "▀"), ("base", "▀"), ("base_leg", "▀"), ("base", "▘")],
174
+ ]
175
+
176
+ ROBOT_ROW_COUNT = len(_MASCOT_TEMPLATE)
177
+
178
+
179
+ def _resolve_eyes(state: RobotState, tick: int) -> tuple[str, str]:
180
+ el, er = _EYES[state]
181
+ if state is RobotState.IDLE:
182
+ if tick % 24 in (0, 1):
183
+ el, er = "·", "·"
184
+ elif state is RobotState.THINKING:
185
+ frames = (("◐", "◑"), ("◓", "◒"), ("◑", "◐"), ("◒", "◓"))
186
+ el, er = frames[tick % len(frames)]
187
+ elif state is RobotState.STREAMING:
188
+ el = er = "▸" if (tick % 4) < 2 else "▹"
189
+ return el, er
190
+
191
+
192
+ def get_robot_row(tick: int, row: int) -> list:
193
+ """Return (style, text) fragments for one robot row, themed.
194
+
195
+ Rows: cap and screen top; ears and two eyes; screen bottom and body;
196
+ base and four feet. Roles follow the active light/dark theme
197
+ (see detect_theme()).
198
+ """
199
+ del tick
200
+ pal = _PALETTES[detect_theme()]
201
+ return [(pal[key] if key else "", text) for key, text in _MASCOT_TEMPLATE[row]]
202
+
203
+
204
+ def get_robot_frame(tick: int) -> list:
205
+ """Legacy single-fragment list (not split by row). Use get_robot_row() instead."""
206
+ out = []
207
+ for r in range(ROBOT_ROW_COUNT):
208
+ out += get_robot_row(tick, r)
209
+ return out
210
+
211
+
212
+ def get_status_dot(tick: int) -> list:
213
+ """Compact inline indicator for the status bar — one animated glyph + state label.
214
+
215
+ IDLE: • (copper, slow blink)
216
+ THINKING: ◐ thinking… (yellow spinner)
217
+ STREAMING: ▶ generating… (green pulse)
218
+ ERROR: ✕ error (red)
219
+ DONE: ✓ done (green, brief)
220
+ """
221
+ state = get_robot_state()
222
+ col = _COLOUR[state]
223
+ if detect_theme() == "light":
224
+ col = {
225
+ RobotState.IDLE: "#9A6700",
226
+ RobotState.THINKING: "#9A6700",
227
+ RobotState.STREAMING: "#1A7F37",
228
+ RobotState.ERROR: "#CF222E",
229
+ RobotState.DONE: "#1A7F37",
230
+ }[state]
231
+ el, _ = _resolve_eyes(state, tick)
232
+ if state is RobotState.IDLE:
233
+ el = "•"
234
+ label = _STATUS[state]
235
+
236
+ frags: list = [(f"bold {col}", el)]
237
+ if label:
238
+ frags.append((col, f" {label}"))
239
+ return frags