@zenalexa/unicli 0.220.0 → 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 (626) hide show
  1. package/AGENTS.md +35 -22
  2. package/README.md +23 -17
  3. package/README.zh-CN.md +23 -17
  4. package/dist/adapters/anilist/web.d.ts +11 -0
  5. package/dist/adapters/anilist/web.d.ts.map +1 -0
  6. package/dist/adapters/anilist/web.js +284 -0
  7. package/dist/adapters/anilist/web.js.map +1 -0
  8. package/dist/adapters/bangumi/web.d.ts +14 -0
  9. package/dist/adapters/bangumi/web.d.ts.map +1 -0
  10. package/dist/adapters/bangumi/web.js +257 -0
  11. package/dist/adapters/bangumi/web.js.map +1 -0
  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/dlsite/web.d.ts +31 -0
  54. package/dist/adapters/dlsite/web.d.ts.map +1 -0
  55. package/dist/adapters/dlsite/web.js +455 -0
  56. package/dist/adapters/dlsite/web.js.map +1 -0
  57. package/dist/adapters/ehentai/web.d.ts +66 -0
  58. package/dist/adapters/ehentai/web.d.ts.map +1 -0
  59. package/dist/adapters/ehentai/web.js +608 -0
  60. package/dist/adapters/ehentai/web.js.map +1 -0
  61. package/dist/adapters/espacenet/_shared.d.ts +21 -0
  62. package/dist/adapters/espacenet/_shared.d.ts.map +1 -0
  63. package/dist/adapters/espacenet/_shared.js +67 -0
  64. package/dist/adapters/espacenet/_shared.js.map +1 -0
  65. package/dist/adapters/espacenet/family.d.ts +19 -0
  66. package/dist/adapters/espacenet/family.d.ts.map +1 -0
  67. package/dist/adapters/espacenet/family.js +118 -0
  68. package/dist/adapters/espacenet/family.js.map +1 -0
  69. package/dist/adapters/espacenet/get.d.ts +19 -0
  70. package/dist/adapters/espacenet/get.d.ts.map +1 -0
  71. package/dist/adapters/espacenet/get.js +130 -0
  72. package/dist/adapters/espacenet/get.js.map +1 -0
  73. package/dist/adapters/espacenet/legal-status.d.ts +19 -0
  74. package/dist/adapters/espacenet/legal-status.d.ts.map +1 -0
  75. package/dist/adapters/espacenet/legal-status.js +110 -0
  76. package/dist/adapters/espacenet/legal-status.js.map +1 -0
  77. package/dist/adapters/espacenet/search.d.ts +20 -0
  78. package/dist/adapters/espacenet/search.d.ts.map +1 -0
  79. package/dist/adapters/espacenet/search.js +165 -0
  80. package/dist/adapters/espacenet/search.js.map +1 -0
  81. package/dist/adapters/facebook/subtitles.d.ts +9 -0
  82. package/dist/adapters/facebook/subtitles.d.ts.map +1 -0
  83. package/dist/adapters/facebook/subtitles.js +42 -0
  84. package/dist/adapters/facebook/subtitles.js.map +1 -0
  85. package/dist/adapters/fips/_shared.d.ts +21 -0
  86. package/dist/adapters/fips/_shared.d.ts.map +1 -0
  87. package/dist/adapters/fips/_shared.js +77 -0
  88. package/dist/adapters/fips/_shared.js.map +1 -0
  89. package/dist/adapters/fips/get.d.ts +19 -0
  90. package/dist/adapters/fips/get.d.ts.map +1 -0
  91. package/dist/adapters/fips/get.js +139 -0
  92. package/dist/adapters/fips/get.js.map +1 -0
  93. package/dist/adapters/fips/search.d.ts +20 -0
  94. package/dist/adapters/fips/search.d.ts.map +1 -0
  95. package/dist/adapters/fips/search.js +148 -0
  96. package/dist/adapters/fips/search.js.map +1 -0
  97. package/dist/adapters/freepatentsonline-web/_shared.d.ts +72 -0
  98. package/dist/adapters/freepatentsonline-web/_shared.d.ts.map +1 -0
  99. package/dist/adapters/freepatentsonline-web/_shared.js +216 -0
  100. package/dist/adapters/freepatentsonline-web/_shared.js.map +1 -0
  101. package/dist/adapters/freepatentsonline-web/get.d.ts +21 -0
  102. package/dist/adapters/freepatentsonline-web/get.d.ts.map +1 -0
  103. package/dist/adapters/freepatentsonline-web/get.js +127 -0
  104. package/dist/adapters/freepatentsonline-web/get.js.map +1 -0
  105. package/dist/adapters/freepatentsonline-web/search.d.ts +22 -0
  106. package/dist/adapters/freepatentsonline-web/search.d.ts.map +1 -0
  107. package/dist/adapters/freepatentsonline-web/search.js +149 -0
  108. package/dist/adapters/freepatentsonline-web/search.js.map +1 -0
  109. package/dist/adapters/google-patents-web/_shared.d.ts +110 -0
  110. package/dist/adapters/google-patents-web/_shared.d.ts.map +1 -0
  111. package/dist/adapters/google-patents-web/_shared.js +164 -0
  112. package/dist/adapters/google-patents-web/_shared.js.map +1 -0
  113. package/dist/adapters/google-patents-web/get.d.ts +36 -0
  114. package/dist/adapters/google-patents-web/get.d.ts.map +1 -0
  115. package/dist/adapters/google-patents-web/get.js +187 -0
  116. package/dist/adapters/google-patents-web/get.js.map +1 -0
  117. package/dist/adapters/google-patents-web/search.d.ts +23 -0
  118. package/dist/adapters/google-patents-web/search.d.ts.map +1 -0
  119. package/dist/adapters/google-patents-web/search.js +169 -0
  120. package/dist/adapters/google-patents-web/search.js.map +1 -0
  121. package/dist/adapters/inpi-br/_shared.d.ts +21 -0
  122. package/dist/adapters/inpi-br/_shared.d.ts.map +1 -0
  123. package/dist/adapters/inpi-br/_shared.js +67 -0
  124. package/dist/adapters/inpi-br/_shared.js.map +1 -0
  125. package/dist/adapters/inpi-br/get.d.ts +19 -0
  126. package/dist/adapters/inpi-br/get.d.ts.map +1 -0
  127. package/dist/adapters/inpi-br/get.js +142 -0
  128. package/dist/adapters/inpi-br/get.js.map +1 -0
  129. package/dist/adapters/inpi-br/search.d.ts +20 -0
  130. package/dist/adapters/inpi-br/search.d.ts.map +1 -0
  131. package/dist/adapters/inpi-br/search.js +154 -0
  132. package/dist/adapters/inpi-br/search.js.map +1 -0
  133. package/dist/adapters/instagram/subtitles.d.ts +9 -0
  134. package/dist/adapters/instagram/subtitles.d.ts.map +1 -0
  135. package/dist/adapters/instagram/subtitles.js +42 -0
  136. package/dist/adapters/instagram/subtitles.js.map +1 -0
  137. package/dist/adapters/jikan/web.d.ts +9 -0
  138. package/dist/adapters/jikan/web.d.ts.map +1 -0
  139. package/dist/adapters/jikan/web.js +154 -0
  140. package/dist/adapters/jikan/web.js.map +1 -0
  141. package/dist/adapters/kitsu/web.d.ts +9 -0
  142. package/dist/adapters/kitsu/web.d.ts.map +1 -0
  143. package/dist/adapters/kitsu/web.js +97 -0
  144. package/dist/adapters/kitsu/web.js.map +1 -0
  145. package/dist/adapters/mangadex/web.d.ts +10 -0
  146. package/dist/adapters/mangadex/web.d.ts.map +1 -0
  147. package/dist/adapters/mangadex/web.js +188 -0
  148. package/dist/adapters/mangadex/web.js.map +1 -0
  149. package/dist/adapters/mastodon/statuses.d.ts +40 -0
  150. package/dist/adapters/mastodon/statuses.d.ts.map +1 -0
  151. package/dist/adapters/mastodon/statuses.js +153 -0
  152. package/dist/adapters/mastodon/statuses.js.map +1 -0
  153. package/dist/adapters/moegirl/web.d.ts +23 -0
  154. package/dist/adapters/moegirl/web.d.ts.map +1 -0
  155. package/dist/adapters/moegirl/web.js +269 -0
  156. package/dist/adapters/moegirl/web.js.map +1 -0
  157. package/dist/adapters/reddit/comments.d.ts +9 -0
  158. package/dist/adapters/reddit/comments.d.ts.map +1 -0
  159. package/dist/adapters/reddit/comments.js +124 -0
  160. package/dist/adapters/reddit/comments.js.map +1 -0
  161. package/dist/adapters/safebooru/web.d.ts +10 -0
  162. package/dist/adapters/safebooru/web.d.ts.map +1 -0
  163. package/dist/adapters/safebooru/web.js +120 -0
  164. package/dist/adapters/safebooru/web.js.map +1 -0
  165. package/dist/adapters/threads/post.d.ts +32 -0
  166. package/dist/adapters/threads/post.d.ts.map +1 -0
  167. package/dist/adapters/threads/post.js +287 -0
  168. package/dist/adapters/threads/post.js.map +1 -0
  169. package/dist/adapters/tiktok/subtitles.d.ts +9 -0
  170. package/dist/adapters/tiktok/subtitles.d.ts.map +1 -0
  171. package/dist/adapters/tiktok/subtitles.js +42 -0
  172. package/dist/adapters/tiktok/subtitles.js.map +1 -0
  173. package/dist/adapters/twitter/accept.js +2 -2
  174. package/dist/adapters/twitter/accept.js.map +1 -1
  175. package/dist/adapters/twitter/browser-fallback.d.ts +26 -0
  176. package/dist/adapters/twitter/browser-fallback.d.ts.map +1 -0
  177. package/dist/adapters/twitter/browser-fallback.js +93 -0
  178. package/dist/adapters/twitter/browser-fallback.js.map +1 -0
  179. package/dist/adapters/twitter/browser-state.d.ts +11 -0
  180. package/dist/adapters/twitter/browser-state.d.ts.map +1 -0
  181. package/dist/adapters/twitter/browser-state.js +46 -0
  182. package/dist/adapters/twitter/browser-state.js.map +1 -0
  183. package/dist/adapters/twitter/client.d.ts.map +1 -1
  184. package/dist/adapters/twitter/client.js +36 -13
  185. package/dist/adapters/twitter/client.js.map +1 -1
  186. package/dist/adapters/twitter/reply-dm.js +2 -2
  187. package/dist/adapters/twitter/reply-dm.js.map +1 -1
  188. package/dist/adapters/twitter/reply.js +1 -0
  189. package/dist/adapters/twitter/reply.js.map +1 -1
  190. package/dist/adapters/twitter/search.js +11 -18
  191. package/dist/adapters/twitter/search.js.map +1 -1
  192. package/dist/adapters/twitter/thread.d.ts +14 -0
  193. package/dist/adapters/twitter/thread.d.ts.map +1 -1
  194. package/dist/adapters/twitter/thread.js +28 -2
  195. package/dist/adapters/twitter/thread.js.map +1 -1
  196. package/dist/adapters/twitter/trending.js +13 -59
  197. package/dist/adapters/twitter/trending.js.map +1 -1
  198. package/dist/adapters/vndb/web.d.ts +10 -0
  199. package/dist/adapters/vndb/web.d.ts.map +1 -0
  200. package/dist/adapters/vndb/web.js +321 -0
  201. package/dist/adapters/vndb/web.js.map +1 -0
  202. package/dist/adapters/xiaohongshu/browser-state.d.ts +19 -0
  203. package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -0
  204. package/dist/adapters/xiaohongshu/browser-state.js +67 -0
  205. package/dist/adapters/xiaohongshu/browser-state.js.map +1 -0
  206. package/dist/adapters/xiaohongshu/comments.js +28 -5
  207. package/dist/adapters/xiaohongshu/comments.js.map +1 -1
  208. package/dist/adapters/xiaohongshu/download.js +49 -11
  209. package/dist/adapters/xiaohongshu/download.js.map +1 -1
  210. package/dist/adapters/xiaohongshu/search.d.ts.map +1 -1
  211. package/dist/adapters/xiaohongshu/search.js +11 -5
  212. package/dist/adapters/xiaohongshu/search.js.map +1 -1
  213. package/dist/adapters/xiaohongshu/trending.d.ts +9 -0
  214. package/dist/adapters/xiaohongshu/trending.d.ts.map +1 -0
  215. package/dist/adapters/xiaohongshu/trending.js +94 -0
  216. package/dist/adapters/xiaohongshu/trending.js.map +1 -0
  217. package/dist/adapters/youtube/comments.d.ts +80 -0
  218. package/dist/adapters/youtube/comments.d.ts.map +1 -1
  219. package/dist/adapters/youtube/comments.js +108 -12
  220. package/dist/adapters/youtube/comments.js.map +1 -1
  221. package/dist/adapters/youtube/subtitles.d.ts +9 -0
  222. package/dist/adapters/youtube/subtitles.d.ts.map +1 -0
  223. package/dist/adapters/youtube/subtitles.js +42 -0
  224. package/dist/adapters/youtube/subtitles.js.map +1 -0
  225. package/dist/adapters/yt-dlp/subtitles.d.ts +9 -0
  226. package/dist/adapters/yt-dlp/subtitles.d.ts.map +1 -0
  227. package/dist/adapters/yt-dlp/subtitles.js +41 -0
  228. package/dist/adapters/yt-dlp/subtitles.js.map +1 -0
  229. package/dist/adapters/zhihu/answer-detail.d.ts +39 -0
  230. package/dist/adapters/zhihu/answer-detail.d.ts.map +1 -0
  231. package/dist/adapters/zhihu/answer-detail.js +204 -0
  232. package/dist/adapters/zhihu/answer-detail.js.map +1 -0
  233. package/dist/adapters/zhihu/comment.d.ts +9 -0
  234. package/dist/adapters/zhihu/comment.d.ts.map +1 -0
  235. package/dist/adapters/zhihu/comment.js +149 -0
  236. package/dist/adapters/zhihu/comment.js.map +1 -0
  237. package/dist/adapters/zhihu/recommend.d.ts +36 -0
  238. package/dist/adapters/zhihu/recommend.d.ts.map +1 -0
  239. package/dist/adapters/zhihu/recommend.js +151 -0
  240. package/dist/adapters/zhihu/recommend.js.map +1 -0
  241. package/dist/agents/codex-pack.d.ts +62 -0
  242. package/dist/agents/codex-pack.d.ts.map +1 -0
  243. package/dist/agents/codex-pack.js +163 -0
  244. package/dist/agents/codex-pack.js.map +1 -0
  245. package/dist/browser/bridge.d.ts.map +1 -1
  246. package/dist/browser/bridge.js +14 -3
  247. package/dist/browser/bridge.js.map +1 -1
  248. package/dist/browser/daemon-client.d.ts +6 -0
  249. package/dist/browser/daemon-client.d.ts.map +1 -1
  250. package/dist/browser/daemon-client.js +75 -15
  251. package/dist/browser/daemon-client.js.map +1 -1
  252. package/dist/browser/daemon.js +39 -15
  253. package/dist/browser/daemon.js.map +1 -1
  254. package/dist/browser/protocol.d.ts +1 -0
  255. package/dist/browser/protocol.d.ts.map +1 -1
  256. package/dist/browser/protocol.js +1 -0
  257. package/dist/browser/protocol.js.map +1 -1
  258. package/dist/cli.d.ts.map +1 -1
  259. package/dist/cli.js +6 -0
  260. package/dist/cli.js.map +1 -1
  261. package/dist/commands/agents.d.ts.map +1 -1
  262. package/dist/commands/agents.js +6 -43
  263. package/dist/commands/agents.js.map +1 -1
  264. package/dist/commands/approvals.d.ts.map +1 -1
  265. package/dist/commands/approvals.js +1 -37
  266. package/dist/commands/approvals.js.map +1 -1
  267. package/dist/commands/browser/adapter.d.ts.map +1 -1
  268. package/dist/commands/browser/adapter.js +17 -3
  269. package/dist/commands/browser/adapter.js.map +1 -1
  270. package/dist/commands/browser/index.d.ts.map +1 -1
  271. package/dist/commands/browser/index.js +7 -2
  272. package/dist/commands/browser/index.js.map +1 -1
  273. package/dist/commands/daemon.d.ts.map +1 -1
  274. package/dist/commands/daemon.js +7 -3
  275. package/dist/commands/daemon.js.map +1 -1
  276. package/dist/commands/describe.d.ts.map +1 -1
  277. package/dist/commands/describe.js +6 -7
  278. package/dist/commands/describe.js.map +1 -1
  279. package/dist/commands/dispatch.d.ts +1 -1
  280. package/dist/commands/dispatch.d.ts.map +1 -1
  281. package/dist/commands/dispatch.js +31 -5
  282. package/dist/commands/dispatch.js.map +1 -1
  283. package/dist/commands/mcp.d.ts +1 -1
  284. package/dist/commands/mcp.d.ts.map +1 -1
  285. package/dist/commands/mcp.js +10 -5
  286. package/dist/commands/mcp.js.map +1 -1
  287. package/dist/commands/patent-doctor.d.ts +48 -0
  288. package/dist/commands/patent-doctor.d.ts.map +1 -0
  289. package/dist/commands/patent-doctor.js +109 -0
  290. package/dist/commands/patent-doctor.js.map +1 -0
  291. package/dist/commands/patent.d.ts +78 -0
  292. package/dist/commands/patent.d.ts.map +1 -0
  293. package/dist/commands/patent.js +919 -0
  294. package/dist/commands/patent.js.map +1 -0
  295. package/dist/commands/social.d.ts +19 -0
  296. package/dist/commands/social.d.ts.map +1 -0
  297. package/dist/commands/social.js +236 -0
  298. package/dist/commands/social.js.map +1 -0
  299. package/dist/core/command-contract-lint.d.ts +10 -0
  300. package/dist/core/command-contract-lint.d.ts.map +1 -0
  301. package/dist/core/command-contract-lint.js +41 -0
  302. package/dist/core/command-contract-lint.js.map +1 -0
  303. package/dist/core/command-contract.d.ts +100 -0
  304. package/dist/core/command-contract.d.ts.map +1 -0
  305. package/dist/core/command-contract.js +174 -0
  306. package/dist/core/command-contract.js.map +1 -0
  307. package/dist/core/index.d.ts +2 -0
  308. package/dist/core/index.d.ts.map +1 -1
  309. package/dist/core/index.js +2 -0
  310. package/dist/core/index.js.map +1 -1
  311. package/dist/core/registry.d.ts +1 -1
  312. package/dist/core/registry.d.ts.map +1 -1
  313. package/dist/core/registry.js +11 -2
  314. package/dist/core/registry.js.map +1 -1
  315. package/dist/discovery/aliases.d.ts +2 -2
  316. package/dist/discovery/aliases.d.ts.map +1 -1
  317. package/dist/discovery/aliases.js +464 -6
  318. package/dist/discovery/aliases.js.map +1 -1
  319. package/dist/discovery/loader.d.ts.map +1 -1
  320. package/dist/discovery/loader.js +4 -0
  321. package/dist/discovery/loader.js.map +1 -1
  322. package/dist/discovery/search.d.ts.map +1 -1
  323. package/dist/discovery/search.js +147 -2
  324. package/dist/discovery/search.js.map +1 -1
  325. package/dist/engine/approval-presenter.d.ts +10 -0
  326. package/dist/engine/approval-presenter.d.ts.map +1 -0
  327. package/dist/engine/approval-presenter.js +45 -0
  328. package/dist/engine/approval-presenter.js.map +1 -0
  329. package/dist/engine/approval-store.d.ts +4 -0
  330. package/dist/engine/approval-store.d.ts.map +1 -1
  331. package/dist/engine/approval-store.js +85 -11
  332. package/dist/engine/approval-store.js.map +1 -1
  333. package/dist/engine/args.d.ts.map +1 -1
  334. package/dist/engine/args.js +18 -1
  335. package/dist/engine/args.js.map +1 -1
  336. package/dist/engine/artifact-validation.d.ts +29 -0
  337. package/dist/engine/artifact-validation.d.ts.map +1 -0
  338. package/dist/engine/artifact-validation.js +211 -0
  339. package/dist/engine/artifact-validation.js.map +1 -0
  340. package/dist/engine/auth/oauth2-cc.d.ts +67 -0
  341. package/dist/engine/auth/oauth2-cc.d.ts.map +1 -0
  342. package/dist/engine/auth/oauth2-cc.js +120 -0
  343. package/dist/engine/auth/oauth2-cc.js.map +1 -0
  344. package/dist/engine/browser/diagnostics.d.ts +38 -0
  345. package/dist/engine/browser/diagnostics.d.ts.map +1 -0
  346. package/dist/engine/browser/diagnostics.js +40 -0
  347. package/dist/engine/browser/diagnostics.js.map +1 -0
  348. package/dist/engine/cookies.d.ts +10 -0
  349. package/dist/engine/cookies.d.ts.map +1 -1
  350. package/dist/engine/cookies.js +64 -0
  351. package/dist/engine/cookies.js.map +1 -1
  352. package/dist/engine/download.d.ts +5 -0
  353. package/dist/engine/download.d.ts.map +1 -1
  354. package/dist/engine/download.js +11 -4
  355. package/dist/engine/download.js.map +1 -1
  356. package/dist/engine/executor.d.ts +1 -0
  357. package/dist/engine/executor.d.ts.map +1 -1
  358. package/dist/engine/executor.js +25 -0
  359. package/dist/engine/executor.js.map +1 -1
  360. package/dist/engine/framework.d.ts +5 -5
  361. package/dist/engine/framework.js +5 -5
  362. package/dist/engine/harden.d.ts +1 -1
  363. package/dist/engine/harden.js +1 -1
  364. package/dist/engine/invoke.d.ts +1 -0
  365. package/dist/engine/invoke.d.ts.map +1 -1
  366. package/dist/engine/invoke.js +1 -0
  367. package/dist/engine/invoke.js.map +1 -1
  368. package/dist/engine/kernel/errors.d.ts +11 -0
  369. package/dist/engine/kernel/errors.d.ts.map +1 -0
  370. package/dist/engine/kernel/errors.js +15 -0
  371. package/dist/engine/kernel/errors.js.map +1 -0
  372. package/dist/engine/kernel/execute.d.ts +7 -18
  373. package/dist/engine/kernel/execute.d.ts.map +1 -1
  374. package/dist/engine/kernel/execute.js +25 -410
  375. package/dist/engine/kernel/execute.js.map +1 -1
  376. package/dist/engine/kernel/stages.d.ts +44 -0
  377. package/dist/engine/kernel/stages.d.ts.map +1 -0
  378. package/dist/engine/kernel/stages.js +429 -0
  379. package/dist/engine/kernel/stages.js.map +1 -0
  380. package/dist/engine/kernel/types.d.ts +21 -1
  381. package/dist/engine/kernel/types.d.ts.map +1 -1
  382. package/dist/engine/normalizer/patent-envelope.d.ts +61 -0
  383. package/dist/engine/normalizer/patent-envelope.d.ts.map +1 -0
  384. package/dist/engine/normalizer/patent-envelope.js +132 -0
  385. package/dist/engine/normalizer/patent-envelope.js.map +1 -0
  386. package/dist/engine/research.d.ts +5 -7
  387. package/dist/engine/research.d.ts.map +1 -1
  388. package/dist/engine/research.js +6 -9
  389. package/dist/engine/research.js.map +1 -1
  390. package/dist/engine/steps/browser-helpers.d.ts +2 -2
  391. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  392. package/dist/engine/steps/browser-helpers.js +39 -16
  393. package/dist/engine/steps/browser-helpers.js.map +1 -1
  394. package/dist/engine/steps/download.d.ts +2 -0
  395. package/dist/engine/steps/download.d.ts.map +1 -1
  396. package/dist/engine/steps/download.js +13 -7
  397. package/dist/engine/steps/download.js.map +1 -1
  398. package/dist/engine/steps/index.d.ts +2 -0
  399. package/dist/engine/steps/index.d.ts.map +1 -1
  400. package/dist/engine/steps/index.js +2 -0
  401. package/dist/engine/steps/index.js.map +1 -1
  402. package/dist/engine/steps/oauth2-token.d.ts +41 -0
  403. package/dist/engine/steps/oauth2-token.d.ts.map +1 -0
  404. package/dist/engine/steps/oauth2-token.js +115 -0
  405. package/dist/engine/steps/oauth2-token.js.map +1 -0
  406. package/dist/engine/steps/select-xml.d.ts +34 -0
  407. package/dist/engine/steps/select-xml.d.ts.map +1 -0
  408. package/dist/engine/steps/select-xml.js +222 -0
  409. package/dist/engine/steps/select-xml.js.map +1 -0
  410. package/dist/engine/template.d.ts.map +1 -1
  411. package/dist/engine/template.js +7 -0
  412. package/dist/engine/template.js.map +1 -1
  413. package/dist/engine/transport/mcp-browser.d.ts +128 -0
  414. package/dist/engine/transport/mcp-browser.d.ts.map +1 -0
  415. package/dist/engine/transport/mcp-browser.js +120 -0
  416. package/dist/engine/transport/mcp-browser.js.map +1 -0
  417. package/dist/fast-path/handlers/approvals.d.ts +11 -0
  418. package/dist/fast-path/handlers/approvals.d.ts.map +1 -0
  419. package/dist/fast-path/handlers/approvals.js +136 -0
  420. package/dist/fast-path/handlers/approvals.js.map +1 -0
  421. package/dist/fast-path/manifest.d.ts +1 -0
  422. package/dist/fast-path/manifest.d.ts.map +1 -1
  423. package/dist/fast-path/manifest.js.map +1 -1
  424. package/dist/fast-path/render.js +1 -1
  425. package/dist/fast-path/render.js.map +1 -1
  426. package/dist/fast-path.d.ts.map +1 -1
  427. package/dist/fast-path.js +3 -0
  428. package/dist/fast-path.js.map +1 -1
  429. package/dist/index.d.ts +23 -0
  430. package/dist/index.d.ts.map +1 -0
  431. package/dist/index.js +38 -0
  432. package/dist/index.js.map +1 -0
  433. package/dist/manifest-compact.txt +5 -5
  434. package/dist/manifest-search.json +1 -1
  435. package/dist/manifest.json +5189 -55
  436. package/dist/mcp/handler.d.ts.map +1 -1
  437. package/dist/mcp/handler.js +11 -1
  438. package/dist/mcp/handler.js.map +1 -1
  439. package/dist/mcp/server.d.ts +1 -1
  440. package/dist/mcp/server.js +1 -1
  441. package/dist/mcp/tools.d.ts.map +1 -1
  442. package/dist/mcp/tools.js +18 -10
  443. package/dist/mcp/tools.js.map +1 -1
  444. package/dist/output/auth-guidance.d.ts +14 -0
  445. package/dist/output/auth-guidance.d.ts.map +1 -0
  446. package/dist/output/auth-guidance.js +50 -0
  447. package/dist/output/auth-guidance.js.map +1 -0
  448. package/dist/output/error-map.d.ts +1 -1
  449. package/dist/output/error-map.d.ts.map +1 -1
  450. package/dist/output/error-map.js +29 -5
  451. package/dist/output/error-map.js.map +1 -1
  452. package/dist/output/next-actions.d.ts.map +1 -1
  453. package/dist/output/next-actions.js +19 -3
  454. package/dist/output/next-actions.js.map +1 -1
  455. package/dist/registry.d.ts +18 -1
  456. package/dist/registry.d.ts.map +1 -1
  457. package/dist/registry.js +7 -1
  458. package/dist/registry.js.map +1 -1
  459. package/dist/social/browser-errors.d.ts +13 -0
  460. package/dist/social/browser-errors.d.ts.map +1 -0
  461. package/dist/social/browser-errors.js +36 -0
  462. package/dist/social/browser-errors.js.map +1 -0
  463. package/dist/social/capabilities.d.ts +29 -0
  464. package/dist/social/capabilities.d.ts.map +1 -0
  465. package/dist/social/capabilities.js +448 -0
  466. package/dist/social/capabilities.js.map +1 -0
  467. package/dist/social/comments.d.ts +26 -0
  468. package/dist/social/comments.d.ts.map +1 -0
  469. package/dist/social/comments.js +97 -0
  470. package/dist/social/comments.js.map +1 -0
  471. package/dist/social/video-text.d.ts +27 -0
  472. package/dist/social/video-text.d.ts.map +1 -0
  473. package/dist/social/video-text.js +140 -0
  474. package/dist/social/video-text.js.map +1 -0
  475. package/dist/types/patent.d.ts +160 -0
  476. package/dist/types/patent.d.ts.map +1 -0
  477. package/dist/types/patent.js +16 -0
  478. package/dist/types/patent.js.map +1 -0
  479. package/dist/types.d.ts +12 -0
  480. package/dist/types.d.ts.map +1 -1
  481. package/dist/types.js.map +1 -1
  482. package/package.json +10 -5
  483. package/server.json +3 -3
  484. package/skills/unicli/SKILL.md +1 -1
  485. package/skills/unicli-claude-code/SKILL.md +1 -1
  486. package/skills/unicli-hermes/SKILL.md +1 -1
  487. package/src/adapters/anilist/web.test.ts +93 -0
  488. package/src/adapters/anilist/web.ts +341 -0
  489. package/src/adapters/arxiv/download.yaml +53 -0
  490. package/src/adapters/bangumi/web.test.ts +109 -0
  491. package/src/adapters/bangumi/web.ts +295 -0
  492. package/src/adapters/bilibili/comments-tree.test.ts +41 -0
  493. package/src/adapters/bilibili/comments.ts +78 -4
  494. package/src/adapters/bilibili/compat.ts +5 -2
  495. package/src/adapters/bilibili/download.ts +7 -4
  496. package/src/adapters/bilibili/wbi.ts +6 -3
  497. package/src/adapters/brave/search.yaml +53 -0
  498. package/src/adapters/cipo/_shared.ts +98 -0
  499. package/src/adapters/cipo/get.ts +188 -0
  500. package/src/adapters/cipo/legal-status.ts +148 -0
  501. package/src/adapters/cipo/search.ts +195 -0
  502. package/src/adapters/cnipa/_shared.ts +138 -0
  503. package/src/adapters/cnipa/get.ts +199 -0
  504. package/src/adapters/cnipa/legal-status.ts +162 -0
  505. package/src/adapters/cnipa/search.ts +229 -0
  506. package/src/adapters/danbooru/artists.yaml +44 -0
  507. package/src/adapters/danbooru/comments.yaml +45 -0
  508. package/src/adapters/danbooru/detail.yaml +78 -0
  509. package/src/adapters/danbooru/download.yaml +51 -0
  510. package/src/adapters/danbooru/pools.yaml +56 -0
  511. package/src/adapters/danbooru/search.yaml +69 -0
  512. package/src/adapters/danbooru/tags.yaml +42 -0
  513. package/src/adapters/danbooru/wiki.yaml +44 -0
  514. package/src/adapters/dlsite/web.test.ts +132 -0
  515. package/src/adapters/dlsite/web.ts +557 -0
  516. package/src/adapters/dpma/get.yaml +67 -0
  517. package/src/adapters/dpma/search.yaml +77 -0
  518. package/src/adapters/duckduckgo/search.yaml +54 -0
  519. package/src/adapters/duckduckgo/suggest.yaml +52 -0
  520. package/src/adapters/ehentai/web.test.ts +157 -0
  521. package/src/adapters/ehentai/web.ts +750 -0
  522. package/src/adapters/epo/family.yaml +69 -0
  523. package/src/adapters/epo/get.yaml +74 -0
  524. package/src/adapters/epo/legal-status.yaml +63 -0
  525. package/src/adapters/epo/search.yaml +84 -0
  526. package/src/adapters/espacenet/_shared.ts +98 -0
  527. package/src/adapters/espacenet/family.ts +161 -0
  528. package/src/adapters/espacenet/get.ts +185 -0
  529. package/src/adapters/espacenet/legal-status.ts +151 -0
  530. package/src/adapters/espacenet/search.ts +229 -0
  531. package/src/adapters/facebook/subtitles.ts +44 -0
  532. package/src/adapters/fips/_shared.ts +109 -0
  533. package/src/adapters/fips/get.ts +186 -0
  534. package/src/adapters/fips/search.ts +195 -0
  535. package/src/adapters/freepatentsonline-web/_shared.ts +273 -0
  536. package/src/adapters/freepatentsonline-web/get.ts +144 -0
  537. package/src/adapters/freepatentsonline-web/search.ts +170 -0
  538. package/src/adapters/google-patents-bq/prior-art.yaml +80 -0
  539. package/src/adapters/google-patents-bq/search.yaml +97 -0
  540. package/src/adapters/google-patents-web/_shared.ts +242 -0
  541. package/src/adapters/google-patents-web/get.ts +224 -0
  542. package/src/adapters/google-patents-web/search.ts +196 -0
  543. package/src/adapters/inpi-br/_shared.ts +98 -0
  544. package/src/adapters/inpi-br/get.ts +193 -0
  545. package/src/adapters/inpi-br/search.ts +206 -0
  546. package/src/adapters/inpi-fr/get.yaml +62 -0
  547. package/src/adapters/inpi-fr/search.yaml +74 -0
  548. package/src/adapters/instagram/subtitles.ts +44 -0
  549. package/src/adapters/ipaustralia/get.yaml +67 -0
  550. package/src/adapters/ipaustralia/search.yaml +74 -0
  551. package/src/adapters/jikan/web.test.ts +50 -0
  552. package/src/adapters/jikan/web.ts +177 -0
  553. package/src/adapters/jpo/get.yaml +63 -0
  554. package/src/adapters/jpo/search.yaml +76 -0
  555. package/src/adapters/kipris/get.yaml +69 -0
  556. package/src/adapters/kipris/legal-status.yaml +58 -0
  557. package/src/adapters/kipris/search.yaml +79 -0
  558. package/src/adapters/kitsu/web.test.ts +29 -0
  559. package/src/adapters/kitsu/web.ts +109 -0
  560. package/src/adapters/konachan/detail.yaml +62 -0
  561. package/src/adapters/konachan/download.yaml +55 -0
  562. package/src/adapters/konachan/search.yaml +65 -0
  563. package/src/adapters/konachan/tags.yaml +40 -0
  564. package/src/adapters/lens/get.yaml +64 -0
  565. package/src/adapters/lens/search.yaml +82 -0
  566. package/src/adapters/mangadex/web.test.ts +46 -0
  567. package/src/adapters/mangadex/web.ts +210 -0
  568. package/src/adapters/mastodon/statuses.test.ts +82 -0
  569. package/src/adapters/mastodon/statuses.ts +208 -0
  570. package/src/adapters/moegirl/web.test.ts +87 -0
  571. package/src/adapters/moegirl/web.ts +343 -0
  572. package/src/adapters/patsnap/get.yaml +65 -0
  573. package/src/adapters/patsnap/search.yaml +77 -0
  574. package/src/adapters/pdf/read.yaml +49 -0
  575. package/src/adapters/pixiv/download.yaml +15 -2
  576. package/src/adapters/pqai/prior-art.yaml +59 -0
  577. package/src/adapters/pqai/search.yaml +60 -0
  578. package/src/adapters/reddit/comments-tree.test.ts +79 -0
  579. package/src/adapters/reddit/comments.ts +159 -0
  580. package/src/adapters/safebooru/detail.yaml +63 -0
  581. package/src/adapters/safebooru/download.yaml +58 -0
  582. package/src/adapters/safebooru/search.yaml +69 -0
  583. package/src/adapters/safebooru/web.test.ts +60 -0
  584. package/src/adapters/safebooru/web.ts +130 -0
  585. package/src/adapters/threads/post.test.ts +64 -0
  586. package/src/adapters/threads/post.ts +366 -0
  587. package/src/adapters/threads/user.yaml +73 -0
  588. package/src/adapters/tiktok/subtitles.ts +44 -0
  589. package/src/adapters/twitter/accept.ts +5 -2
  590. package/src/adapters/twitter/browser-fallback.ts +138 -0
  591. package/src/adapters/twitter/browser-state.ts +74 -0
  592. package/src/adapters/twitter/client.ts +51 -21
  593. package/src/adapters/twitter/reply-dm.ts +5 -2
  594. package/src/adapters/twitter/reply.ts +1 -0
  595. package/src/adapters/twitter/search.ts +12 -38
  596. package/src/adapters/twitter/thread.test.ts +43 -0
  597. package/src/adapters/twitter/thread.ts +44 -2
  598. package/src/adapters/twitter/trending.ts +14 -95
  599. package/src/adapters/ukipo/info.yaml +43 -0
  600. package/src/adapters/uspto/get.yaml +67 -0
  601. package/src/adapters/uspto/legal-status.yaml +58 -0
  602. package/src/adapters/uspto/search.yaml +88 -0
  603. package/src/adapters/vndb/web.test.ts +86 -0
  604. package/src/adapters/vndb/web.ts +393 -0
  605. package/src/adapters/wipo-patentscope/info.yaml +43 -0
  606. package/src/adapters/xiaohongshu/browser-state.ts +95 -0
  607. package/src/adapters/xiaohongshu/comments.ts +29 -6
  608. package/src/adapters/xiaohongshu/download.ts +60 -11
  609. package/src/adapters/xiaohongshu/search.ts +18 -6
  610. package/src/adapters/xiaohongshu/trending.ts +112 -0
  611. package/src/adapters/yahoo/search.yaml +52 -0
  612. package/src/adapters/yandere/detail.yaml +61 -0
  613. package/src/adapters/yandere/download.yaml +56 -0
  614. package/src/adapters/yandere/search.yaml +67 -0
  615. package/src/adapters/yandere/tags.yaml +41 -0
  616. package/src/adapters/youtube/comments-microformat.test.ts +35 -0
  617. package/src/adapters/youtube/comments-tree.test.ts +74 -0
  618. package/src/adapters/youtube/comments.ts +166 -12
  619. package/src/adapters/youtube/subtitles.ts +44 -0
  620. package/src/adapters/yt-dlp/subtitles.ts +43 -0
  621. package/src/adapters/zhihu/answer-detail.test.ts +83 -0
  622. package/src/adapters/zhihu/answer-detail.ts +275 -0
  623. package/src/adapters/zhihu/comment-tree.test.ts +57 -0
  624. package/src/adapters/zhihu/comment.ts +186 -0
  625. package/src/adapters/zhihu/recommend.test.ts +65 -0
  626. package/src/adapters/zhihu/recommend.ts +207 -0
