@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,69 @@
1
+ # @owner src::adapters::kipris::get
2
+ # @does Fetch a single Korean patent bibliographic record from KIPRIS Plus REST by application number.
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/select-xml.ts, src/engine/steps/map.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on missing key, 4xx, 5xx
6
+ # @invariants output row conforms to PatentRecord
7
+ # @side-effects reads env KIPRIS_ACCESS_KEY; HTTPS egress to plus.kipris.or.kr
8
+ # @perf single request
9
+ # @concurrency safe
10
+ # @test none yet
11
+ # @stability stable
12
+ # @since 2026-05-18
13
+ # @verification blocked-by-key
14
+ site: kipris
15
+ name: get
16
+ description: Fetch a KIPRIS biblio record by application number
17
+ domain: plus.kipris.or.kr
18
+ type: web-api
19
+ strategy: public
20
+ lint_listing_detail: skip
21
+
22
+ args:
23
+ application_number:
24
+ type: str
25
+ required: true
26
+ positional: true
27
+ description: Korean application number (e.g. 1020230012345)
28
+
29
+ pipeline:
30
+ - fetch:
31
+ url: "https://plus.kipris.or.kr/openapi/rest/patUtiModInfoSearchSevice/getBibliographyDetailInfoSearch"
32
+ method: GET
33
+ headers:
34
+ Accept: application/xml
35
+ params:
36
+ applicationNumber: "${{ args.application_number }}"
37
+ accessKey: "${{ env.KIPRIS_ACCESS_KEY || '' }}"
38
+
39
+ - select-xml:
40
+ xpath: "//biblioSummaryInfo"
41
+ unwrap_single: true
42
+
43
+ - map:
44
+ publication_number: "${{ 'KR-' + (item.openNumber || args.application_number || '') + '-' + (item.openType || '') }}"
45
+ application_number: "${{ item.applicationNumber || args.application_number || '' }}"
46
+ title: "${{ item.inventionTitle || '' }}"
47
+ abstract: "${{ item.astrtCont || '' }}"
48
+ kind_code: "${{ item.openType || '' }}"
49
+ filing_date: "${{ item.applicationDate || '' }}"
50
+ publication_date: "${{ item.openDate || '' }}"
51
+ grant_date: "${{ item.registerDate || '' }}"
52
+ priority_date: "${{ item.priorityDate || '' }}"
53
+ legal_status: "${{ item.registerStatus || '' }}"
54
+ inventors: "${{ JSON.stringify(item.inventor ? [{ name: item.inventor, country: 'KR' }] : []) }}"
55
+ assignees: "${{ JSON.stringify(item.applicant ? [{ name: item.applicant, country: 'KR' }] : []) }}"
56
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipcNumber; if(!c) return []; var arr = String(c).split('|').map(s => s.trim()).filter(s => s); return arr.map(code => ({ scheme: 'ipc', code: code })); })()) }}"
57
+ source_adapter: kipris
58
+ source_url: "${{ 'https://kpat.kipris.or.kr/kpat/biblioa.do?method=biblioFrame&applno=' + (args.application_number || '') }}"
59
+ retrieved_at: ""
60
+
61
+ columns: [publication_number, title, filing_date, publication_date]
62
+
63
+ # schema-v2 metadata
64
+ capabilities: ["http.fetch", "patent.get"]
65
+ minimum_capability: http.fetch
66
+ trust: public
67
+ confidentiality: public
68
+ quarantine: false
69
+ schema_version: v2
@@ -0,0 +1,58 @@
1
+ # @owner src::adapters::kipris::legal-status
2
+ # @does Fetch Korean patent legal-status (right-trans/registration events) from KIPRIS Plus REST.
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/select-xml.ts, src/engine/steps/map.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on missing key, 4xx, 5xx
6
+ # @invariants output rows carry legal_status from rightTransRegInfo
7
+ # @side-effects reads env KIPRIS_ACCESS_KEY; HTTPS egress
8
+ # @perf single request
9
+ # @concurrency safe
10
+ # @test none yet
11
+ # @stability stable
12
+ # @since 2026-05-18
13
+ # @verification blocked-by-key
14
+ site: kipris
15
+ name: legal-status
16
+ description: KIPRIS right-trans / registration events for a Korean application
17
+ domain: plus.kipris.or.kr
18
+ type: web-api
19
+ strategy: public
20
+ lint_listing_detail: skip
21
+
22
+ args:
23
+ application_number:
24
+ type: str
25
+ required: true
26
+ positional: true
27
+ description: Korean application number
28
+
29
+ pipeline:
30
+ - fetch:
31
+ url: "https://plus.kipris.or.kr/openapi/rest/patUtiModInfoSearchSevice/getRightTransRegInfoSearchInfo"
32
+ method: GET
33
+ headers:
34
+ Accept: application/xml
35
+ params:
36
+ applicationNumber: "${{ args.application_number }}"
37
+ accessKey: "${{ env.KIPRIS_ACCESS_KEY || '' }}"
38
+
39
+ - select-xml:
40
+ xpath: "//item"
41
+
42
+ - map:
43
+ publication_number: "${{ 'KR-' + (args.application_number || '') }}"
44
+ application_number: "${{ args.application_number }}"
45
+ legal_status: "${{ (item.rightCode || '') + ' ' + (item.contents || '') }}"
46
+ source_adapter: kipris
47
+ source_url: "${{ 'https://kpat.kipris.or.kr/kpat/biblioa.do?method=biblioFrame&applno=' + (args.application_number || '') }}"
48
+ retrieved_at: ""
49
+
50
+ columns: [publication_number, legal_status]
51
+
52
+ # schema-v2 metadata
53
+ capabilities: ["http.fetch", "patent.legal-status"]
54
+ minimum_capability: http.fetch
55
+ trust: public
56
+ confidentiality: public
57
+ quarantine: false
58
+ schema_version: v2
@@ -0,0 +1,79 @@
1
+ # @owner src::adapters::kipris::search
2
+ # @does Search KIPRIS Plus REST patent search endpoint for Korean patents/utility models.
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/select-xml.ts, src/engine/steps/map.ts, src/engine/steps/limit.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on missing/invalid accessKey, 4xx, 5xx
6
+ # @invariants output rows conform to PatentRecord; publication_number is `KR-<doc>-<kind>`
7
+ # @side-effects reads env KIPRIS_ACCESS_KEY; HTTPS egress to plus.kipris.or.kr
8
+ # @perf single request
9
+ # @concurrency safe
10
+ # @test none yet
11
+ # @stability stable
12
+ # @since 2026-05-18
13
+ # @verification blocked-by-key — needs KIPRIS_ACCESS_KEY (registration at plus.kipris.or.kr)
14
+ site: kipris
15
+ name: search
16
+ description: Search KIPRIS Plus REST for Korean patents/utility models
17
+ domain: plus.kipris.or.kr
18
+ type: web-api
19
+ strategy: public
20
+ lint_listing_detail: skip
21
+
22
+ args:
23
+ query:
24
+ type: str
25
+ required: true
26
+ positional: true
27
+ description: Free-text query (KIPRIS `word` param)
28
+ limit:
29
+ type: int
30
+ default: 25
31
+ description: Maximum results (numOfRows)
32
+
33
+ pipeline:
34
+ - fetch:
35
+ url: "https://plus.kipris.or.kr/openapi/rest/patUtiModInfoSearchSevice/getWordSearch"
36
+ method: GET
37
+ headers:
38
+ Accept: application/xml
39
+ params:
40
+ word: "${{ args.query }}"
41
+ numOfRows: "${{ args.limit }}"
42
+ pageNo: "1"
43
+ accessKey: "${{ env.KIPRIS_ACCESS_KEY || '' }}"
44
+
45
+ - select-xml:
46
+ xpath: "//item"
47
+
48
+ # KIPRIS Plus XML preserves the native Korean script for title / abstract.
49
+ - map:
50
+ publication_number: "${{ 'KR-' + (item.openNumber || item.applicationNumber || '') + '-' + (item.openType || '') }}"
51
+ application_number: "${{ item.applicationNumber || '' }}"
52
+ title: "${{ item.inventionTitle || '' }}"
53
+ abstract: "${{ item.astrtCont || '' }}"
54
+ kind_code: "${{ item.openType || '' }}"
55
+ filing_date: "${{ item.applicationDate || '' }}"
56
+ publication_date: "${{ item.openDate || '' }}"
57
+ grant_date: "${{ item.registerDate || '' }}"
58
+ priority_date: "${{ item.priorityNumber ? (item.priorityDate || '') : '' }}"
59
+ legal_status: "${{ item.registerStatus || '' }}"
60
+ # KIPRIS exposes inventor / applicant as a single concatenated string;
61
+ # preserve the format the office returns and treat it as one party.
62
+ inventors: "${{ JSON.stringify(item.inventor ? [{ name: item.inventor, country: 'KR' }] : []) }}"
63
+ assignees: "${{ JSON.stringify(item.applicant ? [{ name: item.applicant, country: 'KR' }] : []) }}"
64
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipcNumber; if(!c) return []; var arr = String(c).split('|').map(s => s.trim()).filter(s => s); return arr.map(code => ({ scheme: 'ipc', code: code })); })()) }}"
65
+ source_adapter: kipris
66
+ source_url: "${{ 'https://kpat.kipris.or.kr/kpat/biblioa.do?method=biblioFrame&applno=' + (item.applicationNumber || '') }}"
67
+ retrieved_at: ""
68
+
69
+ - limit: "${{ args.limit }}"
70
+
71
+ columns: [publication_number, title, filing_date, publication_date]
72
+
73
+ # schema-v2 metadata
74
+ capabilities: ["http.fetch", "patent.search"]
75
+ minimum_capability: http.fetch
76
+ trust: public
77
+ confidentiality: public
78
+ quarantine: false
79
+ schema_version: v2
@@ -0,0 +1,64 @@
1
+ # Lens.org single-record fetch.
2
+ #
3
+ # verification_status: blocked-by-subscription
4
+ #
5
+ # Lens "patent/search" is the only retrieval endpoint they expose publicly;
6
+ # get is implemented as a one-record query by `doc_key` (publication_number).
7
+ site: lens
8
+ name: get
9
+ description: Retrieve a single Lens.org patent record by publication number
10
+ domain: api.lens.org
11
+ type: web-api
12
+ strategy: header
13
+
14
+ args:
15
+ publication_number:
16
+ type: str
17
+ required: true
18
+ positional: true
19
+
20
+ pipeline:
21
+ - fetch:
22
+ url: https://api.lens.org/patent/search
23
+ method: POST
24
+ headers:
25
+ Authorization: "Bearer ${{ env.LENS_API_TOKEN || '' }}"
26
+ Content-Type: application/json
27
+ body:
28
+ query:
29
+ term:
30
+ doc_key: "${{ args.publication_number }}"
31
+ size: 1
32
+
33
+ - select: data
34
+
35
+ - map:
36
+ publication_number: "${{ item.doc_key || item.lens_id }}"
37
+ title: "${{ item.biblio ? (item.biblio.invention_title ? item.biblio.invention_title[0].text : '') : '' }}"
38
+ abstract: "${{ item.abstract ? (Array.isArray(item.abstract) ? (item.abstract[0] && item.abstract[0].text) : item.abstract) : '' }}"
39
+ kind_code: "${{ item.biblio && item.biblio.publication_reference ? (item.biblio.publication_reference.kind || '') : '' }}"
40
+ filing_date: "${{ item.biblio ? (item.biblio.application_reference ? item.biblio.application_reference.date : '') : '' }}"
41
+ publication_date: "${{ item.date_published || '' }}"
42
+ priority_date: "${{ item.biblio && item.biblio.priority_claims && item.biblio.priority_claims.claims ? item.biblio.priority_claims.claims[0].date : '' }}"
43
+ family_id: "${{ item.families ? item.families.simple_family.family_id : '' }}"
44
+ inventors: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.inventors) return []; return p.inventors.map(i => ({ name: i.extracted_name ? (i.extracted_name.value || '') : (i.name || ''), country: i.residence || undefined })).filter(x => x.name); })()) }}"
45
+ assignees: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.applicants) return []; return p.applicants.map(a => ({ name: a.extracted_name ? (a.extracted_name.value || '') : (a.name || ''), country: a.residence || undefined })).filter(x => x.name); })()) }}"
46
+ classifications: "${{ JSON.stringify((function(){ var c = item.biblio && item.biblio.classifications_cpc && item.biblio.classifications_cpc.classifications; var out = []; if(c){ for (var i=0;i<c.length;i++) out.push({ scheme: 'cpc', code: c[i].symbol || '' }); } var ipc = item.biblio && item.biblio.classifications_ipcr && item.biblio.classifications_ipcr.classifications; if(ipc){ for (var j=0;j<ipc.length;j++) out.push({ scheme: 'ipc', code: ipc[j].symbol || '' }); } return out.filter(x => x.code); })()) }}"
47
+ cited_by_count: "${{ item.biblio && item.biblio.cited_by ? (item.biblio.cited_by.patent_count || 0) : '' }}"
48
+ cites_count: "${{ item.biblio && item.biblio.references_cited && item.biblio.references_cited.patent_count !== undefined ? item.biblio.references_cited.patent_count : '' }}"
49
+ claims_count: "${{ item.claims_count !== undefined ? item.claims_count : '' }}"
50
+ legal_status: "${{ item.legal_status ? (item.legal_status.patent_status || '') : '' }}"
51
+ source_url: "https://www.lens.org/lens/patent/${{ item.lens_id }}"
52
+ source_adapter: lens
53
+ retrieved_at: "${{ now }}"
54
+
55
+ - limit: 1
56
+
57
+ columns: [publication_number, title, publication_date]
58
+
59
+ capabilities: ["http.fetch", "patent.get"]
60
+ minimum_capability: http.fetch
61
+ trust: public
62
+ confidentiality: public
63
+ quarantine: false
64
+ schema_version: v2
@@ -0,0 +1,82 @@
1
+ # Lens.org Patent API — POST JSON DSL search.
2
+ #
3
+ # verification_status: blocked-by-subscription
4
+ #
5
+ # Lens.org Patents is a free-to-search, paid-to-API service from Cambia.
6
+ # Institutional / commercial users get tokens via the Lens Toolkit subscription
7
+ # (https://www.lens.org/lens/user/subscriptions). The token is static once
8
+ # issued; no refresh dance, no rotation — set $LENS_API_TOKEN and the adapter
9
+ # works. Until the env var is present, every command emits a structured
10
+ # blocked-by-key envelope so agents can repair by guiding the user through
11
+ # subscription setup rather than retrying the API.
12
+ site: lens
13
+ name: search
14
+ description: Search Lens.org's combined patent corpus via the Scholarly Works DSL
15
+ domain: api.lens.org
16
+ type: web-api
17
+ strategy: header
18
+
19
+ args:
20
+ query:
21
+ type: str
22
+ required: true
23
+ positional: true
24
+ description: Free-text query — mapped to the Lens DSL `query_string`
25
+ limit:
26
+ type: int
27
+ default: 20
28
+ description: Maximum records returned (Lens caps at 1000)
29
+ date_from:
30
+ type: str
31
+ default: ""
32
+ description: ISO date — minimum publication date
33
+
34
+ pipeline:
35
+ - fetch:
36
+ url: https://api.lens.org/patent/search
37
+ method: POST
38
+ headers:
39
+ Authorization: "Bearer ${{ env.LENS_API_TOKEN || '' }}"
40
+ Content-Type: application/json
41
+ body:
42
+ query:
43
+ query_string:
44
+ query: "${{ args.query }}"
45
+ size: "${{ args.limit }}"
46
+ from: 0
47
+
48
+ - select: data
49
+
50
+ # Lens.org JSON `biblio` is the rich envelope. `_score` is Lens's
51
+ # relevance score, naturally a float; pass through as relevance_score.
52
+ - map:
53
+ publication_number: "${{ item.doc_key || item.lens_id }}"
54
+ title: "${{ item.biblio ? (item.biblio.invention_title ? item.biblio.invention_title[0].text : '') : '' }}"
55
+ abstract: "${{ item.abstract ? (Array.isArray(item.abstract) ? (item.abstract[0] && item.abstract[0].text) : item.abstract) : '' }}"
56
+ publication_date: "${{ item.date_published || '' }}"
57
+ filing_date: "${{ item.biblio ? (item.biblio.application_reference ? item.biblio.application_reference.date : '') : '' }}"
58
+ priority_date: "${{ item.biblio && item.biblio.priority_claims && item.biblio.priority_claims.claims ? item.biblio.priority_claims.claims[0].date : '' }}"
59
+ kind_code: "${{ item.biblio && item.biblio.publication_reference ? (item.biblio.publication_reference.kind || '') : '' }}"
60
+ family_id: "${{ item.families ? item.families.simple_family.family_id : '' }}"
61
+ inventors: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.inventors) return []; return p.inventors.map(i => ({ name: i.extracted_name ? (i.extracted_name.value || '') : (i.name || ''), country: i.residence || undefined })).filter(x => x.name); })()) }}"
62
+ assignees: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.applicants) return []; return p.applicants.map(a => ({ name: a.extracted_name ? (a.extracted_name.value || '') : (a.name || ''), country: a.residence || undefined })).filter(x => x.name); })()) }}"
63
+ classifications: "${{ JSON.stringify((function(){ var c = item.biblio && item.biblio.classifications_cpc && item.biblio.classifications_cpc.classifications; var out = []; if(c){ for (var i=0;i<c.length;i++) out.push({ scheme: 'cpc', code: c[i].symbol || '' }); } var ipc = item.biblio && item.biblio.classifications_ipcr && item.biblio.classifications_ipcr.classifications; if(ipc){ for (var j=0;j<ipc.length;j++) out.push({ scheme: 'ipc', code: ipc[j].symbol || '' }); } return out.filter(x => x.code); })()) }}"
64
+ cited_by_count: "${{ item.biblio && item.biblio.cited_by ? (item.biblio.cited_by.patent_count || 0) : '' }}"
65
+ cites_count: "${{ item.biblio && item.biblio.references_cited && item.biblio.references_cited.patent_count !== undefined ? item.biblio.references_cited.patent_count : '' }}"
66
+ claims_count: "${{ item.claims_count !== undefined ? item.claims_count : '' }}"
67
+ relevance_score: "${{ item._score !== undefined ? item._score : '' }}"
68
+ source_url: "https://www.lens.org/lens/patent/${{ item.lens_id }}"
69
+ source_adapter: lens
70
+ retrieved_at: "${{ now }}"
71
+
72
+ - limit: ${{ args.limit }}
73
+
74
+ columns: [publication_number, title, publication_date, source_adapter]
75
+
76
+ # schema-v2 metadata
77
+ capabilities: ["http.fetch", "patent.search"]
78
+ minimum_capability: http.fetch
79
+ trust: public
80
+ confidentiality: public
81
+ quarantine: false
82
+ schema_version: v2
@@ -0,0 +1,82 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { mapMastodonStatusRows, normalizeMastodonAccount } from "./statuses.js";
4
+
5
+ describe("mastodon statuses adapter helpers", () => {
6
+ it("normalizes account handles and instance overrides", () => {
7
+ expect(normalizeMastodonAccount("gargron@mastodon.social")).toEqual({
8
+ acct: "gargron",
9
+ instance: "mastodon.social",
10
+ });
11
+
12
+ expect(normalizeMastodonAccount("@gargron", "mastodon.social")).toEqual({
13
+ acct: "gargron",
14
+ instance: "mastodon.social",
15
+ });
16
+ });
17
+
18
+ it("maps API statuses into stable social rows", () => {
19
+ expect(
20
+ mapMastodonStatusRows(
21
+ [
22
+ {
23
+ created_at: "2026-05-14T10:00:00.000Z",
24
+ content: "<p>Hello <strong>fediverse</strong></p>",
25
+ url: "https://mastodon.social/@gargron/1",
26
+ reblogs_count: 2,
27
+ favourites_count: 3,
28
+ replies_count: 4,
29
+ account: { acct: "gargron", display_name: "Gargron" },
30
+ },
31
+ ],
32
+ 10,
33
+ ),
34
+ ).toEqual([
35
+ {
36
+ rank: 1,
37
+ author: "Gargron",
38
+ handle: "@gargron",
39
+ content: "Hello fediverse",
40
+ reblogs: 2,
41
+ favorites: 3,
42
+ replies: 4,
43
+ url: "https://mastodon.social/@gargron/1",
44
+ date: "2026-05-14T10:00:00.000Z",
45
+ },
46
+ ]);
47
+ });
48
+
49
+ it("drops empty activity rows and decodes common HTML entities", () => {
50
+ expect(
51
+ mapMastodonStatusRows(
52
+ [
53
+ {
54
+ created_at: "2026-05-14T10:00:00.000Z",
55
+ content: "",
56
+ url: "https://mastodon.social/users/Gargron/statuses/1/activity",
57
+ account: { acct: "Gargron", display_name: "Eugen Rochko" },
58
+ },
59
+ {
60
+ created_at: "2026-05-14T11:00:00.000Z",
61
+ content: "<p>Don&#39;t escape &amp; ship</p>",
62
+ url: "https://mastodon.social/@Gargron/2",
63
+ account: { acct: "Gargron", display_name: "Eugen Rochko" },
64
+ },
65
+ ],
66
+ 10,
67
+ ),
68
+ ).toEqual([
69
+ {
70
+ rank: 1,
71
+ author: "Eugen Rochko",
72
+ handle: "@Gargron",
73
+ content: "Don't escape & ship",
74
+ reblogs: 0,
75
+ favorites: 0,
76
+ replies: 0,
77
+ url: "https://mastodon.social/@Gargron/2",
78
+ date: "2026-05-14T11:00:00.000Z",
79
+ },
80
+ ]);
81
+ });
82
+ });
@@ -0,0 +1,208 @@
1
+ /**
2
+ * @owner Mastodon user status adapter.
3
+ * @does Register a public read command for recent statuses by account handle.
4
+ * @needs Mastodon-compatible public API endpoints for account lookup and statuses.
5
+ * @feeds Social research workflows and social capability coverage.
6
+ * @breaks Instance API drift, blocked public egress, or accounts hidden from public lookup.
7
+ */
8
+
9
+ import { USER_AGENT } from "../../constants.js";
10
+ import { cli, Strategy } from "../../registry.js";
11
+
12
+ interface MastodonAccount {
13
+ id?: unknown;
14
+ acct?: unknown;
15
+ display_name?: unknown;
16
+ }
17
+
18
+ interface MastodonStatus {
19
+ created_at?: unknown;
20
+ content?: unknown;
21
+ url?: unknown;
22
+ reblogs_count?: unknown;
23
+ favourites_count?: unknown;
24
+ replies_count?: unknown;
25
+ account?: MastodonAccount;
26
+ }
27
+
28
+ export interface MastodonAccountRef {
29
+ acct: string;
30
+ instance: string;
31
+ }
32
+
33
+ export interface MastodonStatusRow {
34
+ rank: number;
35
+ author: string;
36
+ handle: string;
37
+ content: string;
38
+ reblogs: number;
39
+ favorites: number;
40
+ replies: number;
41
+ url: string;
42
+ date: string;
43
+ }
44
+
45
+ function cleanString(value: unknown): string {
46
+ return typeof value === "string" ? value.trim() : "";
47
+ }
48
+
49
+ function numberValue(value: unknown): number {
50
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
51
+ }
52
+
53
+ function stripHtml(value: unknown): string {
54
+ return cleanString(value)
55
+ .replace(/<[^>]*>/g, "")
56
+ .replace(/&nbsp;/g, " ")
57
+ .replace(/&amp;/g, "&")
58
+ .replace(/&lt;/g, "<")
59
+ .replace(/&gt;/g, ">")
60
+ .replace(/&quot;/g, '"')
61
+ .replace(/&#39;/g, "'")
62
+ .replace(/\s+/g, " ")
63
+ .trim();
64
+ }
65
+
66
+ export function normalizeMastodonAccount(
67
+ input: string,
68
+ instanceOverride = "mastodon.social",
69
+ ): MastodonAccountRef {
70
+ const trimmed = input.trim().replace(/^@/, "");
71
+ if (!trimmed) throw new Error("Mastodon account cannot be empty");
72
+ const parts = trimmed.split("@").filter(Boolean);
73
+ if (parts.length > 2) {
74
+ throw new Error(`Invalid Mastodon account: ${input}`);
75
+ }
76
+ const acct = parts[0];
77
+ const instance = parts[1] ?? instanceOverride.trim();
78
+ if (!acct || !instance) {
79
+ throw new Error(`Invalid Mastodon account: ${input}`);
80
+ }
81
+ return { acct, instance };
82
+ }
83
+
84
+ export function mapMastodonStatusRows(
85
+ statuses: MastodonStatus[],
86
+ limit: number,
87
+ ): MastodonStatusRow[] {
88
+ const rows: Omit<MastodonStatusRow, "rank">[] = [];
89
+ for (const status of statuses) {
90
+ const content = stripHtml(status.content).slice(0, 500);
91
+ if (!content) continue;
92
+ const account = status.account ?? {};
93
+ const handle = cleanString(account.acct);
94
+ rows.push({
95
+ author: cleanString(account.display_name) || handle,
96
+ handle: handle ? `@${handle}` : "",
97
+ content,
98
+ reblogs: numberValue(status.reblogs_count),
99
+ favorites: numberValue(status.favourites_count),
100
+ replies: numberValue(status.replies_count),
101
+ url: cleanString(status.url),
102
+ date: cleanString(status.created_at),
103
+ });
104
+ }
105
+ return rows.slice(0, limit).map((row, index) => ({
106
+ rank: index + 1,
107
+ ...row,
108
+ }));
109
+ }
110
+
111
+ function parseLimit(value: unknown): number {
112
+ const limit = Number(value ?? 20);
113
+ if (!Number.isInteger(limit) || limit < 1 || limit > 40) {
114
+ throw new Error(
115
+ `--limit must be an integer between 1 and 40, got ${value}`,
116
+ );
117
+ }
118
+ return limit;
119
+ }
120
+
121
+ async function fetchMastodonJson(url: string): Promise<unknown> {
122
+ const response = await fetch(url, {
123
+ headers: {
124
+ Accept: "application/json",
125
+ "User-Agent": USER_AGENT,
126
+ },
127
+ });
128
+ if (!response.ok) {
129
+ const preview = (await response.text()).slice(0, 200);
130
+ throw new Error(`Mastodon HTTP ${response.status} from ${url}: ${preview}`);
131
+ }
132
+ return response.json() as Promise<unknown>;
133
+ }
134
+
135
+ function requireAccountId(account: unknown): string {
136
+ if (!account || typeof account !== "object") {
137
+ throw new Error("Mastodon account lookup returned a non-object response");
138
+ }
139
+ const id = cleanString((account as MastodonAccount).id);
140
+ if (!id) throw new Error("Mastodon account lookup did not return an id");
141
+ return id;
142
+ }
143
+
144
+ cli({
145
+ site: "mastodon",
146
+ name: "statuses",
147
+ description: "Get recent public statuses from a Mastodon account",
148
+ domain: "mastodon.social",
149
+ strategy: Strategy.PUBLIC,
150
+ args: [
151
+ {
152
+ name: "account",
153
+ required: true,
154
+ positional: true,
155
+ description: "Account handle, e.g. gargron@mastodon.social",
156
+ },
157
+ {
158
+ name: "instance",
159
+ type: "str",
160
+ default: "mastodon.social",
161
+ description: "Mastodon instance domain used when account omits one",
162
+ },
163
+ {
164
+ name: "limit",
165
+ type: "int",
166
+ default: 20,
167
+ description: "Number of statuses, 1-40",
168
+ },
169
+ ],
170
+ columns: [
171
+ "rank",
172
+ "author",
173
+ "handle",
174
+ "content",
175
+ "reblogs",
176
+ "favorites",
177
+ "replies",
178
+ "url",
179
+ "date",
180
+ ],
181
+ socialCapabilities: ["read", "user_content", "reactions"],
182
+ func: async (_page, kwargs) => {
183
+ const limit = parseLimit(kwargs.limit);
184
+ const account = normalizeMastodonAccount(
185
+ String(kwargs.account ?? ""),
186
+ String(kwargs.instance ?? "mastodon.social"),
187
+ );
188
+ const origin = `https://${account.instance}`;
189
+ const lookupUrl = new URL("/api/v1/accounts/lookup", origin);
190
+ lookupUrl.searchParams.set("acct", account.acct);
191
+ const lookup = await fetchMastodonJson(lookupUrl.toString());
192
+ const accountId = requireAccountId(lookup);
193
+ const statusesUrl = new URL(
194
+ `/api/v1/accounts/${encodeURIComponent(accountId)}/statuses`,
195
+ origin,
196
+ );
197
+ statusesUrl.searchParams.set("limit", String(limit));
198
+ statusesUrl.searchParams.set("exclude_reblogs", "false");
199
+ statusesUrl.searchParams.set("exclude_replies", "false");
200
+ const statuses = await fetchMastodonJson(statusesUrl.toString());
201
+ if (!Array.isArray(statuses)) {
202
+ throw new Error(
203
+ "Mastodon statuses endpoint returned a non-array response",
204
+ );
205
+ }
206
+ return mapMastodonStatusRows(statuses as MastodonStatus[], limit);
207
+ },
208
+ });