@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,64 @@
1
+ # Lens.org single-record fetch.
2
+ #
3
+ # verification_status: blocked-by-subscription
4
+ #
5
+ # Lens "patent/search" is the only retrieval endpoint they expose publicly;
6
+ # get is implemented as a one-record query by `doc_key` (publication_number).
7
+ site: lens
8
+ name: get
9
+ description: Retrieve a single Lens.org patent record by publication number
10
+ domain: api.lens.org
11
+ type: web-api
12
+ strategy: header
13
+
14
+ args:
15
+ publication_number:
16
+ type: str
17
+ required: true
18
+ positional: true
19
+
20
+ pipeline:
21
+ - fetch:
22
+ url: https://api.lens.org/patent/search
23
+ method: POST
24
+ headers:
25
+ Authorization: "Bearer ${{ env.LENS_API_TOKEN || '' }}"
26
+ Content-Type: application/json
27
+ body:
28
+ query:
29
+ term:
30
+ doc_key: "${{ args.publication_number }}"
31
+ size: 1
32
+
33
+ - select: data
34
+
35
+ - map:
36
+ publication_number: "${{ item.doc_key || item.lens_id }}"
37
+ title: "${{ item.biblio ? (item.biblio.invention_title ? item.biblio.invention_title[0].text : '') : '' }}"
38
+ abstract: "${{ item.abstract ? (Array.isArray(item.abstract) ? (item.abstract[0] && item.abstract[0].text) : item.abstract) : '' }}"
39
+ kind_code: "${{ item.biblio && item.biblio.publication_reference ? (item.biblio.publication_reference.kind || '') : '' }}"
40
+ filing_date: "${{ item.biblio ? (item.biblio.application_reference ? item.biblio.application_reference.date : '') : '' }}"
41
+ publication_date: "${{ item.date_published || '' }}"
42
+ priority_date: "${{ item.biblio && item.biblio.priority_claims && item.biblio.priority_claims.claims ? item.biblio.priority_claims.claims[0].date : '' }}"
43
+ family_id: "${{ item.families ? item.families.simple_family.family_id : '' }}"
44
+ inventors: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.inventors) return []; return p.inventors.map(i => ({ name: i.extracted_name ? (i.extracted_name.value || '') : (i.name || ''), country: i.residence || undefined })).filter(x => x.name); })()) }}"
45
+ assignees: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.applicants) return []; return p.applicants.map(a => ({ name: a.extracted_name ? (a.extracted_name.value || '') : (a.name || ''), country: a.residence || undefined })).filter(x => x.name); })()) }}"
46
+ classifications: "${{ JSON.stringify((function(){ var c = item.biblio && item.biblio.classifications_cpc && item.biblio.classifications_cpc.classifications; var out = []; if(c){ for (var i=0;i<c.length;i++) out.push({ scheme: 'cpc', code: c[i].symbol || '' }); } var ipc = item.biblio && item.biblio.classifications_ipcr && item.biblio.classifications_ipcr.classifications; if(ipc){ for (var j=0;j<ipc.length;j++) out.push({ scheme: 'ipc', code: ipc[j].symbol || '' }); } return out.filter(x => x.code); })()) }}"
47
+ cited_by_count: "${{ item.biblio && item.biblio.cited_by ? (item.biblio.cited_by.patent_count || 0) : '' }}"
48
+ cites_count: "${{ item.biblio && item.biblio.references_cited && item.biblio.references_cited.patent_count !== undefined ? item.biblio.references_cited.patent_count : '' }}"
49
+ claims_count: "${{ item.claims_count !== undefined ? item.claims_count : '' }}"
50
+ legal_status: "${{ item.legal_status ? (item.legal_status.patent_status || '') : '' }}"
51
+ source_url: "https://www.lens.org/lens/patent/${{ item.lens_id }}"
52
+ source_adapter: lens
53
+ retrieved_at: "${{ now }}"
54
+
55
+ - limit: 1
56
+
57
+ columns: [publication_number, title, publication_date]
58
+
59
+ capabilities: ["http.fetch", "patent.get"]
60
+ minimum_capability: http.fetch
61
+ trust: public
62
+ confidentiality: public
63
+ quarantine: false
64
+ schema_version: v2
@@ -0,0 +1,82 @@
1
+ # Lens.org Patent API — POST JSON DSL search.
2
+ #
3
+ # verification_status: blocked-by-subscription
4
+ #
5
+ # Lens.org Patents is a free-to-search, paid-to-API service from Cambia.
6
+ # Institutional / commercial users get tokens via the Lens Toolkit subscription
7
+ # (https://www.lens.org/lens/user/subscriptions). The token is static once
8
+ # issued; no refresh dance, no rotation — set $LENS_API_TOKEN and the adapter
9
+ # works. Until the env var is present, every command emits a structured
10
+ # blocked-by-key envelope so agents can repair by guiding the user through
11
+ # subscription setup rather than retrying the API.
12
+ site: lens
13
+ name: search
14
+ description: Search Lens.org's combined patent corpus via the Scholarly Works DSL
15
+ domain: api.lens.org
16
+ type: web-api
17
+ strategy: header
18
+
19
+ args:
20
+ query:
21
+ type: str
22
+ required: true
23
+ positional: true
24
+ description: Free-text query — mapped to the Lens DSL `query_string`
25
+ limit:
26
+ type: int
27
+ default: 20
28
+ description: Maximum records returned (Lens caps at 1000)
29
+ date_from:
30
+ type: str
31
+ default: ""
32
+ description: ISO date — minimum publication date
33
+
34
+ pipeline:
35
+ - fetch:
36
+ url: https://api.lens.org/patent/search
37
+ method: POST
38
+ headers:
39
+ Authorization: "Bearer ${{ env.LENS_API_TOKEN || '' }}"
40
+ Content-Type: application/json
41
+ body:
42
+ query:
43
+ query_string:
44
+ query: "${{ args.query }}"
45
+ size: "${{ args.limit }}"
46
+ from: 0
47
+
48
+ - select: data
49
+
50
+ # Lens.org JSON `biblio` is the rich envelope. `_score` is Lens's
51
+ # relevance score, naturally a float; pass through as relevance_score.
52
+ - map:
53
+ publication_number: "${{ item.doc_key || item.lens_id }}"
54
+ title: "${{ item.biblio ? (item.biblio.invention_title ? item.biblio.invention_title[0].text : '') : '' }}"
55
+ abstract: "${{ item.abstract ? (Array.isArray(item.abstract) ? (item.abstract[0] && item.abstract[0].text) : item.abstract) : '' }}"
56
+ publication_date: "${{ item.date_published || '' }}"
57
+ filing_date: "${{ item.biblio ? (item.biblio.application_reference ? item.biblio.application_reference.date : '') : '' }}"
58
+ priority_date: "${{ item.biblio && item.biblio.priority_claims && item.biblio.priority_claims.claims ? item.biblio.priority_claims.claims[0].date : '' }}"
59
+ kind_code: "${{ item.biblio && item.biblio.publication_reference ? (item.biblio.publication_reference.kind || '') : '' }}"
60
+ family_id: "${{ item.families ? item.families.simple_family.family_id : '' }}"
61
+ inventors: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.inventors) return []; return p.inventors.map(i => ({ name: i.extracted_name ? (i.extracted_name.value || '') : (i.name || ''), country: i.residence || undefined })).filter(x => x.name); })()) }}"
62
+ assignees: "${{ JSON.stringify((function(){ var p=item.biblio && item.biblio.parties; if(!p || !p.applicants) return []; return p.applicants.map(a => ({ name: a.extracted_name ? (a.extracted_name.value || '') : (a.name || ''), country: a.residence || undefined })).filter(x => x.name); })()) }}"
63
+ classifications: "${{ JSON.stringify((function(){ var c = item.biblio && item.biblio.classifications_cpc && item.biblio.classifications_cpc.classifications; var out = []; if(c){ for (var i=0;i<c.length;i++) out.push({ scheme: 'cpc', code: c[i].symbol || '' }); } var ipc = item.biblio && item.biblio.classifications_ipcr && item.biblio.classifications_ipcr.classifications; if(ipc){ for (var j=0;j<ipc.length;j++) out.push({ scheme: 'ipc', code: ipc[j].symbol || '' }); } return out.filter(x => x.code); })()) }}"
64
+ cited_by_count: "${{ item.biblio && item.biblio.cited_by ? (item.biblio.cited_by.patent_count || 0) : '' }}"
65
+ cites_count: "${{ item.biblio && item.biblio.references_cited && item.biblio.references_cited.patent_count !== undefined ? item.biblio.references_cited.patent_count : '' }}"
66
+ claims_count: "${{ item.claims_count !== undefined ? item.claims_count : '' }}"
67
+ relevance_score: "${{ item._score !== undefined ? item._score : '' }}"
68
+ source_url: "https://www.lens.org/lens/patent/${{ item.lens_id }}"
69
+ source_adapter: lens
70
+ retrieved_at: "${{ now }}"
71
+
72
+ - limit: ${{ args.limit }}
73
+
74
+ columns: [publication_number, title, publication_date, source_adapter]
75
+
76
+ # schema-v2 metadata
77
+ capabilities: ["http.fetch", "patent.search"]
78
+ minimum_capability: http.fetch
79
+ trust: public
80
+ confidentiality: public
81
+ quarantine: false
82
+ schema_version: v2
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { resolveCommand } from "../../registry.js";
3
+ import { mapMangaDexAuthors, mapMangaDexManga } from "./web.js";
4
+
5
+ describe("mangadex public commands", () => {
6
+ it("registers manga and author search", () => {
7
+ expect(
8
+ Object.keys(resolveCommand("mangadex", "manga")!.adapter.commands),
9
+ ).toEqual(expect.arrayContaining(["manga", "authors"]));
10
+ });
11
+
12
+ it("exposes year, sort, and content rating controls for recent manga lookup", () => {
13
+ expect(resolveCommand("mangadex", "manga")!.command.adapterArgs).toEqual(
14
+ expect.arrayContaining([
15
+ expect.objectContaining({ name: "year", type: "int" }),
16
+ expect.objectContaining({
17
+ name: "sort",
18
+ choices: expect.arrayContaining(["latest", "followed", "relevance"]),
19
+ }),
20
+ expect.objectContaining({
21
+ name: "content-rating",
22
+ choices: expect.arrayContaining(["safe", "suggestive", "erotica"]),
23
+ }),
24
+ ]),
25
+ );
26
+ });
27
+
28
+ it("maps manga rows", () => {
29
+ expect(
30
+ mapMangaDexManga([
31
+ {
32
+ id: "m1",
33
+ attributes: { title: { en: "Hanabi" }, status: "ongoing" },
34
+ },
35
+ ]),
36
+ ).toMatchObject([
37
+ { rank: 1, id: "m1", title: "Hanabi", status: "ongoing" },
38
+ ]);
39
+ });
40
+
41
+ it("maps author rows", () => {
42
+ expect(
43
+ mapMangaDexAuthors([{ id: "a1", attributes: { name: "Yuzusoft" } }]),
44
+ ).toMatchObject([{ rank: 1, id: "a1", name: "Yuzusoft" }]);
45
+ });
46
+ });
@@ -0,0 +1,210 @@
1
+ /**
2
+ * @owner src/adapters/mangadex/web.ts
3
+ * @does Register MangaDex public manga and author search commands.
4
+ * @needs MangaDex public API and relationship include semantics.
5
+ * @feeds Manga/doujin-adjacent title and creator discovery.
6
+ * @breaks MangaDex API schema or public rate limits can block lookup.
7
+ */
8
+
9
+ import { USER_AGENT } from "../../constants.js";
10
+ import { cli, Strategy } from "../../registry.js";
11
+
12
+ const API = "https://api.mangadex.org";
13
+
14
+ function str(value: unknown): string {
15
+ return value === undefined || value === null ? "" : String(value);
16
+ }
17
+
18
+ function required(value: unknown, label: string): string {
19
+ const text = str(value).trim();
20
+ if (!text) throw new Error(`mangadex ${label} cannot be empty.`);
21
+ return text;
22
+ }
23
+
24
+ function requireLimit(value: unknown): number {
25
+ if (value === undefined || value === null || value === "") return 10;
26
+ const n = Number(value);
27
+ if (!Number.isInteger(n) || n < 1 || n > 50) {
28
+ throw new Error("mangadex limit must be an integer in [1, 50].");
29
+ }
30
+ return n;
31
+ }
32
+
33
+ function optionalYear(value: unknown): number | undefined {
34
+ if (value === undefined || value === null || value === "") return undefined;
35
+ const n = Number(value);
36
+ if (!Number.isInteger(n) || n < 1900 || n > 2100) {
37
+ throw new Error("mangadex year must be an integer in [1900, 2100].");
38
+ }
39
+ return n;
40
+ }
41
+
42
+ const SORT_PARAMS: Record<string, [string, string] | undefined> = {
43
+ relevance: undefined,
44
+ latest: ["order[latestUploadedChapter]", "desc"],
45
+ followed: ["order[followedCount]", "desc"],
46
+ year: ["order[year]", "desc"],
47
+ };
48
+
49
+ function applySort(url: URL, value: unknown): void {
50
+ const key = String(value ?? "relevance").trim();
51
+ const spec = SORT_PARAMS[key];
52
+ if (!(key in SORT_PARAMS)) {
53
+ throw new Error(
54
+ `mangadex sort must be one of: ${Object.keys(SORT_PARAMS).join(", ")}.`,
55
+ );
56
+ }
57
+ if (spec) url.searchParams.set(spec[0], spec[1]);
58
+ }
59
+
60
+ const CONTENT_RATINGS = new Set([
61
+ "safe",
62
+ "suggestive",
63
+ "erotica",
64
+ "pornographic",
65
+ "all",
66
+ ]);
67
+
68
+ function applyContentRating(url: URL, value: unknown): void {
69
+ if (value === undefined || value === null || value === "") return;
70
+ const rating = String(value).trim();
71
+ if (!CONTENT_RATINGS.has(rating)) {
72
+ throw new Error(
73
+ `mangadex content_rating must be one of: ${Array.from(CONTENT_RATINGS).join(", ")}.`,
74
+ );
75
+ }
76
+ if (rating !== "all") url.searchParams.append("contentRating[]", rating);
77
+ }
78
+
79
+ async function getJson(url: URL): Promise<unknown[]> {
80
+ const response = await fetch(url, {
81
+ headers: { Accept: "application/json", "User-Agent": USER_AGENT },
82
+ });
83
+ if (!response.ok)
84
+ throw new Error(`mangadex request failed with HTTP ${response.status}.`);
85
+ const data = (await response.json()) as { data?: unknown[]; result?: string };
86
+ if (data.result && data.result !== "ok")
87
+ throw new Error(`mangadex API returned ${data.result}.`);
88
+ return data.data ?? [];
89
+ }
90
+
91
+ function localized(values: unknown): string {
92
+ const obj =
93
+ values && typeof values === "object"
94
+ ? (values as Record<string, unknown>)
95
+ : {};
96
+ return str(
97
+ obj.en || obj.ja || obj["ja-ro"] || obj.zh || Object.values(obj)[0],
98
+ );
99
+ }
100
+
101
+ export function mapMangaDexManga(rows: unknown[]): Record<string, unknown>[] {
102
+ return rows.map((row, index) => {
103
+ const item = row as Record<string, unknown>;
104
+ const attrs =
105
+ (item.attributes as Record<string, unknown> | undefined) ?? {};
106
+ return {
107
+ rank: index + 1,
108
+ id: item.id,
109
+ title: localized(attrs.title),
110
+ status: str(attrs.status),
111
+ year: attrs.year ?? null,
112
+ content_rating: str(attrs.contentRating),
113
+ latest_uploaded_chapter: str(attrs.latestUploadedChapter),
114
+ description: localized(attrs.description).slice(0, 700),
115
+ url: `https://mangadex.org/title/${item.id}`,
116
+ };
117
+ });
118
+ }
119
+
120
+ export function mapMangaDexAuthors(rows: unknown[]): Record<string, unknown>[] {
121
+ return rows.map((row, index) => {
122
+ const item = row as Record<string, unknown>;
123
+ const attrs =
124
+ (item.attributes as Record<string, unknown> | undefined) ?? {};
125
+ return {
126
+ rank: index + 1,
127
+ id: item.id,
128
+ name: str(attrs.name),
129
+ twitter: str(attrs.twitter),
130
+ pixiv: str(attrs.pixiv),
131
+ website: str(attrs.website),
132
+ url: `https://mangadex.org/author/${item.id}`,
133
+ };
134
+ });
135
+ }
136
+
137
+ async function searchManga(kwargs: Record<string, unknown>) {
138
+ const query = required(kwargs.query, "query");
139
+ const url = new URL(`${API}/manga`);
140
+ url.searchParams.set("title", query);
141
+ url.searchParams.set("limit", String(requireLimit(kwargs.limit)));
142
+ const year = optionalYear(kwargs.year);
143
+ if (year) url.searchParams.set("year", String(year));
144
+ applySort(url, kwargs.sort);
145
+ applyContentRating(url, kwargs["content-rating"]);
146
+ url.searchParams.append("includes[]", "author");
147
+ url.searchParams.append("includes[]", "artist");
148
+ const rows = mapMangaDexManga(await getJson(url));
149
+ if (rows.length === 0)
150
+ throw new Error(`No MangaDex manga found for "${query}".`);
151
+ return rows;
152
+ }
153
+
154
+ async function searchAuthors(kwargs: Record<string, unknown>) {
155
+ const query = required(kwargs.query, "query");
156
+ const url = new URL(`${API}/author`);
157
+ url.searchParams.set("name", query);
158
+ url.searchParams.set("limit", String(requireLimit(kwargs.limit)));
159
+ const rows = mapMangaDexAuthors(await getJson(url));
160
+ if (rows.length === 0)
161
+ throw new Error(`No MangaDex authors found for "${query}".`);
162
+ return rows;
163
+ }
164
+
165
+ const SEARCH_ARGS = [
166
+ { name: "query", type: "str" as const, required: true, positional: true },
167
+ { name: "limit", type: "int" as const, default: 10 },
168
+ ];
169
+
170
+ const MANGA_ARGS = [
171
+ { name: "query", type: "str" as const, required: true, positional: true },
172
+ { name: "limit", type: "int" as const, default: 10 },
173
+ { name: "year", type: "int" as const },
174
+ {
175
+ name: "sort",
176
+ type: "str" as const,
177
+ default: "relevance",
178
+ choices: ["relevance", "latest", "followed", "year"],
179
+ },
180
+ {
181
+ name: "content-rating",
182
+ type: "str" as const,
183
+ choices: ["safe", "suggestive", "erotica", "pornographic", "all"],
184
+ },
185
+ ];
186
+
187
+ cli({
188
+ site: "mangadex",
189
+ name: "manga",
190
+ description:
191
+ "Search MangaDex manga by Japanese title, romaji, alias, or keyword",
192
+ domain: "mangadex.org",
193
+ strategy: Strategy.PUBLIC,
194
+ browser: false,
195
+ args: MANGA_ARGS,
196
+ columns: ["rank", "id", "title", "status", "year", "content_rating", "url"],
197
+ func: async (_page, kwargs) => searchManga(kwargs),
198
+ });
199
+
200
+ cli({
201
+ site: "mangadex",
202
+ name: "authors",
203
+ description: "Search MangaDex authors and artists by public name or romaji",
204
+ domain: "mangadex.org",
205
+ strategy: Strategy.PUBLIC,
206
+ browser: false,
207
+ args: SEARCH_ARGS,
208
+ columns: ["rank", "id", "name", "twitter", "pixiv", "website", "url"],
209
+ func: async (_page, kwargs) => searchAuthors(kwargs),
210
+ });
@@ -0,0 +1,82 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { mapMastodonStatusRows, normalizeMastodonAccount } from "./statuses.js";
4
+
5
+ describe("mastodon statuses adapter helpers", () => {
6
+ it("normalizes account handles and instance overrides", () => {
7
+ expect(normalizeMastodonAccount("gargron@mastodon.social")).toEqual({
8
+ acct: "gargron",
9
+ instance: "mastodon.social",
10
+ });
11
+
12
+ expect(normalizeMastodonAccount("@gargron", "mastodon.social")).toEqual({
13
+ acct: "gargron",
14
+ instance: "mastodon.social",
15
+ });
16
+ });
17
+
18
+ it("maps API statuses into stable social rows", () => {
19
+ expect(
20
+ mapMastodonStatusRows(
21
+ [
22
+ {
23
+ created_at: "2026-05-14T10:00:00.000Z",
24
+ content: "<p>Hello <strong>fediverse</strong></p>",
25
+ url: "https://mastodon.social/@gargron/1",
26
+ reblogs_count: 2,
27
+ favourites_count: 3,
28
+ replies_count: 4,
29
+ account: { acct: "gargron", display_name: "Gargron" },
30
+ },
31
+ ],
32
+ 10,
33
+ ),
34
+ ).toEqual([
35
+ {
36
+ rank: 1,
37
+ author: "Gargron",
38
+ handle: "@gargron",
39
+ content: "Hello fediverse",
40
+ reblogs: 2,
41
+ favorites: 3,
42
+ replies: 4,
43
+ url: "https://mastodon.social/@gargron/1",
44
+ date: "2026-05-14T10:00:00.000Z",
45
+ },
46
+ ]);
47
+ });
48
+
49
+ it("drops empty activity rows and decodes common HTML entities", () => {
50
+ expect(
51
+ mapMastodonStatusRows(
52
+ [
53
+ {
54
+ created_at: "2026-05-14T10:00:00.000Z",
55
+ content: "",
56
+ url: "https://mastodon.social/users/Gargron/statuses/1/activity",
57
+ account: { acct: "Gargron", display_name: "Eugen Rochko" },
58
+ },
59
+ {
60
+ created_at: "2026-05-14T11:00:00.000Z",
61
+ content: "<p>Don&#39;t escape &amp; ship</p>",
62
+ url: "https://mastodon.social/@Gargron/2",
63
+ account: { acct: "Gargron", display_name: "Eugen Rochko" },
64
+ },
65
+ ],
66
+ 10,
67
+ ),
68
+ ).toEqual([
69
+ {
70
+ rank: 1,
71
+ author: "Eugen Rochko",
72
+ handle: "@Gargron",
73
+ content: "Don't escape & ship",
74
+ reblogs: 0,
75
+ favorites: 0,
76
+ replies: 0,
77
+ url: "https://mastodon.social/@Gargron/2",
78
+ date: "2026-05-14T11:00:00.000Z",
79
+ },
80
+ ]);
81
+ });
82
+ });
@@ -0,0 +1,208 @@
1
+ /**
2
+ * @owner Mastodon user status adapter.
3
+ * @does Register a public read command for recent statuses by account handle.
4
+ * @needs Mastodon-compatible public API endpoints for account lookup and statuses.
5
+ * @feeds Social research workflows and social capability coverage.
6
+ * @breaks Instance API drift, blocked public egress, or accounts hidden from public lookup.
7
+ */
8
+
9
+ import { USER_AGENT } from "../../constants.js";
10
+ import { cli, Strategy } from "../../registry.js";
11
+
12
+ interface MastodonAccount {
13
+ id?: unknown;
14
+ acct?: unknown;
15
+ display_name?: unknown;
16
+ }
17
+
18
+ interface MastodonStatus {
19
+ created_at?: unknown;
20
+ content?: unknown;
21
+ url?: unknown;
22
+ reblogs_count?: unknown;
23
+ favourites_count?: unknown;
24
+ replies_count?: unknown;
25
+ account?: MastodonAccount;
26
+ }
27
+
28
+ export interface MastodonAccountRef {
29
+ acct: string;
30
+ instance: string;
31
+ }
32
+
33
+ export interface MastodonStatusRow {
34
+ rank: number;
35
+ author: string;
36
+ handle: string;
37
+ content: string;
38
+ reblogs: number;
39
+ favorites: number;
40
+ replies: number;
41
+ url: string;
42
+ date: string;
43
+ }
44
+
45
+ function cleanString(value: unknown): string {
46
+ return typeof value === "string" ? value.trim() : "";
47
+ }
48
+
49
+ function numberValue(value: unknown): number {
50
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
51
+ }
52
+
53
+ function stripHtml(value: unknown): string {
54
+ return cleanString(value)
55
+ .replace(/<[^>]*>/g, "")
56
+ .replace(/&nbsp;/g, " ")
57
+ .replace(/&amp;/g, "&")
58
+ .replace(/&lt;/g, "<")
59
+ .replace(/&gt;/g, ">")
60
+ .replace(/&quot;/g, '"')
61
+ .replace(/&#39;/g, "'")
62
+ .replace(/\s+/g, " ")
63
+ .trim();
64
+ }
65
+
66
+ export function normalizeMastodonAccount(
67
+ input: string,
68
+ instanceOverride = "mastodon.social",
69
+ ): MastodonAccountRef {
70
+ const trimmed = input.trim().replace(/^@/, "");
71
+ if (!trimmed) throw new Error("Mastodon account cannot be empty");
72
+ const parts = trimmed.split("@").filter(Boolean);
73
+ if (parts.length > 2) {
74
+ throw new Error(`Invalid Mastodon account: ${input}`);
75
+ }
76
+ const acct = parts[0];
77
+ const instance = parts[1] ?? instanceOverride.trim();
78
+ if (!acct || !instance) {
79
+ throw new Error(`Invalid Mastodon account: ${input}`);
80
+ }
81
+ return { acct, instance };
82
+ }
83
+
84
+ export function mapMastodonStatusRows(
85
+ statuses: MastodonStatus[],
86
+ limit: number,
87
+ ): MastodonStatusRow[] {
88
+ const rows: Omit<MastodonStatusRow, "rank">[] = [];
89
+ for (const status of statuses) {
90
+ const content = stripHtml(status.content).slice(0, 500);
91
+ if (!content) continue;
92
+ const account = status.account ?? {};
93
+ const handle = cleanString(account.acct);
94
+ rows.push({
95
+ author: cleanString(account.display_name) || handle,
96
+ handle: handle ? `@${handle}` : "",
97
+ content,
98
+ reblogs: numberValue(status.reblogs_count),
99
+ favorites: numberValue(status.favourites_count),
100
+ replies: numberValue(status.replies_count),
101
+ url: cleanString(status.url),
102
+ date: cleanString(status.created_at),
103
+ });
104
+ }
105
+ return rows.slice(0, limit).map((row, index) => ({
106
+ rank: index + 1,
107
+ ...row,
108
+ }));
109
+ }
110
+
111
+ function parseLimit(value: unknown): number {
112
+ const limit = Number(value ?? 20);
113
+ if (!Number.isInteger(limit) || limit < 1 || limit > 40) {
114
+ throw new Error(
115
+ `--limit must be an integer between 1 and 40, got ${value}`,
116
+ );
117
+ }
118
+ return limit;
119
+ }
120
+
121
+ async function fetchMastodonJson(url: string): Promise<unknown> {
122
+ const response = await fetch(url, {
123
+ headers: {
124
+ Accept: "application/json",
125
+ "User-Agent": USER_AGENT,
126
+ },
127
+ });
128
+ if (!response.ok) {
129
+ const preview = (await response.text()).slice(0, 200);
130
+ throw new Error(`Mastodon HTTP ${response.status} from ${url}: ${preview}`);
131
+ }
132
+ return response.json() as Promise<unknown>;
133
+ }
134
+
135
+ function requireAccountId(account: unknown): string {
136
+ if (!account || typeof account !== "object") {
137
+ throw new Error("Mastodon account lookup returned a non-object response");
138
+ }
139
+ const id = cleanString((account as MastodonAccount).id);
140
+ if (!id) throw new Error("Mastodon account lookup did not return an id");
141
+ return id;
142
+ }
143
+
144
+ cli({
145
+ site: "mastodon",
146
+ name: "statuses",
147
+ description: "Get recent public statuses from a Mastodon account",
148
+ domain: "mastodon.social",
149
+ strategy: Strategy.PUBLIC,
150
+ args: [
151
+ {
152
+ name: "account",
153
+ required: true,
154
+ positional: true,
155
+ description: "Account handle, e.g. gargron@mastodon.social",
156
+ },
157
+ {
158
+ name: "instance",
159
+ type: "str",
160
+ default: "mastodon.social",
161
+ description: "Mastodon instance domain used when account omits one",
162
+ },
163
+ {
164
+ name: "limit",
165
+ type: "int",
166
+ default: 20,
167
+ description: "Number of statuses, 1-40",
168
+ },
169
+ ],
170
+ columns: [
171
+ "rank",
172
+ "author",
173
+ "handle",
174
+ "content",
175
+ "reblogs",
176
+ "favorites",
177
+ "replies",
178
+ "url",
179
+ "date",
180
+ ],
181
+ socialCapabilities: ["read", "user_content", "reactions"],
182
+ func: async (_page, kwargs) => {
183
+ const limit = parseLimit(kwargs.limit);
184
+ const account = normalizeMastodonAccount(
185
+ String(kwargs.account ?? ""),
186
+ String(kwargs.instance ?? "mastodon.social"),
187
+ );
188
+ const origin = `https://${account.instance}`;
189
+ const lookupUrl = new URL("/api/v1/accounts/lookup", origin);
190
+ lookupUrl.searchParams.set("acct", account.acct);
191
+ const lookup = await fetchMastodonJson(lookupUrl.toString());
192
+ const accountId = requireAccountId(lookup);
193
+ const statusesUrl = new URL(
194
+ `/api/v1/accounts/${encodeURIComponent(accountId)}/statuses`,
195
+ origin,
196
+ );
197
+ statusesUrl.searchParams.set("limit", String(limit));
198
+ statusesUrl.searchParams.set("exclude_reblogs", "false");
199
+ statusesUrl.searchParams.set("exclude_replies", "false");
200
+ const statuses = await fetchMastodonJson(statusesUrl.toString());
201
+ if (!Array.isArray(statuses)) {
202
+ throw new Error(
203
+ "Mastodon statuses endpoint returned a non-array response",
204
+ );
205
+ }
206
+ return mapMastodonStatusRows(statuses as MastodonStatus[], limit);
207
+ },
208
+ });