@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,118 @@
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
+ import { cli, Strategy } from "../../registry.js";
17
+ import { TransportError } from "../../engine/transport/mcp-browser.js";
18
+ import { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
19
+ const ADAPTER_PATH = "src/adapters/espacenet/family.ts";
20
+ const FAMILY_EXTRACTOR = `(() => {
21
+ const rows = Array.from(
22
+ document.querySelectorAll('[data-test="family-row"], .familyRow, tr.family-member')
23
+ ).map((el) => {
24
+ const text = (sel) => {
25
+ const node = el.querySelector(sel);
26
+ return node ? (node.textContent || '').trim() : '';
27
+ };
28
+ return {
29
+ publication_number: text('[data-test="publication-number"], .publicationNumber'),
30
+ jurisdiction: text('[data-test="country"], .country'),
31
+ publication_date: text('[data-test="publication-date"], .publicationDate'),
32
+ };
33
+ });
34
+ return { rows };
35
+ })()`;
36
+ function familyUrlFor(pubNo) {
37
+ return `https://worldwide.espacenet.com/patent/search/family/${encodeURIComponent(pubNo)}`;
38
+ }
39
+ export async function runEspacenetFamily(kwargs) {
40
+ const pubNo = String(kwargs.publication_number ?? "").trim();
41
+ if (pubNo.length === 0) {
42
+ return [
43
+ {
44
+ envelope: espacenetEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "espacenet family requires a non-empty publication_number"),
45
+ },
46
+ ];
47
+ }
48
+ const url = familyUrlFor(pubNo);
49
+ let extract;
50
+ try {
51
+ const result = await espacenetNavigateAndExtract(url, FAMILY_EXTRACTOR);
52
+ if (!result.data) {
53
+ return [
54
+ {
55
+ envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet family evaluate returned no data"),
56
+ },
57
+ ];
58
+ }
59
+ extract = result.data;
60
+ }
61
+ catch (err) {
62
+ if (err instanceof TransportError) {
63
+ return [
64
+ {
65
+ envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
66
+ },
67
+ ];
68
+ }
69
+ throw err;
70
+ }
71
+ if (extract.rows.length === 0) {
72
+ return [
73
+ {
74
+ envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet found no family members for "${pubNo}"`, ["epo"]),
75
+ },
76
+ ];
77
+ }
78
+ return extract.rows
79
+ .filter((row) => row.publication_number)
80
+ .map((row) => ({
81
+ publication_number: row.publication_number,
82
+ jurisdiction: row.jurisdiction || row.publication_number.slice(0, 2).toUpperCase(),
83
+ relationship: "simple_family",
84
+ publication_date: row.publication_date || undefined,
85
+ source_adapter: "espacenet",
86
+ }));
87
+ }
88
+ cli({
89
+ site: "espacenet",
90
+ name: "family",
91
+ description: "Espacenet DOCDB simple-family lookup (browser)",
92
+ domain: "worldwide.espacenet.com",
93
+ strategy: Strategy.PUBLIC,
94
+ adapter_path: ADAPTER_PATH,
95
+ args: [
96
+ {
97
+ name: "publication_number",
98
+ type: "str",
99
+ required: true,
100
+ positional: true,
101
+ description: "ST.16 publication number",
102
+ },
103
+ ],
104
+ columns: [
105
+ "publication_number",
106
+ "jurisdiction",
107
+ "relationship",
108
+ "publication_date",
109
+ ],
110
+ capabilities: [
111
+ "mcp-browser.navigate",
112
+ "mcp-browser.evaluate",
113
+ "patent.family",
114
+ ],
115
+ minimum_capability: "mcp-browser.evaluate",
116
+ func: async (_page, kwargs) => runEspacenetFamily(kwargs),
117
+ });
118
+ //# sourceMappingURL=family.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/family.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::get
3
+ * @does Browser-driven retrieval of a single Espacenet publication detail page; extracts bibliographic fields and emits a PatentRecord.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.get)
6
+ * @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED with MCP_BUS_MISSING
7
+ * @invariants output is a single PatentRecord row when upstream answers; never returns a stub
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 path)
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ export declare function runEspacenetGet(kwargs: {
17
+ publication_number: string;
18
+ }): Promise<unknown[]>;
19
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAmDH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA6FrB"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::get
3
+ * @does Browser-driven retrieval of a single Espacenet publication detail page; extracts bibliographic fields and emits a PatentRecord.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.get)
6
+ * @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED with MCP_BUS_MISSING
7
+ * @invariants output is a single PatentRecord row when upstream answers; never returns a stub
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 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 { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
19
+ import { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
20
+ const ADAPTER_PATH = "src/adapters/espacenet/get.ts";
21
+ const DETAIL_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-test="publication-number"], .publicationNumber'),
28
+ application_number: text('[data-test="application-number"], .applicationNumber'),
29
+ title: text('[data-test="title"], h1.title, .invention-title'),
30
+ abstract: text('[data-test="abstract"], .abstract'),
31
+ applicant: text('[data-test="applicant"], .applicantName'),
32
+ inventor: text('[data-test="inventor"], .inventorName'),
33
+ publication_date: text('[data-test="publication-date"], .publicationDate'),
34
+ filing_date: text('[data-test="filing-date"], .filingDate'),
35
+ source_url: location.href,
36
+ html_marker: document.body && document.body.innerText
37
+ ? document.body.innerText.slice(0, 200)
38
+ : '',
39
+ };
40
+ })()`;
41
+ function detailUrlFor(pubNo) {
42
+ return `https://worldwide.espacenet.com/patent/search/publication/${encodeURIComponent(pubNo)}`;
43
+ }
44
+ export async function runEspacenetGet(kwargs) {
45
+ const pubNo = String(kwargs.publication_number ?? "").trim();
46
+ if (pubNo.length === 0) {
47
+ return [
48
+ {
49
+ envelope: espacenetEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "espacenet get requires a non-empty publication_number"),
50
+ },
51
+ ];
52
+ }
53
+ const url = detailUrlFor(pubNo);
54
+ let detail;
55
+ try {
56
+ const result = await espacenetNavigateAndExtract(url, DETAIL_EXTRACTOR);
57
+ if (!result.data) {
58
+ return [
59
+ {
60
+ envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet detail evaluate returned no data"),
61
+ },
62
+ ];
63
+ }
64
+ detail = result.data;
65
+ }
66
+ catch (err) {
67
+ if (err instanceof TransportError) {
68
+ return [
69
+ {
70
+ envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
71
+ },
72
+ ];
73
+ }
74
+ throw err;
75
+ }
76
+ const fieldCount = [detail.publication_number, detail.title].filter(Boolean).length;
77
+ if (fieldCount === 0) {
78
+ return [
79
+ {
80
+ envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet detail page for "${pubNo}" yielded no bibliographic fields`, ["epo", "uspto"]),
81
+ },
82
+ ];
83
+ }
84
+ const canonicalPubNo = detail.publication_number || pubNo;
85
+ try {
86
+ return [
87
+ assemblePatentRecord({
88
+ publication_number: canonicalPubNo,
89
+ application_number: detail.application_number || undefined,
90
+ title: detail.title || undefined,
91
+ abstract: detail.abstract || undefined,
92
+ assignees: detail.applicant ? [{ name: detail.applicant }] : undefined,
93
+ inventors: detail.inventor ? [{ name: detail.inventor }] : undefined,
94
+ publication_date: detail.publication_date || undefined,
95
+ filing_date: detail.filing_date || undefined,
96
+ source_adapter: "espacenet",
97
+ source_url: detail.source_url || url,
98
+ }),
99
+ ];
100
+ }
101
+ catch {
102
+ return [
103
+ {
104
+ envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `espacenet detail page for "${pubNo}" did not yield a valid publication_number`, ["epo"]),
105
+ },
106
+ ];
107
+ }
108
+ }
109
+ cli({
110
+ site: "espacenet",
111
+ name: "get",
112
+ description: "Retrieve a single Espacenet publication detail (browser, no key)",
113
+ domain: "worldwide.espacenet.com",
114
+ strategy: Strategy.PUBLIC,
115
+ adapter_path: ADAPTER_PATH,
116
+ args: [
117
+ {
118
+ name: "publication_number",
119
+ type: "str",
120
+ required: true,
121
+ positional: true,
122
+ description: "ST.16 publication number (e.g. EP4123456A1)",
123
+ },
124
+ ],
125
+ columns: ["publication_number", "title", "publication_date", "source_url"],
126
+ capabilities: ["mcp-browser.navigate", "mcp-browser.evaluate", "patent.get"],
127
+ minimum_capability: "mcp-browser.evaluate",
128
+ func: async (_page, kwargs) => runEspacenetGet(kwargs),
129
+ });
130
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::legal-status
3
+ * @does Browser-driven Espacenet legal-status lookup — INPADOC events table on the legal-status tab.
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.legal-status)
6
+ * @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED (MCP_BUS_MISSING)
7
+ * @invariants output row carries legal_status as the most-recent INPADOC event verbatim
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/espacenet/search.test.ts (shared transport-error path)
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ export declare function runEspacenetLegalStatus(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/espacenet/legal-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoCH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuErB"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::legal-status
3
+ * @does Browser-driven Espacenet legal-status lookup — INPADOC events table on the legal-status tab.
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.legal-status)
6
+ * @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED (MCP_BUS_MISSING)
7
+ * @invariants output row carries legal_status as the most-recent INPADOC event verbatim
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/espacenet/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 { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
19
+ const ADAPTER_PATH = "src/adapters/espacenet/legal-status.ts";
20
+ const EXTRACTOR = `(() => {
21
+ const text = (sel) => {
22
+ const node = document.querySelector(sel);
23
+ return node ? (node.textContent || '').trim() : '';
24
+ };
25
+ return {
26
+ publication_number: text('[data-test="publication-number"], .publicationNumber'),
27
+ legal_status: text('[data-test="legal-status"] tr:first-child td:nth-child(2), .legalStatus__currentStatus'),
28
+ status_date: text('[data-test="legal-status"] tr:first-child td:nth-child(1), .legalStatus__currentDate'),
29
+ source_url: location.href,
30
+ };
31
+ })()`;
32
+ function legalUrlFor(pubNo) {
33
+ return `https://worldwide.espacenet.com/patent/search/legal-status/${encodeURIComponent(pubNo)}`;
34
+ }
35
+ export async function runEspacenetLegalStatus(kwargs) {
36
+ const pubNo = String(kwargs.publication_number ?? "").trim();
37
+ if (pubNo.length === 0) {
38
+ return [
39
+ {
40
+ envelope: espacenetEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "espacenet legal-status requires a non-empty publication_number"),
41
+ },
42
+ ];
43
+ }
44
+ const url = legalUrlFor(pubNo);
45
+ let detail;
46
+ try {
47
+ const result = await espacenetNavigateAndExtract(url, EXTRACTOR);
48
+ if (!result.data) {
49
+ return [
50
+ {
51
+ envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet legal-status evaluate returned no data"),
52
+ },
53
+ ];
54
+ }
55
+ detail = result.data;
56
+ }
57
+ catch (err) {
58
+ if (err instanceof TransportError) {
59
+ return [
60
+ {
61
+ envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
62
+ },
63
+ ];
64
+ }
65
+ throw err;
66
+ }
67
+ if (!detail.legal_status) {
68
+ return [
69
+ {
70
+ envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet returned no legal_status for "${pubNo}"`, ["epo"]),
71
+ },
72
+ ];
73
+ }
74
+ return [
75
+ {
76
+ publication_number: detail.publication_number || pubNo,
77
+ legal_status: detail.legal_status,
78
+ status_date: detail.status_date,
79
+ source_adapter: "espacenet",
80
+ source_url: detail.source_url || url,
81
+ retrieved_at: new Date().toISOString(),
82
+ },
83
+ ];
84
+ }
85
+ cli({
86
+ site: "espacenet",
87
+ name: "legal-status",
88
+ description: "Espacenet INPADOC legal-status lookup (browser)",
89
+ domain: "worldwide.espacenet.com",
90
+ strategy: Strategy.PUBLIC,
91
+ adapter_path: ADAPTER_PATH,
92
+ args: [
93
+ {
94
+ name: "publication_number",
95
+ type: "str",
96
+ required: true,
97
+ positional: true,
98
+ description: "ST.16 publication number",
99
+ },
100
+ ],
101
+ columns: ["publication_number", "legal_status", "status_date", "source_url"],
102
+ capabilities: [
103
+ "mcp-browser.navigate",
104
+ "mcp-browser.evaluate",
105
+ "patent.legal-status",
106
+ ],
107
+ minimum_capability: "mcp-browser.evaluate",
108
+ func: async (_page, kwargs) => runEspacenetLegalStatus(kwargs),
109
+ });
110
+ //# sourceMappingURL=legal-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-status.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/legal-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::search
3
+ * @does Browser-driven Espacenet front-end search at worldwide.espacenet.com/patent/search — the EPO public no-key fallback for global patent search; complements the keyed EPO OPS adapter at src/adapters/epo/*.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.search)
6
+ * @breaks PATENT_API_DEPRECATED with MCP_BUS_MISSING when no outbound MCP transport; PATENT_NOT_FOUND on empty result; PATENT_BROWSER_CAPTCHA on EPO's anti-bot challenge
7
+ * @invariants output rows are canonical PatentRecord; source_adapter='espacenet'
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/espacenet/search.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only (distinct from EPO OPS which is keyed REST)
15
+ */
16
+ export declare function runEspacenetSearch(kwargs: {
17
+ query: string;
18
+ limit?: number;
19
+ }): Promise<unknown[]>;
20
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA+DH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkHrB"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @owner src::adapters::espacenet::search
3
+ * @does Browser-driven Espacenet front-end search at worldwide.espacenet.com/patent/search — the EPO public no-key fallback for global patent search; complements the keyed EPO OPS adapter at src/adapters/epo/*.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.search)
6
+ * @breaks PATENT_API_DEPRECATED with MCP_BUS_MISSING when no outbound MCP transport; PATENT_NOT_FOUND on empty result; PATENT_BROWSER_CAPTCHA on EPO's anti-bot challenge
7
+ * @invariants output rows are canonical PatentRecord; source_adapter='espacenet'
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/espacenet/search.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only (distinct from EPO OPS which is keyed REST)
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 { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
20
+ const ADAPTER_PATH = "src/adapters/espacenet/search.ts";
21
+ const ESPACENET_SEARCH_URL = "https://worldwide.espacenet.com/patent/search";
22
+ const EXTRACTOR = `(() => {
23
+ const rows = Array.from(
24
+ document.querySelectorAll('article.publication, .item--ezfpdY, [data-test="result"]')
25
+ ).map((el) => {
26
+ const text = (sel) => {
27
+ const node = el.querySelector(sel);
28
+ return node ? (node.textContent || '').trim() : '';
29
+ };
30
+ const linkEl = el.querySelector('a[href*="/patent/search/family"], a[href*="/patent/search/publication"], a[href]');
31
+ return {
32
+ publication_number: text('[data-test="publication-number"], .publicationNumber, .publication__id'),
33
+ title: text('[data-test="title"], .publicationTitle, h3'),
34
+ applicant: text('[data-test="applicant"], .applicantName'),
35
+ inventor: text('[data-test="inventor"], .inventorName'),
36
+ publication_date: text('[data-test="publication-date"], .publicationDate, .publication__date'),
37
+ source_url: linkEl ? linkEl.href : '',
38
+ };
39
+ });
40
+ const html_marker = (document.body && document.body.innerText
41
+ ? document.body.innerText.slice(0, 200)
42
+ : '');
43
+ return { rows, html_marker };
44
+ })()`;
45
+ function buildSearchUrl(query, limit) {
46
+ // Espacenet smart-search query — `q` is the CQL-lite syntax accepted by
47
+ // the front-end search box. Limit is enforced client-side; Espacenet
48
+ // paginates server-side via the `?p=` page parameter.
49
+ const params = new URLSearchParams({ q: query });
50
+ // Espacenet shows ~25 rows per page; cap requested limit at one page so
51
+ // the browser does not paginate by default.
52
+ if (limit > 25)
53
+ params.set("ps", String(Math.min(100, limit)));
54
+ return `${ESPACENET_SEARCH_URL}?${params.toString()}`;
55
+ }
56
+ export async function runEspacenetSearch(kwargs) {
57
+ const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
58
+ ? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
59
+ : 25;
60
+ const query = String(kwargs.query ?? "").trim();
61
+ if (query.length === 0) {
62
+ return [
63
+ {
64
+ envelope: espacenetEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "espacenet search requires a non-empty query"),
65
+ },
66
+ ];
67
+ }
68
+ const url = buildSearchUrl(query, limit);
69
+ let extract;
70
+ try {
71
+ const result = await espacenetNavigateAndExtract(url, EXTRACTOR);
72
+ if (!result.data) {
73
+ return [
74
+ {
75
+ envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet evaluate returned no data; selector schema likely changed"),
76
+ },
77
+ ];
78
+ }
79
+ extract = result.data;
80
+ }
81
+ catch (err) {
82
+ if (err instanceof TransportError) {
83
+ return [
84
+ {
85
+ envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
86
+ },
87
+ ];
88
+ }
89
+ throw err;
90
+ }
91
+ if (extract.rows.length === 0) {
92
+ const marker = (extract.html_marker ?? "").toLowerCase();
93
+ if (marker.includes("captcha") ||
94
+ marker.includes("challenge") ||
95
+ marker.includes("are you a human")) {
96
+ return [
97
+ {
98
+ envelope: espacenetEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "espacenet served an anti-bot challenge; solve it in the open browser tab and re-run", ["epo"]),
99
+ },
100
+ ];
101
+ }
102
+ return [
103
+ {
104
+ envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet returned no rows for query "${query}"`, ["epo", "uspto"]),
105
+ },
106
+ ];
107
+ }
108
+ const out = [];
109
+ for (const row of extract.rows.slice(0, limit)) {
110
+ if (!row.publication_number)
111
+ continue;
112
+ try {
113
+ out.push(assemblePatentRecord({
114
+ publication_number: row.publication_number,
115
+ title: row.title || undefined,
116
+ assignees: row.applicant ? [{ name: row.applicant }] : undefined,
117
+ inventors: row.inventor ? [{ name: row.inventor }] : undefined,
118
+ publication_date: row.publication_date || undefined,
119
+ source_adapter: "espacenet",
120
+ source_url: row.source_url || url,
121
+ }));
122
+ }
123
+ catch {
124
+ // Skip rows that fail canonicalization rather than synthesize.
125
+ }
126
+ }
127
+ if (out.length === 0) {
128
+ out.push({
129
+ envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "espacenet returned rows but none carried a valid publication_number", ["epo"]),
130
+ });
131
+ }
132
+ return out;
133
+ }
134
+ cli({
135
+ site: "espacenet",
136
+ name: "search",
137
+ description: "Search Espacenet (EPO public no-key front end) for worldwide patents",
138
+ domain: "worldwide.espacenet.com",
139
+ strategy: Strategy.PUBLIC,
140
+ adapter_path: ADAPTER_PATH,
141
+ args: [
142
+ {
143
+ name: "query",
144
+ type: "str",
145
+ required: true,
146
+ positional: true,
147
+ description: "Espacenet smart-search query (CQL-lite syntax)",
148
+ },
149
+ {
150
+ name: "limit",
151
+ type: "int",
152
+ default: 25,
153
+ description: "Max results (1-100)",
154
+ },
155
+ ],
156
+ columns: ["publication_number", "title", "publication_date", "source_url"],
157
+ capabilities: [
158
+ "mcp-browser.navigate",
159
+ "mcp-browser.evaluate",
160
+ "patent.search",
161
+ ],
162
+ minimum_capability: "mcp-browser.evaluate",
163
+ func: async (_page, kwargs) => runEspacenetSearch(kwargs),
164
+ });
165
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @owner Facebook subtitle adapter.
3
+ * @does Extracts LLM-readable subtitle text from public Facebook video URLs.
4
+ * @needs `yt-dlp` on PATH and an accessible video subtitle track.
5
+ * @feeds Social video evidence gathering without browser-security bypasses.
6
+ * @breaks Facebook or yt-dlp extractor changes can alter subtitle availability.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=subtitles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitles.d.ts","sourceRoot":"","sources":["../../../src/adapters/facebook/subtitles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}