@zenalexa/unicli 0.219.0 → 0.220.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 (430) hide show
  1. package/AGENTS.md +9 -9
  2. package/README.md +55 -249
  3. package/README.zh-CN.md +55 -249
  4. package/dist/adapters/1point3acres/forum.d.ts +58 -0
  5. package/dist/adapters/1point3acres/forum.d.ts.map +1 -0
  6. package/dist/adapters/1point3acres/forum.js +708 -0
  7. package/dist/adapters/1point3acres/forum.js.map +1 -0
  8. package/dist/adapters/aibase/news.d.ts +21 -0
  9. package/dist/adapters/aibase/news.d.ts.map +1 -0
  10. package/dist/adapters/aibase/news.js +96 -0
  11. package/dist/adapters/aibase/news.js.map +1 -0
  12. package/dist/adapters/arxiv/papers.d.ts +27 -0
  13. package/dist/adapters/arxiv/papers.d.ts.map +1 -0
  14. package/dist/adapters/arxiv/papers.js +193 -0
  15. package/dist/adapters/arxiv/papers.js.map +1 -0
  16. package/dist/adapters/bbc/topic.d.ts +24 -0
  17. package/dist/adapters/bbc/topic.d.ts.map +1 -0
  18. package/dist/adapters/bbc/topic.js +122 -0
  19. package/dist/adapters/bbc/topic.js.map +1 -0
  20. package/dist/adapters/chatgpt/web.d.ts +24 -0
  21. package/dist/adapters/chatgpt/web.d.ts.map +1 -0
  22. package/dist/adapters/chatgpt/web.js +242 -0
  23. package/dist/adapters/chatgpt/web.js.map +1 -0
  24. package/dist/adapters/claude/web.d.ts +24 -0
  25. package/dist/adapters/claude/web.d.ts.map +1 -0
  26. package/dist/adapters/claude/web.js +575 -0
  27. package/dist/adapters/claude/web.js.map +1 -0
  28. package/dist/adapters/codex/projects.d.ts +27 -0
  29. package/dist/adapters/codex/projects.d.ts.map +1 -0
  30. package/dist/adapters/codex/projects.js +147 -0
  31. package/dist/adapters/codex/projects.js.map +1 -0
  32. package/dist/adapters/coingecko/markets.d.ts +19 -0
  33. package/dist/adapters/coingecko/markets.d.ts.map +1 -0
  34. package/dist/adapters/coingecko/markets.js +474 -0
  35. package/dist/adapters/coingecko/markets.js.map +1 -0
  36. package/dist/adapters/coupang/product.d.ts +27 -0
  37. package/dist/adapters/coupang/product.d.ts.map +1 -0
  38. package/dist/adapters/coupang/product.js +211 -0
  39. package/dist/adapters/coupang/product.js.map +1 -0
  40. package/dist/adapters/crates/registry.d.ts +44 -0
  41. package/dist/adapters/crates/registry.d.ts.map +1 -0
  42. package/dist/adapters/crates/registry.js +186 -0
  43. package/dist/adapters/crates/registry.js.map +1 -0
  44. package/dist/adapters/ctrip/travel.d.ts +83 -0
  45. package/dist/adapters/ctrip/travel.d.ts.map +1 -0
  46. package/dist/adapters/ctrip/travel.js +630 -0
  47. package/dist/adapters/ctrip/travel.js.map +1 -0
  48. package/dist/adapters/dblp/publications.d.ts +41 -0
  49. package/dist/adapters/dblp/publications.d.ts.map +1 -0
  50. package/dist/adapters/dblp/publications.js +409 -0
  51. package/dist/adapters/dblp/publications.js.map +1 -0
  52. package/dist/adapters/deepseek/web.d.ts +1 -1
  53. package/dist/adapters/deepseek/web.d.ts.map +1 -1
  54. package/dist/adapters/deepseek/web.js +66 -1
  55. package/dist/adapters/deepseek/web.js.map +1 -1
  56. package/dist/adapters/defillama/protocols.d.ts +13 -0
  57. package/dist/adapters/defillama/protocols.d.ts.map +1 -0
  58. package/dist/adapters/defillama/protocols.js +218 -0
  59. package/dist/adapters/defillama/protocols.js.map +1 -0
  60. package/dist/adapters/devto/read.d.ts +26 -0
  61. package/dist/adapters/devto/read.d.ts.map +1 -0
  62. package/dist/adapters/devto/read.js +110 -0
  63. package/dist/adapters/devto/read.js.map +1 -0
  64. package/dist/adapters/dianping/shop.d.ts +38 -0
  65. package/dist/adapters/dianping/shop.d.ts.map +1 -0
  66. package/dist/adapters/dianping/shop.js +194 -0
  67. package/dist/adapters/dianping/shop.js.map +1 -0
  68. package/dist/adapters/dockerhub/registry.d.ts +36 -0
  69. package/dist/adapters/dockerhub/registry.d.ts.map +1 -0
  70. package/dist/adapters/dockerhub/registry.js +172 -0
  71. package/dist/adapters/dockerhub/registry.js.map +1 -0
  72. package/dist/adapters/endoflife/product.d.ts +11 -0
  73. package/dist/adapters/endoflife/product.d.ts.map +1 -0
  74. package/dist/adapters/endoflife/product.js +113 -0
  75. package/dist/adapters/endoflife/product.js.map +1 -0
  76. package/dist/adapters/facebook/marketplace-extra.d.ts +9 -0
  77. package/dist/adapters/facebook/marketplace-extra.d.ts.map +1 -0
  78. package/dist/adapters/facebook/marketplace-extra.js +170 -0
  79. package/dist/adapters/facebook/marketplace-extra.js.map +1 -0
  80. package/dist/adapters/flathub/apps.d.ts +17 -0
  81. package/dist/adapters/flathub/apps.d.ts.map +1 -0
  82. package/dist/adapters/flathub/apps.js +220 -0
  83. package/dist/adapters/flathub/apps.js.map +1 -0
  84. package/dist/adapters/goproxy/module.d.ts +24 -0
  85. package/dist/adapters/goproxy/module.d.ts.map +1 -0
  86. package/dist/adapters/goproxy/module.js +221 -0
  87. package/dist/adapters/goproxy/module.js.map +1 -0
  88. package/dist/adapters/grok/web.d.ts +29 -0
  89. package/dist/adapters/grok/web.d.ts.map +1 -0
  90. package/dist/adapters/grok/web.js +553 -0
  91. package/dist/adapters/grok/web.js.map +1 -0
  92. package/dist/adapters/hackernews/read.d.ts +31 -0
  93. package/dist/adapters/hackernews/read.d.ts.map +1 -0
  94. package/dist/adapters/hackernews/read.js +201 -0
  95. package/dist/adapters/hackernews/read.js.map +1 -0
  96. package/dist/adapters/hf/paper.d.ts +22 -0
  97. package/dist/adapters/hf/paper.d.ts.map +1 -0
  98. package/dist/adapters/hf/paper.js +112 -0
  99. package/dist/adapters/hf/paper.js.map +1 -0
  100. package/dist/adapters/homebrew/packages.d.ts +52 -0
  101. package/dist/adapters/homebrew/packages.d.ts.map +1 -0
  102. package/dist/adapters/homebrew/packages.js +240 -0
  103. package/dist/adapters/homebrew/packages.js.map +1 -0
  104. package/dist/adapters/indeed/jobs.d.ts +38 -0
  105. package/dist/adapters/indeed/jobs.d.ts.map +1 -0
  106. package/dist/adapters/indeed/jobs.js +300 -0
  107. package/dist/adapters/indeed/jobs.js.map +1 -0
  108. package/dist/adapters/instagram/collections.d.ts +9 -0
  109. package/dist/adapters/instagram/collections.d.ts.map +1 -0
  110. package/dist/adapters/instagram/collections.js +174 -0
  111. package/dist/adapters/instagram/collections.js.map +1 -0
  112. package/dist/adapters/lichess/players.d.ts +46 -0
  113. package/dist/adapters/lichess/players.d.ts.map +1 -0
  114. package/dist/adapters/lichess/players.js +221 -0
  115. package/dist/adapters/lichess/players.js.map +1 -0
  116. package/dist/adapters/lobsters/read-domain.d.ts +35 -0
  117. package/dist/adapters/lobsters/read-domain.d.ts.map +1 -0
  118. package/dist/adapters/lobsters/read-domain.js +306 -0
  119. package/dist/adapters/lobsters/read-domain.js.map +1 -0
  120. package/dist/adapters/maven/artifact.d.ts +30 -0
  121. package/dist/adapters/maven/artifact.d.ts.map +1 -0
  122. package/dist/adapters/maven/artifact.js +121 -0
  123. package/dist/adapters/maven/artifact.js.map +1 -0
  124. package/dist/adapters/mdn/search.d.ts +11 -0
  125. package/dist/adapters/mdn/search.d.ts.map +1 -0
  126. package/dist/adapters/mdn/search.js +115 -0
  127. package/dist/adapters/mdn/search.js.map +1 -0
  128. package/dist/adapters/medium/tag.d.ts +15 -0
  129. package/dist/adapters/medium/tag.d.ts.map +1 -0
  130. package/dist/adapters/medium/tag.js +148 -0
  131. package/dist/adapters/medium/tag.js.map +1 -0
  132. package/dist/adapters/npm/package.d.ts +32 -0
  133. package/dist/adapters/npm/package.d.ts.map +1 -0
  134. package/dist/adapters/npm/package.js +141 -0
  135. package/dist/adapters/npm/package.js.map +1 -0
  136. package/dist/adapters/nuget/package.d.ts +34 -0
  137. package/dist/adapters/nuget/package.d.ts.map +1 -0
  138. package/dist/adapters/nuget/package.js +135 -0
  139. package/dist/adapters/nuget/package.js.map +1 -0
  140. package/dist/adapters/nvd/cve.d.ts +42 -0
  141. package/dist/adapters/nvd/cve.d.ts.map +1 -0
  142. package/dist/adapters/nvd/cve.js +132 -0
  143. package/dist/adapters/nvd/cve.js.map +1 -0
  144. package/dist/adapters/oeis/sequences.d.ts +14 -0
  145. package/dist/adapters/oeis/sequences.d.ts.map +1 -0
  146. package/dist/adapters/oeis/sequences.js +219 -0
  147. package/dist/adapters/oeis/sequences.js.map +1 -0
  148. package/dist/adapters/openalex/works.d.ts +43 -0
  149. package/dist/adapters/openalex/works.d.ts.map +1 -0
  150. package/dist/adapters/openalex/works.js +267 -0
  151. package/dist/adapters/openalex/works.js.map +1 -0
  152. package/dist/adapters/openfda/records.d.ts +18 -0
  153. package/dist/adapters/openfda/records.d.ts.map +1 -0
  154. package/dist/adapters/openfda/records.js +209 -0
  155. package/dist/adapters/openfda/records.js.map +1 -0
  156. package/dist/adapters/openreview/papers.d.ts +34 -0
  157. package/dist/adapters/openreview/papers.d.ts.map +1 -0
  158. package/dist/adapters/openreview/papers.js +463 -0
  159. package/dist/adapters/openreview/papers.js.map +1 -0
  160. package/dist/adapters/osv/security.d.ts +36 -0
  161. package/dist/adapters/osv/security.d.ts.map +1 -0
  162. package/dist/adapters/osv/security.js +247 -0
  163. package/dist/adapters/osv/security.js.map +1 -0
  164. package/dist/adapters/packagist/package.d.ts +31 -0
  165. package/dist/adapters/packagist/package.d.ts.map +1 -0
  166. package/dist/adapters/packagist/package.js +108 -0
  167. package/dist/adapters/packagist/package.js.map +1 -0
  168. package/dist/adapters/pubmed/articles.d.ts +31 -0
  169. package/dist/adapters/pubmed/articles.d.ts.map +1 -0
  170. package/dist/adapters/pubmed/articles.js +385 -0
  171. package/dist/adapters/pubmed/articles.js.map +1 -0
  172. package/dist/adapters/pypi/package.d.ts +38 -0
  173. package/dist/adapters/pypi/package.d.ts.map +1 -0
  174. package/dist/adapters/pypi/package.js +235 -0
  175. package/dist/adapters/pypi/package.js.map +1 -0
  176. package/dist/adapters/qwen/web.d.ts +26 -0
  177. package/dist/adapters/qwen/web.d.ts.map +1 -0
  178. package/dist/adapters/qwen/web.js +672 -0
  179. package/dist/adapters/qwen/web.js.map +1 -0
  180. package/dist/adapters/reddit/account.d.ts +12 -0
  181. package/dist/adapters/reddit/account.d.ts.map +1 -0
  182. package/dist/adapters/reddit/account.js +409 -0
  183. package/dist/adapters/reddit/account.js.map +1 -0
  184. package/dist/adapters/rednote/web.d.ts +30 -0
  185. package/dist/adapters/rednote/web.d.ts.map +1 -0
  186. package/dist/adapters/rednote/web.js +858 -0
  187. package/dist/adapters/rednote/web.js.map +1 -0
  188. package/dist/adapters/rest-countries/countries.d.ts +14 -0
  189. package/dist/adapters/rest-countries/countries.d.ts.map +1 -0
  190. package/dist/adapters/rest-countries/countries.js +231 -0
  191. package/dist/adapters/rest-countries/countries.js.map +1 -0
  192. package/dist/adapters/reuters/article-detail.d.ts +37 -0
  193. package/dist/adapters/reuters/article-detail.d.ts.map +1 -0
  194. package/dist/adapters/reuters/article-detail.js +139 -0
  195. package/dist/adapters/reuters/article-detail.js.map +1 -0
  196. package/dist/adapters/rfc/rfc.d.ts +11 -0
  197. package/dist/adapters/rfc/rfc.d.ts.map +1 -0
  198. package/dist/adapters/rfc/rfc.js +121 -0
  199. package/dist/adapters/rfc/rfc.js.map +1 -0
  200. package/dist/adapters/rubygems/gem.d.ts +26 -0
  201. package/dist/adapters/rubygems/gem.d.ts.map +1 -0
  202. package/dist/adapters/rubygems/gem.js +96 -0
  203. package/dist/adapters/rubygems/gem.js.map +1 -0
  204. package/dist/adapters/stackoverflow/questions.d.ts +79 -0
  205. package/dist/adapters/stackoverflow/questions.d.ts.map +1 -0
  206. package/dist/adapters/stackoverflow/questions.js +504 -0
  207. package/dist/adapters/stackoverflow/questions.js.map +1 -0
  208. package/dist/adapters/steam/app.d.ts +39 -0
  209. package/dist/adapters/steam/app.d.ts.map +1 -0
  210. package/dist/adapters/steam/app.js +165 -0
  211. package/dist/adapters/steam/app.js.map +1 -0
  212. package/dist/adapters/tiktok/creator-videos.d.ts +52 -0
  213. package/dist/adapters/tiktok/creator-videos.d.ts.map +1 -0
  214. package/dist/adapters/tiktok/creator-videos.js +267 -0
  215. package/dist/adapters/tiktok/creator-videos.js.map +1 -0
  216. package/dist/adapters/tvmaze/shows.d.ts +13 -0
  217. package/dist/adapters/tvmaze/shows.d.ts.map +1 -0
  218. package/dist/adapters/tvmaze/shows.js +240 -0
  219. package/dist/adapters/tvmaze/shows.js.map +1 -0
  220. package/dist/adapters/twitter/bookmark-folders.d.ts +33 -0
  221. package/dist/adapters/twitter/bookmark-folders.d.ts.map +1 -0
  222. package/dist/adapters/twitter/bookmark-folders.js +290 -0
  223. package/dist/adapters/twitter/bookmark-folders.js.map +1 -0
  224. package/dist/adapters/twitter/quote.d.ts +18 -0
  225. package/dist/adapters/twitter/quote.d.ts.map +1 -0
  226. package/dist/adapters/twitter/quote.js +285 -0
  227. package/dist/adapters/twitter/quote.js.map +1 -0
  228. package/dist/adapters/twitter/tweet-actions.d.ts +12 -0
  229. package/dist/adapters/twitter/tweet-actions.d.ts.map +1 -0
  230. package/dist/adapters/twitter/tweet-actions.js +145 -0
  231. package/dist/adapters/twitter/tweet-actions.js.map +1 -0
  232. package/dist/adapters/twitter/tweet-url.d.ts +15 -0
  233. package/dist/adapters/twitter/tweet-url.d.ts.map +1 -0
  234. package/dist/adapters/twitter/tweet-url.js +57 -0
  235. package/dist/adapters/twitter/tweet-url.js.map +1 -0
  236. package/dist/adapters/uisdc/news.d.ts +22 -0
  237. package/dist/adapters/uisdc/news.d.ts.map +1 -0
  238. package/dist/adapters/uisdc/news.js +91 -0
  239. package/dist/adapters/uisdc/news.js.map +1 -0
  240. package/dist/adapters/weibo/favorites-publish.d.ts +28 -0
  241. package/dist/adapters/weibo/favorites-publish.d.ts.map +1 -0
  242. package/dist/adapters/weibo/favorites-publish.js +356 -0
  243. package/dist/adapters/weibo/favorites-publish.js.map +1 -0
  244. package/dist/adapters/wikidata/entities.d.ts +15 -0
  245. package/dist/adapters/wikidata/entities.d.ts.map +1 -0
  246. package/dist/adapters/wikidata/entities.js +219 -0
  247. package/dist/adapters/wikidata/entities.js.map +1 -0
  248. package/dist/adapters/wikipedia/page.d.ts +21 -0
  249. package/dist/adapters/wikipedia/page.d.ts.map +1 -0
  250. package/dist/adapters/wikipedia/page.js +116 -0
  251. package/dist/adapters/wikipedia/page.js.map +1 -0
  252. package/dist/adapters/wttr/weather.d.ts +12 -0
  253. package/dist/adapters/wttr/weather.d.ts.map +1 -0
  254. package/dist/adapters/wttr/weather.js +207 -0
  255. package/dist/adapters/wttr/weather.js.map +1 -0
  256. package/dist/adapters/xianyu/publish.d.ts +31 -0
  257. package/dist/adapters/xianyu/publish.d.ts.map +1 -0
  258. package/dist/adapters/xianyu/publish.js +349 -0
  259. package/dist/adapters/xianyu/publish.js.map +1 -0
  260. package/dist/adapters/xiaohongshu/user-helpers.d.ts +2 -2
  261. package/dist/adapters/xiaohongshu/user-helpers.d.ts.map +1 -1
  262. package/dist/adapters/xiaohongshu/user-helpers.js +5 -4
  263. package/dist/adapters/xiaohongshu/user-helpers.js.map +1 -1
  264. package/dist/adapters/yuanbao/web.d.ts +27 -0
  265. package/dist/adapters/yuanbao/web.d.ts.map +1 -0
  266. package/dist/adapters/yuanbao/web.js +365 -0
  267. package/dist/adapters/yuanbao/web.js.map +1 -0
  268. package/dist/adapters/zhihu/collection.d.ts +33 -0
  269. package/dist/adapters/zhihu/collection.d.ts.map +1 -0
  270. package/dist/adapters/zhihu/collection.js +185 -0
  271. package/dist/adapters/zhihu/collection.js.map +1 -0
  272. package/dist/adapters/zlibrary/web.d.ts +19 -0
  273. package/dist/adapters/zlibrary/web.d.ts.map +1 -0
  274. package/dist/adapters/zlibrary/web.js +153 -0
  275. package/dist/adapters/zlibrary/web.js.map +1 -0
  276. package/dist/browser/daemon-client.js +2 -2
  277. package/dist/browser/daemon-client.js.map +1 -1
  278. package/dist/discovery/macos-dynamic.d.ts.map +1 -1
  279. package/dist/discovery/macos-dynamic.js +17 -3
  280. package/dist/discovery/macos-dynamic.js.map +1 -1
  281. package/dist/manifest-compact.txt +10 -10
  282. package/dist/manifest-search.json +1 -1
  283. package/dist/manifest.json +5130 -112
  284. package/dist/transport/refs.d.ts +5 -3
  285. package/dist/transport/refs.d.ts.map +1 -1
  286. package/dist/transport/refs.js +8 -1
  287. package/dist/transport/refs.js.map +1 -1
  288. package/dist/transport/sidecar-binary.d.ts +7 -0
  289. package/dist/transport/sidecar-binary.d.ts.map +1 -1
  290. package/dist/transport/sidecar-binary.js +28 -8
  291. package/dist/transport/sidecar-binary.js.map +1 -1
  292. package/package.json +4 -3
  293. package/server.json +3 -3
  294. package/skills/unicli/SKILL.md +1 -1
  295. package/skills/unicli-claude-code/SKILL.md +1 -1
  296. package/skills/unicli-hermes/SKILL.md +1 -1
  297. package/src/adapters/1point3acres/forum.test.ts +300 -0
  298. package/src/adapters/1point3acres/forum.ts +852 -0
  299. package/src/adapters/aibase/news.test.ts +42 -0
  300. package/src/adapters/aibase/news.ts +118 -0
  301. package/src/adapters/arxiv/papers.test.ts +59 -0
  302. package/src/adapters/arxiv/papers.ts +226 -0
  303. package/src/adapters/bbc/topic.test.ts +52 -0
  304. package/src/adapters/bbc/topic.ts +149 -0
  305. package/src/adapters/chatgpt/web.test.ts +121 -0
  306. package/src/adapters/chatgpt/web.ts +286 -0
  307. package/src/adapters/claude/web.test.ts +206 -0
  308. package/src/adapters/claude/web.ts +684 -0
  309. package/src/adapters/codex/projects.test.ts +77 -0
  310. package/src/adapters/codex/projects.ts +178 -0
  311. package/src/adapters/coingecko/markets.test.ts +156 -0
  312. package/src/adapters/coingecko/markets.ts +574 -0
  313. package/src/adapters/coupang/product.test.ts +111 -0
  314. package/src/adapters/coupang/product.ts +256 -0
  315. package/src/adapters/crates/registry.test.ts +89 -0
  316. package/src/adapters/crates/registry.ts +247 -0
  317. package/src/adapters/ctrip/travel.test.ts +359 -0
  318. package/src/adapters/ctrip/travel.ts +792 -0
  319. package/src/adapters/dblp/publications.test.ts +123 -0
  320. package/src/adapters/dblp/publications.ts +494 -0
  321. package/src/adapters/deepseek/web.test.ts +69 -0
  322. package/src/adapters/deepseek/web.ts +78 -1
  323. package/src/adapters/defillama/protocols.test.ts +75 -0
  324. package/src/adapters/defillama/protocols.ts +253 -0
  325. package/src/adapters/devto/read.test.ts +49 -0
  326. package/src/adapters/devto/read.ts +145 -0
  327. package/src/adapters/dianping/shop.test.ts +134 -0
  328. package/src/adapters/dianping/shop.ts +261 -0
  329. package/src/adapters/dockerhub/registry.test.ts +97 -0
  330. package/src/adapters/dockerhub/registry.ts +223 -0
  331. package/src/adapters/endoflife/product.test.ts +50 -0
  332. package/src/adapters/endoflife/product.ts +128 -0
  333. package/src/adapters/facebook/marketplace-extra.test.ts +132 -0
  334. package/src/adapters/facebook/marketplace-extra.ts +213 -0
  335. package/src/adapters/flathub/apps.test.ts +85 -0
  336. package/src/adapters/flathub/apps.ts +254 -0
  337. package/src/adapters/goproxy/module.test.ts +72 -0
  338. package/src/adapters/goproxy/module.ts +258 -0
  339. package/src/adapters/grok/web.test.ts +181 -0
  340. package/src/adapters/grok/web.ts +640 -0
  341. package/src/adapters/hackernews/read.test.ts +68 -0
  342. package/src/adapters/hackernews/read.ts +265 -0
  343. package/src/adapters/hf/paper.test.ts +48 -0
  344. package/src/adapters/hf/paper.ts +138 -0
  345. package/src/adapters/homebrew/packages.test.ts +109 -0
  346. package/src/adapters/homebrew/packages.ts +304 -0
  347. package/src/adapters/indeed/jobs.test.ts +230 -0
  348. package/src/adapters/indeed/jobs.ts +375 -0
  349. package/src/adapters/instagram/collections.test.ts +94 -0
  350. package/src/adapters/instagram/collections.ts +206 -0
  351. package/src/adapters/lichess/players.test.ts +99 -0
  352. package/src/adapters/lichess/players.ts +277 -0
  353. package/src/adapters/lobsters/read-domain.test.ts +121 -0
  354. package/src/adapters/lobsters/read-domain.ts +400 -0
  355. package/src/adapters/maven/artifact.test.ts +67 -0
  356. package/src/adapters/maven/artifact.ts +155 -0
  357. package/src/adapters/mdn/search.test.ts +39 -0
  358. package/src/adapters/mdn/search.ts +133 -0
  359. package/src/adapters/medium/tag.test.ts +64 -0
  360. package/src/adapters/medium/tag.ts +164 -0
  361. package/src/adapters/npm/package.test.ts +53 -0
  362. package/src/adapters/npm/package.ts +177 -0
  363. package/src/adapters/nuget/package.test.ts +102 -0
  364. package/src/adapters/nuget/package.ts +193 -0
  365. package/src/adapters/nvd/cve.test.ts +66 -0
  366. package/src/adapters/nvd/cve.ts +182 -0
  367. package/src/adapters/oeis/sequences.test.ts +71 -0
  368. package/src/adapters/oeis/sequences.ts +234 -0
  369. package/src/adapters/openalex/works.test.ts +99 -0
  370. package/src/adapters/openalex/works.ts +319 -0
  371. package/src/adapters/openfda/records.test.ts +90 -0
  372. package/src/adapters/openfda/records.ts +239 -0
  373. package/src/adapters/openreview/papers.test.ts +139 -0
  374. package/src/adapters/openreview/papers.ts +560 -0
  375. package/src/adapters/osv/security.test.ts +91 -0
  376. package/src/adapters/osv/security.ts +298 -0
  377. package/src/adapters/packagist/package.test.ts +62 -0
  378. package/src/adapters/packagist/package.ts +146 -0
  379. package/src/adapters/pubmed/articles.test.ts +96 -0
  380. package/src/adapters/pubmed/articles.ts +497 -0
  381. package/src/adapters/pypi/package.test.ts +131 -0
  382. package/src/adapters/pypi/package.ts +297 -0
  383. package/src/adapters/qwen/web.test.ts +176 -0
  384. package/src/adapters/qwen/web.ts +758 -0
  385. package/src/adapters/reddit/account.test.ts +56 -0
  386. package/src/adapters/reddit/account.ts +493 -0
  387. package/src/adapters/rednote/web.test.ts +354 -0
  388. package/src/adapters/rednote/web.ts +968 -0
  389. package/src/adapters/rest-countries/countries.test.ts +80 -0
  390. package/src/adapters/rest-countries/countries.ts +271 -0
  391. package/src/adapters/reuters/article-detail.test.ts +65 -0
  392. package/src/adapters/reuters/article-detail.ts +186 -0
  393. package/src/adapters/rfc/rfc.test.ts +37 -0
  394. package/src/adapters/rfc/rfc.ts +133 -0
  395. package/src/adapters/rubygems/gem.test.ts +43 -0
  396. package/src/adapters/rubygems/gem.ts +126 -0
  397. package/src/adapters/stackoverflow/questions.test.ts +207 -0
  398. package/src/adapters/stackoverflow/questions.ts +765 -0
  399. package/src/adapters/steam/app.test.ts +68 -0
  400. package/src/adapters/steam/app.ts +218 -0
  401. package/src/adapters/tiktok/creator-videos.test.ts +158 -0
  402. package/src/adapters/tiktok/creator-videos.ts +370 -0
  403. package/src/adapters/tvmaze/shows.test.ts +93 -0
  404. package/src/adapters/tvmaze/shows.ts +271 -0
  405. package/src/adapters/twitter/bookmark-folders.test.ts +164 -0
  406. package/src/adapters/twitter/bookmark-folders.ts +366 -0
  407. package/src/adapters/twitter/quote.test.ts +157 -0
  408. package/src/adapters/twitter/quote.ts +332 -0
  409. package/src/adapters/twitter/tweet-actions.test.ts +51 -0
  410. package/src/adapters/twitter/tweet-actions.ts +187 -0
  411. package/src/adapters/twitter/tweet-url.ts +65 -0
  412. package/src/adapters/uisdc/news.test.ts +46 -0
  413. package/src/adapters/uisdc/news.ts +111 -0
  414. package/src/adapters/weibo/favorites-publish.test.ts +177 -0
  415. package/src/adapters/weibo/favorites-publish.ts +426 -0
  416. package/src/adapters/wikidata/entities.test.ts +103 -0
  417. package/src/adapters/wikidata/entities.ts +253 -0
  418. package/src/adapters/wikipedia/page.test.ts +49 -0
  419. package/src/adapters/wikipedia/page.ts +158 -0
  420. package/src/adapters/wttr/weather.test.ts +99 -0
  421. package/src/adapters/wttr/weather.ts +239 -0
  422. package/src/adapters/xianyu/publish.test.ts +210 -0
  423. package/src/adapters/xianyu/publish.ts +420 -0
  424. package/src/adapters/xiaohongshu/user-helpers.ts +5 -2
  425. package/src/adapters/yuanbao/web.test.ts +144 -0
  426. package/src/adapters/yuanbao/web.ts +435 -0
  427. package/src/adapters/zhihu/collection.test.ts +96 -0
  428. package/src/adapters/zhihu/collection.ts +239 -0
  429. package/src/adapters/zlibrary/web.test.ts +104 -0
  430. package/src/adapters/zlibrary/web.ts +192 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * @owner src/adapters/wikidata/entities.ts
