@zenalexa/unicli 0.219.0 → 0.220.0

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 (430) hide show
  1. package/AGENTS.md +9 -9
  2. package/README.md +55 -249
  3. package/README.zh-CN.md +55 -249
  4. package/dist/adapters/1point3acres/forum.d.ts +58 -0
  5. package/dist/adapters/1point3acres/forum.d.ts.map +1 -0
  6. package/dist/adapters/1point3acres/forum.js +708 -0
  7. package/dist/adapters/1point3acres/forum.js.map +1 -0
  8. package/dist/adapters/aibase/news.d.ts +21 -0
  9. package/dist/adapters/aibase/news.d.ts.map +1 -0
  10. package/dist/adapters/aibase/news.js +96 -0
  11. package/dist/adapters/aibase/news.js.map +1 -0
  12. package/dist/adapters/arxiv/papers.d.ts +27 -0
  13. package/dist/adapters/arxiv/papers.d.ts.map +1 -0
  14. package/dist/adapters/arxiv/papers.js +193 -0
  15. package/dist/adapters/arxiv/papers.js.map +1 -0
  16. package/dist/adapters/bbc/topic.d.ts +24 -0
  17. package/dist/adapters/bbc/topic.d.ts.map +1 -0
  18. package/dist/adapters/bbc/topic.js +122 -0
  19. package/dist/adapters/bbc/topic.js.map +1 -0
  20. package/dist/adapters/chatgpt/web.d.ts +24 -0
  21. package/dist/adapters/chatgpt/web.d.ts.map +1 -0
  22. package/dist/adapters/chatgpt/web.js +242 -0
  23. package/dist/adapters/chatgpt/web.js.map +1 -0
  24. package/dist/adapters/claude/web.d.ts +24 -0
  25. package/dist/adapters/claude/web.d.ts.map +1 -0
  26. package/dist/adapters/claude/web.js +575 -0
  27. package/dist/adapters/claude/web.js.map +1 -0
  28. package/dist/adapters/codex/projects.d.ts +27 -0
  29. package/dist/adapters/codex/projects.d.ts.map +1 -0
  30. package/dist/adapters/codex/projects.js +147 -0
  31. package/dist/adapters/codex/projects.js.map +1 -0
  32. package/dist/adapters/coingecko/markets.d.ts +19 -0
  33. package/dist/adapters/coingecko/markets.d.ts.map +1 -0
  34. package/dist/adapters/coingecko/markets.js +474 -0
  35. package/dist/adapters/coingecko/markets.js.map +1 -0
  36. package/dist/adapters/coupang/product.d.ts +27 -0
  37. package/dist/adapters/coupang/product.d.ts.map +1 -0
  38. package/dist/adapters/coupang/product.js +211 -0
  39. package/dist/adapters/coupang/product.js.map +1 -0
  40. package/dist/adapters/crates/registry.d.ts +44 -0
  41. package/dist/adapters/crates/registry.d.ts.map +1 -0
  42. package/dist/adapters/crates/registry.js +186 -0
  43. package/dist/adapters/crates/registry.js.map +1 -0
  44. package/dist/adapters/ctrip/travel.d.ts +83 -0
  45. package/dist/adapters/ctrip/travel.d.ts.map +1 -0
  46. package/dist/adapters/ctrip/travel.js +630 -0
  47. package/dist/adapters/ctrip/travel.js.map +1 -0
  48. package/dist/adapters/dblp/publications.d.ts +41 -0
  49. package/dist/adapters/dblp/publications.d.ts.map +1 -0
  50. package/dist/adapters/dblp/publications.js +409 -0
  51. package/dist/adapters/dblp/publications.js.map +1 -0
  52. package/dist/adapters/deepseek/web.d.ts +1 -1
  53. package/dist/adapters/deepseek/web.d.ts.map +1 -1
  54. package/dist/adapters/deepseek/web.js +66 -1
  55. package/dist/adapters/deepseek/web.js.map +1 -1
  56. package/dist/adapters/defillama/protocols.d.ts +13 -0
  57. package/dist/adapters/defillama/protocols.d.ts.map +1 -0
  58. package/dist/adapters/defillama/protocols.js +218 -0
  59. package/dist/adapters/defillama/protocols.js.map +1 -0
  60. package/dist/adapters/devto/read.d.ts +26 -0
  61. package/dist/adapters/devto/read.d.ts.map +1 -0
  62. package/dist/adapters/devto/read.js +110 -0
  63. package/dist/adapters/devto/read.js.map +1 -0
  64. package/dist/adapters/dianping/shop.d.ts +38 -0
  65. package/dist/adapters/dianping/shop.d.ts.map +1 -0
  66. package/dist/adapters/dianping/shop.js +194 -0
  67. package/dist/adapters/dianping/shop.js.map +1 -0
  68. package/dist/adapters/dockerhub/registry.d.ts +36 -0
  69. package/dist/adapters/dockerhub/registry.d.ts.map +1 -0
  70. package/dist/adapters/dockerhub/registry.js +172 -0
  71. package/dist/adapters/dockerhub/registry.js.map +1 -0
  72. package/dist/adapters/endoflife/product.d.ts +11 -0
  73. package/dist/adapters/endoflife/product.d.ts.map +1 -0
  74. package/dist/adapters/endoflife/product.js +113 -0
  75. package/dist/adapters/endoflife/product.js.map +1 -0
  76. package/dist/adapters/facebook/marketplace-extra.d.ts +9 -0
  77. package/dist/adapters/facebook/marketplace-extra.d.ts.map +1 -0
  78. package/dist/adapters/facebook/marketplace-extra.js +170 -0
  79. package/dist/adapters/facebook/marketplace-extra.js.map +1 -0
  80. package/dist/adapters/flathub/apps.d.ts +17 -0
  81. package/dist/adapters/flathub/apps.d.ts.map +1 -0
  82. package/dist/adapters/flathub/apps.js +220 -0
  83. package/dist/adapters/flathub/apps.js.map +1 -0
  84. package/dist/adapters/goproxy/module.d.ts +24 -0
  85. package/dist/adapters/goproxy/module.d.ts.map +1 -0
  86. package/dist/adapters/goproxy/module.js +221 -0
  87. package/dist/adapters/goproxy/module.js.map +1 -0
  88. package/dist/adapters/grok/web.d.ts +29 -0
  89. package/dist/adapters/grok/web.d.ts.map +1 -0
  90. package/dist/adapters/grok/web.js +553 -0
  91. package/dist/adapters/grok/web.js.map +1 -0
  92. package/dist/adapters/hackernews/read.d.ts +31 -0
  93. package/dist/adapters/hackernews/read.d.ts.map +1 -0
  94. package/dist/adapters/hackernews/read.js +201 -0
  95. package/dist/adapters/hackernews/read.js.map +1 -0
  96. package/dist/adapters/hf/paper.d.ts +22 -0
  97. package/dist/adapters/hf/paper.d.ts.map +1 -0
  98. package/dist/adapters/hf/paper.js +112 -0
  99. package/dist/adapters/hf/paper.js.map +1 -0
  100. package/dist/adapters/homebrew/packages.d.ts +52 -0
  101. package/dist/adapters/homebrew/packages.d.ts.map +1 -0
  102. package/dist/adapters/homebrew/packages.js +240 -0
  103. package/dist/adapters/homebrew/packages.js.map +1 -0
  104. package/dist/adapters/indeed/jobs.d.ts +38 -0
  105. package/dist/adapters/indeed/jobs.d.ts.map +1 -0
  106. package/dist/adapters/indeed/jobs.js +300 -0
  107. package/dist/adapters/indeed/jobs.js.map +1 -0
  108. package/dist/adapters/instagram/collections.d.ts +9 -0
  109. package/dist/adapters/instagram/collections.d.ts.map +1 -0
  110. package/dist/adapters/instagram/collections.js +174 -0
  111. package/dist/adapters/instagram/collections.js.map +1 -0
  112. package/dist/adapters/lichess/players.d.ts +46 -0
  113. package/dist/adapters/lichess/players.d.ts.map +1 -0
  114. package/dist/adapters/lichess/players.js +221 -0
  115. package/dist/adapters/lichess/players.js.map +1 -0
  116. package/dist/adapters/lobsters/read-domain.d.ts +35 -0
  117. package/dist/adapters/lobsters/read-domain.d.ts.map +1 -0
  118. package/dist/adapters/lobsters/read-domain.js +306 -0
  119. package/dist/adapters/lobsters/read-domain.js.map +1 -0
  120. package/dist/adapters/maven/artifact.d.ts +30 -0
  121. package/dist/adapters/maven/artifact.d.ts.map +1 -0
  122. package/dist/adapters/maven/artifact.js +121 -0
  123. package/dist/adapters/maven/artifact.js.map +1 -0
  124. package/dist/adapters/mdn/search.d.ts +11 -0
  125. package/dist/adapters/mdn/search.d.ts.map +1 -0
  126. package/dist/adapters/mdn/search.js +115 -0
  127. package/dist/adapters/mdn/search.js.map +1 -0
  128. package/dist/adapters/medium/tag.d.ts +15 -0
  129. package/dist/adapters/medium/tag.d.ts.map +1 -0
  130. package/dist/adapters/medium/tag.js +148 -0
  131. package/dist/adapters/medium/tag.js.map +1 -0
  132. package/dist/adapters/npm/package.d.ts +32 -0
  133. package/dist/adapters/npm/package.d.ts.map +1 -0
  134. package/dist/adapters/npm/package.js +141 -0
  135. package/dist/adapters/npm/package.js.map +1 -0
  136. package/dist/adapters/nuget/package.d.ts +34 -0
  137. package/dist/adapters/nuget/package.d.ts.map +1 -0
  138. package/dist/adapters/nuget/package.js +135 -0
  139. package/dist/adapters/nuget/package.js.map +1 -0
  140. package/dist/adapters/nvd/cve.d.ts +42 -0
  141. package/dist/adapters/nvd/cve.d.ts.map +1 -0
  142. package/dist/adapters/nvd/cve.js +132 -0
  143. package/dist/adapters/nvd/cve.js.map +1 -0
  144. package/dist/adapters/oeis/sequences.d.ts +14 -0
  145. package/dist/adapters/oeis/sequences.d.ts.map +1 -0
  146. package/dist/adapters/oeis/sequences.js +219 -0
  147. package/dist/adapters/oeis/sequences.js.map +1 -0
  148. package/dist/adapters/openalex/works.d.ts +43 -0
  149. package/dist/adapters/openalex/works.d.ts.map +1 -0
  150. package/dist/adapters/openalex/works.js +267 -0
  151. package/dist/adapters/openalex/works.js.map +1 -0
  152. package/dist/adapters/openfda/records.d.ts +18 -0
  153. package/dist/adapters/openfda/records.d.ts.map +1 -0
  154. package/dist/adapters/openfda/records.js +209 -0
  155. package/dist/adapters/openfda/records.js.map +1 -0
  156. package/dist/adapters/openreview/papers.d.ts +34 -0
  157. package/dist/adapters/openreview/papers.d.ts.map +1 -0
  158. package/dist/adapters/openreview/papers.js +463 -0
  159. package/dist/adapters/openreview/papers.js.map +1 -0
  160. package/dist/adapters/osv/security.d.ts +36 -0
  161. package/dist/adapters/osv/security.d.ts.map +1 -0
  162. package/dist/adapters/osv/security.js +247 -0
  163. package/dist/adapters/osv/security.js.map +1 -0
  164. package/dist/adapters/packagist/package.d.ts +31 -0
  165. package/dist/adapters/packagist/package.d.ts.map +1 -0
  166. package/dist/adapters/packagist/package.js +108 -0
  167. package/dist/adapters/packagist/package.js.map +1 -0
  168. package/dist/adapters/pubmed/articles.d.ts +31 -0
  169. package/dist/adapters/pubmed/articles.d.ts.map +1 -0
  170. package/dist/adapters/pubmed/articles.js +385 -0
  171. package/dist/adapters/pubmed/articles.js.map +1 -0
  172. package/dist/adapters/pypi/package.d.ts +38 -0
  173. package/dist/adapters/pypi/package.d.ts.map +1 -0
  174. package/dist/adapters/pypi/package.js +235 -0
  175. package/dist/adapters/pypi/package.js.map +1 -0
  176. package/dist/adapters/qwen/web.d.ts +26 -0
  177. package/dist/adapters/qwen/web.d.ts.map +1 -0
  178. package/dist/adapters/qwen/web.js +672 -0
  179. package/dist/adapters/qwen/web.js.map +1 -0
  180. package/dist/adapters/reddit/account.d.ts +12 -0
  181. package/dist/adapters/reddit/account.d.ts.map +1 -0
  182. package/dist/adapters/reddit/account.js +409 -0
  183. package/dist/adapters/reddit/account.js.map +1 -0
  184. package/dist/adapters/rednote/web.d.ts +30 -0
  185. package/dist/adapters/rednote/web.d.ts.map +1 -0
  186. package/dist/adapters/rednote/web.js +858 -0
  187. package/dist/adapters/rednote/web.js.map +1 -0
  188. package/dist/adapters/rest-countries/countries.d.ts +14 -0
  189. package/dist/adapters/rest-countries/countries.d.ts.map +1 -0
  190. package/dist/adapters/rest-countries/countries.js +231 -0
  191. package/dist/adapters/rest-countries/countries.js.map +1 -0
  192. package/dist/adapters/reuters/article-detail.d.ts +37 -0
  193. package/dist/adapters/reuters/article-detail.d.ts.map +1 -0
  194. package/dist/adapters/reuters/article-detail.js +139 -0
  195. package/dist/adapters/reuters/article-detail.js.map +1 -0
  196. package/dist/adapters/rfc/rfc.d.ts +11 -0
  197. package/dist/adapters/rfc/rfc.d.ts.map +1 -0
  198. package/dist/adapters/rfc/rfc.js +121 -0
  199. package/dist/adapters/rfc/rfc.js.map +1 -0
  200. package/dist/adapters/rubygems/gem.d.ts +26 -0
  201. package/dist/adapters/rubygems/gem.d.ts.map +1 -0
  202. package/dist/adapters/rubygems/gem.js +96 -0
  203. package/dist/adapters/rubygems/gem.js.map +1 -0
  204. package/dist/adapters/stackoverflow/questions.d.ts +79 -0
  205. package/dist/adapters/stackoverflow/questions.d.ts.map +1 -0
  206. package/dist/adapters/stackoverflow/questions.js +504 -0
  207. package/dist/adapters/stackoverflow/questions.js.map +1 -0
  208. package/dist/adapters/steam/app.d.ts +39 -0
  209. package/dist/adapters/steam/app.d.ts.map +1 -0
  210. package/dist/adapters/steam/app.js +165 -0
  211. package/dist/adapters/steam/app.js.map +1 -0
  212. package/dist/adapters/tiktok/creator-videos.d.ts +52 -0
  213. package/dist/adapters/tiktok/creator-videos.d.ts.map +1 -0
  214. package/dist/adapters/tiktok/creator-videos.js +267 -0
  215. package/dist/adapters/tiktok/creator-videos.js.map +1 -0
  216. package/dist/adapters/tvmaze/shows.d.ts +13 -0
  217. package/dist/adapters/tvmaze/shows.d.ts.map +1 -0
  218. package/dist/adapters/tvmaze/shows.js +240 -0
  219. package/dist/adapters/tvmaze/shows.js.map +1 -0
  220. package/dist/adapters/twitter/bookmark-folders.d.ts +33 -0
  221. package/dist/adapters/twitter/bookmark-folders.d.ts.map +1 -0
  222. package/dist/adapters/twitter/bookmark-folders.js +290 -0
  223. package/dist/adapters/twitter/bookmark-folders.js.map +1 -0
  224. package/dist/adapters/twitter/quote.d.ts +18 -0
  225. package/dist/adapters/twitter/quote.d.ts.map +1 -0
  226. package/dist/adapters/twitter/quote.js +285 -0
  227. package/dist/adapters/twitter/quote.js.map +1 -0
  228. package/dist/adapters/twitter/tweet-actions.d.ts +12 -0
  229. package/dist/adapters/twitter/tweet-actions.d.ts.map +1 -0
  230. package/dist/adapters/twitter/tweet-actions.js +145 -0
  231. package/dist/adapters/twitter/tweet-actions.js.map +1 -0
  232. package/dist/adapters/twitter/tweet-url.d.ts +15 -0
  233. package/dist/adapters/twitter/tweet-url.d.ts.map +1 -0
  234. package/dist/adapters/twitter/tweet-url.js +57 -0
  235. package/dist/adapters/twitter/tweet-url.js.map +1 -0
  236. package/dist/adapters/uisdc/news.d.ts +22 -0
  237. package/dist/adapters/uisdc/news.d.ts.map +1 -0
  238. package/dist/adapters/uisdc/news.js +91 -0
  239. package/dist/adapters/uisdc/news.js.map +1 -0
  240. package/dist/adapters/weibo/favorites-publish.d.ts +28 -0
  241. package/dist/adapters/weibo/favorites-publish.d.ts.map +1 -0
  242. package/dist/adapters/weibo/favorites-publish.js +356 -0
  243. package/dist/adapters/weibo/favorites-publish.js.map +1 -0
  244. package/dist/adapters/wikidata/entities.d.ts +15 -0
  245. package/dist/adapters/wikidata/entities.d.ts.map +1 -0
  246. package/dist/adapters/wikidata/entities.js +219 -0
  247. package/dist/adapters/wikidata/entities.js.map +1 -0
  248. package/dist/adapters/wikipedia/page.d.ts +21 -0
  249. package/dist/adapters/wikipedia/page.d.ts.map +1 -0
  250. package/dist/adapters/wikipedia/page.js +116 -0
  251. package/dist/adapters/wikipedia/page.js.map +1 -0
  252. package/dist/adapters/wttr/weather.d.ts +12 -0
  253. package/dist/adapters/wttr/weather.d.ts.map +1 -0
  254. package/dist/adapters/wttr/weather.js +207 -0
  255. package/dist/adapters/wttr/weather.js.map +1 -0
  256. package/dist/adapters/xianyu/publish.d.ts +31 -0
  257. package/dist/adapters/xianyu/publish.d.ts.map +1 -0
  258. package/dist/adapters/xianyu/publish.js +349 -0
  259. package/dist/adapters/xianyu/publish.js.map +1 -0
  260. package/dist/adapters/xiaohongshu/user-helpers.d.ts +2 -2
  261. package/dist/adapters/xiaohongshu/user-helpers.d.ts.map +1 -1
  262. package/dist/adapters/xiaohongshu/user-helpers.js +5 -4
  263. package/dist/adapters/xiaohongshu/user-helpers.js.map +1 -1
  264. package/dist/adapters/yuanbao/web.d.ts +27 -0
  265. package/dist/adapters/yuanbao/web.d.ts.map +1 -0
  266. package/dist/adapters/yuanbao/web.js +365 -0
  267. package/dist/adapters/yuanbao/web.js.map +1 -0
  268. package/dist/adapters/zhihu/collection.d.ts +33 -0
  269. package/dist/adapters/zhihu/collection.d.ts.map +1 -0
  270. package/dist/adapters/zhihu/collection.js +185 -0
  271. package/dist/adapters/zhihu/collection.js.map +1 -0
  272. package/dist/adapters/zlibrary/web.d.ts +19 -0
  273. package/dist/adapters/zlibrary/web.d.ts.map +1 -0
  274. package/dist/adapters/zlibrary/web.js +153 -0
  275. package/dist/adapters/zlibrary/web.js.map +1 -0
  276. package/dist/browser/daemon-client.js +2 -2
  277. package/dist/browser/daemon-client.js.map +1 -1
  278. package/dist/discovery/macos-dynamic.d.ts.map +1 -1
  279. package/dist/discovery/macos-dynamic.js +17 -3
  280. package/dist/discovery/macos-dynamic.js.map +1 -1
  281. package/dist/manifest-compact.txt +10 -10
  282. package/dist/manifest-search.json +1 -1
  283. package/dist/manifest.json +5130 -112
  284. package/dist/transport/refs.d.ts +5 -3
  285. package/dist/transport/refs.d.ts.map +1 -1
  286. package/dist/transport/refs.js +8 -1
  287. package/dist/transport/refs.js.map +1 -1
  288. package/dist/transport/sidecar-binary.d.ts +7 -0
  289. package/dist/transport/sidecar-binary.d.ts.map +1 -1
  290. package/dist/transport/sidecar-binary.js +28 -8
  291. package/dist/transport/sidecar-binary.js.map +1 -1
  292. package/package.json +4 -3
  293. package/server.json +3 -3
  294. package/skills/unicli/SKILL.md +1 -1
  295. package/skills/unicli-claude-code/SKILL.md +1 -1
  296. package/skills/unicli-hermes/SKILL.md +1 -1
  297. package/src/adapters/1point3acres/forum.test.ts +300 -0
  298. package/src/adapters/1point3acres/forum.ts +852 -0
  299. package/src/adapters/aibase/news.test.ts +42 -0
  300. package/src/adapters/aibase/news.ts +118 -0
  301. package/src/adapters/arxiv/papers.test.ts +59 -0
  302. package/src/adapters/arxiv/papers.ts +226 -0
  303. package/src/adapters/bbc/topic.test.ts +52 -0
  304. package/src/adapters/bbc/topic.ts +149 -0
  305. package/src/adapters/chatgpt/web.test.ts +121 -0
  306. package/src/adapters/chatgpt/web.ts +286 -0
  307. package/src/adapters/claude/web.test.ts +206 -0
  308. package/src/adapters/claude/web.ts +684 -0
  309. package/src/adapters/codex/projects.test.ts +77 -0
  310. package/src/adapters/codex/projects.ts +178 -0
  311. package/src/adapters/coingecko/markets.test.ts +156 -0
  312. package/src/adapters/coingecko/markets.ts +574 -0
  313. package/src/adapters/coupang/product.test.ts +111 -0
  314. package/src/adapters/coupang/product.ts +256 -0
  315. package/src/adapters/crates/registry.test.ts +89 -0
  316. package/src/adapters/crates/registry.ts +247 -0
  317. package/src/adapters/ctrip/travel.test.ts +359 -0
  318. package/src/adapters/ctrip/travel.ts +792 -0
  319. package/src/adapters/dblp/publications.test.ts +123 -0
  320. package/src/adapters/dblp/publications.ts +494 -0
  321. package/src/adapters/deepseek/web.test.ts +69 -0
  322. package/src/adapters/deepseek/web.ts +78 -1
  323. package/src/adapters/defillama/protocols.test.ts +75 -0
  324. package/src/adapters/defillama/protocols.ts +253 -0
  325. package/src/adapters/devto/read.test.ts +49 -0
  326. package/src/adapters/devto/read.ts +145 -0
  327. package/src/adapters/dianping/shop.test.ts +134 -0
  328. package/src/adapters/dianping/shop.ts +261 -0
  329. package/src/adapters/dockerhub/registry.test.ts +97 -0
  330. package/src/adapters/dockerhub/registry.ts +223 -0
  331. package/src/adapters/endoflife/product.test.ts +50 -0
  332. package/src/adapters/endoflife/product.ts +128 -0
  333. package/src/adapters/facebook/marketplace-extra.test.ts +132 -0
  334. package/src/adapters/facebook/marketplace-extra.ts +213 -0
  335. package/src/adapters/flathub/apps.test.ts +85 -0
  336. package/src/adapters/flathub/apps.ts +254 -0
  337. package/src/adapters/goproxy/module.test.ts +72 -0
  338. package/src/adapters/goproxy/module.ts +258 -0
  339. package/src/adapters/grok/web.test.ts +181 -0
  340. package/src/adapters/grok/web.ts +640 -0
  341. package/src/adapters/hackernews/read.test.ts +68 -0
  342. package/src/adapters/hackernews/read.ts +265 -0
  343. package/src/adapters/hf/paper.test.ts +48 -0
  344. package/src/adapters/hf/paper.ts +138 -0
  345. package/src/adapters/homebrew/packages.test.ts +109 -0
  346. package/src/adapters/homebrew/packages.ts +304 -0
  347. package/src/adapters/indeed/jobs.test.ts +230 -0
  348. package/src/adapters/indeed/jobs.ts +375 -0
  349. package/src/adapters/instagram/collections.test.ts +94 -0
  350. package/src/adapters/instagram/collections.ts +206 -0
  351. package/src/adapters/lichess/players.test.ts +99 -0
  352. package/src/adapters/lichess/players.ts +277 -0
  353. package/src/adapters/lobsters/read-domain.test.ts +121 -0
  354. package/src/adapters/lobsters/read-domain.ts +400 -0
  355. package/src/adapters/maven/artifact.test.ts +67 -0
  356. package/src/adapters/maven/artifact.ts +155 -0
  357. package/src/adapters/mdn/search.test.ts +39 -0
  358. package/src/adapters/mdn/search.ts +133 -0
  359. package/src/adapters/medium/tag.test.ts +64 -0
  360. package/src/adapters/medium/tag.ts +164 -0
  361. package/src/adapters/npm/package.test.ts +53 -0
  362. package/src/adapters/npm/package.ts +177 -0
  363. package/src/adapters/nuget/package.test.ts +102 -0
  364. package/src/adapters/nuget/package.ts +193 -0
  365. package/src/adapters/nvd/cve.test.ts +66 -0
  366. package/src/adapters/nvd/cve.ts +182 -0
  367. package/src/adapters/oeis/sequences.test.ts +71 -0
  368. package/src/adapters/oeis/sequences.ts +234 -0
  369. package/src/adapters/openalex/works.test.ts +99 -0
  370. package/src/adapters/openalex/works.ts +319 -0
  371. package/src/adapters/openfda/records.test.ts +90 -0
  372. package/src/adapters/openfda/records.ts +239 -0
  373. package/src/adapters/openreview/papers.test.ts +139 -0
  374. package/src/adapters/openreview/papers.ts +560 -0
  375. package/src/adapters/osv/security.test.ts +91 -0
  376. package/src/adapters/osv/security.ts +298 -0
  377. package/src/adapters/packagist/package.test.ts +62 -0
  378. package/src/adapters/packagist/package.ts +146 -0
  379. package/src/adapters/pubmed/articles.test.ts +96 -0
  380. package/src/adapters/pubmed/articles.ts +497 -0
  381. package/src/adapters/pypi/package.test.ts +131 -0
  382. package/src/adapters/pypi/package.ts +297 -0
  383. package/src/adapters/qwen/web.test.ts +176 -0
  384. package/src/adapters/qwen/web.ts +758 -0
  385. package/src/adapters/reddit/account.test.ts +56 -0
  386. package/src/adapters/reddit/account.ts +493 -0
  387. package/src/adapters/rednote/web.test.ts +354 -0
  388. package/src/adapters/rednote/web.ts +968 -0
  389. package/src/adapters/rest-countries/countries.test.ts +80 -0
  390. package/src/adapters/rest-countries/countries.ts +271 -0
  391. package/src/adapters/reuters/article-detail.test.ts +65 -0
  392. package/src/adapters/reuters/article-detail.ts +186 -0
  393. package/src/adapters/rfc/rfc.test.ts +37 -0
  394. package/src/adapters/rfc/rfc.ts +133 -0
  395. package/src/adapters/rubygems/gem.test.ts +43 -0
  396. package/src/adapters/rubygems/gem.ts +126 -0
  397. package/src/adapters/stackoverflow/questions.test.ts +207 -0
  398. package/src/adapters/stackoverflow/questions.ts +765 -0
  399. package/src/adapters/steam/app.test.ts +68 -0
  400. package/src/adapters/steam/app.ts +218 -0
  401. package/src/adapters/tiktok/creator-videos.test.ts +158 -0
  402. package/src/adapters/tiktok/creator-videos.ts +370 -0
  403. package/src/adapters/tvmaze/shows.test.ts +93 -0
  404. package/src/adapters/tvmaze/shows.ts +271 -0
  405. package/src/adapters/twitter/bookmark-folders.test.ts +164 -0
  406. package/src/adapters/twitter/bookmark-folders.ts +366 -0
  407. package/src/adapters/twitter/quote.test.ts +157 -0
  408. package/src/adapters/twitter/quote.ts +332 -0
  409. package/src/adapters/twitter/tweet-actions.test.ts +51 -0
  410. package/src/adapters/twitter/tweet-actions.ts +187 -0
  411. package/src/adapters/twitter/tweet-url.ts +65 -0
  412. package/src/adapters/uisdc/news.test.ts +46 -0
  413. package/src/adapters/uisdc/news.ts +111 -0
  414. package/src/adapters/weibo/favorites-publish.test.ts +177 -0
  415. package/src/adapters/weibo/favorites-publish.ts +426 -0
  416. package/src/adapters/wikidata/entities.test.ts +103 -0
  417. package/src/adapters/wikidata/entities.ts +253 -0
  418. package/src/adapters/wikipedia/page.test.ts +49 -0
  419. package/src/adapters/wikipedia/page.ts +158 -0
  420. package/src/adapters/wttr/weather.test.ts +99 -0
  421. package/src/adapters/wttr/weather.ts +239 -0
  422. package/src/adapters/xianyu/publish.test.ts +210 -0
  423. package/src/adapters/xianyu/publish.ts +420 -0
  424. package/src/adapters/xiaohongshu/user-helpers.ts +5 -2
  425. package/src/adapters/yuanbao/web.test.ts +144 -0
  426. package/src/adapters/yuanbao/web.ts +435 -0
  427. package/src/adapters/zhihu/collection.test.ts +96 -0
  428. package/src/adapters/zhihu/collection.ts +239 -0
  429. package/src/adapters/zlibrary/web.test.ts +104 -0
  430. package/src/adapters/zlibrary/web.ts +192 -0
