@zenalexa/unicli 0.220.1 → 0.221.1

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 (586) hide show
  1. package/AGENTS.md +35 -13
  2. package/README.md +18 -16
  3. package/README.zh-CN.md +18 -16
  4. package/dist/adapters/acl-anthology/papers.d.ts +16 -0
  5. package/dist/adapters/acl-anthology/papers.d.ts.map +1 -0
  6. package/dist/adapters/acl-anthology/papers.js +135 -0
  7. package/dist/adapters/acl-anthology/papers.js.map +1 -0
  8. package/dist/adapters/arxiv/papers.js +2 -0
  9. package/dist/adapters/arxiv/papers.js.map +1 -1
  10. package/dist/adapters/baidu-scholar/search.js +5 -0
  11. package/dist/adapters/baidu-scholar/search.js.map +1 -1
  12. package/dist/adapters/bilibili/comments.js +66 -4
  13. package/dist/adapters/bilibili/comments.js.map +1 -1
  14. package/dist/adapters/bilibili/compat.js +2 -2
  15. package/dist/adapters/bilibili/compat.js.map +1 -1
  16. package/dist/adapters/bilibili/download.js +4 -4
  17. package/dist/adapters/bilibili/download.js.map +1 -1
  18. package/dist/adapters/bilibili/wbi.d.ts.map +1 -1
  19. package/dist/adapters/bilibili/wbi.js +3 -3
  20. package/dist/adapters/bilibili/wbi.js.map +1 -1
  21. package/dist/adapters/cipo/_shared.d.ts +21 -0
  22. package/dist/adapters/cipo/_shared.d.ts.map +1 -0
  23. package/dist/adapters/cipo/_shared.js +67 -0
  24. package/dist/adapters/cipo/_shared.js.map +1 -0
  25. package/dist/adapters/cipo/get.d.ts +19 -0
  26. package/dist/adapters/cipo/get.d.ts.map +1 -0
  27. package/dist/adapters/cipo/get.js +140 -0
  28. package/dist/adapters/cipo/get.js.map +1 -0
  29. package/dist/adapters/cipo/legal-status.d.ts +19 -0
  30. package/dist/adapters/cipo/legal-status.d.ts.map +1 -0
  31. package/dist/adapters/cipo/legal-status.js +111 -0
  32. package/dist/adapters/cipo/legal-status.js.map +1 -0
  33. package/dist/adapters/cipo/search.d.ts +20 -0
  34. package/dist/adapters/cipo/search.d.ts.map +1 -0
  35. package/dist/adapters/cipo/search.js +148 -0
  36. package/dist/adapters/cipo/search.js.map +1 -0
  37. package/dist/adapters/cnipa/_shared.d.ts +47 -0
  38. package/dist/adapters/cnipa/_shared.d.ts.map +1 -0
  39. package/dist/adapters/cnipa/_shared.js +97 -0
  40. package/dist/adapters/cnipa/_shared.js.map +1 -0
  41. package/dist/adapters/cnipa/get.d.ts +19 -0
  42. package/dist/adapters/cnipa/get.d.ts.map +1 -0
  43. package/dist/adapters/cnipa/get.js +149 -0
  44. package/dist/adapters/cnipa/get.js.map +1 -0
  45. package/dist/adapters/cnipa/legal-status.d.ts +19 -0
  46. package/dist/adapters/cnipa/legal-status.d.ts.map +1 -0
  47. package/dist/adapters/cnipa/legal-status.js +119 -0
  48. package/dist/adapters/cnipa/legal-status.js.map +1 -0
  49. package/dist/adapters/cnipa/search.d.ts +21 -0
  50. package/dist/adapters/cnipa/search.d.ts.map +1 -0
  51. package/dist/adapters/cnipa/search.js +170 -0
  52. package/dist/adapters/cnipa/search.js.map +1 -0
  53. package/dist/adapters/crossref/works.d.ts +42 -0
  54. package/dist/adapters/crossref/works.d.ts.map +1 -0
  55. package/dist/adapters/crossref/works.js +157 -0
  56. package/dist/adapters/crossref/works.js.map +1 -0
  57. package/dist/adapters/cvf/papers.d.ts +17 -0
  58. package/dist/adapters/cvf/papers.d.ts.map +1 -0
  59. package/dist/adapters/cvf/papers.js +124 -0
  60. package/dist/adapters/cvf/papers.js.map +1 -0
  61. package/dist/adapters/dblp/publications.js +4 -0
  62. package/dist/adapters/dblp/publications.js.map +1 -1
  63. package/dist/adapters/espacenet/_shared.d.ts +21 -0
  64. package/dist/adapters/espacenet/_shared.d.ts.map +1 -0
  65. package/dist/adapters/espacenet/_shared.js +67 -0
  66. package/dist/adapters/espacenet/_shared.js.map +1 -0
  67. package/dist/adapters/espacenet/family.d.ts +19 -0
  68. package/dist/adapters/espacenet/family.d.ts.map +1 -0
  69. package/dist/adapters/espacenet/family.js +118 -0
  70. package/dist/adapters/espacenet/family.js.map +1 -0
  71. package/dist/adapters/espacenet/get.d.ts +19 -0
  72. package/dist/adapters/espacenet/get.d.ts.map +1 -0
  73. package/dist/adapters/espacenet/get.js +130 -0
  74. package/dist/adapters/espacenet/get.js.map +1 -0
  75. package/dist/adapters/espacenet/legal-status.d.ts +19 -0
  76. package/dist/adapters/espacenet/legal-status.d.ts.map +1 -0
  77. package/dist/adapters/espacenet/legal-status.js +110 -0
  78. package/dist/adapters/espacenet/legal-status.js.map +1 -0
  79. package/dist/adapters/espacenet/search.d.ts +20 -0
  80. package/dist/adapters/espacenet/search.d.ts.map +1 -0
  81. package/dist/adapters/espacenet/search.js +165 -0
  82. package/dist/adapters/espacenet/search.js.map +1 -0
  83. package/dist/adapters/facebook/subtitles.d.ts +9 -0
  84. package/dist/adapters/facebook/subtitles.d.ts.map +1 -0
  85. package/dist/adapters/facebook/subtitles.js +42 -0
  86. package/dist/adapters/facebook/subtitles.js.map +1 -0
  87. package/dist/adapters/fips/_shared.d.ts +21 -0
  88. package/dist/adapters/fips/_shared.d.ts.map +1 -0
  89. package/dist/adapters/fips/_shared.js +77 -0
  90. package/dist/adapters/fips/_shared.js.map +1 -0
  91. package/dist/adapters/fips/get.d.ts +19 -0
  92. package/dist/adapters/fips/get.d.ts.map +1 -0
  93. package/dist/adapters/fips/get.js +139 -0
  94. package/dist/adapters/fips/get.js.map +1 -0
  95. package/dist/adapters/fips/search.d.ts +20 -0
  96. package/dist/adapters/fips/search.d.ts.map +1 -0
  97. package/dist/adapters/fips/search.js +148 -0
  98. package/dist/adapters/fips/search.js.map +1 -0
  99. package/dist/adapters/freepatentsonline-web/_shared.d.ts +72 -0
  100. package/dist/adapters/freepatentsonline-web/_shared.d.ts.map +1 -0
  101. package/dist/adapters/freepatentsonline-web/_shared.js +216 -0
  102. package/dist/adapters/freepatentsonline-web/_shared.js.map +1 -0
  103. package/dist/adapters/freepatentsonline-web/get.d.ts +21 -0
  104. package/dist/adapters/freepatentsonline-web/get.d.ts.map +1 -0
  105. package/dist/adapters/freepatentsonline-web/get.js +127 -0
  106. package/dist/adapters/freepatentsonline-web/get.js.map +1 -0
  107. package/dist/adapters/freepatentsonline-web/search.d.ts +22 -0
  108. package/dist/adapters/freepatentsonline-web/search.d.ts.map +1 -0
  109. package/dist/adapters/freepatentsonline-web/search.js +149 -0
  110. package/dist/adapters/freepatentsonline-web/search.js.map +1 -0
  111. package/dist/adapters/google-patents-web/_shared.d.ts +110 -0
  112. package/dist/adapters/google-patents-web/_shared.d.ts.map +1 -0
  113. package/dist/adapters/google-patents-web/_shared.js +164 -0
  114. package/dist/adapters/google-patents-web/_shared.js.map +1 -0
  115. package/dist/adapters/google-patents-web/get.d.ts +36 -0
  116. package/dist/adapters/google-patents-web/get.d.ts.map +1 -0
  117. package/dist/adapters/google-patents-web/get.js +187 -0
  118. package/dist/adapters/google-patents-web/get.js.map +1 -0
  119. package/dist/adapters/google-patents-web/search.d.ts +23 -0
  120. package/dist/adapters/google-patents-web/search.d.ts.map +1 -0
  121. package/dist/adapters/google-patents-web/search.js +169 -0
  122. package/dist/adapters/google-patents-web/search.js.map +1 -0
  123. package/dist/adapters/google-scholar/cite.js +1 -0
  124. package/dist/adapters/google-scholar/cite.js.map +1 -1
  125. package/dist/adapters/google-scholar/profile.js +5 -0
  126. package/dist/adapters/google-scholar/profile.js.map +1 -1
  127. package/dist/adapters/google-scholar/search.js +5 -0
  128. package/dist/adapters/google-scholar/search.js.map +1 -1
  129. package/dist/adapters/hf/paper.js +1 -0
  130. package/dist/adapters/hf/paper.js.map +1 -1
  131. package/dist/adapters/inpi-br/_shared.d.ts +21 -0
  132. package/dist/adapters/inpi-br/_shared.d.ts.map +1 -0
  133. package/dist/adapters/inpi-br/_shared.js +67 -0
  134. package/dist/adapters/inpi-br/_shared.js.map +1 -0
  135. package/dist/adapters/inpi-br/get.d.ts +19 -0
  136. package/dist/adapters/inpi-br/get.d.ts.map +1 -0
  137. package/dist/adapters/inpi-br/get.js +142 -0
  138. package/dist/adapters/inpi-br/get.js.map +1 -0
  139. package/dist/adapters/inpi-br/search.d.ts +20 -0
  140. package/dist/adapters/inpi-br/search.d.ts.map +1 -0
  141. package/dist/adapters/inpi-br/search.js +154 -0
  142. package/dist/adapters/inpi-br/search.js.map +1 -0
  143. package/dist/adapters/instagram/subtitles.d.ts +9 -0
  144. package/dist/adapters/instagram/subtitles.d.ts.map +1 -0
  145. package/dist/adapters/instagram/subtitles.js +42 -0
  146. package/dist/adapters/instagram/subtitles.js.map +1 -0
  147. package/dist/adapters/mastodon/statuses.d.ts +40 -0
  148. package/dist/adapters/mastodon/statuses.d.ts.map +1 -0
  149. package/dist/adapters/mastodon/statuses.js +153 -0
  150. package/dist/adapters/mastodon/statuses.js.map +1 -0
  151. package/dist/adapters/neurips/proceedings.d.ts +17 -0
  152. package/dist/adapters/neurips/proceedings.d.ts.map +1 -0
  153. package/dist/adapters/neurips/proceedings.js +112 -0
  154. package/dist/adapters/neurips/proceedings.js.map +1 -0
  155. package/dist/adapters/openalex/works.d.ts.map +1 -1
  156. package/dist/adapters/openalex/works.js +32 -0
  157. package/dist/adapters/openalex/works.js.map +1 -1
  158. package/dist/adapters/openreview/papers.js +5 -0
  159. package/dist/adapters/openreview/papers.js.map +1 -1
  160. package/dist/adapters/pmlr/proceedings.d.ts +35 -0
  161. package/dist/adapters/pmlr/proceedings.d.ts.map +1 -0
  162. package/dist/adapters/pmlr/proceedings.js +139 -0
  163. package/dist/adapters/pmlr/proceedings.js.map +1 -0
  164. package/dist/adapters/pubmed/articles.js +5 -0
  165. package/dist/adapters/pubmed/articles.js.map +1 -1
  166. package/dist/adapters/reddit/comments.d.ts +9 -0
  167. package/dist/adapters/reddit/comments.d.ts.map +1 -0
  168. package/dist/adapters/reddit/comments.js +124 -0
  169. package/dist/adapters/reddit/comments.js.map +1 -0
  170. package/dist/adapters/semantic-scholar/papers.d.ts +36 -0
  171. package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -0
  172. package/dist/adapters/semantic-scholar/papers.js +214 -0
  173. package/dist/adapters/semantic-scholar/papers.js.map +1 -0
  174. package/dist/adapters/threads/post.d.ts +32 -0
  175. package/dist/adapters/threads/post.d.ts.map +1 -0
  176. package/dist/adapters/threads/post.js +287 -0
  177. package/dist/adapters/threads/post.js.map +1 -0
  178. package/dist/adapters/tiktok/subtitles.d.ts +9 -0
  179. package/dist/adapters/tiktok/subtitles.d.ts.map +1 -0
  180. package/dist/adapters/tiktok/subtitles.js +42 -0
  181. package/dist/adapters/tiktok/subtitles.js.map +1 -0
  182. package/dist/adapters/twitter/accept.js +2 -2
  183. package/dist/adapters/twitter/accept.js.map +1 -1
  184. package/dist/adapters/twitter/browser-fallback.d.ts +26 -0
  185. package/dist/adapters/twitter/browser-fallback.d.ts.map +1 -0
  186. package/dist/adapters/twitter/browser-fallback.js +93 -0
  187. package/dist/adapters/twitter/browser-fallback.js.map +1 -0
  188. package/dist/adapters/twitter/browser-state.d.ts +11 -0
  189. package/dist/adapters/twitter/browser-state.d.ts.map +1 -0
  190. package/dist/adapters/twitter/browser-state.js +46 -0
  191. package/dist/adapters/twitter/browser-state.js.map +1 -0
  192. package/dist/adapters/twitter/client.d.ts.map +1 -1
  193. package/dist/adapters/twitter/client.js +36 -13
  194. package/dist/adapters/twitter/client.js.map +1 -1
  195. package/dist/adapters/twitter/reply-dm.js +2 -2
  196. package/dist/adapters/twitter/reply-dm.js.map +1 -1
  197. package/dist/adapters/twitter/reply.js +1 -0
  198. package/dist/adapters/twitter/reply.js.map +1 -1
  199. package/dist/adapters/twitter/search.js +11 -18
  200. package/dist/adapters/twitter/search.js.map +1 -1
  201. package/dist/adapters/twitter/thread.d.ts +14 -0
  202. package/dist/adapters/twitter/thread.d.ts.map +1 -1
  203. package/dist/adapters/twitter/thread.js +28 -2
  204. package/dist/adapters/twitter/thread.js.map +1 -1
  205. package/dist/adapters/twitter/trending.js +13 -59
  206. package/dist/adapters/twitter/trending.js.map +1 -1
  207. package/dist/adapters/unpaywall/works.d.ts +33 -0
  208. package/dist/adapters/unpaywall/works.d.ts.map +1 -0
  209. package/dist/adapters/unpaywall/works.js +101 -0
  210. package/dist/adapters/unpaywall/works.js.map +1 -0
  211. package/dist/adapters/xiaohongshu/browser-state.d.ts +19 -0
  212. package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -0
  213. package/dist/adapters/xiaohongshu/browser-state.js +67 -0
  214. package/dist/adapters/xiaohongshu/browser-state.js.map +1 -0
  215. package/dist/adapters/xiaohongshu/comments.js +28 -5
  216. package/dist/adapters/xiaohongshu/comments.js.map +1 -1
  217. package/dist/adapters/xiaohongshu/download.js +49 -11
  218. package/dist/adapters/xiaohongshu/download.js.map +1 -1
  219. package/dist/adapters/xiaohongshu/search.d.ts.map +1 -1
  220. package/dist/adapters/xiaohongshu/search.js +11 -5
  221. package/dist/adapters/xiaohongshu/search.js.map +1 -1
  222. package/dist/adapters/xiaohongshu/trending.d.ts +9 -0
  223. package/dist/adapters/xiaohongshu/trending.d.ts.map +1 -0
  224. package/dist/adapters/xiaohongshu/trending.js +94 -0
  225. package/dist/adapters/xiaohongshu/trending.js.map +1 -0
  226. package/dist/adapters/youtube/comments.d.ts +80 -0
  227. package/dist/adapters/youtube/comments.d.ts.map +1 -1
  228. package/dist/adapters/youtube/comments.js +108 -12
  229. package/dist/adapters/youtube/comments.js.map +1 -1
  230. package/dist/adapters/youtube/subtitles.d.ts +9 -0
  231. package/dist/adapters/youtube/subtitles.d.ts.map +1 -0
  232. package/dist/adapters/youtube/subtitles.js +42 -0
  233. package/dist/adapters/youtube/subtitles.js.map +1 -0
  234. package/dist/adapters/yt-dlp/subtitles.d.ts +9 -0
  235. package/dist/adapters/yt-dlp/subtitles.d.ts.map +1 -0
  236. package/dist/adapters/yt-dlp/subtitles.js +41 -0
  237. package/dist/adapters/yt-dlp/subtitles.js.map +1 -0
  238. package/dist/adapters/zhihu/answer-detail.d.ts +39 -0
  239. package/dist/adapters/zhihu/answer-detail.d.ts.map +1 -0
  240. package/dist/adapters/zhihu/answer-detail.js +204 -0
  241. package/dist/adapters/zhihu/answer-detail.js.map +1 -0
  242. package/dist/adapters/zhihu/comment.d.ts +9 -0
  243. package/dist/adapters/zhihu/comment.d.ts.map +1 -0
  244. package/dist/adapters/zhihu/comment.js +149 -0
  245. package/dist/adapters/zhihu/comment.js.map +1 -0
  246. package/dist/adapters/zhihu/recommend.d.ts +36 -0
  247. package/dist/adapters/zhihu/recommend.d.ts.map +1 -0
  248. package/dist/adapters/zhihu/recommend.js +151 -0
  249. package/dist/adapters/zhihu/recommend.js.map +1 -0
  250. package/dist/browser/bridge.d.ts.map +1 -1
  251. package/dist/browser/bridge.js +14 -3
  252. package/dist/browser/bridge.js.map +1 -1
  253. package/dist/browser/daemon-client.d.ts +6 -0
  254. package/dist/browser/daemon-client.d.ts.map +1 -1
  255. package/dist/browser/daemon-client.js +75 -15
  256. package/dist/browser/daemon-client.js.map +1 -1
  257. package/dist/browser/daemon.js +39 -15
  258. package/dist/browser/daemon.js.map +1 -1
  259. package/dist/browser/protocol.d.ts +1 -0
  260. package/dist/browser/protocol.d.ts.map +1 -1
  261. package/dist/browser/protocol.js +1 -0
  262. package/dist/browser/protocol.js.map +1 -1
  263. package/dist/cli.d.ts.map +1 -1
  264. package/dist/cli.js +21 -1
  265. package/dist/cli.js.map +1 -1
  266. package/dist/commands/approvals.d.ts.map +1 -1
  267. package/dist/commands/approvals.js +1 -37
  268. package/dist/commands/approvals.js.map +1 -1
  269. package/dist/commands/browser/index.d.ts.map +1 -1
  270. package/dist/commands/browser/index.js +7 -2
  271. package/dist/commands/browser/index.js.map +1 -1
  272. package/dist/commands/daemon.d.ts.map +1 -1
  273. package/dist/commands/daemon.js +7 -3
  274. package/dist/commands/daemon.js.map +1 -1
  275. package/dist/commands/dispatch.d.ts.map +1 -1
  276. package/dist/commands/dispatch.js +27 -3
  277. package/dist/commands/dispatch.js.map +1 -1
  278. package/dist/commands/do.d.ts +30 -0
  279. package/dist/commands/do.d.ts.map +1 -0
  280. package/dist/commands/do.js +248 -0
  281. package/dist/commands/do.js.map +1 -0
  282. package/dist/commands/extract.d.ts +34 -0
  283. package/dist/commands/extract.d.ts.map +1 -0
  284. package/dist/commands/extract.js +316 -0
  285. package/dist/commands/extract.js.map +1 -0
  286. package/dist/commands/patent-doctor.d.ts +48 -0
  287. package/dist/commands/patent-doctor.d.ts.map +1 -0
  288. package/dist/commands/patent-doctor.js +109 -0
  289. package/dist/commands/patent-doctor.js.map +1 -0
  290. package/dist/commands/patent.d.ts +78 -0
  291. package/dist/commands/patent.d.ts.map +1 -0
  292. package/dist/commands/patent.js +919 -0
  293. package/dist/commands/patent.js.map +1 -0
  294. package/dist/commands/scholar.d.ts +33 -0
  295. package/dist/commands/scholar.d.ts.map +1 -0
  296. package/dist/commands/scholar.js +494 -0
  297. package/dist/commands/scholar.js.map +1 -0
  298. package/dist/commands/search.d.ts.map +1 -1
  299. package/dist/commands/search.js +2 -5
  300. package/dist/commands/search.js.map +1 -1
  301. package/dist/commands/social.d.ts +19 -0
  302. package/dist/commands/social.d.ts.map +1 -0
  303. package/dist/commands/social.js +236 -0
  304. package/dist/commands/social.js.map +1 -0
  305. package/dist/core/registry.d.ts +1 -1
  306. package/dist/core/registry.d.ts.map +1 -1
  307. package/dist/core/registry.js +11 -2
  308. package/dist/core/registry.js.map +1 -1
  309. package/dist/discovery/aliases.d.ts +2 -2
  310. package/dist/discovery/aliases.d.ts.map +1 -1
  311. package/dist/discovery/aliases.js +182 -11
  312. package/dist/discovery/aliases.js.map +1 -1
  313. package/dist/discovery/intents.d.ts +10 -0
  314. package/dist/discovery/intents.d.ts.map +1 -0
  315. package/dist/discovery/intents.js +255 -0
  316. package/dist/discovery/intents.js.map +1 -0
  317. package/dist/discovery/loader.d.ts.map +1 -1
  318. package/dist/discovery/loader.js +4 -0
  319. package/dist/discovery/loader.js.map +1 -1
  320. package/dist/discovery/search.d.ts +4 -1
  321. package/dist/discovery/search.d.ts.map +1 -1
  322. package/dist/discovery/search.js +28 -140
  323. package/dist/discovery/search.js.map +1 -1
  324. package/dist/engine/approval-presenter.d.ts +10 -0
  325. package/dist/engine/approval-presenter.d.ts.map +1 -0
  326. package/dist/engine/approval-presenter.js +45 -0
  327. package/dist/engine/approval-presenter.js.map +1 -0
  328. package/dist/engine/approval-store.d.ts +4 -0
  329. package/dist/engine/approval-store.d.ts.map +1 -1
  330. package/dist/engine/approval-store.js +85 -11
  331. package/dist/engine/approval-store.js.map +1 -1
  332. package/dist/engine/auth/oauth2-cc.d.ts +67 -0
  333. package/dist/engine/auth/oauth2-cc.d.ts.map +1 -0
  334. package/dist/engine/auth/oauth2-cc.js +120 -0
  335. package/dist/engine/auth/oauth2-cc.js.map +1 -0
  336. package/dist/engine/cookies.d.ts +10 -0
  337. package/dist/engine/cookies.d.ts.map +1 -1
  338. package/dist/engine/cookies.js +64 -0
  339. package/dist/engine/cookies.js.map +1 -1
  340. package/dist/engine/download.d.ts +5 -0
  341. package/dist/engine/download.d.ts.map +1 -1
  342. package/dist/engine/download.js +11 -4
  343. package/dist/engine/download.js.map +1 -1
  344. package/dist/engine/executor.d.ts +1 -0
  345. package/dist/engine/executor.d.ts.map +1 -1
  346. package/dist/engine/executor.js +25 -0
  347. package/dist/engine/executor.js.map +1 -1
  348. package/dist/engine/framework.d.ts +5 -5
  349. package/dist/engine/framework.js +5 -5
  350. package/dist/engine/harden.d.ts +1 -1
  351. package/dist/engine/harden.js +1 -1
  352. package/dist/engine/kernel/stages.d.ts.map +1 -1
  353. package/dist/engine/kernel/stages.js +2 -1
  354. package/dist/engine/kernel/stages.js.map +1 -1
  355. package/dist/engine/normalizer/patent-envelope.d.ts +61 -0
  356. package/dist/engine/normalizer/patent-envelope.d.ts.map +1 -0
  357. package/dist/engine/normalizer/patent-envelope.js +132 -0
  358. package/dist/engine/normalizer/patent-envelope.js.map +1 -0
  359. package/dist/engine/research.d.ts +5 -7
  360. package/dist/engine/research.d.ts.map +1 -1
  361. package/dist/engine/research.js +6 -9
  362. package/dist/engine/research.js.map +1 -1
  363. package/dist/engine/steps/browser-helpers.d.ts +2 -2
  364. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  365. package/dist/engine/steps/browser-helpers.js +39 -16
  366. package/dist/engine/steps/browser-helpers.js.map +1 -1
  367. package/dist/engine/steps/download.d.ts +1 -0
  368. package/dist/engine/steps/download.d.ts.map +1 -1
  369. package/dist/engine/steps/download.js +3 -1
  370. package/dist/engine/steps/download.js.map +1 -1
  371. package/dist/engine/steps/index.d.ts +2 -0
  372. package/dist/engine/steps/index.d.ts.map +1 -1
  373. package/dist/engine/steps/index.js +2 -0
  374. package/dist/engine/steps/index.js.map +1 -1
  375. package/dist/engine/steps/oauth2-token.d.ts +41 -0
  376. package/dist/engine/steps/oauth2-token.d.ts.map +1 -0
  377. package/dist/engine/steps/oauth2-token.js +115 -0
  378. package/dist/engine/steps/oauth2-token.js.map +1 -0
  379. package/dist/engine/steps/select-xml.d.ts +34 -0
  380. package/dist/engine/steps/select-xml.d.ts.map +1 -0
  381. package/dist/engine/steps/select-xml.js +222 -0
  382. package/dist/engine/steps/select-xml.js.map +1 -0
  383. package/dist/engine/template.d.ts.map +1 -1
  384. package/dist/engine/template.js +7 -0
  385. package/dist/engine/template.js.map +1 -1
  386. package/dist/engine/transport/mcp-browser.d.ts +128 -0
  387. package/dist/engine/transport/mcp-browser.d.ts.map +1 -0
  388. package/dist/engine/transport/mcp-browser.js +120 -0
  389. package/dist/engine/transport/mcp-browser.js.map +1 -0
  390. package/dist/fast-path/handlers/approvals.d.ts +11 -0
  391. package/dist/fast-path/handlers/approvals.d.ts.map +1 -0
  392. package/dist/fast-path/handlers/approvals.js +136 -0
  393. package/dist/fast-path/handlers/approvals.js.map +1 -0
  394. package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
  395. package/dist/fast-path/handlers/discovery.js +17 -3
  396. package/dist/fast-path/handlers/discovery.js.map +1 -1
  397. package/dist/fast-path/manifest.d.ts +1 -0
  398. package/dist/fast-path/manifest.d.ts.map +1 -1
  399. package/dist/fast-path/manifest.js.map +1 -1
  400. package/dist/fast-path.d.ts.map +1 -1
  401. package/dist/fast-path.js +3 -0
  402. package/dist/fast-path.js.map +1 -1
  403. package/dist/index.d.ts +23 -0
  404. package/dist/index.d.ts.map +1 -0
  405. package/dist/index.js +38 -0
  406. package/dist/index.js.map +1 -0
  407. package/dist/manifest-compact.txt +13 -11
  408. package/dist/manifest-search.json +1 -1
  409. package/dist/manifest.json +2560 -103
  410. package/dist/mcp/handler.d.ts.map +1 -1
  411. package/dist/mcp/handler.js +14 -2
  412. package/dist/mcp/handler.js.map +1 -1
  413. package/dist/mcp/tools.d.ts.map +1 -1
  414. package/dist/mcp/tools.js +11 -3
  415. package/dist/mcp/tools.js.map +1 -1
  416. package/dist/output/auth-guidance.d.ts +14 -0
  417. package/dist/output/auth-guidance.d.ts.map +1 -0
  418. package/dist/output/auth-guidance.js +50 -0
  419. package/dist/output/auth-guidance.js.map +1 -0
  420. package/dist/output/error-map.d.ts +1 -1
  421. package/dist/output/error-map.d.ts.map +1 -1
  422. package/dist/output/error-map.js +28 -4
  423. package/dist/output/error-map.js.map +1 -1
  424. package/dist/output/next-actions.d.ts.map +1 -1
  425. package/dist/output/next-actions.js +19 -3
  426. package/dist/output/next-actions.js.map +1 -1
  427. package/dist/registry.d.ts +19 -1
  428. package/dist/registry.d.ts.map +1 -1
  429. package/dist/registry.js +10 -0
  430. package/dist/registry.js.map +1 -1
  431. package/dist/social/browser-errors.d.ts +13 -0
  432. package/dist/social/browser-errors.d.ts.map +1 -0
  433. package/dist/social/browser-errors.js +36 -0
  434. package/dist/social/browser-errors.js.map +1 -0
  435. package/dist/social/capabilities.d.ts +29 -0
  436. package/dist/social/capabilities.d.ts.map +1 -0
  437. package/dist/social/capabilities.js +448 -0
  438. package/dist/social/capabilities.js.map +1 -0
  439. package/dist/social/comments.d.ts +26 -0
  440. package/dist/social/comments.d.ts.map +1 -0
  441. package/dist/social/comments.js +97 -0
  442. package/dist/social/comments.js.map +1 -0
  443. package/dist/social/video-text.d.ts +27 -0
  444. package/dist/social/video-text.d.ts.map +1 -0
  445. package/dist/social/video-text.js +140 -0
  446. package/dist/social/video-text.js.map +1 -0
  447. package/dist/types/patent.d.ts +160 -0
  448. package/dist/types/patent.d.ts.map +1 -0
  449. package/dist/types/patent.js +16 -0
  450. package/dist/types/patent.js.map +1 -0
  451. package/dist/types/scholarly.d.ts +49 -0
  452. package/dist/types/scholarly.d.ts.map +1 -0
  453. package/dist/types/scholarly.js +16 -0
  454. package/dist/types/scholarly.js.map +1 -0
  455. package/dist/types.d.ts +12 -0
  456. package/dist/types.d.ts.map +1 -1
  457. package/dist/types.js.map +1 -1
  458. package/package.json +9 -4
  459. package/server.json +3 -3
  460. package/skills/unicli/SKILL.md +1 -1
  461. package/skills/unicli-claude-code/SKILL.md +1 -1
  462. package/skills/unicli-hermes/SKILL.md +1 -1
  463. package/src/adapters/acl-anthology/papers.ts +157 -0
  464. package/src/adapters/arxiv/download.yaml +1 -1
  465. package/src/adapters/arxiv/paper.yaml +1 -1
  466. package/src/adapters/arxiv/papers.ts +2 -0
  467. package/src/adapters/arxiv/search.yaml +1 -1
  468. package/src/adapters/arxiv/trending.yaml +1 -1
  469. package/src/adapters/baidu-scholar/search.ts +5 -0
  470. package/src/adapters/bilibili/comments-tree.test.ts +41 -0
  471. package/src/adapters/bilibili/comments.ts +78 -4
  472. package/src/adapters/bilibili/compat.ts +5 -2
  473. package/src/adapters/bilibili/download.ts +7 -4
  474. package/src/adapters/bilibili/wbi.ts +6 -3
  475. package/src/adapters/brave/search.yaml +53 -0
  476. package/src/adapters/cipo/_shared.ts +98 -0
  477. package/src/adapters/cipo/get.ts +188 -0
  478. package/src/adapters/cipo/legal-status.ts +148 -0
  479. package/src/adapters/cipo/search.ts +195 -0
  480. package/src/adapters/cnipa/_shared.ts +138 -0
  481. package/src/adapters/cnipa/get.ts +199 -0
  482. package/src/adapters/cnipa/legal-status.ts +162 -0
  483. package/src/adapters/cnipa/search.ts +229 -0
  484. package/src/adapters/crossref/works.ts +209 -0
  485. package/src/adapters/cvf/papers.ts +136 -0
  486. package/src/adapters/dblp/publications.ts +4 -0
  487. package/src/adapters/dpma/get.yaml +67 -0
  488. package/src/adapters/dpma/search.yaml +77 -0
  489. package/src/adapters/duckduckgo/search.yaml +54 -0
  490. package/src/adapters/duckduckgo/suggest.yaml +52 -0
  491. package/src/adapters/epo/family.yaml +69 -0
  492. package/src/adapters/epo/get.yaml +74 -0
  493. package/src/adapters/epo/legal-status.yaml +63 -0
  494. package/src/adapters/epo/search.yaml +84 -0
  495. package/src/adapters/espacenet/_shared.ts +98 -0
  496. package/src/adapters/espacenet/family.ts +161 -0
  497. package/src/adapters/espacenet/get.ts +185 -0
  498. package/src/adapters/espacenet/legal-status.ts +151 -0
  499. package/src/adapters/espacenet/search.ts +229 -0
  500. package/src/adapters/facebook/subtitles.ts +44 -0
  501. package/src/adapters/fips/_shared.ts +109 -0
  502. package/src/adapters/fips/get.ts +186 -0
  503. package/src/adapters/fips/search.ts +195 -0
  504. package/src/adapters/freepatentsonline-web/_shared.ts +273 -0
  505. package/src/adapters/freepatentsonline-web/get.ts +144 -0
  506. package/src/adapters/freepatentsonline-web/search.ts +170 -0
  507. package/src/adapters/google-patents-bq/prior-art.yaml +80 -0
  508. package/src/adapters/google-patents-bq/search.yaml +97 -0
  509. package/src/adapters/google-patents-web/_shared.ts +242 -0
  510. package/src/adapters/google-patents-web/get.ts +224 -0
  511. package/src/adapters/google-patents-web/search.ts +196 -0
  512. package/src/adapters/google-scholar/cite.ts +1 -0
  513. package/src/adapters/google-scholar/profile.ts +5 -0
  514. package/src/adapters/google-scholar/search.ts +5 -0
  515. package/src/adapters/hf/paper.test.ts +10 -0
  516. package/src/adapters/hf/paper.ts +1 -0
  517. package/src/adapters/hf/top.yaml +1 -1
  518. package/src/adapters/huggingface-papers/daily.yaml +1 -1
  519. package/src/adapters/huggingface-papers/search.yaml +1 -1
  520. package/src/adapters/inpi-br/_shared.ts +98 -0
  521. package/src/adapters/inpi-br/get.ts +193 -0
  522. package/src/adapters/inpi-br/search.ts +206 -0
  523. package/src/adapters/inpi-fr/get.yaml +62 -0
  524. package/src/adapters/inpi-fr/search.yaml +74 -0
  525. package/src/adapters/instagram/subtitles.ts +44 -0
  526. package/src/adapters/ipaustralia/get.yaml +67 -0
  527. package/src/adapters/ipaustralia/search.yaml +74 -0
  528. package/src/adapters/jpo/get.yaml +63 -0
  529. package/src/adapters/jpo/search.yaml +76 -0
  530. package/src/adapters/kipris/get.yaml +69 -0
  531. package/src/adapters/kipris/legal-status.yaml +58 -0
  532. package/src/adapters/kipris/search.yaml +79 -0
  533. package/src/adapters/lens/get.yaml +64 -0
  534. package/src/adapters/lens/search.yaml +82 -0
  535. package/src/adapters/mastodon/statuses.test.ts +82 -0
  536. package/src/adapters/mastodon/statuses.ts +208 -0
  537. package/src/adapters/neurips/proceedings.ts +126 -0
  538. package/src/adapters/openalex/works.ts +33 -0
  539. package/src/adapters/openreview/papers.ts +5 -0
  540. package/src/adapters/patsnap/get.yaml +65 -0
  541. package/src/adapters/patsnap/search.yaml +77 -0
  542. package/src/adapters/pmlr/proceedings.ts +167 -0
  543. package/src/adapters/pqai/prior-art.yaml +59 -0
  544. package/src/adapters/pqai/search.yaml +60 -0
  545. package/src/adapters/pubmed/articles.ts +5 -0
  546. package/src/adapters/reddit/comments-tree.test.ts +79 -0
  547. package/src/adapters/reddit/comments.ts +159 -0
  548. package/src/adapters/semantic-scholar/papers.ts +268 -0
  549. package/src/adapters/threads/post.test.ts +64 -0
  550. package/src/adapters/threads/post.ts +366 -0
  551. package/src/adapters/threads/user.yaml +73 -0
  552. package/src/adapters/tiktok/subtitles.ts +44 -0
  553. package/src/adapters/twitter/accept.ts +5 -2
  554. package/src/adapters/twitter/browser-fallback.ts +138 -0
  555. package/src/adapters/twitter/browser-state.ts +74 -0
  556. package/src/adapters/twitter/client.ts +51 -21
  557. package/src/adapters/twitter/reply-dm.ts +5 -2
  558. package/src/adapters/twitter/reply.ts +1 -0
  559. package/src/adapters/twitter/search.ts +12 -38
  560. package/src/adapters/twitter/thread.test.ts +43 -0
  561. package/src/adapters/twitter/thread.ts +44 -2
  562. package/src/adapters/twitter/trending.ts +14 -95
  563. package/src/adapters/ukipo/info.yaml +43 -0
  564. package/src/adapters/unpaywall/works.ts +138 -0
  565. package/src/adapters/uspto/get.yaml +67 -0
  566. package/src/adapters/uspto/legal-status.yaml +58 -0
  567. package/src/adapters/uspto/search.yaml +88 -0
  568. package/src/adapters/wipo-patentscope/info.yaml +43 -0
  569. package/src/adapters/xiaohongshu/browser-state.ts +95 -0
  570. package/src/adapters/xiaohongshu/comments.ts +29 -6
  571. package/src/adapters/xiaohongshu/download.ts +60 -11
  572. package/src/adapters/xiaohongshu/search.ts +18 -6
  573. package/src/adapters/xiaohongshu/trending.ts +112 -0
  574. package/src/adapters/yahoo/search.yaml +52 -0
  575. package/src/adapters/youtube/comments-microformat.test.ts +35 -0
  576. package/src/adapters/youtube/comments-tree.test.ts +74 -0
  577. package/src/adapters/youtube/comments.ts +166 -12
  578. package/src/adapters/youtube/subtitles.ts +44 -0
  579. package/src/adapters/yt-dlp/subtitles.ts +43 -0
  580. package/src/adapters/zhihu/answer-detail.test.ts +83 -0
  581. package/src/adapters/zhihu/answer-detail.ts +275 -0
  582. package/src/adapters/zhihu/comment-tree.test.ts +57 -0
  583. package/src/adapters/zhihu/comment.ts +186 -0
  584. package/src/adapters/zhihu/recommend.test.ts +65 -0
  585. package/src/adapters/zhihu/recommend.ts +207 -0
  586. package/src/adapters/zotero/search.yaml +1 -1
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @owner src::adapters::acl-anthology::papers
3
+ * @does Registers ACL Anthology paper search and event proceedings listing from official Anthology pages.
4
+ * @needs aclanthology.org static search/event HTML, src/registry.ts
5
+ * @feeds src/commands/scholar.ts via scholar.search, scholar.get, scholar.pdf, and scholar.venue
6
+ * @breaks ACL Anthology markup drift surfaces as empty parse output; no browser workaround is used.
7
+ * @invariants Paper URLs/PDF URLs are absolutized against aclanthology.org; event keys are explicit.
8
+ * @side-effects HTTPS egress to aclanthology.org only
9
+ * @perf O(N) over one HTML response
10
+ * @concurrency safe
11
+ * @test covered by scholar command discovery and parser style tests for sibling proceedings sources
12
+ * @stability experimental
13
+ * @since 2026-05-19
14
+ */
15
+
16
+ import { cli, Strategy } from "../../registry.js";
17
+ import type { ScholarlyWorkRecord } from "../../types/scholarly.js";
18
+
19
+ const ORIGIN = "https://aclanthology.org";
20
+
21
+ function decode(value: string): string {
22
+ return value
23
+ .replace(/&/g, "&")
24
+ .replace(/&lt;/g, "<")
25
+ .replace(/&gt;/g, ">")
26
+ .replace(/&quot;/g, '"')
27
+ .replace(/&#39;/g, "'")
28
+ .replace(/\s+/g, " ")
29
+ .trim();
30
+ }
31
+
32
+ function absolute(path: string): string {
33
+ return /^https?:\/\//i.test(path)
34
+ ? path
35
+ : `${ORIGIN}${path.startsWith("/") ? "" : "/"}${path}`;
36
+ }
37
+
38
+ function normalizeId(value: unknown): string {
39
+ const raw = String(value ?? "").trim();
40
+ if (!/^[A-Za-z0-9.-]+$/.test(raw)) {
41
+ throw new Error(`ACL Anthology id "${raw}" is not valid.`);
42
+ }
43
+ return raw.replace(/\.$/, "");
44
+ }
45
+
46
+ function parseRows(
47
+ html: string,
48
+ source = "acl-anthology",
49
+ ): ScholarlyWorkRecord[] {
50
+ const out: ScholarlyWorkRecord[] = [];
51
+ const re =
52
+ /<p class="d-sm-flex[^"]*">[\s\S]*?<a[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>([\s\S]*?)(?=<p class="d-sm-flex|$)/g;
53
+ let match: RegExpExecArray | null;
54
+ while ((match = re.exec(html)) !== null) {
55
+ const sourceUrl = absolute(match[1]);
56
+ const id = sourceUrl.replace(`${ORIGIN}/`, "").replace(/\/$/, "");
57
+ const block = match[3];
58
+ const pdf = block.match(/href="([^"]+\.pdf)"/i)?.[1] ?? "";
59
+ const authorText = block
60
+ .replace(/<span class="d-block">[\s\S]*?<\/span>/g, " ")
61
+ .replace(/<[^>]+>/g, " ");
62
+ const authors = decode(authorText)
63
+ .split(/,\s*/)
64
+ .map((author) => author.trim())
65
+ .filter(Boolean)
66
+ .slice(0, 20);
67
+ out.push({
68
+ id,
69
+ title: decode(match[2].replace(/<[^>]+>/g, " ")),
70
+ authors: authors.length > 0 ? authors : undefined,
71
+ year: Number(id.slice(0, 4)) || undefined,
72
+ venue: "ACL Anthology",
73
+ pdf_url: pdf ? absolute(pdf) : `${sourceUrl}.pdf`,
74
+ source_adapter: source,
75
+ source_url: sourceUrl,
76
+ retrieved_at: new Date().toISOString(),
77
+ });
78
+ }
79
+ return out;
80
+ }
81
+
82
+ async function fetchHtml(url: string, label: string): Promise<string> {
83
+ const response = await fetch(url, {
84
+ headers: {
85
+ Accept: "text/html",
86
+ "User-Agent":
87
+ "unicli-acl-anthology/1.0 (https://github.com/olo-dot-io/Uni-CLI)",
88
+ },
89
+ });
90
+ if (response.status === 404) throw new Error(`${label} returned no result.`);
91
+ if (!response.ok)
92
+ throw new Error(`${label} returned HTTP ${response.status}.`);
93
+ return response.text();
94
+ }
95
+
96
+ cli({
97
+ site: "acl-anthology",
98
+ name: "search",
99
+ description: "Search ACL Anthology papers",
100
+ domain: "aclanthology.org",
101
+ strategy: Strategy.PUBLIC,
102
+ args: [
103
+ { name: "query", type: "str", required: true, positional: true },
104
+ { name: "limit", type: "int", default: 20 },
105
+ ],
106
+ columns: ["id", "title", "authors", "year", "venue", "pdf_url", "source_url"],
107
+ capabilities: ["http.fetch", "scholar.search", "scholar.pdf"],
108
+ func: async (_page, kwargs) => {
109
+ const query = String(kwargs.query ?? "").trim();
110
+ if (!query) throw new Error("acl-anthology search query cannot be empty.");
111
+ const limit = Math.min(Math.max(Number(kwargs.limit ?? 20), 1), 100);
112
+ const rows = parseRows(
113
+ await fetchHtml(
114
+ `${ORIGIN}/search/?q=${encodeURIComponent(query)}`,
115
+ "acl-anthology search",
116
+ ),
117
+ ).slice(0, limit);
118
+ if (rows.length === 0)
119
+ throw new Error(`No ACL Anthology papers matched "${query}".`);
120
+ return rows;
121
+ },
122
+ });
123
+
124
+ cli({
125
+ site: "acl-anthology",
126
+ name: "paper",
127
+ description: "Fetch an ACL Anthology paper by anthology id",
128
+ domain: "aclanthology.org",
129
+ strategy: Strategy.PUBLIC,
130
+ args: [{ name: "id", type: "str", required: true, positional: true }],
131
+ columns: ["id", "title", "authors", "year", "venue", "pdf_url", "source_url"],
132
+ capabilities: ["http.fetch", "scholar.get", "scholar.pdf"],
133
+ func: async (_page, kwargs) => {
134
+ const id = normalizeId(kwargs.id ?? kwargs.ref);
135
+ const html = await fetchHtml(
136
+ `${ORIGIN}/${id}/`,
137
+ `acl-anthology paper ${id}`,
138
+ );
139
+ const title = decode(
140
+ html.match(/<h2[^>]*id=title[^>]*>([\s\S]*?)<\/h2>/)?.[1] ?? "",
141
+ );
142
+ if (!title)
143
+ throw new Error(`ACL Anthology paper ${id} did not expose a title.`);
144
+ return [
145
+ {
146
+ id,
147
+ title,
148
+ year: Number(id.slice(0, 4)) || undefined,
149
+ venue: "ACL Anthology",
150
+ pdf_url: `${ORIGIN}/${id}.pdf`,
151
+ source_adapter: "acl-anthology",
152
+ source_url: `${ORIGIN}/${id}/`,
153
+ retrieved_at: new Date().toISOString(),
154
+ } satisfies ScholarlyWorkRecord,
155
+ ];
156
+ },
157
+ });
@@ -45,7 +45,7 @@ pipeline:
45
45
  columns: [id, title, pdf, _download]