3
+ * @does Register agent-facing Wikidata entity search and detail commands.
4
+ * @needs Wikidata public APIs, language validation, Q/P/L entity id validation.
5
+ * @feeds surface coverage ledger, Wikidata search rows, entity summary rows.
6
+ * @breaks Wikidata API drift, weak id validation, or silent empty rows hide entity lookup failures.
7
+ */
8
+ import { cli, Strategy } from "../../registry.js";
9
+ const API_BASE = "https://www.wikidata.org";
10
+ const ENTITY_ID_RE = /^[QPL]\d+$/;
11
+ function requireNonEmpty(value, label) {
12
+ const text = String(value ?? "").trim();
13
+ if (!text)
14
+ throw new Error(`wikidata ${label} cannot be empty.`);
15
+ return text;
16
+ }
17
+ export function requireWikidataLimit(value) {
18
+ const raw = value === undefined || value === null || value === "" ? 20 : value;
19
+ const limit = Number(raw);
20
+ if (!Number.isInteger(limit) || limit < 1 || limit > 50) {
21
+ throw new Error("wikidata limit must be an integer in [1, 50].");
22
+ }
23
+ return limit;
24
+ }
25
+ export function requireWikidataLanguage(value) {
26
+ const language = String(value ?? "en")
27
+ .trim()
28
+ .toLowerCase();
29
+ if (!/^[a-z]{2,3}(-[a-z]{2,8})?$/.test(language)) {
30
+ throw new Error(`wikidata language "${String(value)}" is not valid.`);
31
+ }
32
+ return language;
33
+ }
34
+ export function requireWikidataEntityId(value) {
35
+ const raw = String(value ?? "")
36
+ .trim()
37
+ .toUpperCase();
38
+ if (!raw)
39
+ throw new Error("wikidata entity id cannot be empty.");
40
+ const id = raw.replace(/^HTTPS?:\/\/[^/]+\/WIKI\//i, "");
41
+ if (!ENTITY_ID_RE.test(id)) {
42
+ throw new Error(`wikidata entity id "${String(value)}" is not valid.`);
43
+ }
44
+ return id;
45
+ }
46
+ function objectField(value) {
47
+ return value && typeof value === "object"
48
+ ? value
49
+ : {};
50
+ }
51
+ function stringField(value) {
52
+ return typeof value === "string" ? value.trim() : "";
53
+ }
54
+ export function pickLocalizedValue(map, language) {
55
+ const values = objectField(map);
56
+ const direct = objectField(values[language]);
57
+ if (stringField(direct.value))
58
+ return stringField(direct.value);
59
+ const english = objectField(values.en);
60
+ return stringField(english.value) || null;
61
+ }
62
+ export function joinLocalizedAliases(value, language, max = 5) {
63
+ const aliases = objectField(value);
64
+ const direct = Array.isArray(aliases[language]) ? aliases[language] : [];
65
+ const fallback = Array.isArray(aliases.en) ? aliases.en : [];
66
+ const list = direct.length > 0 ? direct : fallback;
67
+ const names = list
68
+ .map((item) => stringField(objectField(item).value))
69
+ .filter(Boolean);
70
+ return names.length > max
71
+ ? [...names.slice(0, max), `(+${names.length - max})`].join(", ")
72
+ : names.join(", ");
73
+ }
74
+ export function mapWikidataSearchRows(rows, limit) {
75
+ return rows.slice(0, limit).map((row, index) => {
76
+ const qid = stringField(row.id);
77
+ const match = objectField(row.match);
78
+ return {
79
+ rank: index + 1,
80
+ qid,
81
+ label: stringField(row.label),
82
+ description: stringField(row.description),
83
+ matchType: stringField(match.type),
84
+ matchText: stringField(match.text),
85
+ url: qid ? `${API_BASE}/wiki/${qid}` : "",
86
+ };
87
+ });
88
+ }
89
+ export function mapWikidataEntityRow(id, entity, language) {
90
+ const claims = objectField(entity.claims);
91
+ const sitelinks = objectField(entity.sitelinks);
92
+ const enwiki = objectField(sitelinks.enwiki);
93
+ return {
94
+ qid: id,
95
+ type: stringField(entity.type),
96
+ label: pickLocalizedValue(entity.labels, language),
97
+ description: pickLocalizedValue(entity.descriptions, language),
98
+ aliases: joinLocalizedAliases(entity.aliases, language),
99
+ claimPropertyCount: Object.keys(claims).length,
100
+ sitelinkCount: Object.keys(sitelinks).length,
101
+ enwikiTitle: stringField(enwiki.title) || null,
102
+ modified: stringField(entity.modified) || null,
103
+ url: `${API_BASE}/wiki/${id}`,
104
+ };
105
+ }
106
+ async function fetchJson(url, label) {
107
+ const response = await fetch(url, {
108
+ headers: {
109
+ accept: "application/json",
110
+ "user-agent": "unicli-wikidata (https://github.com/olo-dot-io/Uni-CLI)",
111
+ },
112
+ });
113
+ if (response.status === 404)
114
+ throw new Error(`${label} returned no result.`);
115
+ if (response.status === 429)
116
+ throw new Error(`${label} returned HTTP 429.`);
117
+ if (!response.ok)
118
+ throw new Error(`${label} returned HTTP ${response.status}.`);
119
+ return response.json();
120
+ }
121
+ cli({
122
+ site: "wikidata",
123
+ name: "search",
124
+ description: "Search Wikidata items by keyword",
125
+ domain: "www.wikidata.org",
126
+ strategy: Strategy.PUBLIC,
127
+ args: [
128
+ {
129
+ name: "query",
130
+ type: "str",
131
+ required: true,
132
+ positional: true,
133
+ description: "Search keyword",
134
+ },
135
+ {
136
+ name: "language",
137
+ type: "str",
138
+ default: "en",
139
+ description: "Language code",
140
+ },
141
+ { name: "limit", type: "int", default: 20, description: "Max rows" },
142
+ ],
143
+ columns: [
144
+ "rank",
145
+ "qid",
146
+ "label",
147
+ "description",
148
+ "matchType",
149
+ "matchText",
150
+ "url",
151
+ ],
152
+ func: async (_page, kwargs) => {
153
+ const query = requireNonEmpty(kwargs.query, "query");
154
+ const language = requireWikidataLanguage(kwargs.language);
155
+ const limit = requireWikidataLimit(kwargs.limit);
156
+ const url = new URL(`${API_BASE}/w/api.php`);
157
+ url.searchParams.set("action", "wbsearchentities");
158
+ url.searchParams.set("search", query);
159
+ url.searchParams.set("language", language);
160
+ url.searchParams.set("uselang", language);
161
+ url.searchParams.set("type", "item");
162
+ url.searchParams.set("format", "json");
163
+ url.searchParams.set("limit", String(limit));
164
+ url.searchParams.set("origin", "*");
165
+ const body = (await fetchJson(url, "wikidata search"));
166
+ const rows = mapWikidataSearchRows(Array.isArray(body.search)
167
+ ? body.search
168
+ : [], limit);
169
+ if (rows.length === 0) {
170
+ throw new Error(`wikidata search returned no rows for "${query}".`);
171
+ }
172
+ return rows;
173
+ },
174
+ });
175
+ cli({
176
+ site: "wikidata",
177
+ name: "entity",
178
+ description: "Fetch a Wikidata entity by Q/P/L id",
179
+ domain: "www.wikidata.org",
180
+ strategy: Strategy.PUBLIC,
181
+ args: [
182
+ {
183
+ name: "id",
184
+ type: "str",
185
+ required: true,
186
+ positional: true,
187
+ description: "Entity id",
188
+ },
189
+ {
190
+ name: "language",
191
+ type: "str",
192
+ default: "en",
193
+ description: "Language code",
194
+ },
195
+ ],
196
+ columns: [
197
+ "qid",
198
+ "type",
199
+ "label",
200
+ "description",
201
+ "aliases",
202
+ "claimPropertyCount",
203
+ "sitelinkCount",
204
+ "enwikiTitle",
205
+ "modified",
206
+ "url",
207
+ ],
208
+ func: async (_page, kwargs) => {
209
+ const id = requireWikidataEntityId(kwargs.id);
210
+ const language = requireWikidataLanguage(kwargs.language);
211
+ const body = objectField(await fetchJson(`${API_BASE}/wiki/Special:EntityData/${encodeURIComponent(id)}.json`, "wikidata entity"));
212
+ const entity = objectField(objectField(body.entities)[id]);
213
+ if (!entity.id && !entity.type) {
214
+ throw new Error(`wikidata entity returned no row for "${id}".`);
215
+ }
216
+ return [mapWikidataEntityRow(id, entity, language)];
217
+ },
218
+ });
219
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/adapters/wikidata/entities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAC5C,MAAM,YAAY,GAAG,YAAY,CAAC;AAElC,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,mBAAmB,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,GAAG,GACP,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;SACnC,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SAC5B,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QACvC,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAY,EACZ,QAAgB;IAEhB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAc,EACd,QAAgB,EAChB,GAAG,GAAG,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;SACnD,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG;QACvB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAAoC,EACpC,KAAa;IAEb,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,KAAK,GAAG,CAAC;YACf,GAAG;YACH,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7B,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;YACzC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;SAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,MAA+B,EAC/B,QAAgB;IAEhB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;QAClD,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC9D,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;QACvD,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;QAC9C,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;QAC5C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI;QAC9C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI;QAC9C,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAiB,EAAE,KAAa;IACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,yDAAyD;SACxE;KACF,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;IAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;IAC5E,IAAI,CAAC,QAAQ,CAAC,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kBAAkB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,GAAG,CAAC;IACF,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,kCAAkC;IAC/C,MAAM,EAAE,kBAAkB;IAC1B,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,gBAAgB;SAC9B;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,eAAe;SAC7B;QACD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;KACrE;IACD,OAAO,EAAE;QACP,MAAM;QACN,KAAK;QACL,OAAO;QACP,aAAa;QACb,WAAW;QACX,WAAW;QACX,KAAK;KACN;IACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAC;QAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAEpD,CAAC;QACF,MAAM,IAAI,GAAG,qBAAqB,CAChC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACxB,CAAC,CAAE,IAAI,CAAC,MAAyC;YACjD,CAAC,CAAC,EAAE,EACN,KAAK,CACN,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH,GAAG,CAAC;IACF,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,qCAAqC;IAClD,MAAM,EAAE,kBAAkB;IAC1B,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,WAAW;SACzB;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,eAAe;SAC7B;KACF;IACD,OAAO,EAAE;QACP,KAAK;QACL,MAAM;QACN,OAAO;QACP,aAAa;QACb,SAAS;QACT,oBAAoB;QACpB,eAAe;QACf,aAAa;QACb,UAAU;QACV,KAAK;KACN;IACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5B,MAAM,EAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,WAAW,CACtB,MAAM,SAAS,CACb,GAAG,QAAQ,4BAA4B,kBAAkB,CAAC,EAAE,CAAC,OAAO,EACpE,iBAAiB,CAClB,CACF,CAAC;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @owner src/adapters/wikipedia/page.ts
3
+ * @does Register agent-facing full Wikipedia page extract command.
4
+ * @needs MediaWiki Action API, language validation, explicit paragraph caps.
5
+ * @feeds surface coverage ledger, encyclopedia article reading workflow.
6
+ * @breaks MediaWiki envelope drift or silent extract truncation hides article content.
7
+ */
8
+ interface WikiPage {
9
+ title?: unknown;
10
+ description?: unknown;
11
+ pageid?: unknown;
12
+ extract?: unknown;
13
+ fullurl?: unknown;
14
+ missing?: unknown;
15
+ }
16
+ export declare function requireWikiTitle(value: unknown): string;
17
+ export declare function requireWikiLang(value: unknown): string;
18
+ export declare function requireParagraphCap(value: unknown): number;
19
+ export declare function mapWikipediaPageRow(page: WikiPage | undefined, lang: string, requestedTitle: string, paragraphCap: number): Record<string, unknown>;
20
+ export {};
21
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../src/adapters/wikipedia/page.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,UAAU,QAAQ;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIvD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUtD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO1D;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BzB"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @owner src/adapters/wikipedia/page.ts
3
+ * @does Register agent-facing full Wikipedia page extract command.
4
+ * @needs MediaWiki Action API, language validation, explicit paragraph caps.
5
+ * @feeds surface coverage ledger, encyclopedia article reading workflow.
6
+ * @breaks MediaWiki envelope drift or silent extract truncation hides article content.
7
+ */
8
+ import { cli, Strategy } from "../../registry.js";
9
+ function stringField(value) {
10
+ return typeof value === "string" ? value : "";
11
+ }
12
+ export function requireWikiTitle(value) {
13
+ const title = String(value ?? "").trim();
14
+ if (!title)
15
+ throw new Error("wikipedia page title cannot be empty.");
16
+ return title;
17
+ }
18
+ export function requireWikiLang(value) {
19
+ const lang = String(value ?? "en")
20
+ .trim()
21
+ .toLowerCase();
22
+ if (!/^[a-z]{2,3}(?:-[a-z0-9]+)?$/.test(lang)) {
23
+ throw new Error(`wikipedia lang must be a language code, got "${String(value)}".`);
24
+ }
25
+ return lang;
26
+ }
27
+ export function requireParagraphCap(value) {
28
+ if (value === undefined || value === null || value === "")
29
+ return 0;
30
+ const n = Number(value);
31
+ if (!Number.isInteger(n) || n < 0) {
32
+ throw new Error("paragraphs must be a non-negative integer.");
33
+ }
34
+ return n;
35
+ }
36
+ export function mapWikipediaPageRow(page, lang, requestedTitle, paragraphCap) {
37
+ if (!page || page.missing) {
38
+ throw new Error(`No Wikipedia article "${requestedTitle}" on ${lang}.wikipedia.org.`);
39
+ }
40
+ const fullExtract = stringField(page.extract);
41
+ if (!fullExtract.trim()) {
42
+ throw new Error(`Wikipedia article "${stringField(page.title) || requestedTitle}" has no plain-text extract.`);
43
+ }
44
+ const paragraphs = fullExtract
45
+ .split(/\n{2,}/)
46
+ .map((part) => part.trim())
47
+ .filter(Boolean);
48
+ const selected = paragraphCap > 0 ? paragraphs.slice(0, paragraphCap) : paragraphs;
49
+ const title = stringField(page.title) || requestedTitle;
50
+ return {
51
+ title,
52
+ description: stringField(page.description),
53
+ pageId: page.pageid ?? null,
54
+ paragraphs: selected.length,
55
+ extract: selected.join("\n\n"),
56
+ url: stringField(page.fullurl) ||
57
+ `https://${lang}.wikipedia.org/wiki/${encodeURIComponent(title.replace(/ /g, "_"))}`,
58
+ };
59
+ }
60
+ async function fetchWikipediaPage(lang, title) {
61
+ const url = new URL(`https://${lang}.wikipedia.org/w/api.php`);
62
+ url.searchParams.set("action", "query");
63
+ url.searchParams.set("format", "json");
64
+ url.searchParams.set("formatversion", "2");
65
+ url.searchParams.set("prop", "extracts|info|description");
66
+ url.searchParams.set("inprop", "url");
67
+ url.searchParams.set("explaintext", "1");
68
+ url.searchParams.set("redirects", "1");
69
+ url.searchParams.set("titles", title);
70
+ const response = await fetch(url, {
71
+ headers: {
72
+ "User-Agent": "unicli-wikipedia/1.0 (https://github.com/olo-dot-io/Uni-CLI)",
73
+ Accept: "application/json",
74
+ },
75
+ });
76
+ if (!response.ok)
77
+ throw new Error(`wikipedia page returned HTTP ${response.status}.`);
78
+ const data = (await response.json());
79
+ if (data.error) {
80
+ throw new Error(`wikipedia API error: ${stringField(data.error.info) || stringField(data.error.code)}`);
81
+ }
82
+ return Array.isArray(data.query?.pages) ? data.query.pages[0] : {};
83
+ }
84
+ cli({
85
+ site: "wikipedia",
86
+ name: "page",
87
+ description: "Full plain-text extract of a Wikipedia article",
88
+ domain: "wikipedia.org",
89
+ strategy: Strategy.PUBLIC,
90
+ args: [
91
+ {
92
+ name: "title",
93
+ type: "str",
94
+ required: true,
95
+ positional: true,
96
+ description: "Article title",
97
+ },
98
+ { name: "lang", type: "str", default: "en", description: "Language code" },
99
+ {
100
+ name: "paragraphs",
101
+ type: "int",
102
+ default: 0,
103
+ description: "Paragraph cap, 0 means full",
104
+ },
105
+ ],
106
+ columns: ["title", "description", "pageId", "paragraphs", "extract", "url"],
107
+ func: async (_page, kwargs) => {
108
+ const title = requireWikiTitle(kwargs.title);
109
+ const lang = requireWikiLang(kwargs.lang);
110
+ const paragraphCap = requireParagraphCap(kwargs.paragraphs);
111
+ return [
112
+ mapWikipediaPageRow(await fetchWikipediaPage(lang, title), lang, title, paragraphCap),
113
+ ];
114
+ },
115
+ });
116
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../../src/adapters/wikipedia/page.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAWlD,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;SAC/B,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,gDAAgD,MAAM,CAAC,KAAK,CAAC,IAAI,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAA0B,EAC1B,IAAY,EACZ,cAAsB,EACtB,YAAoB;IAEpB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,yBAAyB,cAAc,QAAQ,IAAI,iBAAiB,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,sBAAsB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,8BAA8B,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,WAAW;SAC3B,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GACZ,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACpE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC;IACxD,OAAO;QACL,KAAK;QACL,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,GAAG,EACD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;YACzB,WAAW,IAAI,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;KACvF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,IAAY,EACZ,KAAa;IAEb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC;IAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,YAAY,EACV,8DAA8D;YAChE,MAAM,EAAE,kBAAkB;SAC3B;KACF,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,GAAG,CAAC;IACF,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,gDAAgD;IAC7D,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,eAAe;SAC7B;QACD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;QAC1E;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,6BAA6B;SAC3C;KACF;IACD,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC;IAC3E,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,OAAO;YACL,mBAAmB,CACjB,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,EACrC,IAAI,EACJ,KAAK,EACL,YAAY,CACb;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @owner src/adapters/wttr/weather.ts
3
+ * @does Register agent-facing wttr current weather and forecast commands.
4
+ * @needs wttr.in JSON endpoint, bounded forecast days, explicit empty-result errors.
5
+ * @feeds surface coverage ledger, weather lookup rows, global public weather coverage.
6
+ * @breaks wttr.in schema drift, non-JSON unknown-location responses, or silent empty rows hide weather failures.
7
+ */
8
+ export declare function requireWttrDays(value: unknown): number;
9
+ export declare function pickWeatherDescription(value: unknown): string;
10
+ export declare function mapCurrentWeatherRow(body: Record<string, unknown>, fallbackLocation: string): Record<string, unknown>;
11
+ export declare function mapForecastRows(body: Record<string, unknown>, days: number, fallbackLocation: string): Array<Record<string, unknown>>;
12
+ //# sourceMappingURL=weather.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../../../src/adapters/wttr/weather.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOtD;AAgBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI7D;AAQD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BzB;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAgChC"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * @owner src/adapters/wttr/weather.ts
3
+ * @does Register agent-facing wttr current weather and forecast commands.
4
+ * @needs wttr.in JSON endpoint, bounded forecast days, explicit empty-result errors.
5
+ * @feeds surface coverage ledger, weather lookup rows, global public weather coverage.
6
+ * @breaks wttr.in schema drift, non-JSON unknown-location responses, or silent empty rows hide weather failures.
7
+ */
8
+ import { cli, Strategy } from "../../registry.js";
9
+ const API_BASE = "https://wttr.in";
10
+ function requireLocation(value) {
11
+ const location = String(value ?? "").trim();
12
+ if (!location)
13
+ throw new Error("wttr location cannot be empty.");
14
+ return location;
15
+ }
16
+ export function requireWttrDays(value) {
17
+ const raw = value === undefined || value === null || value === "" ? 3 : value;
18
+ const days = Number(raw);
19
+ if (!Number.isInteger(days) || days < 1 || days > 3) {
20
+ throw new Error("wttr days must be an integer in [1, 3].");
21
+ }
22
+ return days;
23
+ }
24
+ function stringField(value) {
25
+ return typeof value === "string" ? value : "";
26
+ }
27
+ function numberField(value) {
28
+ const n = typeof value === "number"
29
+ ? value
30
+ : typeof value === "string" && value.trim()
31
+ ? Number(value)
32
+ : NaN;
33
+ return Number.isFinite(n) ? n : null;
34
+ }
35
+ export function pickWeatherDescription(value) {
36
+ if (!Array.isArray(value) || value.length === 0)
37
+ return "";
38
+ const first = value[0];
39
+ return typeof first.value === "string" ? first.value.trim() : "";
40
+ }
41
+ function firstArrayItem(value) {
42
+ return Array.isArray(value) && value[0] && typeof value[0] === "object"
43
+ ? value[0]
44
+ : null;
45
+ }
46
+ export function mapCurrentWeatherRow(body, fallbackLocation) {
47
+ const current = firstArrayItem(body.current_condition);
48
+ if (!current)
49
+ throw new Error(`wttr current returned no conditions for "${fallbackLocation}".`);
50
+ const area = firstArrayItem(body.nearest_area);
51
+ return {
52
+ location: pickWeatherDescription(area?.areaName) || fallbackLocation,
53
+ region: pickWeatherDescription(area?.region),
54
+ country: pickWeatherDescription(area?.country),
55
+ latitude: stringField(area?.latitude),
56
+ longitude: stringField(area?.longitude),
57
+ observedAt: stringField(current.localObsDateTime),
58
+ tempC: numberField(current.temp_C),
59
+ tempF: numberField(current.temp_F),
60
+ feelsLikeC: numberField(current.FeelsLikeC),
61
+ feelsLikeF: numberField(current.FeelsLikeF),
62
+ description: pickWeatherDescription(current.weatherDesc),
63
+ humidity: numberField(current.humidity),
64
+ cloudCover: numberField(current.cloudcover),
65
+ pressure: numberField(current.pressure),
66
+ precipMm: numberField(current.precipMM),
67
+ visibilityKm: numberField(current.visibility),
68
+ uvIndex: numberField(current.uvIndex),
69
+ windKmph: numberField(current.windspeedKmph),
70
+ windDirection: stringField(current.winddir16Point),
71
+ windDirectionDegree: numberField(current.winddirDegree),
72
+ };
73
+ }
74
+ export function mapForecastRows(body, days, fallbackLocation) {
75
+ const list = Array.isArray(body.weather)
76
+ ? body.weather
77
+ : [];
78
+ if (list.length === 0) {
79
+ throw new Error(`wttr forecast returned no rows for "${fallbackLocation}".`);
80
+ }
81
+ return list.slice(0, days).map((day, index) => {
82
+ const hourly = Array.isArray(day.hourly)
83
+ ? day.hourly
84
+ : [];
85
+ const noon = hourly[4] ?? hourly[0] ?? {};
86
+ const astro = firstArrayItem(day.astronomy);
87
+ return {
88
+ rank: index + 1,
89
+ date: stringField(day.date),
90
+ minTempC: numberField(day.mintempC),
91
+ maxTempC: numberField(day.maxtempC),
92
+ avgTempC: numberField(day.avgtempC),
93
+ minTempF: numberField(day.mintempF),
94
+ maxTempF: numberField(day.maxtempF),
95
+ avgTempF: numberField(day.avgtempF),
96
+ sunHour: numberField(day.sunHour),
97
+ totalSnowCm: numberField(day.totalSnow_cm),
98
+ uvIndex: numberField(day.uvIndex),
99
+ description: pickWeatherDescription(noon.weatherDesc),
100
+ sunrise: stringField(astro?.sunrise),
101
+ sunset: stringField(astro?.sunset),
102
+ };
103
+ });
104
+ }
105
+ async function fetchWeather(location, label) {
106
+ const url = new URL(`${API_BASE}/${encodeURIComponent(location)}`);
107
+ url.searchParams.set("format", "j1");
108
+ const response = await fetch(url, {
109
+ headers: {
110
+ accept: "application/json",
111
+ "user-agent": "unicli-wttr (https://github.com/olo-dot-io/Uni-CLI)",
112
+ },
113
+ });
114
+ if (response.status === 404)
115
+ throw new Error(`${label} returned no result.`);
116
+ if (!response.ok)
117
+ throw new Error(`${label} returned HTTP ${response.status}.`);
118
+ try {
119
+ return (await response.json());
120
+ }
121
+ catch {
122
+ throw new Error(`${label} returned non-JSON weather data for "${location}".`);
123
+ }
124
+ }
125
+ cli({
126
+ site: "wttr",
127
+ name: "current",
128
+ description: "Current weather conditions for a location",
129
+ domain: "wttr.in",
130
+ strategy: Strategy.PUBLIC,
131
+ args: [
132
+ {
133
+ name: "location",
134
+ type: "str",
135
+ required: true,
136
+ positional: true,
137
+ description: "City, lat/lon, airport code, or domain location",
138
+ },
139
+ ],
140
+ columns: [
141
+ "location",
142
+ "region",
143
+ "country",
144
+ "latitude",
145
+ "longitude",
146
+ "observedAt",
147
+ "tempC",
148
+ "tempF",
149
+ "feelsLikeC",
150
+ "feelsLikeF",
151
+ "description",
152
+ "humidity",
153
+ "cloudCover",
154
+ "pressure",
155
+ "precipMm",
156
+ "visibilityKm",
157
+ "uvIndex",
158
+ "windKmph",
159
+ "windDirection",
160
+ "windDirectionDegree",
161
+ ],
162
+ func: async (_page, kwargs) => {
163
+ const location = requireLocation(kwargs.location);
164
+ return [
165
+ mapCurrentWeatherRow(await fetchWeather(location, "wttr current"), location),
166
+ ];
167
+ },
168
+ });
169
+ cli({
170
+ site: "wttr",
171
+ name: "forecast",
172
+ description: "Multi-day weather forecast for a location",
173
+ domain: "wttr.in",
174
+ strategy: Strategy.PUBLIC,
175
+ args: [
176
+ {
177
+ name: "location",
178
+ type: "str",
179
+ required: true,
180
+ positional: true,
181
+ description: "City, lat/lon, airport code, or domain location",
182
+ },
183
+ { name: "days", type: "int", default: 3, description: "Forecast days" },
184
+ ],
185
+ columns: [
186
+ "rank",
187
+ "date",
188
+ "minTempC",
189
+ "maxTempC",
190
+ "avgTempC",
191
+ "minTempF",
192
+ "maxTempF",
193
+ "avgTempF",
194
+ "sunHour",
195
+ "totalSnowCm",
196
+ "uvIndex",
197
+ "description",
198
+ "sunrise",
199
+ "sunset",
200
+ ],
201
+ func: async (_page, kwargs) => {
202
+ const location = requireLocation(kwargs.location);
203
+ const days = requireWttrDays(kwargs.days);
204
+ return mapForecastRows(await fetchWeather(location, "wttr forecast"), days, location);
205
+ },
206
+ });
207
+ //# sourceMappingURL=weather.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.js","sourceRoot":"","sources":["../../../src/adapters/wttr/weather.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @owner src/adapters/xianyu/publish.ts
3
+ * @does Register agent-facing Xianyu publish automation implemented with site-specific safety checks.
4
+ * @needs Logged-in goofish.com browser session, stable publish form selectors, and optional local image files.
5
+ * @feeds surface coverage ledger and Xianyu listing publishing workflows.
6
+ * @breaks Goofish publish-form DOM drift, category chooser changes, or upload input changes.
7
+ */
8
+ interface XianyuPublishArgs {
9
+ title: string;
10
+ description: string;
11
+ price: string;
12
+ condition: string;
13
+ category: string;
14
+ originalPrice: string | null;
15
+ location: string;
16
+ images: string[];
17
+ }
18
+ export declare function buildXianyuPublishUrl(): string;
19
+ export declare function requireXianyuText(value: unknown, label: string): string;
20
+ export declare function parseXianyuPositivePrice(value: unknown, label: string): string | null;
21
+ export declare function validateXianyuCondition(value: unknown): string;
22
+ export declare function validateXianyuImagePaths(value: unknown): string[];
23
+ export declare function normalizeXianyuPublishArgs(kwargs: Record<string, unknown>): XianyuPublishArgs;
24
+ export declare function buildXianyuPageStateScript(): string;
25
+ export declare function buildXianyuFillFormScript(data: XianyuPublishArgs): string;
26
+ export declare function buildXianyuSelectCategoryScript(categoryName: string): string;
27
+ export declare function buildXianyuFindFileInputScript(): string;
28
+ export declare function buildXianyuSubmitScript(): string;
29
+ export declare function buildXianyuDetectSuccessScript(): string;
30
+ export {};
31
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/adapters/xianyu/publish.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAeD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAYD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAaf;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ9D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAyBjE;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,iBAAiB,CAkBnB;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAOnD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAoEzE;AAED,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CA4B5E;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAUvD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAahD;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAmBvD"}