@zenalexa/unicli 0.220.1 → 0.221.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (586) hide show
  1. package/AGENTS.md +35 -13
  2. package/README.md +18 -16
  3. package/README.zh-CN.md +18 -16
  4. package/dist/adapters/acl-anthology/papers.d.ts +16 -0
  5. package/dist/adapters/acl-anthology/papers.d.ts.map +1 -0
  6. package/dist/adapters/acl-anthology/papers.js +135 -0
  7. package/dist/adapters/acl-anthology/papers.js.map +1 -0
  8. package/dist/adapters/arxiv/papers.js +2 -0
  9. package/dist/adapters/arxiv/papers.js.map +1 -1
  10. package/dist/adapters/baidu-scholar/search.js +5 -0
  11. package/dist/adapters/baidu-scholar/search.js.map +1 -1
  12. package/dist/adapters/bilibili/comments.js +66 -4
  13. package/dist/adapters/bilibili/comments.js.map +1 -1
  14. package/dist/adapters/bilibili/compat.js +2 -2
  15. package/dist/adapters/bilibili/compat.js.map +1 -1
  16. package/dist/adapters/bilibili/download.js +4 -4
  17. package/dist/adapters/bilibili/download.js.map +1 -1
  18. package/dist/adapters/bilibili/wbi.d.ts.map +1 -1
  19. package/dist/adapters/bilibili/wbi.js +3 -3
  20. package/dist/adapters/bilibili/wbi.js.map +1 -1
  21. package/dist/adapters/cipo/_shared.d.ts +21 -0
  22. package/dist/adapters/cipo/_shared.d.ts.map +1 -0
  23. package/dist/adapters/cipo/_shared.js +67 -0
  24. package/dist/adapters/cipo/_shared.js.map +1 -0
  25. package/dist/adapters/cipo/get.d.ts +19 -0
  26. package/dist/adapters/cipo/get.d.ts.map +1 -0
  27. package/dist/adapters/cipo/get.js +140 -0
  28. package/dist/adapters/cipo/get.js.map +1 -0
  29. package/dist/adapters/cipo/legal-status.d.ts +19 -0
  30. package/dist/adapters/cipo/legal-status.d.ts.map +1 -0
  31. package/dist/adapters/cipo/legal-status.js +111 -0
  32. package/dist/adapters/cipo/legal-status.js.map +1 -0
  33. package/dist/adapters/cipo/search.d.ts +20 -0
  34. package/dist/adapters/cipo/search.d.ts.map +1 -0
  35. package/dist/adapters/cipo/search.js +148 -0
  36. package/dist/adapters/cipo/search.js.map +1 -0
  37. package/dist/adapters/cnipa/_shared.d.ts +47 -0
  38. package/dist/adapters/cnipa/_shared.d.ts.map +1 -0
  39. package/dist/adapters/cnipa/_shared.js +97 -0
  40. package/dist/adapters/cnipa/_shared.js.map +1 -0
  41. package/dist/adapters/cnipa/get.d.ts +19 -0
  42. package/dist/adapters/cnipa/get.d.ts.map +1 -0
  43. package/dist/adapters/cnipa/get.js +149 -0
  44. package/dist/adapters/cnipa/get.js.map +1 -0
  45. package/dist/adapters/cnipa/legal-status.d.ts +19 -0
  46. package/dist/adapters/cnipa/legal-status.d.ts.map +1 -0
  47. package/dist/adapters/cnipa/legal-status.js +119 -0
  48. package/dist/adapters/cnipa/legal-status.js.map +1 -0
  49. package/dist/adapters/cnipa/search.d.ts +21 -0
  50. package/dist/adapters/cnipa/search.d.ts.map +1 -0
  51. package/dist/adapters/cnipa/search.js +170 -0
  52. package/dist/adapters/cnipa/search.js.map +1 -0
  53. package/dist/adapters/crossref/works.d.ts +42 -0
  54. package/dist/adapters/crossref/works.d.ts.map +1 -0
  55. package/dist/adapters/crossref/works.js +157 -0
  56. package/dist/adapters/crossref/works.js.map +1 -0
  57. package/dist/adapters/cvf/papers.d.ts +17 -0
  58. package/dist/adapters/cvf/papers.d.ts.map +1 -0
  59. package/dist/adapters/cvf/papers.js +124 -0
  60. package/dist/adapters/cvf/papers.js.map +1 -0
  61. package/dist/adapters/dblp/publications.js +4 -0
  62. package/dist/adapters/dblp/publications.js.map +1 -1
  63. package/dist/adapters/espacenet/_shared.d.ts +21 -0
  64. package/dist/adapters/espacenet/_shared.d.ts.map +1 -0
  65. package/dist/adapters/espacenet/_shared.js +67 -0
  66. package/dist/adapters/espacenet/_shared.js.map +1 -0
  67. package/dist/adapters/espacenet/family.d.ts +19 -0
  68. package/dist/adapters/espacenet/family.d.ts.map +1 -0
  69. package/dist/adapters/espacenet/family.js +118 -0
  70. package/dist/adapters/espacenet/family.js.map +1 -0
  71. package/dist/adapters/espacenet/get.d.ts +19 -0
  72. package/dist/adapters/espacenet/get.d.ts.map +1 -0
  73. package/dist/adapters/espacenet/get.js +130 -0
  74. package/dist/adapters/espacenet/get.js.map +1 -0
  75. package/dist/adapters/espacenet/legal-status.d.ts +19 -0
  76. package/dist/adapters/espacenet/legal-status.d.ts.map +1 -0
  77. package/dist/adapters/espacenet/legal-status.js +110 -0
  78. package/dist/adapters/espacenet/legal-status.js.map +1 -0
  79. package/dist/adapters/espacenet/search.d.ts +20 -0
  80. package/dist/adapters/espacenet/search.d.ts.map +1 -0
  81. package/dist/adapters/espacenet/search.js +165 -0
  82. package/dist/adapters/espacenet/search.js.map +1 -0
  83. package/dist/adapters/facebook/subtitles.d.ts +9 -0
  84. package/dist/adapters/facebook/subtitles.d.ts.map +1 -0
  85. package/dist/adapters/facebook/subtitles.js +42 -0
  86. package/dist/adapters/facebook/subtitles.js.map +1 -0
  87. package/dist/adapters/fips/_shared.d.ts +21 -0
  88. package/dist/adapters/fips/_shared.d.ts.map +1 -0
  89. package/dist/adapters/fips/_shared.js +77 -0
  90. package/dist/adapters/fips/_shared.js.map +1 -0
  91. package/dist/adapters/fips/get.d.ts +19 -0
  92. package/dist/adapters/fips/get.d.ts.map +1 -0
  93. package/dist/adapters/fips/get.js +139 -0
  94. package/dist/adapters/fips/get.js.map +1 -0
  95. package/dist/adapters/fips/search.d.ts +20 -0
  96. package/dist/adapters/fips/search.d.ts.map +1 -0
  97. package/dist/adapters/fips/search.js +148 -0
  98. package/dist/adapters/fips/search.js.map +1 -0
  99. package/dist/adapters/freepatentsonline-web/_shared.d.ts +72 -0
  100. package/dist/adapters/freepatentsonline-web/_shared.d.ts.map +1 -0
  101. package/dist/adapters/freepatentsonline-web/_shared.js +216 -0
  102. package/dist/adapters/freepatentsonline-web/_shared.js.map +1 -0
  103. package/dist/adapters/freepatentsonline-web/get.d.ts +21 -0
  104. package/dist/adapters/freepatentsonline-web/get.d.ts.map +1 -0
  105. package/dist/adapters/freepatentsonline-web/get.js +127 -0
  106. package/dist/adapters/freepatentsonline-web/get.js.map +1 -0
  107. package/dist/adapters/freepatentsonline-web/search.d.ts +22 -0
  108. package/dist/adapters/freepatentsonline-web/search.d.ts.map +1 -0
  109. package/dist/adapters/freepatentsonline-web/search.js +149 -0
  110. package/dist/adapters/freepatentsonline-web/search.js.map +1 -0
  111. package/dist/adapters/google-patents-web/_shared.d.ts +110 -0
  112. package/dist/adapters/google-patents-web/_shared.d.ts.map +1 -0
  113. package/dist/adapters/google-patents-web/_shared.js +164 -0
  114. package/dist/adapters/google-patents-web/_shared.js.map +1 -0
  115. package/dist/adapters/google-patents-web/get.d.ts +36 -0
  116. package/dist/adapters/google-patents-web/get.d.ts.map +1 -0
  117. package/dist/adapters/google-patents-web/get.js +187 -0
  118. package/dist/adapters/google-patents-web/get.js.map +1 -0
  119. package/dist/adapters/google-patents-web/search.d.ts +23 -0
  120. package/dist/adapters/google-patents-web/search.d.ts.map +1 -0
  121. package/dist/adapters/google-patents-web/search.js +169 -0
  122. package/dist/adapters/google-patents-web/search.js.map +1 -0
  123. package/dist/adapters/google-scholar/cite.js +1 -0
  124. package/dist/adapters/google-scholar/cite.js.map +1 -1
  125. package/dist/adapters/google-scholar/profile.js +5 -0
  126. package/dist/adapters/google-scholar/profile.js.map +1 -1
  127. package/dist/adapters/google-scholar/search.js +5 -0
  128. package/dist/adapters/google-scholar/search.js.map +1 -1
  129. package/dist/adapters/hf/paper.js +1 -0
  130. package/dist/adapters/hf/paper.js.map +1 -1
  131. package/dist/adapters/inpi-br/_shared.d.ts +21 -0
  132. package/dist/adapters/inpi-br/_shared.d.ts.map +1 -0
  133. package/dist/adapters/inpi-br/_shared.js +67 -0
  134. package/dist/adapters/inpi-br/_shared.js.map +1 -0
  135. package/dist/adapters/inpi-br/get.d.ts +19 -0
  136. package/dist/adapters/inpi-br/get.d.ts.map +1 -0
  137. package/dist/adapters/inpi-br/get.js +142 -0
  138. package/dist/adapters/inpi-br/get.js.map +1 -0
  139. package/dist/adapters/inpi-br/search.d.ts +20 -0
  140. package/dist/adapters/inpi-br/search.d.ts.map +1 -0
  141. package/dist/adapters/inpi-br/search.js +154 -0
  142. package/dist/adapters/inpi-br/search.js.map +1 -0
  143. package/dist/adapters/instagram/subtitles.d.ts +9 -0
  144. package/dist/adapters/instagram/subtitles.d.ts.map +1 -0
  145. package/dist/adapters/instagram/subtitles.js +42 -0
  146. package/dist/adapters/instagram/subtitles.js.map +1 -0
  147. package/dist/adapters/mastodon/statuses.d.ts +40 -0
  148. package/dist/adapters/mastodon/statuses.d.ts.map +1 -0
  149. package/dist/adapters/mastodon/statuses.js +153 -0
  150. package/dist/adapters/mastodon/statuses.js.map +1 -0
  151. package/dist/adapters/neurips/proceedings.d.ts +17 -0
  152. package/dist/adapters/neurips/proceedings.d.ts.map +1 -0
  153. package/dist/adapters/neurips/proceedings.js +112 -0
  154. package/dist/adapters/neurips/proceedings.js.map +1 -0
  155. package/dist/adapters/openalex/works.d.ts.map +1 -1
  156. package/dist/adapters/openalex/works.js +32 -0
  157. package/dist/adapters/openalex/works.js.map +1 -1
  158. package/dist/adapters/openreview/papers.js +5 -0
  159. package/dist/adapters/openreview/papers.js.map +1 -1
  160. package/dist/adapters/pmlr/proceedings.d.ts +35 -0
  161. package/dist/adapters/pmlr/proceedings.d.ts.map +1 -0
  162. package/dist/adapters/pmlr/proceedings.js +139 -0
  163. package/dist/adapters/pmlr/proceedings.js.map +1 -0
  164. package/dist/adapters/pubmed/articles.js +5 -0
  165. package/dist/adapters/pubmed/articles.js.map +1 -1
  166. package/dist/adapters/reddit/comments.d.ts +9 -0
  167. package/dist/adapters/reddit/comments.d.ts.map +1 -0
  168. package/dist/adapters/reddit/comments.js +124 -0
  169. package/dist/adapters/reddit/comments.js.map +1 -0
  170. package/dist/adapters/semantic-scholar/papers.d.ts +36 -0
  171. package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -0
  172. package/dist/adapters/semantic-scholar/papers.js +214 -0
  173. package/dist/adapters/semantic-scholar/papers.js.map +1 -0
  174. package/dist/adapters/threads/post.d.ts +32 -0
  175. package/dist/adapters/threads/post.d.ts.map +1 -0
  176. package/dist/adapters/threads/post.js +287 -0
  177. package/dist/adapters/threads/post.js.map +1 -0
  178. package/dist/adapters/tiktok/subtitles.d.ts +9 -0
  179. package/dist/adapters/tiktok/subtitles.d.ts.map +1 -0
  180. package/dist/adapters/tiktok/subtitles.js +42 -0
  181. package/dist/adapters/tiktok/subtitles.js.map +1 -0
  182. package/dist/adapters/twitter/accept.js +2 -2
  183. package/dist/adapters/twitter/accept.js.map +1 -1
  184. package/dist/adapters/twitter/browser-fallback.d.ts +26 -0
  185. package/dist/adapters/twitter/browser-fallback.d.ts.map +1 -0
  186. package/dist/adapters/twitter/browser-fallback.js +93 -0
  187. package/dist/adapters/twitter/browser-fallback.js.map +1 -0
  188. package/dist/adapters/twitter/browser-state.d.ts +11 -0
  189. package/dist/adapters/twitter/browser-state.d.ts.map +1 -0
  190. package/dist/adapters/twitter/browser-state.js +46 -0
  191. package/dist/adapters/twitter/browser-state.js.map +1 -0
  192. package/dist/adapters/twitter/client.d.ts.map +1 -1
  193. package/dist/adapters/twitter/client.js +36 -13
  194. package/dist/adapters/twitter/client.js.map +1 -1
  195. package/dist/adapters/twitter/reply-dm.js +2 -2
  196. package/dist/adapters/twitter/reply-dm.js.map +1 -1
  197. package/dist/adapters/twitter/reply.js +1 -0
  198. package/dist/adapters/twitter/reply.js.map +1 -1
  199. package/dist/adapters/twitter/search.js +11 -18
  200. package/dist/adapters/twitter/search.js.map +1 -1
  201. package/dist/adapters/twitter/thread.d.ts +14 -0
  202. package/dist/adapters/twitter/thread.d.ts.map +1 -1
  203. package/dist/adapters/twitter/thread.js +28 -2
  204. package/dist/adapters/twitter/thread.js.map +1 -1
  205. package/dist/adapters/twitter/trending.js +13 -59
  206. package/dist/adapters/twitter/trending.js.map +1 -1
  207. package/dist/adapters/unpaywall/works.d.ts +33 -0
  208. package/dist/adapters/unpaywall/works.d.ts.map +1 -0
  209. package/dist/adapters/unpaywall/works.js +101 -0
  210. package/dist/adapters/unpaywall/works.js.map +1 -0
  211. package/dist/adapters/xiaohongshu/browser-state.d.ts +19 -0
  212. package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -0
  213. package/dist/adapters/xiaohongshu/browser-state.js +67 -0
  214. package/dist/adapters/xiaohongshu/browser-state.js.map +1 -0
  215. package/dist/adapters/xiaohongshu/comments.js +28 -5
  216. package/dist/adapters/xiaohongshu/comments.js.map +1 -1
  217. package/dist/adapters/xiaohongshu/download.js +49 -11
  218. package/dist/adapters/xiaohongshu/download.js.map +1 -1
  219. package/dist/adapters/xiaohongshu/search.d.ts.map +1 -1
  220. package/dist/adapters/xiaohongshu/search.js +11 -5
  221. package/dist/adapters/xiaohongshu/search.js.map +1 -1
  222. package/dist/adapters/xiaohongshu/trending.d.ts +9 -0
  223. package/dist/adapters/xiaohongshu/trending.d.ts.map +1 -0
  224. package/dist/adapters/xiaohongshu/trending.js +94 -0
  225. package/dist/adapters/xiaohongshu/trending.js.map +1 -0
  226. package/dist/adapters/youtube/comments.d.ts +80 -0
  227. package/dist/adapters/youtube/comments.d.ts.map +1 -1
  228. package/dist/adapters/youtube/comments.js +108 -12
  229. package/dist/adapters/youtube/comments.js.map +1 -1
  230. package/dist/adapters/youtube/subtitles.d.ts +9 -0
  231. package/dist/adapters/youtube/subtitles.d.ts.map +1 -0
  232. package/dist/adapters/youtube/subtitles.js +42 -0
  233. package/dist/adapters/youtube/subtitles.js.map +1 -0
  234. package/dist/adapters/yt-dlp/subtitles.d.ts +9 -0
  235. package/dist/adapters/yt-dlp/subtitles.d.ts.map +1 -0
  236. package/dist/adapters/yt-dlp/subtitles.js +41 -0
  237. package/dist/adapters/yt-dlp/subtitles.js.map +1 -0
  238. package/dist/adapters/zhihu/answer-detail.d.ts +39 -0
  239. package/dist/adapters/zhihu/answer-detail.d.ts.map +1 -0
  240. package/dist/adapters/zhihu/answer-detail.js +204 -0
  241. package/dist/adapters/zhihu/answer-detail.js.map +1 -0
  242. package/dist/adapters/zhihu/comment.d.ts +9 -0
  243. package/dist/adapters/zhihu/comment.d.ts.map +1 -0
  244. package/dist/adapters/zhihu/comment.js +149 -0
  245. package/dist/adapters/zhihu/comment.js.map +1 -0
  246. package/dist/adapters/zhihu/recommend.d.ts +36 -0
  247. package/dist/adapters/zhihu/recommend.d.ts.map +1 -0
  248. package/dist/adapters/zhihu/recommend.js +151 -0
  249. package/dist/adapters/zhihu/recommend.js.map +1 -0
  250. package/dist/browser/bridge.d.ts.map +1 -1
  251. package/dist/browser/bridge.js +14 -3
  252. package/dist/browser/bridge.js.map +1 -1
  253. package/dist/browser/daemon-client.d.ts +6 -0
  254. package/dist/browser/daemon-client.d.ts.map +1 -1
  255. package/dist/browser/daemon-client.js +75 -15
  256. package/dist/browser/daemon-client.js.map +1 -1
  257. package/dist/browser/daemon.js +39 -15
  258. package/dist/browser/daemon.js.map +1 -1
  259. package/dist/browser/protocol.d.ts +1 -0
  260. package/dist/browser/protocol.d.ts.map +1 -1
  261. package/dist/browser/protocol.js +1 -0
  262. package/dist/browser/protocol.js.map +1 -1
  263. package/dist/cli.d.ts.map +1 -1
  264. package/dist/cli.js +21 -1
  265. package/dist/cli.js.map +1 -1
  266. package/dist/commands/approvals.d.ts.map +1 -1
  267. package/dist/commands/approvals.js +1 -37
  268. package/dist/commands/approvals.js.map +1 -1
  269. package/dist/commands/browser/index.d.ts.map +1 -1
  270. package/dist/commands/browser/index.js +7 -2
  271. package/dist/commands/browser/index.js.map +1 -1
  272. package/dist/commands/daemon.d.ts.map +1 -1
  273. package/dist/commands/daemon.js +7 -3
  274. package/dist/commands/daemon.js.map +1 -1
  275. package/dist/commands/dispatch.d.ts.map +1 -1
  276. package/dist/commands/dispatch.js +27 -3
  277. package/dist/commands/dispatch.js.map +1 -1
  278. package/dist/commands/do.d.ts +30 -0
  279. package/dist/commands/do.d.ts.map +1 -0
  280. package/dist/commands/do.js +248 -0
  281. package/dist/commands/do.js.map +1 -0
  282. package/dist/commands/extract.d.ts +34 -0
  283. package/dist/commands/extract.d.ts.map +1 -0
  284. package/dist/commands/extract.js +316 -0
  285. package/dist/commands/extract.js.map +1 -0
  286. package/dist/commands/patent-doctor.d.ts +48 -0
  287. package/dist/commands/patent-doctor.d.ts.map +1 -0
  288. package/dist/commands/patent-doctor.js +109 -0
  289. package/dist/commands/patent-doctor.js.map +1 -0
  290. package/dist/commands/patent.d.ts +78 -0
  291. package/dist/commands/patent.d.ts.map +1 -0
  292. package/dist/commands/patent.js +919 -0
  293. package/dist/commands/patent.js.map +1 -0
  294. package/dist/commands/scholar.d.ts +33 -0
  295. package/dist/commands/scholar.d.ts.map +1 -0
  296. package/dist/commands/scholar.js +494 -0
  297. package/dist/commands/scholar.js.map +1 -0
  298. package/dist/commands/search.d.ts.map +1 -1
  299. package/dist/commands/search.js +2 -5
  300. package/dist/commands/search.js.map +1 -1
  301. package/dist/commands/social.d.ts +19 -0
  302. package/dist/commands/social.d.ts.map +1 -0
  303. package/dist/commands/social.js +236 -0
  304. package/dist/commands/social.js.map +1 -0
  305. package/dist/core/registry.d.ts +1 -1
  306. package/dist/core/registry.d.ts.map +1 -1
  307. package/dist/core/registry.js +11 -2
  308. package/dist/core/registry.js.map +1 -1
  309. package/dist/discovery/aliases.d.ts +2 -2
  310. package/dist/discovery/aliases.d.ts.map +1 -1
  311. package/dist/discovery/aliases.js +182 -11
  312. package/dist/discovery/aliases.js.map +1 -1
  313. package/dist/discovery/intents.d.ts +10 -0
  314. package/dist/discovery/intents.d.ts.map +1 -0
  315. package/dist/discovery/intents.js +255 -0
  316. package/dist/discovery/intents.js.map +1 -0
  317. package/dist/discovery/loader.d.ts.map +1 -1
  318. package/dist/discovery/loader.js +4 -0
  319. package/dist/discovery/loader.js.map +1 -1
  320. package/dist/discovery/search.d.ts +4 -1
  321. package/dist/discovery/search.d.ts.map +1 -1
  322. package/dist/discovery/search.js +28 -140
  323. package/dist/discovery/search.js.map +1 -1
  324. package/dist/engine/approval-presenter.d.ts +10 -0
  325. package/dist/engine/approval-presenter.d.ts.map +1 -0
  326. package/dist/engine/approval-presenter.js +45 -0
  327. package/dist/engine/approval-presenter.js.map +1 -0
  328. package/dist/engine/approval-store.d.ts +4 -0
  329. package/dist/engine/approval-store.d.ts.map +1 -1
  330. package/dist/engine/approval-store.js +85 -11
  331. package/dist/engine/approval-store.js.map +1 -1
  332. package/dist/engine/auth/oauth2-cc.d.ts +67 -0
  333. package/dist/engine/auth/oauth2-cc.d.ts.map +1 -0
  334. package/dist/engine/auth/oauth2-cc.js +120 -0
  335. package/dist/engine/auth/oauth2-cc.js.map +1 -0
  336. package/dist/engine/cookies.d.ts +10 -0
  337. package/dist/engine/cookies.d.ts.map +1 -1
  338. package/dist/engine/cookies.js +64 -0
  339. package/dist/engine/cookies.js.map +1 -1
  340. package/dist/engine/download.d.ts +5 -0
  341. package/dist/engine/download.d.ts.map +1 -1
  342. package/dist/engine/download.js +11 -4
  343. package/dist/engine/download.js.map +1 -1
  344. package/dist/engine/executor.d.ts +1 -0
  345. package/dist/engine/executor.d.ts.map +1 -1
  346. package/dist/engine/executor.js +25 -0
  347. package/dist/engine/executor.js.map +1 -1
  348. package/dist/engine/framework.d.ts +5 -5
  349. package/dist/engine/framework.js +5 -5
  350. package/dist/engine/harden.d.ts +1 -1
  351. package/dist/engine/harden.js +1 -1
  352. package/dist/engine/kernel/stages.d.ts.map +1 -1
  353. package/dist/engine/kernel/stages.js +2 -1
  354. package/dist/engine/kernel/stages.js.map +1 -1
  355. package/dist/engine/normalizer/patent-envelope.d.ts +61 -0
  356. package/dist/engine/normalizer/patent-envelope.d.ts.map +1 -0
  357. package/dist/engine/normalizer/patent-envelope.js +132 -0
  358. package/dist/engine/normalizer/patent-envelope.js.map +1 -0
  359. package/dist/engine/research.d.ts +5 -7
  360. package/dist/engine/research.d.ts.map +1 -1
  361. package/dist/engine/research.js +6 -9
  362. package/dist/engine/research.js.map +1 -1
  363. package/dist/engine/steps/browser-helpers.d.ts +2 -2
  364. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  365. package/dist/engine/steps/browser-helpers.js +39 -16
  366. package/dist/engine/steps/browser-helpers.js.map +1 -1
  367. package/dist/engine/steps/download.d.ts +1 -0
  368. package/dist/engine/steps/download.d.ts.map +1 -1
  369. package/dist/engine/steps/download.js +3 -1
  370. package/dist/engine/steps/download.js.map +1 -1
  371. package/dist/engine/steps/index.d.ts +2 -0
  372. package/dist/engine/steps/index.d.ts.map +1 -1
  373. package/dist/engine/steps/index.js +2 -0
  374. package/dist/engine/steps/index.js.map +1 -1
  375. package/dist/engine/steps/oauth2-token.d.ts +41 -0
  376. package/dist/engine/steps/oauth2-token.d.ts.map +1 -0
  377. package/dist/engine/steps/oauth2-token.js +115 -0
  378. package/dist/engine/steps/oauth2-token.js.map +1 -0
  379. package/dist/engine/steps/select-xml.d.ts +34 -0
  380. package/dist/engine/steps/select-xml.d.ts.map +1 -0
  381. package/dist/engine/steps/select-xml.js +222 -0
  382. package/dist/engine/steps/select-xml.js.map +1 -0
  383. package/dist/engine/template.d.ts.map +1 -1
  384. package/dist/engine/template.js +7 -0
  385. package/dist/engine/template.js.map +1 -1
  386. package/dist/engine/transport/mcp-browser.d.ts +128 -0
  387. package/dist/engine/transport/mcp-browser.d.ts.map +1 -0
  388. package/dist/engine/transport/mcp-browser.js +120 -0
  389. package/dist/engine/transport/mcp-browser.js.map +1 -0
  390. package/dist/fast-path/handlers/approvals.d.ts +11 -0
  391. package/dist/fast-path/handlers/approvals.d.ts.map +1 -0
  392. package/dist/fast-path/handlers/approvals.js +136 -0
  393. package/dist/fast-path/handlers/approvals.js.map +1 -0
  394. package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
  395. package/dist/fast-path/handlers/discovery.js +17 -3
  396. package/dist/fast-path/handlers/discovery.js.map +1 -1
  397. package/dist/fast-path/manifest.d.ts +1 -0
  398. package/dist/fast-path/manifest.d.ts.map +1 -1
  399. package/dist/fast-path/manifest.js.map +1 -1
  400. package/dist/fast-path.d.ts.map +1 -1
  401. package/dist/fast-path.js +3 -0
  402. package/dist/fast-path.js.map +1 -1
  403. package/dist/index.d.ts +23 -0
  404. package/dist/index.d.ts.map +1 -0
  405. package/dist/index.js +38 -0
  406. package/dist/index.js.map +1 -0
  407. package/dist/manifest-compact.txt +13 -11
  408. package/dist/manifest-search.json +1 -1
  409. package/dist/manifest.json +2560 -103
  410. package/dist/mcp/handler.d.ts.map +1 -1
  411. package/dist/mcp/handler.js +14 -2
  412. package/dist/mcp/handler.js.map +1 -1
  413. package/dist/mcp/tools.d.ts.map +1 -1
  414. package/dist/mcp/tools.js +11 -3
  415. package/dist/mcp/tools.js.map +1 -1
  416. package/dist/output/auth-guidance.d.ts +14 -0
  417. package/dist/output/auth-guidance.d.ts.map +1 -0
  418. package/dist/output/auth-guidance.js +50 -0
  419. package/dist/output/auth-guidance.js.map +1 -0
  420. package/dist/output/error-map.d.ts +1 -1
  421. package/dist/output/error-map.d.ts.map +1 -1
  422. package/dist/output/error-map.js +28 -4
  423. package/dist/output/error-map.js.map +1 -1
  424. package/dist/output/next-actions.d.ts.map +1 -1
  425. package/dist/output/next-actions.js +19 -3
  426. package/dist/output/next-actions.js.map +1 -1
  427. package/dist/registry.d.ts +19 -1
  428. package/dist/registry.d.ts.map +1 -1
  429. package/dist/registry.js +10 -0
  430. package/dist/registry.js.map +1 -1
  431. package/dist/social/browser-errors.d.ts +13 -0
  432. package/dist/social/browser-errors.d.ts.map +1 -0
  433. package/dist/social/browser-errors.js +36 -0
  434. package/dist/social/browser-errors.js.map +1 -0
  435. package/dist/social/capabilities.d.ts +29 -0
  436. package/dist/social/capabilities.d.ts.map +1 -0
  437. package/dist/social/capabilities.js +448 -0
  438. package/dist/social/capabilities.js.map +1 -0
  439. package/dist/social/comments.d.ts +26 -0
  440. package/dist/social/comments.d.ts.map +1 -0
  441. package/dist/social/comments.js +97 -0
  442. package/dist/social/comments.js.map +1 -0
  443. package/dist/social/video-text.d.ts +27 -0
  444. package/dist/social/video-text.d.ts.map +1 -0
  445. package/dist/social/video-text.js +140 -0
  446. package/dist/social/video-text.js.map +1 -0
  447. package/dist/types/patent.d.ts +160 -0
  448. package/dist/types/patent.d.ts.map +1 -0
  449. package/dist/types/patent.js +16 -0
  450. package/dist/types/patent.js.map +1 -0
  451. package/dist/types/scholarly.d.ts +49 -0
  452. package/dist/types/scholarly.d.ts.map +1 -0
  453. package/dist/types/scholarly.js +16 -0
  454. package/dist/types/scholarly.js.map +1 -0
  455. package/dist/types.d.ts +12 -0
  456. package/dist/types.d.ts.map +1 -1
  457. package/dist/types.js.map +1 -1
  458. package/package.json +9 -4
  459. package/server.json +3 -3
  460. package/skills/unicli/SKILL.md +1 -1
  461. package/skills/unicli-claude-code/SKILL.md +1 -1
  462. package/skills/unicli-hermes/SKILL.md +1 -1
  463. package/src/adapters/acl-anthology/papers.ts +157 -0
  464. package/src/adapters/arxiv/download.yaml +1 -1
  465. package/src/adapters/arxiv/paper.yaml +1 -1
  466. package/src/adapters/arxiv/papers.ts +2 -0
  467. package/src/adapters/arxiv/search.yaml +1 -1
  468. package/src/adapters/arxiv/trending.yaml +1 -1
  469. package/src/adapters/baidu-scholar/search.ts +5 -0
  470. package/src/adapters/bilibili/comments-tree.test.ts +41 -0
  471. package/src/adapters/bilibili/comments.ts +78 -4
  472. package/src/adapters/bilibili/compat.ts +5 -2
  473. package/src/adapters/bilibili/download.ts +7 -4
  474. package/src/adapters/bilibili/wbi.ts +6 -3
  475. package/src/adapters/brave/search.yaml +53 -0
  476. package/src/adapters/cipo/_shared.ts +98 -0
  477. package/src/adapters/cipo/get.ts +188 -0
  478. package/src/adapters/cipo/legal-status.ts +148 -0
  479. package/src/adapters/cipo/search.ts +195 -0
  480. package/src/adapters/cnipa/_shared.ts +138 -0
  481. package/src/adapters/cnipa/get.ts +199 -0
  482. package/src/adapters/cnipa/legal-status.ts +162 -0
  483. package/src/adapters/cnipa/search.ts +229 -0
  484. package/src/adapters/crossref/works.ts +209 -0
  485. package/src/adapters/cvf/papers.ts +136 -0
  486. package/src/adapters/dblp/publications.ts +4 -0
  487. package/src/adapters/dpma/get.yaml +67 -0
  488. package/src/adapters/dpma/search.yaml +77 -0
  489. package/src/adapters/duckduckgo/search.yaml +54 -0
  490. package/src/adapters/duckduckgo/suggest.yaml +52 -0
  491. package/src/adapters/epo/family.yaml +69 -0
  492. package/src/adapters/epo/get.yaml +74 -0
  493. package/src/adapters/epo/legal-status.yaml +63 -0
  494. package/src/adapters/epo/search.yaml +84 -0
  495. package/src/adapters/espacenet/_shared.ts +98 -0
  496. package/src/adapters/espacenet/family.ts +161 -0
  497. package/src/adapters/espacenet/get.ts +185 -0
  498. package/src/adapters/espacenet/legal-status.ts +151 -0
  499. package/src/adapters/espacenet/search.ts +229 -0
  500. package/src/adapters/facebook/subtitles.ts +44 -0
  501. package/src/adapters/fips/_shared.ts +109 -0
  502. package/src/adapters/fips/get.ts +186 -0
  503. package/src/adapters/fips/search.ts +195 -0
  504. package/src/adapters/freepatentsonline-web/_shared.ts +273 -0
  505. package/src/adapters/freepatentsonline-web/get.ts +144 -0
  506. package/src/adapters/freepatentsonline-web/search.ts +170 -0
  507. package/src/adapters/google-patents-bq/prior-art.yaml +80 -0
  508. package/src/adapters/google-patents-bq/search.yaml +97 -0
  509. package/src/adapters/google-patents-web/_shared.ts +242 -0
  510. package/src/adapters/google-patents-web/get.ts +224 -0
  511. package/src/adapters/google-patents-web/search.ts +196 -0
  512. package/src/adapters/google-scholar/cite.ts +1 -0
  513. package/src/adapters/google-scholar/profile.ts +5 -0
  514. package/src/adapters/google-scholar/search.ts +5 -0
  515. package/src/adapters/hf/paper.test.ts +10 -0
  516. package/src/adapters/hf/paper.ts +1 -0
  517. package/src/adapters/hf/top.yaml +1 -1
  518. package/src/adapters/huggingface-papers/daily.yaml +1 -1
  519. package/src/adapters/huggingface-papers/search.yaml +1 -1
  520. package/src/adapters/inpi-br/_shared.ts +98 -0
  521. package/src/adapters/inpi-br/get.ts +193 -0
  522. package/src/adapters/inpi-br/search.ts +206 -0
  523. package/src/adapters/inpi-fr/get.yaml +62 -0
  524. package/src/adapters/inpi-fr/search.yaml +74 -0
  525. package/src/adapters/instagram/subtitles.ts +44 -0
  526. package/src/adapters/ipaustralia/get.yaml +67 -0
  527. package/src/adapters/ipaustralia/search.yaml +74 -0
  528. package/src/adapters/jpo/get.yaml +63 -0
  529. package/src/adapters/jpo/search.yaml +76 -0
  530. package/src/adapters/kipris/get.yaml +69 -0
  531. package/src/adapters/kipris/legal-status.yaml +58 -0
  532. package/src/adapters/kipris/search.yaml +79 -0
  533. package/src/adapters/lens/get.yaml +64 -0
  534. package/src/adapters/lens/search.yaml +82 -0
  535. package/src/adapters/mastodon/statuses.test.ts +82 -0
  536. package/src/adapters/mastodon/statuses.ts +208 -0
  537. package/src/adapters/neurips/proceedings.ts +126 -0
  538. package/src/adapters/openalex/works.ts +33 -0
  539. package/src/adapters/openreview/papers.ts +5 -0
  540. package/src/adapters/patsnap/get.yaml +65 -0
  541. package/src/adapters/patsnap/search.yaml +77 -0
  542. package/src/adapters/pmlr/proceedings.ts +167 -0
  543. package/src/adapters/pqai/prior-art.yaml +59 -0
  544. package/src/adapters/pqai/search.yaml +60 -0
  545. package/src/adapters/pubmed/articles.ts +5 -0
  546. package/src/adapters/reddit/comments-tree.test.ts +79 -0
  547. package/src/adapters/reddit/comments.ts +159 -0
  548. package/src/adapters/semantic-scholar/papers.ts +268 -0
  549. package/src/adapters/threads/post.test.ts +64 -0
  550. package/src/adapters/threads/post.ts +366 -0
  551. package/src/adapters/threads/user.yaml +73 -0
  552. package/src/adapters/tiktok/subtitles.ts +44 -0
  553. package/src/adapters/twitter/accept.ts +5 -2
  554. package/src/adapters/twitter/browser-fallback.ts +138 -0
  555. package/src/adapters/twitter/browser-state.ts +74 -0
  556. package/src/adapters/twitter/client.ts +51 -21
  557. package/src/adapters/twitter/reply-dm.ts +5 -2
  558. package/src/adapters/twitter/reply.ts +1 -0
  559. package/src/adapters/twitter/search.ts +12 -38
  560. package/src/adapters/twitter/thread.test.ts +43 -0
  561. package/src/adapters/twitter/thread.ts +44 -2
  562. package/src/adapters/twitter/trending.ts +14 -95
  563. package/src/adapters/ukipo/info.yaml +43 -0
  564. package/src/adapters/unpaywall/works.ts +138 -0
  565. package/src/adapters/uspto/get.yaml +67 -0
  566. package/src/adapters/uspto/legal-status.yaml +58 -0
  567. package/src/adapters/uspto/search.yaml +88 -0
  568. package/src/adapters/wipo-patentscope/info.yaml +43 -0
  569. package/src/adapters/xiaohongshu/browser-state.ts +95 -0
  570. package/src/adapters/xiaohongshu/comments.ts +29 -6
  571. package/src/adapters/xiaohongshu/download.ts +60 -11
  572. package/src/adapters/xiaohongshu/search.ts +18 -6
  573. package/src/adapters/xiaohongshu/trending.ts +112 -0
  574. package/src/adapters/yahoo/search.yaml +52 -0
  575. package/src/adapters/youtube/comments-microformat.test.ts +35 -0
  576. package/src/adapters/youtube/comments-tree.test.ts +74 -0
  577. package/src/adapters/youtube/comments.ts +166 -12
  578. package/src/adapters/youtube/subtitles.ts +44 -0
  579. package/src/adapters/yt-dlp/subtitles.ts +43 -0
  580. package/src/adapters/zhihu/answer-detail.test.ts +83 -0
  581. package/src/adapters/zhihu/answer-detail.ts +275 -0
  582. package/src/adapters/zhihu/comment-tree.test.ts +57 -0
  583. package/src/adapters/zhihu/comment.ts +186 -0
  584. package/src/adapters/zhihu/recommend.test.ts +65 -0
  585. package/src/adapters/zhihu/recommend.ts +207 -0
  586. package/src/adapters/zotero/search.yaml +1 -1
