@zenalexa/unicli 0.215.1 → 0.216.2

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 (407) hide show
  1. package/AGENTS.md +15 -15
  2. package/README.md +233 -389
  3. package/README.zh-CN.md +235 -362
  4. package/dist/adapters/1688/assets.d.ts +2 -0
  5. package/dist/adapters/1688/assets.d.ts.map +1 -0
  6. package/dist/adapters/1688/assets.js +102 -0
  7. package/dist/adapters/1688/assets.js.map +1 -0
  8. package/dist/adapters/51job/jobs.d.ts +2 -0
  9. package/dist/adapters/51job/jobs.d.ts.map +1 -0
  10. package/dist/adapters/51job/jobs.js +292 -0
  11. package/dist/adapters/51job/jobs.js.map +1 -0
  12. package/dist/adapters/_shared/browser-tools.d.ts +10 -0
  13. package/dist/adapters/_shared/browser-tools.d.ts.map +1 -0
  14. package/dist/adapters/_shared/browser-tools.js +42 -0
  15. package/dist/adapters/_shared/browser-tools.js.map +1 -0
  16. package/dist/adapters/antigravity/extra.d.ts +2 -0
  17. package/dist/adapters/antigravity/extra.d.ts.map +1 -0
  18. package/dist/adapters/antigravity/extra.js +52 -0
  19. package/dist/adapters/antigravity/extra.js.map +1 -0
  20. package/dist/adapters/baidu-scholar/search.d.ts +2 -0
  21. package/dist/adapters/baidu-scholar/search.d.ts.map +1 -0
  22. package/dist/adapters/baidu-scholar/search.js +34 -0
  23. package/dist/adapters/baidu-scholar/search.js.map +1 -0
  24. package/dist/adapters/bilibili/compat.d.ts +2 -0
  25. package/dist/adapters/bilibili/compat.d.ts.map +1 -0
  26. package/dist/adapters/bilibili/compat.js +114 -0
  27. package/dist/adapters/bilibili/compat.js.map +1 -0
  28. package/dist/adapters/chatgpt/image.d.ts +2 -0
  29. package/dist/adapters/chatgpt/image.d.ts.map +1 -0
  30. package/dist/adapters/chatgpt/image.js +81 -0
  31. package/dist/adapters/chatgpt/image.js.map +1 -0
  32. package/dist/adapters/chatgpt-app/chatgpt-app.d.ts +2 -0
  33. package/dist/adapters/chatgpt-app/chatgpt-app.d.ts.map +1 -0
  34. package/dist/adapters/chatgpt-app/chatgpt-app.js +9 -0
  35. package/dist/adapters/chatgpt-app/chatgpt-app.js.map +1 -0
  36. package/dist/adapters/chatwise/extra.d.ts +2 -0
  37. package/dist/adapters/chatwise/extra.d.ts.map +1 -0
  38. package/dist/adapters/chatwise/extra.js +35 -0
  39. package/dist/adapters/chatwise/extra.js.map +1 -0
  40. package/dist/adapters/codex/extra.d.ts +2 -0
  41. package/dist/adapters/codex/extra.d.ts.map +1 -0
  42. package/dist/adapters/codex/extra.js +35 -0
  43. package/dist/adapters/codex/extra.js.map +1 -0
  44. package/dist/adapters/deepseek/web.d.ts +2 -0
  45. package/dist/adapters/deepseek/web.d.ts.map +1 -0
  46. package/dist/adapters/deepseek/web.js +187 -0
  47. package/dist/adapters/deepseek/web.js.map +1 -0
  48. package/dist/adapters/doubao/web.d.ts +2 -0
  49. package/dist/adapters/doubao/web.d.ts.map +1 -0
  50. package/dist/adapters/doubao/web.js +138 -0
  51. package/dist/adapters/doubao/web.js.map +1 -0
  52. package/dist/adapters/eastmoney/market-data.d.ts +2 -0
  53. package/dist/adapters/eastmoney/market-data.d.ts.map +1 -0
  54. package/dist/adapters/eastmoney/market-data.js +753 -0
  55. package/dist/adapters/eastmoney/market-data.js.map +1 -0
  56. package/dist/adapters/gitee/user.d.ts +2 -0
  57. package/dist/adapters/gitee/user.d.ts.map +1 -0
  58. package/dist/adapters/gitee/user.js +54 -0
  59. package/dist/adapters/gitee/user.js.map +1 -0
  60. package/dist/adapters/google-scholar/cite.d.ts +2 -0
  61. package/dist/adapters/google-scholar/cite.d.ts.map +1 -0
  62. package/dist/adapters/google-scholar/cite.js +82 -0
  63. package/dist/adapters/google-scholar/cite.js.map +1 -0
  64. package/dist/adapters/google-scholar/profile.d.ts +2 -0
  65. package/dist/adapters/google-scholar/profile.d.ts.map +1 -0
  66. package/dist/adapters/google-scholar/profile.js +80 -0
  67. package/dist/adapters/google-scholar/profile.js.map +1 -0
  68. package/dist/adapters/google-scholar/search.d.ts +2 -0
  69. package/dist/adapters/google-scholar/search.d.ts.map +1 -0
  70. package/dist/adapters/google-scholar/search.js +54 -0
  71. package/dist/adapters/google-scholar/search.js.map +1 -0
  72. package/dist/adapters/gov-law/laws.d.ts +2 -0
  73. package/dist/adapters/gov-law/laws.d.ts.map +1 -0
  74. package/dist/adapters/gov-law/laws.js +58 -0
  75. package/dist/adapters/gov-law/laws.js.map +1 -0
  76. package/dist/adapters/gov-policy/policy.d.ts +2 -0
  77. package/dist/adapters/gov-policy/policy.d.ts.map +1 -0
  78. package/dist/adapters/gov-policy/policy.js +58 -0
  79. package/dist/adapters/gov-policy/policy.js.map +1 -0
  80. package/dist/adapters/jd/commerce.d.ts +2 -0
  81. package/dist/adapters/jd/commerce.d.ts.map +1 -0
  82. package/dist/adapters/jd/commerce.js +133 -0
  83. package/dist/adapters/jd/commerce.js.map +1 -0
  84. package/dist/adapters/jianyu/detail.d.ts +2 -0
  85. package/dist/adapters/jianyu/detail.d.ts.map +1 -0
  86. package/dist/adapters/jianyu/detail.js +27 -0
  87. package/dist/adapters/jianyu/detail.js.map +1 -0
  88. package/dist/adapters/jimeng/workspace.d.ts +2 -0
  89. package/dist/adapters/jimeng/workspace.d.ts.map +1 -0
  90. package/dist/adapters/jimeng/workspace.js +49 -0
  91. package/dist/adapters/jimeng/workspace.js.map +1 -0
  92. package/dist/adapters/ke/rent-transaction.d.ts +2 -0
  93. package/dist/adapters/ke/rent-transaction.d.ts.map +1 -0
  94. package/dist/adapters/ke/rent-transaction.js +63 -0
  95. package/dist/adapters/ke/rent-transaction.js.map +1 -0
  96. package/dist/adapters/linux-do/search.d.ts +2 -0
  97. package/dist/adapters/linux-do/search.d.ts.map +1 -0
  98. package/dist/adapters/linux-do/search.js +75 -0
  99. package/dist/adapters/linux-do/search.js.map +1 -0
  100. package/dist/adapters/linux-do/topic-content.d.ts +2 -0
  101. package/dist/adapters/linux-do/topic-content.d.ts.map +1 -0
  102. package/dist/adapters/linux-do/topic-content.js +32 -0
  103. package/dist/adapters/linux-do/topic-content.js.map +1 -0
  104. package/dist/adapters/maimai/talents.d.ts +2 -0
  105. package/dist/adapters/maimai/talents.d.ts.map +1 -0
  106. package/dist/adapters/maimai/talents.js +64 -0
  107. package/dist/adapters/maimai/talents.js.map +1 -0
  108. package/dist/adapters/mubu/docs.d.ts +2 -0
  109. package/dist/adapters/mubu/docs.d.ts.map +1 -0
  110. package/dist/adapters/mubu/docs.js +96 -0
  111. package/dist/adapters/mubu/docs.js.map +1 -0
  112. package/dist/adapters/nowcoder/nowcoder.d.ts +2 -0
  113. package/dist/adapters/nowcoder/nowcoder.d.ts.map +1 -0
  114. package/dist/adapters/nowcoder/nowcoder.js +480 -0
  115. package/dist/adapters/nowcoder/nowcoder.js.map +1 -0
  116. package/dist/adapters/powerchina/search.d.ts +2 -0
  117. package/dist/adapters/powerchina/search.d.ts.map +1 -0
  118. package/dist/adapters/powerchina/search.js +41 -0
  119. package/dist/adapters/powerchina/search.js.map +1 -0
  120. package/dist/adapters/quark/actions.d.ts +2 -0
  121. package/dist/adapters/quark/actions.d.ts.map +1 -0
  122. package/dist/adapters/quark/actions.js +151 -0
  123. package/dist/adapters/quark/actions.js.map +1 -0
  124. package/dist/adapters/reddit/browser-utils.d.ts +7 -0
  125. package/dist/adapters/reddit/browser-utils.d.ts.map +1 -0
  126. package/dist/adapters/reddit/browser-utils.js +68 -0
  127. package/dist/adapters/reddit/browser-utils.js.map +1 -0
  128. package/dist/adapters/reddit/listings.d.ts +2 -0
  129. package/dist/adapters/reddit/listings.d.ts.map +1 -0
  130. package/dist/adapters/reddit/listings.js +193 -0
  131. package/dist/adapters/reddit/listings.js.map +1 -0
  132. package/dist/adapters/reddit/search.d.ts +2 -0
  133. package/dist/adapters/reddit/search.d.ts.map +1 -0
  134. package/dist/adapters/reddit/search.js +66 -0
  135. package/dist/adapters/reddit/search.js.map +1 -0
  136. package/dist/adapters/spotify/api.d.ts +2 -0
  137. package/dist/adapters/spotify/api.d.ts.map +1 -0
  138. package/dist/adapters/spotify/api.js +252 -0
  139. package/dist/adapters/spotify/api.js.map +1 -0
  140. package/dist/adapters/taobao/commerce.d.ts +2 -0
  141. package/dist/adapters/taobao/commerce.d.ts.map +1 -0
  142. package/dist/adapters/taobao/commerce.js +130 -0
  143. package/dist/adapters/taobao/commerce.js.map +1 -0
  144. package/dist/adapters/tdx/hot-rank.d.ts +2 -0
  145. package/dist/adapters/tdx/hot-rank.d.ts.map +1 -0
  146. package/dist/adapters/tdx/hot-rank.js +34 -0
  147. package/dist/adapters/tdx/hot-rank.js.map +1 -0
  148. package/dist/adapters/ths/hot-rank.d.ts +2 -0
  149. package/dist/adapters/ths/hot-rank.d.ts.map +1 -0
  150. package/dist/adapters/ths/hot-rank.js +34 -0
  151. package/dist/adapters/ths/hot-rank.js.map +1 -0
  152. package/dist/adapters/toutiao/articles.d.ts +2 -0
  153. package/dist/adapters/toutiao/articles.d.ts.map +1 -0
  154. package/dist/adapters/toutiao/articles.js +41 -0
  155. package/dist/adapters/toutiao/articles.js.map +1 -0
  156. package/dist/adapters/twitter/lists-extra.d.ts +2 -0
  157. package/dist/adapters/twitter/lists-extra.d.ts.map +1 -0
  158. package/dist/adapters/twitter/lists-extra.js +125 -0
  159. package/dist/adapters/twitter/lists-extra.js.map +1 -0
  160. package/dist/adapters/uiverse/components.d.ts +2 -0
  161. package/dist/adapters/uiverse/components.d.ts.map +1 -0
  162. package/dist/adapters/uiverse/components.js +138 -0
  163. package/dist/adapters/uiverse/components.js.map +1 -0
  164. package/dist/adapters/wanfang/search.d.ts +2 -0
  165. package/dist/adapters/wanfang/search.d.ts.map +1 -0
  166. package/dist/adapters/wanfang/search.js +34 -0
  167. package/dist/adapters/wanfang/search.js.map +1 -0
  168. package/dist/adapters/weixin/drafts.d.ts +2 -0
  169. package/dist/adapters/weixin/drafts.d.ts.map +1 -0
  170. package/dist/adapters/weixin/drafts.js +69 -0
  171. package/dist/adapters/weixin/drafts.js.map +1 -0
  172. package/dist/adapters/weread/ai-outline.d.ts +2 -0
  173. package/dist/adapters/weread/ai-outline.d.ts.map +1 -0
  174. package/dist/adapters/weread/ai-outline.js +28 -0
  175. package/dist/adapters/weread/ai-outline.js.map +1 -0
  176. package/dist/adapters/xiaoyuzhou/media.d.ts +2 -0
  177. package/dist/adapters/xiaoyuzhou/media.d.ts.map +1 -0
  178. package/dist/adapters/xiaoyuzhou/media.js +105 -0
  179. package/dist/adapters/xiaoyuzhou/media.js.map +1 -0
  180. package/dist/adapters/xueqiu/extra.d.ts +2 -0
  181. package/dist/adapters/xueqiu/extra.d.ts.map +1 -0
  182. package/dist/adapters/xueqiu/extra.js +74 -0
  183. package/dist/adapters/xueqiu/extra.js.map +1 -0
  184. package/dist/adapters/youtube/personal.d.ts +2 -0
  185. package/dist/adapters/youtube/personal.d.ts.map +1 -0
  186. package/dist/adapters/youtube/personal.js +183 -0
  187. package/dist/adapters/youtube/personal.js.map +1 -0
  188. package/dist/adapters/zhihu/actions.d.ts +2 -0
  189. package/dist/adapters/zhihu/actions.d.ts.map +1 -0
  190. package/dist/adapters/zhihu/actions.js +110 -0
  191. package/dist/adapters/zhihu/actions.js.map +1 -0
  192. package/dist/browser/adapter-authoring.d.ts.map +1 -1
  193. package/dist/browser/adapter-authoring.js +3 -3
  194. package/dist/browser/adapter-authoring.js.map +1 -1
  195. package/dist/browser/bridge.d.ts.map +1 -1
  196. package/dist/browser/bridge.js +2 -3
  197. package/dist/browser/bridge.js.map +1 -1
  198. package/dist/browser/daemon-client.d.ts.map +1 -1
  199. package/dist/browser/daemon-client.js +17 -5
  200. package/dist/browser/daemon-client.js.map +1 -1
  201. package/dist/browser/network-cache.js +2 -2
  202. package/dist/browser/network-cache.js.map +1 -1
  203. package/dist/browser/site-memory.d.ts.map +1 -1
  204. package/dist/browser/site-memory.js +11 -8
  205. package/dist/browser/site-memory.js.map +1 -1
  206. package/dist/browser/target-errors.d.ts +2 -2
  207. package/dist/browser/target-errors.js +2 -2
  208. package/dist/browser/verify-fixture.d.ts.map +1 -1
  209. package/dist/browser/verify-fixture.js +2 -2
  210. package/dist/browser/verify-fixture.js.map +1 -1
  211. package/dist/cli.d.ts.map +1 -1
  212. package/dist/cli.js +9 -4
  213. package/dist/cli.js.map +1 -1
  214. package/dist/commands/agents.d.ts.map +1 -1
  215. package/dist/commands/agents.js +5 -2
  216. package/dist/commands/agents.js.map +1 -1
  217. package/dist/commands/auth.d.ts.map +1 -1
  218. package/dist/commands/auth.js +8 -2
  219. package/dist/commands/auth.js.map +1 -1
  220. package/dist/commands/browser-operator-runtime.d.ts.map +1 -1
  221. package/dist/commands/browser-operator-runtime.js +2 -2
  222. package/dist/commands/browser-operator-runtime.js.map +1 -1
  223. package/dist/commands/browser-operator.d.ts.map +1 -1
  224. package/dist/commands/browser-operator.js +2 -2
  225. package/dist/commands/browser-operator.js.map +1 -1
  226. package/dist/commands/describe.d.ts +2 -2
  227. package/dist/commands/describe.d.ts.map +1 -1
  228. package/dist/commands/describe.js +14 -3
  229. package/dist/commands/describe.js.map +1 -1
  230. package/dist/commands/dispatch.d.ts.map +1 -1
  231. package/dist/commands/dispatch.js +7 -6
  232. package/dist/commands/dispatch.js.map +1 -1
  233. package/dist/commands/explore.js +2 -2
  234. package/dist/commands/explore.js.map +1 -1
  235. package/dist/commands/generate.js +3 -3
  236. package/dist/commands/generate.js.map +1 -1
  237. package/dist/commands/health.d.ts.map +1 -1
  238. package/dist/commands/health.js +4 -10
  239. package/dist/commands/health.js.map +1 -1
  240. package/dist/commands/migrate.d.ts +9 -9
  241. package/dist/commands/migrate.d.ts.map +1 -1
  242. package/dist/commands/migrate.js +22 -22
  243. package/dist/commands/migrate.js.map +1 -1
  244. package/dist/commands/repair.d.ts.map +1 -1
  245. package/dist/commands/repair.js +9 -4
  246. package/dist/commands/repair.js.map +1 -1
  247. package/dist/commands/search.d.ts +3 -3
  248. package/dist/commands/search.js +4 -4
  249. package/dist/commands/skills.d.ts +3 -0
  250. package/dist/commands/skills.d.ts.map +1 -1
  251. package/dist/commands/skills.js +8 -4
  252. package/dist/commands/skills.js.map +1 -1
  253. package/dist/commands/synthesize.js +2 -2
  254. package/dist/commands/synthesize.js.map +1 -1
  255. package/dist/discovery/aliases.d.ts.map +1 -1
  256. package/dist/discovery/aliases.js +69 -0
  257. package/dist/discovery/aliases.js.map +1 -1
  258. package/dist/discovery/loader.d.ts.map +1 -1
  259. package/dist/discovery/loader.js +130 -0
  260. package/dist/discovery/loader.js.map +1 -1
  261. package/dist/engine/kernel/execute.d.ts.map +1 -1
  262. package/dist/engine/kernel/execute.js +27 -4
  263. package/dist/engine/kernel/execute.js.map +1 -1
  264. package/dist/engine/user-home.d.ts +9 -0
  265. package/dist/engine/user-home.d.ts.map +1 -0
  266. package/dist/engine/user-home.js +12 -0
  267. package/dist/engine/user-home.js.map +1 -0
  268. package/dist/fast-path.d.ts +14 -0
  269. package/dist/fast-path.d.ts.map +1 -0
  270. package/dist/fast-path.js +565 -0
  271. package/dist/fast-path.js.map +1 -0
  272. package/dist/hub/index.d.ts +1 -1
  273. package/dist/hub/index.d.ts.map +1 -1
  274. package/dist/hub/index.js +28 -17
  275. package/dist/hub/index.js.map +1 -1
  276. package/dist/main.js +6 -3
  277. package/dist/main.js.map +1 -1
  278. package/dist/manifest-compact.txt +11 -11
  279. package/dist/manifest-search.json +1 -1
  280. package/dist/manifest.json +27600 -1016
  281. package/dist/mcp/tools.js +1 -1
  282. package/dist/mcp/tools.js.map +1 -1
  283. package/dist/output/error-map.d.ts.map +1 -1
  284. package/dist/output/error-map.js +16 -5
  285. package/dist/output/error-map.js.map +1 -1
  286. package/dist/protocol/acp.js +1 -1
  287. package/dist/protocol/acp.js.map +1 -1
  288. package/dist/registry.d.ts +3 -0
  289. package/dist/registry.d.ts.map +1 -1
  290. package/dist/registry.js +34 -1
  291. package/dist/registry.js.map +1 -1
  292. package/dist/runtime/usage-ledger.d.ts +6 -7
  293. package/dist/runtime/usage-ledger.d.ts.map +1 -1
  294. package/dist/runtime/usage-ledger.js +6 -7
  295. package/dist/runtime/usage-ledger.js.map +1 -1
  296. package/dist/types.d.ts +2 -0
  297. package/dist/types.d.ts.map +1 -1
  298. package/dist/types.js.map +1 -1
  299. package/package.json +12 -6
  300. package/src/adapters/1688/assets.ts +114 -0
  301. package/src/adapters/51job/jobs.ts +327 -0
  302. package/src/adapters/_shared/browser-tools.ts +59 -0
  303. package/src/adapters/antigravity/extra.ts +53 -0
  304. package/src/adapters/baidu-scholar/search.ts +38 -0
  305. package/src/adapters/bilibili/compat.ts +132 -0
  306. package/src/adapters/binance/asks.yaml +41 -0
  307. package/src/adapters/binance/depth.yaml +41 -0
  308. package/src/adapters/binance/gainers.yaml +42 -0
  309. package/src/adapters/binance/hot.yaml +1 -1
  310. package/src/adapters/binance/kline.yaml +1 -1
  311. package/src/adapters/binance/klines.yaml +46 -0
  312. package/src/adapters/binance/losers.yaml +42 -0
  313. package/src/adapters/binance/pairs.yaml +38 -0
  314. package/src/adapters/binance/price.yaml +32 -0
  315. package/src/adapters/binance/prices.yaml +30 -0
  316. package/src/adapters/binance/ticker.yaml +2 -2
  317. package/src/adapters/binance/top.yaml +46 -0
  318. package/src/adapters/binance/trades.yaml +42 -0
  319. package/src/adapters/chatgpt/image.ts +84 -0
  320. package/src/adapters/chatgpt-app/chatgpt-app.ts +11 -0
  321. package/src/adapters/chatwise/extra.ts +36 -0
  322. package/src/adapters/codex/extra.ts +36 -0
  323. package/src/adapters/deepseek/web.ts +203 -0
  324. package/src/adapters/doubao/web.ts +154 -0
  325. package/src/adapters/eastmoney/market-data.ts +829 -0
  326. package/src/adapters/excel/insert-image.yaml +80 -0
  327. package/src/adapters/excel/insert-link.yaml +90 -0
  328. package/src/adapters/excel/list.yaml +63 -0
  329. package/src/adapters/excel/read.yaml +74 -0
  330. package/src/adapters/excel/set-cell.yaml +77 -0
  331. package/src/adapters/excel/set-font.yaml +87 -0
  332. package/src/adapters/excel/status.yaml +29 -0
  333. package/src/adapters/gh/search-repos.yaml +62 -0
  334. package/src/adapters/gitee/user.ts +59 -0
  335. package/src/adapters/google-scholar/cite.ts +95 -0
  336. package/src/adapters/google-scholar/profile.ts +91 -0
  337. package/src/adapters/google-scholar/search.ts +58 -0
  338. package/src/adapters/gov-law/laws.ts +61 -0
  339. package/src/adapters/gov-policy/policy.ts +61 -0
  340. package/src/adapters/imessage/contact.yaml +7 -2
  341. package/src/adapters/imessage/recent.yaml +7 -2
  342. package/src/adapters/imessage/search.yaml +7 -2
  343. package/src/adapters/jd/commerce.ts +142 -0
  344. package/src/adapters/jianyu/detail.ts +28 -0
  345. package/src/adapters/jimeng/workspace.ts +53 -0
  346. package/src/adapters/ke/rent-transaction.ts +70 -0
  347. package/src/adapters/linux-do/search.ts +92 -0
  348. package/src/adapters/linux-do/topic-content.ts +45 -0
  349. package/src/adapters/maimai/talents.ts +65 -0
  350. package/src/adapters/mubu/docs.ts +107 -0
  351. package/src/adapters/nowcoder/nowcoder.ts +570 -0
  352. package/src/adapters/powerchina/search.ts +45 -0
  353. package/src/adapters/powerpoint/add-slide.yaml +93 -0
  354. package/src/adapters/powerpoint/insert-image.yaml +71 -0
  355. package/src/adapters/powerpoint/insert-link.yaml +94 -0
  356. package/src/adapters/powerpoint/list.yaml +58 -0
  357. package/src/adapters/powerpoint/set-font.yaml +101 -0
  358. package/src/adapters/powerpoint/slides.yaml +73 -0
  359. package/src/adapters/powerpoint/status.yaml +29 -0
  360. package/src/adapters/quark/actions.ts +169 -0
  361. package/src/adapters/reddit/browser-utils.ts +93 -0
  362. package/src/adapters/reddit/listings.ts +223 -0
  363. package/src/adapters/reddit/search.ts +74 -0
  364. package/src/adapters/spotify/api.ts +292 -0
  365. package/src/adapters/taobao/commerce.ts +134 -0
  366. package/src/adapters/tdx/hot-rank.ts +35 -0
  367. package/src/adapters/ths/hot-rank.ts +35 -0
  368. package/src/adapters/toutiao/articles.ts +45 -0
  369. package/src/adapters/twitter/lists-extra.ts +139 -0
  370. package/src/adapters/uiverse/components.ts +154 -0
  371. package/src/adapters/vercel/list.yaml +2 -1
  372. package/src/adapters/wanfang/search.ts +38 -0
  373. package/src/adapters/weixin/drafts.ts +74 -0
  374. package/src/adapters/weread/ai-outline.ts +32 -0
  375. package/src/adapters/word/insert-image.yaml +73 -0
  376. package/src/adapters/word/insert-link.yaml +82 -0
  377. package/src/adapters/word/insert-text.yaml +72 -0
  378. package/src/adapters/word/list.yaml +63 -0
  379. package/src/adapters/word/read.yaml +63 -0
  380. package/src/adapters/word/set-font.yaml +97 -0
  381. package/src/adapters/word/status.yaml +29 -0
  382. package/src/adapters/xiaoyuzhou/media.ts +139 -0
  383. package/src/adapters/xueqiu/extra.ts +78 -0
  384. package/src/adapters/youtube/personal.ts +215 -0
  385. package/src/adapters/zhihu/actions.ts +111 -0
  386. package/src/hub/external-clis-harness.yaml +211 -0
  387. package/src/hub/index.ts +29 -25
  388. package/src/adapters/linux-do/search.yaml +0 -44
  389. package/src/adapters/meituan/hot.yaml +0 -34
  390. package/src/adapters/reddit/frontpage.test.ts +0 -15
  391. package/src/adapters/reddit/frontpage.yaml +0 -41
  392. package/src/adapters/reddit/hot.test.ts +0 -15
  393. package/src/adapters/reddit/hot.yaml +0 -41
  394. package/src/adapters/reddit/new.test.ts +0 -15
  395. package/src/adapters/reddit/new.yaml +0 -42
  396. package/src/adapters/reddit/popular.test.ts +0 -15
  397. package/src/adapters/reddit/popular.yaml +0 -41
  398. package/src/adapters/reddit/rising.test.ts +0 -15
  399. package/src/adapters/reddit/rising.yaml +0 -41
  400. package/src/adapters/reddit/search.test.ts +0 -15
  401. package/src/adapters/reddit/search.yaml +0 -52
  402. package/src/adapters/reddit/subreddit.test.ts +0 -15
  403. package/src/adapters/reddit/subreddit.yaml +0 -50
  404. package/src/adapters/reddit/top.test.ts +0 -15
  405. package/src/adapters/reddit/top.yaml +0 -48
  406. package/src/adapters/reddit/trending.test.ts +0 -15
  407. package/src/adapters/reddit/trending.yaml +0 -33
