@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,91 @@
1
+ /**
2
+ * @owner src/adapters/uisdc/news.ts
3
+ * @does Register agent-facing UISDC news browser extraction command.
4
+ * @needs Public UISDC news page, browser runtime, selector-drift error reporting.
5
+ * @feeds surface coverage ledger, design/AI news discovery, Chinese design news surface.
6
+ * @breaks UISDC DOM drift or silent empty extraction hides news coverage failures.
7
+ */
8
+ import { cli, Strategy } from "../../registry.js";
9
+ const UISDC_NEWS_URL = "https://www.uisdc.com/news";
10
+ function normalizeText(value) {
11
+ return String(value ?? "")
12
+ .replace(/\s+/g, " ")
13
+ .trim();
14
+ }
15
+ export function requireNewsLimit(value, fallback = 20) {
16
+ if (value === undefined || value === null || value === "")
17
+ return fallback;
18
+ const n = Number(value);
19
+ if (!Number.isInteger(n) || n < 1 || n > 50) {
20
+ throw new Error("limit must be an integer in [1, 50].");
21
+ }
22
+ return n;
23
+ }
24
+ export function buildExtractUisdcNewsJs() {
25
+ return `
26
+ (() => {
27
+ const cards = Array.from(document.querySelectorAll(
28
+ '.news-list > .news-item:first-child > .item-content > .dubao-items > .dubao-item'
29
+ ));
30
+ if (cards.length === 0) {
31
+ return {
32
+ ok: false,
33
+ reason: 'selector-missing',
34
+ title: document.title || '',
35
+ bodyText: (document.body?.innerText || document.body?.textContent || '').slice(0, 500),
36
+ };
37
+ }
38
+ const rows = cards.map((el) => {
39
+ const anchor = el.querySelector('a[href]');
40
+ return {
41
+ title: el.querySelector('.dubao-title')?.textContent || '',
42
+ summary: el.querySelector('.dubao-content')?.textContent || '',
43
+ url: anchor ? new URL(anchor.getAttribute('href'), location.href).href : '',
44
+ };
45
+ });
46
+ return { ok: true, rows };
47
+ })()
48
+ `;
49
+ }
50
+ export function mapUisdcNewsPayload(payload, limit) {
51
+ if (!payload || typeof payload !== "object") {
52
+ throw new Error("UISDC news page returned an unreadable payload.");
53
+ }
54
+ if (payload.ok !== true) {
55
+ const reason = normalizeText(payload.reason) || "selector-drift";
56
+ const title = normalizeText(payload.title);
57
+ throw new Error(`UISDC news selector drift: ${reason}${title ? ` (${title})` : ""}`);
58
+ }
59
+ const rows = (Array.isArray(payload.rows) ? payload.rows : [])
60
+ .map((row, index) => ({
61
+ rank: index + 1,
62
+ title: normalizeText(row.title),
63
+ summary: normalizeText(row.summary),
64
+ url: normalizeText(row.url),
65
+ }))
66
+ .filter((row) => row.title && row.url);
67
+ if (rows.length === 0) {
68
+ throw new Error("UISDC news page loaded, but no news rows were extracted.");
69
+ }
70
+ return rows
71
+ .slice(0, limit)
72
+ .map((row, index) => ({ ...row, rank: index + 1 }));
73
+ }
74
+ cli({
75
+ site: "uisdc",
76
+ name: "news",
77
+ description: "UISDC latest AI and design news",
78
+ domain: "www.uisdc.com",
79
+ strategy: Strategy.PUBLIC,
80
+ browser: true,
81
+ args: [{ name: "limit", type: "int", default: 20, description: "Max rows" }],
82
+ columns: ["rank", "title", "summary", "url"],
83
+ func: async (page, kwargs) => {
84
+ const p = page;
85
+ const limit = requireNewsLimit(kwargs.limit);
86
+ await p.goto(UISDC_NEWS_URL, { waitUntil: "load", settleMs: 3000 });
87
+ const payload = (await p.evaluate(buildExtractUisdcNewsJs()));
88
+ return mapUisdcNewsPayload(payload, limit);
89
+ },
90
+ });
91
+ //# sourceMappingURL=news.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news.js","sourceRoot":"","sources":["../../../src/adapters/uisdc/news.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @owner src/adapters/weibo/favorites-publish.ts
3
+ * @does Register agent-facing Weibo favorites reader and publish command.
4
+ * @needs Logged-in weibo.com browser session and stable Weibo compose/favorites DOM.
5
+ * @feeds surface coverage ledger, Weibo collection reading, and Weibo publishing workflows.
6
+ * @breaks Weibo Vue config changes, favorites virtual-scroller DOM drift, compose selector drift, or upload UI changes.
7
+ */
8
+ interface FavoriteCard {
9
+ text?: unknown;
10
+ url?: unknown;
11
+ }
12
+ interface FavoriteRow {
13
+ author: string;
14
+ text: string;
15
+ time: string;
16
+ source: string;
17
+ likes: string;
18
+ comments: string;
19
+ reposts: string;
20
+ url: string;
21
+ }
22
+ export declare function requireWeiboFavoritesLimit(value: unknown): number;
23
+ export declare function validateWeiboPublishText(value: unknown): string;
24
+ export declare function validateWeiboImagePaths(value: unknown): string[];
25
+ export declare function parseWeiboFavoriteCard(card: FavoriteCard, fallbackUrl: string): FavoriteRow | null;
26
+ export declare function dedupeWeiboFavorites(items: FavoriteRow[], fallbackUrl: string): FavoriteRow[];
27
+ export {};
28
+ //# sourceMappingURL=favorites-publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorites-publish.d.ts","sourceRoot":"","sources":["../../../src/adapters/weibo/favorites-publish.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAaD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASjE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO/D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAuBhE;AAoBD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,WAAW,EAAE,MAAM,GAClB,WAAW,GAAG,IAAI,CAsDpB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAAE,EACpB,WAAW,EAAE,MAAM,GAClB,WAAW,EAAE,CAaf"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * @owner src/adapters/weibo/favorites-publish.ts
3
+ * @does Register agent-facing Weibo favorites reader and publish command.
4
+ * @needs Logged-in weibo.com browser session and stable Weibo compose/favorites DOM.
5
+ * @feeds surface coverage ledger, Weibo collection reading, and Weibo publishing workflows.
6
+ * @breaks Weibo Vue config changes, favorites virtual-scroller DOM drift, compose selector drift, or upload UI changes.
7
+ */
8
+ import * as fs from "node:fs";
9
+ import * as path from "node:path";
10
+ import { cli, Strategy } from "../../registry.js";
11
+ const FAVORITES_DEFAULT_LIMIT = 20;
12
+ const FAVORITES_MAX_LIMIT = 50;
13
+ const MAX_IMAGES = 9;
14
+ const IMAGE_EXTENSIONS = new Set([".jpg", ".jpeg", ".png", ".gif", ".webp"]);
15
+ const TEXTAREA_SELECTOR = "textarea._input_13iqr_8";
16
+ const FILE_INPUT_SELECTOR = 'input[type="file"][class*="_file_"]';
17
+ export function requireWeiboFavoritesLimit(value) {
18
+ const limit = Number(value ?? FAVORITES_DEFAULT_LIMIT);
19
+ if (!Number.isInteger(limit) || limit <= 0) {
20
+ throw new Error("weibo favorites limit must be a positive integer.");
21
+ }
22
+ if (limit > FAVORITES_MAX_LIMIT) {
23
+ throw new Error(`weibo favorites limit must be <= ${FAVORITES_MAX_LIMIT}.`);
24
+ }
25
+ return limit;
26
+ }
27
+ export function validateWeiboPublishText(value) {
28
+ const text = String(value ?? "").trim();
29
+ if (!text)
30
+ throw new Error("weibo publish text cannot be empty.");
31
+ if (text.length > 2000) {
32
+ throw new Error("weibo publish text exceeds 2000 characters.");
33
+ }
34
+ return text;
35
+ }
36
+ export function validateWeiboImagePaths(value) {
37
+ if (!value)
38
+ return [];
39
+ const parts = String(value)
40
+ .split(",")
41
+ .map((item) => item.trim())
42
+ .filter(Boolean);
43
+ if (parts.length > MAX_IMAGES) {
44
+ throw new Error(`Too many images: ${parts.length} (max ${MAX_IMAGES}).`);
45
+ }
46
+ return parts.map((item) => {
47
+ const absolutePath = path.resolve(item);
48
+ const extension = path.extname(absolutePath).toLowerCase();
49
+ if (!IMAGE_EXTENSIONS.has(extension)) {
50
+ throw new Error(`Unsupported image format "${extension}". Supported: jpg, png, gif, webp.`);
51
+ }
52
+ const stat = fs.statSync(absolutePath, { throwIfNoEntry: false });
53
+ if (!stat?.isFile()) {
54
+ throw new Error(`Not a valid file: ${absolutePath}.`);
55
+ }
56
+ return absolutePath;
57
+ });
58
+ }
59
+ async function getWeiboSelfUid(page) {
60
+ const uid = await page.evaluate(`(() => {
61
+ const app = document.querySelector('#app')?.__vue_app__;
62
+ const store = app?.config?.globalProperties?.$store;
63
+ const uid = store?.state?.config?.config?.uid;
64
+ return uid ? String(uid) : null;
65
+ })()`);
66
+ if (uid)
67
+ return String(uid);
68
+ const configUid = await page.evaluate(`(async () => {
69
+ const response = await fetch('/ajax/config/get_config', { credentials: 'include' });
70
+ if (!response.ok) return null;
71
+ const data = await response.json();
72
+ return data.ok && data.data?.uid ? String(data.data.uid) : null;
73
+ })()`);
74
+ if (configUid)
75
+ return String(configUid);
76
+ throw new Error("Weibo login is required.");
77
+ }
78
+ export function parseWeiboFavoriteCard(card, fallbackUrl) {
79
+ const raw = String(card?.text ?? "");
80
+ const lines = raw.split("\n");
81
+ let author = "";
82
+ let time = "";
83
+ let source = "";
84
+ let content = "";
85
+ let likes = "0";
86
+ let comments = "0";
87
+ let reposts = "0";
88
+ for (const line of lines) {
89
+ const text = line.trim();
90
+ if (!text || text === "添加")
91
+ continue;
92
+ if (!time &&
93
+ /\d+小时前|\d+分钟前|\d+秒前|昨天|前天|\d{1,2}:\d{2}/.test(text)) {
94
+ time = text;
95
+ continue;
96
+ }
97
+ if (text.startsWith("来自")) {
98
+ source = text;
99
+ continue;
100
+ }
101
+ if (content) {
102
+ const n = Number.parseInt(text, 10);
103
+ if (!Number.isNaN(n) && n > 0 && n < 1_000_000 && text === String(n)) {
104
+ if (likes === "0")
105
+ likes = text;
106
+ else if (comments === "0")
107
+ comments = text;
108
+ else if (reposts === "0")
109
+ reposts = text;
110
+ continue;
111
+ }
112
+ }
113
+ if (!author && text.length < 40) {
114
+ author = text;
115
+ continue;
116
+ }
117
+ if (!content && author) {
118
+ content = text;
119
+ continue;
120
+ }
121
+ if (content)
122
+ content += ` ${text}`;
123
+ }
124
+ if (!content || !author)
125
+ return null;
126
+ return {
127
+ author,
128
+ text: content.substring(0, 300),
129
+ time,
130
+ source,
131
+ likes,
132
+ comments,
133
+ reposts,
134
+ url: String(card?.url || fallbackUrl),
135
+ };
136
+ }
137
+ export function dedupeWeiboFavorites(items, fallbackUrl) {
138
+ const seen = new Set();
139
+ const result = [];
140
+ for (const item of items) {
141
+ const key = item.url && item.url !== fallbackUrl
142
+ ? item.url
143
+ : `${item.author}\n${item.text}\n${item.time}`;
144
+ if (seen.has(key))
145
+ continue;
146
+ seen.add(key);
147
+ result.push(item);
148
+ }
149
+ return result;
150
+ }
151
+ function buildFavoritesExtractScript(limit) {
152
+ return `(() => {
153
+ const scrollers = document.querySelectorAll('.wbpro-scroller-item, .vue-recycle-scroller__item-view');
154
+ const rows = [];
155
+ for (const scroller of scrollers) {
156
+ const body = scroller.querySelector('[class*="_body_"]') || scroller.querySelector('.wbpro-item-body') || scroller;
157
+ const rawText = body.innerText || scroller.innerText || '';
158
+ let postUrl = '';
159
+ const anchors = scroller.querySelectorAll('a[href]');
160
+ for (const anchor of anchors) {
161
+ const match = String(anchor.href).match(/weibo\\.com\\/(\\d+)\\/([a-zA-Z0-9]+)/);
162
+ if (match) {
163
+ postUrl = 'https://weibo.com/' + match[1] + '/' + match[2];
164
+ break;
165
+ }
166
+ }
167
+ if (rawText.length > 20) rows.push({ text: rawText, url: postUrl });
168
+ if (rows.length >= ${JSON.stringify(limit)}) break;
169
+ }
170
+ return rows;
171
+ })()`;
172
+ }
173
+ async function waitForTruthy(page, script, attempts, intervalSeconds) {
174
+ for (let index = 0; index < attempts; index += 1) {
175
+ const result = (await page.evaluate(script));
176
+ if (result?.ok || result?.found || result?.message)
177
+ return result;
178
+ await page.wait(intervalSeconds);
179
+ }
180
+ return null;
181
+ }
182
+ cli({
183
+ site: "weibo",
184
+ name: "favorites",
185
+ description: "Read your Weibo favorites",
186
+ domain: "weibo.com",
187
+ strategy: Strategy.COOKIE,
188
+ browser: true,
189
+ args: [{ name: "limit", type: "int", default: FAVORITES_DEFAULT_LIMIT }],
190
+ columns: [
191
+ "author",
192
+ "text",
193
+ "time",
194
+ "source",
195
+ "likes",
196
+ "comments",
197
+ "reposts",
198
+ "url",
199
+ ],
200
+ func: async (page, kwargs) => {
201
+ const limit = requireWeiboFavoritesLimit(kwargs.limit);
202
+ const p = page;
203
+ await p.goto("https://weibo.com");
204
+ await p.wait(2);
205
+ const uid = await getWeiboSelfUid(p);
206
+ const favoritesUrl = `https://www.weibo.com/u/page/fav/${uid}`;
207
+ await p.goto(favoritesUrl);
208
+ await p.wait(4);
209
+ for (let index = 0; index < 3; index += 1) {
210
+ await p.evaluate("() => window.scrollBy(0, 800)");
211
+ await p.wait(1);
212
+ }
213
+ const rawData = await p.evaluate(buildFavoritesExtractScript(limit));
214
+ if (!Array.isArray(rawData) || rawData.length === 0) {
215
+ throw new Error("No Weibo favorites were visible on the favorites page.");
216
+ }
217
+ const rows = rawData
218
+ .map((card) => parseWeiboFavoriteCard(card, favoritesUrl))
219
+ .filter((item) => Boolean(item));
220
+ const uniqueRows = dedupeWeiboFavorites(rows, favoritesUrl);
221
+ if (!uniqueRows.length) {
222
+ throw new Error("Failed to parse visible Weibo favorites.");
223
+ }
224
+ return uniqueRows.slice(0, limit);
225
+ },
226
+ });
227
+ cli({
228
+ site: "weibo",
229
+ name: "publish",
230
+ description: "Publish a new Weibo post immediately",
231
+ domain: "weibo.com",
232
+ strategy: Strategy.UI,
233
+ browser: true,
234
+ args: [
235
+ { name: "text", type: "str", required: true, positional: true },
236
+ { name: "images", type: "str", required: false },
237
+ ],
238
+ columns: ["status", "message", "text"],
239
+ func: async (page, kwargs) => {
240
+ const p = page;
241
+ const text = validateWeiboPublishText(kwargs.text);
242
+ const imagePaths = validateWeiboImagePaths(kwargs.images);
243
+ await p.goto("https://weibo.com", { waitUntil: "load", settleMs: 2000 });
244
+ await p.wait(2);
245
+ await getWeiboSelfUid(p);
246
+ const openResult = (await p.evaluate(`(() => {
247
+ const visible = (element) => Boolean(element && element.offsetParent !== null && !element.disabled);
248
+ const buttons = document.querySelectorAll('button[title="发微博"], button[title="写微博"]');
249
+ for (const button of buttons) {
250
+ if (visible(button)) {
251
+ button.click();
252
+ return { ok: true };
253
+ }
254
+ }
255
+ return { ok: false, message: 'Could not find 发微博 button' };
256
+ })()`));
257
+ if (!openResult?.ok) {
258
+ throw new Error(String(openResult?.message || "Could not open compose editor."));
259
+ }
260
+ const editorResult = await waitForTruthy(p, `(() => {
261
+ const textarea = document.querySelector(${JSON.stringify(TEXTAREA_SELECTOR)});
262
+ if (!textarea) return { found: false };
263
+ const visible = textarea.offsetParent !== null;
264
+ return { found: true, visible, rectTop: visible ? textarea.getBoundingClientRect().top : -1 };
265
+ })()`, 34, 0.3);
266
+ if (!editorResult?.found ||
267
+ !editorResult.visible ||
268
+ Number(editorResult.rectTop) < 0) {
269
+ throw new Error("Weibo compose editor did not appear.");
270
+ }
271
+ if (imagePaths.length > 0) {
272
+ const fileInputFound = await p.evaluate(`(() => {
273
+ return Boolean(document.querySelector(${JSON.stringify(FILE_INPUT_SELECTOR)}));
274
+ })()`);
275
+ if (!fileInputFound) {
276
+ throw new Error("Could not find image file input on Weibo compose page.");
277
+ }
278
+ await p.setFileInput(FILE_INPUT_SELECTOR, imagePaths);
279
+ const uploadResult = await waitForTruthy(p, `(() => {
280
+ const expectedCount = ${JSON.stringify(imagePaths.length)};
281
+ const uploading = document.querySelector('[class*="upload"], [class*="progress"]');
282
+ if (uploading && uploading.offsetParent !== null) return null;
283
+ const images = document.querySelectorAll('img[class*="pic"], [class*="imgItem"], [class*="picture"] img');
284
+ if (images.length >= expectedCount) return { ok: true, count: images.length };
285
+ return null;
286
+ })()`, 20, 1.5);
287
+ if (!uploadResult?.ok) {
288
+ throw new Error("Image upload did not complete before timeout.");
289
+ }
290
+ }
291
+ const insertResult = (await p.evaluate(`(() => {
292
+ const textarea = document.querySelector(${JSON.stringify(TEXTAREA_SELECTOR)});
293
+ if (!textarea || textarea.offsetParent === null) return { ok: false, message: 'textarea not visible' };
294
+ textarea.focus();
295
+ const nativeSetter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;
296
+ if (nativeSetter) nativeSetter.call(textarea, ${JSON.stringify(text)});
297
+ else textarea.value = ${JSON.stringify(text)};
298
+ textarea.dispatchEvent(new Event('input', { bubbles: true }));
299
+ textarea.dispatchEvent(new Event('change', { bubbles: true }));
300
+ return { ok: true, valueLength: textarea.value.length };
301
+ })()`));
302
+ if (!insertResult?.ok) {
303
+ throw new Error(String(insertResult?.message || "Could not insert text."));
304
+ }
305
+ await p.wait(0.5);
306
+ const publishClick = (await p.evaluate(`(() => {
307
+ const visible = (element) => Boolean(element && element.offsetParent !== null && !element.disabled);
308
+ for (const label of ['发送', '发布']) {
309
+ const buttons = document.querySelectorAll('button, [role="button"]');
310
+ for (const button of buttons) {
311
+ const value = (button.innerText || button.textContent || '').trim();
312
+ if (value === label && visible(button)) {
313
+ button.click();
314
+ return { ok: true, label };
315
+ }
316
+ }
317
+ }
318
+ return { ok: false, message: 'Could not find send button' };
319
+ })()`));
320
+ if (!publishClick?.ok) {
321
+ throw new Error(String(publishClick?.message || "Could not click publish."));
322
+ }
323
+ const finalResult = await waitForTruthy(p, `(() => {
324
+ const successMarkers = ['发布成功', '已发布', '发送成功'];
325
+ const errorMarkers = ['发布失败', '发送失败', '内容违规', '请稍后再试', '频繁'];
326
+ for (const element of document.querySelectorAll('*')) {
327
+ if (element.children.length > 3) continue;
328
+ const value = (element.innerText || '').trim();
329
+ if (!value || value.length > 100) continue;
330
+ for (const marker of successMarkers) {
331
+ if (value.includes(marker) && (value.includes('成功') || value.includes('微博'))) {
332
+ return { ok: true, message: value };
333
+ }
334
+ }
335
+ for (const marker of errorMarkers) {
336
+ if (value.includes(marker)) return { ok: false, message: value };
337
+ }
338
+ }
339
+ return null;
340
+ })()`, 40, 0.5);
341
+ if (!finalResult) {
342
+ throw new Error("Publish button clicked but result was unclear. Check Weibo manually.");
343
+ }
344
+ if (!finalResult.ok) {
345
+ throw new Error(String(finalResult.message || "Weibo publish failed."));
346
+ }
347
+ return [
348
+ {
349
+ status: "success",
350
+ message: String(finalResult.message || "Published successfully"),
351
+ text,
352
+ },
353
+ ];
354
+ },
355
+ });
356
+ //# sourceMappingURL=favorites-publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorites-publish.js","sourceRoot":"","sources":["../../../src/adapters/weibo/favorites-publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @owner src/adapters/wikidata/entities.ts
3
+ * @does Register agent-facing Wikidata entity search and detail commands.
4
+ * @needs Wikidata public APIs, language validation, Q/P/L entity id validation.
5
+ * @feeds surface coverage ledger, Wikidata search rows, entity summary rows.
6
+ * @breaks Wikidata API drift, weak id validation, or silent empty rows hide entity lookup failures.
7
+ */
8
+ export declare function requireWikidataLimit(value: unknown): number;
9
+ export declare function requireWikidataLanguage(value: unknown): string;
10
+ export declare function requireWikidataEntityId(value: unknown): string;
11
+ export declare function pickLocalizedValue(map: unknown, language: string): string | null;
12
+ export declare function joinLocalizedAliases(value: unknown, language: string, max?: number): string;
13
+ export declare function mapWikidataSearchRows(rows: Array<Record<string, unknown>>, limit: number): Array<Record<string, unknown>>;
14
+ export declare function mapWikidataEntityRow(id: string, entity: Record<string, unknown>, language: string): Record<string, unknown>;
15
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../../src/adapters/wikidata/entities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ3D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ9D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU9D;AAYD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,SAAI,GACN,MAAM,CAWR;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACpC,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAchC;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgBzB"}