@@ -0,0 +1,139 @@
1
+ /**
2
+ * @owner src::adapters::fips::get
3
+ * @does Browser-driven Rospatent FIPS single-document retrieval at www.fips.ru — extracts the bibliographic block from the document detail page.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/fips/_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, PATENT_REGION_BLOCKED when .ru is unreachable
7
+ * @invariants output row is a canonical PatentRecord
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/fips/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 { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
19
+ import { fipsEnvelope, fipsNavigateAndExtract, transportErrorToFipsEnvelope, } from "./_shared.js";
20
+ const ADAPTER_PATH = "src/adapters/fips/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('.doc-number, [data-field="docNumber"]'),
28
+ application_number: text('.app-number, [data-field="appNumber"]'),
29
+ title: text('.doc-title, h1.title, [data-field="title"]'),
30
+ abstract: text('.abstract, [data-field="abstract"]'),
31
+ applicant: text('.applicant, [data-field="applicant"]'),
32
+ inventor: text('.inventor, [data-field="inventor"]'),
33
+ publication_date: text('.publication-date, [data-field="pubDate"]'),
34
+ filing_date: text('.filing-date, [data-field="filingDate"]'),
35
+ source_url: location.href,
36
+ };
37
+ })()`;
38
+ function detailUrlFor(pubNo) {
39
+ const stripped = pubNo.replace(/^RU[-]?/, "");
40
+ const params = new URLSearchParams({ DB: "RUPAT", DocNumber: stripped });
41
+ return `https://www1.fips.ru/fips_servl/fips_servlet?${params.toString()}`;
42
+ }
43
+ export async function runFipsGet(kwargs) {
44
+ const pubNo = String(kwargs.publication_number ?? "").trim();
45
+ if (pubNo.length === 0) {
46
+ return [
47
+ {
48
+ envelope: fipsEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "fips get requires a non-empty publication_number"),
49
+ },
50
+ ];
51
+ }
52
+ const url = detailUrlFor(pubNo);
53
+ let detail;
54
+ try {
55
+ const result = await fipsNavigateAndExtract(url, DETAIL_EXTRACTOR);
56
+ if (!result.data) {
57
+ return [
58
+ {
59
+ envelope: fipsEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "fips detail evaluate returned no data"),
60
+ },
61
+ ];
62
+ }
63
+ detail = result.data;
64
+ }
65
+ catch (err) {
66
+ if (err instanceof TransportError) {
67
+ return [
68
+ {
69
+ envelope: transportErrorToFipsEnvelope(err, ADAPTER_PATH, "navigate"),
70
+ },
71
+ ];
72
+ }
73
+ throw err;
74
+ }
75
+ if (!detail.publication_number && !detail.title) {
76
+ return [
77
+ {
78
+ envelope: fipsEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `fips detail page for "${pubNo}" yielded no bibliographic fields`, ["espacenet"]),
79
+ },
80
+ ];
81
+ }
82
+ const rawPubNo = detail.publication_number || pubNo;
83
+ const canonicalPubNo = /^RU[-]?/.test(rawPubNo) ? rawPubNo : `RU${rawPubNo}`;
84
+ try {
85
+ return [
86
+ assemblePatentRecord({
87
+ publication_number: canonicalPubNo,
88
+ application_number: detail.application_number || undefined,
89
+ title: detail.title || undefined,
90
+ abstract: detail.abstract || undefined,
91
+ assignees: detail.applicant
92
+ ? [{ name: detail.applicant, country: "RU" }]
93
+ : undefined,
94
+ inventors: detail.inventor
95
+ ? [{ name: detail.inventor, country: "RU" }]
96
+ : undefined,
97
+ publication_date: detail.publication_date || undefined,
98
+ filing_date: detail.filing_date || undefined,
99
+ source_adapter: "fips",
100
+ source_url: detail.source_url || url,
101
+ }),
102
+ ];
103
+ }
104
+ catch {
105
+ return [
106
+ {
107
+ envelope: fipsEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `fips detail page for "${pubNo}" did not yield a valid publication_number`, ["espacenet"]),
108
+ },
109
+ ];
110
+ }
111
+ }
112
+ cli({
113
+ site: "fips",
114
+ name: "get",
115
+ description: "Retrieve a single Rospatent FIPS document (browser-only)",
116
+ domain: "www.fips.ru",
117
+ strategy: Strategy.PUBLIC,
118
+ adapter_path: ADAPTER_PATH,
119
+ args: [
120
+ {
121
+ name: "publication_number",
122
+ type: "str",
123
+ required: true,
124
+ positional: true,
125
+ description: "Russian patent publication number",
126
+ },
127
+ ],
128
+ columns: [
129
+ "publication_number",
130
+ "title",
131
+ "publication_date",
132
+ "filing_date",
133
+ "source_url",
134
+ ],
135
+ capabilities: ["mcp-browser.navigate", "mcp-browser.evaluate", "patent.get"],
136
+ minimum_capability: "mcp-browser.evaluate",
137
+ func: async (_page, kwargs) => runFipsGet(kwargs),
138
+ });
139
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/fips/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @owner src::adapters::fips::search
3
+ * @does Browser-driven Rospatent FIPS search at www.fips.ru — Russia's federal IP office has no open API; the FIPS portal is the only programmatic surface.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/fips/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.search)
6
+ * @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (no rows), PATENT_API_DEPRECATED with MCP_BUS_MISSING; PATENT_REGION_BLOCKED is also possible if the browser cannot reach .ru
7
+ * @invariants rows canonicalized into PatentRecord; source_adapter='fips'
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/fips/search.test.ts
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification browser-only
15
+ */
16
+ export declare function runFipsSearch(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/fips/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA+CH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAgGrB"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @owner src::adapters::fips::search
3
+ * @does Browser-driven Rospatent FIPS search at www.fips.ru — Russia's federal IP office has no open API; the FIPS portal is the only programmatic surface.
4
+ * @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/fips/_shared.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.search)
6
+ * @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (no rows), PATENT_API_DEPRECATED with MCP_BUS_MISSING; PATENT_REGION_BLOCKED is also possible if the browser cannot reach .ru
7
+ * @invariants rows canonicalized into PatentRecord; source_adapter='fips'
8
+ * @side-effects controls Chrome via MCP
9
+ * @perf single navigate + evaluate
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/fips/search.test.ts
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 { fipsEnvelope, fipsNavigateAndExtract, transportErrorToFipsEnvelope, } from "./_shared.js";
20
+ const ADAPTER_PATH = "src/adapters/fips/search.ts";
21
+ const FIPS_SEARCH_URL = "https://www.fips.ru/iiss/search.xhtml";
22
+ const EXTRACTOR = `(() => {
23
+ const rows = Array.from(
24
+ document.querySelectorAll('table.results tr.result-row, .search-results .item')
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]');
31
+ return {
32
+ publication_number: text('.doc-number, td.number, [data-field="docNumber"]'),
33
+ title: text('.doc-title, td.title, [data-field="title"]'),
34
+ applicant: text('.applicant, td.applicant, [data-field="applicant"]'),
35
+ publication_date: text('.publication-date, td.pubDate, [data-field="pubDate"]'),
36
+ source_url: linkEl ? linkEl.href : '',
37
+ };
38
+ });
39
+ return { rows };
40
+ })()`;
41
+ function buildSearchUrl(query) {
42
+ const params = new URLSearchParams({ q: query });
43
+ return `${FIPS_SEARCH_URL}?${params.toString()}`;
44
+ }
45
+ export async function runFipsSearch(kwargs) {
46
+ const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
47
+ ? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
48
+ : 25;
49
+ const query = String(kwargs.query ?? "").trim();
50
+ if (query.length === 0) {
51
+ return [
52
+ {
53
+ envelope: fipsEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "fips search requires a non-empty query"),
54
+ },
55
+ ];
56
+ }
57
+ const url = buildSearchUrl(query);
58
+ let extract;
59
+ try {
60
+ const result = await fipsNavigateAndExtract(url, EXTRACTOR);
61
+ if (!result.data) {
62
+ return [
63
+ {
64
+ envelope: fipsEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "fips evaluate returned no data; selectors likely drifted"),
65
+ },
66
+ ];
67
+ }
68
+ extract = result.data;
69
+ }
70
+ catch (err) {
71
+ if (err instanceof TransportError) {
72
+ return [
73
+ {
74
+ envelope: transportErrorToFipsEnvelope(err, ADAPTER_PATH, "navigate"),
75
+ },
76
+ ];
77
+ }
78
+ throw err;
79
+ }
80
+ if (extract.rows.length === 0) {
81
+ return [
82
+ {
83
+ envelope: fipsEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `fips returned no rows for query "${query}"`, ["espacenet"]),
84
+ },
85
+ ];
86
+ }
87
+ const out = [];
88
+ for (const row of extract.rows.slice(0, limit)) {
89
+ if (!row.publication_number)
90
+ continue;
91
+ const normalizedPub = /^RU[-]?/.test(row.publication_number)
92
+ ? row.publication_number
93
+ : `RU${row.publication_number}`;
94
+ try {
95
+ out.push(assemblePatentRecord({
96
+ publication_number: normalizedPub,
97
+ title: row.title || undefined,
98
+ assignees: row.applicant
99
+ ? [{ name: row.applicant, country: "RU" }]
100
+ : undefined,
101
+ publication_date: row.publication_date || undefined,
102
+ source_adapter: "fips",
103
+ source_url: row.source_url || url,
104
+ }));
105
+ }
106
+ catch {
107
+ // Skip malformed rows.
108
+ }
109
+ }
110
+ if (out.length === 0) {
111
+ out.push({
112
+ envelope: fipsEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "fips returned rows but none normalized to a valid publication_number", ["espacenet"]),
113
+ });
114
+ }
115
+ return out;
116
+ }
117
+ cli({
118
+ site: "fips",
119
+ name: "search",
120
+ description: "Search Rospatent FIPS Russian patent database (browser, no API)",
121
+ domain: "www.fips.ru",
122
+ strategy: Strategy.PUBLIC,
123
+ adapter_path: ADAPTER_PATH,
124
+ args: [
125
+ {
126
+ name: "query",
127
+ type: "str",
128
+ required: true,
129
+ positional: true,
130
+ description: "Free-text query for FIPS Russian patent search",
131
+ },
132
+ {
133
+ name: "limit",
134
+ type: "int",
135
+ default: 25,
136
+ description: "Max results (1-100)",
137
+ },
138
+ ],
139
+ columns: ["publication_number", "title", "publication_date", "source_url"],
140
+ capabilities: [
141
+ "mcp-browser.navigate",
142
+ "mcp-browser.evaluate",
143
+ "patent.search",
144
+ ],
145
+ minimum_capability: "mcp-browser.evaluate",
146
+ func: async (_page, kwargs) => runFipsSearch(kwargs),
147
+ });
148
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/fips/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @owner src::adapters::freepatentsonline-web::_shared
3
+ * @does Shared HTTP + HTML helpers for the KEYLESS FreePatentsOnline adapter. FPO ships zero JS gate and zero auth; we hit the SSR `result.html` listing and `<id>.html` detail pages directly. Kind codes are decoded from FPO's internal URL routing — `/y<YYYY>/<serial>.html` ↔ US published application (ST.16 kind `A1`), `/<id>.html` (compact ID) ↔ US grant (kind code unknown from URL alone — skip), `/<CCNNNNkc>.html` ↔ explicit kind code (use as-is).
4
+ * @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
5
+ * @feeds src/adapters/freepatentsonline-web/search.ts, src/adapters/freepatentsonline-web/get.ts
6
+ * @breaks throws FpoHttpError on non-2xx; pure-HTML parse functions never throw, they return null on selector miss
7
+ * @invariants every outbound request carries a real-browser User-Agent; publication numbers either arrive with an explicit kind code OR are decoded from FPO's URL convention — adapters NEVER fabricate a kind code from era heuristics
8
+ * @side-effects HTTPS egress to www.freepatentsonline.com only
9
+ * @perf 50-150 KB per page; HTML parse is linear regex
10
+ * @concurrency safe — stateless
11
+ * @test verification proof in docs/skills/patent-cookbook.md
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification keyless-best-effort
15
+ */
16
+ export declare const FPO_ORIGIN = "https://www.freepatentsonline.com";
17
+ export declare class FpoHttpError extends Error {
18
+ readonly status: number;
19
+ readonly url: string;
20
+ constructor(status: number, url: string, message: string);
21
+ }
22
+ export declare function fetchFpoHtml(url: string): Promise<string>;
23
+ export declare function buildFpoSearchUrl(query: string, page: number): string;
24
+ export declare function buildFpoDetailUrl(publicationNumber: string): string;
25
+ /**
26
+ * Convert an MM/DD/YYYY date as FPO renders it into ISO-8601 YYYY-MM-DD.
27
+ * Returns undefined on shape mismatch — we never invent a date.
28
+ */
29
+ export declare function fpoDateToIso(raw: string | undefined): string | undefined;
30
+ export declare function stripFpoHtml(input: string | undefined | null): string;
31
+ /**
32
+ * Search-result row as scraped from the FPO listing table. Kind code is
33
+ * decoded from the link path; rows whose link does not encode a kind code
34
+ * are dropped at the search-adapter level rather than fabricated.
35
+ */
36
+ export interface FpoListingRow {
37
+ publication_number_raw: string;
38
+ publication_number_canonical?: string;
39
+ title: string;
40
+ abstract?: string;
41
+ detail_url: string;
42
+ }
43
+ /**
44
+ * Map an FPO listing link path to a canonical ST.16 publication number when
45
+ * the route encodes enough information. Returns undefined when the route
46
+ * is structurally ambiguous (e.g. bare grant numbers without a CC prefix).
47
+ */
48
+ export declare function canonicaliseFpoLink(link: string, rawPubNo: string): string | undefined;
49
+ export declare function parseFpoListing(html: string): FpoListingRow[];
50
+ /**
51
+ * Bibliographic detail fields parsed from a single FPO patent page. Empty
52
+ * fields are `undefined`, never `null` and never invented.
53
+ */
54
+ export interface FpoDetail {
55
+ title?: string;
56
+ abstract?: string;
57
+ publication_number?: string;
58
+ application_number?: string;
59
+ publication_date?: string;
60
+ filing_date?: string;
61
+ assignee?: string;
62
+ kind_code?: string;
63
+ doc_type_label?: string;
64
+ }
65
+ export declare function parseFpoDetail(html: string): FpoDetail;
66
+ /**
67
+ * Combine the bib label `United States Patent Application 20240220787` and
68
+ * the kind code `A1` extracted separately into the canonical ST.16 form
69
+ * `US-20240220787-A1`. Returns undefined if either piece is missing.
70
+ */
71
+ export declare function reconstructCanonicalPubNo(docTypeLabel: string | undefined, kindCode: string | undefined): string | undefined;
72
+ //# sourceMappingURL=_shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,eAAO,MAAM,UAAU,sCAAsC,CAAC;AAE9D,qBAAa,YAAa,SAAQ,KAAK;aAEnB,MAAM,EAAE,MAAM;aACd,GAAG,EAAE,MAAM;gBADX,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CASnE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKxE;AAaD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOrE;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAcpB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CA2C7D;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAwBtD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,SAAS,CAoBpB"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * @owner src::adapters::freepatentsonline-web::_shared
3
+ * @does Shared HTTP + HTML helpers for the KEYLESS FreePatentsOnline adapter. FPO ships zero JS gate and zero auth; we hit the SSR `result.html` listing and `<id>.html` detail pages directly. Kind codes are decoded from FPO's internal URL routing — `/y<YYYY>/<serial>.html` ↔ US published application (ST.16 kind `A1`), `/<id>.html` (compact ID) ↔ US grant (kind code unknown from URL alone — skip), `/<CCNNNNkc>.html` ↔ explicit kind code (use as-is).
4
+ * @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
5
+ * @feeds src/adapters/freepatentsonline-web/search.ts, src/adapters/freepatentsonline-web/get.ts
6
+ * @breaks throws FpoHttpError on non-2xx; pure-HTML parse functions never throw, they return null on selector miss
7
+ * @invariants every outbound request carries a real-browser User-Agent; publication numbers either arrive with an explicit kind code OR are decoded from FPO's URL convention — adapters NEVER fabricate a kind code from era heuristics
8
+ * @side-effects HTTPS egress to www.freepatentsonline.com only
9
+ * @perf 50-150 KB per page; HTML parse is linear regex
10
+ * @concurrency safe — stateless
11
+ * @test verification proof in docs/skills/patent-cookbook.md
12
+ * @stability experimental
13
+ * @since 2026-05-18
14
+ * @verification keyless-best-effort
15
+ */
16
+ const FPO_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
17
+ export const FPO_ORIGIN = "https://www.freepatentsonline.com";
18
+ export class FpoHttpError extends Error {
19
+ status;
20
+ url;
21
+ constructor(status, url, message) {
22
+ super(message);
23
+ this.status = status;
24
+ this.url = url;
25
+ this.name = "FpoHttpError";
26
+ }
27
+ }
28
+ export async function fetchFpoHtml(url) {
29
+ const response = await fetch(url, {
30
+ method: "GET",
31
+ headers: {
32
+ "User-Agent": FPO_UA,
33
+ Accept: "text/html,application/xhtml+xml",
34
+ },
35
+ });
36
+ if (!response.ok) {
37
+ throw new FpoHttpError(response.status, url, `FreePatentsOnline returned HTTP ${response.status}`);
38
+ }
39
+ return await response.text();
40
+ }
41
+ export function buildFpoSearchUrl(query, page) {
42
+ const trimmed = query.trim().replace(/\s+/g, "+");
43
+ const safe = encodeURIComponent(trimmed).replace(/%2B/g, "+");
44
+ return `${FPO_ORIGIN}/result.html?p=${page}&sort=relevance&srch=xprtsrch&query_txt=${safe}&submitted=&patents_us=on&patents_other=on`;
45
+ }
46
+ export function buildFpoDetailUrl(publicationNumber) {
47
+ const compact = publicationNumber.replace(/-/g, "").toUpperCase();
48
+ // Heuristic for US published applications: `US20240220787` → `/y2024/0220787.html`
49
+ const usAppMatch = /^US(\d{4})(\d{7})$/.exec(compact);
50
+ if (usAppMatch) {
51
+ return `${FPO_ORIGIN}/y${usAppMatch[1]}/${usAppMatch[2]}.html`;
52
+ }
53
+ // EP / WO / etc with explicit kind code → /<full>.html
54
+ return `${FPO_ORIGIN}/${encodeURIComponent(compact)}.html`;
55
+ }
56
+ /**
57
+ * Convert an MM/DD/YYYY date as FPO renders it into ISO-8601 YYYY-MM-DD.
58
+ * Returns undefined on shape mismatch — we never invent a date.
59
+ */
60
+ export function fpoDateToIso(raw) {
61
+ if (!raw)
62
+ return undefined;
63
+ const match = /^\s*(\d{2})\/(\d{2})\/(\d{4})\s*$/.exec(raw);
64
+ if (!match)
65
+ return undefined;
66
+ return `${match[3]}-${match[1]}-${match[2]}`;
67
+ }
68
+ const TAG_RE = /<[^>]+>/g;
69
+ const ENTITY_MAP = {
70
+ "&amp;": "&",
71
+ "&lt;": "<",
72
+ "&gt;": ">",
73
+ "&quot;": '"',
74
+ "&#39;": "'",
75
+ "&hellip;": "…",
76
+ "&nbsp;": " ",
77
+ };
78
+ export function stripFpoHtml(input) {
79
+ if (!input)
80
+ return "";
81
+ return input
82
+ .replace(TAG_RE, " ")
83
+ .replace(/&(?:amp|lt|gt|quot|#39|hellip|nbsp);/g, (m) => ENTITY_MAP[m] ?? m)
84
+ .replace(/\s+/g, " ")
85
+ .trim();
86
+ }
87
+ const LISTING_TABLE_RE = /<table[^>]*class="listing_table"[^>]*>([\s\S]*?)<\/table>/i;
88
+ const ROW_RE = /<tr[^>]*>([\s\S]*?)<\/tr>/gi;
89
+ const CELL_RE = /<td[^>]*>([\s\S]*?)<\/td>/gi;
90
+ const HREF_RE = /<a[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/i;
91
+ /**
92
+ * Map an FPO listing link path to a canonical ST.16 publication number when
93
+ * the route encodes enough information. Returns undefined when the route
94
+ * is structurally ambiguous (e.g. bare grant numbers without a CC prefix).
95
+ */
96
+ export function canonicaliseFpoLink(link, rawPubNo) {
97
+ // Already segmented? e.g. "EP3716153A1" or "WO2024012345A1"
98
+ const explicit = /^([A-Z]{2})(\d+)([A-Z]\d?)$/.exec(rawPubNo.replace(/\s+/g, "").toUpperCase());
99
+ if (explicit) {
100
+ return `${explicit[1]}-${explicit[2]}-${explicit[3]}`;
101
+ }
102
+ // US application route: /y<YYYY>/<NNNNNNN>.html ↔ US-YYYYNNNNNNN-A1
103
+ const usAppMatch = /^\/y(\d{4})\/(\d{7})\.html$/i.exec(link);
104
+ if (usAppMatch) {
105
+ return `US-${usAppMatch[1]}${usAppMatch[2]}-A1`;
106
+ }
107
+ return undefined;
108
+ }
109
+ export function parseFpoListing(html) {
110
+ const tableMatch = LISTING_TABLE_RE.exec(html);
111
+ if (!tableMatch)
112
+ return [];
113
+ const body = tableMatch[1];
114
+ ROW_RE.lastIndex = 0;
115
+ const out = [];
116
+ let rowMatch;
117
+ while ((rowMatch = ROW_RE.exec(body)) !== null) {
118
+ const cells = [];
119
+ CELL_RE.lastIndex = 0;
120
+ let cellMatch;
121
+ while ((cellMatch = CELL_RE.exec(rowMatch[1])) !== null) {
122
+ cells.push(cellMatch[1]);
123
+ }
124
+ // FPO 2026 layout: <tr> has 4 <td> cells —
125
+ // cells[0] = match index ("1", "2", ...)
126
+ // cells[1] = publication number text (e.g. "US20240220787")
127
+ // cells[2] = <a href>title</a> &nbsp; <br/> abstract-snippet
128
+ // cells[3] = relevance score
129
+ if (cells.length < 3)
130
+ continue;
131
+ const rawPubNo = stripFpoHtml(cells[1]);
132
+ const titleCell = cells[2];
133
+ const link = HREF_RE.exec(titleCell);
134
+ if (!rawPubNo || !link)
135
+ continue;
136
+ const title = stripFpoHtml(link[2]);
137
+ // Abstract snippet is the remainder of cells[2] after the </a> tag —
138
+ // FPO emits it inline after a &nbsp; and a <br/>. Strip the <a>…</a>
139
+ // block plus the trailing <br/> and treat what's left as the snippet.
140
+ const afterAnchor = titleCell
141
+ .replace(HREF_RE, "")
142
+ .replace(/<br\s*\/?>/i, "");
143
+ const abstractSnippet = stripFpoHtml(afterAnchor);
144
+ out.push({
145
+ publication_number_raw: rawPubNo,
146
+ publication_number_canonical: canonicaliseFpoLink(link[1], rawPubNo),
147
+ title,
148
+ abstract: abstractSnippet || undefined,
149
+ detail_url: link[1].startsWith("http")
150
+ ? link[1]
151
+ : `${FPO_ORIGIN}${link[1]}`,
152
+ });
153
+ }
154
+ return out;
155
+ }
156
+ const KIND_CODE_RE = /<div[^>]*disp_elm_name_kcode[^>]*>[\s\S]*?Kind\s*Code:[\s\S]*?<\/div>\s*<div[^>]*float_left[^>]*>\s*([A-Z0-9]+)\s*<\/div>/i;
157
+ const DOC_TYPE_RE = /<div[^>]*disp_elm_text[^>]*style="[^"]*clear:\s*none[^"]*"[^>]*>\s*<label[^>]*>\s*([^<]+?)\s*<\/label>/i;
158
+ function extractLabelValue(html, label) {
159
+ const re = new RegExp(`<div[^>]*disp_elm_title[^>]*>\\s*${label}\\s*:?\\s*<\\/div>\\s*<div[^>]*disp_elm_text[^>]*>([\\s\\S]*?)<\\/div>`, "i");
160
+ const match = re.exec(html);
161
+ if (!match)
162
+ return undefined;
163
+ const value = stripFpoHtml(match[1]);
164
+ return value || undefined;
165
+ }
166
+ export function parseFpoDetail(html) {
167
+ const title = extractLabelValue(html, "Title");
168
+ const abstractRaw = extractLabelValue(html, "Abstract");
169
+ const applicationNumber = extractLabelValue(html, "Application Number");
170
+ const publicationDate = fpoDateToIso(extractLabelValue(html, "Publication Date"));
171
+ const filingDate = fpoDateToIso(extractLabelValue(html, "Filing Date"));
172
+ const assignee = extractLabelValue(html, "Assignee");
173
+ const kindMatch = KIND_CODE_RE.exec(html);
174
+ const kindCode = kindMatch ? kindMatch[1].toUpperCase() : undefined;
175
+ const docTypeMatch = DOC_TYPE_RE.exec(html);
176
+ const docTypeLabel = docTypeMatch ? docTypeMatch[1].trim() : undefined;
177
+ return {
178
+ title,
179
+ abstract: abstractRaw,
180
+ application_number: applicationNumber,
181
+ publication_date: publicationDate,
182
+ filing_date: filingDate,
183
+ assignee,
184
+ kind_code: kindCode,
185
+ doc_type_label: docTypeLabel,
186
+ };
187
+ }
188
+ /**
189
+ * Combine the bib label `United States Patent Application 20240220787` and
190
+ * the kind code `A1` extracted separately into the canonical ST.16 form
191
+ * `US-20240220787-A1`. Returns undefined if either piece is missing.
192
+ */
193
+ export function reconstructCanonicalPubNo(docTypeLabel, kindCode) {
194
+ if (!docTypeLabel || !kindCode)
195
+ return undefined;
196
+ // Pull the trailing identifier off the label. The label is one of:
197
+ // "United States Patent Application 20240220787" (11-digit US app id)
198
+ // "European Patent Application EP3716153" (CC-prefixed)
199
+ // "United States Patent 12602228" (7-9 digit US grant)
200
+ const idMatch = /([A-Z]{2}\d+|\d{7,})\s*$/.exec(docTypeLabel.trim());
201
+ if (!idMatch)
202
+ return undefined;
203
+ const rawId = idMatch[1];
204
+ // Prefix? `US…`, `EP…`, etc. — strip then re-emit
205
+ const prefixMatch = /^([A-Z]{2})(\d+)$/.exec(rawId);
206
+ if (prefixMatch) {
207
+ return `${prefixMatch[1]}-${prefixMatch[2]}-${kindCode}`;
208
+ }
209
+ // Bare numeric — could be a 7-9 digit US grant or an 11-digit US
210
+ // published-application identifier. Both belong to the US namespace.
211
+ if (/^\d{7,11}$/.test(rawId)) {
212
+ return `US-${rawId}-${kindCode}`;
213
+ }
214
+ return undefined;
215
+ }
216
+ //# sourceMappingURL=_shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/_shared.ts"],"names":[],"mappings":"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"}