@@ -0,0 +1,365 @@
1
+ /**
2
+ * @owner src/adapters/yuanbao/web.ts
3
+ * @does Register agent-facing Yuanbao web conversation commands implemented with site-specific safety checks.
4
+ * @needs Logged-in yuanbao.tencent.com browser session, Yuanbao chat DOM, complete agent/session identifiers.
5
+ * @feeds surface coverage ledger, Yuanbao read/send/history/detail/status workflows.
6
+ * @breaks Yuanbao DOM selector drift or accepting bare UUIDs can read/send the wrong session.
7
+ */
8
+ import { cli, Strategy } from "../../registry.js";
9
+ import { intArg, js, str } from "../_shared/browser-tools.js";
10
+ const YUANBAO_HOME = "https://yuanbao.tencent.com/";
11
+ const AGENT_ID_RE = /^[A-Za-z0-9_-]{4,40}$/;
12
+ const CONV_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
13
+ const VISIBLE_JS = `const isVisible = (node) => {
14
+ if (!(node instanceof HTMLElement)) return false;
15
+ const rect = node.getBoundingClientRect();
16
+ const style = window.getComputedStyle(node);
17
+ return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden';
18
+ };`;
19
+ export function parseYuanbaoSessionId(value) {
20
+ const raw = str(value).trim();
21
+ if (!raw) {
22
+ throw new Error('Yuanbao id must be a non-empty chat URL or "<agentId>/<convId>" pair.');
23
+ }
24
+ const urlMatch = raw.match(/yuanbao\.tencent\.com\/chat\/([A-Za-z0-9_-]+)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[/?#]|$)/i);
25
+ if (urlMatch?.[1] && urlMatch[2]) {
26
+ return validateYuanbaoSession(urlMatch[1], urlMatch[2], raw);
27
+ }
28
+ const pairMatch = raw.match(/^([A-Za-z0-9_-]+)\/([0-9a-f-]{36})$/i);
29
+ if (pairMatch?.[1] && pairMatch[2]) {
30
+ return validateYuanbaoSession(pairMatch[1], pairMatch[2], raw);
31
+ }
32
+ throw new Error(`Invalid Yuanbao session reference: ${raw}. Pass https://yuanbao.tencent.com/chat/<agentId>/<convId> or "<agentId>/<convId>"; a UUID alone is not enough.`);
33
+ }
34
+ function validateYuanbaoSession(agentId, convId, source) {
35
+ if (!AGENT_ID_RE.test(agentId) || !CONV_ID_RE.test(convId)) {
36
+ throw new Error(`Invalid Yuanbao session reference: ${source}.`);
37
+ }
38
+ return { agentId, convId: convId.toLowerCase() };
39
+ }
40
+ function yuanbaoSessionUrl(session) {
41
+ return `${YUANBAO_HOME}chat/${session.agentId}/${session.convId}`;
42
+ }
43
+ export function yuanbaoHtmlToMarkdown(value) {
44
+ return str(value)
45
+ .replace(/<br\s*\/?>/gi, "\n")
46
+ .replace(/<\/(p|div|li|h[1-6]|pre)>/gi, "\n")
47
+ .replace(/<[^>]+>/g, " ")
48
+ .replace(/&nbsp;/g, " ")
49
+ .replace(/&lt;/g, "<")
50
+ .replace(/&gt;/g, ">")
51
+ .replace(/&amp;/g, "&")
52
+ .replace(/&quot;/g, '"')
53
+ .replace(/&#39;/g, "'")
54
+ .replace(/[ \t]+\n/g, "\n")
55
+ .replace(/\n{3,}/g, "\n\n")
56
+ .replace(/[ \t]{2,}/g, " ")
57
+ .trim();
58
+ }
59
+ export function mapYuanbaoBubbles(bubbles) {
60
+ return bubbles
61
+ .map((bubble) => {
62
+ const role = str(bubble.role) === "Assistant" ? "Assistant" : "User";
63
+ const text = role === "Assistant" && str(bubble.html).trim()
64
+ ? yuanbaoHtmlToMarkdown(bubble.html) || str(bubble.text)
65
+ : str(bubble.text);
66
+ return {
67
+ Role: role,
68
+ Text: text.trim(),
69
+ };
70
+ })
71
+ .filter((row) => row.Text);
72
+ }
73
+ export function mapYuanbaoSessions(sessions) {
74
+ return sessions
75
+ .map((session, index) => {
76
+ const cid = str(session.cid).toLowerCase();
77
+ const agentId = str(session.agentId);
78
+ return {
79
+ Index: index + 1,
80
+ Title: str(session.title, "(untitled)").trim() || "(untitled)",
81
+ AgentId: agentId,
82
+ SessionId: cid,
83
+ Url: `${YUANBAO_HOME}chat/${agentId}/${cid}`,
84
+ };
85
+ })
86
+ .filter((row) => AGENT_ID_RE.test(str(row.AgentId)) &&
87
+ CONV_ID_RE.test(str(row.SessionId)));
88
+ }
89
+ async function currentUrl(page) {
90
+ const value = await page.evaluate("window.location.href").catch(() => "");
91
+ return typeof value === "string" ? value : "";
92
+ }
93
+ async function ensureYuanbaoPage(page) {
94
+ const url = await currentUrl(page);
95
+ let onYuanbao = false;
96
+ try {
97
+ const hostname = new URL(url).hostname;
98
+ onYuanbao =
99
+ hostname === "yuanbao.tencent.com" ||
100
+ hostname.endsWith(".yuanbao.tencent.com");
101
+ }
102
+ catch {
103
+ onYuanbao = false;
104
+ }
105
+ if (!onYuanbao) {
106
+ await page.goto(YUANBAO_HOME, { waitUntil: "load", settleMs: 2500 });
107
+ await page.wait(1);
108
+ }
109
+ }
110
+ async function hasLoginGate(page) {
111
+ const result = await page.evaluate(`(() => {
112
+ const bodyText = document.body?.innerText || '';
113
+ const hasWechatLoginText = bodyText.includes('微信扫码登录');
114
+ const hasWechatIframe = Array.from(document.querySelectorAll('iframe'))
115
+ .some((frame) => (frame.getAttribute('src') || '').includes('open.weixin.qq.com/connect/qrconnect'));
116
+ return hasWechatLoginText || hasWechatIframe;
117
+ })()`);
118
+ return Boolean(result);
119
+ }
120
+ async function readBubbles(page) {
121
+ const result = await page.evaluate(`(() => {
122
+ ${VISIBLE_JS}
123
+ const items = Array.from(document.querySelectorAll('.agent-chat__list__item--human, .agent-chat__list__item--ai'))
124
+ .filter((node) => isVisible(node));
125
+ return items.map((node) => {
126
+ const isAi = node.classList.contains('agent-chat__list__item--ai');
127
+ const contentNode = isAi
128
+ ? (node.querySelector('.hyc-content-md-done')
129
+ || node.querySelector('.hyc-content-md')
130
+ || node.querySelector('.agent-chat__speech-text')
131
+ || node.querySelector('.agent-chat__bubble__content'))
132
+ : (node.querySelector('.hyc-component-text .hyc-content-text')
133
+ || node.querySelector('.hyc-content-text')
134
+ || node.querySelector('.agent-chat__bubble__content'));
135
+ const html = contentNode instanceof HTMLElement ? (contentNode.innerHTML || '') : '';
136
+ const text = contentNode instanceof HTMLElement
137
+ ? (contentNode.innerText || contentNode.textContent || '')
138
+ : ((node.innerText || node.textContent) || '');
139
+ return {
140
+ role: isAi ? 'Assistant' : 'User',
141
+ text: String(text || '').replace(/\\u00a0/g, ' ').trim(),
142
+ html,
143
+ };
144
+ });
145
+ })()`);
146
+ return Array.isArray(result) ? result : [];
147
+ }
148
+ async function readCurrentConversation(page) {
149
+ await ensureYuanbaoPage(page);
150
+ await page.wait(1.5);
151
+ if (await hasLoginGate(page)) {
152
+ throw new Error("Yuanbao login is required before reading messages.");
153
+ }
154
+ const rows = mapYuanbaoBubbles(await readBubbles(page));
155
+ if (!rows.length)
156
+ throw new Error("No visible Yuanbao messages found.");
157
+ return rows;
158
+ }
159
+ async function listSessions(page, limit) {
160
+ await ensureYuanbaoPage(page);
161
+ if (await hasLoginGate(page)) {
162
+ throw new Error("Yuanbao login is required before reading history.");
163
+ }
164
+ await page.wait(1.5);
165
+ const raw = await page.evaluate(`(() => {
166
+ ${VISIBLE_JS}
167
+ const nodes = Array.from(document.querySelectorAll('.yb-recent-conv-list__item'))
168
+ .filter((node) => isVisible(node));
169
+ return nodes.map((node) => {
170
+ const cid = node.getAttribute('dt-cid') || '';
171
+ const agentId = node.getAttribute('dt-agent-id') || '';
172
+ const titleEl = node.querySelector('[data-item-name]');
173
+ const title = (titleEl?.getAttribute('data-item-name') || titleEl?.textContent || '').trim();
174
+ return { cid, agentId, title };
175
+ });
176
+ })()`);
177
+ const rows = Array.isArray(raw)
178
+ ? mapYuanbaoSessions(raw)
179
+ : [];
180
+ if (!rows.length)
181
+ throw new Error("No Yuanbao conversations found in the sidebar.");
182
+ return rows.slice(0, limit);
183
+ }
184
+ async function sendYuanbaoPrompt(page, prompt) {
185
+ const result = (await page.evaluate(`(async () => {
186
+ const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
187
+ ${VISIBLE_JS}
188
+ const composer = Array.from(document.querySelectorAll('.ql-editor[contenteditable="true"], .ql-editor, [contenteditable="true"]'))
189
+ .find(isVisible);
190
+ if (!(composer instanceof HTMLElement)) return { ok: false, reason: 'Yuanbao composer was not found.' };
191
+ composer.focus();
192
+ const selection = window.getSelection();
193
+ const range = document.createRange();
194
+ range.selectNodeContents(composer);
195
+ range.collapse(false);
196
+ selection?.removeAllRanges();
197
+ selection?.addRange(range);
198
+ composer.textContent = '';
199
+ document.execCommand('insertText', false, ${js(prompt)});
200
+ composer.dispatchEvent(new InputEvent('input', { bubbles: true, data: ${js(prompt)}, inputType: 'insertText' }));
201
+ const findEnabledSubmit = () => Array.from(document.querySelectorAll('a[class*="send-btn"], button[class*="send-btn"], button[class*="submit"]'))
202
+ .find((node) => {
203
+ if (!(node instanceof HTMLElement) || !isVisible(node)) return false;
204
+ const className = typeof node.className === 'string' ? node.className : '';
205
+ return !className.includes('send-btn--disabled') && !className.includes('disabled');
206
+ });
207
+ let submit = null;
208
+ const deadline = Date.now() + 3000;
209
+ while (Date.now() < deadline) {
210
+ submit = findEnabledSubmit();
211
+ if (submit) break;
212
+ await waitFor(150);
213
+ }
214
+ if (submit instanceof HTMLElement) {
215
+ submit.click();
216
+ return { ok: true, action: 'click' };
217
+ }
218
+ composer.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, bubbles: true }));
219
+ composer.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter', code: 'Enter', keyCode: 13, bubbles: true }));
220
+ return { ok: true, action: 'enter' };
221
+ })()`));
222
+ if (!result?.ok) {
223
+ throw new Error(str(result?.reason, "Failed to send Yuanbao prompt."));
224
+ }
225
+ return result;
226
+ }
227
+ cli({
228
+ site: "yuanbao",
229
+ name: "read",
230
+ description: "Read messages in the current Yuanbao conversation",
231
+ domain: "yuanbao.tencent.com",
232
+ strategy: Strategy.COOKIE,
233
+ browser: true,
234
+ columns: ["Role", "Text"],
235
+ func: async (page) => readCurrentConversation(page),
236
+ });
237
+ cli({
238
+ site: "yuanbao",
239
+ name: "send",
240
+ description: "Send a prompt to Yuanbao without waiting for the reply",
241
+ domain: "yuanbao.tencent.com",
242
+ strategy: Strategy.COOKIE,
243
+ browser: true,
244
+ args: [
245
+ { name: "prompt", type: "str", required: true, positional: true },
246
+ { name: "new", type: "bool", default: false },
247
+ ],
248
+ columns: ["Status", "Prompt"],
249
+ func: async (page, kwargs) => {
250
+ const prompt = str(kwargs.prompt).trim();
251
+ if (!prompt)
252
+ throw new Error("Yuanbao prompt cannot be empty.");
253
+ const p = page;
254
+ await ensureYuanbaoPage(p);
255
+ if (await hasLoginGate(p)) {
256
+ throw new Error("Yuanbao login is required before sending prompts.");
257
+ }
258
+ if (kwargs.new === true || kwargs.new === "true" || kwargs.new === "1") {
259
+ await p.goto(YUANBAO_HOME, { waitUntil: "load", settleMs: 2500 });
260
+ await p.wait(1);
261
+ }
262
+ await sendYuanbaoPrompt(p, prompt);
263
+ return [{ Status: "sent", Prompt: prompt }];
264
+ },
265
+ });
266
+ cli({
267
+ site: "yuanbao",
268
+ name: "history",
269
+ description: "List recent Yuanbao conversations from the sidebar",
270
+ domain: "yuanbao.tencent.com",
271
+ strategy: Strategy.COOKIE,
272
+ browser: true,
273
+ args: [{ name: "limit", type: "int", default: 20 }],
274
+ columns: ["Index", "Title", "AgentId", "SessionId", "Url"],
275
+ func: async (page, kwargs) => {
276
+ const limit = intArg(kwargs.limit, 20, 100);
277
+ return listSessions(page, limit);
278
+ },
279
+ });
280
+ cli({
281
+ site: "yuanbao",
282
+ name: "detail",
283
+ description: "Open a Yuanbao conversation by ID and read its messages",
284
+ domain: "yuanbao.tencent.com",
285
+ strategy: Strategy.COOKIE,
286
+ browser: true,
287
+ args: [{ name: "id", type: "str", required: true, positional: true }],
288
+ columns: ["Role", "Text"],
289
+ func: async (page, kwargs) => {
290
+ const p = page;
291
+ const session = parseYuanbaoSessionId(kwargs.id);
292
+ await p.goto(yuanbaoSessionUrl(session), {
293
+ waitUntil: "load",
294
+ settleMs: 2500,
295
+ });
296
+ await p.wait(2);
297
+ if (await hasLoginGate(p)) {
298
+ throw new Error("Yuanbao login is required before reading detail.");
299
+ }
300
+ const startedAt = Date.now();
301
+ while (Date.now() - startedAt < 20_000) {
302
+ const rows = mapYuanbaoBubbles(await readBubbles(p));
303
+ if (rows.length)
304
+ return rows;
305
+ await p.wait(1);
306
+ }
307
+ throw new Error(`No visible Yuanbao messages found for conversation ${session.agentId}/${session.convId}.`);
308
+ },
309
+ });
310
+ cli({
311
+ site: "yuanbao",
312
+ name: "status",
313
+ description: "Check Yuanbao page availability, login state, current session and model",
314
+ domain: "yuanbao.tencent.com",
315
+ strategy: Strategy.COOKIE,
316
+ browser: true,
317
+ columns: [
318
+ "Status",
319
+ "Login",
320
+ "Model",
321
+ "ModelId",
322
+ "AgentId",
323
+ "SessionId",
324
+ "Url",
325
+ ],
326
+ func: async (page) => {
327
+ const p = page;
328
+ await ensureYuanbaoPage(p);
329
+ await p.wait(1.5);
330
+ const [loginGate, session, model, url] = await Promise.all([
331
+ hasLoginGate(p),
332
+ p.evaluate(`(() => {
333
+ const match = window.location.href.match(/yuanbao\\.tencent\\.com\\/chat\\/([A-Za-z0-9_-]+)\\/([0-9a-f-]{36})(?:[/?#]|$)/i);
334
+ if (!match) return null;
335
+ return { agentId: match[1], convId: match[2].toLowerCase() };
336
+ })()`),
337
+ p.evaluate(`(() => {
338
+ const button = document.querySelector('[dt-button-id="model_switch"]');
339
+ if (!(button instanceof HTMLElement)) return { label: null, modelId: null };
340
+ const label = (button.querySelector('.t-button__text')?.textContent || button.textContent || '').trim() || null;
341
+ const modelId = button.getAttribute('dt-model-id') || null;
342
+ return { label, modelId };
343
+ })()`),
344
+ currentUrl(p),
345
+ ]);
346
+ const typedSession = session && typeof session === "object"
347
+ ? session
348
+ : null;
349
+ const typedModel = model && typeof model === "object"
350
+ ? model
351
+ : null;
352
+ return [
353
+ {
354
+ Status: "Connected",
355
+ Login: loginGate ? "No (login gate)" : "Yes",
356
+ Model: typedModel?.label ?? null,
357
+ ModelId: typedModel?.modelId ?? null,
358
+ AgentId: typedSession?.agentId ?? null,
359
+ SessionId: typedSession?.convId ?? null,
360
+ Url: url,
361
+ },
362
+ ];
363
+ },
364
+ });
365
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/yuanbao/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @owner src/adapters/zhihu/collection.ts
3
+ * @does Register agent-facing Zhihu collection item reader.
4
+ * @needs Logged-in Zhihu browser session, collection item API, bounded pagination.
5
+ * @feeds surface coverage ledger, Zhihu collection content workflows, answer/article/pin rows.
6
+ * @breaks Zhihu collection API shape drift or weak content mapping can hide saved items.
7
+ */
8
+ interface ZhihuCollectionItem {
9
+ content?: {
10
+ type?: unknown;
11
+ id?: unknown;
12
+ url?: unknown;
13
+ content?: unknown;
14
+ question?: {
15
+ id?: unknown;
16
+ title?: unknown;
17
+ };
18
+ title?: unknown;
19
+ author?: {
20
+ name?: unknown;
21
+ };
22
+ voteup_count?: unknown;
23
+ reaction_count?: unknown;
24
+ };
25
+ }
26
+ export declare function stripZhihuHtml(value: unknown): string;
27
+ export declare function requireZhihuCollectionId(value: unknown): string;
28
+ export declare function requireZhihuPositiveInt(value: unknown, label: string): number;
29
+ export declare function requireZhihuNonNegativeInt(value: unknown, label: string): number;
30
+ export declare function zhihuCollectionItemKey(item: ZhihuCollectionItem): string;
31
+ export declare function mapZhihuCollectionItem(item: ZhihuCollectionItem, rank: number): Record<string, unknown>;
32
+ export {};
33
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../../src/adapters/zhihu/collection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,UAAU,mBAAmB;IAC3B,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC;CACH;AAqBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASrD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK/D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAQR;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAKxE;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoDzB"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * @owner src/adapters/zhihu/collection.ts
3
+ * @does Register agent-facing Zhihu collection item reader.
4
+ * @needs Logged-in Zhihu browser session, collection item API, bounded pagination.
5
+ * @feeds surface coverage ledger, Zhihu collection content workflows, answer/article/pin rows.
6
+ * @breaks Zhihu collection API shape drift or weak content mapping can hide saved items.
7
+ */
8
+ import { cli, Strategy } from "../../registry.js";
9
+ function stringField(value) {
10
+ return value === undefined || value === null ? "" : String(value);
11
+ }
12
+ function numberField(value) {
13
+ const n = Number(value);
14
+ return Number.isFinite(n) ? n : 0;
15
+ }
16
+ export function stripZhihuHtml(value) {
17
+ return stringField(value)
18
+ .replace(/<[^>]+>/g, "")
19
+ .replace(/&nbsp;/g, " ")
20
+ .replace(/&lt;/g, "<")
21
+ .replace(/&gt;/g, ">")
22
+ .replace(/&amp;/g, "&")
23
+ .replace(/&quot;/g, '"')
24
+ .trim();
25
+ }
26
+ export function requireZhihuCollectionId(value) {
27
+ const id = String(value ?? "").trim();
28
+ if (!/^\d+$/.test(id))
29
+ throw new Error("Zhihu collection ID must be numeric.");
30
+ return id;
31
+ }
32
+ export function requireZhihuPositiveInt(value, label) {
33
+ const n = Number(value);
34
+ if (!Number.isInteger(n) || n <= 0) {
35
+ throw new Error(`zhihu collection ${label} must be a positive integer.`);
36
+ }
37
+ return n;
38
+ }
39
+ export function requireZhihuNonNegativeInt(value, label) {
40
+ const n = Number(value);
41
+ if (!Number.isInteger(n) || n < 0) {
42
+ throw new Error(`zhihu collection ${label} must be a non-negative integer.`);
43
+ }
44
+ return n;
45
+ }
46
+ export function zhihuCollectionItemKey(item) {
47
+ const content = item.content ?? {};
48
+ return `${stringField(content.type) || "unknown"}:${stringField(content.id || content.url || JSON.stringify(content).slice(0, 80))}`;
49
+ }
50
+ export function mapZhihuCollectionItem(item, rank) {
51
+ const content = item.content ?? {};
52
+ const type = stringField(content.type) || "unknown";
53
+ let title = "";
54
+ let excerpt = "";
55
+ let url = "";
56
+ let author = "";
57
+ let votes = 0;
58
+ if (type === "answer") {
59
+ const question = content.question ?? {};
60
+ title = stringField(question.title);
61
+ excerpt = stripZhihuHtml(content.content).slice(0, 150);
62
+ url =
63
+ stringField(content.url) ||
64
+ `https://www.zhihu.com/question/${stringField(question.id)}/answer/${stringField(content.id)}`;
65
+ author = stringField(content.author?.name) || "匿名用户";
66
+ votes = numberField(content.voteup_count);
67
+ }
68
+ else if (type === "article") {
69
+ title = stringField(content.title);
70
+ excerpt = stripZhihuHtml(content.content).slice(0, 150);
71
+ url =
72
+ stringField(content.url) ||
73
+ `https://zhuanlan.zhihu.com/p/${stringField(content.id)}`;
74
+ author = stringField(content.author?.name) || "匿名用户";
75
+ votes = numberField(content.voteup_count);
76
+ }
77
+ else if (type === "pin") {
78
+ title = "想法";
79
+ const blocks = Array.isArray(content.content) ? content.content : [];
80
+ excerpt = stripZhihuHtml(blocks
81
+ .map((block) => typeof block === "object" && block !== null && "content" in block
82
+ ? stringField(block.content)
83
+ : "")
84
+ .join(" ")).slice(0, 150);
85
+ url =
86
+ stringField(content.url) ||
87
+ `https://www.zhihu.com/pin/${stringField(content.id)}`;
88
+ author = stringField(content.author?.name) || "匿名用户";
89
+ votes = numberField(content.reaction_count);
90
+ }
91
+ return {
92
+ rank,
93
+ type,
94
+ title: title.slice(0, 100),
95
+ author,
96
+ votes,
97
+ excerpt,
98
+ url,
99
+ };
100
+ }
101
+ function nextOffsetFromPaging(page, fallback) {
102
+ const next = stringField(page.paging?.next);
103
+ if (next) {
104
+ try {
105
+ const url = new URL(next);
106
+ const parsed = Number(url.searchParams.get("offset"));
107
+ if (Number.isInteger(parsed) && parsed > fallback)
108
+ return parsed;
109
+ }
110
+ catch {
111
+ return fallback;
112
+ }
113
+ }
114
+ return fallback;
115
+ }
116
+ cli({
117
+ site: "zhihu",
118
+ name: "collection",
119
+ description: "List items in a Zhihu collection",
120
+ domain: "www.zhihu.com",
121
+ strategy: Strategy.COOKIE,
122
+ browser: true,
123
+ args: [
124
+ {
125
+ name: "id",
126
+ type: "str",
127
+ required: true,
128
+ positional: true,
129
+ description: "Collection ID",
130
+ },
131
+ { name: "offset", type: "int", default: 0, description: "Starting offset" },
132
+ { name: "limit", type: "int", default: 20, description: "Number of items" },
133
+ ],
134
+ columns: ["rank", "type", "title", "author", "votes", "excerpt", "url"],
135
+ func: async (page, kwargs) => {
136
+ const browserPage = page;
137
+ const id = requireZhihuCollectionId(kwargs.id);
138
+ const offset = requireZhihuNonNegativeInt(kwargs.offset ?? 0, "offset");
139
+ const requestedLimit = requireZhihuPositiveInt(kwargs.limit ?? 20, "limit");
140
+ const pageLimit = Math.min(requestedLimit, 20);
141
+ await browserPage.goto("https://www.zhihu.com");
142
+ const collected = [];
143
+ const seen = new Set();
144
+ let nextOffset = offset;
145
+ const maxPages = Math.ceil(requestedLimit / pageLimit) + 2;
146
+ for (let pageIndex = 0; pageIndex < maxPages && collected.length < requestedLimit; pageIndex += 1) {
147
+ const fetchLimit = Math.min(pageLimit, requestedLimit - collected.length);
148
+ const url = `https://www.zhihu.com/api/v4/collections/${id}/items?offset=${nextOffset}&limit=${fetchLimit}`;
149
+ const data = await browserPage.evaluate(`(async () => {
150
+ const response = await fetch(${JSON.stringify(url)}, { credentials: 'include' });
151
+ if (!response.ok) return { __httpError: response.status };
152
+ return await response.json();
153
+ })()`);
154
+ if (!data || data.__httpError) {
155
+ throw new Error(`Zhihu collection request failed${data?.__httpError ? ` (HTTP ${String(data.__httpError)})` : ""}.`);
156
+ }
157
+ const items = Array.isArray(data.data) ? data.data : [];
158
+ for (const item of items) {
159
+ const key = zhihuCollectionItemKey(item);
160
+ if (!seen.has(key)) {
161
+ seen.add(key);
162
+ collected.push(item);
163
+ }
164
+ if (collected.length >= requestedLimit)
165
+ break;
166
+ }
167
+ if (items.length === 0 ||
168
+ data.paging?.is_end ||
169
+ collected.length >= requestedLimit)
170
+ break;
171
+ const parsedNextOffset = nextOffsetFromPaging(data, nextOffset);
172
+ nextOffset =
173
+ parsedNextOffset > nextOffset
174
+ ? parsedNextOffset
175
+ : nextOffset + items.length;
176
+ }
177
+ if (collected.length === 0) {
178
+ throw new Error(`No items found for Zhihu collection ${id}.`);
179
+ }
180
+ return collected
181
+ .slice(0, requestedLimit)
182
+ .map((item, index) => mapZhihuCollectionItem(item, offset + index + 1));
183
+ },
184
+ });
185
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/adapters/zhihu/collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @owner src/adapters/zlibrary/web.ts
3
+ * @does Register agent-facing Z-Library search and info commands implemented with site-specific safety checks.
4
+ * @needs Logged-in z-library.im browser session and Z-Library search/book page DOM.
5
+ * @feeds surface coverage ledger, book search rows, and book detail/download-format discovery.
6
+ * @breaks Z-Library host changes, login redirects, or z-bookcard shadow DOM drift can hide results.
7
+ */
8
+ interface ZlibrarySearchRow {
9
+ rank?: unknown;
10
+ title?: unknown;
11
+ author?: unknown;
12
+ url?: unknown;
13
+ }
14
+ export declare function normalizeZlibraryBookUrl(value: unknown): string;
15
+ export declare function buildZlibrarySearchUrl(value: unknown): string;
16
+ export declare function requireZlibraryLimit(value: unknown, fallback?: number): number;
17
+ export declare function mapZlibrarySearchRows(rows: ZlibrarySearchRow[]): Record<string, unknown>[];
18
+ export {};
19
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/zlibrary/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAmB/D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI7D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,CAQ1E;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAS3B"}