@zenalexa/unicli 0.220.1 → 0.221.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/AGENTS.md +28 -6
  2. package/README.md +8 -8
  3. package/README.zh-CN.md +8 -8
  4. package/dist/adapters/bilibili/comments.js +66 -4
  5. package/dist/adapters/bilibili/comments.js.map +1 -1
  6. package/dist/adapters/bilibili/compat.js +2 -2
  7. package/dist/adapters/bilibili/compat.js.map +1 -1
  8. package/dist/adapters/bilibili/download.js +4 -4
  9. package/dist/adapters/bilibili/download.js.map +1 -1
  10. package/dist/adapters/bilibili/wbi.d.ts.map +1 -1
  11. package/dist/adapters/bilibili/wbi.js +3 -3
  12. package/dist/adapters/bilibili/wbi.js.map +1 -1
  13. package/dist/adapters/cipo/_shared.d.ts +21 -0
  14. package/dist/adapters/cipo/_shared.d.ts.map +1 -0
  15. package/dist/adapters/cipo/_shared.js +67 -0
  16. package/dist/adapters/cipo/_shared.js.map +1 -0
  17. package/dist/adapters/cipo/get.d.ts +19 -0
  18. package/dist/adapters/cipo/get.d.ts.map +1 -0
  19. package/dist/adapters/cipo/get.js +140 -0
  20. package/dist/adapters/cipo/get.js.map +1 -0
  21. package/dist/adapters/cipo/legal-status.d.ts +19 -0
  22. package/dist/adapters/cipo/legal-status.d.ts.map +1 -0
  23. package/dist/adapters/cipo/legal-status.js +111 -0
  24. package/dist/adapters/cipo/legal-status.js.map +1 -0
  25. package/dist/adapters/cipo/search.d.ts +20 -0
  26. package/dist/adapters/cipo/search.d.ts.map +1 -0
  27. package/dist/adapters/cipo/search.js +148 -0
  28. package/dist/adapters/cipo/search.js.map +1 -0
  29. package/dist/adapters/cnipa/_shared.d.ts +47 -0
  30. package/dist/adapters/cnipa/_shared.d.ts.map +1 -0
  31. package/dist/adapters/cnipa/_shared.js +97 -0
  32. package/dist/adapters/cnipa/_shared.js.map +1 -0
  33. package/dist/adapters/cnipa/get.d.ts +19 -0
  34. package/dist/adapters/cnipa/get.d.ts.map +1 -0
  35. package/dist/adapters/cnipa/get.js +149 -0
  36. package/dist/adapters/cnipa/get.js.map +1 -0
  37. package/dist/adapters/cnipa/legal-status.d.ts +19 -0
  38. package/dist/adapters/cnipa/legal-status.d.ts.map +1 -0
  39. package/dist/adapters/cnipa/legal-status.js +119 -0
  40. package/dist/adapters/cnipa/legal-status.js.map +1 -0
  41. package/dist/adapters/cnipa/search.d.ts +21 -0
  42. package/dist/adapters/cnipa/search.d.ts.map +1 -0
  43. package/dist/adapters/cnipa/search.js +170 -0
  44. package/dist/adapters/cnipa/search.js.map +1 -0
  45. package/dist/adapters/espacenet/_shared.d.ts +21 -0
  46. package/dist/adapters/espacenet/_shared.d.ts.map +1 -0
  47. package/dist/adapters/espacenet/_shared.js +67 -0
  48. package/dist/adapters/espacenet/_shared.js.map +1 -0
  49. package/dist/adapters/espacenet/family.d.ts +19 -0
  50. package/dist/adapters/espacenet/family.d.ts.map +1 -0
  51. package/dist/adapters/espacenet/family.js +118 -0
  52. package/dist/adapters/espacenet/family.js.map +1 -0
  53. package/dist/adapters/espacenet/get.d.ts +19 -0
  54. package/dist/adapters/espacenet/get.d.ts.map +1 -0
  55. package/dist/adapters/espacenet/get.js +130 -0
  56. package/dist/adapters/espacenet/get.js.map +1 -0
  57. package/dist/adapters/espacenet/legal-status.d.ts +19 -0
  58. package/dist/adapters/espacenet/legal-status.d.ts.map +1 -0
  59. package/dist/adapters/espacenet/legal-status.js +110 -0
  60. package/dist/adapters/espacenet/legal-status.js.map +1 -0
  61. package/dist/adapters/espacenet/search.d.ts +20 -0
  62. package/dist/adapters/espacenet/search.d.ts.map +1 -0
  63. package/dist/adapters/espacenet/search.js +165 -0
  64. package/dist/adapters/espacenet/search.js.map +1 -0
  65. package/dist/adapters/facebook/subtitles.d.ts +9 -0
  66. package/dist/adapters/facebook/subtitles.d.ts.map +1 -0
  67. package/dist/adapters/facebook/subtitles.js +42 -0
  68. package/dist/adapters/facebook/subtitles.js.map +1 -0
  69. package/dist/adapters/fips/_shared.d.ts +21 -0
  70. package/dist/adapters/fips/_shared.d.ts.map +1 -0
  71. package/dist/adapters/fips/_shared.js +77 -0
  72. package/dist/adapters/fips/_shared.js.map +1 -0
  73. package/dist/adapters/fips/get.d.ts +19 -0
  74. package/dist/adapters/fips/get.d.ts.map +1 -0
  75. package/dist/adapters/fips/get.js +139 -0
  76. package/dist/adapters/fips/get.js.map +1 -0
  77. package/dist/adapters/fips/search.d.ts +20 -0
  78. package/dist/adapters/fips/search.d.ts.map +1 -0
  79. package/dist/adapters/fips/search.js +148 -0
  80. package/dist/adapters/fips/search.js.map +1 -0
  81. package/dist/adapters/freepatentsonline-web/_shared.d.ts +72 -0
  82. package/dist/adapters/freepatentsonline-web/_shared.d.ts.map +1 -0
  83. package/dist/adapters/freepatentsonline-web/_shared.js +216 -0
  84. package/dist/adapters/freepatentsonline-web/_shared.js.map +1 -0
  85. package/dist/adapters/freepatentsonline-web/get.d.ts +21 -0
  86. package/dist/adapters/freepatentsonline-web/get.d.ts.map +1 -0
  87. package/dist/adapters/freepatentsonline-web/get.js +127 -0
  88. package/dist/adapters/freepatentsonline-web/get.js.map +1 -0
  89. package/dist/adapters/freepatentsonline-web/search.d.ts +22 -0
  90. package/dist/adapters/freepatentsonline-web/search.d.ts.map +1 -0
  91. package/dist/adapters/freepatentsonline-web/search.js +149 -0
  92. package/dist/adapters/freepatentsonline-web/search.js.map +1 -0
  93. package/dist/adapters/google-patents-web/_shared.d.ts +110 -0
  94. package/dist/adapters/google-patents-web/_shared.d.ts.map +1 -0
  95. package/dist/adapters/google-patents-web/_shared.js +164 -0
  96. package/dist/adapters/google-patents-web/_shared.js.map +1 -0
  97. package/dist/adapters/google-patents-web/get.d.ts +36 -0
  98. package/dist/adapters/google-patents-web/get.d.ts.map +1 -0
  99. package/dist/adapters/google-patents-web/get.js +187 -0
  100. package/dist/adapters/google-patents-web/get.js.map +1 -0
  101. package/dist/adapters/google-patents-web/search.d.ts +23 -0
  102. package/dist/adapters/google-patents-web/search.d.ts.map +1 -0
  103. package/dist/adapters/google-patents-web/search.js +169 -0
  104. package/dist/adapters/google-patents-web/search.js.map +1 -0
  105. package/dist/adapters/inpi-br/_shared.d.ts +21 -0
  106. package/dist/adapters/inpi-br/_shared.d.ts.map +1 -0
  107. package/dist/adapters/inpi-br/_shared.js +67 -0
  108. package/dist/adapters/inpi-br/_shared.js.map +1 -0
  109. package/dist/adapters/inpi-br/get.d.ts +19 -0
  110. package/dist/adapters/inpi-br/get.d.ts.map +1 -0
  111. package/dist/adapters/inpi-br/get.js +142 -0
  112. package/dist/adapters/inpi-br/get.js.map +1 -0
  113. package/dist/adapters/inpi-br/search.d.ts +20 -0
  114. package/dist/adapters/inpi-br/search.d.ts.map +1 -0
  115. package/dist/adapters/inpi-br/search.js +154 -0
  116. package/dist/adapters/inpi-br/search.js.map +1 -0
  117. package/dist/adapters/instagram/subtitles.d.ts +9 -0
  118. package/dist/adapters/instagram/subtitles.d.ts.map +1 -0
  119. package/dist/adapters/instagram/subtitles.js +42 -0
  120. package/dist/adapters/instagram/subtitles.js.map +1 -0
  121. package/dist/adapters/mastodon/statuses.d.ts +40 -0
  122. package/dist/adapters/mastodon/statuses.d.ts.map +1 -0
  123. package/dist/adapters/mastodon/statuses.js +153 -0
  124. package/dist/adapters/mastodon/statuses.js.map +1 -0
  125. package/dist/adapters/reddit/comments.d.ts +9 -0
  126. package/dist/adapters/reddit/comments.d.ts.map +1 -0
  127. package/dist/adapters/reddit/comments.js +124 -0
  128. package/dist/adapters/reddit/comments.js.map +1 -0
  129. package/dist/adapters/threads/post.d.ts +32 -0
  130. package/dist/adapters/threads/post.d.ts.map +1 -0
  131. package/dist/adapters/threads/post.js +287 -0
  132. package/dist/adapters/threads/post.js.map +1 -0
  133. package/dist/adapters/tiktok/subtitles.d.ts +9 -0
  134. package/dist/adapters/tiktok/subtitles.d.ts.map +1 -0
  135. package/dist/adapters/tiktok/subtitles.js +42 -0
  136. package/dist/adapters/tiktok/subtitles.js.map +1 -0
  137. package/dist/adapters/twitter/accept.js +2 -2
  138. package/dist/adapters/twitter/accept.js.map +1 -1
  139. package/dist/adapters/twitter/browser-fallback.d.ts +26 -0
  140. package/dist/adapters/twitter/browser-fallback.d.ts.map +1 -0
  141. package/dist/adapters/twitter/browser-fallback.js +93 -0
  142. package/dist/adapters/twitter/browser-fallback.js.map +1 -0
  143. package/dist/adapters/twitter/browser-state.d.ts +11 -0
  144. package/dist/adapters/twitter/browser-state.d.ts.map +1 -0
  145. package/dist/adapters/twitter/browser-state.js +46 -0
  146. package/dist/adapters/twitter/browser-state.js.map +1 -0
  147. package/dist/adapters/twitter/client.d.ts.map +1 -1
  148. package/dist/adapters/twitter/client.js +36 -13
  149. package/dist/adapters/twitter/client.js.map +1 -1
  150. package/dist/adapters/twitter/reply-dm.js +2 -2
  151. package/dist/adapters/twitter/reply-dm.js.map +1 -1
  152. package/dist/adapters/twitter/reply.js +1 -0
  153. package/dist/adapters/twitter/reply.js.map +1 -1
  154. package/dist/adapters/twitter/search.js +11 -18
  155. package/dist/adapters/twitter/search.js.map +1 -1
  156. package/dist/adapters/twitter/thread.d.ts +14 -0
  157. package/dist/adapters/twitter/thread.d.ts.map +1 -1
  158. package/dist/adapters/twitter/thread.js +28 -2
  159. package/dist/adapters/twitter/thread.js.map +1 -1
  160. package/dist/adapters/twitter/trending.js +13 -59
  161. package/dist/adapters/twitter/trending.js.map +1 -1
  162. package/dist/adapters/xiaohongshu/browser-state.d.ts +19 -0
  163. package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -0
  164. package/dist/adapters/xiaohongshu/browser-state.js +67 -0
  165. package/dist/adapters/xiaohongshu/browser-state.js.map +1 -0
  166. package/dist/adapters/xiaohongshu/comments.js +28 -5
  167. package/dist/adapters/xiaohongshu/comments.js.map +1 -1
  168. package/dist/adapters/xiaohongshu/download.js +49 -11
  169. package/dist/adapters/xiaohongshu/download.js.map +1 -1
  170. package/dist/adapters/xiaohongshu/search.d.ts.map +1 -1
  171. package/dist/adapters/xiaohongshu/search.js +11 -5
  172. package/dist/adapters/xiaohongshu/search.js.map +1 -1
  173. package/dist/adapters/xiaohongshu/trending.d.ts +9 -0
  174. package/dist/adapters/xiaohongshu/trending.d.ts.map +1 -0
  175. package/dist/adapters/xiaohongshu/trending.js +94 -0
  176. package/dist/adapters/xiaohongshu/trending.js.map +1 -0
  177. package/dist/adapters/youtube/comments.d.ts +80 -0
  178. package/dist/adapters/youtube/comments.d.ts.map +1 -1
  179. package/dist/adapters/youtube/comments.js +108 -12
  180. package/dist/adapters/youtube/comments.js.map +1 -1
  181. package/dist/adapters/youtube/subtitles.d.ts +9 -0
  182. package/dist/adapters/youtube/subtitles.d.ts.map +1 -0
  183. package/dist/adapters/youtube/subtitles.js +42 -0
  184. package/dist/adapters/youtube/subtitles.js.map +1 -0
  185. package/dist/adapters/yt-dlp/subtitles.d.ts +9 -0
  186. package/dist/adapters/yt-dlp/subtitles.d.ts.map +1 -0
  187. package/dist/adapters/yt-dlp/subtitles.js +41 -0
  188. package/dist/adapters/yt-dlp/subtitles.js.map +1 -0
  189. package/dist/adapters/zhihu/answer-detail.d.ts +39 -0
  190. package/dist/adapters/zhihu/answer-detail.d.ts.map +1 -0
  191. package/dist/adapters/zhihu/answer-detail.js +204 -0
  192. package/dist/adapters/zhihu/answer-detail.js.map +1 -0
  193. package/dist/adapters/zhihu/comment.d.ts +9 -0
  194. package/dist/adapters/zhihu/comment.d.ts.map +1 -0
  195. package/dist/adapters/zhihu/comment.js +149 -0
  196. package/dist/adapters/zhihu/comment.js.map +1 -0
  197. package/dist/adapters/zhihu/recommend.d.ts +36 -0
  198. package/dist/adapters/zhihu/recommend.d.ts.map +1 -0
  199. package/dist/adapters/zhihu/recommend.js +151 -0
  200. package/dist/adapters/zhihu/recommend.js.map +1 -0
  201. package/dist/browser/bridge.d.ts.map +1 -1
  202. package/dist/browser/bridge.js +14 -3
  203. package/dist/browser/bridge.js.map +1 -1
  204. package/dist/browser/daemon-client.d.ts +6 -0
  205. package/dist/browser/daemon-client.d.ts.map +1 -1
  206. package/dist/browser/daemon-client.js +75 -15
  207. package/dist/browser/daemon-client.js.map +1 -1
  208. package/dist/browser/daemon.js +39 -15
  209. package/dist/browser/daemon.js.map +1 -1
  210. package/dist/browser/protocol.d.ts +1 -0
  211. package/dist/browser/protocol.d.ts.map +1 -1
  212. package/dist/browser/protocol.js +1 -0
  213. package/dist/browser/protocol.js.map +1 -1
  214. package/dist/cli.d.ts.map +1 -1
  215. package/dist/cli.js +6 -0
  216. package/dist/cli.js.map +1 -1
  217. package/dist/commands/approvals.d.ts.map +1 -1
  218. package/dist/commands/approvals.js +1 -37
  219. package/dist/commands/approvals.js.map +1 -1
  220. package/dist/commands/browser/index.d.ts.map +1 -1
  221. package/dist/commands/browser/index.js +7 -2
  222. package/dist/commands/browser/index.js.map +1 -1
  223. package/dist/commands/daemon.d.ts.map +1 -1
  224. package/dist/commands/daemon.js +7 -3
  225. package/dist/commands/daemon.js.map +1 -1
  226. package/dist/commands/dispatch.d.ts.map +1 -1
  227. package/dist/commands/dispatch.js +27 -3
  228. package/dist/commands/dispatch.js.map +1 -1
  229. package/dist/commands/patent-doctor.d.ts +48 -0
  230. package/dist/commands/patent-doctor.d.ts.map +1 -0
  231. package/dist/commands/patent-doctor.js +109 -0
  232. package/dist/commands/patent-doctor.js.map +1 -0
  233. package/dist/commands/patent.d.ts +78 -0
  234. package/dist/commands/patent.d.ts.map +1 -0
  235. package/dist/commands/patent.js +919 -0
  236. package/dist/commands/patent.js.map +1 -0
  237. package/dist/commands/social.d.ts +19 -0
  238. package/dist/commands/social.d.ts.map +1 -0
  239. package/dist/commands/social.js +236 -0
  240. package/dist/commands/social.js.map +1 -0
  241. package/dist/core/registry.d.ts +1 -1
  242. package/dist/core/registry.d.ts.map +1 -1
  243. package/dist/core/registry.js +11 -2
  244. package/dist/core/registry.js.map +1 -1
  245. package/dist/discovery/loader.d.ts.map +1 -1
  246. package/dist/discovery/loader.js +4 -0
  247. package/dist/discovery/loader.js.map +1 -1
  248. package/dist/engine/approval-presenter.d.ts +10 -0
  249. package/dist/engine/approval-presenter.d.ts.map +1 -0
  250. package/dist/engine/approval-presenter.js +45 -0
  251. package/dist/engine/approval-presenter.js.map +1 -0
  252. package/dist/engine/approval-store.d.ts +4 -0
  253. package/dist/engine/approval-store.d.ts.map +1 -1
  254. package/dist/engine/approval-store.js +85 -11
  255. package/dist/engine/approval-store.js.map +1 -1
  256. package/dist/engine/auth/oauth2-cc.d.ts +67 -0
  257. package/dist/engine/auth/oauth2-cc.d.ts.map +1 -0
  258. package/dist/engine/auth/oauth2-cc.js +120 -0
  259. package/dist/engine/auth/oauth2-cc.js.map +1 -0
  260. package/dist/engine/cookies.d.ts +10 -0
  261. package/dist/engine/cookies.d.ts.map +1 -1
  262. package/dist/engine/cookies.js +64 -0
  263. package/dist/engine/cookies.js.map +1 -1
  264. package/dist/engine/download.d.ts +5 -0
  265. package/dist/engine/download.d.ts.map +1 -1
  266. package/dist/engine/download.js +11 -4
  267. package/dist/engine/download.js.map +1 -1
  268. package/dist/engine/executor.d.ts +1 -0
  269. package/dist/engine/executor.d.ts.map +1 -1
  270. package/dist/engine/executor.js +25 -0
  271. package/dist/engine/executor.js.map +1 -1
  272. package/dist/engine/framework.d.ts +5 -5
  273. package/dist/engine/framework.js +5 -5
  274. package/dist/engine/harden.d.ts +1 -1
  275. package/dist/engine/harden.js +1 -1
  276. package/dist/engine/kernel/stages.d.ts.map +1 -1
  277. package/dist/engine/kernel/stages.js +2 -1
  278. package/dist/engine/kernel/stages.js.map +1 -1
  279. package/dist/engine/normalizer/patent-envelope.d.ts +61 -0
  280. package/dist/engine/normalizer/patent-envelope.d.ts.map +1 -0
  281. package/dist/engine/normalizer/patent-envelope.js +132 -0
  282. package/dist/engine/normalizer/patent-envelope.js.map +1 -0
  283. package/dist/engine/research.d.ts +5 -7
  284. package/dist/engine/research.d.ts.map +1 -1
  285. package/dist/engine/research.js +6 -9
  286. package/dist/engine/research.js.map +1 -1
  287. package/dist/engine/steps/browser-helpers.d.ts +2 -2
  288. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  289. package/dist/engine/steps/browser-helpers.js +39 -16
  290. package/dist/engine/steps/browser-helpers.js.map +1 -1
  291. package/dist/engine/steps/download.d.ts +1 -0
  292. package/dist/engine/steps/download.d.ts.map +1 -1
  293. package/dist/engine/steps/download.js +3 -1
  294. package/dist/engine/steps/download.js.map +1 -1
  295. package/dist/engine/steps/index.d.ts +2 -0
  296. package/dist/engine/steps/index.d.ts.map +1 -1
  297. package/dist/engine/steps/index.js +2 -0
  298. package/dist/engine/steps/index.js.map +1 -1
  299. package/dist/engine/steps/oauth2-token.d.ts +41 -0
  300. package/dist/engine/steps/oauth2-token.d.ts.map +1 -0
  301. package/dist/engine/steps/oauth2-token.js +115 -0
  302. package/dist/engine/steps/oauth2-token.js.map +1 -0
  303. package/dist/engine/steps/select-xml.d.ts +34 -0
  304. package/dist/engine/steps/select-xml.d.ts.map +1 -0
  305. package/dist/engine/steps/select-xml.js +222 -0
  306. package/dist/engine/steps/select-xml.js.map +1 -0
  307. package/dist/engine/template.d.ts.map +1 -1
  308. package/dist/engine/template.js +7 -0
  309. package/dist/engine/template.js.map +1 -1
  310. package/dist/engine/transport/mcp-browser.d.ts +128 -0
  311. package/dist/engine/transport/mcp-browser.d.ts.map +1 -0
  312. package/dist/engine/transport/mcp-browser.js +120 -0
  313. package/dist/engine/transport/mcp-browser.js.map +1 -0
  314. package/dist/fast-path/handlers/approvals.d.ts +11 -0
  315. package/dist/fast-path/handlers/approvals.d.ts.map +1 -0
  316. package/dist/fast-path/handlers/approvals.js +136 -0
  317. package/dist/fast-path/handlers/approvals.js.map +1 -0
  318. package/dist/fast-path/manifest.d.ts +1 -0
  319. package/dist/fast-path/manifest.d.ts.map +1 -1
  320. package/dist/fast-path/manifest.js.map +1 -1
  321. package/dist/fast-path.d.ts.map +1 -1
  322. package/dist/fast-path.js +3 -0
  323. package/dist/fast-path.js.map +1 -1
  324. package/dist/index.d.ts +23 -0
  325. package/dist/index.d.ts.map +1 -0
  326. package/dist/index.js +38 -0
  327. package/dist/index.js.map +1 -0
  328. package/dist/manifest-compact.txt +3 -3
  329. package/dist/manifest-search.json +1 -1
  330. package/dist/manifest.json +2239 -176
  331. package/dist/output/auth-guidance.d.ts +14 -0
  332. package/dist/output/auth-guidance.d.ts.map +1 -0
  333. package/dist/output/auth-guidance.js +50 -0
  334. package/dist/output/auth-guidance.js.map +1 -0
  335. package/dist/output/error-map.d.ts +1 -1
  336. package/dist/output/error-map.d.ts.map +1 -1
  337. package/dist/output/error-map.js +28 -4
  338. package/dist/output/error-map.js.map +1 -1
  339. package/dist/output/next-actions.d.ts.map +1 -1
  340. package/dist/output/next-actions.js +19 -3
  341. package/dist/output/next-actions.js.map +1 -1
  342. package/dist/registry.d.ts +18 -1
  343. package/dist/registry.d.ts.map +1 -1
  344. package/dist/registry.js +5 -0
  345. package/dist/registry.js.map +1 -1
  346. package/dist/social/browser-errors.d.ts +13 -0
  347. package/dist/social/browser-errors.d.ts.map +1 -0
  348. package/dist/social/browser-errors.js +36 -0
  349. package/dist/social/browser-errors.js.map +1 -0
  350. package/dist/social/capabilities.d.ts +29 -0
  351. package/dist/social/capabilities.d.ts.map +1 -0
  352. package/dist/social/capabilities.js +448 -0
  353. package/dist/social/capabilities.js.map +1 -0
  354. package/dist/social/comments.d.ts +26 -0
  355. package/dist/social/comments.d.ts.map +1 -0
  356. package/dist/social/comments.js +97 -0
  357. package/dist/social/comments.js.map +1 -0
  358. package/dist/social/video-text.d.ts +27 -0
  359. package/dist/social/video-text.d.ts.map +1 -0
  360. package/dist/social/video-text.js +140 -0
  361. package/dist/social/video-text.js.map +1 -0
  362. package/dist/types/patent.d.ts +160 -0
  363. package/dist/types/patent.d.ts.map +1 -0
  364. package/dist/types/patent.js +16 -0
  365. package/dist/types/patent.js.map +1 -0
  366. package/dist/types.d.ts +12 -0
  367. package/dist/types.d.ts.map +1 -1
  368. package/dist/types.js.map +1 -1
  369. package/package.json +9 -4
  370. package/server.json +3 -3
  371. package/skills/unicli/SKILL.md +1 -1
  372. package/skills/unicli-claude-code/SKILL.md +1 -1
  373. package/skills/unicli-hermes/SKILL.md +1 -1
  374. package/src/adapters/bilibili/comments-tree.test.ts +41 -0
  375. package/src/adapters/bilibili/comments.ts +78 -4
  376. package/src/adapters/bilibili/compat.ts +5 -2
  377. package/src/adapters/bilibili/download.ts +7 -4
  378. package/src/adapters/bilibili/wbi.ts +6 -3
  379. package/src/adapters/brave/search.yaml +53 -0
  380. package/src/adapters/cipo/_shared.ts +98 -0
  381. package/src/adapters/cipo/get.ts +188 -0
  382. package/src/adapters/cipo/legal-status.ts +148 -0
  383. package/src/adapters/cipo/search.ts +195 -0
  384. package/src/adapters/cnipa/_shared.ts +138 -0
  385. package/src/adapters/cnipa/get.ts +199 -0
  386. package/src/adapters/cnipa/legal-status.ts +162 -0
  387. package/src/adapters/cnipa/search.ts +229 -0
  388. package/src/adapters/dpma/get.yaml +67 -0
  389. package/src/adapters/dpma/search.yaml +77 -0
  390. package/src/adapters/duckduckgo/search.yaml +54 -0
  391. package/src/adapters/duckduckgo/suggest.yaml +52 -0
  392. package/src/adapters/epo/family.yaml +69 -0
  393. package/src/adapters/epo/get.yaml +74 -0
  394. package/src/adapters/epo/legal-status.yaml +63 -0
  395. package/src/adapters/epo/search.yaml +84 -0
  396. package/src/adapters/espacenet/_shared.ts +98 -0
  397. package/src/adapters/espacenet/family.ts +161 -0
  398. package/src/adapters/espacenet/get.ts +185 -0
  399. package/src/adapters/espacenet/legal-status.ts +151 -0
  400. package/src/adapters/espacenet/search.ts +229 -0
  401. package/src/adapters/facebook/subtitles.ts +44 -0
  402. package/src/adapters/fips/_shared.ts +109 -0
  403. package/src/adapters/fips/get.ts +186 -0
  404. package/src/adapters/fips/search.ts +195 -0
  405. package/src/adapters/freepatentsonline-web/_shared.ts +273 -0
  406. package/src/adapters/freepatentsonline-web/get.ts +144 -0
  407. package/src/adapters/freepatentsonline-web/search.ts +170 -0
  408. package/src/adapters/google-patents-bq/prior-art.yaml +80 -0
  409. package/src/adapters/google-patents-bq/search.yaml +97 -0
  410. package/src/adapters/google-patents-web/_shared.ts +242 -0
  411. package/src/adapters/google-patents-web/get.ts +224 -0
  412. package/src/adapters/google-patents-web/search.ts +196 -0
  413. package/src/adapters/inpi-br/_shared.ts +98 -0
  414. package/src/adapters/inpi-br/get.ts +193 -0
  415. package/src/adapters/inpi-br/search.ts +206 -0
  416. package/src/adapters/inpi-fr/get.yaml +62 -0
  417. package/src/adapters/inpi-fr/search.yaml +74 -0
  418. package/src/adapters/instagram/subtitles.ts +44 -0
  419. package/src/adapters/ipaustralia/get.yaml +67 -0
  420. package/src/adapters/ipaustralia/search.yaml +74 -0
  421. package/src/adapters/jpo/get.yaml +63 -0
  422. package/src/adapters/jpo/search.yaml +76 -0
  423. package/src/adapters/kipris/get.yaml +69 -0
  424. package/src/adapters/kipris/legal-status.yaml +58 -0
  425. package/src/adapters/kipris/search.yaml +79 -0
  426. package/src/adapters/lens/get.yaml +64 -0
  427. package/src/adapters/lens/search.yaml +82 -0
  428. package/src/adapters/mastodon/statuses.test.ts +82 -0
  429. package/src/adapters/mastodon/statuses.ts +208 -0
  430. package/src/adapters/patsnap/get.yaml +65 -0
  431. package/src/adapters/patsnap/search.yaml +77 -0
  432. package/src/adapters/pqai/prior-art.yaml +59 -0
  433. package/src/adapters/pqai/search.yaml +60 -0
  434. package/src/adapters/reddit/comments-tree.test.ts +79 -0
  435. package/src/adapters/reddit/comments.ts +159 -0
  436. package/src/adapters/threads/post.test.ts +64 -0
  437. package/src/adapters/threads/post.ts +366 -0
  438. package/src/adapters/threads/user.yaml +73 -0
  439. package/src/adapters/tiktok/subtitles.ts +44 -0
  440. package/src/adapters/twitter/accept.ts +5 -2
  441. package/src/adapters/twitter/browser-fallback.ts +138 -0
  442. package/src/adapters/twitter/browser-state.ts +74 -0
  443. package/src/adapters/twitter/client.ts +51 -21
  444. package/src/adapters/twitter/reply-dm.ts +5 -2
  445. package/src/adapters/twitter/reply.ts +1 -0
  446. package/src/adapters/twitter/search.ts +12 -38
  447. package/src/adapters/twitter/thread.test.ts +43 -0
  448. package/src/adapters/twitter/thread.ts +44 -2
  449. package/src/adapters/twitter/trending.ts +14 -95
  450. package/src/adapters/ukipo/info.yaml +43 -0
  451. package/src/adapters/uspto/get.yaml +67 -0
  452. package/src/adapters/uspto/legal-status.yaml +58 -0
  453. package/src/adapters/uspto/search.yaml +88 -0
  454. package/src/adapters/wipo-patentscope/info.yaml +43 -0
  455. package/src/adapters/xiaohongshu/browser-state.ts +95 -0
  456. package/src/adapters/xiaohongshu/comments.ts +29 -6
  457. package/src/adapters/xiaohongshu/download.ts +60 -11
  458. package/src/adapters/xiaohongshu/search.ts +18 -6
  459. package/src/adapters/xiaohongshu/trending.ts +112 -0
  460. package/src/adapters/yahoo/search.yaml +52 -0
  461. package/src/adapters/youtube/comments-microformat.test.ts +35 -0
  462. package/src/adapters/youtube/comments-tree.test.ts +74 -0
  463. package/src/adapters/youtube/comments.ts +166 -12
  464. package/src/adapters/youtube/subtitles.ts +44 -0
  465. package/src/adapters/yt-dlp/subtitles.ts +43 -0
  466. package/src/adapters/zhihu/answer-detail.test.ts +83 -0
  467. package/src/adapters/zhihu/answer-detail.ts +275 -0
  468. package/src/adapters/zhihu/comment-tree.test.ts +57 -0
  469. package/src/adapters/zhihu/comment.ts +186 -0
  470. package/src/adapters/zhihu/recommend.test.ts +65 -0
  471. package/src/adapters/zhihu/recommend.ts +207 -0
@@ -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
@@ -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