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,11 @@
1
+ """Moved to services/aria-bots: this name imports :mod:`aria_bots.logistics.carriers`."""
2
+ from importlib import import_module as _import_module
3
+ from importlib.util import find_spec as _find_spec
4
+ from pathlib import Path as _Path
5
+ import sys as _sys
6
+
7
+ if _find_spec("aria_bots") is None: # a source checkout run without installing it
8
+ _sys.path.extend(str(_p / "services/aria-bots/src") for _p in _Path(__file__).resolve().parents
9
+ if (_p / "services/aria-bots/src/aria_bots").is_dir())
10
+
11
+ _sys.modules[__name__] = _import_module("aria_bots.logistics.carriers")
@@ -0,0 +1,11 @@
1
+ """Moved to services/aria-bots: this name imports :mod:`aria_bots.logistics.inventory`."""
2
+ from importlib import import_module as _import_module
3
+ from importlib.util import find_spec as _find_spec
4
+ from pathlib import Path as _Path
5
+ import sys as _sys
6
+
7
+ if _find_spec("aria_bots") is None: # a source checkout run without installing it
8
+ _sys.path.extend(str(_p / "services/aria-bots/src") for _p in _Path(__file__).resolve().parents
9
+ if (_p / "services/aria-bots/src/aria_bots").is_dir())
10
+
11
+ _sys.modules[__name__] = _import_module("aria_bots.logistics.inventory")
@@ -0,0 +1,11 @@
1
+ """Moved to services/aria-bots: this name imports :mod:`aria_bots.logistics.records`."""
2
+ from importlib import import_module as _import_module
3
+ from importlib.util import find_spec as _find_spec
4
+ from pathlib import Path as _Path
5
+ import sys as _sys
6
+
7
+ if _find_spec("aria_bots") is None: # a source checkout run without installing it
8
+ _sys.path.extend(str(_p / "services/aria-bots/src") for _p in _Path(__file__).resolve().parents
9
+ if (_p / "services/aria-bots/src/aria_bots").is_dir())
10
+
11
+ _sys.modules[__name__] = _import_module("aria_bots.logistics.records")
@@ -0,0 +1,11 @@
1
+ """Moved to services/aria-bots: this name imports :mod:`aria_bots.logistics.tenancy`."""
2
+ from importlib import import_module as _import_module
3
+ from importlib.util import find_spec as _find_spec
4
+ from pathlib import Path as _Path
5
+ import sys as _sys
6
+
7
+ if _find_spec("aria_bots") is None: # a source checkout run without installing it
8
+ _sys.path.extend(str(_p / "services/aria-bots/src") for _p in _Path(__file__).resolve().parents
9
+ if (_p / "services/aria-bots/src/aria_bots").is_dir())
10
+
11
+ _sys.modules[__name__] = _import_module("aria_bots.logistics.tenancy")
@@ -0,0 +1,11 @@
1
+ """Moved to services/aria-bots: this name imports :mod:`aria_bots.logistics.freight`."""
2
+ from importlib import import_module as _import_module
3
+ from importlib.util import find_spec as _find_spec
4
+ from pathlib import Path as _Path
5
+ import sys as _sys
6
+
7
+ if _find_spec("aria_bots") is None: # a source checkout run without installing it
8
+ _sys.path.extend(str(_p / "services/aria-bots/src") for _p in _Path(__file__).resolve().parents
9
+ if (_p / "services/aria-bots/src/aria_bots").is_dir())
10
+
11
+ _sys.modules[__name__] = _import_module("aria_bots.logistics.freight")
@@ -0,0 +1,412 @@
1
+ """
2
+ macro_tools.py — 宏观经济数据层
3
+ =================================
4
+ 来源:
5
+ - FRED (美联储 St. Louis) — GDP, CPI, 联邦基金利率, 失业率, M2
6
+ - AKShare — 中国 CPI/PPI/PMI/GDP/LPR/社融
7
+ - yfinance — 全球央行政策利率(备用)
8
+
9
+ 全部函数返回 {"success": bool, "data": [...], ...} 格式,
10
+ 与 local_finance_tools 保持一致。
11
+
12
+ 依赖安装(可选):
13
+ pip install requests # FRED REST API
14
+ pip install akshare # 中国数据
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import logging
20
+ import os
21
+ from datetime import datetime, timedelta
22
+ from pathlib import Path
23
+ from typing import Any, Dict, List, Optional
24
+ from aria_code.packages.aria_core.paths import aria_home
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+ # ── Optional imports ──────────────────────────────────────────────────────────
29
+
30
+ try:
31
+ import requests as _req
32
+ _HAS_REQUESTS = True
33
+ except ImportError:
34
+ _HAS_REQUESTS = False
35
+
36
+ try:
37
+ import akshare as ak
38
+ _HAS_AK = True
39
+ # Not just ImportError: akshare reads bundled data files and calendars on
40
+ # import, and a partial install (or a frozen binary without its data) raises
41
+ # FileNotFoundError or worse. Optional means optional — never crash the CLI.
42
+ except Exception: # noqa: BLE001
43
+ _HAS_AK = False
44
+
45
+ try:
46
+ import pandas as pd
47
+ _HAS_PD = True
48
+ except ImportError:
49
+ _HAS_PD = False
50
+
51
+ # ── FRED API helper ──────────────────────────────────────────────────────────
52
+
53
+ FRED_BASE = "https://fred.stlouisfed.org/graph/fredgraph.csv"
54
+ FRED_API_BASE = "https://api.stlouisfed.org/fred"
55
+
56
+ def _get_fred_key() -> str:
57
+ """Read FRED API key from env or ~/.arthera/providers.json."""
58
+ key = os.getenv("FRED_API_KEY", "")
59
+ if not key:
60
+ try:
61
+ import json
62
+ p = aria_home() / "providers.json"
63
+ if p.exists():
64
+ d = json.loads(p.read_text())
65
+ key = d.get("fred", {}).get("api_key", "") or d.get("fred_api_key", "")
66
+ except Exception:
67
+ pass
68
+ return key
69
+
70
+
71
+ def _fred_series(series_id: str, limit: int = 24, units: str = "") -> List[Dict]:
72
+ """Fetch a FRED data series. Returns list of {date, value} dicts.
73
+
74
+ ``units`` maps to FRED's units transformation, e.g. "pc1" = percent change
75
+ from a year ago (used for YoY rates like CPI inflation, so we don't show
76
+ the raw index level mislabelled as a percentage).
77
+ """
78
+ if not _HAS_REQUESTS:
79
+ return []
80
+ key = _get_fred_key()
81
+ try:
82
+ params: Dict[str, Any] = {
83
+ "series_id": series_id,
84
+ "limit": limit,
85
+ "sort_order": "desc",
86
+ "file_type": "json",
87
+ }
88
+ if units:
89
+ params["units"] = units
90
+ if key:
91
+ params["api_key"] = key
92
+ url = f"{FRED_API_BASE}/series/observations"
93
+ r = _req.get(url, params=params, timeout=8)
94
+ r.raise_for_status()
95
+ obs = r.json().get("observations", [])
96
+ return [
97
+ {"date": o["date"], "value": float(o["value"]) if o["value"] != "." else None}
98
+ for o in reversed(obs)
99
+ ]
100
+ else:
101
+ # Public CSV endpoint (no key needed, slower). fredgraph supports
102
+ # transformation codes via the `transformation` query param.
103
+ obs_url = f"https://fred.stlouisfed.org/graph/fredgraph.csv?id={series_id}"
104
+ if units:
105
+ obs_url += f"&transformation={units}"
106
+ r = _req.get(obs_url, timeout=10)
107
+ r.raise_for_status()
108
+ lines = r.text.strip().split("\n")[1:] # skip header
109
+ result = []
110
+ for line in lines[-limit:]:
111
+ parts = line.split(",")
112
+ if len(parts) == 2:
113
+ try:
114
+ result.append({"date": parts[0], "value": float(parts[1])})
115
+ except ValueError:
116
+ pass
117
+ return result
118
+ except Exception as e:
119
+ logger.debug("FRED fetch %s failed: %s", series_id, e)
120
+ return []
121
+
122
+
123
+ # ── US Macro ──────────────────────────────────────────────────────────────────
124
+
125
+ _FRED_SERIES_MAP = {
126
+ "gdp": ("GDP", "GDP 实际值 (十亿美元, 季度)", "B"),
127
+ "gdp_growth": ("A191RL1Q225SBEA", "GDP 同比增速 (%)", "%"),
128
+ "cpi": ("CPIAUCSL", "CPI 城市消费者价格指数", "idx"),
129
+ "cpi_yoy": ("CPIAUCSL", "CPI 同比 (%)", "%", "pc1"), # pc1 = YoY %
130
+ "core_cpi_yoy": ("CPILFESL", "核心 CPI 同比 (%)", "%", "pc1"),
131
+ "core_cpi": ("CPILFESL", "核心 CPI (剔除食品能源)", "idx"),
132
+ "pce": ("PCEPI", "PCE 通胀指数", "idx"),
133
+ "fed_rate": ("FEDFUNDS", "联邦基金利率 (%)", "%"),
134
+ "unemployment": ("UNRATE", "美国失业率 (%)", "%"),
135
+ "m2": ("M2SL", "M2 货币供给 (十亿美元)", "B"),
136
+ "10y_yield": ("DGS10", "10年期国债收益率 (%)", "%"),
137
+ "2y_yield": ("DGS2", "2年期国债收益率 (%)", "%"),
138
+ "vix": ("VIXCLS", "VIX 恐慌指数", ""),
139
+ "retail_sales": ("RSAFS", "零售销售额 (百万美元, 季调)", "M"),
140
+ "industrial": ("INDPRO", "工业产出指数", "idx"),
141
+ "housing": ("HOUST", "新屋开工 (千套, 季调年化)", "K"),
142
+ "ppi": ("PPIACO", "PPI 生产者价格指数", "idx"),
143
+ }
144
+
145
+
146
+ _FRED_LABELS_EN = {
147
+ "gdp": "GDP (USD bn, quarterly)", "gdp_growth": "Real GDP growth (%)", "cpi": "CPI (urban consumers)",
148
+ "cpi_yoy": "CPI year on year (%)", "core_cpi_yoy": "Core CPI year on year (%)",
149
+ "core_cpi": "Core CPI (ex food and energy)", "pce": "PCE price index", "fed_rate": "Fed funds rate (%)",
150
+ "unemployment": "Unemployment rate (%)", "m2": "M2 money supply (USD bn)",
151
+ "10y_yield": "10-year Treasury yield (%)", "2y_yield": "2-year Treasury yield (%)", "vix": "VIX",
152
+ "retail_sales": "Retail sales (USD m, SA)", "industrial": "Industrial production index",
153
+ "housing": "Housing starts (thousands, SAAR)", "ppi": "PPI (producer prices)",
154
+ }
155
+
156
+
157
+ def get_us_macro(indicator: str = "all", periods: int = 12) -> dict:
158
+ """
159
+ 获取美国宏观经济数据。
160
+
161
+ indicator: "gdp" | "cpi" | "fed_rate" | "unemployment" | "m2" |
162
+ "10y_yield" | "retail_sales" | "all"
163
+ periods: 返回最近 N 期数据
164
+ """
165
+ if indicator == "all":
166
+ keys = ["gdp_growth", "cpi_yoy", "fed_rate", "unemployment", "10y_yield",
167
+ "2y_yield", "m2", "ppi"]
168
+ else:
169
+ keys = [indicator] if indicator in _FRED_SERIES_MAP else []
170
+ if not keys:
171
+ return {"success": False, "error": f"未知指标: {indicator}。可选: {', '.join(_FRED_SERIES_MAP)}"}
172
+
173
+ results = {}
174
+ for key in keys:
175
+ _spec = _FRED_SERIES_MAP[key]
176
+ series_id, label, unit = _spec[0], _spec[1], _spec[2]
177
+ _units = _spec[3] if len(_spec) > 3 else ""
178
+ # pc1 (YoY) needs ~13 months of monthly data to compute the first point
179
+ _lim = max(periods, 14) if _units == "pc1" else periods
180
+ data = _fred_series(series_id, limit=_lim, units=_units)
181
+ if data:
182
+ latest = data[-1]
183
+ prev = data[-2] if len(data) >= 2 else None
184
+ change = None
185
+ if latest["value"] is not None and prev and prev["value"] is not None:
186
+ change = round(latest["value"] - prev["value"], 3)
187
+ results[key] = {
188
+ "label": label,
189
+ "label_en": _FRED_LABELS_EN.get(key, label),
190
+ "unit": unit,
191
+ "latest": latest,
192
+ "prev": prev,
193
+ "change": change,
194
+ "series": data[-6:], # last 6 periods for sparkline
195
+ }
196
+
197
+ if not results:
198
+ return {"success": False, "error": "FRED 数据获取失败(无 API Key 时使用公共 CSV 端点,速度较慢)"}
199
+
200
+ # Yield curve shape
201
+ if "10y_yield" in results and "2y_yield" in results:
202
+ v10 = results["10y_yield"]["latest"]["value"] or 0
203
+ v2 = results["2y_yield"]["latest"]["value"] or 0
204
+ spread = round(v10 - v2, 3)
205
+ results["_yield_curve"] = {
206
+ "spread_10y_2y": spread,
207
+ "shape": "正常" if spread > 0.2 else "倒挂" if spread < 0 else "平坦",
208
+ "shape_en": "normal" if spread > 0.2 else "inverted" if spread < 0 else "flat",
209
+ }
210
+
211
+ return {"success": True, "country": "US", "indicator": indicator,
212
+ "data": results, "provider": "FRED"}
213
+
214
+
215
+ # ── China Macro ───────────────────────────────────────────────────────────────
216
+
217
+ def get_cn_macro(indicator: str = "all") -> dict:
218
+ """
219
+ 获取中国宏观经济数据 (via akshare)。
220
+
221
+ indicator: "cpi" | "ppi" | "pmi" | "gdp" | "lpr" | "m2" | "all"
222
+ """
223
+ if not _HAS_AK:
224
+ return {"success": False, "error": "akshare 未安装,请运行: pip install akshare"}
225
+
226
+ results = {}
227
+
228
+ def _fetch(fn, key, label):
229
+ try:
230
+ df = fn()
231
+ if df is None or (hasattr(df, "empty") and df.empty):
232
+ return
233
+ # Keep last 12 rows
234
+ df = df.tail(12)
235
+ records = df.to_dict("records") if _HAS_PD else []
236
+ latest = records[-1] if records else {}
237
+ results[key] = {"label": label, "latest": latest, "series": records}
238
+ except Exception as e:
239
+ logger.debug("akshare %s failed: %s", key, e)
240
+
241
+ if indicator in ("cpi", "all"):
242
+ _fetch(ak.macro_china_cpi_yearly, "cpi", "中国 CPI 同比 (%)")
243
+
244
+ if indicator in ("ppi", "all"):
245
+ _fetch(ak.macro_china_ppi_yearly, "ppi", "中国 PPI 同比 (%)")
246
+
247
+ if indicator in ("pmi", "all"):
248
+ _fetch(ak.macro_china_pmi_yearly, "pmi_manufacturing",
249
+ "制造业 PMI")
250
+ try:
251
+ df_s = ak.macro_china_non_man_pmi()
252
+ if df_s is not None and not df_s.empty:
253
+ records_s = df_s.tail(12).to_dict("records")
254
+ results["pmi_service"] = {
255
+ "label": "非制造业 PMI",
256
+ "latest": records_s[-1] if records_s else {},
257
+ "series": records_s,
258
+ }
259
+ except Exception:
260
+ pass
261
+
262
+ if indicator in ("gdp", "all"):
263
+ _fetch(ak.macro_china_gdp_yearly, "gdp", "中国 GDP 同比增速 (%)")
264
+
265
+ if indicator in ("lpr", "all"):
266
+ try:
267
+ df_lpr = ak.macro_china_lpr()
268
+ if df_lpr is not None and not df_lpr.empty:
269
+ records_l = df_lpr.tail(6).to_dict("records")
270
+ results["lpr"] = {"label": "LPR 利率", "series": records_l,
271
+ "latest": records_l[-1] if records_l else {}}
272
+ except Exception as e:
273
+ logger.debug("LPR fetch failed: %s", e)
274
+
275
+ if indicator in ("m2", "all"):
276
+ _fetch(ak.macro_china_money_supply, "m2", "中国 M2 同比增速 (%)")
277
+
278
+ if not results:
279
+ return {"success": False, "error": "未能获取任何中国宏观数据"}
280
+
281
+ return {"success": True, "country": "CN", "indicator": indicator,
282
+ "data": results, "provider": "akshare"}
283
+
284
+
285
+ # ── Economic Calendar ─────────────────────────────────────────────────────────
286
+
287
+ def get_economic_calendar(days_ahead: int = 7) -> dict:
288
+ """
289
+ 获取未来 N 天的重大经济事件日历。
290
+ 数据来源:投资道/东方财富 (akshare),备用: Finnhub
291
+ """
292
+ results = []
293
+
294
+ # Try akshare economic calendar (东方财富)
295
+ if _HAS_AK:
296
+ try:
297
+ df = ak.news_economic_baidu(date=datetime.now().strftime("%Y%m%d"))
298
+ if df is not None and not df.empty:
299
+ cols = [c for c in ["time","event","actual","forecast","previous","importance"]
300
+ if c in df.columns]
301
+ results = df[cols].head(30).to_dict("records") if cols else []
302
+ except Exception as e:
303
+ logger.debug("akshare calendar failed: %s", e)
304
+
305
+ # Fallback: Finnhub economic calendar
306
+ if not results and _HAS_REQUESTS:
307
+ try:
308
+ key = _get_finnhub_key()
309
+ if key:
310
+ from_dt = datetime.now().strftime("%Y-%m-%d")
311
+ to_dt = (datetime.now() + timedelta(days=days_ahead)).strftime("%Y-%m-%d")
312
+ r = _req.get(
313
+ "https://finnhub.io/api/v1/calendar/economic",
314
+ params={"from": from_dt, "to": to_dt, "token": key},
315
+ timeout=8,
316
+ )
317
+ r.raise_for_status()
318
+ results = r.json().get("economicCalendar", [])
319
+ except Exception as e:
320
+ logger.debug("Finnhub calendar failed: %s", e)
321
+
322
+ if not results:
323
+ # Static upcoming FOMC/PBOC dates as fallback
324
+ results = [
325
+ {"event": "FOMC Meeting", "importance": "HIGH",
326
+ "note": "具体日期请查阅 federalreserve.gov/monetarypolicy"},
327
+ {"event": "PBOC LPR Announcement", "importance": "HIGH",
328
+ "note": "每月 20 日前后公布"},
329
+ {"event": "US CPI Release", "importance": "HIGH",
330
+ "note": "每月第二周(周二或周三)"},
331
+ {"event": "China PMI Release", "importance": "MEDIUM",
332
+ "note": "每月最后一天(官方)/ 次月第一工作日(财新)"},
333
+ ]
334
+
335
+ return {"success": True, "events": results, "days_ahead": days_ahead,
336
+ "provider": "akshare/finnhub"}
337
+
338
+
339
+ def _get_finnhub_key() -> str:
340
+ """Read Finnhub key from env or providers.json."""
341
+ k = os.getenv("FINNHUB_API_KEY", "")
342
+ if not k:
343
+ try:
344
+ import json
345
+ p = aria_home() / "providers.json"
346
+ if p.exists():
347
+ d = json.loads(p.read_text())
348
+ k = d.get("finnhub", {}).get("api_key", "") or d.get("finnhub_api_key", "")
349
+ except Exception:
350
+ pass
351
+ return k
352
+
353
+
354
+ # ── Central Bank Policy Rates ─────────────────────────────────────────────────
355
+
356
+ def get_central_bank_rates() -> dict:
357
+ """主要央行政策利率快照。
358
+
359
+ The Bank of England row read FRED's BOERUKM, which stopped in January 2017:
360
+ 0.25% was shown as today's rate. The UK now uses SONIA, which tracks Bank
361
+ Rate. ECBDFR is the deposit facility rate, not the refi rate it was labelled,
362
+ and the Japan series is the call rate that tracks the BoJ's policy rate. Each
363
+ value carries its date; one older than 180 days is reported as stale and
364
+ left out of ``rates``.
365
+ """
366
+ from datetime import date as _date
367
+
368
+ CB_SERIES = (
369
+ ("fed", "FEDFUNDS", "美联储 (Fed Funds)", "Fed funds (US)"),
370
+ ("ecb", "ECBDFR", "欧央行 (存款便利利率)", "ECB deposit facility rate"),
371
+ ("uk", "IUDSOIA", "英国 SONIA (跟随英央行利率)", "UK SONIA (tracks Bank Rate)"),
372
+ ("jp", "IRSTCI01JPM156N", "日本隔夜拆借利率 (跟随日央行)", "Japan call rate (tracks BoJ policy)"),
373
+ )
374
+ rates = {}
375
+ details = []
376
+ for key, series, label_zh, label_en in CB_SERIES:
377
+ data = _fred_series(series, limit=3)
378
+ if not data:
379
+ continue
380
+ latest = data[-1]
381
+ try:
382
+ age = (_date.today() - _date.fromisoformat(str(latest["date"])[:10])).days
383
+ except ValueError:
384
+ age = None
385
+ stale = age is not None and age > 180
386
+ details.append({"key": key, "series": series, "label_zh": label_zh, "label_en": label_en,
387
+ "value": latest["value"], "date": str(latest["date"])[:10], "stale": stale})
388
+ if not stale:
389
+ rates[label_zh] = latest["value"]
390
+
391
+ # PBOC LPR via akshare
392
+ if _HAS_AK:
393
+ try:
394
+ df = ak.macro_china_lpr()
395
+ if df is not None and not df.empty:
396
+ row = df.iloc[-1]
397
+ rates["中国人民银行 LPR 1Y"] = float(row.get("1年期贷款市场报价利率", row.iloc[1]))
398
+ rates["中国人民银行 LPR 5Y"] = float(row.get("5年期贷款市场报价利率", row.iloc[2]))
399
+ when = str(row.iloc[0])[:10]
400
+ details.append({"key": "lpr1y", "series": "akshare", "label_zh": "中国人民银行 LPR 1Y",
401
+ "label_en": "PBOC LPR 1-year", "value": rates["中国人民银行 LPR 1Y"],
402
+ "date": when, "stale": False})
403
+ details.append({"key": "lpr5y", "series": "akshare", "label_zh": "中国人民银行 LPR 5Y",
404
+ "label_en": "PBOC LPR 5-year", "value": rates["中国人民银行 LPR 5Y"],
405
+ "date": when, "stale": False})
406
+ except Exception:
407
+ pass
408
+
409
+ if not rates:
410
+ return {"success": False, "error": "无法获取央行利率数据"}
411
+
412
+ return {"success": True, "rates": rates, "details": details, "provider": "FRED+akshare"}