@@ -0,0 +1,97 @@
1
+ # Google Patents Public Datasets via BigQuery REST.
2
+ #
3
+ # verification_status: blocked-by-key
4
+ #
5
+ # The dataset `patents-public-data.patents.publications` is free to query but
6
+ # requires a Google Cloud project with billing enabled (queries are billed at
7
+ # the standard BigQuery rate; the 1 TB / month free tier covers exploratory
8
+ # work). Auth path is OAuth2 — read $GCLOUD_ACCESS_TOKEN first; the adapter
9
+ # self-repair sequence asks the user to run `gcloud auth print-access-token`
10
+ # and re-export the value.
11
+ #
12
+ # The query template uses standard SQL against the public publications table.
13
+ # `args.query` is interpolated as a substring match on title/abstract — adapt
14
+ # the template for richer CQL when needed.
15
+ site: google-patents-bq
16
+ name: search
17
+ description: BigQuery search over the Google Patents Public Datasets corpus
18
+ domain: bigquery.googleapis.com
19
+ type: web-api
20
+ strategy: header
21
+ lint_listing_detail: skip
22
+
23
+ args:
24
+ query:
25
+ type: str
26
+ required: true
27
+ positional: true
28
+ description: Substring matched against title and abstract (case-insensitive)
29
+ limit:
30
+ type: int
31
+ default: 20
32
+ project:
33
+ type: str
34
+ default: ""
35
+ description: GCP project ID — falls back to $GCLOUD_PROJECT
36
+
37
+ pipeline:
38
+ - fetch:
39
+ url: "https://bigquery.googleapis.com/bigquery/v2/projects/${{ args.project || env.GCLOUD_PROJECT || '' }}/queries"
40
+ method: POST
41
+ headers:
42
+ Authorization: "Bearer ${{ env.GCLOUD_ACCESS_TOKEN || '' }}"
43
+ Content-Type: application/json
44
+ body:
45
+ query: |-
46
+ SELECT
47
+ publication_number,
48
+ ANY_VALUE(country_code) AS country_code,
49
+ ANY_VALUE(kind_code) AS kind_code,
50
+ ANY_VALUE(title_localized)[OFFSET(0)].text AS title,
51
+ ANY_VALUE(abstract_localized)[OFFSET(0)].text AS abstract,
52
+ ANY_VALUE(publication_date) AS publication_date,
53
+ ANY_VALUE(filing_date) AS filing_date,
54
+ ANY_VALUE(grant_date) AS grant_date,
55
+ ANY_VALUE(priority_date) AS priority_date,
56
+ ANY_VALUE(application_number) AS application_number,
57
+ ANY_VALUE(family_id) AS family_id,
58
+ TO_JSON_STRING(ANY_VALUE(inventor_harmonized)) AS inventors,
59
+ TO_JSON_STRING(ANY_VALUE(assignee_harmonized)) AS assignees,
60
+ TO_JSON_STRING(ANY_VALUE(cpc)) AS cpc,
61
+ TO_JSON_STRING(ANY_VALUE(ipc)) AS ipc,
62
+ ANY_VALUE(claims_localized_html)[OFFSET(0)].text AS claims_text
63
+ FROM `patents-public-data.patents.publications`
64
+ WHERE LOWER(title_localized[OFFSET(0)].text) LIKE LOWER('%${{ args.query }}%')
65
+ OR LOWER(abstract_localized[OFFSET(0)].text) LIKE LOWER('%${{ args.query }}%')
66
+ GROUP BY publication_number
67
+ LIMIT ${{ args.limit }}
68
+ useLegacySql: false
69
+
70
+ - select: rows
71
+
72
+ - map:
73
+ publication_number: "${{ item.f[0].v }}"
74
+ kind_code: "${{ item.f[2].v || '' }}"
75
+ title: "${{ item.f[3].v }}"
76
+ abstract: "${{ item.f[4].v }}"
77
+ publication_date: "${{ item.f[5].v }}"
78
+ filing_date: "${{ item.f[6].v }}"
79
+ grant_date: "${{ item.f[7].v }}"
80
+ priority_date: "${{ item.f[8].v }}"
81
+ application_number: "${{ item.f[9].v }}"
82
+ family_id: "${{ item.f[10].v }}"
83
+ inventors: "${{ JSON.stringify((function(){ try { var arr = JSON.parse(item.f[11].v || '[]'); return Array.isArray(arr) ? arr.map(i => ({ name: i.name || i, country: i.country_code || undefined })) : []; } catch(e) { return []; } })()) }}"
84
+ assignees: "${{ JSON.stringify((function(){ try { var arr = JSON.parse(item.f[12].v || '[]'); return Array.isArray(arr) ? arr.map(a => ({ name: a.name || a, country: a.country_code || undefined })) : []; } catch(e) { return []; } })()) }}"
85
+ classifications: "${{ JSON.stringify((function(){ var out = []; try { var cpc = JSON.parse(item.f[13].v || '[]'); if(Array.isArray(cpc)){ for (var i=0;i<cpc.length;i++) out.push({ scheme: 'cpc', code: cpc[i].code || cpc[i] }); } } catch(e){} try { var ipc = JSON.parse(item.f[14].v || '[]'); if(Array.isArray(ipc)){ for (var j=0;j<ipc.length;j++) out.push({ scheme: 'ipc', code: ipc[j].code || ipc[j] }); } } catch(e){} return out.filter(x => x.code); })()) }}"
86
+ source_adapter: google-patents-bq
87
+ source_url: "${{ 'https://patents.google.com/patent/' + (item.f[0].v || '') }}"
88
+ retrieved_at: "${{ now }}"
89
+
90
+ columns: [publication_number, title, publication_date, source_adapter]
91
+
92
+ capabilities: ["http.fetch", "patent.search"]
93
+ minimum_capability: http.fetch
94
+ trust: public
95
+ confidentiality: public
96
+ quarantine: false
97
+ schema_version: v2
@@ -0,0 +1,242 @@
1
+ /**
2
+ * @owner src::adapters::google-patents-web::_shared
3
+ * @does Shared HTTP helpers and types for the KEYLESS Google Patents web adapter — distinct from the BigQuery-backed google-patents-bq adapter (which requires a billed GCP project). This adapter uses the public XHR endpoint that drives patents.google.com and the SSR /patent/<id>/en bibliography page, both of which are reachable with only a real-browser User-Agent header.
4
+ * @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
5
+ * @feeds src/adapters/google-patents-web/search.yaml, src/adapters/google-patents-web/get.ts
6
+ * @breaks throws GooglePatentsHttpError when the endpoint returns non-2xx or unparseable JSON; callers surface PATENT_API_DEPRECATED to the meta-command
7
+ * @invariants every outbound request carries a real-browser User-Agent — Google rejects bare `node-fetch`/`python-requests`; the @keyless-best-effort verification tag is emitted in adapter file headers
8
+ * @side-effects HTTPS egress to patents.google.com only; no env reads, no cookies
9
+ * @perf single request per call; XHR responses are ~40-100 KB
10
+ * @concurrency safe — pure functions plus stateless `fetch`
11
+ * @test covered transitively via tests/unit/adapters/google-patents-web/*.test.ts (none yet — adapters ship with live verification proof in docs/skills/patent-cookbook.md)
12
+ * @stability experimental — Google does not publish a stability contract for this XHR
13
+ * @since 2026-05-18
14
+ * @verification keyless-best-effort
15
+ */
16
+
17
+ import type { PatentRecord } from "../../types/patent.js";
18
+
19
+ /**
20
+ * Local verification-status alias for the keyless-web adapter family.
21
+ *
22
+ * Distinct from the canonical `PatentVerificationStatus` union in
23
+ * `src/types/patent.ts` — adding a new variant there is owned by another
24
+ * agent in this batch, so we expose it as a *local* string-literal type
25
+ * alias the file headers can advertise without forcing a cross-cutting
26
+ * type change. The meta-command does not branch on this value; it is
27
+ * documentation-grade only.
28
+ */
29
+ export type KeylessBestEffortStatus = "keyless-best-effort";
30
+ export const KEYLESS_BEST_EFFORT: KeylessBestEffortStatus =
31
+ "keyless-best-effort";
32
+
33
+ /**
34
+ * Real-browser User-Agent string. Google's XHR endpoint returns 403 for the
35
+ * default `node/undici` UA; a Chrome string fixes that. Mirror the version
36
+ * Chrome currently ships rather than freezing on an old number so the header
37
+ * stays plausible if Google starts UA-version-gating in future.
38
+ */
39
+ export const GOOGLE_PATENTS_UA =
40
+ "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";
41
+
42
+ export class GooglePatentsHttpError extends Error {
43
+ constructor(
44
+ public readonly status: number,
45
+ public readonly url: string,
46
+ message: string,
47
+ ) {
48
+ super(message);
49
+ this.name = "GooglePatentsHttpError";
50
+ }
51
+ }
52
+
53
+ /**
54
+ * GET <url> with a real-browser UA. Returns parsed JSON; throws
55
+ * GooglePatentsHttpError on non-2xx or JSON parse failure.
56
+ */
57
+ export async function fetchGooglePatentsJson<T>(url: string): Promise<T> {
58
+ const response = await fetch(url, {
59
+ method: "GET",
60
+ headers: {
61
+ "User-Agent": GOOGLE_PATENTS_UA,
62
+ Accept: "application/json",
63
+ },
64
+ });
65
+ if (!response.ok) {
66
+ throw new GooglePatentsHttpError(
67
+ response.status,
68
+ url,
69
+ `Google Patents XHR returned HTTP ${response.status}`,
70
+ );
71
+ }
72
+ let parsed: unknown;
73
+ try {
74
+ parsed = await response.json();
75
+ } catch (err) {
76
+ throw new GooglePatentsHttpError(
77
+ response.status,
78
+ url,
79
+ `Google Patents XHR returned non-JSON body: ${(err as Error).message}`,
80
+ );
81
+ }
82
+ return parsed as T;
83
+ }
84
+
85
+ /**
86
+ * GET <url> with a real-browser UA, return raw HTML text. Throws
87
+ * GooglePatentsHttpError on non-2xx.
88
+ */
89
+ export async function fetchGooglePatentsHtml(url: string): Promise<string> {
90
+ const response = await fetch(url, {
91
+ method: "GET",
92
+ headers: {
93
+ "User-Agent": GOOGLE_PATENTS_UA,
94
+ Accept: "text/html,application/xhtml+xml",
95
+ },
96
+ });
97
+ if (!response.ok) {
98
+ throw new GooglePatentsHttpError(
99
+ response.status,
100
+ url,
101
+ `Google Patents detail page returned HTTP ${response.status}`,
102
+ );
103
+ }
104
+ return await response.text();
105
+ }
106
+
107
+ /**
108
+ * Build the public XHR query URL. Accepts a plain free-text query string and
109
+ * an optional limit (`num` parameter) and earliest-publication-year filter.
110
+ *
111
+ * The XHR endpoint expects a percent-encoded *inner* query string under the
112
+ * `url` parameter — the outer query is `?url=q%3Dfoo&exp=`. We percent-encode
113
+ * the inner once.
114
+ */
115
+ export function buildGooglePatentsXhrUrl(
116
+ query: string,
117
+ limit?: number,
118
+ sinceYear?: string,
119
+ ): string {
120
+ const cleaned = query.trim();
121
+ let inner = `q=${cleaned.replace(/\s+/g, "+")}`;
122
+ if (typeof limit === "number" && Number.isFinite(limit) && limit > 0) {
123
+ inner += `&num=${Math.min(100, Math.max(1, Math.floor(limit)))}`;
124
+ }
125
+ if (sinceYear && /^\d{4}$/.test(sinceYear)) {
126
+ inner += `&after=publication:${sinceYear}0101`;
127
+ }
128
+ return `https://patents.google.com/xhr/query?url=${encodeURIComponent(inner)}&exp=`;
129
+ }
130
+
131
+ /**
132
+ * Build the public detail page URL for a given publication number. Google
133
+ * accepts the segmented form `US-11741188-B2` and the compact form
134
+ * `US11741188B2`; we send the compact form to keep the URL short.
135
+ */
136
+ export function buildGooglePatentsDetailUrl(pubNo: string): string {
137
+ const compact = pubNo.replace(/-/g, "").toUpperCase();
138
+ return `https://patents.google.com/patent/${encodeURIComponent(compact)}/en`;
139
+ }
140
+
141
+ /**
142
+ * XHR response shape. We intentionally type only the fields we read —
143
+ * Google ships many more (figure thumbnails, family metadata, language) that
144
+ * we either ignore or carry through verbatim in `raw`.
145
+ */
146
+ export interface GoogleXhrResultRow {
147
+ id: string;
148
+ rank?: number;
149
+ patent?: {
150
+ title?: string;
151
+ snippet?: string;
152
+ publication_number?: string;
153
+ inventor?: string;
154
+ assignee?: string;
155
+ filing_date?: string;
156
+ publication_date?: string;
157
+ grant_date?: string;
158
+ priority_date?: string;
159
+ language?: string;
160
+ };
161
+ }
162
+
163
+ export interface GoogleXhrResponse {
164
+ results?: {
165
+ cluster?: Array<{ result?: GoogleXhrResultRow[] }>;
166
+ total_num_results?: number;
167
+ };
168
+ }
169
+
170
+ /**
171
+ * Flatten the nested `results.cluster[].result[]` into a single array, in
172
+ * server-supplied order.
173
+ */
174
+ export function flattenGoogleXhrResults(
175
+ body: GoogleXhrResponse,
176
+ ): GoogleXhrResultRow[] {
177
+ const clusters = body.results?.cluster ?? [];
178
+ const out: GoogleXhrResultRow[] = [];
179
+ for (const cluster of clusters) {
180
+ const rows = cluster.result ?? [];
181
+ for (const row of rows) out.push(row);
182
+ }
183
+ return out;
184
+ }
185
+
186
+ /**
187
+ * Project a single XHR row to the upstream-facing partial-PatentRecord
188
+ * shape. Empty / missing fields are left undefined rather than synthesised.
189
+ * Snippets contain HTML markup (e.g. `<b>` tags) which we strip.
190
+ */
191
+ export function projectGoogleRowToRecord(
192
+ row: GoogleXhrResultRow,
193
+ sourceUrl: string,
194
+ ): Partial<PatentRecord> & {
195
+ publication_number: string;
196
+ source_adapter: string;
197
+ } {
198
+ const patent = row.patent ?? {};
199
+ const pubNo =
200
+ (typeof patent.publication_number === "string" &&
201
+ patent.publication_number) ||
202
+ deriveCanonicalFromId(row.id);
203
+ const cleanSnippet = patent.snippet ? stripHtml(patent.snippet) : undefined;
204
+ return {
205
+ publication_number: pubNo,
206
+ title: patent.title ? patent.title.trim() : undefined,
207
+ abstract: cleanSnippet,
208
+ inventors: patent.inventor ? [{ name: patent.inventor.trim() }] : undefined,
209
+ assignees: patent.assignee ? [{ name: patent.assignee.trim() }] : undefined,
210
+ filing_date: patent.filing_date || undefined,
211
+ publication_date: patent.publication_date || undefined,
212
+ grant_date: patent.grant_date || undefined,
213
+ priority_date: patent.priority_date || undefined,
214
+ source_adapter: "google-patents-web",
215
+ source_url: sourceUrl,
216
+ };
217
+ }
218
+
219
+ /** `patent/US11741188B2/en` → `US11741188B2`. */
220
+ function deriveCanonicalFromId(id: string): string {
221
+ const match = /patent\/([^/]+)/.exec(id);
222
+ return match ? match[1] : id;
223
+ }
224
+
225
+ const TAG_RE = /<[^>]+>/g;
226
+ const ENTITY_MAP: Record<string, string> = {
227
+ "&amp;": "&",
228
+ "&lt;": "<",
229
+ "&gt;": ">",
230
+ "&quot;": '"',
231
+ "&#39;": "'",
232
+ "&hellip;": "…",
233
+ "&nbsp;": " ",
234
+ };
235
+
236
+ export function stripHtml(input: string): string {
237
+ return input
238
+ .replace(TAG_RE, "")
239
+ .replace(/&(?:amp|lt|gt|quot|#39|hellip|nbsp);/g, (m) => ENTITY_MAP[m] ?? m)
240
+ .replace(/\s+/g, " ")
241
+ .trim();
242
+ }
@@ -0,0 +1,224 @@
1
+ /**
2
+ * @owner src::adapters::google-patents-web::get
3
+ * @does Keyless single-publication detail fetch — parses the SSR meta-tag and `<abstract>` block on https://patents.google.com/patent/<id>/en using regex projection (no DOM, no Chrome).
4
+ * @needs src/adapters/google-patents-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
5
+ * @feeds src/commands/patent.ts (capability tag patent.get)
6
+ * @breaks PATENT_NOT_FOUND when the detail page returns 200 but carries no DC.title; PATENT_INVALID_NUMBER for empty input; PATENT_API_DEPRECATED on non-2xx HTTP
7
+ * @invariants output is a single canonical PatentRecord; abstract whitespace is normalised; HTML entities decoded; source_url is the literal page we hit
8
+ * @side-effects HTTPS egress to patents.google.com only
9
+ * @perf single page load (~350 KB); regex parse is linear in document length
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
+
17
+ import { cli, Strategy } from "../../registry.js";
18
+ import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
19
+ import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
20
+ import {
21
+ GooglePatentsHttpError,
22
+ buildGooglePatentsDetailUrl,
23
+ fetchGooglePatentsHtml,
24
+ stripHtml,
25
+ } from "./_shared.js";
26
+
27
+ const ADAPTER_PATH = "src/adapters/google-patents-web/get.ts";
28
+
29
+ interface DetailPageFields {
30
+ title?: string;
31
+ abstract?: string;
32
+ inventors: string[];
33
+ assignees: string[];
34
+ filing_date?: string;
35
+ publication_date?: string;
36
+ application_number?: string;
37
+ }
38
+
39
+ function extractMetaContent(html: string, name: string): string[] {
40
+ const out: string[] = [];
41
+ const re = new RegExp(
42
+ `<meta[^>]+name=["']${name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}["'][^>]*content=["']([^"']*)["']`,
43
+ "gi",
44
+ );
45
+ let match: RegExpExecArray | null;
46
+ while ((match = re.exec(html)) !== null) {
47
+ if (match[1]) out.push(match[1].trim());
48
+ }
49
+ return out;
50
+ }
51
+
52
+ /**
53
+ * Parse the Google Patents detail HTML into the subset of fields we surface
54
+ * on PatentRecord. The DC.* meta tags are the documented machine-readable
55
+ * surface (Dublin Core), and citation_* mirrors what Google Scholar's
56
+ * indexing crawler consumes.
57
+ */
58
+ export function parseGooglePatentsDetail(html: string): DetailPageFields {
59
+ const titleRaw =
60
+ extractMetaContent(html, "DC.title")[0] ??
61
+ extractMetaContent(html, "citation_title")[0];
62
+ const dcDates = extractMetaContent(html, "DC.date");
63
+ const dcContributors = extractMetaContent(html, "DC.contributor");
64
+
65
+ // DC.date is emitted twice on Google Patents: filing then publication.
66
+ const filingDate = dcDates[0];
67
+ const publicationDate = dcDates[1];
68
+
69
+ // DC.contributor mixes inventors (personal names) and assignees (org
70
+ // names). Google's convention is inventors first, the assignee last —
71
+ // approximate that, with the last-item-is-assignee heuristic.
72
+ const inventors: string[] = [];
73
+ let assignee: string | undefined;
74
+ if (dcContributors.length > 0) {
75
+ assignee = dcContributors[dcContributors.length - 1];
76
+ for (let i = 0; i < dcContributors.length - 1; i++) {
77
+ inventors.push(dcContributors[i]);
78
+ }
79
+ }
80
+
81
+ const applicationNumber = extractMetaContent(
82
+ html,
83
+ "citation_patent_application_number",
84
+ )[0];
85
+
86
+ // The bibliographic abstract sits in a single `<abstract …>...</abstract>`
87
+ // element. Use a non-greedy match because some pages embed multiple
88
+ // localised abstracts; we want the first.
89
+ let abstractText: string | undefined;
90
+ const abstractMatch = /<abstract\b[^>]*>([\s\S]*?)<\/abstract>/i.exec(html);
91
+ if (abstractMatch) {
92
+ const cleaned = stripHtml(abstractMatch[1]);
93
+ if (cleaned.length > 0) abstractText = cleaned;
94
+ }
95
+
96
+ return {
97
+ title: titleRaw ? titleRaw.trim() : undefined,
98
+ abstract: abstractText,
99
+ inventors,
100
+ assignees: assignee ? [assignee] : [],
101
+ filing_date: filingDate,
102
+ publication_date: publicationDate,
103
+ application_number: applicationNumber,
104
+ };
105
+ }
106
+
107
+ export async function runGooglePatentsWebGet(kwargs: {
108
+ publication_number?: unknown;
109
+ }): Promise<unknown[]> {
110
+ const raw = String(kwargs.publication_number ?? "").trim();
111
+ if (raw.length === 0) {
112
+ return [
113
+ {
114
+ envelope: buildPatentEnvelope({
115
+ code: "PATENT_INVALID_NUMBER",
116
+ adapter_path: ADAPTER_PATH,
117
+ step: "validate",
118
+ suggestion:
119
+ "google-patents-web get requires a publication_number (e.g. US11741188B2)",
120
+ }),
121
+ },
122
+ ];
123
+ }
124
+ const url = buildGooglePatentsDetailUrl(raw);
125
+ let html: string;
126
+ try {
127
+ html = await fetchGooglePatentsHtml(url);
128
+ } catch (err) {
129
+ if (err instanceof GooglePatentsHttpError) {
130
+ return [
131
+ {
132
+ envelope: buildPatentEnvelope({
133
+ code:
134
+ err.status === 404 ? "PATENT_NOT_FOUND" : "PATENT_API_DEPRECATED",
135
+ adapter_path: ADAPTER_PATH,
136
+ step: "fetch",
137
+ suggestion: `Google Patents detail page returned HTTP ${err.status}; verify the publication number or retry against --sources espacenet`,
138
+ alternatives: ["espacenet", "freepatentsonline-web"],
139
+ }),
140
+ },
141
+ ];
142
+ }
143
+ throw err;
144
+ }
145
+ const detail = parseGooglePatentsDetail(html);
146
+ if (!detail.title) {
147
+ return [
148
+ {
149
+ envelope: buildPatentEnvelope({
150
+ code: "PATENT_NOT_FOUND",
151
+ adapter_path: ADAPTER_PATH,
152
+ step: "select",
153
+ suggestion: `google-patents-web detail page for "${raw}" yielded no DC.title meta tag`,
154
+ alternatives: ["espacenet", "freepatentsonline-web"],
155
+ }),
156
+ },
157
+ ];
158
+ }
159
+ try {
160
+ return [
161
+ assemblePatentRecord({
162
+ publication_number: raw,
163
+ application_number: detail.application_number || undefined,
164
+ title: detail.title,
165
+ abstract: detail.abstract,
166
+ inventors:
167
+ detail.inventors.length > 0
168
+ ? detail.inventors.map((name) => ({ name }))
169
+ : undefined,
170
+ assignees:
171
+ detail.assignees.length > 0
172
+ ? detail.assignees.map((name) => ({ name }))
173
+ : undefined,
174
+ filing_date: detail.filing_date,
175
+ publication_date: detail.publication_date,
176
+ source_adapter: "google-patents-web",
177
+ source_url: url,
178
+ } as Parameters<typeof assemblePatentRecord>[0]),
179
+ ];
180
+ } catch {
181
+ return [
182
+ {
183
+ envelope: buildPatentEnvelope({
184
+ code: "PATENT_NOT_FOUND",
185
+ adapter_path: ADAPTER_PATH,
186
+ step: "normalize",
187
+ suggestion: `google-patents-web detail page for "${raw}" did not yield a canonicalisable publication_number`,
188
+ alternatives: ["espacenet"],
189
+ }),
190
+ },
191
+ ];
192
+ }
193
+ }
194
+
195
+ cli({
196
+ site: "google-patents-web",
197
+ name: "get",
198
+ description:
199
+ "Retrieve a single Google Patents bibliographic record (keyless, no Chrome)",
200
+ domain: "patents.google.com",
201
+ strategy: Strategy.PUBLIC,
202
+ adapter_path: ADAPTER_PATH,
203
+ args: [
204
+ {
205
+ name: "publication_number",
206
+ type: "str",
207
+ required: true,
208
+ positional: true,
209
+ description:
210
+ "ST.16 publication number, compact or segmented (e.g. US11741188B2 or US-11741188-B2)",
211
+ },
212
+ ],
213
+ columns: [
214
+ "publication_number",
215
+ "title",
216
+ "publication_date",
217
+ "assignees",
218
+ "source_url",
219
+ ],
220
+ capabilities: ["http.fetch", "patent.get"],
221
+ minimum_capability: "http.fetch",
222
+ func: async (_page, kwargs) =>
223
+ runGooglePatentsWebGet(kwargs as { publication_number?: unknown }),
224
+ });