@@ -0,0 +1,125 @@
1
+ import { cli, Strategy } from "../../registry.js";
2
+ import { clickFirst, intArg, js, str } from "../_shared/browser-tools.js";
3
+ async function extractTweets(page, url, limit) {
4
+ await page.goto(url, { settleMs: 2500 });
5
+ const rows = await page.evaluate(`(() => {
6
+ const tweets = [...document.querySelectorAll('article[data-testid="tweet"]')];
7
+ return tweets.map((article) => {
8
+ const user = article.querySelector('[data-testid="User-Name"]')?.textContent || '';
9
+ const text = article.querySelector('[data-testid="tweetText"]')?.textContent || '';
10
+ const link = [...article.querySelectorAll('a[href*="/status/"]')].pop();
11
+ return {
12
+ author: user.replace(/\\s+/g, ' ').trim(),
13
+ text: text.replace(/\\s+/g, ' ').trim(),
14
+ url: link ? new URL(link.getAttribute('href') || '', location.href).href : ''
15
+ };
16
+ }).filter((row) => row.text).slice(0, ${js(limit)});
17
+ })()`);
18
+ return Array.isArray(rows) ? rows : [];
19
+ }
20
+ cli({
21
+ site: "twitter",
22
+ name: "tweets",
23
+ description: "Read recent tweets from a Twitter/X user profile",
24
+ domain: "x.com",
25
+ strategy: Strategy.COOKIE,
26
+ browser: true,
27
+ args: [
28
+ { name: "user", type: "str", required: true, positional: true },
29
+ { name: "limit", type: "int", default: 20 },
30
+ ],
31
+ columns: ["author", "text", "url"],
32
+ func: async (page, kwargs) => extractTweets(page, `https://x.com/${encodeURIComponent(str(kwargs.user).replace(/^@/, ""))}`, intArg(kwargs.limit, 20, 100)),
33
+ });
34
+ cli({
35
+ site: "twitter",
36
+ name: "list-tweets",
37
+ description: "Read tweets from a Twitter/X list",
38
+ domain: "x.com",
39
+ strategy: Strategy.COOKIE,
40
+ browser: true,
41
+ args: [
42
+ { name: "list", type: "str", required: true, positional: true },
43
+ { name: "limit", type: "int", default: 20 },
44
+ ],
45
+ columns: ["author", "text", "url"],
46
+ func: async (page, kwargs) => {
47
+ const list = str(kwargs.list);
48
+ const url = list.startsWith("http")
49
+ ? list
50
+ : `https://x.com/i/lists/${encodeURIComponent(list)}`;
51
+ return extractTweets(page, url, intArg(kwargs.limit, 20, 100));
52
+ },
53
+ });
54
+ cli({
55
+ site: "twitter",
56
+ name: "list-add",
57
+ description: "Add a Twitter/X user to a list from the browser UI",
58
+ domain: "x.com",
59
+ strategy: Strategy.COOKIE,
60
+ browser: true,
61
+ args: [
62
+ { name: "list", type: "str", required: true, positional: true },
63
+ { name: "user", type: "str", required: true },
64
+ ],
65
+ columns: ["ok", "selector", "url"],
66
+ func: async (page, kwargs) => {
67
+ const p = page;
68
+ const list = str(kwargs.list);
69
+ const user = str(kwargs.user).replace(/^@/, "");
70
+ const url = list.startsWith("http")
71
+ ? `${list}/members/suggested`
72
+ : `https://x.com/i/lists/${encodeURIComponent(list)}/members/suggested`;
73
+ await p.goto(url, { settleMs: 2500 });
74
+ await p.evaluate(`(() => {
75
+ const input = document.querySelector('input[aria-label*="Search"], input[placeholder*="Search"], input[placeholder*="搜索"]');
76
+ if (input) {
77
+ input.value = ${js(user)};
78
+ input.dispatchEvent(new Event('input', { bubbles: true }));
79
+ }
80
+ })()`);
81
+ await p.wait(1);
82
+ const selector = await clickFirst(p, [
83
+ "[data-testid='UserCell'] button",
84
+ "button[aria-label*='Add']",
85
+ "button[aria-label*='添加']",
86
+ ]);
87
+ return [{ ok: selector !== null, selector, url: await p.url() }];
88
+ },
89
+ });
90
+ cli({
91
+ site: "twitter",
92
+ name: "list-remove",
93
+ description: "Remove a Twitter/X user from a list from the browser UI",
94
+ domain: "x.com",
95
+ strategy: Strategy.COOKIE,
96
+ browser: true,
97
+ args: [
98
+ { name: "list", type: "str", required: true, positional: true },
99
+ { name: "user", type: "str", required: true },
100
+ ],
101
+ columns: ["ok", "selector", "url"],
102
+ func: async (page, kwargs) => {
103
+ const p = page;
104
+ const list = str(kwargs.list);
105
+ const user = str(kwargs.user).replace(/^@/, "");
106
+ const url = list.startsWith("http")
107
+ ? `${list}/members`
108
+ : `https://x.com/i/lists/${encodeURIComponent(list)}/members`;
109
+ await p.goto(url, { settleMs: 2500 });
110
+ await p.evaluate(`(() => {
111
+ const cells = [...document.querySelectorAll('[data-testid="UserCell"]')];
112
+ const cell = cells.find((node) => (node.textContent || '').includes(${js(user)}));
113
+ const button = cell?.querySelector('button');
114
+ if (button) button.click();
115
+ })()`);
116
+ await p.wait(0.8);
117
+ const selector = await clickFirst(p, [
118
+ "button[role='button'][data-testid='confirmationSheetConfirm']",
119
+ "button[aria-label*='Remove']",
120
+ "button[aria-label*='移除']",
121
+ ]);
122
+ return [{ ok: selector !== null, selector, url: await p.url() }];
123
+ },
124
+ });
125
+ //# sourceMappingURL=lists-extra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists-extra.js","sourceRoot":"","sources":["../../../src/adapters/twitter/lists-extra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/adapters/uiverse/components.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ import { cli, Strategy } from "../../registry.js";
5
+ function str(value) {
6
+ return value === undefined || value === null ? "" : String(value);
7
+ }
8
+ function pageOf(page) {
9
+ if (!page)
10
+ throw new Error("browser page required");
11
+ return page;
12
+ }
13
+ function parseInput(input) {
14
+ const raw = str(input).trim();
15
+ if (!raw)
16
+ throw new Error("input is required");
17
+ const path = /^https?:\/\//i.test(raw) ? new URL(raw).pathname : raw;
18
+ const [username, slug] = path.replace(/^\/+|\/+$/g, "").split("/");
19
+ if (!username || !slug)
20
+ throw new Error("expected Uiverse URL or author/slug");
21
+ return { username, slug, url: `https://uiverse.io/${username}/${slug}` };
22
+ }
23
+ async function routeData(page, input) {
24
+ const parsed = parseInput(input);
25
+ await page.goto(parsed.url);
26
+ await page.wait(2);
27
+ const raw = (await page.evaluate(`(async () => {
28
+ const key = "routes/$username.$friendlyId";
29
+ const loaderData = window.__remixContext?.state?.loaderData || {};
30
+ let routeData = loaderData[key];
31
+ if (!routeData?.post?.id) {
32
+ const response = await fetch(location.pathname + "?_data=" + encodeURIComponent(key), {
33
+ credentials: "include",
34
+ headers: { accept: "application/json, text/plain, */*" }
35
+ });
36
+ routeData = await response.json();
37
+ }
38
+ return JSON.stringify(routeData || {});
39
+ })()`));
40
+ return { ...parsed, routeData: JSON.parse(raw) };
41
+ }
42
+ async function rawCode(page, postId) {
43
+ const raw = (await page.evaluate(`(async () => {
44
+ const key = "routes/resource.post.code.$id";
45
+ const response = await fetch("/resource/post/code/${str(postId)}?v=1&_data=" + encodeURIComponent(key), {
46
+ credentials: "include",
47
+ headers: { accept: "application/json, text/plain, */*" }
48
+ });
49
+ return JSON.stringify(await response.json());
50
+ })()`));
51
+ return JSON.parse(raw);
52
+ }
53
+ cli({
54
+ site: "uiverse",
55
+ name: "code",
56
+ description: "Uiverse component code export (HTML or CSS)",
57
+ domain: "uiverse.io",
58
+ strategy: Strategy.PUBLIC,
59
+ browser: true,
60
+ args: [
61
+ {
62
+ name: "input",
63
+ type: "str",
64
+ required: true,
65
+ positional: true,
66
+ description: "Uiverse URL or author/slug",
67
+ },
68
+ {
69
+ name: "target",
70
+ type: "str",
71
+ default: "html",
72
+ choices: ["html", "css"],
73
+ description: "Code target",
74
+ },
75
+ ],
76
+ columns: ["target", "username", "slug", "language", "length"],
77
+ func: async (page, kwargs) => {
78
+ const browser = pageOf(page);
79
+ const detail = await routeData(browser, kwargs.input);
80
+ const post = (detail.routeData.post ?? {});
81
+ const code = await rawCode(browser, post.id);
82
+ const target = str(kwargs.target).toLowerCase() === "css" ? "css" : "html";
83
+ const value = str(target === "css" ? code.css : code.html);
84
+ return {
85
+ target,
86
+ username: detail.username,
87
+ slug: detail.slug,
88
+ url: detail.url,
89
+ language: target,
90
+ length: value.length,
91
+ code: value,
92
+ postId: post.id,
93
+ type: post.type,
94
+ isTailwind: Boolean(post.isTailwind),
95
+ };
96
+ },
97
+ });
98
+ cli({
99
+ site: "uiverse",
100
+ name: "preview",
101
+ description: "Capture a Uiverse component preview screenshot",
102
+ domain: "uiverse.io",
103
+ strategy: Strategy.PUBLIC,
104
+ browser: true,
105
+ args: [
106
+ {
107
+ name: "input",
108
+ type: "str",
109
+ required: true,
110
+ positional: true,
111
+ description: "Uiverse URL or author/slug",
112
+ },
113
+ {
114
+ name: "output",
115
+ type: "str",
116
+ default: "",
117
+ description: "Output PNG path",
118
+ },
119
+ ],
120
+ columns: ["username", "slug", "output", "bytes"],
121
+ func: async (page, kwargs) => {
122
+ const browser = pageOf(page);
123
+ const detail = await routeData(browser, kwargs.input);
124
+ const buffer = await browser.screenshot({ format: "png", fullPage: false });
125
+ const output = str(kwargs.output) ||
126
+ join(tmpdir(), "unicli-uiverse", `${str(detail.username)}-${str(detail.slug)}.png`);
127
+ await mkdir(output.split("/").slice(0, -1).join("/"), { recursive: true });
128
+ await writeFile(output, buffer);
129
+ return {
130
+ username: detail.username,
131
+ slug: detail.slug,
132
+ url: detail.url,
133
+ output,
134
+ bytes: buffer.length,
135
+ };
136
+ },
137
+ });
138
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/adapters/uiverse/components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/wanfang/search.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { cli, Strategy } from "../../registry.js";
2
+ import { intArg, js, str } from "../_shared/browser-tools.js";
3
+ cli({
4
+ site: "wanfang",
5
+ name: "search",
6
+ description: "Search Wanfang papers by keyword",
7
+ domain: "s.wanfangdata.com.cn",
8
+ strategy: Strategy.PUBLIC,
9
+ browser: true,
10
+ args: [
11
+ { name: "query", type: "str", required: true, positional: true },
12
+ { name: "limit", type: "int", default: 10 },
13
+ ],
14
+ columns: ["title", "authors", "source", "url"],
15
+ func: async (page, kwargs) => {
16
+ const p = page;
17
+ const limit = intArg(kwargs.limit, 10, 50);
18
+ await p.goto(`https://s.wanfangdata.com.cn/paper?q=${encodeURIComponent(str(kwargs.query))}`, { settleMs: 2500 });
19
+ const rows = await p.evaluate(`(() => {
20
+ const cards = [...document.querySelectorAll('.normal-list .item, .result-list .item, .paper-item, .record-item')];
21
+ return cards.map((card) => {
22
+ const link = card.querySelector('a[href], span.title a');
23
+ return {
24
+ title: (card.querySelector('span.title, .title, a[href]')?.textContent || '').replace(/\\s+/g, ' ').trim(),
25
+ authors: (card.querySelector('span.authors, .authors, .author')?.textContent || '').replace(/\\s+/g, ' ').trim(),
26
+ source: (card.querySelector('.source, .journal, .info')?.textContent || '').replace(/\\s+/g, ' ').trim(),
27
+ url: link ? new URL(link.getAttribute('href') || '', location.href).href : ''
28
+ };
29
+ }).filter((row) => row.title).slice(0, ${js(limit)});
30
+ })()`);
31
+ return Array.isArray(rows) ? rows : [];
32
+ },
33
+ });
34
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/wanfang/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAE9D,GAAG,CAAC;IACF,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,kCAAkC;IAC/C,MAAM,EAAE,sBAAsB;IAC9B,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;QAChE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;KAC5C;IACD,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;IAC9C,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,IAAa,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,IAAI,CACV,wCAAwC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAC/E,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC;;;;;;;;;;+CAUa,EAAE,CAAC,KAAK,CAAC;SAC/C,CAAC,CAAC;QACP,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAkC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=drafts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../../src/adapters/weixin/drafts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { cli, Strategy } from "../../registry.js";
2
+ import { intArg, js, str } from "../_shared/browser-tools.js";
3
+ const DRAFTS = "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=list";
4
+ const NEW_DRAFT = "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10";
5
+ cli({
6
+ site: "weixin",
7
+ name: "drafts",
8
+ description: "List WeChat Official Account article drafts",
9
+ domain: "mp.weixin.qq.com",
10
+ strategy: Strategy.COOKIE,
11
+ browser: true,
12
+ args: [{ name: "limit", type: "int", default: 20 }],
13
+ columns: ["title", "updated", "url"],
14
+ func: async (page, kwargs) => {
15
+ const p = page;
16
+ const limit = intArg(kwargs.limit, 20, 100);
17
+ await p.goto(DRAFTS, { settleMs: 3000 });
18
+ const rows = await p.evaluate(`(() => {
19
+ const cards = [...document.querySelectorAll('.weui-desktop-card, .appmsg, [class*="draft"], li')];
20
+ return cards.map((card) => {
21
+ const link = card.querySelector('a[href]');
22
+ return {
23
+ title: (card.querySelector('[class*="title"], .appmsg_title, a[href]')?.textContent || '').replace(/\\s+/g, ' ').trim(),
24
+ updated: (card.querySelector('[class*="time"], [class*="date"]')?.textContent || '').replace(/\\s+/g, ' ').trim(),
25
+ url: link ? new URL(link.getAttribute('href') || '', location.href).href : ''
26
+ };
27
+ }).filter((row) => row.title).slice(0, ${js(limit)});
28
+ })()`);
29
+ return Array.isArray(rows) ? rows : [];
30
+ },
31
+ });
32
+ cli({
33
+ site: "weixin",
34
+ name: "create-draft",
35
+ description: "Create a WeChat Official Account article draft",
36
+ domain: "mp.weixin.qq.com",
37
+ strategy: Strategy.COOKIE,
38
+ browser: true,
39
+ args: [
40
+ { name: "content", type: "str", required: true, positional: true },
41
+ { name: "title", type: "str", required: true },
42
+ { name: "author", type: "str", required: false },
43
+ { name: "summary", type: "str", required: false },
44
+ { name: "cover_image", type: "str", required: false },
45
+ ],
46
+ columns: ["ok", "url"],
47
+ func: async (page, kwargs) => {
48
+ const p = page;
49
+ await p.goto(NEW_DRAFT, { settleMs: 3000 });
50
+ await p.evaluate(`(() => {
51
+ const set = (selector, value) => {
52
+ const node = document.querySelector(selector);
53
+ if (!node) return false;
54
+ node.focus?.();
55
+ if ('value' in node) node.value = value;
56
+ else node.textContent = value;
57
+ node.dispatchEvent(new Event('input', { bubbles: true }));
58
+ node.dispatchEvent(new Event('change', { bubbles: true }));
59
+ return true;
60
+ };
61
+ set('input[placeholder*="标题"], #title, [name="title"]', ${js(str(kwargs.title))});
62
+ set('input[placeholder*="作者"], [name="author"]', ${js(str(kwargs.author))});
63
+ set('textarea[placeholder*="摘要"], [name="digest"]', ${js(str(kwargs.summary))});
64
+ set('[contenteditable="true"], iframe body, textarea', ${js(str(kwargs.content))});
65
+ })()`);
66
+ return [{ ok: true, url: await p.url() }];
67
+ },
68
+ });
69
+ //# sourceMappingURL=drafts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../src/adapters/weixin/drafts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-outline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-outline.d.ts","sourceRoot":"","sources":["../../../src/adapters/weread/ai-outline.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { cli, Strategy } from "../../registry.js";
2
+ import { str, visibleText } from "../_shared/browser-tools.js";
3
+ cli({
4
+ site: "weread",
5
+ name: "ai-outline",
6
+ description: "Extract WeRead AI outline or visible book outline",
7
+ domain: "weread.qq.com",
8
+ strategy: Strategy.COOKIE,
9
+ browser: true,
10
+ args: [{ name: "bookId", type: "str", required: true, positional: true }],
11
+ columns: ["bookId", "outline", "url"],
12
+ func: async (page, kwargs) => {
13
+ const p = page;
14
+ const bookId = str(kwargs.bookId);
15
+ await p.goto(`https://weread.qq.com/web/reader/${encodeURIComponent(bookId)}`, {
16
+ settleMs: 2500,
17
+ });
18
+ await p.evaluate(`(() => {
19
+ const candidates = [...document.querySelectorAll('button, a, span')];
20
+ const node = candidates.find((el) => /AI|大纲|目录|总结/.test(el.textContent || ''));
21
+ if (node) node.click();
22
+ })()`);
23
+ await p.wait(1);
24
+ const text = await visibleText(p);
25
+ return [{ bookId, outline: text.slice(0, 8000), url: await p.url() }];
26
+ },
27
+ });
28
+ //# sourceMappingURL=ai-outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-outline.js","sourceRoot":"","sources":["../../../src/adapters/weread/ai-outline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,GAAG,CAAC;IACF,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,mDAAmD;IAChE,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACzE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;IACrC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,IAAa,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,IAAI,CACV,oCAAoC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAChE;YACE,QAAQ,EAAE,IAAI;SACf,CACF,CAAC;QACF,MAAM,CAAC,CAAC,QAAQ,CAAC;;;;SAIZ,CAAC,CAAC;QACP,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/adapters/xiaoyuzhou/media.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { basename, join } from "node:path";
4
+ import { cli, Strategy } from "../../registry.js";
5
+ import { str } from "../_shared/browser-tools.js";
6
+ async function readCredentials() {
7
+ if (process.env.XIAOYUZHOU_ACCESS_TOKEN) {
8
+ return {
9
+ access_token: process.env.XIAOYUZHOU_ACCESS_TOKEN,
10
+ device_id: process.env.XIAOYUZHOU_DEVICE_ID,
11
+ };
12
+ }
13
+ try {
14
+ const { readFile } = await import("node:fs/promises");
15
+ const text = await readFile(join(homedir(), ".unicli", "xiaoyuzhou.json"), "utf8");
16
+ return JSON.parse(text);
17
+ }
18
+ catch {
19
+ return {};
20
+ }
21
+ }
22
+ async function apiPost(path, body) {
23
+ const credentials = await readCredentials();
24
+ const headers = {
25
+ "content-type": "application/json",
26
+ "user-agent": "Mozilla/5.0 (compatible; Uni-CLI)",
27
+ };
28
+ if (credentials.access_token) {
29
+ headers.authorization = `Bearer ${credentials.access_token}`;
30
+ }
31
+ if (credentials.device_id) {
32
+ headers["x-jike-device-id"] = credentials.device_id;
33
+ }
34
+ const response = await fetch(`https://api.xiaoyuzhoufm.com${path}`, {
35
+ method: "POST",
36
+ headers,
37
+ body: JSON.stringify(body),
38
+ });
39
+ if (!response.ok) {
40
+ throw new Error(`xiaoyuzhou request failed: HTTP ${response.status}`);
41
+ }
42
+ return (await response.json());
43
+ }
44
+ async function episode(eid) {
45
+ const data = await apiPost("/v1/episode/get", {
46
+ eid,
47
+ });
48
+ return data.data ?? {};
49
+ }
50
+ function audioUrl(item) {
51
+ return (item.media?.source?.url ?? item.enclosure?.url ?? item.audio?.url ?? "");
52
+ }
53
+ cli({
54
+ site: "xiaoyuzhou",
55
+ name: "download",
56
+ description: "Download Xiaoyuzhou episode audio",
57
+ domain: "xiaoyuzhou.fm",
58
+ strategy: Strategy.COOKIE,
59
+ args: [
60
+ { name: "eid", type: "str", required: true, positional: true },
61
+ { name: "output", type: "str", default: "./xiaoyuzhou" },
62
+ ],
63
+ columns: ["title", "path", "bytes"],
64
+ func: async (_page, kwargs) => {
65
+ const eid = str(kwargs.eid);
66
+ const item = await episode(eid);
67
+ const url = audioUrl(item);
68
+ if (!url)
69
+ throw new Error("Episode audio URL not found");
70
+ const output = str(kwargs.output, "./xiaoyuzhou");
71
+ await mkdir(output, { recursive: true });
72
+ const response = await fetch(url);
73
+ const bytes = Buffer.from(await response.arrayBuffer());
74
+ const name = basename(new URL(url).pathname) || `${eid}.mp3`;
75
+ const path = join(output, name);
76
+ await writeFile(path, bytes);
77
+ return [{ title: item.title ?? "", path, bytes: bytes.length }];
78
+ },
79
+ });
80
+ cli({
81
+ site: "xiaoyuzhou",
82
+ name: "transcript",
83
+ description: "Download Xiaoyuzhou transcript JSON and extracted text",
84
+ domain: "xiaoyuzhou.fm",
85
+ strategy: Strategy.COOKIE,
86
+ args: [
87
+ { name: "eid", type: "str", required: true, positional: true },
88
+ { name: "output", type: "str", default: "./xiaoyuzhou-transcripts" },
89
+ ],
90
+ columns: ["eid", "path", "text"],
91
+ func: async (_page, kwargs) => {
92
+ const eid = str(kwargs.eid);
93
+ const output = str(kwargs.output, "./xiaoyuzhou-transcripts");
94
+ const data = await apiPost("/v1/episode/transcript", { eid });
95
+ await mkdir(output, { recursive: true });
96
+ const path = join(output, `${eid}.json`);
97
+ await writeFile(path, JSON.stringify(data, null, 2));
98
+ const text = JSON.stringify(data)
99
+ .replace(/[{}"\\[\\],:]/g, " ")
100
+ .replace(/\s+/g, " ")
101
+ .trim();
102
+ return [{ eid, path, text: text.slice(0, 8000) }];
103
+ },
104
+ });
105
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/adapters/xiaoyuzhou/media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extra.d.ts","sourceRoot":"","sources":["../../../src/adapters/xueqiu/extra.ts"],"names":[],"mappings":""}