@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,149 @@
1
+ /**
2
+ * @owner src::adapters::cnipa::get
3
+ * @does Browser-driven retrieval of a single CNIPA patent document by publication number; loads the detail page through the mcp-browser transport and extracts the bibliographic fields into a PatentRecord.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.get)
6
+ * @breaks emits PATENT_INVALID_NUMBER when input is empty or fails canonicalization; emits PATENT_NOT_FOUND when the detail page returns no fields; PATENT_BROWSER_CAPTCHA when the page is captcha-gated; PATENT_API_DEPRECATED with MCP_BUS_MISSING context when no outbound MCP transport is registered
7
+ * @invariants output is a single PatentRecord row when the upstream answers; never falls back to a stub record
8
+ * @side-effects controls the user's Chrome via MCP
9
+ * @perf single navigate + one evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/cnipa/search.test.ts (transport-error path) — get-specific tests deferred to integration
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ import { cli, Strategy } from "../../registry.js";
17
+ import { TransportError } from "../../engine/transport/mcp-browser.js";
18
+ import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
19
+ import { cnipaEnvelope, looksLikeCaptcha, navigateAndExtract, transportErrorToEnvelope, } from "./_shared.js";
20
+ const ADAPTER_PATH = "src/adapters/cnipa/get.ts";
21
+ const CNIPA_DETAIL_URL = "https://pss-system.cponline.cnipa.gov.cn/conventionalDetail";
22
+ const DETAIL_EXTRACTOR = `(() => {
23
+ const text = (sel) => {
24
+ const node = document.querySelector(sel);
25
+ return node ? (node.textContent || '').trim() : '';
26
+ };
27
+ return {
28
+ publication_number: text('[data-field="pubNo"], .publication-number'),
29
+ application_number: text('[data-field="appNo"], .application-number'),
30
+ title: text('[data-field="title"], h1.title, .invention-title'),
31
+ abstract: text('[data-field="abstract"], .abstract'),
32
+ applicant: text('[data-field="applicant"], .applicant'),
33
+ inventor: text('[data-field="inventor"], .inventor'),
34
+ publication_date: text('[data-field="pubDate"], .publication-date'),
35
+ filing_date: text('[data-field="appDate"], .filing-date'),
36
+ grant_date: text('[data-field="grantDate"], .grant-date'),
37
+ legal_status: text('[data-field="legalStatus"], .legal-status'),
38
+ source_url: location.href,
39
+ html_marker: document.body && document.body.innerText
40
+ ? document.body.innerText.slice(0, 200)
41
+ : '',
42
+ };
43
+ })()`;
44
+ export async function runCnipaGet(kwargs) {
45
+ const pubNo = String(kwargs.publication_number ?? "").trim();
46
+ if (pubNo.length === 0) {
47
+ return [
48
+ {
49
+ envelope: cnipaEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "cnipa get requires a non-empty publication_number"),
50
+ },
51
+ ];
52
+ }
53
+ const url = `${CNIPA_DETAIL_URL}?pubNo=${encodeURIComponent(pubNo)}`;
54
+ let detail;
55
+ try {
56
+ const result = await navigateAndExtract(url, DETAIL_EXTRACTOR);
57
+ if (!result.data) {
58
+ return [
59
+ {
60
+ envelope: cnipaEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "mcp-browser evaluate returned no data; check selector schema in src/adapters/cnipa/get.ts"),
61
+ },
62
+ ];
63
+ }
64
+ detail = result.data;
65
+ }
66
+ catch (err) {
67
+ if (err instanceof TransportError) {
68
+ return [
69
+ {
70
+ envelope: transportErrorToEnvelope(err, ADAPTER_PATH, "navigate"),
71
+ },
72
+ ];
73
+ }
74
+ throw err;
75
+ }
76
+ // Captcha heuristic: detail page returned without any of the expected
77
+ // bibliographic fields → almost certainly captcha-gated.
78
+ const fieldCount = [
79
+ detail.publication_number,
80
+ detail.title,
81
+ detail.application_number,
82
+ detail.publication_date,
83
+ ].filter(Boolean).length;
84
+ if (looksLikeCaptcha(fieldCount, detail.html_marker)) {
85
+ return [
86
+ {
87
+ envelope: cnipaEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "CNIPA detail page returned no bibliographic fields; solve the 验证码 in the open browser tab and re-run", ["espacenet"]),
88
+ },
89
+ ];
90
+ }
91
+ const canonicalPubNo = detail.publication_number || pubNo;
92
+ try {
93
+ return [
94
+ assemblePatentRecord({
95
+ publication_number: canonicalPubNo,
96
+ application_number: detail.application_number || undefined,
97
+ title: detail.title || undefined,
98
+ abstract: detail.abstract || undefined,
99
+ assignees: detail.applicant
100
+ ? [{ name: detail.applicant, country: "CN" }]
101
+ : undefined,
102
+ inventors: detail.inventor
103
+ ? [{ name: detail.inventor, country: "CN" }]
104
+ : undefined,
105
+ publication_date: detail.publication_date || undefined,
106
+ filing_date: detail.filing_date || undefined,
107
+ grant_date: detail.grant_date || undefined,
108
+ legal_status: detail.legal_status || undefined,
109
+ source_adapter: "cnipa",
110
+ source_url: detail.source_url || url,
111
+ }),
112
+ ];
113
+ }
114
+ catch {
115
+ return [
116
+ {
117
+ envelope: cnipaEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `cnipa detail page did not yield a valid publication_number for "${pubNo}"`, ["espacenet"]),
118
+ },
119
+ ];
120
+ }
121
+ }
122
+ cli({
123
+ site: "cnipa",
124
+ name: "get",
125
+ description: "Retrieve a single CNIPA patent document by publication number",
126
+ domain: "pss-system.cponline.cnipa.gov.cn",
127
+ strategy: Strategy.PUBLIC,
128
+ adapter_path: ADAPTER_PATH,
129
+ args: [
130
+ {
131
+ name: "publication_number",
132
+ type: "str",
133
+ required: true,
134
+ positional: true,
135
+ description: "ST.16 publication number (e.g. CN114123456A)",
136
+ },
137
+ ],
138
+ columns: [
139
+ "publication_number",
140
+ "title",
141
+ "publication_date",
142
+ "legal_status",
143
+ "source_url",
144
+ ],
145
+ capabilities: ["mcp-browser.navigate", "mcp-browser.evaluate", "patent.get"],
146
+ minimum_capability: "mcp-browser.evaluate",
147
+ func: async (_page, kwargs) => runCnipaGet(kwargs),
148
+ });
149
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/cnipa/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @owner src::adapters::cnipa::legal-status
3
+ * @does Browser-driven CNIPA legal-status lookup — scrapes the prosecution timeline + grant status from the 公众查询 detail page; emits structured envelopes for captcha / not-found / MCP-bus gaps.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.legal-status)
6
+ * @breaks emits PATENT_INVALID_NUMBER, PATENT_BROWSER_CAPTCHA, PATENT_API_DEPRECATED (with MCP_BUS_MISSING context); never synthesizes a status
7
+ * @invariants output row carries `legal_status` exactly as scraped; no normalization beyond trim
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/cnipa/search.test.ts (shared transport-error path)
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ export declare function runCnipaLegalStatus(kwargs: {
17
+ publication_number: string;
18
+ }): Promise<unknown[]>;
19
+ //# sourceMappingURL=legal-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-status.d.ts","sourceRoot":"","sources":["../../../src/adapters/cnipa/legal-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsCH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAgFrB"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @owner src::adapters::cnipa::legal-status
3
+ * @does Browser-driven CNIPA legal-status lookup — scrapes the prosecution timeline + grant status from the 公众查询 detail page; emits structured envelopes for captcha / not-found / MCP-bus gaps.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.legal-status)
6
+ * @breaks emits PATENT_INVALID_NUMBER, PATENT_BROWSER_CAPTCHA, PATENT_API_DEPRECATED (with MCP_BUS_MISSING context); never synthesizes a status
7
+ * @invariants output row carries `legal_status` exactly as scraped; no normalization beyond trim
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/cnipa/search.test.ts (shared transport-error path)
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ import { cli, Strategy } from "../../registry.js";
17
+ import { TransportError } from "../../engine/transport/mcp-browser.js";
18
+ import { cnipaEnvelope, looksLikeCaptcha, navigateAndExtract, transportErrorToEnvelope, } from "./_shared.js";
19
+ const ADAPTER_PATH = "src/adapters/cnipa/legal-status.ts";
20
+ const CNIPA_LEGAL_URL = "https://pss-system.cponline.cnipa.gov.cn/legalStatus";
21
+ const EXTRACTOR = `(() => {
22
+ const text = (sel) => {
23
+ const node = document.querySelector(sel);
24
+ return node ? (node.textContent || '').trim() : '';
25
+ };
26
+ return {
27
+ publication_number: text('[data-field="pubNo"], .publication-number'),
28
+ legal_status: text('[data-field="legalStatus"], .legal-status'),
29
+ status_date: text('[data-field="statusDate"], .status-date'),
30
+ source_url: location.href,
31
+ html_marker: document.body && document.body.innerText
32
+ ? document.body.innerText.slice(0, 200)
33
+ : '',
34
+ };
35
+ })()`;
36
+ export async function runCnipaLegalStatus(kwargs) {
37
+ const pubNo = String(kwargs.publication_number ?? "").trim();
38
+ if (pubNo.length === 0) {
39
+ return [
40
+ {
41
+ envelope: cnipaEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "cnipa legal-status requires a non-empty publication_number"),
42
+ },
43
+ ];
44
+ }
45
+ const url = `${CNIPA_LEGAL_URL}?pubNo=${encodeURIComponent(pubNo)}`;
46
+ let detail;
47
+ try {
48
+ const result = await navigateAndExtract(url, EXTRACTOR);
49
+ if (!result.data) {
50
+ return [
51
+ {
52
+ envelope: cnipaEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "mcp-browser evaluate returned no data"),
53
+ },
54
+ ];
55
+ }
56
+ detail = result.data;
57
+ }
58
+ catch (err) {
59
+ if (err instanceof TransportError) {
60
+ return [
61
+ {
62
+ envelope: transportErrorToEnvelope(err, ADAPTER_PATH, "navigate"),
63
+ },
64
+ ];
65
+ }
66
+ throw err;
67
+ }
68
+ const fieldCount = [detail.publication_number, detail.legal_status].filter(Boolean).length;
69
+ if (looksLikeCaptcha(fieldCount, detail.html_marker)) {
70
+ return [
71
+ {
72
+ envelope: cnipaEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "CNIPA legal-status page returned no fields; solve the 验证码 and re-run", ["espacenet"]),
73
+ },
74
+ ];
75
+ }
76
+ if (!detail.legal_status) {
77
+ return [
78
+ {
79
+ envelope: cnipaEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `cnipa returned no legal_status for "${pubNo}"`, ["espacenet"]),
80
+ },
81
+ ];
82
+ }
83
+ return [
84
+ {
85
+ publication_number: detail.publication_number || pubNo,
86
+ legal_status: detail.legal_status,
87
+ status_date: detail.status_date,
88
+ source_adapter: "cnipa",
89
+ source_url: detail.source_url || url,
90
+ retrieved_at: new Date().toISOString(),
91
+ },
92
+ ];
93
+ }
94
+ cli({
95
+ site: "cnipa",
96
+ name: "legal-status",
97
+ description: "CNIPA legal-status / prosecution timeline lookup (browser)",
98
+ domain: "pss-system.cponline.cnipa.gov.cn",
99
+ strategy: Strategy.PUBLIC,
100
+ adapter_path: ADAPTER_PATH,
101
+ args: [
102
+ {
103
+ name: "publication_number",
104
+ type: "str",
105
+ required: true,
106
+ positional: true,
107
+ description: "ST.16 publication number",
108
+ },
109
+ ],
110
+ columns: ["publication_number", "legal_status", "status_date", "source_url"],
111
+ capabilities: [
112
+ "mcp-browser.navigate",
113
+ "mcp-browser.evaluate",
114
+ "patent.legal-status",
115
+ ],
116
+ minimum_capability: "mcp-browser.evaluate",
117
+ func: async (_page, kwargs) => runCnipaLegalStatus(kwargs),
118
+ });
119
+ //# sourceMappingURL=legal-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-status.js","sourceRoot":"","sources":["../../../src/adapters/cnipa/legal-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @owner src::adapters::cnipa::search
3
+ * @does Browser-driven search of CNIPA 公众查询 system at pss-system.cponline.cnipa.gov.cn — the only programmatic route for CN patents (CNIPA has no open API today). Drives a real Chrome session via the mcp-browser transport, extracts result rows, normalizes through assemblePatentRecord.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (meta-command discovers via patent.search capability tag)
6
+ * @breaks emits PATENT_BROWSER_CAPTCHA envelope when zero rows return from a navigation that did not error (CNIPA almost always shows a captcha gate); emits PATENT_API_DEPRECATED with MCP_BUS_MISSING context when no outbound MCP transport is registered
7
+ * @invariants result rows always include source_adapter='cnipa'; publication_number canonicalized via assemblePatentRecord; never returns a synthetic row when extraction fails
8
+ * @side-effects controls the user's Chrome browser via MCP; reads no env vars
9
+ * @perf single navigation + one evaluate; ~2-5 s wall-clock when active
10
+ * @concurrency safe — every call opens a fresh tab via mcpBrowserNavigate
11
+ * @test tests/unit/adapters/cnipa/search.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only — no upstream API; gated on a live mcp-browser transport
15
+ */
16
+ export declare function runCnipaSearch(kwargs: {
17
+ query: string;
18
+ limit?: number;
19
+ offset?: number;
20
+ }): Promise<unknown[]>;
21
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/cnipa/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsEH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkGrB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * @owner src::adapters::cnipa::search
3
+ * @does Browser-driven search of CNIPA 公众查询 system at pss-system.cponline.cnipa.gov.cn — the only programmatic route for CN patents (CNIPA has no open API today). Drives a real Chrome session via the mcp-browser transport, extracts result rows, normalizes through assemblePatentRecord.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (meta-command discovers via patent.search capability tag)
6
+ * @breaks emits PATENT_BROWSER_CAPTCHA envelope when zero rows return from a navigation that did not error (CNIPA almost always shows a captcha gate); emits PATENT_API_DEPRECATED with MCP_BUS_MISSING context when no outbound MCP transport is registered
7
+ * @invariants result rows always include source_adapter='cnipa'; publication_number canonicalized via assemblePatentRecord; never returns a synthetic row when extraction fails
8
+ * @side-effects controls the user's Chrome browser via MCP; reads no env vars
9
+ * @perf single navigation + one evaluate; ~2-5 s wall-clock when active
10
+ * @concurrency safe — every call opens a fresh tab via mcpBrowserNavigate
11
+ * @test tests/unit/adapters/cnipa/search.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only — no upstream API; gated on a live mcp-browser transport
15
+ */
16
+ import { cli, Strategy } from "../../registry.js";
17
+ import { TransportError } from "../../engine/transport/mcp-browser.js";
18
+ import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
19
+ import { cnipaEnvelope, looksLikeCaptcha, navigateAndExtract, transportErrorToEnvelope, } from "./_shared.js";
20
+ const ADAPTER_PATH = "src/adapters/cnipa/search.ts";
21
+ const CNIPA_SEARCH_URL = "https://pss-system.cponline.cnipa.gov.cn/conventionalSearch";
22
+ /**
23
+ * DOM extractor executed inside the page via mcp-browser. The selectors are
24
+ * the documented ones for the CNIPA 公众查询 result table; when CNIPA
25
+ * changes the markup an agent reads the failure envelope and updates the
26
+ * selector here (rule 02 self-repair).
27
+ */
28
+ const EXTRACTOR = `(() => {
29
+ const rows = Array.from(
30
+ document.querySelectorAll('table.result-table tbody tr, .result-list .result-item')
31
+ ).map((el) => {
32
+ const text = (sel) => {
33
+ const node = el.querySelector(sel);
34
+ return node ? (node.textContent || '').trim() : '';
35
+ };
36
+ return {
37
+ publication_number: text('.publication-number, [data-field="pubNo"]'),
38
+ application_number: text('.application-number, [data-field="appNo"]'),
39
+ title: text('.title, [data-field="title"]'),
40
+ applicant: text('.applicant, [data-field="applicant"]'),
41
+ publication_date: text('.publication-date, [data-field="pubDate"]'),
42
+ filing_date: text('.filing-date, [data-field="appDate"]'),
43
+ source_url: (el.querySelector('a[href]') || {}).href || '',
44
+ };
45
+ });
46
+ const html_marker = (document.body && document.body.innerText
47
+ ? document.body.innerText.slice(0, 200)
48
+ : '');
49
+ return { rows, html_marker };
50
+ })()`;
51
+ function buildSearchUrl(query, limit, offset) {
52
+ const params = new URLSearchParams({
53
+ q: query,
54
+ pageSize: String(limit),
55
+ pageNo: String(Math.floor(offset / Math.max(1, limit)) + 1),
56
+ });
57
+ return `${CNIPA_SEARCH_URL}?${params.toString()}`;
58
+ }
59
+ export async function runCnipaSearch(kwargs) {
60
+ const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
61
+ ? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
62
+ : 25;
63
+ const offset = typeof kwargs.offset === "number" && Number.isFinite(kwargs.offset)
64
+ ? Math.max(0, Math.floor(kwargs.offset))
65
+ : 0;
66
+ const query = String(kwargs.query ?? "").trim();
67
+ if (query.length === 0) {
68
+ return [
69
+ {
70
+ envelope: cnipaEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "cnipa search requires a non-empty query string"),
71
+ },
72
+ ];
73
+ }
74
+ const url = buildSearchUrl(query, limit, offset);
75
+ let extract;
76
+ try {
77
+ const result = await navigateAndExtract(url, EXTRACTOR);
78
+ if (!result.data) {
79
+ return [
80
+ {
81
+ envelope: cnipaEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "mcp-browser evaluate returned no data; check selector schema in src/adapters/cnipa/search.ts"),
82
+ },
83
+ ];
84
+ }
85
+ extract = result.data;
86
+ }
87
+ catch (err) {
88
+ if (err instanceof TransportError) {
89
+ return [
90
+ {
91
+ envelope: transportErrorToEnvelope(err, ADAPTER_PATH, "navigate"),
92
+ },
93
+ ];
94
+ }
95
+ throw err;
96
+ }
97
+ if (looksLikeCaptcha(extract.rows.length, extract.html_marker)) {
98
+ return [
99
+ {
100
+ envelope: cnipaEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "CNIPA returned no rows for a non-empty query; solve the 验证码 in the open browser tab and re-run", ["espacenet", "lens"]),
101
+ },
102
+ ];
103
+ }
104
+ const out = [];
105
+ for (const row of extract.rows.slice(0, limit)) {
106
+ if (!row.publication_number)
107
+ continue;
108
+ try {
109
+ out.push(assemblePatentRecord({
110
+ publication_number: row.publication_number,
111
+ application_number: row.application_number || undefined,
112
+ title: row.title || undefined,
113
+ assignees: row.applicant
114
+ ? [{ name: row.applicant, country: "CN" }]
115
+ : undefined,
116
+ publication_date: row.publication_date || undefined,
117
+ filing_date: row.filing_date || undefined,
118
+ source_adapter: "cnipa",
119
+ source_url: row.source_url || url,
120
+ }));
121
+ }
122
+ catch {
123
+ // Skip malformed row rather than synthesize — rule 02.
124
+ }
125
+ }
126
+ if (out.length === 0) {
127
+ out.push({
128
+ envelope: cnipaEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "cnipa returned rows but none carried a publication_number; report as schema drift", ["espacenet"]),
129
+ });
130
+ }
131
+ return out;
132
+ }
133
+ cli({
134
+ site: "cnipa",
135
+ name: "search",
136
+ description: "Search CNIPA via the public 公众查询 browser interface (no API)",
137
+ domain: "pss-system.cponline.cnipa.gov.cn",
138
+ strategy: Strategy.PUBLIC,
139
+ adapter_path: ADAPTER_PATH,
140
+ args: [
141
+ {
142
+ name: "query",
143
+ type: "str",
144
+ required: true,
145
+ positional: true,
146
+ description: "Free-text query — matched against title/abstract/claims",
147
+ },
148
+ {
149
+ name: "limit",
150
+ type: "int",
151
+ default: 25,
152
+ description: "Maximum results to return (1-100)",
153
+ },
154
+ {
155
+ name: "offset",
156
+ type: "int",
157
+ default: 0,
158
+ description: "Result offset for pagination",
159
+ },
160
+ ],
161
+ columns: ["publication_number", "title", "publication_date", "source_url"],
162
+ capabilities: [
163
+ "mcp-browser.navigate",
164
+ "mcp-browser.evaluate",
165
+ "patent.search",
166
+ ],
167
+ minimum_capability: "mcp-browser.evaluate",
168
+ func: async (_page, kwargs) => runCnipaSearch(kwargs),
169
+ });
170
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/cnipa/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::_shared
3
+ * @does Shared helpers for the Espacenet browser-driven adapter — distinct from the EPO OPS HTTP adapter (which lives at src/adapters/epo/*). Espacenet is the no-key public front end; EPO OPS is the keyed REST API.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
5
+ * @feeds src/adapters/espacenet/*.ts
6
+ * @breaks none — pure helpers
7
+ * @invariants every transport gap surfaces as a PatentEnvelope row with adapter_path stamped
8
+ * @side-effects none
9
+ * @perf n/a
10
+ * @concurrency safe
11
+ * @test covered transitively
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ import { TransportError, type McpBrowserResult } from "../../engine/transport/mcp-browser.js";
17
+ import type { PatentEnvelope, PatentErrorCode } from "../../types/patent.js";
18
+ export declare function espacenetEnvelope(code: PatentErrorCode, adapter_path: string, step: string, suggestion: string, alternatives?: string[]): PatentEnvelope;
19
+ export declare function transportErrorToEspacenetEnvelope(err: TransportError, adapter_path: string, step: string): PatentEnvelope;
20
+ export declare function espacenetNavigateAndExtract<T>(url: string, expression: string): Promise<McpBrowserResult<T>>;
21
+ //# sourceMappingURL=_shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EAId,KAAK,gBAAgB,EACtB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7E,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,GAAE,MAAM,EAAO,GAC1B,cAAc,CAShB;AAED,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,cAAc,CAoBhB;AAED,wBAAsB,2BAA2B,CAAC,CAAC,EACjD,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAyB9B"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::_shared
3
+ * @does Shared helpers for the Espacenet browser-driven adapter — distinct from the EPO OPS HTTP adapter (which lives at src/adapters/epo/*). Espacenet is the no-key public front end; EPO OPS is the keyed REST API.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
5
+ * @feeds src/adapters/espacenet/*.ts
6
+ * @breaks none — pure helpers
7
+ * @invariants every transport gap surfaces as a PatentEnvelope row with adapter_path stamped
8
+ * @side-effects none
9
+ * @perf n/a
10
+ * @concurrency safe
11
+ * @test covered transitively
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ import { TransportError, initMcpBrowserTransport, mcpBrowserEvaluate, mcpBrowserNavigate, } from "../../engine/transport/mcp-browser.js";
17
+ import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
18
+ export function espacenetEnvelope(code, adapter_path, step, suggestion, alternatives = []) {
19
+ return buildPatentEnvelope({
20
+ code,
21
+ adapter_path,
22
+ step,
23
+ suggestion,
24
+ alternatives,
25
+ retryable: false,
26
+ });
27
+ }
28
+ export function transportErrorToEspacenetEnvelope(err, adapter_path, step) {
29
+ if (err.code === "MCP_BUS_MISSING") {
30
+ return buildPatentEnvelope({
31
+ code: "PATENT_API_DEPRECATED",
32
+ adapter_path,
33
+ step,
34
+ suggestion: "engine has no outbound MCP transport wired into the bus today; install an McpResolver before invoking espacenet browser adapter, or use EPO OPS (src/adapters/epo/*) which exposes a keyed API",
35
+ alternatives: ["epo", "uspto", "lens"],
36
+ retryable: false,
37
+ });
38
+ }
39
+ return buildPatentEnvelope({
40
+ code: "PATENT_API_DEPRECATED",
41
+ adapter_path,
42
+ step,
43
+ suggestion: `mcp-browser transport error (${err.code}): ${err.message}`,
44
+ alternatives: ["epo"],
45
+ retryable: false,
46
+ });
47
+ }
48
+ export async function espacenetNavigateAndExtract(url, expression) {
49
+ const init = await initMcpBrowserTransport();
50
+ if (init.active_server === "none") {
51
+ const code = init.reason === "bus-missing" ? "MCP_BUS_MISSING" : "MCP_NO_SERVER";
52
+ throw new TransportError(code, `mcp-browser unavailable (${init.reason})`);
53
+ }
54
+ const navResult = await mcpBrowserNavigate({ url });
55
+ if (!navResult.ok) {
56
+ throw new TransportError(navResult.code ?? "MCP_NAVIGATE_FAILED", navResult.message ?? "navigate did not succeed");
57
+ }
58
+ const evalResult = await mcpBrowserEvaluate({
59
+ expression,
60
+ tab: navResult.tab,
61
+ });
62
+ if (!evalResult.ok) {
63
+ throw new TransportError(evalResult.code ?? "MCP_EVALUATE_FAILED", evalResult.message ?? "evaluate did not succeed");
64
+ }
65
+ return evalResult;
66
+ }
67
+ //# sourceMappingURL=_shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAGjF,MAAM,UAAU,iBAAiB,CAC/B,IAAqB,EACrB,YAAoB,EACpB,IAAY,EACZ,UAAkB,EAClB,eAAyB,EAAE;IAE3B,OAAO,mBAAmB,CAAC;QACzB,IAAI;QACJ,YAAY;QACZ,IAAI;QACJ,UAAU;QACV,YAAY;QACZ,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,GAAmB,EACnB,YAAoB,EACpB,IAAY;IAEZ,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACnC,OAAO,mBAAmB,CAAC;YACzB,IAAI,EAAE,uBAAuB;YAC7B,YAAY;YACZ,IAAI;YACJ,UAAU,EACR,gMAAgM;YAClM,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;YACtC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,mBAAmB,CAAC;QACzB,IAAI,EAAE,uBAAuB;QAC7B,YAAY;QACZ,IAAI;QACJ,UAAU,EAAE,gCAAgC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE;QACvE,YAAY,EAAE,CAAC,KAAK,CAAC;QACrB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,GAAW,EACX,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,uBAAuB,EAAE,CAAC;IAC7C,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;QACtE,MAAM,IAAI,cAAc,CAAC,IAAI,EAAE,4BAA4B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,cAAc,CACtB,SAAS,CAAC,IAAI,IAAI,qBAAqB,EACvC,SAAS,CAAC,OAAO,IAAI,0BAA0B,CAChD,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAI;QAC7C,UAAU;QACV,GAAG,EAAE,SAAS,CAAC,GAAG;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,cAAc,CACtB,UAAU,CAAC,IAAI,IAAI,qBAAqB,EACxC,UAAU,CAAC,OAAO,IAAI,0BAA0B,CACjD,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::family
3
+ * @does Browser-driven Espacenet family lookup — DOCDB simple-family rows visible on the family tab of the detail page; alternative to EPO OPS keyed family broker.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.family)
6
+ * @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED (MCP_BUS_MISSING)
7
+ * @invariants output rows carry publication_number + jurisdiction + relationship per PatentFamilyMember shape
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/espacenet/search.test.ts (transport-error shared path)
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ export declare function runEspacenetFamily(kwargs: {
17
+ publication_number: string;
18
+ }): Promise<unknown[]>;
19
+ //# sourceMappingURL=family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/family.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAyCH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuErB"}