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,310 @@
1
+ """i18n.py — System language detection and UI string translations for Aria Code.
2
+
3
+ Priority order for UI language:
4
+ 1. config["ui_lang"] (user explicitly set via /config set ui_lang=zh)
5
+ 2. OS locale at first-run (written into config automatically)
6
+ 3. Fallback: "en"
7
+
8
+ Supported languages: "zh" (Simplified Chinese), "en" (English)
9
+ Future: "ja", "ko" — extend STRINGS dict below.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import os
14
+ from typing import Optional
15
+
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # String catalogue
19
+ # ---------------------------------------------------------------------------
20
+
21
+ STRINGS: dict[str, dict[str, str]] = {
22
+ # Banner labels
23
+ "local_first_agent": {
24
+ "zh": "本地优先智能体",
25
+ "en": "local-first agent",
26
+ },
27
+ "model": {
28
+ "zh": "模型",
29
+ "en": "model",
30
+ },
31
+ "workspace": {
32
+ "zh": "工作区",
33
+ "en": "workspace",
34
+ },
35
+ "mode": {
36
+ "zh": "模式",
37
+ "en": "mode",
38
+ },
39
+ "status": {
40
+ "zh": "状态",
41
+ "en": "status",
42
+ },
43
+ "tools": {
44
+ "zh": "工具",
45
+ "en": "tools",
46
+ },
47
+ "skills": {
48
+ "zh": "技能",
49
+ "en": "skills",
50
+ },
51
+ "quant": {
52
+ "zh": "量化",
53
+ "en": "quant",
54
+ },
55
+ # Status labels
56
+ "sharing_on": {
57
+ "zh": "数据共享",
58
+ "en": "sharing on",
59
+ },
60
+ "local_only": {
61
+ "zh": "纯本地",
62
+ "en": "local-only",
63
+ },
64
+ "local_retention": {
65
+ "zh": "本地留存",
66
+ "en": "local retention",
67
+ },
68
+ "cloud": {
69
+ "zh": "云端",
70
+ "en": "cloud",
71
+ },
72
+ "local": {
73
+ "zh": "本地",
74
+ "en": "local",
75
+ },
76
+ "lite": {
77
+ "zh": "轻量",
78
+ "en": "lite",
79
+ },
80
+ "ollama_online": {
81
+ "zh": "Ollama 在线",
82
+ "en": "Ollama online",
83
+ },
84
+ "ollama_offline": {
85
+ "zh": "Ollama 离线",
86
+ "en": "Ollama offline",
87
+ },
88
+ "cloud_connected": {
89
+ "zh": "云端已连接",
90
+ "en": "cloud ✓",
91
+ },
92
+ "model_singular": {
93
+ "zh": "个模型",
94
+ "en": "model",
95
+ },
96
+ "model_plural": {
97
+ "zh": "个模型",
98
+ "en": "models",
99
+ },
100
+ # Hint line
101
+ "try": {
102
+ "zh": "试试",
103
+ "en": "try",
104
+ },
105
+ # Model picker
106
+ "select_model": {
107
+ "zh": "选择模型",
108
+ "en": "Select Model",
109
+ },
110
+ "installed": {
111
+ "zh": "已安装",
112
+ "en": "installed",
113
+ },
114
+ "not_installed": {
115
+ "zh": "未安装",
116
+ "en": "not installed",
117
+ },
118
+ "cancelled": {
119
+ "zh": "已取消",
120
+ "en": "Cancelled",
121
+ },
122
+ "no_change": {
123
+ "zh": "未更改",
124
+ "en": "No change",
125
+ },
126
+ "community_models": {
127
+ "zh": "社区模型 (Ollama)",
128
+ "en": "Community (Ollama)",
129
+ },
130
+ "ollama_unreachable": {
131
+ "zh": "Ollama 无法连接",
132
+ "en": "Ollama unreachable",
133
+ },
134
+ "switch_model_hint": {
135
+ "zh": "使用 /model <id> 切换模型",
136
+ "en": "Use /model <id> to switch",
137
+ },
138
+ "current": {
139
+ "zh": "当前",
140
+ "en": "current",
141
+ },
142
+ # Permission / mode labels
143
+ "network_on": {
144
+ "zh": "网络开",
145
+ "en": "network on",
146
+ },
147
+ "network_off": {
148
+ "zh": "网络关",
149
+ "en": "network off",
150
+ },
151
+ "privacy": {
152
+ "zh": "隐私",
153
+ "en": "privacy",
154
+ },
155
+ # Setup wizard
156
+ "detecting_lang": {
157
+ "zh": "检测到系统语言:中文",
158
+ "en": "Detected system language: English",
159
+ },
160
+ "first_run_welcome": {
161
+ "zh": "欢迎使用 Aria Code!首次运行,正在自动配置...",
162
+ "en": "Welcome to Aria Code! First run — auto-configuring...",
163
+ },
164
+ "auto_model_selected": {
165
+ "zh": "已自动选择本地模型:",
166
+ "en": "Auto-selected local model: ",
167
+ },
168
+ "no_ollama_models": {
169
+ "zh": "未发现本地模型,使用默认配置",
170
+ "en": "No local models found, using default config",
171
+ },
172
+ # Thinking mode
173
+ "thinking_mode": {
174
+ "zh": "思考模式",
175
+ "en": "Thinking Mode",
176
+ },
177
+ # Misc
178
+ "tip": {
179
+ "zh": "提示",
180
+ "en": "tip",
181
+ },
182
+ "auto_matched": {
183
+ "zh": "自动匹配",
184
+ "en": "auto-matched",
185
+ },
186
+ }
187
+
188
+
189
+ # ---------------------------------------------------------------------------
190
+ # Detection
191
+ # ---------------------------------------------------------------------------
192
+
193
+ def detect_system_lang() -> str:
194
+ """Detect OS language. Returns 'zh' for Chinese systems, 'en' for everything else.
195
+
196
+ Checks (in order): $LANGUAGE, $LANG, $LC_ALL, $LC_MESSAGES, Python locale module.
197
+ Treats zh_CN, zh_TW, zh_HK, zh_SG as 'zh'.
198
+ """
199
+ for var in ("LANGUAGE", "LANG", "LC_ALL", "LC_MESSAGES"):
200
+ raw = os.environ.get(var, "").strip()
201
+ if not raw or raw in ("C", "POSIX", "C.UTF-8"):
202
+ continue
203
+ # LANGUAGE may be colon-separated list: zh_CN:en
204
+ code = raw.split(":")[0].split(".")[0].split("_")[0].lower()
205
+ if code == "zh":
206
+ return "zh"
207
+ if code in ("en", "fr", "de", "es", "pt", "ja", "ko", "ru", "ar"):
208
+ return code if code in ("ja", "ko") else "en"
209
+
210
+ # Fallback: Python locale module (works on macOS/Windows when env vars absent)
211
+ try:
212
+ import locale as _locale
213
+ # getlocale(), not getdefaultlocale(): the latter is deprecated and
214
+ # removed in Python 3.15, where this fallback would stop working.
215
+ lang_code, _ = _locale.getlocale()
216
+ if lang_code:
217
+ prefix = lang_code.split("_")[0].lower()
218
+ if prefix == "zh":
219
+ return "zh"
220
+ if prefix in ("ja", "ko"):
221
+ return prefix
222
+ except Exception:
223
+ pass
224
+
225
+ return "en"
226
+
227
+
228
+ def get_ui_lang(config: Optional[dict] = None) -> str:
229
+ """Return effective UI language.
230
+
231
+ 1. config["ui_lang"] if explicitly set
232
+ 2. detect_system_lang()
233
+ """
234
+ if config:
235
+ saved = config.get("ui_lang", "")
236
+ if saved in STRINGS.get("model", {}): # valid lang code
237
+ return saved
238
+ return detect_system_lang()
239
+
240
+
241
+ def ui_text(owner, zh_text: str, en_text: str) -> str:
242
+ """The text for the configured UI language; English unless ui_lang is zh.
243
+
244
+ ``owner`` is a command object (its ``terminal.config``), a terminal (its
245
+ ``config``) or a config dict.
246
+ """
247
+ config = owner if isinstance(owner, dict) else (
248
+ getattr(owner, "config", None) or getattr(getattr(owner, "terminal", None), "config", None) or {})
249
+ return zh_text if str(config.get("ui_lang", "en")).lower().startswith("zh") else en_text
250
+
251
+
252
+ def t(key: str, lang: Optional[str] = None, config: Optional[dict] = None) -> str:
253
+ """Translate a UI key to the given language (or auto-detect).
254
+
255
+ Falls back to 'en' if key/lang not found.
256
+ """
257
+ if lang is None:
258
+ lang = get_ui_lang(config)
259
+ entry = STRINGS.get(key, {})
260
+ return entry.get(lang) or entry.get("en") or key
261
+
262
+
263
+ # ---------------------------------------------------------------------------
264
+ # Ollama model helpers. No longer called during config load — see
265
+ # SettingsService.load(), which no longer overrides the configured model.
266
+ # ---------------------------------------------------------------------------
267
+
268
+ _MODEL_PRIORITY = [
269
+ "qwen2.5:7b",
270
+ "qwen2.5-coder:7b",
271
+ "deepseek-r1:7b",
272
+ "qwen2.5:3b",
273
+ "qwen2.5-coder:3b",
274
+ "llama3.2:3b",
275
+ "mistral:7b",
276
+ "qwen2.5-coder:1.5b",
277
+ "qwen2.5:1.5b",
278
+ "llama3.2:1b",
279
+ ]
280
+
281
+
282
+ def installed_ollama_models(ollama_url: str = "http://localhost:11434") -> set[str]:
283
+ """The model names Ollama reports, or an empty set if it cannot be reached."""
284
+ try:
285
+ import urllib.request as _ur
286
+ import json as _json
287
+ with _ur.urlopen(f"{ollama_url}/api/tags", timeout=3) as resp:
288
+ data = _json.loads(resp.read())
289
+ return {m["name"] for m in data.get("models", [])}
290
+ except Exception:
291
+ return set()
292
+
293
+
294
+ def preferred_installed_model(installed: set[str]) -> Optional[str]:
295
+ """The best model from *installed* that this list vouches for, else None.
296
+
297
+ Pure, so it is testable without a running Ollama.
298
+
299
+ Note what this does NOT do: there is no alphabetical last resort. The
300
+ function it replaced (``auto_select_model``) ended with
301
+ ``sorted(installed)[0]``, and it was called during config load to overwrite
302
+ the caller's default model. A machine with one stray 0.5B model got that
303
+ model as its agent. Declining to answer is the correct answer when nothing
304
+ on the curated list is present; ``model_catalog.pick_best_installed_model``
305
+ is the richer version that also consults the capability registry.
306
+ """
307
+ for pref in _MODEL_PRIORITY:
308
+ if pref in installed:
309
+ return pref
310
+ return None
@@ -0,0 +1,136 @@
1
+ """Intent classification helpers extracted from aria_cli.py.
2
+
3
+ All functions are pure — no I/O, no globals, fully unit-testable.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ # ── Keyword lists ─────────────────────────────────────────────────────────────
8
+
9
+ CODING_KEYWORDS = (
10
+ "write", "generate", "create", "script", "code", "plot", "backtest",
11
+ "策略", "代码", "回测", "编写", "生成", "k线", "k-line", "kline",
12
+ "analyze and save", "analysis script", "python", "dashboard",
13
+ "写一个", "生成代码", "写代码", "编写代码",
14
+ )
15
+
16
+ VISUAL_ARTIFACT_KEYWORDS = (
17
+ "图表", "走势图", "k线图", "k线", "k-line", "kline", "candlestick",
18
+ "chart", "plot", "dashboard", "看板", "晨报", "日报", "周报", "月报",
19
+ "report", "热力图", "heatmap",
20
+ )
21
+
22
+ ANALYSIS_KEYWORDS = (
23
+ "analyze", "analysis", "分析", "研究", "评估", "研判",
24
+ "技术面", "基本面", "走势", "趋势", "行情",
25
+ "技术分析", "技术指标", "支撑", "阻力", "支撑位", "阻力位",
26
+ "rsi", "macd", "bollinger", "布林", "均线", "kdj", "kdj指标",
27
+ "stock analysis", "technical analysis", "fundamental",
28
+ "valuation", "estimate", "outlook", "投资建议", "买入", "卖出",
29
+ "看多", "看空", "多头", "空头", "金叉", "死叉",
30
+ )
31
+
32
+ ANALYSIS_NON_STOCK_TOPICS = (
33
+ "房价", "楼市", "房产", "房地产", "租金", "二手房", "新房", "商铺", "折旧",
34
+ "宏观", "宏观经济", "宏观政策", "宏观角度", "经济政策", "货币政策",
35
+ "财政政策", "gdp", "通胀", "通货膨胀", "cpi", "ppi", "利率政策",
36
+ "黄金", "原油", "大宗商品", "汇率", "外汇", "美元指数",
37
+ )
38
+
39
+ GENERAL_KNOWLEDGE_KEYWORDS = (
40
+ "什么是", "what is", "what are", "how does", "explain", "define",
41
+ "解释", "定义", "概念", "原理", "介绍", "步骤", "流程", "怎么",
42
+ "如何理解", "是什么", "为什么", "区别", "difference between",
43
+ "tell me about", "describe", "how to", "注册", "成立", "公司",
44
+ "基本概念", "简介", "举例", "example", "例子",
45
+ "足球", "篮球", "网球", "棒球", "橄榄球", "排球", "乒乓球", "羽毛球",
46
+ "世界杯", "欧冠", "英超", "德甲", "西甲", "意甲", "法甲", "bundesliga",
47
+ "比赛", "赛事", "比分", "进球", "射门", "门将", "球队", "球员", "教练",
48
+ "联赛", "积分榜", "赛程", "晋级", "淘汰赛", "决赛", "半决赛",
49
+ "football", "soccer", "match", "goal", "league", "champion",
50
+ "nba", "nfl", "mlb", "f1", "赛车", "奥运", "olympic",
51
+ )
52
+
53
+ FINANCE_CONCEPT_TERMS = (
54
+ "dcf", "pe", "pb", "ps", "ev", "ebitda", "ebit", "wacc", "capm",
55
+ "beta", "alpha", "sharpe", "sortino", "var", "cvar", "drawdown",
56
+ "black-scholes", "bs模型", "期权", "期货", "衍生品", "套利",
57
+ "量化", "quant", "回测", "factor", "因子", "ic值", "ir值",
58
+ "市盈率", "市净率", "净利润", "营业收入", "自由现金流", "贴现",
59
+ "折现", "估值", "valuation", "ipo", "etf", "reits", "债券",
60
+ "利率", "收益率", "久期", "凸性", "信用利差", "风险溢价",
61
+ "动量", "均值回归", "布林带", "macd", "rsi", "kdj", "技术指标",
62
+ "北向资金", "融资融券", "股指期货", "沪深300", "中证500",
63
+ )
64
+
65
+ SPORTS_KEYWORDS = (
66
+ "足球", "世界杯", "欧冠", "英超", "德甲", "西甲", "意甲", "法甲",
67
+ "篮球", "nba", "网球", "f1", "赛车", "奥运", "olympic",
68
+ "比赛", "赛事", "比分", "进球", "球队", "球员", "联赛",
69
+ "football", "soccer", "world cup", "champions league",
70
+ "match", "score", "league", "premier league", "bundesliga",
71
+ )
72
+
73
+
74
+ # ── Classifier functions ──────────────────────────────────────────────────────
75
+
76
+ def is_coding_request(message: str) -> bool:
77
+ """Return True if message looks like a coding/file-generation task."""
78
+ low = message.lower()
79
+ if any(k in low for k in VISUAL_ARTIFACT_KEYWORDS):
80
+ return True
81
+ if any(k in low for k in CODING_KEYWORDS):
82
+ return True
83
+ if low.startswith("/code") or low.startswith("/gen-"):
84
+ return True
85
+ return False
86
+
87
+
88
+ def is_sports_query(message: str) -> bool:
89
+ """Return True if the message is about sports/football."""
90
+ low = message.lower()
91
+ return any(k in low for k in SPORTS_KEYWORDS)
92
+
93
+
94
+ def is_analysis_request(message: str) -> bool:
95
+ """Return True if message is a stock/crypto technical analysis request (not coding).
96
+
97
+ Excludes real-estate, pure macro, and sports questions: those match keywords
98
+ like '分析'/'走势' but should NOT use the stock technical-analysis template
99
+ (which requires injected market data to be useful).
100
+ """
101
+ if is_coding_request(message):
102
+ return False
103
+ low = message.lower()
104
+ if any(k in low for k in ANALYSIS_NON_STOCK_TOPICS):
105
+ return False
106
+ if is_sports_query(message):
107
+ return False
108
+ return any(k in low for k in ANALYSIS_KEYWORDS)
109
+
110
+
111
+ def is_general_knowledge(message: str) -> bool:
112
+ """Return True for pure knowledge/explanation questions that don't need tools.
113
+
114
+ Finance/quant terms are excluded so they keep the full FINANCE_CHAT_PROMPT
115
+ even when phrased as "X是什么" explanatory questions.
116
+
117
+ Pure macro/conceptual analysis questions are treated as general knowledge:
118
+ routing them to the finance prompt with tools causes the model to fetch live
119
+ prices and output the stock-analysis template instead of thoughtful commentary.
120
+ """
121
+ if is_coding_request(message) or is_analysis_request(message):
122
+ return False
123
+ low = message.lower().strip()
124
+ if any(term in low for term in FINANCE_CONCEPT_TERMS):
125
+ return False
126
+ _macro_conceptual = (
127
+ "宏观", "宏观经济", "宏观政策", "宏观角度", "宏观分析",
128
+ "货币政策", "财政政策", "值得投资吗", "应该投资吗", "是否值得",
129
+ "投资逻辑", "长期展望", "未来前景",
130
+ )
131
+ if (any(k in low for k in _macro_conceptual)
132
+ and not any(c.isdigit() for c in low)):
133
+ return True
134
+ if len(low) < 30 and not any(c.isdigit() for c in low):
135
+ return True
136
+ return any(k in low for k in GENERAL_KNOWLEDGE_KEYWORDS)