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,111 @@
1
+ """One explicit capability contract for every supported financial market.
2
+
3
+ This avoids asking an LLM to infer whether an A-share prediction engine, a
4
+ crypto funding-rate feed, or a foreign-exchange quote is applicable. Routing
5
+ is deterministic and descriptions only advertise data the CLI can actually
6
+ request through its existing tools.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from dataclasses import dataclass
12
+ import re
13
+
14
+ from aria_code.apps.cli.market_universe import resolve_market_mentions
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class FinanceMarketService:
19
+ key: str
20
+ label: str
21
+ aliases: tuple[str, ...]
22
+ services: tuple[str, ...]
23
+ analysis: tuple[str, ...]
24
+ prediction: str = ""
25
+
26
+
27
+ MARKET_SERVICES: tuple[FinanceMarketService, ...] = (
28
+ FinanceMarketService(
29
+ "CN", "A 股", ("a股", "沪深", "上证", "深证", "创业板", "科创板"),
30
+ ("实时行情", "历史K线", "技术指标", "基本面", "公告/新闻", "回测", "组合风控"),
31
+ ("行情与成交量", "基本面与监管公告", "板块与资金流", "T+1/涨跌停约束回测"),
32
+ "次交易日预测(覆盖率、数据日期、回测质量必须同时披露)",
33
+ ),
34
+ FinanceMarketService(
35
+ "HK", "港股", ("港股", "恒生", "h股"),
36
+ ("实时行情", "历史K线", "技术指标", "基本面", "新闻", "组合风控"),
37
+ ("港币计价与交易时段", "中概/内地政策传导", "公司基本面与行业比较"),
38
+ ),
39
+ FinanceMarketService(
40
+ "US", "美股", ("美股", "纳斯达克", "纽交所", "标普", "道指"),
41
+ ("实时行情", "历史K线", "技术指标", "财报", "新闻", "回测", "组合风控"),
42
+ ("财报和指引", "宏观利率与行业估值", "盘前/盘后与公司事件"),
43
+ ),
44
+ FinanceMarketService(
45
+ "GLOBAL", "全球股票与指数", ("欧股", "日股", "全球市场", "指数"),
46
+ ("实时行情", "历史K线", "技术指标", "新闻", "组合风控"),
47
+ ("本币与汇率", "本地交易时段", "指数/行业相对表现"),
48
+ ),
49
+ FinanceMarketService(
50
+ "CRYPTO", "加密资产", ("加密", "比特币", "以太坊", "btc", "eth", "币安", "okx"),
51
+ ("现货行情", "历史K线", "技术指标", "交易所账户只读查询", "资金费率/衍生品(数据源可用时)"),
52
+ ("24/7市场与流动性", "交易所及对手方风险", "杠杆/资金费率与波动"),
53
+ ),
54
+ FinanceMarketService(
55
+ "FX", "外汇", ("外汇", "汇率", "美元兑", "eur/", "usd/", "jpy"),
56
+ ("实时汇率", "历史K线", "技术指标", "宏观/新闻"),
57
+ ("利差与央行政策", "汇率方向和报价惯例", "跨币种风险"),
58
+ ),
59
+ FinanceMarketService(
60
+ "FUTURES", "商品与期货", ("期货", "商品", "黄金", "白银", "原油", "铜", "天然气"),
61
+ ("连续合约行情", "历史K线", "技术指标", "宏观/新闻"),
62
+ ("合约月份与展期", "库存/供需/地缘事件", "保证金和杠杆风险"),
63
+ ),
64
+ )
65
+
66
+ _BY_KEY = {service.key: service for service in MARKET_SERVICES}
67
+
68
+
69
+ def classify_finance_market(text: str) -> FinanceMarketService | None:
70
+ """Classify a request without network calls; named symbols win over words."""
71
+ query = str(text or "")
72
+ mentions = resolve_market_mentions(query, limit=1, load_universe=lambda: [])
73
+ if mentions:
74
+ key = mentions[0][1].market
75
+ if key == "INDEX":
76
+ symbol = mentions[0][1].symbol.upper()
77
+ if symbol.endswith((".SS", ".SZ")):
78
+ key = "CN"
79
+ elif symbol in {"^HSI", "^HSCE"}:
80
+ key = "HK"
81
+ else:
82
+ key = "GLOBAL"
83
+ return _BY_KEY.get(key)
84
+ low = query.lower()
85
+ for service in MARKET_SERVICES:
86
+ if any(alias in low for alias in service.aliases):
87
+ return service
88
+ if re.search(r"\b\d{6}(?:\.(?:sh|sz|ss))?\b", low):
89
+ return _BY_KEY["CN"]
90
+ if re.search(r"\b[A-Z]{1,5}(?:\.[A-Z]{1,4})?\b", query):
91
+ return _BY_KEY["US"]
92
+ return None
93
+
94
+
95
+ def market_service_summary(text: str = "") -> dict[str, object]:
96
+ """Return a display-ready and machine-readable market service contract."""
97
+ selected = classify_finance_market(text)
98
+ services = (selected,) if selected else MARKET_SERVICES
99
+ return {
100
+ "selected": selected.key if selected else None,
101
+ "markets": [
102
+ {
103
+ "key": item.key,
104
+ "label": item.label,
105
+ "services": item.services,
106
+ "analysis": item.analysis,
107
+ "prediction": item.prediction or None,
108
+ }
109
+ for item in services
110
+ ],
111
+ }
@@ -0,0 +1,231 @@
1
+ """足球赛事报表渲染 —— 从 aria_cli.py 抽出的第一块。
2
+
3
+ 这四个函数原本在 aria_cli.py 末尾(8512-8715 行)。它们几乎完全自包含:
4
+ rich 组件和 football_data_client 都是函数内 import,唯一的外部依赖是模块级
5
+ 的 ``console``。
6
+
7
+ ⚠️ 调用方式的约束(拆分本文件时最容易踩坏的地方):
8
+ ``apps/cli/commands/market_cmds.py`` 是一个 mixin,它用**裸名字**调用
9
+ ``_football_standings(...)`` —— 这只有在 aria_cli 通过 ``_rebind_mixin_globals``
10
+ 把 mixin 方法的 ``__globals__`` 指向 aria_cli 命名空间时才成立。所以本模块
11
+ **不能**只是被 import,必须由 aria_cli 用 ``_rebind_module_function_globals``
12
+ 把这些函数重新绑定回它自己的 globals,``console`` 和裸名调用才都能解析。
13
+ 这跟 aria_cli 对 ``apps.cli.tool_executor`` 的处理是同一套既有机制。
14
+
15
+ 直接 ``from apps.cli.football_reports import _football_standings`` 再调用会
16
+ 在运行期 NameError(找不到 console)——那是预期行为,不是缺陷:状态注入还
17
+ 没做到每个调用点,兼容边界仍留在 aria_cli。
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ __all__ = [
23
+ "_football_standings",
24
+ "_football_fixtures",
25
+ "_football_team",
26
+ "_football_h2h",
27
+ ]
28
+
29
+
30
+ def _football_standings(league: str) -> None:
31
+ from rich.table import Table
32
+ from rich import box as rich_box
33
+ from rich.panel import Panel
34
+ try:
35
+ from football_data_client import get_standings, LEAGUE_NAMES, _resolve_league
36
+ except ImportError:
37
+ console.print("[red]football_data_client.py 未找到[/red]")
38
+ return
39
+
40
+ console.print(f"[dim]获取 {league.upper()} 积分榜…[/dim]")
41
+ data = get_standings(league)
42
+ if not data:
43
+ comp = _resolve_league(league)
44
+ console.print(
45
+ "[yellow]无法获取数据。请设置 FOOTBALL_DATA_API_KEY:[/yellow]\n"
46
+ " 1. 访问 football-data.org 免费注册\n"
47
+ " 2. 在 ~/.aria/.env 中添加:\n"
48
+ " [cyan]FOOTBALL_DATA_API_KEY=your_key_here[/cyan]"
49
+ )
50
+ return
51
+
52
+ t = Table(
53
+ title=f"[bold]{data['league_name']}[/bold] {data['season_start'][:4]}/{data['season_end'][:4]}",
54
+ box=rich_box.SIMPLE,
55
+ show_header=True,
56
+ header_style="bold",
57
+ padding=(0, 1),
58
+ )
59
+ t.add_column("#", width=3, justify="right")
60
+ t.add_column("球队", width=22)
61
+ t.add_column("场", width=4, justify="right")
62
+ t.add_column("胜", width=3, justify="right", style="green")
63
+ t.add_column("平", width=3, justify="right", style="yellow")
64
+ t.add_column("负", width=3, justify="right", style="red")
65
+ t.add_column("进/失", width=7, justify="right")
66
+ t.add_column("净胜", width=5, justify="right")
67
+ t.add_column("积分", width=5, justify="right", style="bold cyan")
68
+ t.add_column("近5场", width=7)
69
+
70
+ for row in data["table"]:
71
+ gd = row["gd"]
72
+ gd_str = f"+{gd}" if gd > 0 else str(gd)
73
+ form_colored = ""
74
+ for c in (row.get("form") or ""):
75
+ if c == "W":
76
+ form_colored += "[green]W[/green]"
77
+ elif c == "L":
78
+ form_colored += "[red]L[/red]"
79
+ elif c == "D":
80
+ form_colored += "[yellow]D[/yellow]"
81
+ else:
82
+ form_colored += c
83
+ t.add_row(
84
+ str(row["pos"]),
85
+ row["team"],
86
+ str(row["played"]),
87
+ str(row["w"]),
88
+ str(row["d"]),
89
+ str(row["l"]),
90
+ f"{row['gf']}/{row['ga']}",
91
+ gd_str,
92
+ str(row["pts"]),
93
+ form_colored,
94
+ )
95
+
96
+ console.print(t)
97
+
98
+
99
+ def _football_fixtures(league: str, days: int = 7) -> None:
100
+ from rich.table import Table
101
+ from rich import box as rich_box
102
+ try:
103
+ from football_data_client import get_fixtures, LEAGUE_NAMES, _resolve_league
104
+ except ImportError:
105
+ console.print("[red]football_data_client.py 未找到[/red]")
106
+ return
107
+
108
+ comp = _resolve_league(league)
109
+ league_label = LEAGUE_NAMES.get(comp, comp)
110
+ console.print(f"[dim]获取 {league_label} 未来 {days} 天赛程…[/dim]")
111
+
112
+ matches = get_fixtures(league, days)
113
+ if matches is None:
114
+ console.print("[yellow]无法获取数据。请检查 FOOTBALL_DATA_API_KEY 设置。[/yellow]")
115
+ return
116
+ if not matches:
117
+ console.print(f"[dim]未来 {days} 天内暂无赛事[/dim]")
118
+ return
119
+
120
+ t = Table(
121
+ title=f"[bold]{league_label}[/bold] 未来 {days} 天赛程",
122
+ box=rich_box.SIMPLE,
123
+ show_header=True,
124
+ header_style="bold",
125
+ padding=(0, 1),
126
+ )
127
+ t.add_column("日期(UTC)", width=11)
128
+ t.add_column("主队", width=22)
129
+ t.add_column("", width=3, justify="center")
130
+ t.add_column("客队", width=22)
131
+ t.add_column("轮次", width=5, justify="right")
132
+
133
+ for m in matches:
134
+ t.add_row(
135
+ m["date"],
136
+ m["home"],
137
+ "vs",
138
+ m["away"],
139
+ str(m["matchday"] or m.get("stage", "")),
140
+ )
141
+
142
+ console.print(t)
143
+
144
+
145
+ def _football_team(team: str, league: str = "pl") -> None:
146
+ from rich.table import Table
147
+ from rich import box as rich_box
148
+ from rich.panel import Panel
149
+ try:
150
+ from football_data_client import get_team_stats
151
+ except ImportError:
152
+ console.print("[red]football_data_client.py 未找到[/red]")
153
+ return
154
+
155
+ console.print(f"[dim]获取 {team} 近期数据 ({league.upper()})…[/dim]")
156
+ stats = get_team_stats(league, team)
157
+ if not stats:
158
+ console.print("[yellow]无法获取球队数据。请检查球队名称和联赛代码。[/yellow]")
159
+ return
160
+
161
+ form_colored = ""
162
+ for c in stats["form"]:
163
+ if c == "W": form_colored += "[bold green]W[/bold green]"
164
+ elif c == "L": form_colored += "[bold red]L[/bold red]"
165
+ elif c == "D": form_colored += "[bold yellow]D[/bold yellow]"
166
+
167
+ summary = (
168
+ f"[bold]{stats['team']}[/bold] | 近 {stats['last_n']} 场\n\n"
169
+ f" 战绩: {stats['w']}胜 {stats['d']}平 {stats['l']}负\n"
170
+ f" 进球: {stats['gf']}球 (场均 {stats['avg_gf']})\n"
171
+ f" 失球: {stats['ga']}球 (场均 {stats['avg_ga']})\n"
172
+ f" 主场进球: 场均 {stats['home_avg_gf']}\n"
173
+ f" 客场进球: 场均 {stats['away_avg_gf']}\n"
174
+ f" 近5场: {form_colored}"
175
+ )
176
+ console.print(Panel(summary, title="[bold green]⚽ 球队状态[/bold green]", border_style="green"))
177
+
178
+ t = Table(box=rich_box.SIMPLE, show_header=True, padding=(0, 1))
179
+ t.add_column("日期", width=10)
180
+ t.add_column("主队", width=20)
181
+ t.add_column("比分", width=7, justify="center", style="bold")
182
+ t.add_column("客队", width=20)
183
+ t.add_column("", width=3)
184
+
185
+ for r in stats["recent"]:
186
+ result_style = {"W": "green", "D": "yellow", "L": "red"}.get(r["result"], "dim")
187
+ t.add_row(
188
+ r["date"],
189
+ r["home"],
190
+ r["score"],
191
+ r["away"],
192
+ f"[{result_style}]{r['result']}[/{result_style}]",
193
+ )
194
+ console.print(t)
195
+
196
+
197
+ def _football_h2h(t1: str, t2: str, league: str = "pl") -> None:
198
+ from rich.table import Table
199
+ from rich import box as rich_box
200
+ from rich.panel import Panel
201
+ try:
202
+ from football_data_client import get_head_to_head
203
+ except ImportError:
204
+ console.print("[red]football_data_client.py 未找到[/red]")
205
+ return
206
+
207
+ console.print(f"[dim]获取 {t1} vs {t2} 历史对决 ({league.upper()})…[/dim]")
208
+ data = get_head_to_head(t1, t2, league)
209
+ if not data:
210
+ console.print("[yellow]未找到历史对决记录。[/yellow]")
211
+ return
212
+
213
+ summary = (
214
+ f"[bold]{data['team1']}[/bold] vs [bold]{data['team2']}[/bold] | 共 {data['total']} 场\n\n"
215
+ f" {data['team1']} 胜: [green]{data['team1_wins']}[/green]\n"
216
+ f" 平局: [yellow]{data['draws']}[/yellow]\n"
217
+ f" {data['team2']} 胜: [red]{data['team2_wins']}[/red]"
218
+ )
219
+ console.print(Panel(summary, title="[bold]⚽ 历史交锋[/bold]", border_style="dim"))
220
+
221
+ t = Table(box=rich_box.SIMPLE, show_header=True, padding=(0, 1))
222
+ t.add_column("日期", width=10)
223
+ t.add_column("主队", width=22)
224
+ t.add_column("比分", width=7, justify="center", style="bold cyan")
225
+ t.add_column("客队", width=22)
226
+
227
+ for m in data["matches"]:
228
+ t.add_row(m["date"], m["home"], m["score"], m["away"])
229
+ console.print(t)
230
+
231
+
@@ -0,0 +1,135 @@
1
+ """GitHub App authentication — generates installation tokens for Aria Code[bot].
2
+
3
+ Usage:
4
+ from apps.cli.github_app_auth import get_installation_token, get_aria_git_url
5
+
6
+ token = get_installation_token() # raises if not configured
7
+ url = get_aria_git_url("artheras/aria-code", token)
8
+ # git push with url as remote
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import base64
14
+ import json
15
+ import os
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+ from pathlib import Path
20
+
21
+ # ── Configuration ──────────────────────────────────────────────────────────────
22
+ ARIA_APP_ID = int(os.getenv("ARIA_GITHUB_APP_ID", "4114189"))
23
+ ARIA_APP_SLUG = os.getenv("ARIA_GITHUB_APP_SLUG", "aria-code")
24
+
25
+ # Search order for private key
26
+ _PEM_SEARCH = [
27
+ os.getenv("ARIA_GITHUB_APP_PEM", ""),
28
+ os.path.expanduser("~/.config/aria-code/github-app.pem"),
29
+ os.path.expanduser("~/.aria-code/github-app.pem"),
30
+ "github-app.pem",
31
+ ]
32
+
33
+ # noreply email GitHub uses for bot commits
34
+ # Format: {app_id}+{app_slug}[bot]@users.noreply.github.com
35
+ ARIA_BOT_EMAIL = f"{ARIA_APP_ID}+{ARIA_APP_SLUG}[bot]@users.noreply.github.com"
36
+ ARIA_BOT_NAME = "Aria Code"
37
+
38
+ # GitHub user account for Aria — shows up in Contributors
39
+ ARIA_GITHUB_LOGIN = os.getenv("ARIA_GITHUB_LOGIN", "ariaaii")
40
+ ARIA_GITHUB_EMAIL = os.getenv("ARIA_GITHUB_EMAIL", "support@arthera.xyz")
41
+
42
+
43
+ def _find_pem() -> str:
44
+ for path in _PEM_SEARCH:
45
+ if path and os.path.isfile(path):
46
+ return path
47
+ raise FileNotFoundError(
48
+ "GitHub App private key not found. "
49
+ "Set ARIA_GITHUB_APP_PEM=/path/to/key.pem or place it at "
50
+ "~/.config/aria-code/github-app.pem"
51
+ )
52
+
53
+
54
+ def _b64url(data: bytes) -> str:
55
+ return base64.urlsafe_b64encode(data).rstrip(b"=").decode()
56
+
57
+
58
+ def _make_jwt(pem_path: str, app_id: int) -> str:
59
+ """Create a signed JWT using RSA-SHA256 (pure stdlib + cryptography)."""
60
+ try:
61
+ from cryptography.hazmat.primitives import hashes, serialization
62
+ from cryptography.hazmat.primitives.asymmetric import padding
63
+ from cryptography.hazmat.backends import default_backend
64
+ except ImportError:
65
+ raise ImportError(
66
+ "Install cryptography: pip install cryptography"
67
+ )
68
+
69
+ with open(pem_path, "rb") as f:
70
+ private_key = serialization.load_pem_private_key(f.read(), password=None, backend=default_backend())
71
+
72
+ now = int(time.time())
73
+ header = _b64url(json.dumps({"alg": "RS256", "typ": "JWT"}).encode())
74
+ payload = _b64url(json.dumps({"iat": now - 60, "exp": now + 540, "iss": str(app_id)}).encode())
75
+ signing_input = f"{header}.{payload}".encode()
76
+ signature = _b64url(private_key.sign(signing_input, padding.PKCS1v15(), hashes.SHA256()))
77
+ return f"{header}.{payload}.{signature}"
78
+
79
+
80
+ def _gh_api(path: str, token: str, *, method: str = "GET") -> dict:
81
+ url = f"https://api.github.com{path}"
82
+ req = urllib.request.Request(
83
+ url,
84
+ method=method,
85
+ headers={
86
+ "Authorization": f"Bearer {token}",
87
+ "Accept": "application/vnd.github+json",
88
+ "X-GitHub-Api-Version": "2022-11-28",
89
+ },
90
+ )
91
+ with urllib.request.urlopen(req, timeout=15) as resp:
92
+ return json.loads(resp.read())
93
+
94
+
95
+ def get_installation_token(owner: str = "artheras") -> str:
96
+ """Return a short-lived installation token (valid ~1 hour)."""
97
+ pem = _find_pem()
98
+ jwt = _make_jwt(pem, ARIA_APP_ID)
99
+
100
+ # Find installation for owner
101
+ installations = _gh_api("/app/installations", jwt)
102
+ installation_id = None
103
+ for inst in installations:
104
+ if inst.get("account", {}).get("login", "").lower() == owner.lower():
105
+ installation_id = inst["id"]
106
+ break
107
+ if installation_id is None:
108
+ accts = [i.get("account", {}).get("login") for i in installations]
109
+ raise RuntimeError(
110
+ f"Aria Code GitHub App not installed for '{owner}'. "
111
+ f"Installed accounts: {accts}. "
112
+ f"Go to https://github.com/apps/aria-code and install it."
113
+ )
114
+
115
+ # Exchange for installation token
116
+ result = _gh_api(f"/app/installations/{installation_id}/access_tokens", jwt, method="POST")
117
+ token = result.get("token")
118
+ if not token:
119
+ raise RuntimeError(f"Failed to get installation token: {result}")
120
+ return token
121
+
122
+
123
+ def get_aria_git_url(repo: str, token: str) -> str:
124
+ """Return an authenticated HTTPS remote URL using the installation token."""
125
+ return f"https://x-access-token:{token}@github.com/{repo}.git"
126
+
127
+
128
+ def aria_bot_env() -> dict[str, str]:
129
+ """Env vars that make git commit as Aria Code[bot]."""
130
+ return {
131
+ "GIT_AUTHOR_NAME": ARIA_BOT_NAME,
132
+ "GIT_AUTHOR_EMAIL": ARIA_BOT_EMAIL,
133
+ "GIT_COMMITTER_NAME": ARIA_BOT_NAME,
134
+ "GIT_COMMITTER_EMAIL": ARIA_BOT_EMAIL,
135
+ }