46
46
 
47
47
  # schema-v2 metadata — injected by `unicli migrate schema-v2`
48
- capabilities: ["http.fetch", "http.download"]
48
+ capabilities: ["http.fetch", "http.download", "scholar.pdf"]
49
49
  minimum_capability: http.download
50
50
  trust: public
51
51
  confidentiality: public
@@ -36,7 +36,7 @@ pipeline:
36
36
  columns: [id, title, authors, published, abstract, url]
37
37
 
38
38
  # schema-v2 metadata — injected by `unicli migrate schema-v2`
39
- capabilities: ["http.fetch"]
39
+ capabilities: ["http.fetch", "scholar.get", "scholar.pdf"]
40
40
  minimum_capability: http.fetch
41
41
  trust: public
42
42
  confidentiality: public
@@ -174,6 +174,7 @@ cli({
174
174
  { name: "limit", type: "int", default: 20, description: "Max papers" },
175
175
  ],
176
176
  columns: ["id", "title", "authors", "published", "primary_category", "url"],
177
+ capabilities: ["http.fetch", "scholar.author", "scholar.search"],
177
178
  func: async (_page, kwargs) => {
178
179
  const author = requireArxivAuthor(kwargs.author);
179
180
  const limit = requireArxivLimit(kwargs.limit, 20);
@@ -208,6 +209,7 @@ cli({
208
209
  { name: "limit", type: "int", default: 10, description: "Max papers" },
209
210
  ],
210
211
  columns: ["id", "title", "authors", "published", "primary_category", "url"],
212
+ capabilities: ["http.fetch", "scholar.search", "scholar.venue"],
211
213
  func: async (_page, kwargs) => {
212
214
  const category = requireArxivCategory(kwargs.category);
213
215
  const limit = requireArxivLimit(kwargs.limit, 10);
@@ -38,7 +38,7 @@ pipeline:
38
38
  columns: [title, authors, published, id]
39
39
 
40
40
  # schema-v2 metadata — injected by `unicli migrate schema-v2`
41
- capabilities: ["http.fetch"]
41
+ capabilities: ["http.fetch", "scholar.search"]
42
42
  minimum_capability: http.fetch
43
43
  trust: public
44
44
  confidentiality: public
@@ -38,7 +38,7 @@ pipeline:
38
38
  columns: [title, authors, published, id]
39
39
 
40
40
  # schema-v2 metadata — injected by `unicli migrate schema-v2`
41
- capabilities: ["http.fetch"]
41
+ capabilities: ["http.fetch", "scholar.search", "scholar.venue"]
42
42
  minimum_capability: http.fetch
43
43
  trust: public
44
44
  confidentiality: public
@@ -14,6 +14,11 @@ cli({
14
14
  { name: "limit", type: "int", default: 10 },
15
15
  ],
16
16
  columns: ["title", "authors", "source", "url"],
17
+ capabilities: [
18
+ "mcp-browser.navigate",
19
+ "mcp-browser.evaluate",
20
+ "scholar.search",
21
+ ],
17
22
  func: async (page, kwargs) => {
18
23
  const p = page as IPage;
19
24
  const limit = intArg(kwargs.limit, 10, 50);
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { normalizeCommentRows } from "../../social/comments.js";
4
+
5
+ describe("bilibili comment tree normalization", () => {
6
+ it("places fetched child replies under their root rpid", () => {
7
+ const rows = normalizeCommentRows(
8
+ [
9
+ {
10
+ id: "100",
11
+ author: "root-user",
12
+ text: "root",
13
+ likes: 10,
14
+ replies: 1,
15
+ },
16
+ {
17
+ id: "101",
18
+ parent_id: "100",
19
+ author: "child-user",
20
+ text: "reply",
21
+ likes: 2,
22
+ replies: 0,
23
+ },
24
+ ],
25
+ { platform: "bilibili", contentId: "BV1xx" },
26
+ );
27
+
28
+ expect(rows[0]).toMatchObject({
29
+ comment_id: "100",
30
+ parent_id: "",
31
+ depth: 0,
32
+ path: "0001",
33
+ });
34
+ expect(rows[1]).toMatchObject({
35
+ comment_id: "101",
36
+ parent_id: "100",
37
+ depth: 1,
38
+ path: "0001.0001",
39
+ });
40
+ });
41
+ });
@@ -7,8 +7,12 @@
7
7
 
8
8
  import { cli, Strategy } from "../../registry.js";
9
9
  import { wbiFetch } from "./wbi.js";
10
- import { loadCookies, formatCookieHeader } from "../../engine/cookies.js";
10
+ import {
11
+ loadCookiesWithCDP,
12
+ formatCookieHeader,
13
+ } from "../../engine/cookies.js";
11
14
  import { USER_AGENT } from "../../constants.js";
15
+ import { normalizeCommentRows } from "../../social/comments.js";
12
16
 
13
17
  interface ViewResponse {
14
18
  data: {
@@ -17,10 +21,14 @@ interface ViewResponse {
17
21
  }
18
22
 
19
23
  interface CommentItem {
24
+ rpid?: number;
25
+ root?: number;
26
+ parent?: number;
20
27
  member: { uname: string };
21
28
  content: { message: string };
22
29
  like: number;
23
30
  rcount: number;
31
+ ctime?: number;
24
32
  }
25
33
 
26
34
  interface CommentsResponse {
@@ -31,7 +39,7 @@ interface CommentsResponse {
31
39
 
32
40
  /** Fetch video aid from bvid using the view API (not WBI-signed). */
33
41
  async function resolveAid(bvid: string): Promise<number> {
34
- const cookies = loadCookies("bilibili");
42
+ const cookies = await loadCookiesWithCDP("bilibili", "bilibili.com");
35
43
  const headers: Record<string, string> = {
36
44
  "User-Agent": USER_AGENT,
37
45
  Accept: "application/json",
@@ -69,11 +77,32 @@ cli({
69
77
  default: 20,
70
78
  description: "Number of comments",
71
79
  },
80
+ {
81
+ name: "with-replies",
82
+ type: "bool",
83
+ default: false,
84
+ description: "Include nested replies for each root comment",
85
+ },
86
+ ],
87
+ columns: [
88
+ "platform",
89
+ "content_id",
90
+ "comment_id",
91
+ "parent_id",
92
+ "depth",
93
+ "path",
94
+ "author",
95
+ "text",
96
+ "likes",
97
+ "replies",
98
+ "created",
99
+ "user",
100
+ "content",
72
101
  ],
73
- columns: ["user", "content", "likes", "replies"],
74
102
  func: async (_page, kwargs) => {
75
103
  const bvid = String(kwargs.bvid);
76
104
  const limit = Number(kwargs.limit) || 20;
105
+ const withReplies = Boolean(kwargs["with-replies"]);
77
106
 
78
107
  const aid = await resolveAid(bvid);
79
108
 
@@ -84,11 +113,56 @@ cli({
84
113
  ps: String(limit),
85
114
  })) as CommentsResponse;
86
115
 
87
- return (json.data.replies ?? []).map((item) => ({
116
+ const roots = json.data.replies ?? [];
117
+ const rows = roots.map((item) => ({
118
+ id: item.rpid ? String(item.rpid) : "",
119
+ parent_id:
120
+ item.parent && item.parent > 0
121
+ ? String(item.parent)
122
+ : item.root && item.root > 0
123
+ ? String(item.root)
124
+ : "",
88
125
  user: item.member.uname,
126
+ author: item.member.uname,
89
127
  content: item.content.message,
128
+ text: item.content.message,
90
129
  likes: item.like,
91
130
  replies: item.rcount,
131
+ created: item.ctime ? String(item.ctime) : "",
92
132
  }));
133
+
134
+ if (withReplies) {
135
+ for (const root of roots) {
136
+ if (!root.rpid || root.rcount <= 0) continue;
137
+ const repliesJson = (await wbiFetch(
138
+ "https://api.bilibili.com/x/v2/reply/reply",
139
+ {
140
+ oid: String(aid),
141
+ type: "1",
142
+ root: String(root.rpid),
143
+ ps: "20",
144
+ pn: "1",
145
+ },
146
+ )) as CommentsResponse;
147
+ for (const reply of repliesJson.data.replies ?? []) {
148
+ rows.push({
149
+ id: reply.rpid ? String(reply.rpid) : "",
150
+ parent_id: String(root.rpid),
151
+ user: reply.member.uname,
152
+ author: reply.member.uname,
153
+ content: reply.content.message,
154
+ text: reply.content.message,
155
+ likes: reply.like,
156
+ replies: reply.rcount,
157
+ created: reply.ctime ? String(reply.ctime) : "",
158
+ });
159
+ }
160
+ }
161
+ }
162
+
163
+ return normalizeCommentRows(rows, {
164
+ platform: "bilibili",
165
+ contentId: bvid,
166
+ });
93
167
  },
94
168
  });
@@ -1,10 +1,13 @@
1
1
  import { cli, Strategy } from "../../registry.js";
2
- import { loadCookies, formatCookieHeader } from "../../engine/cookies.js";
2
+ import {
3
+ loadCookiesWithCDP,
4
+ formatCookieHeader,
5
+ } from "../../engine/cookies.js";
3
6
  import { USER_AGENT } from "../../constants.js";
4
7
  import { intArg, str } from "../_shared/browser-tools.js";
5
8
 
6
9
  async function bilibiliJson(url: string): Promise<Record<string, unknown>> {
7
- const cookies = loadCookies("bilibili");
10
+ const cookies = await loadCookiesWithCDP("bilibili", "bilibili.com");
8
11
  const headers: Record<string, string> = {
9
12
  "user-agent": USER_AGENT,
10
13
  referer: "https://www.bilibili.com",
@@ -8,7 +8,10 @@
8
8
  */
9
9
 
10
10
  import { cli, Strategy } from "../../registry.js";
11
- import { loadCookies, formatCookieHeader } from "../../engine/cookies.js";
11
+ import {
12
+ loadCookiesWithCDP,
13
+ formatCookieHeader,
14
+ } from "../../engine/cookies.js";
12
15
  import { USER_AGENT } from "../../constants.js";
13
16
 
14
17
  interface ViewResponse {
@@ -47,8 +50,8 @@ interface PlayurlResponse {
47
50
  }
48
51
 
49
52
  /** Build authenticated headers for Bilibili API calls. */
50
- function buildHeaders(): Record<string, string> {
51
- const cookies = loadCookies("bilibili");
53
+ async function buildHeaders(): Promise<Record<string, string>> {
54
+ const cookies = await loadCookiesWithCDP("bilibili", "bilibili.com");
52
55
  const headers: Record<string, string> = {
53
56
  "User-Agent": USER_AGENT,
54
57
  Accept: "application/json",
@@ -75,7 +78,7 @@ cli({
75
78
  columns: ["type", "quality", "codecs", "size", "url"],
76
79
  func: async (_page, kwargs) => {
77
80
  const bvid = String(kwargs.bvid);
78
- const headers = buildHeaders();
81
+ const headers = await buildHeaders();
79
82
 
80
83
  // Step 1: resolve cid from bvid
81
84
  const viewResp = await fetch(
@@ -6,7 +6,10 @@
6
6
  */
7
7
 
8
8
  import { createHash } from "node:crypto";
9
- import { loadCookies, formatCookieHeader } from "../../engine/cookies.js";
9
+ import {
10
+ loadCookiesWithCDP,
11
+ formatCookieHeader,
12
+ } from "../../engine/cookies.js";
10
13
  import { USER_AGENT } from "../../constants.js";
11
14
 
12
15
  const MIXIN_KEY_ENC_TAB = [
@@ -31,7 +34,7 @@ async function fetchWbiKeys(): Promise<string> {
31
34
  const now = Date.now();
32
35
  if (cachedMixinKey && now - cachedAt < CACHE_TTL) return cachedMixinKey;
33
36
 
34
- const cookies = loadCookies("bilibili");
37
+ const cookies = await loadCookiesWithCDP("bilibili", "bilibili.com");
35
38
  const headers: Record<string, string> = { "User-Agent": USER_AGENT };
36
39
  if (cookies) headers["Cookie"] = formatCookieHeader(cookies);
37
40
 
@@ -76,7 +79,7 @@ export async function wbiFetch(
76
79
  const query = await signWbi(params);
77
80
  const url = `${baseUrl}?${query}`;
78
81
 
79
- const cookies = loadCookies("bilibili");
82
+ const cookies = await loadCookiesWithCDP("bilibili", "bilibili.com");
80
83
  const headers: Record<string, string> = {
81
84
  "User-Agent": USER_AGENT,
82
85
  Accept: "application/json",
@@ -0,0 +1,53 @@
1
+ # Brave Search — keyless HTML scrape against the public web result page.
2
+ #
3
+ # verification_status: keyless-best-effort
4
+ #
5
+ # Brave operates a paid Search API at https://api.search.brave.com — that
6
+ # path needs an X-Subscription-Token header (free 2000 queries/month plan).
7
+ # This adapter takes the no-key route: hit https://search.brave.com/search
8
+ # and parse the SSR-emitted result list. Anti-bot may rate-limit aggressive
9
+ # loops; results are best-effort, not guaranteed parity with the API.
10
+ site: brave
11
+ name: search
12
+ description: Search the public web via Brave Search (no API key needed)
13
+ type: web-api
14
+ domain: search.brave.com
15
+ strategy: public
16
+ lint_listing_detail: skip
17
+
18
+ args:
19
+ query:
20
+ type: str
21
+ required: true
22
+ positional: true
23
+ description: Free-text web search query
24
+ limit:
25
+ type: int
26
+ default: 10
27
+ description: Maximum results returned (page caps around 20)
28
+
29
+ pipeline:
30
+ - fetch_text:
31
+ url: "https://search.brave.com/search?q=${{ args.query | url_encode }}&source=web"
32
+ headers:
33
+ User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
34
+ Accept: "text/html,application/xhtml+xml"
35
+
36
+ - extract:
37
+ selector: "div.snippet[data-type='web']"
38
+ fields:
39
+ title: "div.snippet-title"
40
+ url: "a@href"
41
+ snippet: ".snippet-description"
42
+
43
+ - limit: ${{ args.limit }}
44
+
45
+ columns: [title, url, snippet]
46
+
47
+ # schema-v2 metadata
48
+ capabilities: ["http.fetch"]
49
+ minimum_capability: http.fetch
50
+ trust: public
51
+ confidentiality: public
52
+ quarantine: false
53
+ schema_version: v2
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @owner src::adapters::cipo::_shared
3
+ * @does Shared helpers for the CIPO Canadian Patents Database browser adapter — emits structured envelopes for MCP-bus / not-found / schema-drift gaps.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
5
+ * @feeds src/adapters/cipo/*.ts
6
+ * @breaks none — pure helpers
7
+ * @invariants every error path emits a PatentEnvelope row
8
+ * @side-effects none
9
+ * @perf n/a
10
+ * @concurrency safe
11
+ * @test covered transitively
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+
17
+ import {
18
+ TransportError,
19
+ initMcpBrowserTransport,
20
+ mcpBrowserEvaluate,
21
+ mcpBrowserNavigate,
22
+ type McpBrowserResult,
23
+ } from "../../engine/transport/mcp-browser.js";
24
+ import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
25
+ import type { PatentEnvelope, PatentErrorCode } from "../../types/patent.js";
26
+
27
+ export function cipoEnvelope(
28
+ code: PatentErrorCode,
29
+ adapter_path: string,
30
+ step: string,
31
+ suggestion: string,
32
+ alternatives: string[] = [],
33
+ ): PatentEnvelope {
34
+ return buildPatentEnvelope({
35
+ code,
36
+ adapter_path,
37
+ step,
38
+ suggestion,
39
+ alternatives,
40
+ retryable: false,
41
+ });
42
+ }
43
+
44
+ export function transportErrorToCipoEnvelope(
45
+ err: TransportError,
46
+ adapter_path: string,
47
+ step: string,
48
+ ): PatentEnvelope {
49
+ if (err.code === "MCP_BUS_MISSING") {
50
+ return buildPatentEnvelope({
51
+ code: "PATENT_API_DEPRECATED",
52
+ adapter_path,
53
+ step,
54
+ suggestion:
55
+ "engine has no outbound MCP transport wired into the bus today; install an McpResolver before invoking the CIPO browser adapter, or use uspto/epo as a partial fallback",
56
+ alternatives: ["uspto", "epo", "lens"],
57
+ retryable: false,
58
+ });
59
+ }
60
+ return buildPatentEnvelope({
61
+ code: "PATENT_API_DEPRECATED",
62
+ adapter_path,
63
+ step,
64
+ suggestion: `mcp-browser transport error (${err.code}): ${err.message}`,
65
+ alternatives: ["uspto", "epo"],
66
+ retryable: false,
67
+ });
68
+ }
69
+
70
+ export async function cipoNavigateAndExtract<T>(
71
+ url: string,
72
+ expression: string,
73
+ ): Promise<McpBrowserResult<T>> {
74
+ const init = await initMcpBrowserTransport();
75
+ if (init.active_server === "none") {
76
+ const code =
77
+ init.reason === "bus-missing" ? "MCP_BUS_MISSING" : "MCP_NO_SERVER";
78
+ throw new TransportError(code, `mcp-browser unavailable (${init.reason})`);
79
+ }
80
+ const navResult = await mcpBrowserNavigate({ url });
81
+ if (!navResult.ok) {
82
+ throw new TransportError(
83
+ navResult.code ?? "MCP_NAVIGATE_FAILED",
84
+ navResult.message ?? "navigate did not succeed",
85
+ );
86
+ }
87
+ const evalResult = await mcpBrowserEvaluate<T>({
88
+ expression,
89
+ tab: navResult.tab,
90
+ });
91
+ if (!evalResult.ok) {
92
+ throw new TransportError(
93
+ evalResult.code ?? "MCP_EVALUATE_FAILED",
94
+ evalResult.message ?? "evaluate did not succeed",
95
+ );
96
+ }
97
+ return evalResult;
98
+ }