@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,206 @@
1
+ /**
2
+ * @owner src::adapters::inpi-br::search
3
+ * @does Browser-driven INPI Brasil search at busca.inpi.gov.br/pePI/ — Brazil's patent office has no open API (pre-API status); the public web search is the only programmatic surface.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/inpi-br/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.search)
6
+ * @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (no rows), PATENT_API_DEPRECATED with MCP_BUS_MISSING
7
+ * @invariants output rows canonicalized into PatentRecord with source_adapter='inpi-br'
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/inpi-br/search.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+
17
+ import { cli, Strategy } from "../../registry.js";
18
+ import { TransportError } from "../../engine/transport/mcp-browser.js";
19
+ import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
20
+ import {
21
+ inpiBrEnvelope,
22
+ inpiBrNavigateAndExtract,
23
+ transportErrorToInpiBrEnvelope,
24
+ } from "./_shared.js";
25
+
26
+ const ADAPTER_PATH = "src/adapters/inpi-br/search.ts";
27
+ const INPI_BR_SEARCH_URL =
28
+ "https://busca.inpi.gov.br/pePI/servlet/PatenteServletController";
29
+
30
+ interface InpiBrRow {
31
+ publication_number: string;
32
+ title?: string;
33
+ applicant?: string;
34
+ publication_date?: string;
35
+ filing_date?: string;
36
+ source_url?: string;
37
+ }
38
+
39
+ const EXTRACTOR = `(() => {
40
+ const rows = Array.from(
41
+ document.querySelectorAll('table.tabela tr.linha, table tr[bgcolor]')
42
+ ).map((el) => {
43
+ const text = (sel) => {
44
+ const node = el.querySelector(sel);
45
+ return node ? (node.textContent || '').trim() : '';
46
+ };
47
+ const cells = Array.from(el.querySelectorAll('td')).map((td) => (td.textContent || '').trim());
48
+ const linkEl = el.querySelector('a[href]');
49
+ return {
50
+ publication_number: text('td.num-pedido, td:first-child') || (cells[0] || ''),
51
+ title: text('td.titulo, td:nth-child(3)') || (cells[2] || ''),
52
+ applicant: text('td.depositante, td:nth-child(4)') || (cells[3] || ''),
53
+ publication_date: text('td.data-pub, td:nth-child(5)') || (cells[4] || ''),
54
+ filing_date: text('td.data-dep, td:nth-child(2)') || (cells[1] || ''),
55
+ source_url: linkEl ? linkEl.href : '',
56
+ };
57
+ });
58
+ return { rows };
59
+ })()`;
60
+
61
+ function buildSearchUrl(query: string): string {
62
+ const params = new URLSearchParams({
63
+ Action: "searchPatente",
64
+ ExpressaoPesquisa: query,
65
+ });
66
+ return `${INPI_BR_SEARCH_URL}?${params.toString()}`;
67
+ }
68
+
69
+ export async function runInpiBrSearch(kwargs: {
70
+ query: string;
71
+ limit?: number;
72
+ }): Promise<unknown[]> {
73
+ const limit =
74
+ typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
75
+ ? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
76
+ : 25;
77
+ const query = String(kwargs.query ?? "").trim();
78
+ if (query.length === 0) {
79
+ return [
80
+ {
81
+ envelope: inpiBrEnvelope(
82
+ "PATENT_UNSUPPORTED_QUERY",
83
+ ADAPTER_PATH,
84
+ "validate",
85
+ "inpi-br search requires a non-empty query",
86
+ ),
87
+ },
88
+ ];
89
+ }
90
+ const url = buildSearchUrl(query);
91
+ let extract: { rows: InpiBrRow[] };
92
+ try {
93
+ const result = await inpiBrNavigateAndExtract<{ rows: InpiBrRow[] }>(
94
+ url,
95
+ EXTRACTOR,
96
+ );
97
+ if (!result.data) {
98
+ return [
99
+ {
100
+ envelope: inpiBrEnvelope(
101
+ "PATENT_SCHEMA_DRIFT",
102
+ ADAPTER_PATH,
103
+ "evaluate",
104
+ "inpi-br evaluate returned no data; selectors likely drifted",
105
+ ),
106
+ },
107
+ ];
108
+ }
109
+ extract = result.data;
110
+ } catch (err) {
111
+ if (err instanceof TransportError) {
112
+ return [
113
+ {
114
+ envelope: transportErrorToInpiBrEnvelope(
115
+ err,
116
+ ADAPTER_PATH,
117
+ "navigate",
118
+ ),
119
+ },
120
+ ];
121
+ }
122
+ throw err;
123
+ }
124
+ if (extract.rows.length === 0) {
125
+ return [
126
+ {
127
+ envelope: inpiBrEnvelope(
128
+ "PATENT_NOT_FOUND",
129
+ ADAPTER_PATH,
130
+ "evaluate",
131
+ `inpi-br returned no rows for query "${query}"`,
132
+ ["espacenet", "lens"],
133
+ ),
134
+ },
135
+ ];
136
+ }
137
+ const out: unknown[] = [];
138
+ for (const row of extract.rows.slice(0, limit)) {
139
+ if (!row.publication_number) continue;
140
+ const normalizedPub = /^BR[-]?/.test(row.publication_number)
141
+ ? row.publication_number
142
+ : `BR${row.publication_number}`;
143
+ try {
144
+ out.push(
145
+ assemblePatentRecord({
146
+ publication_number: normalizedPub,
147
+ title: row.title || undefined,
148
+ assignees: row.applicant
149
+ ? [{ name: row.applicant, country: "BR" }]
150
+ : undefined,
151
+ publication_date: row.publication_date || undefined,
152
+ filing_date: row.filing_date || undefined,
153
+ source_adapter: "inpi-br",
154
+ source_url: row.source_url || url,
155
+ } as Parameters<typeof assemblePatentRecord>[0]),
156
+ );
157
+ } catch {
158
+ // Skip malformed rows.
159
+ }
160
+ }
161
+ if (out.length === 0) {
162
+ out.push({
163
+ envelope: inpiBrEnvelope(
164
+ "PATENT_NOT_FOUND",
165
+ ADAPTER_PATH,
166
+ "normalize",
167
+ "inpi-br returned rows but none normalized to a valid publication_number",
168
+ ["espacenet"],
169
+ ),
170
+ });
171
+ }
172
+ return out;
173
+ }
174
+
175
+ cli({
176
+ site: "inpi-br",
177
+ name: "search",
178
+ description: "Search INPI Brasil patents (browser-only, no upstream API)",
179
+ domain: "busca.inpi.gov.br",
180
+ strategy: Strategy.PUBLIC,
181
+ adapter_path: ADAPTER_PATH,
182
+ args: [
183
+ {
184
+ name: "query",
185
+ type: "str",
186
+ required: true,
187
+ positional: true,
188
+ description: "Free-text query for INPI Brasil patent search",
189
+ },
190
+ {
191
+ name: "limit",
192
+ type: "int",
193
+ default: 25,
194
+ description: "Max results (1-100)",
195
+ },
196
+ ],
197
+ columns: ["publication_number", "title", "publication_date", "source_url"],
198
+ capabilities: [
199
+ "mcp-browser.navigate",
200
+ "mcp-browser.evaluate",
201
+ "patent.search",
202
+ ],
203
+ minimum_capability: "mcp-browser.evaluate",
204
+ func: async (_page, kwargs) =>
205
+ runInpiBrSearch(kwargs as { query: string; limit?: number }),
206
+ });
@@ -0,0 +1,62 @@
1
+ # @owner src::adapters::inpi-fr::get
2
+ # @does Fetch a French patent record by publication number via the INPI public open-data API.
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/map.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on 404 or 5xx; some legal-status / inventor fields require an INPI session-login this adapter does not perform
6
+ # @invariants output row conforms to PatentRecord
7
+ # @side-effects HTTPS egress to api-recherche.inpi.fr
8
+ # @perf single request
9
+ # @concurrency safe
10
+ # @test none yet
11
+ # @stability stable
12
+ # @since 2026-05-18
13
+ # @verification blocked-by-key — session-cookie auth not implemented; only the open public-record subset is reachable
14
+ site: inpi-fr
15
+ name: get
16
+ description: Fetch a French patent record by publication number (open subset)
17
+ domain: api.inpi.fr
18
+ type: web-api
19
+ strategy: public
20
+ lint_listing_detail: skip
21
+
22
+ args:
23
+ publication_number:
24
+ type: str
25
+ required: true
26
+ positional: true
27
+ description: French publication number (e.g. FR3098765)
28
+
29
+ pipeline:
30
+ - fetch:
31
+ url: "https://api-recherche.inpi.fr/services/patents/${{ args.publication_number | urlencode }}"
32
+ method: GET
33
+ headers:
34
+ Accept: application/json
35
+
36
+ - map:
37
+ publication_number: "${{ 'FR-' + (item.publicationNumber || args.publication_number || '') + '-' + (item.kindCode || '') }}"
38
+ application_number: "${{ item.applicationNumber || '' }}"
39
+ title: "${{ item.title || item.titleFr || item.titleEn || '' }}"
40
+ abstract: "${{ item.abstract || item.abstractFr || item.abstractEn || '' }}"
41
+ kind_code: "${{ item.kindCode || '' }}"
42
+ filing_date: "${{ item.filingDate || item.applicationDate || '' }}"
43
+ publication_date: "${{ item.publicationDate || '' }}"
44
+ grant_date: "${{ item.grantDate || '' }}"
45
+ priority_date: "${{ item.priorityDate || '' }}"
46
+ legal_status: "${{ item.legalStatus || item.status || '' }}"
47
+ inventors: "${{ JSON.stringify((function(){ var i=item.inventors; if(!i) return []; var arr = Array.isArray(i) ? i : [i]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'FR' })).filter(x => x.name); })()) }}"
48
+ assignees: "${{ JSON.stringify((function(){ var a=item.applicants || item.holders; if(!a) return []; var arr = Array.isArray(a) ? a : [a]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'FR' })).filter(x => x.name); })()) }}"
49
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipc || item.classifications; if(!c) return []; var arr = Array.isArray(c) ? c : [c]; return arr.map(x => ({ scheme: 'ipc', code: typeof x === 'string' ? x : (x.code || '') })).filter(x => x.code); })()) }}"
50
+ source_adapter: inpi-fr
51
+ source_url: "${{ 'https://data.inpi.fr/brevets/' + (args.publication_number || '') }}"
52
+ retrieved_at: ""
53
+
54
+ columns: [publication_number, title, filing_date, publication_date]
55
+
56
+ # schema-v2 metadata
57
+ capabilities: ["http.fetch", "patent.get"]
58
+ minimum_capability: http.fetch
59
+ trust: public
60
+ confidentiality: public
61
+ quarantine: false
62
+ schema_version: v2
@@ -0,0 +1,74 @@
1
+ # @owner src::adapters::inpi-fr::search
2
+ # @does Search French patents (FR brevets) via the public INPI search API (open subset, no login).
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/select.ts, src/engine/steps/map.ts, src/engine/steps/limit.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on 5xx or rate limit; INPI's full-feature endpoints require an authenticated session — this adapter implements only the public open-data subset
6
+ # @invariants output rows conform to PatentRecord; publication_number is `FR-<doc>-<kind>`
7
+ # @side-effects HTTPS egress to api.inpi.fr / api-recherche.inpi.fr; no env reads
8
+ # @perf single request
9
+ # @concurrency safe
10
+ # @test none yet
11
+ # @stability stable
12
+ # @since 2026-05-18
13
+ # @verification blocked-by-key — INPI public search API throttles anonymous traffic and the full record endpoints require a session cookie. Session-cookie login flow is not implemented in this adapter; the search endpoint exercised here is the open subset documented at data.inpi.fr.
14
+ site: inpi-fr
15
+ name: search
16
+ description: Search French patents via the INPI public open-data search API
17
+ domain: api.inpi.fr
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
28
+ limit:
29
+ type: int
30
+ default: 25
31
+ description: Maximum results
32
+
33
+ pipeline:
34
+ - fetch:
35
+ url: "https://api-recherche.inpi.fr/services/patents/search"
36
+ method: GET
37
+ headers:
38
+ Accept: application/json
39
+ params:
40
+ q: "${{ args.query }}"
41
+ nbResultsParPage: "${{ args.limit }}"
42
+ page: "1"
43
+
44
+ - select: results
45
+
46
+ # INPI open-data JSON; field names mirror INPI's documented schema.
47
+ - map:
48
+ publication_number: "${{ 'FR-' + (item.publicationNumber || item.applicationNumber || '') + '-' + (item.kindCode || '') }}"
49
+ application_number: "${{ item.applicationNumber || '' }}"
50
+ title: "${{ item.title || item.titleFr || item.titleEn || '' }}"
51
+ abstract: "${{ item.abstract || item.abstractFr || item.abstractEn || '' }}"
52
+ kind_code: "${{ item.kindCode || '' }}"
53
+ filing_date: "${{ item.filingDate || item.applicationDate || '' }}"
54
+ publication_date: "${{ item.publicationDate || '' }}"
55
+ grant_date: "${{ item.grantDate || '' }}"
56
+ priority_date: "${{ item.priorityDate || '' }}"
57
+ inventors: "${{ JSON.stringify((function(){ var i=item.inventors; if(!i) return []; var arr = Array.isArray(i) ? i : [i]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'FR' })).filter(x => x.name); })()) }}"
58
+ assignees: "${{ JSON.stringify((function(){ var a=item.applicants || item.holders; if(!a) return []; var arr = Array.isArray(a) ? a : [a]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'FR' })).filter(x => x.name); })()) }}"
59
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipc || item.classifications; if(!c) return []; var arr = Array.isArray(c) ? c : [c]; return arr.map(x => ({ scheme: 'ipc', code: typeof x === 'string' ? x : (x.code || '') })).filter(x => x.code); })()) }}"
60
+ source_adapter: inpi-fr
61
+ source_url: "${{ 'https://data.inpi.fr/brevets/' + (item.publicationNumber || item.applicationNumber || '') }}"
62
+ retrieved_at: ""
63
+
64
+ - limit: "${{ args.limit }}"
65
+
66
+ columns: [publication_number, title, filing_date, publication_date]
67
+
68
+ # schema-v2 metadata
69
+ capabilities: ["http.fetch", "patent.search"]
70
+ minimum_capability: http.fetch
71
+ trust: public
72
+ confidentiality: public
73
+ quarantine: false
74
+ schema_version: v2
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @owner Instagram subtitle adapter.
3
+ * @does Extracts LLM-readable subtitle text from public Instagram reel and video URLs.
4
+ * @needs `yt-dlp` on PATH and an accessible video subtitle track.
5
+ * @feeds Cross-platform social video analysis workflows.
6
+ * @breaks Instagram or yt-dlp extractor changes can alter subtitle availability.
7
+ */
8
+
9
+ import { cli, Strategy } from "../../registry.js";
10
+ import { runVideoSubtitleExtraction } from "../../social/video-text.js";
11
+
12
+ cli({
13
+ site: "instagram",
14
+ name: "subtitles",
15
+ description:
16
+ "Extract LLM-readable subtitles from an Instagram reel or video URL with optional browser-cookie reuse",
17
+ domain: "www.instagram.com",
18
+ strategy: Strategy.PUBLIC,
19
+ args: [
20
+ {
21
+ name: "url",
22
+ type: "str",
23
+ required: true,
24
+ positional: true,
25
+ description: "Instagram reel or video URL",
26
+ format: "uri",
27
+ },
28
+ {
29
+ name: "languages",
30
+ type: "str",
31
+ default: "zh-Hans,zh,en",
32
+ description: "Comma-separated subtitle languages",
33
+ },
34
+ {
35
+ name: "cookies-from-browser",
36
+ type: "str",
37
+ description: "Browser name for yt-dlp --cookies-from-browser",
38
+ },
39
+ ],
40
+ columns: ["language", "text", "path"],
41
+ socialCapabilities: ["read", "media", "subtitles"],
42
+ defaultFormat: "json",
43
+ func: async (_page, kwargs) => runVideoSubtitleExtraction(kwargs),
44
+ });
@@ -0,0 +1,67 @@
1
+ # @owner src::adapters::ipaustralia::get
2
+ # @does Fetch an Australian patent record by application number via the IP Australia API portal.
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 401/403, 404, 5xx
6
+ # @invariants output row conforms to PatentRecord
7
+ # @side-effects reads env IPAUSTRALIA_API_KEY; HTTPS egress to api.ipaustralia.gov.au
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: ipaustralia
15
+ name: get
16
+ description: Fetch an Australian patent by application number
17
+ domain: api.ipaustralia.gov.au
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: Australian application number (e.g. 2023000123)
28
+
29
+ pipeline:
30
+ - fetch:
31
+ url: "https://api.ipaustralia.gov.au/patents/v1/patent/${{ args.application_number | urlencode }}"
32
+ method: GET
33
+ headers:
34
+ Accept: application/xml
35
+ x-api-key: "${{ env.IPAUSTRALIA_API_KEY || '' }}"
36
+
37
+ - select-xml:
38
+ xpath: "//patent"
39
+ unwrap_single: true
40
+
41
+ - map:
42
+ publication_number: "${{ 'AU-' + (item.publicationNumber || args.application_number || '') + '-' + (item.kindCode || '') }}"
43
+ application_number: "${{ item.applicationNumber || args.application_number || '' }}"
44
+ title: "${{ item.title || item.inventionTitle || '' }}"
45
+ abstract: "${{ item.abstract || '' }}"
46
+ kind_code: "${{ item.kindCode || '' }}"
47
+ filing_date: "${{ item.filingDate || item.applicationDate || '' }}"
48
+ publication_date: "${{ item.publicationDate || '' }}"
49
+ grant_date: "${{ item.grantDate || '' }}"
50
+ priority_date: "${{ item.priorityDate || '' }}"
51
+ legal_status: "${{ item.legalStatus || item.status || '' }}"
52
+ inventors: "${{ JSON.stringify((function(){ var i=item.inventor || item.inventors; if(!i) return []; var arr = Array.isArray(i) ? i : [i]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'AU' })).filter(x => x.name); })()) }}"
53
+ assignees: "${{ JSON.stringify((function(){ var a=item.applicant || item.applicants; if(!a) return []; var arr = Array.isArray(a) ? a : [a]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'AU' })).filter(x => x.name); })()) }}"
54
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipc || item.classifications; if(!c) return []; var arr = Array.isArray(c) ? c : [c]; return arr.map(x => ({ scheme: 'ipc', code: typeof x === 'string' ? x : (x.code || '') })).filter(x => x.code); })()) }}"
55
+ source_adapter: ipaustralia
56
+ source_url: "${{ 'https://search.ipaustralia.gov.au/patents/' + (args.application_number || '') }}"
57
+ retrieved_at: ""
58
+
59
+ columns: [publication_number, title, filing_date, publication_date]
60
+
61
+ # schema-v2 metadata
62
+ capabilities: ["http.fetch", "patent.get"]
63
+ minimum_capability: http.fetch
64
+ trust: public
65
+ confidentiality: public
66
+ quarantine: false
67
+ schema_version: v2
@@ -0,0 +1,74 @@
1
+ # @owner src::adapters::ipaustralia::search
2
+ # @does Search Australian patents via the IP Australia API Portal (Open Data services).
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 401/403 (missing IPAUSTRALIA_API_KEY), 4xx, 5xx
6
+ # @invariants output rows conform to PatentRecord; publication_number is `AU-<doc>-<kind>`
7
+ # @side-effects reads env IPAUSTRALIA_API_KEY; HTTPS egress to api.ipaustralia.gov.au
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 IPAUSTRALIA_API_KEY (free registration at api.ipaustralia.gov.au)
14
+ site: ipaustralia
15
+ name: search
16
+ description: Search Australian patents via the IP Australia API portal
17
+ domain: api.ipaustralia.gov.au
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 (title/abstract)
28
+ limit:
29
+ type: int
30
+ default: 25
31
+ description: Maximum results
32
+
33
+ pipeline:
34
+ - fetch:
35
+ url: "https://api.ipaustralia.gov.au/patents/v1/search"
36
+ method: GET
37
+ headers:
38
+ Accept: application/xml
39
+ x-api-key: "${{ env.IPAUSTRALIA_API_KEY || '' }}"
40
+ params:
41
+ q: "${{ args.query }}"
42
+ size: "${{ args.limit }}"
43
+
44
+ - select-xml:
45
+ xpath: "//patent"
46
+
47
+ - map:
48
+ publication_number: "${{ 'AU-' + (item.publicationNumber || item.applicationNumber || '') + '-' + (item.kindCode || '') }}"
49
+ application_number: "${{ item.applicationNumber || '' }}"
50
+ title: "${{ item.title || item.inventionTitle || '' }}"
51
+ abstract: "${{ item.abstract || '' }}"
52
+ kind_code: "${{ item.kindCode || '' }}"
53
+ filing_date: "${{ item.filingDate || item.applicationDate || '' }}"
54
+ publication_date: "${{ item.publicationDate || '' }}"
55
+ grant_date: "${{ item.grantDate || '' }}"
56
+ priority_date: "${{ item.priorityDate || '' }}"
57
+ inventors: "${{ JSON.stringify((function(){ var i=item.inventor || item.inventors; if(!i) return []; var arr = Array.isArray(i) ? i : [i]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'AU' })).filter(x => x.name); })()) }}"
58
+ assignees: "${{ JSON.stringify((function(){ var a=item.applicant || item.applicants; if(!a) return []; var arr = Array.isArray(a) ? a : [a]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || n.fullName || ''), country: 'AU' })).filter(x => x.name); })()) }}"
59
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipc || item.classifications; if(!c) return []; var arr = Array.isArray(c) ? c : [c]; return arr.map(x => ({ scheme: 'ipc', code: typeof x === 'string' ? x : (x.code || '') })).filter(x => x.code); })()) }}"
60
+ source_adapter: ipaustralia
61
+ source_url: "${{ 'https://search.ipaustralia.gov.au/patents/' + (item.applicationNumber || '') }}"
62
+ retrieved_at: ""
63
+
64
+ - limit: "${{ args.limit }}"
65
+
66
+ columns: [publication_number, title, filing_date, publication_date]
67
+
68
+ # schema-v2 metadata
69
+ capabilities: ["http.fetch", "patent.search"]
70
+ minimum_capability: http.fetch
71
+ trust: public
72
+ confidentiality: public
73
+ quarantine: false
74
+ schema_version: v2
@@ -0,0 +1,63 @@
1
+ # @owner src::adapters::jpo::get
2
+ # @does Fetch a single Japanese patent record from JPO Patent Information Retrieval API by application number.
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/map.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on 401/403, 404, 5xx
6
+ # @invariants output row conforms to PatentRecord
7
+ # @side-effects reads env JPO_API_TOKEN; HTTPS egress to ip-data.jpo.go.jp
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: jpo
15
+ name: get
16
+ description: Fetch a JPO application by application number
17
+ domain: ip-data.jpo.go.jp
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: JPO application number (e.g. 特願2024-012345 numeric form 2024012345)
28
+
29
+ pipeline:
30
+ - fetch:
31
+ url: "https://ip-data.jpo.go.jp/api/v2/patent/applications/${{ args.application_number | urlencode }}"
32
+ method: GET
33
+ headers:
34
+ Accept: application/json
35
+ Authorization: "Bearer ${{ env.JPO_API_TOKEN || '' }}"
36
+
37
+ - map:
38
+ publication_number: "${{ 'JP-' + (item.publicationNumber || item.applicationNumber || '') + '-' + (item.publicationKindCode || '') }}"
39
+ application_number: "${{ item.applicationNumber || args.application_number || '' }}"
40
+ title: "${{ item.inventionTitleJapanese || item.inventionTitleEnglish || '' }}"
41
+ abstract: "${{ item.abstractJapanese || item.abstractEnglish || '' }}"
42
+ kind_code: "${{ item.publicationKindCode || '' }}"
43
+ filing_date: "${{ item.applicationDate || '' }}"
44
+ publication_date: "${{ item.publicationDate || '' }}"
45
+ grant_date: "${{ item.registrationDate || '' }}"
46
+ priority_date: "${{ item.priorityDate || '' }}"
47
+ legal_status: "${{ item.statusDescription || item.status || '' }}"
48
+ inventors: "${{ JSON.stringify((function(){ var i=item.inventorName; if(!i) return []; var arr = Array.isArray(i) ? i : [i]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || ''), country: 'JP' })).filter(x => x.name); })()) }}"
49
+ assignees: "${{ JSON.stringify((function(){ var a=item.applicantName; if(!a) return []; var arr = Array.isArray(a) ? a : [a]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || ''), country: 'JP' })).filter(x => x.name); })()) }}"
50
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipcClassification; if(!c) return []; var arr = Array.isArray(c) ? c : [c]; return arr.map(x => ({ scheme: 'ipc', code: typeof x === 'string' ? x : (x.code || '') })).filter(x => x.code); })()) }}"
51
+ source_adapter: jpo
52
+ source_url: "${{ 'https://www.j-platpat.inpit.go.jp/p0200' }}"
53
+ retrieved_at: ""
54
+
55
+ columns: [publication_number, title, filing_date, publication_date]
56
+
57
+ # schema-v2 metadata
58
+ capabilities: ["http.fetch", "patent.get"]
59
+ minimum_capability: http.fetch
60
+ trust: public
61
+ confidentiality: public
62
+ quarantine: false
63
+ schema_version: v2
@@ -0,0 +1,76 @@
1
+ # @owner src::adapters::jpo::search
2
+ # @does Search JPO Patent Information Retrieval API for Japanese patent applications.
3
+ # @needs src/engine/steps/fetch.ts, src/engine/steps/select.ts, src/engine/steps/map.ts, src/engine/steps/limit.ts
4
+ # @feeds src/commands/patent.ts
5
+ # @breaks throws PipelineError on 401/403 (missing JPO_API_TOKEN), 404, 5xx; rate-limited per terms-of-use
6
+ # @invariants output rows conform to PatentRecord; publication_number is `JP-<doc>-<kind>`
7
+ # @side-effects reads env JPO_API_TOKEN; HTTPS egress to ip-data.jpo.go.jp
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 JPO_API_TOKEN (registration at jpo.go.jp/e/system/laws/koho/internet/api-patent_info.html); exact path verified at live exercise time
14
+ site: jpo
15
+ name: search
16
+ description: Search JPO Patent Information Retrieval API
17
+ domain: ip-data.jpo.go.jp
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 (JPO maps to title/abstract/applicant fields)
28
+ limit:
29
+ type: int
30
+ default: 25
31
+ description: Maximum results
32
+
33
+ pipeline:
34
+ - fetch:
35
+ url: "https://ip-data.jpo.go.jp/api/v2/patent/applications/search"
36
+ method: GET
37
+ headers:
38
+ Accept: application/json
39
+ Authorization: "Bearer ${{ env.JPO_API_TOKEN || '' }}"
40
+ params:
41
+ q: "${{ args.query }}"
42
+ size: "${{ args.limit }}"
43
+
44
+ - select: results
45
+
46
+ # JPO Patent Information Retrieval JSON; preserve Japanese script in title,
47
+ # surface English title when JPO returns one, expose IPC + applicant fields.
48
+ - map:
49
+ publication_number: "${{ 'JP-' + (item.publicationNumber || item.applicationNumber || '') + '-' + (item.publicationKindCode || '') }}"
50
+ application_number: "${{ item.applicationNumber || '' }}"
51
+ title: "${{ item.inventionTitleJapanese || item.inventionTitleEnglish || '' }}"
52
+ abstract: "${{ item.abstractJapanese || item.abstractEnglish || '' }}"
53
+ kind_code: "${{ item.publicationKindCode || '' }}"
54
+ filing_date: "${{ item.applicationDate || '' }}"
55
+ publication_date: "${{ item.publicationDate || '' }}"
56
+ grant_date: "${{ item.registrationDate || '' }}"
57
+ priority_date: "${{ item.priorityDate || '' }}"
58
+ # JPO returns inventor / applicant as either string or string[]; coerce to array.
59
+ inventors: "${{ JSON.stringify((function(){ var i=item.inventorName; if(!i) return []; var arr = Array.isArray(i) ? i : [i]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || ''), country: 'JP' })).filter(x => x.name); })()) }}"
60
+ assignees: "${{ JSON.stringify((function(){ var a=item.applicantName; if(!a) return []; var arr = Array.isArray(a) ? a : [a]; return arr.map(n => ({ name: typeof n === 'string' ? n : (n.name || ''), country: 'JP' })).filter(x => x.name); })()) }}"
61
+ classifications: "${{ JSON.stringify((function(){ var c=item.ipcClassification; if(!c) return []; var arr = Array.isArray(c) ? c : [c]; return arr.map(x => ({ scheme: 'ipc', code: typeof x === 'string' ? x : (x.code || '') })).filter(x => x.code); })()) }}"
62
+ source_adapter: jpo
63
+ source_url: "${{ 'https://www.j-platpat.inpit.go.jp/p0200' }}"
64
+ retrieved_at: ""
65
+
66
+ - limit: "${{ args.limit }}"
67
+
68
+ columns: [publication_number, title, filing_date, publication_date]
69
+
70
+ # schema-v2 metadata
71
+ capabilities: ["http.fetch", "patent.search"]
72
+ minimum_capability: http.fetch
73
+ trust: public
74
+ confidentiality: public
75
+ quarantine: false
76
+ schema_version: v2