publishport-opencli 1.0.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 (1860) hide show
  1. package/LICENSE +214 -0
  2. package/README.md +299 -0
  3. package/README.zh-CN.md +341 -0
  4. package/cli-manifest.json +51513 -0
  5. package/clis/12306/auth.js +25 -0
  6. package/clis/12306/me.js +9 -0
  7. package/clis/12306/orders.js +13 -0
  8. package/clis/12306/passengers.js +14 -0
  9. package/clis/12306/price.js +1 -0
  10. package/clis/12306/stations.js +1 -0
  11. package/clis/12306/train.js +1 -0
  12. package/clis/12306/trains.js +1 -0
  13. package/clis/12306/utils.js +1 -0
  14. package/clis/1688/assets.js +127 -0
  15. package/clis/1688/auth.js +1 -0
  16. package/clis/1688/download.js +1 -0
  17. package/clis/1688/item.js +21 -0
  18. package/clis/1688/search.js +129 -0
  19. package/clis/1688/shared.js +11 -0
  20. package/clis/1688/store.js +26 -0
  21. package/clis/1point3acres/auth.js +18 -0
  22. package/clis/1point3acres/digest.js +1 -0
  23. package/clis/1point3acres/forum.js +1 -0
  24. package/clis/1point3acres/forums.js +1 -0
  25. package/clis/1point3acres/hot.js +1 -0
  26. package/clis/1point3acres/latest.js +1 -0
  27. package/clis/1point3acres/notifications.js +1 -0
  28. package/clis/1point3acres/search.js +1 -0
  29. package/clis/1point3acres/thread.js +2 -0
  30. package/clis/1point3acres/user.js +1 -0
  31. package/clis/1point3acres/utils.js +6 -0
  32. package/clis/36kr/article.js +20 -0
  33. package/clis/36kr/hot.js +16 -0
  34. package/clis/36kr/news.js +1 -0
  35. package/clis/36kr/search.js +36 -0
  36. package/clis/51job/company.js +36 -0
  37. package/clis/51job/detail.js +35 -0
  38. package/clis/51job/hot.js +1 -0
  39. package/clis/51job/search.js +1 -0
  40. package/clis/51job/utils.js +21 -0
  41. package/clis/_atlassian/shared.js +21 -0
  42. package/clis/_shared/article/auth.js +16 -0
  43. package/clis/_shared/article/douban-md2draft.js +4 -0
  44. package/clis/_shared/article/format.js +1 -0
  45. package/clis/_shared/article/images.js +95 -0
  46. package/clis/_shared/article/login.js +1 -0
  47. package/clis/_shared/article/page-runtime.js +745 -0
  48. package/clis/_shared/article/publish.js +34 -0
  49. package/clis/_shared/common.js +1 -0
  50. package/clis/_shared/content-guard.js +1 -0
  51. package/clis/_shared/desktop-commands.js +1 -0
  52. package/clis/_shared/search-adapter.js +1 -0
  53. package/clis/_shared/site-auth.js +1 -0
  54. package/clis/_shared/token-auth.js +2 -0
  55. package/clis/_shared/video-publish.js +62 -0
  56. package/clis/aibase/news.js +31 -0
  57. package/clis/amazon/auth.js +19 -0
  58. package/clis/amazon/bestsellers.js +1 -0
  59. package/clis/amazon/discussion.js +20 -0
  60. package/clis/amazon/movers-shakers.js +1 -0
  61. package/clis/amazon/new-releases.js +1 -0
  62. package/clis/amazon/offer.js +29 -0
  63. package/clis/amazon/product.js +25 -0
  64. package/clis/amazon/rankings.js +68 -0
  65. package/clis/amazon/search.js +16 -0
  66. package/clis/amazon/shared.js +11 -0
  67. package/clis/antigravity/SKILL.md +38 -0
  68. package/clis/antigravity/_actions.js +201 -0
  69. package/clis/antigravity/audit-extras.js +78 -0
  70. package/clis/antigravity/delete.js +1 -0
  71. package/clis/antigravity/dump.js +1 -0
  72. package/clis/antigravity/extract-code.js +18 -0
  73. package/clis/antigravity/history.js +1 -0
  74. package/clis/antigravity/mark-read.js +1 -0
  75. package/clis/antigravity/model.js +90 -0
  76. package/clis/antigravity/new.js +9 -0
  77. package/clis/antigravity/read.js +10 -0
  78. package/clis/antigravity/rename.js +1 -0
  79. package/clis/antigravity/send.js +11 -0
  80. package/clis/antigravity/serve.js +97 -0
  81. package/clis/antigravity/status.js +1 -0
  82. package/clis/antigravity/storage.js +12 -0
  83. package/clis/antigravity/watch.js +6 -0
  84. package/clis/apple-podcasts/episodes.js +1 -0
  85. package/clis/apple-podcasts/search.js +1 -0
  86. package/clis/apple-podcasts/top.js +1 -0
  87. package/clis/apple-podcasts/utils.js +1 -0
  88. package/clis/archive/item.js +1 -0
  89. package/clis/archive/search.js +1 -0
  90. package/clis/archive/snapshots.js +1 -0
  91. package/clis/archive/wayback.js +1 -0
  92. package/clis/arxiv/author.js +1 -0
  93. package/clis/arxiv/paper.js +1 -0
  94. package/clis/arxiv/recent.js +1 -0
  95. package/clis/arxiv/search.js +1 -0
  96. package/clis/arxiv/utils.js +1 -0
  97. package/clis/autohome/__fixtures__/catalog.html +11 -0
  98. package/clis/autohome/__fixtures__/koubei.json +116 -0
  99. package/clis/autohome/brand.js +1 -0
  100. package/clis/autohome/score.js +1 -0
  101. package/clis/autohome/utils.js +1 -0
  102. package/clis/baidu-scholar/search.js +63 -0
  103. package/clis/baijiahao/article.js +1 -0
  104. package/clis/baijiahao/lists.js +1 -0
  105. package/clis/baijiahao/login.js +1 -0
  106. package/clis/baijiahao/publish.js +57 -0
  107. package/clis/baijiahao/stats.js +1 -0
  108. package/clis/baijiahao/whoami.js +1 -0
  109. package/clis/band/auth.js +29 -0
  110. package/clis/band/bands.js +37 -0
  111. package/clis/band/mentions.js +6 -0
  112. package/clis/band/post.js +76 -0
  113. package/clis/band/posts.js +50 -0
  114. package/clis/barchart/flow.js +70 -0
  115. package/clis/barchart/greeks.js +88 -0
  116. package/clis/barchart/options.js +61 -0
  117. package/clis/barchart/quote.js +87 -0
  118. package/clis/bbc/news.js +1 -0
  119. package/clis/bbc/topic.js +1 -0
  120. package/clis/bbc/utils.js +1 -0
  121. package/clis/bilibili/article.js +1 -0
  122. package/clis/bilibili/auth.js +1 -0
  123. package/clis/bilibili/categories.js +1 -0
  124. package/clis/bilibili/coin.js +1 -0
  125. package/clis/bilibili/comment-del.js +1 -0
  126. package/clis/bilibili/comment-like.js +1 -0
  127. package/clis/bilibili/comment.js +1 -0
  128. package/clis/bilibili/comments.js +1 -0
  129. package/clis/bilibili/dm-list.js +1 -0
  130. package/clis/bilibili/dm-read.js +1 -0
  131. package/clis/bilibili/dm-send.js +1 -0
  132. package/clis/bilibili/download.js +7 -0
  133. package/clis/bilibili/drafts.js +1 -0
  134. package/clis/bilibili/dynamic-post.js +24 -0
  135. package/clis/bilibili/dynamic.js +1 -0
  136. package/clis/bilibili/favorite-add.js +1 -0
  137. package/clis/bilibili/favorite.js +1 -0
  138. package/clis/bilibili/feed.js +2 -0
  139. package/clis/bilibili/follow.js +1 -0
  140. package/clis/bilibili/following.js +1 -0
  141. package/clis/bilibili/history.js +1 -0
  142. package/clis/bilibili/hot.js +15 -0
  143. package/clis/bilibili/like.js +1 -0
  144. package/clis/bilibili/me.js +1 -0
  145. package/clis/bilibili/partitions.js +1 -0
  146. package/clis/bilibili/ranking.js +1 -0
  147. package/clis/bilibili/search.js +1 -0
  148. package/clis/bilibili/stats.js +1 -0
  149. package/clis/bilibili/subtitle.js +21 -0
  150. package/clis/bilibili/summary.js +1 -0
  151. package/clis/bilibili/topics.js +1 -0
  152. package/clis/bilibili/unfollow.js +1 -0
  153. package/clis/bilibili/upload.js +1 -0
  154. package/clis/bilibili/user-videos.js +1 -0
  155. package/clis/bilibili/utils.js +50 -0
  156. package/clis/bilibili/video-drafts.js +1 -0
  157. package/clis/bilibili/video.js +1 -0
  158. package/clis/binance/asks.js +1 -0
  159. package/clis/binance/depth.js +1 -0
  160. package/clis/binance/gainers.js +1 -0
  161. package/clis/binance/klines.js +1 -0
  162. package/clis/binance/losers.js +1 -0
  163. package/clis/binance/pairs.js +1 -0
  164. package/clis/binance/price.js +1 -0
  165. package/clis/binance/prices.js +1 -0
  166. package/clis/binance/ticker.js +1 -0
  167. package/clis/binance/top.js +1 -0
  168. package/clis/binance/trades.js +1 -0
  169. package/clis/bloomberg/businessweek.js +12 -0
  170. package/clis/bloomberg/crypto.js +1 -0
  171. package/clis/bloomberg/economics.js +1 -0
  172. package/clis/bloomberg/feeds.js +1 -0
  173. package/clis/bloomberg/green.js +1 -0
  174. package/clis/bloomberg/industries.js +1 -0
  175. package/clis/bloomberg/main.js +1 -0
  176. package/clis/bloomberg/markets.js +1 -0
  177. package/clis/bloomberg/news.js +57 -0
  178. package/clis/bloomberg/opinions.js +1 -0
  179. package/clis/bloomberg/politics.js +1 -0
  180. package/clis/bloomberg/pursuits.js +1 -0
  181. package/clis/bloomberg/tech.js +1 -0
  182. package/clis/bloomberg/utils.js +17 -0
  183. package/clis/bluesky/post.js +1 -0
  184. package/clis/bluesky/shared.js +56 -0
  185. package/clis/bluesky/whoami.js +1 -0
  186. package/clis/booking/search.js +93 -0
  187. package/clis/boss/auth.js +13 -0
  188. package/clis/boss/batchgreet.js +1 -0
  189. package/clis/boss/chatlist.js +1 -0
  190. package/clis/boss/chatmsg.js +1 -0
  191. package/clis/boss/detail.js +1 -0
  192. package/clis/boss/exchange.js +1 -0
  193. package/clis/boss/greet.js +1 -0
  194. package/clis/boss/invite.js +4 -0
  195. package/clis/boss/joblist.js +1 -0
  196. package/clis/boss/mark.js +1 -0
  197. package/clis/boss/recommend.js +1 -0
  198. package/clis/boss/resume.js +90 -0
  199. package/clis/boss/search.js +1 -0
  200. package/clis/boss/send.js +1 -0
  201. package/clis/boss/stats.js +1 -0
  202. package/clis/boss/utils.js +161 -0
  203. package/clis/brave/search.js +23 -0
  204. package/clis/chaoxing/assignments.js +1 -0
  205. package/clis/chaoxing/auth.js +21 -0
  206. package/clis/chaoxing/exams.js +1 -0
  207. package/clis/chaoxing/utils.js +58 -0
  208. package/clis/chatgpt/ask.js +1 -0
  209. package/clis/chatgpt/auth.js +17 -0
  210. package/clis/chatgpt/detail.js +1 -0
  211. package/clis/chatgpt/history.js +1 -0
  212. package/clis/chatgpt/image.js +1 -0
  213. package/clis/chatgpt/model.js +1 -0
  214. package/clis/chatgpt/new.js +1 -0
  215. package/clis/chatgpt/project-file-add.js +1 -0
  216. package/clis/chatgpt/project-list.js +1 -0
  217. package/clis/chatgpt/read.js +1 -0
  218. package/clis/chatgpt/send.js +1 -0
  219. package/clis/chatgpt/status.js +1 -0
  220. package/clis/chatgpt/utils.js +1092 -0
  221. package/clis/chatgpt-app/ask.js +1 -0
  222. package/clis/chatgpt-app/ax.js +512 -0
  223. package/clis/chatgpt-app/model.js +1 -0
  224. package/clis/chatgpt-app/new.js +1 -0
  225. package/clis/chatgpt-app/read.js +1 -0
  226. package/clis/chatgpt-app/send.js +1 -0
  227. package/clis/chatgpt-app/status.js +1 -0
  228. package/clis/chatwise/ask.js +1 -0
  229. package/clis/chatwise/export.js +21 -0
  230. package/clis/chatwise/history.js +26 -0
  231. package/clis/chatwise/model.js +48 -0
  232. package/clis/chatwise/new.js +1 -0
  233. package/clis/chatwise/read.js +25 -0
  234. package/clis/chatwise/screenshot.js +1 -0
  235. package/clis/chatwise/send.js +1 -0
  236. package/clis/chatwise/status.js +1 -0
  237. package/clis/chatwise/utils.js +75 -0
  238. package/clis/chess/analyze.js +1 -0
  239. package/clis/chess/game.js +1 -0
  240. package/clis/chess/games.js +1 -0
  241. package/clis/chess/stats.js +1 -0
  242. package/clis/chess/utils.js +1 -0
  243. package/clis/claude/ask.js +4 -0
  244. package/clis/claude/auth.js +19 -0
  245. package/clis/claude/detail.js +1 -0
  246. package/clis/claude/history.js +1 -0
  247. package/clis/claude/new.js +1 -0
  248. package/clis/claude/read.js +1 -0
  249. package/clis/claude/send.js +1 -0
  250. package/clis/claude/status.js +1 -0
  251. package/clis/claude/utils.js +179 -0
  252. package/clis/cnblogs/article.js +1 -0
  253. package/clis/cnblogs/login.js +1 -0
  254. package/clis/cnblogs/stats.js +37 -0
  255. package/clis/cnblogs/whoami.js +1 -0
  256. package/clis/cnki/search.js +38 -0
  257. package/clis/codex/_actions.js +72 -0
  258. package/clis/codex/archive.js +1 -0
  259. package/clis/codex/ask.js +23 -0
  260. package/clis/codex/dump.js +1 -0
  261. package/clis/codex/export.js +12 -0
  262. package/clis/codex/extract-diff.js +28 -0
  263. package/clis/codex/history.js +1 -0
  264. package/clis/codex/model.js +118 -0
  265. package/clis/codex/new.js +1 -0
  266. package/clis/codex/pin.js +1 -0
  267. package/clis/codex/projects.js +1 -0
  268. package/clis/codex/read.js +16 -0
  269. package/clis/codex/rename.js +34 -0
  270. package/clis/codex/screenshot.js +1 -0
  271. package/clis/codex/send.js +16 -0
  272. package/clis/codex/sidebar.js +1 -0
  273. package/clis/codex/status.js +1 -0
  274. package/clis/coingecko/categories.js +1 -0
  275. package/clis/coingecko/coin.js +1 -0
  276. package/clis/coingecko/derivatives.js +1 -0
  277. package/clis/coingecko/exchanges.js +1 -0
  278. package/clis/coingecko/global.js +1 -0
  279. package/clis/coingecko/top.js +1 -0
  280. package/clis/coingecko/trending.js +1 -0
  281. package/clis/confluence/create.js +1 -0
  282. package/clis/confluence/page.js +1 -0
  283. package/clis/confluence/search.js +1 -0
  284. package/clis/confluence/shared.js +1 -0
  285. package/clis/confluence/update.js +1 -0
  286. package/clis/coupang/add-to-cart.js +86 -0
  287. package/clis/coupang/auth.js +16 -0
  288. package/clis/coupang/product.js +161 -0
  289. package/clis/coupang/search.js +385 -0
  290. package/clis/coupang/utils.js +1 -0
  291. package/clis/crates/crate.js +1 -0
  292. package/clis/crates/search.js +1 -0
  293. package/clis/crates/utils.js +1 -0
  294. package/clis/csdn/article.js +29 -0
  295. package/clis/csdn/columns.js +1 -0
  296. package/clis/csdn/login.js +1 -0
  297. package/clis/csdn/stats.js +71 -0
  298. package/clis/csdn/whoami.js +1 -0
  299. package/clis/cto51/article.js +1 -0
  300. package/clis/cto51/whoami.js +1 -0
  301. package/clis/ctrip/auth.js +1 -0
  302. package/clis/ctrip/flight.js +17 -0
  303. package/clis/ctrip/hotel-search.js +24 -0
  304. package/clis/ctrip/hotel-suggest.js +1 -0
  305. package/clis/ctrip/search.js +1 -0
  306. package/clis/ctrip/utils.js +119 -0
  307. package/clis/cursor/ask.js +22 -0
  308. package/clis/cursor/composer.js +12 -0
  309. package/clis/cursor/dump.js +1 -0
  310. package/clis/cursor/export.js +23 -0
  311. package/clis/cursor/extract-code.js +18 -0
  312. package/clis/cursor/history.js +26 -0
  313. package/clis/cursor/model.js +18 -0
  314. package/clis/cursor/new.js +1 -0
  315. package/clis/cursor/read.js +27 -0
  316. package/clis/cursor/screenshot.js +1 -0
  317. package/clis/cursor/send.js +12 -0
  318. package/clis/cursor/status.js +1 -0
  319. package/clis/dblp/author.js +1 -0
  320. package/clis/dblp/paper.js +1 -0
  321. package/clis/dblp/search.js +1 -0
  322. package/clis/dblp/utils.js +1 -0
  323. package/clis/dblp/venue.js +1 -0
  324. package/clis/deepseek/ask.js +1 -0
  325. package/clis/deepseek/auth.js +22 -0
  326. package/clis/deepseek/detail.js +1 -0
  327. package/clis/deepseek/history.js +1 -0
  328. package/clis/deepseek/new.js +1 -0
  329. package/clis/deepseek/read.js +1 -0
  330. package/clis/deepseek/send.js +50 -0
  331. package/clis/deepseek/status.js +1 -0
  332. package/clis/deepseek/utils.js +202 -0
  333. package/clis/defillama/protocol.js +1 -0
  334. package/clis/defillama/protocols.js +1 -0
  335. package/clis/defillama/utils.js +1 -0
  336. package/clis/devto/auth.js +9 -0
  337. package/clis/devto/latest.js +1 -0
  338. package/clis/devto/publish.js +17 -0
  339. package/clis/devto/read.js +3 -0
  340. package/clis/devto/stats.js +27 -0
  341. package/clis/devto/tag.js +1 -0
  342. package/clis/devto/top.js +1 -0
  343. package/clis/devto/user.js +1 -0
  344. package/clis/dianping/__fixtures__/search.html +168 -0
  345. package/clis/dianping/__fixtures__/shop.html +6 -0
  346. package/clis/dianping/auth.js +10 -0
  347. package/clis/dianping/cityResolver.js +4 -0
  348. package/clis/dianping/search.js +1 -0
  349. package/clis/dianping/shop.js +1 -0
  350. package/clis/dianping/utils.js +1 -0
  351. package/clis/dictionary/examples.js +1 -0
  352. package/clis/dictionary/search.js +1 -0
  353. package/clis/dictionary/synonyms.js +1 -0
  354. package/clis/discord-app/channels.js +1 -0
  355. package/clis/discord-app/delete.js +66 -0
  356. package/clis/discord-app/goto.js +1 -0
  357. package/clis/discord-app/members.js +21 -0
  358. package/clis/discord-app/read.js +1 -0
  359. package/clis/discord-app/search.js +29 -0
  360. package/clis/discord-app/send.js +10 -0
  361. package/clis/discord-app/servers.js +1 -0
  362. package/clis/discord-app/status.js +1 -0
  363. package/clis/discord-app/thread-read.js +1 -0
  364. package/clis/discord-app/threads.js +1 -0
  365. package/clis/discord-app/utils.js +226 -0
  366. package/clis/discord-web/auth.js +10 -0
  367. package/clis/discord-web/send.js +13 -0
  368. package/clis/dockerhub/image.js +1 -0
  369. package/clis/dockerhub/search.js +1 -0
  370. package/clis/dockerhub/utils.js +1 -0
  371. package/clis/dongchedi/__fixtures__/search.json +60 -0
  372. package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
  373. package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
  374. package/clis/dongchedi/koubei.js +1 -0
  375. package/clis/dongchedi/models.js +1 -0
  376. package/clis/dongchedi/score.js +1 -0
  377. package/clis/dongchedi/search.js +1 -0
  378. package/clis/dongchedi/series.js +1 -0
  379. package/clis/dongchedi/specs.js +1 -0
  380. package/clis/dongchedi/utils.js +1 -0
  381. package/clis/douban/article.js +53 -0
  382. package/clis/douban/auth.js +21 -0
  383. package/clis/douban/book-hot.js +1 -0
  384. package/clis/douban/download.js +1 -0
  385. package/clis/douban/marks.js +59 -0
  386. package/clis/douban/movie-hot.js +1 -0
  387. package/clis/douban/photos.js +1 -0
  388. package/clis/douban/reviews.js +53 -0
  389. package/clis/douban/search.js +1 -0
  390. package/clis/douban/subject.js +1 -0
  391. package/clis/douban/top250.js +50 -0
  392. package/clis/douban/utils.js +344 -0
  393. package/clis/doubao/ask.js +1 -0
  394. package/clis/doubao/auth.js +28 -0
  395. package/clis/doubao/detail.js +1 -0
  396. package/clis/doubao/history.js +1 -0
  397. package/clis/doubao/meeting-summary.js +1 -0
  398. package/clis/doubao/meeting-transcript.js +1 -0
  399. package/clis/doubao/new.js +1 -0
  400. package/clis/doubao/read.js +1 -0
  401. package/clis/doubao/send.js +1 -0
  402. package/clis/doubao/status.js +1 -0
  403. package/clis/doubao/utils.js +704 -0
  404. package/clis/doubao-app/ask.js +1 -0
  405. package/clis/doubao-app/dump.js +1 -0
  406. package/clis/doubao-app/new.js +1 -0
  407. package/clis/doubao-app/read.js +1 -0
  408. package/clis/doubao-app/screenshot.js +1 -0
  409. package/clis/doubao-app/send.js +1 -0
  410. package/clis/doubao-app/status.js +1 -0
  411. package/clis/doubao-app/utils.js +64 -0
  412. package/clis/douyin/_shared/browser-fetch.js +28 -0
  413. package/clis/douyin/_shared/creation-id.js +1 -0
  414. package/clis/douyin/_shared/evaluate-result.js +1 -0
  415. package/clis/douyin/_shared/imagex-upload.js +1 -0
  416. package/clis/douyin/_shared/public-api.js +1 -0
  417. package/clis/douyin/_shared/sts2.js +1 -0
  418. package/clis/douyin/_shared/text-extra.js +1 -0
  419. package/clis/douyin/_shared/timing.js +1 -0
  420. package/clis/douyin/_shared/tos-upload.js +5 -0
  421. package/clis/douyin/_shared/transcode.js +1 -0
  422. package/clis/douyin/_shared/types.js +1 -0
  423. package/clis/douyin/_shared/vod-upload.js +5 -0
  424. package/clis/douyin/activities.js +1 -0
  425. package/clis/douyin/auth.js +1 -0
  426. package/clis/douyin/collections.js +1 -0
  427. package/clis/douyin/delete.js +76 -0
  428. package/clis/douyin/draft.js +166 -0
  429. package/clis/douyin/drafts.js +1 -0
  430. package/clis/douyin/hashtag.js +1 -0
  431. package/clis/douyin/location.js +1 -0
  432. package/clis/douyin/profile.js +1 -0
  433. package/clis/douyin/publish-image.js +64 -0
  434. package/clis/douyin/publish.js +14 -0
  435. package/clis/douyin/search.js +51 -0
  436. package/clis/douyin/stats.js +1 -0
  437. package/clis/douyin/update.js +1 -0
  438. package/clis/douyin/user-videos.js +1 -0
  439. package/clis/douyin/videos.js +1 -0
  440. package/clis/duckduckgo/search.js +1 -0
  441. package/clis/duckduckgo/suggest.js +1 -0
  442. package/clis/eastmoney/_secid.js +1 -0
  443. package/clis/eastmoney/announcement.js +1 -0
  444. package/clis/eastmoney/article.js +1 -0
  445. package/clis/eastmoney/convertible.js +1 -0
  446. package/clis/eastmoney/etf.js +1 -0
  447. package/clis/eastmoney/holders.js +1 -0
  448. package/clis/eastmoney/hot-rank.js +30 -0
  449. package/clis/eastmoney/index-board.js +1 -0
  450. package/clis/eastmoney/kline.js +1 -0
  451. package/clis/eastmoney/kuaixun.js +1 -0
  452. package/clis/eastmoney/longhu.js +1 -0
  453. package/clis/eastmoney/money-flow.js +1 -0
  454. package/clis/eastmoney/northbound.js +1 -0
  455. package/clis/eastmoney/quote.js +1 -0
  456. package/clis/eastmoney/rank.js +1 -0
  457. package/clis/eastmoney/sectors.js +1 -0
  458. package/clis/eastmoney/whoami.js +1 -0
  459. package/clis/endoflife/product.js +1 -0
  460. package/clis/endoflife/utils.js +1 -0
  461. package/clis/facebook/__fixtures__/notifications-page.html +13 -0
  462. package/clis/facebook/add-friend.js +24 -0
  463. package/clis/facebook/auth.js +1 -0
  464. package/clis/facebook/comment.js +18 -0
  465. package/clis/facebook/events.js +26 -0
  466. package/clis/facebook/feed.js +209 -0
  467. package/clis/facebook/friends.js +24 -0
  468. package/clis/facebook/groups.js +32 -0
  469. package/clis/facebook/join-group.js +25 -0
  470. package/clis/facebook/like.js +29 -0
  471. package/clis/facebook/marketplace-inbox.js +34 -0
  472. package/clis/facebook/marketplace-listings.js +33 -0
  473. package/clis/facebook/memories.js +21 -0
  474. package/clis/facebook/notifications.js +31 -0
  475. package/clis/facebook/post.js +88 -0
  476. package/clis/facebook/profile.js +18 -0
  477. package/clis/facebook/search.js +22 -0
  478. package/clis/flathub/app.js +1 -0
  479. package/clis/flathub/search.js +1 -0
  480. package/clis/flathub/utils.js +1 -0
  481. package/clis/flomo/auth.js +22 -0
  482. package/clis/flomo/memos.js +13 -0
  483. package/clis/gemini/ask.js +1 -0
  484. package/clis/gemini/auth.js +14 -0
  485. package/clis/gemini/deep-research-result.js +4 -0
  486. package/clis/gemini/deep-research.js +1 -0
  487. package/clis/gemini/detail.js +1 -0
  488. package/clis/gemini/history.js +1 -0
  489. package/clis/gemini/image.js +3 -0
  490. package/clis/gemini/new.js +1 -0
  491. package/clis/gemini/read.js +1 -0
  492. package/clis/gemini/status.js +1 -0
  493. package/clis/gemini/utils.js +1234 -0
  494. package/clis/geogebra/add-circle.js +1 -0
  495. package/clis/geogebra/add-line.js +1 -0
  496. package/clis/geogebra/add-point.js +1 -0
  497. package/clis/geogebra/add-polygon.js +1 -0
  498. package/clis/geogebra/eval.js +1 -0
  499. package/clis/geogebra/hexagon.js +1 -0
  500. package/clis/geogebra/info.js +13 -0
  501. package/clis/geogebra/list.js +1 -0
  502. package/clis/geogebra/triangle.js +1 -0
  503. package/clis/geogebra/utils.js +99 -0
  504. package/clis/ghost/publish.js +1 -0
  505. package/clis/ghost/shared.js +1 -0
  506. package/clis/ghost/whoami.js +1 -0
  507. package/clis/gitee/auth.js +12 -0
  508. package/clis/gitee/index.js +1 -0
  509. package/clis/gitee/search.js +1 -0
  510. package/clis/gitee/trending.js +240 -0
  511. package/clis/gitee/user.js +71 -0
  512. package/clis/github/auth.js +7 -0
  513. package/clis/github-trending/repos.js +1 -0
  514. package/clis/google/news.js +1 -0
  515. package/clis/google/search.js +90 -0
  516. package/clis/google/suggest.js +1 -0
  517. package/clis/google/trends.js +1 -0
  518. package/clis/google/utils.js +1 -0
  519. package/clis/google-scholar/cite.js +20 -0
  520. package/clis/google-scholar/profile.js +36 -0
  521. package/clis/google-scholar/search.js +35 -0
  522. package/clis/goproxy/module.js +1 -0
  523. package/clis/goproxy/utils.js +1 -0
  524. package/clis/goproxy/versions.js +1 -0
  525. package/clis/gov-law/recent.js +1 -0
  526. package/clis/gov-law/search.js +14 -0
  527. package/clis/gov-law/shared.js +29 -0
  528. package/clis/gov-policy/__fixtures__/recent.html +16 -0
  529. package/clis/gov-policy/__fixtures__/search.html +41 -0
  530. package/clis/gov-policy/recent.js +8 -0
  531. package/clis/gov-policy/search.js +8 -0
  532. package/clis/gov-policy/utils.js +1 -0
  533. package/clis/grok/ask.js +1 -0
  534. package/clis/grok/auth.js +17 -0
  535. package/clis/grok/delete.js +1 -0
  536. package/clis/grok/detail.js +1 -0
  537. package/clis/grok/export-all.js +170 -0
  538. package/clis/grok/export-utils.js +1 -0
  539. package/clis/grok/export.js +106 -0
  540. package/clis/grok/history.js +1 -0
  541. package/clis/grok/image.js +119 -0
  542. package/clis/grok/image.test.ts +127 -0
  543. package/clis/grok/new.js +1 -0
  544. package/clis/grok/pin.js +1 -0
  545. package/clis/grok/read.js +1 -0
  546. package/clis/grok/send.js +1 -0
  547. package/clis/grok/status.js +1 -0
  548. package/clis/grok/utils.js +337 -0
  549. package/clis/guazi/__fixtures__/detail.html +7 -0
  550. package/clis/guazi/__fixtures__/list.html +5 -0
  551. package/clis/guazi/browse.js +1 -0
  552. package/clis/guazi/car.js +1 -0
  553. package/clis/guazi/utils.js +1 -0
  554. package/clis/hackernews/ask.js +1 -0
  555. package/clis/hackernews/auth.js +9 -0
  556. package/clis/hackernews/best.js +1 -0
  557. package/clis/hackernews/comment.js +61 -0
  558. package/clis/hackernews/jobs.js +1 -0
  559. package/clis/hackernews/new.js +1 -0
  560. package/clis/hackernews/read.js +11 -0
  561. package/clis/hackernews/search.js +1 -0
  562. package/clis/hackernews/show.js +1 -0
  563. package/clis/hackernews/submit.js +65 -0
  564. package/clis/hackernews/top.js +1 -0
  565. package/clis/hackernews/user.js +1 -0
  566. package/clis/hashnode/auth.js +11 -0
  567. package/clis/hashnode/publish.js +92 -0
  568. package/clis/hf/auth.js +12 -0
  569. package/clis/hf/datasets.js +1 -0
  570. package/clis/hf/models.js +1 -0
  571. package/clis/hf/paper.js +1 -0
  572. package/clis/hf/spaces.js +1 -0
  573. package/clis/hf/top.js +1 -0
  574. package/clis/homebrew/cask.js +1 -0
  575. package/clis/homebrew/formula.js +1 -0
  576. package/clis/homebrew/popular.js +1 -0
  577. package/clis/homebrew/utils.js +1 -0
  578. package/clis/huodongxing/events.js +1 -0
  579. package/clis/hupu/__fixtures__/hot-home.html +64 -0
  580. package/clis/hupu/auth.js +14 -0
  581. package/clis/hupu/detail.js +7 -0
  582. package/clis/hupu/hot.js +14 -0
  583. package/clis/hupu/like.js +1 -0
  584. package/clis/hupu/mentions.js +91 -0
  585. package/clis/hupu/reply.js +1 -0
  586. package/clis/hupu/search.js +1 -0
  587. package/clis/hupu/unlike.js +1 -0
  588. package/clis/hupu/utils.js +243 -0
  589. package/clis/imdb/person.js +140 -0
  590. package/clis/imdb/reviews.js +40 -0
  591. package/clis/imdb/search.js +113 -0
  592. package/clis/imdb/title.js +1 -0
  593. package/clis/imdb/top.js +1 -0
  594. package/clis/imdb/trending.js +1 -0
  595. package/clis/imdb/utils.js +162 -0
  596. package/clis/imooc/article.js +59 -0
  597. package/clis/imooc/login.js +1 -0
  598. package/clis/imooc/whoami.js +1 -0
  599. package/clis/indeed/job.js +20 -0
  600. package/clis/indeed/search.js +37 -0
  601. package/clis/indeed/utils.js +1 -0
  602. package/clis/infoq/article.js +19 -0
  603. package/clis/infoq/login.js +1 -0
  604. package/clis/infoq/whoami.js +1 -0
  605. package/clis/instagram/_shared/private-publish.js +75 -0
  606. package/clis/instagram/_shared/protocol-capture.js +180 -0
  607. package/clis/instagram/_shared/runtime-info.js +33 -0
  608. package/clis/instagram/auth.js +22 -0
  609. package/clis/instagram/collection-create.js +38 -0
  610. package/clis/instagram/collection-delete.js +72 -0
  611. package/clis/instagram/comment.js +26 -0
  612. package/clis/instagram/detail.js +2 -0
  613. package/clis/instagram/download.js +83 -0
  614. package/clis/instagram/explore.js +27 -0
  615. package/clis/instagram/follow.js +24 -0
  616. package/clis/instagram/followers.js +30 -0
  617. package/clis/instagram/following.js +74 -0
  618. package/clis/instagram/like.js +25 -0
  619. package/clis/instagram/note.js +162 -0
  620. package/clis/instagram/post.js +718 -0
  621. package/clis/instagram/profile.js +25 -0
  622. package/clis/instagram/reel.js +452 -0
  623. package/clis/instagram/save.js +25 -0
  624. package/clis/instagram/saved.js +37 -0
  625. package/clis/instagram/search.js +23 -0
  626. package/clis/instagram/story.js +21 -0
  627. package/clis/instagram/unfollow.js +21 -0
  628. package/clis/instagram/unlike.js +25 -0
  629. package/clis/instagram/unsave.js +25 -0
  630. package/clis/instagram/user.js +1 -0
  631. package/clis/jd/add-cart.js +22 -0
  632. package/clis/jd/auth.js +12 -0
  633. package/clis/jd/cart.js +59 -0
  634. package/clis/jd/detail.js +42 -0
  635. package/clis/jd/item.js +98 -0
  636. package/clis/jd/item.test.ts +517 -0
  637. package/clis/jd/reviews.js +31 -0
  638. package/clis/jd/search.js +42 -0
  639. package/clis/jianshu/article.js +1 -0
  640. package/clis/jianshu/login.js +1 -0
  641. package/clis/jianshu/notebooks.js +1 -0
  642. package/clis/jianshu/whoami.js +1 -0
  643. package/clis/jianyu/auth.js +28 -0
  644. package/clis/jianyu/detail.js +1 -0
  645. package/clis/jianyu/search.js +73 -0
  646. package/clis/jianyu/shared/china-bid-search.js +86 -0
  647. package/clis/jianyu/shared/procurement-contract.js +1 -0
  648. package/clis/jianyu/shared/procurement-detail.js +18 -0
  649. package/clis/jike/auth.js +19 -0
  650. package/clis/jike/comment.js +82 -0
  651. package/clis/jike/create.js +83 -0
  652. package/clis/jike/feed.js +32 -0
  653. package/clis/jike/like.js +38 -0
  654. package/clis/jike/notifications.js +115 -0
  655. package/clis/jike/post.js +33 -0
  656. package/clis/jike/repost.js +67 -0
  657. package/clis/jike/search.js +29 -0
  658. package/clis/jike/topic.js +20 -0
  659. package/clis/jike/user.js +19 -0
  660. package/clis/jike/utils.js +15 -0
  661. package/clis/jimeng/auth.js +13 -0
  662. package/clis/jimeng/generate.js +60 -0
  663. package/clis/jimeng/history.js +32 -0
  664. package/clis/jimeng/new.js +26 -0
  665. package/clis/jimeng/workspaces.js +22 -0
  666. package/clis/jira/attachments.js +1 -0
  667. package/clis/jira/comments.js +1 -0
  668. package/clis/jira/issue.js +1 -0
  669. package/clis/jira/links.js +1 -0
  670. package/clis/jira/search.js +1 -0
  671. package/clis/jira/shared.js +1 -0
  672. package/clis/juejin/article.js +5 -0
  673. package/clis/juejin/categories.js +1 -0
  674. package/clis/juejin/hot.js +1 -0
  675. package/clis/juejin/login.js +1 -0
  676. package/clis/juejin/recommend.js +1 -0
  677. package/clis/juejin/stats.js +53 -0
  678. package/clis/juejin/tags.js +1 -0
  679. package/clis/juejin/utils.js +1 -0
  680. package/clis/juejin/whoami.js +1 -0
  681. package/clis/ke/auth.js +14 -0
  682. package/clis/ke/chengjiao.js +45 -0
  683. package/clis/ke/ershoufang.js +50 -0
  684. package/clis/ke/utils.js +21 -0
  685. package/clis/ke/xiaoqu.js +45 -0
  686. package/clis/ke/zufang.js +50 -0
  687. package/clis/kimi/_utils.js +38 -0
  688. package/clis/kimi/audit-extras.js +64 -0
  689. package/clis/kimi/auth.js +17 -0
  690. package/clis/kimi/chat.js +77 -0
  691. package/clis/kimi/storage.js +14 -0
  692. package/clis/kimi/ui.js +89 -0
  693. package/clis/kimi/usage.js +51 -0
  694. package/clis/kuaishou/auth.js +1 -0
  695. package/clis/kuaishou/publish.js +53 -0
  696. package/clis/lesswrong/_helpers.js +9 -0
  697. package/clis/lesswrong/comments.js +9 -0
  698. package/clis/lesswrong/curated.js +5 -0
  699. package/clis/lesswrong/frontpage.js +5 -0
  700. package/clis/lesswrong/new.js +5 -0
  701. package/clis/lesswrong/read.js +5 -0
  702. package/clis/lesswrong/sequences.js +5 -0
  703. package/clis/lesswrong/shortform.js +5 -0
  704. package/clis/lesswrong/tag.js +5 -0
  705. package/clis/lesswrong/tags.js +5 -0
  706. package/clis/lesswrong/top-month.js +5 -0
  707. package/clis/lesswrong/top-week.js +5 -0
  708. package/clis/lesswrong/top-year.js +5 -0
  709. package/clis/lesswrong/top.js +5 -0
  710. package/clis/lesswrong/user-posts.js +5 -0
  711. package/clis/lesswrong/user.js +5 -0
  712. package/clis/lichess/top.js +1 -0
  713. package/clis/lichess/user.js +1 -0
  714. package/clis/lichess/utils.js +1 -0
  715. package/clis/linkedin/auth.js +27 -0
  716. package/clis/linkedin/comment.js +1 -0
  717. package/clis/linkedin/connect.js +244 -0
  718. package/clis/linkedin/create.js +113 -0
  719. package/clis/linkedin/follow.js +1 -0
  720. package/clis/linkedin/inbox.js +1 -0
  721. package/clis/linkedin/job-detail.js +40 -0
  722. package/clis/linkedin/jobs-preferences.js +34 -0
  723. package/clis/linkedin/like.js +1 -0
  724. package/clis/linkedin/notifications.js +1 -0
  725. package/clis/linkedin/people-search.js +1 -0
  726. package/clis/linkedin/post-analytics.js +1 -0
  727. package/clis/linkedin/post-comments.js +1 -0
  728. package/clis/linkedin/post-detail.js +1 -0
  729. package/clis/linkedin/posts-core.js +138 -0
  730. package/clis/linkedin/posts.js +1 -0
  731. package/clis/linkedin/profile-analytics.js +1 -0
  732. package/clis/linkedin/profile-api.js +218 -0
  733. package/clis/linkedin/profile-experience.js +1 -0
  734. package/clis/linkedin/profile-projects.js +1 -0
  735. package/clis/linkedin/profile-read.js +3 -0
  736. package/clis/linkedin/reply.js +1 -0
  737. package/clis/linkedin/repost.js +1 -0
  738. package/clis/linkedin/safe-send.js +155 -0
  739. package/clis/linkedin/salesnav-inbox.js +21 -0
  740. package/clis/linkedin/salesnav-message.js +33 -0
  741. package/clis/linkedin/salesnav-search.js +15 -0
  742. package/clis/linkedin/salesnav-thread.js +1 -0
  743. package/clis/linkedin/search-api.js +42 -0
  744. package/clis/linkedin/search.js +50 -0
  745. package/clis/linkedin/sent-invitations.js +46 -0
  746. package/clis/linkedin/services-read.js +57 -0
  747. package/clis/linkedin/shared.js +10 -0
  748. package/clis/linkedin/social-api.js +260 -0
  749. package/clis/linkedin/thread-snapshot.js +81 -0
  750. package/clis/linkedin/timeline.js +37 -0
  751. package/clis/linkedin-learning/auth.js +27 -0
  752. package/clis/linkedin-learning/course.js +17 -0
  753. package/clis/linkedin-learning/search.js +17 -0
  754. package/clis/linkedin-learning/trending.js +17 -0
  755. package/clis/linux-do/auth.js +20 -0
  756. package/clis/linux-do/categories.js +1 -0
  757. package/clis/linux-do/feed.js +19 -0
  758. package/clis/linux-do/search.js +1 -0
  759. package/clis/linux-do/tags.js +1 -0
  760. package/clis/linux-do/topic-content.js +28 -0
  761. package/clis/linux-do/topic.js +1 -0
  762. package/clis/linux-do/user-posts.js +1 -0
  763. package/clis/linux-do/user-topics.js +1 -0
  764. package/clis/lobsters/active.js +1 -0
  765. package/clis/lobsters/domain.js +1 -0
  766. package/clis/lobsters/hot.js +1 -0
  767. package/clis/lobsters/newest.js +1 -0
  768. package/clis/lobsters/read.js +11 -0
  769. package/clis/lobsters/tag.js +1 -0
  770. package/clis/maimai/auth.js +19 -0
  771. package/clis/maimai/search-talents.js +37 -0
  772. package/clis/manus/_utils.js +28 -0
  773. package/clis/manus/auth.js +20 -0
  774. package/clis/manus/connectors.js +4 -0
  775. package/clis/manus/credits.js +4 -0
  776. package/clis/manus/list.js +7 -0
  777. package/clis/manus/read.js +7 -0
  778. package/clis/manus/skills.js +4 -0
  779. package/clis/manus/status.js +8 -0
  780. package/clis/mastodon/post.js +1 -0
  781. package/clis/mastodon/shared.js +48 -0
  782. package/clis/mastodon/whoami.js +1 -0
  783. package/clis/maven/artifact.js +1 -0
  784. package/clis/maven/search.js +1 -0
  785. package/clis/maven/utils.js +1 -0
  786. package/clis/mdn/search.js +1 -0
  787. package/clis/medium/article.js +12 -0
  788. package/clis/medium/feed.js +1 -0
  789. package/clis/medium/login.js +1 -0
  790. package/clis/medium/search.js +1 -0
  791. package/clis/medium/stats.js +56 -0
  792. package/clis/medium/tag.js +1 -0
  793. package/clis/medium/user.js +1 -0
  794. package/clis/medium/utils.js +62 -0
  795. package/clis/medium/whoami.js +1 -0
  796. package/clis/mubu/doc.js +1 -0
  797. package/clis/mubu/docs.js +1 -0
  798. package/clis/mubu/notes.js +1 -0
  799. package/clis/mubu/recent.js +1 -0
  800. package/clis/mubu/search.js +1 -0
  801. package/clis/mubu/utils.js +31 -0
  802. package/clis/note/auth.js +12 -0
  803. package/clis/note/note-utils.js +2 -0
  804. package/clis/note/publish.js +17 -0
  805. package/clis/notebooklm/add-source.js +46 -0
  806. package/clis/notebooklm/auth.js +21 -0
  807. package/clis/notebooklm/create.js +1 -0
  808. package/clis/notebooklm/current.js +1 -0
  809. package/clis/notebooklm/generate-audio.js +1 -0
  810. package/clis/notebooklm/generate-slides.js +1 -0
  811. package/clis/notebooklm/get.js +1 -0
  812. package/clis/notebooklm/history.js +1 -0
  813. package/clis/notebooklm/list.js +1 -0
  814. package/clis/notebooklm/note-list.js +1 -0
  815. package/clis/notebooklm/notes-get.js +1 -0
  816. package/clis/notebooklm/open.js +1 -0
  817. package/clis/notebooklm/rpc.js +36 -0
  818. package/clis/notebooklm/shared.js +1 -0
  819. package/clis/notebooklm/source-fulltext.js +1 -0
  820. package/clis/notebooklm/source-get.js +1 -0
  821. package/clis/notebooklm/source-guide.js +1 -0
  822. package/clis/notebooklm/source-list.js +1 -0
  823. package/clis/notebooklm/status.js +1 -0
  824. package/clis/notebooklm/summary.js +1 -0
  825. package/clis/notebooklm/utils.js +172 -0
  826. package/clis/notebooklm/write-note.js +1 -0
  827. package/clis/nowcoder/auth.js +24 -0
  828. package/clis/nowcoder/comment.js +1 -0
  829. package/clis/nowcoder/comments.js +1 -0
  830. package/clis/nowcoder/companies.js +1 -0
  831. package/clis/nowcoder/creators.js +1 -0
  832. package/clis/nowcoder/delete.js +1 -0
  833. package/clis/nowcoder/detail.js +46 -0
  834. package/clis/nowcoder/dm-list.js +1 -0
  835. package/clis/nowcoder/dm-read.js +1 -0
  836. package/clis/nowcoder/dm-send.js +1 -0
  837. package/clis/nowcoder/drafts.js +1 -0
  838. package/clis/nowcoder/experience.js +20 -0
  839. package/clis/nowcoder/hot.js +1 -0
  840. package/clis/nowcoder/inbox.js +1 -0
  841. package/clis/nowcoder/jobs.js +1 -0
  842. package/clis/nowcoder/like.js +1 -0
  843. package/clis/nowcoder/my.js +1 -0
  844. package/clis/nowcoder/notifications.js +16 -0
  845. package/clis/nowcoder/papers.js +22 -0
  846. package/clis/nowcoder/post.js +1 -0
  847. package/clis/nowcoder/practice.js +21 -0
  848. package/clis/nowcoder/recommend.js +1 -0
  849. package/clis/nowcoder/referral.js +21 -0
  850. package/clis/nowcoder/salary.js +22 -0
  851. package/clis/nowcoder/search.js +31 -0
  852. package/clis/nowcoder/suggest.js +17 -0
  853. package/clis/nowcoder/topics.js +1 -0
  854. package/clis/nowcoder/trending.js +1 -0
  855. package/clis/nowcoder/utils.js +68 -0
  856. package/clis/npm/downloads.js +1 -0
  857. package/clis/npm/package.js +1 -0
  858. package/clis/npm/search.js +1 -0
  859. package/clis/npm/utils.js +1 -0
  860. package/clis/nuget/package.js +1 -0
  861. package/clis/nuget/search.js +1 -0
  862. package/clis/nuget/utils.js +1 -0
  863. package/clis/nvd/cve.js +1 -0
  864. package/clis/oeis/search.js +1 -0
  865. package/clis/oeis/sequence.js +1 -0
  866. package/clis/oeis/utils.js +1 -0
  867. package/clis/ones/common.js +23 -0
  868. package/clis/ones/enrich-tasks.js +1 -0
  869. package/clis/ones/login.js +2 -0
  870. package/clis/ones/logout.js +1 -0
  871. package/clis/ones/me.js +1 -0
  872. package/clis/ones/my-tasks.js +1 -0
  873. package/clis/ones/resolve-labels.js +1 -0
  874. package/clis/ones/task-helpers.js +1 -0
  875. package/clis/ones/task.js +1 -0
  876. package/clis/ones/tasks.js +1 -0
  877. package/clis/ones/token-info.js +1 -0
  878. package/clis/ones/worklog.js +14 -0
  879. package/clis/openalex/search.js +1 -0
  880. package/clis/openalex/utils.js +1 -0
  881. package/clis/openalex/work.js +1 -0
  882. package/clis/openfda/drug-label.js +1 -0
  883. package/clis/openfda/food-recall.js +1 -0
  884. package/clis/openfda/utils.js +1 -0
  885. package/clis/openreview/author.js +1 -0
  886. package/clis/openreview/paper.js +1 -0
  887. package/clis/openreview/reviews.js +4 -0
  888. package/clis/openreview/search.js +1 -0
  889. package/clis/openreview/utils.js +1 -0
  890. package/clis/openreview/venue.js +1 -0
  891. package/clis/oschina/article.js +1 -0
  892. package/clis/oschina/catalogs.js +1 -0
  893. package/clis/oschina/login.js +1 -0
  894. package/clis/oschina/stats.js +54 -0
  895. package/clis/oschina/whoami.js +1 -0
  896. package/clis/osv/query.js +1 -0
  897. package/clis/osv/utils.js +1 -0
  898. package/clis/osv/vulnerability.js +1 -0
  899. package/clis/packagist/package.js +1 -0
  900. package/clis/packagist/search.js +1 -0
  901. package/clis/packagist/utils.js +1 -0
  902. package/clis/paperreview/feedback.js +1 -0
  903. package/clis/paperreview/review.js +1 -0
  904. package/clis/paperreview/submit.js +1 -0
  905. package/clis/paperreview/utils.js +1 -0
  906. package/clis/pinterest/api.js +1 -0
  907. package/clis/pinterest/auth.js +1 -0
  908. package/clis/pinterest/boards.js +1 -0
  909. package/clis/pinterest/client.js +20 -0
  910. package/clis/pinterest/publish.js +13 -0
  911. package/clis/pixiv/auth.js +17 -0
  912. package/clis/pixiv/detail.js +1 -0
  913. package/clis/pixiv/download.js +1 -0
  914. package/clis/pixiv/illusts.js +1 -0
  915. package/clis/pixiv/ranking.js +26 -0
  916. package/clis/pixiv/search.js +1 -0
  917. package/clis/pixiv/user.js +1 -0
  918. package/clis/pixiv/utils.js +18 -0
  919. package/clis/powerchina/auth.js +17 -0
  920. package/clis/powerchina/search.js +1 -0
  921. package/clis/producthunt/browse.js +54 -0
  922. package/clis/producthunt/hot.js +64 -0
  923. package/clis/producthunt/posts.js +1 -0
  924. package/clis/producthunt/today.js +1 -0
  925. package/clis/producthunt/utils.js +1 -0
  926. package/clis/pubmed/article.js +1 -0
  927. package/clis/pubmed/author.js +1 -0
  928. package/clis/pubmed/citations.js +1 -0
  929. package/clis/pubmed/clinical-trial.js +1 -0
  930. package/clis/pubmed/journal.js +1 -0
  931. package/clis/pubmed/mesh.js +1 -0
  932. package/clis/pubmed/related.js +1 -0
  933. package/clis/pubmed/review.js +1 -0
  934. package/clis/pubmed/search.js +1 -0
  935. package/clis/pubmed/utils.js +1 -0
  936. package/clis/pypi/downloads.js +1 -0
  937. package/clis/pypi/package.js +1 -0
  938. package/clis/pypi/utils.js +1 -0
  939. package/clis/qiita/auth.js +1 -0
  940. package/clis/qiita/gql.js +32 -0
  941. package/clis/qiita/publish.js +7 -0
  942. package/clis/qiita/stats.js +37 -0
  943. package/clis/qoder/_utils.js +113 -0
  944. package/clis/qoder/composer.js +1 -0
  945. package/clis/qoder/history.js +25 -0
  946. package/clis/qoder/quest.js +1 -0
  947. package/clis/qoder/read.js +1 -0
  948. package/clis/qoder/status.js +1 -0
  949. package/clis/qoder/ui.js +59 -0
  950. package/clis/quark/auth.js +16 -0
  951. package/clis/quark/ls.js +1 -0
  952. package/clis/quark/mkdir.js +1 -0
  953. package/clis/quark/mv.js +1 -0
  954. package/clis/quark/rename.js +1 -0
  955. package/clis/quark/rm.js +1 -0
  956. package/clis/quark/save.js +1 -0
  957. package/clis/quark/share-tree.js +1 -0
  958. package/clis/quark/utils.js +13 -0
  959. package/clis/quora/create-answer.js +22 -0
  960. package/clis/quora/create-question.js +24 -0
  961. package/clis/quora/shared.js +43 -0
  962. package/clis/quora/whoami.js +1 -0
  963. package/clis/qwen/ask.js +1 -0
  964. package/clis/qwen/auth.js +17 -0
  965. package/clis/qwen/detail.js +1 -0
  966. package/clis/qwen/history.js +1 -0
  967. package/clis/qwen/image.js +31 -0
  968. package/clis/qwen/new.js +1 -0
  969. package/clis/qwen/read.js +1 -0
  970. package/clis/qwen/send.js +1 -0
  971. package/clis/qwen/status.js +1 -0
  972. package/clis/qwen/utils.js +185 -0
  973. package/clis/reddit/auth.js +17 -0
  974. package/clis/reddit/comment.js +36 -0
  975. package/clis/reddit/frontpage.js +40 -0
  976. package/clis/reddit/home.js +32 -0
  977. package/clis/reddit/hot.js +46 -0
  978. package/clis/reddit/popular.js +46 -0
  979. package/clis/reddit/read.js +398 -0
  980. package/clis/reddit/reply.js +56 -0
  981. package/clis/reddit/save.js +30 -0
  982. package/clis/reddit/saved.js +24 -0
  983. package/clis/reddit/search.js +51 -0
  984. package/clis/reddit/submit.js +42 -0
  985. package/clis/reddit/subreddit-info.js +29 -0
  986. package/clis/reddit/subreddit.js +52 -0
  987. package/clis/reddit/subscribe.js +29 -0
  988. package/clis/reddit/subscribed.js +68 -0
  989. package/clis/reddit/upvote.js +43 -0
  990. package/clis/reddit/upvoted.js +24 -0
  991. package/clis/reddit/user-comments.js +20 -0
  992. package/clis/reddit/user-posts.js +17 -0
  993. package/clis/reddit/user.js +20 -0
  994. package/clis/reddit/whoami.js +19 -0
  995. package/clis/rednote/auth.js +19 -0
  996. package/clis/rednote/comments.js +1 -0
  997. package/clis/rednote/download.js +1 -0
  998. package/clis/rednote/feed.js +1 -0
  999. package/clis/rednote/note.js +1 -0
  1000. package/clis/rednote/notifications.js +67 -0
  1001. package/clis/rednote/search.js +32 -0
  1002. package/clis/rednote/user.js +1 -0
  1003. package/clis/rest-countries/country.js +1 -0
  1004. package/clis/rest-countries/region.js +1 -0
  1005. package/clis/rest-countries/utils.js +1 -0
  1006. package/clis/reuters/article-detail.js +1 -0
  1007. package/clis/reuters/auth.js +39 -0
  1008. package/clis/reuters/search.js +1 -0
  1009. package/clis/reuters/utils.js +50 -0
  1010. package/clis/rfc/rfc.js +1 -0
  1011. package/clis/rfc/utils.js +1 -0
  1012. package/clis/rubygems/gem.js +1 -0
  1013. package/clis/rubygems/search.js +1 -0
  1014. package/clis/rubygems/utils.js +1 -0
  1015. package/clis/segmentfault/_signed-request.js +43 -0
  1016. package/clis/segmentfault/article.js +3 -0
  1017. package/clis/segmentfault/channels.js +1 -0
  1018. package/clis/segmentfault/login.js +1 -0
  1019. package/clis/segmentfault/stats.js +82 -0
  1020. package/clis/segmentfault/tags.js +1 -0
  1021. package/clis/segmentfault/whoami.js +1 -0
  1022. package/clis/semanticscholar/citations.js +1 -0
  1023. package/clis/semanticscholar/paper.js +1 -0
  1024. package/clis/semanticscholar/recommendations.js +1 -0
  1025. package/clis/semanticscholar/search.js +1 -0
  1026. package/clis/semanticscholar/utils.js +1 -0
  1027. package/clis/sinablog/article.js +1 -0
  1028. package/clis/sinablog/hot.js +1 -0
  1029. package/clis/sinablog/search.js +1 -0
  1030. package/clis/sinablog/user.js +1 -0
  1031. package/clis/sinablog/utils.js +153 -0
  1032. package/clis/sinafinance/news.js +1 -0
  1033. package/clis/sinafinance/rolling-news.js +20 -0
  1034. package/clis/sinafinance/stock-rank.js +41 -0
  1035. package/clis/sinafinance/stock.js +1 -0
  1036. package/clis/slock/attachment-download.js +1 -0
  1037. package/clis/slock/attachment-upload.js +34 -0
  1038. package/clis/slock/attachment-url.js +1 -0
  1039. package/clis/slock/auth-verify.js +1 -0
  1040. package/clis/slock/bookmark-add.js +11 -0
  1041. package/clis/slock/bookmark-list.js +10 -0
  1042. package/clis/slock/bookmark-remove.js +7 -0
  1043. package/clis/slock/channel-action.js +1 -0
  1044. package/clis/slock/channel-archive.js +1 -0
  1045. package/clis/slock/channel-create.js +1 -0
  1046. package/clis/slock/channel-files.js +1 -0
  1047. package/clis/slock/channel-info.js +1 -0
  1048. package/clis/slock/channel-join.js +1 -0
  1049. package/clis/slock/channel-leave.js +1 -0
  1050. package/clis/slock/channel-list.js +1 -0
  1051. package/clis/slock/channel-mark.js +1 -0
  1052. package/clis/slock/channel-members.js +1 -0
  1053. package/clis/slock/channel-unarchive.js +1 -0
  1054. package/clis/slock/dm-list.js +1 -0
  1055. package/clis/slock/errors.js +1 -0
  1056. package/clis/slock/in-page.js +113 -0
  1057. package/clis/slock/inbox-done.js +9 -0
  1058. package/clis/slock/inbox-read-all.js +1 -0
  1059. package/clis/slock/inbox.js +1 -0
  1060. package/clis/slock/login.js +1 -0
  1061. package/clis/slock/message-read.js +61 -0
  1062. package/clis/slock/message-search.js +24 -0
  1063. package/clis/slock/message-send.js +55 -0
  1064. package/clis/slock/reaction-add.js +1 -0
  1065. package/clis/slock/reaction-remove.js +1 -0
  1066. package/clis/slock/resolve.js +1 -0
  1067. package/clis/slock/server-list.js +9 -0
  1068. package/clis/slock/server-use.js +18 -0
  1069. package/clis/slock/shared.js +1 -0
  1070. package/clis/slock/task-claim.js +14 -0
  1071. package/clis/slock/task-convert.js +35 -0
  1072. package/clis/slock/task-create.js +24 -0
  1073. package/clis/slock/task-delete.js +9 -0
  1074. package/clis/slock/task-get.js +11 -0
  1075. package/clis/slock/task-list-server.js +12 -0
  1076. package/clis/slock/task-list.js +14 -0
  1077. package/clis/slock/task-status.js +19 -0
  1078. package/clis/slock/task-unclaim.js +13 -0
  1079. package/clis/slock/thread-done.js +1 -0
  1080. package/clis/slock/thread-follow.js +1 -0
  1081. package/clis/slock/thread-list.js +1 -0
  1082. package/clis/slock/thread-state.js +1 -0
  1083. package/clis/slock/thread-undone.js +1 -0
  1084. package/clis/slock/thread-unfollow.js +1 -0
  1085. package/clis/slock/unread-summary.js +18 -0
  1086. package/clis/slock/whoami.js +1 -0
  1087. package/clis/smzdm/search.js +71 -0
  1088. package/clis/sohu/article.js +1 -0
  1089. package/clis/sohu/attributes.js +1 -0
  1090. package/clis/sohu/categories.js +1 -0
  1091. package/clis/sohu/channels.js +1 -0
  1092. package/clis/sohu/columns.js +1 -0
  1093. package/clis/sohu/login.js +1 -0
  1094. package/clis/sohu/mpbp.js +1 -0
  1095. package/clis/sohu/stats.js +95 -0
  1096. package/clis/sohu/topics.js +1 -0
  1097. package/clis/sohu/whoami.js +1 -0
  1098. package/clis/spotify/spotify.js +1 -0
  1099. package/clis/spotify/utils.js +8 -0
  1100. package/clis/stackoverflow/bounties.js +1 -0
  1101. package/clis/stackoverflow/hot.js +1 -0
  1102. package/clis/stackoverflow/read.js +13 -0
  1103. package/clis/stackoverflow/related.js +1 -0
  1104. package/clis/stackoverflow/search.js +1 -0
  1105. package/clis/stackoverflow/tag.js +1 -0
  1106. package/clis/stackoverflow/unanswered.js +1 -0
  1107. package/clis/stackoverflow/user.js +1 -0
  1108. package/clis/stackoverflow/utils.js +1 -0
  1109. package/clis/steam/app.js +1 -0
  1110. package/clis/steam/search.js +1 -0
  1111. package/clis/steam/top-sellers.js +1 -0
  1112. package/clis/steam/utils.js +1 -0
  1113. package/clis/substack/auth.js +11 -0
  1114. package/clis/substack/feed.js +1 -0
  1115. package/clis/substack/post-utils.js +2 -0
  1116. package/clis/substack/publication.js +1 -0
  1117. package/clis/substack/publish.js +10 -0
  1118. package/clis/substack/search.js +1 -0
  1119. package/clis/substack/utils.js +108 -0
  1120. package/clis/suno/auth.js +21 -0
  1121. package/clis/suno/download.js +17 -0
  1122. package/clis/suno/generate.js +4 -0
  1123. package/clis/suno/list.js +14 -0
  1124. package/clis/suno/status.js +1 -0
  1125. package/clis/suno/utils.js +102 -0
  1126. package/clis/taobao/add-cart.js +93 -0
  1127. package/clis/taobao/auth.js +8 -0
  1128. package/clis/taobao/cart.js +68 -0
  1129. package/clis/taobao/detail.js +48 -0
  1130. package/clis/taobao/reviews.js +52 -0
  1131. package/clis/taobao/search.js +64 -0
  1132. package/clis/tdx/hot-rank.js +25 -0
  1133. package/clis/telegram/send.js +18 -0
  1134. package/clis/telegram/shared.js +21 -0
  1135. package/clis/telegram/whoami.js +1 -0
  1136. package/clis/test-utils.js +1 -0
  1137. package/clis/threads/post.js +152 -0
  1138. package/clis/threads/shared.js +27 -0
  1139. package/clis/threads/whoami.js +1 -0
  1140. package/clis/ths/hot-rank.js +27 -0
  1141. package/clis/tieba/hot.js +16 -0
  1142. package/clis/tieba/posts.js +1 -0
  1143. package/clis/tieba/read.js +84 -0
  1144. package/clis/tieba/search.js +54 -0
  1145. package/clis/tieba/utils.js +1 -0
  1146. package/clis/tiktok/auth.js +30 -0
  1147. package/clis/tiktok/comment.js +69 -0
  1148. package/clis/tiktok/creator-videos.js +45 -0
  1149. package/clis/tiktok/explore.js +76 -0
  1150. package/clis/tiktok/follow.js +49 -0
  1151. package/clis/tiktok/following.js +103 -0
  1152. package/clis/tiktok/friends.js +79 -0
  1153. package/clis/tiktok/like.js +19 -0
  1154. package/clis/tiktok/live.js +79 -0
  1155. package/clis/tiktok/notifications.js +77 -0
  1156. package/clis/tiktok/profile.js +26 -0
  1157. package/clis/tiktok/publish.js +82 -0
  1158. package/clis/tiktok/save.js +15 -0
  1159. package/clis/tiktok/search.js +24 -0
  1160. package/clis/tiktok/unfollow.js +59 -0
  1161. package/clis/tiktok/unlike.js +19 -0
  1162. package/clis/tiktok/unsave.js +17 -0
  1163. package/clis/tiktok/user.js +143 -0
  1164. package/clis/tiktok/utils.js +272 -0
  1165. package/clis/toutiao/article.js +1 -0
  1166. package/clis/toutiao/articles.js +6 -0
  1167. package/clis/toutiao/auth.js +50 -0
  1168. package/clis/toutiao/hot.js +1 -0
  1169. package/clis/toutiao/utils.js +2 -0
  1170. package/clis/trae-cn/activity.js +1 -0
  1171. package/clis/trae-cn/approve.js +1 -0
  1172. package/clis/trae-cn/ask.js +1 -0
  1173. package/clis/trae-cn/dump.js +1 -0
  1174. package/clis/trae-cn/export.js +3 -0
  1175. package/clis/trae-cn/model.js +1 -0
  1176. package/clis/trae-cn/new.js +1 -0
  1177. package/clis/trae-cn/read.js +1 -0
  1178. package/clis/trae-cn/screenshot.js +1 -0
  1179. package/clis/trae-cn/select-model.js +1 -0
  1180. package/clis/trae-cn/send.js +1 -0
  1181. package/clis/trae-cn/setup.js +1 -0
  1182. package/clis/trae-cn/status.js +1 -0
  1183. package/clis/trae-cn/targets.js +1 -0
  1184. package/clis/trae-cn/utils.js +456 -0
  1185. package/clis/trae-cn/watch.js +3 -0
  1186. package/clis/trae-solo/_actions.js +41 -0
  1187. package/clis/trae-solo/_fs.js +6 -0
  1188. package/clis/trae-solo/_state.js +2 -0
  1189. package/clis/trae-solo/automation.js +43 -0
  1190. package/clis/trae-solo/history.js +15 -0
  1191. package/clis/trae-solo/mode.js +31 -0
  1192. package/clis/trae-solo/model.js +50 -0
  1193. package/clis/trae-solo/renderer-storage.js +11 -0
  1194. package/clis/trae-solo/settings.js +1 -0
  1195. package/clis/trae-solo/skill-fs.js +1 -0
  1196. package/clis/trae-solo/skill.js +81 -0
  1197. package/clis/trae-solo/state-fs.js +2 -0
  1198. package/clis/trae-solo/status.js +1 -0
  1199. package/clis/trae-solo/task-fs.js +5 -0
  1200. package/clis/trae-solo/user-rules.js +1 -0
  1201. package/clis/trae-solo/workspaces-fs.js +1 -0
  1202. package/clis/tumblr/auth.js +24 -0
  1203. package/clis/tumblr/publish.js +14 -0
  1204. package/clis/tvmaze/search.js +1 -0
  1205. package/clis/tvmaze/show.js +1 -0
  1206. package/clis/tvmaze/utils.js +1 -0
  1207. package/clis/twitter/accept.js +116 -0
  1208. package/clis/twitter/article.js +116 -0
  1209. package/clis/twitter/auth.js +4 -0
  1210. package/clis/twitter/block.js +62 -0
  1211. package/clis/twitter/bookmark-folder.js +4 -0
  1212. package/clis/twitter/bookmark-folders.js +4 -0
  1213. package/clis/twitter/bookmark.js +44 -0
  1214. package/clis/twitter/bookmarks.js +27 -0
  1215. package/clis/twitter/delete.js +36 -0
  1216. package/clis/twitter/device-follow.js +13 -0
  1217. package/clis/twitter/dm-list.js +1 -0
  1218. package/clis/twitter/dm-read.js +1 -0
  1219. package/clis/twitter/dm-send.js +13 -0
  1220. package/clis/twitter/dm-shared.js +6 -0
  1221. package/clis/twitter/download.js +38 -0
  1222. package/clis/twitter/follow-batch.js +43 -0
  1223. package/clis/twitter/follow.js +39 -0
  1224. package/clis/twitter/followers.js +59 -0
  1225. package/clis/twitter/following.js +4 -0
  1226. package/clis/twitter/hide-reply.js +57 -0
  1227. package/clis/twitter/like.js +48 -0
  1228. package/clis/twitter/likes.js +14 -0
  1229. package/clis/twitter/list-add-batch.js +1 -0
  1230. package/clis/twitter/list-add-core.js +35 -0
  1231. package/clis/twitter/list-add.js +1 -0
  1232. package/clis/twitter/list-batch-utils.js +1 -0
  1233. package/clis/twitter/list-create.js +12 -0
  1234. package/clis/twitter/list-delete.js +36 -0
  1235. package/clis/twitter/list-remove-batch.js +1 -0
  1236. package/clis/twitter/list-remove-core.js +127 -0
  1237. package/clis/twitter/list-remove.js +1 -0
  1238. package/clis/twitter/list-tweets.js +27 -0
  1239. package/clis/twitter/lists.js +27 -0
  1240. package/clis/twitter/notifications.js +4 -0
  1241. package/clis/twitter/post.js +158 -0
  1242. package/clis/twitter/profile.js +66 -0
  1243. package/clis/twitter/quote.js +123 -0
  1244. package/clis/twitter/reply-dm.js +112 -0
  1245. package/clis/twitter/reply.js +97 -0
  1246. package/clis/twitter/retweet.js +62 -0
  1247. package/clis/twitter/schedule.js +96 -0
  1248. package/clis/twitter/scheduled-delete.js +60 -0
  1249. package/clis/twitter/scheduled-list.js +15 -0
  1250. package/clis/twitter/scheduled-utils.js +18 -0
  1251. package/clis/twitter/search.js +12 -0
  1252. package/clis/twitter/shared.js +76 -0
  1253. package/clis/twitter/thread.js +4 -0
  1254. package/clis/twitter/timeline.js +4 -0
  1255. package/clis/twitter/trending.js +18 -0
  1256. package/clis/twitter/tweets.js +12 -0
  1257. package/clis/twitter/unblock.js +45 -0
  1258. package/clis/twitter/unbookmark.js +41 -0
  1259. package/clis/twitter/unfollow.js +45 -0
  1260. package/clis/twitter/unlike.js +48 -0
  1261. package/clis/twitter/unretweet.js +62 -0
  1262. package/clis/twitter/utils.js +55 -0
  1263. package/clis/uisdc/news.js +25 -0
  1264. package/clis/uiverse/_shared.js +257 -0
  1265. package/clis/uiverse/code.js +1 -0
  1266. package/clis/uiverse/preview.js +1 -0
  1267. package/clis/upwork/auth.js +19 -0
  1268. package/clis/upwork/detail.js +22 -0
  1269. package/clis/upwork/feed.js +21 -0
  1270. package/clis/upwork/search.js +21 -0
  1271. package/clis/upwork/utils.js +1 -0
  1272. package/clis/v2ex/auth.js +10 -0
  1273. package/clis/v2ex/daily.js +41 -0
  1274. package/clis/v2ex/hot.js +1 -0
  1275. package/clis/v2ex/latest.js +1 -0
  1276. package/clis/v2ex/me.js +58 -0
  1277. package/clis/v2ex/member.js +1 -0
  1278. package/clis/v2ex/node.js +1 -0
  1279. package/clis/v2ex/nodes.js +1 -0
  1280. package/clis/v2ex/notifications.js +40 -0
  1281. package/clis/v2ex/replies.js +1 -0
  1282. package/clis/v2ex/topic.js +1 -0
  1283. package/clis/v2ex/user.js +1 -0
  1284. package/clis/vk/post.js +1 -0
  1285. package/clis/vk/shared.js +8 -0
  1286. package/clis/vk/whoami.js +1 -0
  1287. package/clis/wanfang/search.js +42 -0
  1288. package/clis/web/read.js +260 -0
  1289. package/clis/wechat-channels/auth.js +31 -0
  1290. package/clis/wechat-channels/publish.js +298 -0
  1291. package/clis/weibo/article.js +1 -0
  1292. package/clis/weibo/auth.js +17 -0
  1293. package/clis/weibo/comments.js +28 -0
  1294. package/clis/weibo/delete.js +84 -0
  1295. package/clis/weibo/favorites.js +27 -0
  1296. package/clis/weibo/feed.js +33 -0
  1297. package/clis/weibo/hot.js +17 -0
  1298. package/clis/weibo/me.js +51 -0
  1299. package/clis/weibo/post.js +46 -0
  1300. package/clis/weibo/publish.js +98 -0
  1301. package/clis/weibo/search.js +47 -0
  1302. package/clis/weibo/user-posts.js +92 -0
  1303. package/clis/weibo/user.js +37 -0
  1304. package/clis/weibo/utils.js +16 -0
  1305. package/clis/weixin/article.js +1 -0
  1306. package/clis/weixin/create-draft.js +152 -0
  1307. package/clis/weixin/download.js +100 -0
  1308. package/clis/weixin/drafts.js +27 -0
  1309. package/clis/weixin/login.js +1 -0
  1310. package/clis/weixin/search.js +44 -0
  1311. package/clis/weixin/stats.js +43 -0
  1312. package/clis/weixin/whoami.js +1 -0
  1313. package/clis/weread/ai-outline.js +2 -0
  1314. package/clis/weread/auth.js +24 -0
  1315. package/clis/weread/book-search.js +2 -0
  1316. package/clis/weread/book.js +3 -0
  1317. package/clis/weread/highlights.js +1 -0
  1318. package/clis/weread/notebooks.js +1 -0
  1319. package/clis/weread/notes.js +1 -0
  1320. package/clis/weread/ranking.js +1 -0
  1321. package/clis/weread/search.js +1 -0
  1322. package/clis/weread/shelf.js +1 -0
  1323. package/clis/weread/utils.js +67 -0
  1324. package/clis/weread-official/book.js +1 -0
  1325. package/clis/weread-official/discover.js +1 -0
  1326. package/clis/weread-official/list-apis.js +1 -0
  1327. package/clis/weread-official/notes.js +1 -0
  1328. package/clis/weread-official/readdata.js +1 -0
  1329. package/clis/weread-official/review.js +1 -0
  1330. package/clis/weread-official/search.js +1 -0
  1331. package/clis/weread-official/shelf.js +1 -0
  1332. package/clis/weread-official/utils.js +1 -0
  1333. package/clis/wikidata/entity.js +1 -0
  1334. package/clis/wikidata/search.js +1 -0
  1335. package/clis/wikidata/utils.js +1 -0
  1336. package/clis/wikipedia/page.js +3 -0
  1337. package/clis/wikipedia/random.js +1 -0
  1338. package/clis/wikipedia/search.js +1 -0
  1339. package/clis/wikipedia/summary.js +1 -0
  1340. package/clis/wikipedia/trending.js +1 -0
  1341. package/clis/wikipedia/utils.js +1 -0
  1342. package/clis/wordpress/login.js +1 -0
  1343. package/clis/wordpress/publish.js +1 -0
  1344. package/clis/wordpress/shared.js +54 -0
  1345. package/clis/wordpress/whoami.js +1 -0
  1346. package/clis/woshipm/article.js +1 -0
  1347. package/clis/woshipm/login.js +1 -0
  1348. package/clis/woshipm/stats.js +52 -0
  1349. package/clis/woshipm/whoami.js +1 -0
  1350. package/clis/wttr/current.js +1 -0
  1351. package/clis/wttr/forecast.js +1 -0
  1352. package/clis/wttr/utils.js +1 -0
  1353. package/clis/xianyu/auth.js +11 -0
  1354. package/clis/xianyu/chat.js +1 -0
  1355. package/clis/xianyu/im.js +240 -0
  1356. package/clis/xianyu/inbox.js +1 -0
  1357. package/clis/xianyu/item.js +97 -0
  1358. package/clis/xianyu/messages.js +1 -0
  1359. package/clis/xianyu/publish.js +245 -0
  1360. package/clis/xianyu/reply.js +1 -0
  1361. package/clis/xianyu/search.js +141 -0
  1362. package/clis/xianyu/utils.js +1 -0
  1363. package/clis/xiaoe/auth.js +10 -0
  1364. package/clis/xiaoe/catalog.js +134 -0
  1365. package/clis/xiaoe/content.js +16 -0
  1366. package/clis/xiaoe/courses.js +43 -0
  1367. package/clis/xiaoe/detail.js +19 -0
  1368. package/clis/xiaoe/play-url.js +97 -0
  1369. package/clis/xiaohongshu/ask.js +130 -0
  1370. package/clis/xiaohongshu/auth.js +13 -0
  1371. package/clis/xiaohongshu/collection-helpers.js +64 -0
  1372. package/clis/xiaohongshu/comments.js +89 -0
  1373. package/clis/xiaohongshu/creator-note-detail.js +80 -0
  1374. package/clis/xiaohongshu/creator-notes-summary.js +1 -0
  1375. package/clis/xiaohongshu/creator-notes.js +107 -0
  1376. package/clis/xiaohongshu/creator-profile.js +13 -0
  1377. package/clis/xiaohongshu/creator-stats.js +13 -0
  1378. package/clis/xiaohongshu/delete-note.js +69 -0
  1379. package/clis/xiaohongshu/download.js +200 -0
  1380. package/clis/xiaohongshu/draft-clear.js +44 -0
  1381. package/clis/xiaohongshu/draft-delete.js +37 -0
  1382. package/clis/xiaohongshu/draft-open.js +1 -0
  1383. package/clis/xiaohongshu/draft-utils.js +36 -0
  1384. package/clis/xiaohongshu/drafts.js +1 -0
  1385. package/clis/xiaohongshu/feed.js +38 -0
  1386. package/clis/xiaohongshu/follow.js +75 -0
  1387. package/clis/xiaohongshu/liked.js +1 -0
  1388. package/clis/xiaohongshu/note-helpers.js +1 -0
  1389. package/clis/xiaohongshu/note.js +32 -0
  1390. package/clis/xiaohongshu/notifications.js +1 -0
  1391. package/clis/xiaohongshu/publish-video.js +87 -0
  1392. package/clis/xiaohongshu/publish.js +637 -0
  1393. package/clis/xiaohongshu/saved.js +1 -0
  1394. package/clis/xiaohongshu/search.js +194 -0
  1395. package/clis/xiaohongshu/unfollow.js +98 -0
  1396. package/clis/xiaohongshu/user-helpers.js +1 -0
  1397. package/clis/xiaohongshu/user.js +30 -0
  1398. package/clis/xiaoyuzhou/auth.js +3 -0
  1399. package/clis/xiaoyuzhou/download.js +1 -0
  1400. package/clis/xiaoyuzhou/episode.js +1 -0
  1401. package/clis/xiaoyuzhou/podcast-episodes.js +1 -0
  1402. package/clis/xiaoyuzhou/podcast.js +1 -0
  1403. package/clis/xiaoyuzhou/transcript.js +1 -0
  1404. package/clis/xiaoyuzhou/utils.js +1 -0
  1405. package/clis/xueqiu/article.js +4 -0
  1406. package/clis/xueqiu/auth.js +27 -0
  1407. package/clis/xueqiu/comments.js +38 -0
  1408. package/clis/xueqiu/danjuan-utils.js +84 -0
  1409. package/clis/xueqiu/earnings-date.js +1 -0
  1410. package/clis/xueqiu/events.js +17 -0
  1411. package/clis/xueqiu/feed.js +1 -0
  1412. package/clis/xueqiu/fund-holdings.js +1 -0
  1413. package/clis/xueqiu/fund-snapshot.js +1 -0
  1414. package/clis/xueqiu/groups.js +1 -0
  1415. package/clis/xueqiu/hashtags.js +26 -0
  1416. package/clis/xueqiu/hot-stock.js +1 -0
  1417. package/clis/xueqiu/hot.js +1 -0
  1418. package/clis/xueqiu/kline.js +1 -0
  1419. package/clis/xueqiu/search.js +1 -0
  1420. package/clis/xueqiu/stock.js +1 -0
  1421. package/clis/xueqiu/stocks.js +13 -0
  1422. package/clis/xueqiu/users.js +12 -0
  1423. package/clis/xueqiu/utils.js +9 -0
  1424. package/clis/xueqiu/watchlist.js +1 -0
  1425. package/clis/yahoo/search.js +21 -0
  1426. package/clis/yahoo-finance/quote.js +50 -0
  1427. package/clis/yollomi/background.js +1 -0
  1428. package/clis/yollomi/edit.js +1 -0
  1429. package/clis/yollomi/face-swap.js +1 -0
  1430. package/clis/yollomi/generate.js +1 -0
  1431. package/clis/yollomi/models.js +1 -0
  1432. package/clis/yollomi/object-remover.js +1 -0
  1433. package/clis/yollomi/remove-bg.js +1 -0
  1434. package/clis/yollomi/restore.js +1 -0
  1435. package/clis/yollomi/try-on.js +1 -0
  1436. package/clis/yollomi/upload.js +17 -0
  1437. package/clis/yollomi/upscale.js +1 -0
  1438. package/clis/yollomi/utils.js +16 -0
  1439. package/clis/yollomi/video.js +1 -0
  1440. package/clis/youdao/note.js +113 -0
  1441. package/clis/youtube/auth.js +20 -0
  1442. package/clis/youtube/channel.js +118 -0
  1443. package/clis/youtube/comments.js +64 -0
  1444. package/clis/youtube/feed.js +89 -0
  1445. package/clis/youtube/history.js +87 -0
  1446. package/clis/youtube/like.js +33 -0
  1447. package/clis/youtube/playlist.js +47 -0
  1448. package/clis/youtube/publish.js +56 -0
  1449. package/clis/youtube/search.js +39 -0
  1450. package/clis/youtube/subscribe.js +42 -0
  1451. package/clis/youtube/subscriptions.js +26 -0
  1452. package/clis/youtube/transcript-group.js +2 -0
  1453. package/clis/youtube/transcript.js +417 -0
  1454. package/clis/youtube/unlike.js +33 -0
  1455. package/clis/youtube/unsubscribe.js +42 -0
  1456. package/clis/youtube/utils.js +34 -0
  1457. package/clis/youtube/video.js +96 -0
  1458. package/clis/youtube/watch-later.js +41 -0
  1459. package/clis/yuanbao/ask.js +145 -0
  1460. package/clis/yuanbao/auth.js +23 -0
  1461. package/clis/yuanbao/detail.js +1 -0
  1462. package/clis/yuanbao/history.js +1 -0
  1463. package/clis/yuanbao/new.js +16 -0
  1464. package/clis/yuanbao/read.js +1 -0
  1465. package/clis/yuanbao/send.js +1 -0
  1466. package/clis/yuanbao/shared.js +127 -0
  1467. package/clis/yuanbao/status.js +1 -0
  1468. package/clis/yuque/article.js +1 -0
  1469. package/clis/yuque/whoami.js +1 -0
  1470. package/clis/zhihu/answer-comments.js +11 -0
  1471. package/clis/zhihu/answer-detail.js +11 -0
  1472. package/clis/zhihu/answer.js +15 -0
  1473. package/clis/zhihu/article-transform.js +1 -0
  1474. package/clis/zhihu/article.js +7 -0
  1475. package/clis/zhihu/auth.js +11 -0
  1476. package/clis/zhihu/collection.js +7 -0
  1477. package/clis/zhihu/collections.js +7 -0
  1478. package/clis/zhihu/comment.js +17 -0
  1479. package/clis/zhihu/download.js +39 -0
  1480. package/clis/zhihu/favorite.js +39 -0
  1481. package/clis/zhihu/follow.js +19 -0
  1482. package/clis/zhihu/followers.js +1 -0
  1483. package/clis/zhihu/following.js +1 -0
  1484. package/clis/zhihu/hot.js +21 -0
  1485. package/clis/zhihu/like.js +16 -0
  1486. package/clis/zhihu/paginate.js +11 -0
  1487. package/clis/zhihu/pin.js +24 -0
  1488. package/clis/zhihu/pins.js +1 -0
  1489. package/clis/zhihu/question.js +7 -0
  1490. package/clis/zhihu/recommend.js +7 -0
  1491. package/clis/zhihu/search.js +11 -0
  1492. package/clis/zhihu/stats.js +41 -0
  1493. package/clis/zhihu/target.js +1 -0
  1494. package/clis/zhihu/text.js +6 -0
  1495. package/clis/zhihu/user-answers.js +1 -0
  1496. package/clis/zhihu/user-arg.js +1 -0
  1497. package/clis/zhihu/user-articles.js +1 -0
  1498. package/clis/zhihu/user.js +11 -0
  1499. package/clis/zhihu/write-shared.js +71 -0
  1500. package/clis/zlibrary/info.js +1 -0
  1501. package/clis/zlibrary/search.js +1 -0
  1502. package/clis/zlibrary/utils.js +48 -0
  1503. package/clis/zsxq/auth.js +33 -0
  1504. package/clis/zsxq/dynamics.js +1 -0
  1505. package/clis/zsxq/groups.js +1 -0
  1506. package/clis/zsxq/search.js +1 -0
  1507. package/clis/zsxq/topic.js +1 -0
  1508. package/clis/zsxq/topics.js +1 -0
  1509. package/clis/zsxq/utils.js +72 -0
  1510. package/dist/src/adapter-shadow.d.ts +11 -0
  1511. package/dist/src/adapter-shadow.js +2 -0
  1512. package/dist/src/adapter-shadow.test.d.ts +1 -0
  1513. package/dist/src/adapter-source.d.ts +11 -0
  1514. package/dist/src/adapter-source.js +1 -0
  1515. package/dist/src/adapter-source.test.d.ts +1 -0
  1516. package/dist/src/browser/analyze.d.ts +118 -0
  1517. package/dist/src/browser/analyze.js +1 -0
  1518. package/dist/src/browser/analyze.test.d.ts +1 -0
  1519. package/dist/src/browser/article-extract.d.ts +57 -0
  1520. package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
  1521. package/dist/src/browser/article-extract.js +2 -0
  1522. package/dist/src/browser/article-extract.test.d.ts +1 -0
  1523. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  1524. package/dist/src/browser/ax-snapshot.js +2 -0
  1525. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  1526. package/dist/src/browser/base-page.d.ts +151 -0
  1527. package/dist/src/browser/base-page.js +225 -0
  1528. package/dist/src/browser/base-page.test.d.ts +1 -0
  1529. package/dist/src/browser/bridge-readiness.d.ts +14 -0
  1530. package/dist/src/browser/bridge-readiness.js +1 -0
  1531. package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
  1532. package/dist/src/browser/bridge.d.ts +26 -0
  1533. package/dist/src/browser/bridge.js +1 -0
  1534. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  1535. package/dist/src/browser/cdp.d.ts +51 -0
  1536. package/dist/src/browser/cdp.js +1 -0
  1537. package/dist/src/browser/cdp.test.d.ts +1 -0
  1538. package/dist/src/browser/compound.d.ts +59 -0
  1539. package/dist/src/browser/compound.js +82 -0
  1540. package/dist/src/browser/compound.test.d.ts +1 -0
  1541. package/dist/src/browser/config.d.ts +2 -0
  1542. package/dist/src/browser/config.js +1 -0
  1543. package/dist/src/browser/daemon-client.d.ts +79 -0
  1544. package/dist/src/browser/daemon-client.js +1 -0
  1545. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  1546. package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
  1547. package/dist/src/browser/daemon-lifecycle.js +12 -0
  1548. package/dist/src/browser/daemon-transport.d.ts +55 -0
  1549. package/dist/src/browser/daemon-transport.js +1 -0
  1550. package/dist/src/browser/daemon-version.d.ts +4 -0
  1551. package/dist/src/browser/daemon-version.js +2 -0
  1552. package/dist/src/browser/dom-helpers.d.ts +41 -0
  1553. package/dist/src/browser/dom-helpers.js +166 -0
  1554. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  1555. package/dist/src/browser/dom-snapshot.d.ts +93 -0
  1556. package/dist/src/browser/dom-snapshot.js +809 -0
  1557. package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
  1558. package/dist/src/browser/errors.d.ts +38 -0
  1559. package/dist/src/browser/errors.js +5 -0
  1560. package/dist/src/browser/errors.test.d.ts +1 -0
  1561. package/dist/src/browser/extract.d.ts +69 -0
  1562. package/dist/src/browser/extract.js +42 -0
  1563. package/dist/src/browser/extract.test.d.ts +1 -0
  1564. package/dist/src/browser/find.d.ts +84 -0
  1565. package/dist/src/browser/find.js +328 -0
  1566. package/dist/src/browser/find.test.d.ts +1 -0
  1567. package/dist/src/browser/fingerprint.d.ts +44 -0
  1568. package/dist/src/browser/fingerprint.js +82 -0
  1569. package/dist/src/browser/html-tree.d.ts +75 -0
  1570. package/dist/src/browser/html-tree.js +61 -0
  1571. package/dist/src/browser/html-tree.test.d.ts +1 -0
  1572. package/dist/src/browser/index.d.ts +14 -0
  1573. package/dist/src/browser/index.js +1 -0
  1574. package/dist/src/browser/managed-chrome.d.ts +89 -0
  1575. package/dist/src/browser/managed-chrome.js +1 -0
  1576. package/dist/src/browser/network-cache.d.ts +49 -0
  1577. package/dist/src/browser/network-cache.js +1 -0
  1578. package/dist/src/browser/network-cache.test.d.ts +1 -0
  1579. package/dist/src/browser/network-key.d.ts +22 -0
  1580. package/dist/src/browser/network-key.js +1 -0
  1581. package/dist/src/browser/network-key.test.d.ts +1 -0
  1582. package/dist/src/browser/page.d.ts +83 -0
  1583. package/dist/src/browser/page.js +15 -0
  1584. package/dist/src/browser/page.test.d.ts +1 -0
  1585. package/dist/src/browser/profile.d.ts +96 -0
  1586. package/dist/src/browser/profile.js +2 -0
  1587. package/dist/src/browser/proxy-test.d.ts +28 -0
  1588. package/dist/src/browser/proxy-test.js +12 -0
  1589. package/dist/src/browser/shape-filter.d.ts +52 -0
  1590. package/dist/src/browser/shape-filter.js +1 -0
  1591. package/dist/src/browser/shape-filter.test.d.ts +1 -0
  1592. package/dist/src/browser/shape.d.ts +23 -0
  1593. package/dist/src/browser/shape.js +1 -0
  1594. package/dist/src/browser/shape.test.d.ts +1 -0
  1595. package/dist/src/browser/stealth.d.ts +18 -0
  1596. package/dist/src/browser/stealth.js +391 -0
  1597. package/dist/src/browser/stealth.test.d.ts +1 -0
  1598. package/dist/src/browser/tabs.d.ts +13 -0
  1599. package/dist/src/browser/tabs.js +2 -0
  1600. package/dist/src/browser/target-errors.d.ts +39 -0
  1601. package/dist/src/browser/target-errors.js +1 -0
  1602. package/dist/src/browser/target-errors.test.d.ts +1 -0
  1603. package/dist/src/browser/target-resolver.d.ts +158 -0
  1604. package/dist/src/browser/target-resolver.js +423 -0
  1605. package/dist/src/browser/target-resolver.test.d.ts +1 -0
  1606. package/dist/src/browser/trace.d.ts +21 -0
  1607. package/dist/src/browser/trace.js +2 -0
  1608. package/dist/src/browser/utils.d.ts +20 -0
  1609. package/dist/src/browser/utils.js +1 -0
  1610. package/dist/src/browser/utils.test.d.ts +1 -0
  1611. package/dist/src/browser/verify-fixture.d.ts +65 -0
  1612. package/dist/src/browser/verify-fixture.js +2 -0
  1613. package/dist/src/browser/verify-fixture.test.d.ts +1 -0
  1614. package/dist/src/browser/visual-refs.d.ts +11 -0
  1615. package/dist/src/browser/visual-refs.js +94 -0
  1616. package/dist/src/browser-session-lock.d.ts +13 -0
  1617. package/dist/src/browser-session-lock.js +1 -0
  1618. package/dist/src/browser-session-lock.test.d.ts +1 -0
  1619. package/dist/src/browser.test.d.ts +1 -0
  1620. package/dist/src/build-manifest.d.ts +103 -0
  1621. package/dist/src/build-manifest.js +16 -0
  1622. package/dist/src/build-manifest.test.d.ts +1 -0
  1623. package/dist/src/capabilityRouting.d.ts +19 -0
  1624. package/dist/src/capabilityRouting.js +1 -0
  1625. package/dist/src/capabilityRouting.test.d.ts +1 -0
  1626. package/dist/src/cli-argv-preprocess.d.ts +63 -0
  1627. package/dist/src/cli-argv-preprocess.js +1 -0
  1628. package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
  1629. package/dist/src/cli.d.ts +79 -0
  1630. package/dist/src/cli.js +132 -0
  1631. package/dist/src/cli.test.d.ts +1 -0
  1632. package/dist/src/commanderAdapter.d.ts +21 -0
  1633. package/dist/src/commanderAdapter.js +3 -0
  1634. package/dist/src/commanderAdapter.test.d.ts +1 -0
  1635. package/dist/src/commands/auth.d.ts +40 -0
  1636. package/dist/src/commands/auth.js +2 -0
  1637. package/dist/src/commands/auth.test.d.ts +1 -0
  1638. package/dist/src/commands/daemon.d.ts +25 -0
  1639. package/dist/src/commands/daemon.js +1 -0
  1640. package/dist/src/commands/daemon.test.d.ts +1 -0
  1641. package/dist/src/completion-fast.d.ts +22 -0
  1642. package/dist/src/completion-fast.js +1 -0
  1643. package/dist/src/completion-shared.d.ts +13 -0
  1644. package/dist/src/completion-shared.js +30 -0
  1645. package/dist/src/completion.d.ts +21 -0
  1646. package/dist/src/completion.js +1 -0
  1647. package/dist/src/completion.test.d.ts +1 -0
  1648. package/dist/src/constants.d.ts +22 -0
  1649. package/dist/src/constants.js +1 -0
  1650. package/dist/src/convention-audit.d.ts +50 -0
  1651. package/dist/src/convention-audit.js +2 -0
  1652. package/dist/src/convention-audit.test.d.ts +1 -0
  1653. package/dist/src/daemon-utils.d.ts +18 -0
  1654. package/dist/src/daemon-utils.js +1 -0
  1655. package/dist/src/daemon.d.ts +22 -0
  1656. package/dist/src/daemon.js +1 -0
  1657. package/dist/src/daemon.test.d.ts +1 -0
  1658. package/dist/src/discovery.d.ts +43 -0
  1659. package/dist/src/discovery.js +2 -0
  1660. package/dist/src/doctor.d.ts +38 -0
  1661. package/dist/src/doctor.js +13 -0
  1662. package/dist/src/doctor.test.d.ts +1 -0
  1663. package/dist/src/download/article-download.d.ts +72 -0
  1664. package/dist/src/download/article-download.js +21 -0
  1665. package/dist/src/download/article-download.test.d.ts +1 -0
  1666. package/dist/src/download/index.d.ts +71 -0
  1667. package/dist/src/download/index.js +7 -0
  1668. package/dist/src/download/index.test.d.ts +1 -0
  1669. package/dist/src/download/media-download.d.ts +49 -0
  1670. package/dist/src/download/media-download.js +1 -0
  1671. package/dist/src/download/media-download.test.d.ts +1 -0
  1672. package/dist/src/download/progress.d.ts +36 -0
  1673. package/dist/src/download/progress.js +5 -0
  1674. package/dist/src/download/progress.test.d.ts +1 -0
  1675. package/dist/src/electron-apps.d.ts +31 -0
  1676. package/dist/src/electron-apps.js +1 -0
  1677. package/dist/src/electron-apps.test.d.ts +1 -0
  1678. package/dist/src/engine.test.d.ts +1 -0
  1679. package/dist/src/errors.d.ts +117 -0
  1680. package/dist/src/errors.js +2 -0
  1681. package/dist/src/errors.test.d.ts +1 -0
  1682. package/dist/src/execution.d.ts +24 -0
  1683. package/dist/src/execution.js +2 -0
  1684. package/dist/src/execution.test.d.ts +1 -0
  1685. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  1686. package/dist/src/external-clis.yaml +109 -0
  1687. package/dist/src/external.d.ts +49 -0
  1688. package/dist/src/external.js +1 -0
  1689. package/dist/src/external.test.d.ts +1 -0
  1690. package/dist/src/help.d.ts +88 -0
  1691. package/dist/src/help.js +8 -0
  1692. package/dist/src/help.test.d.ts +1 -0
  1693. package/dist/src/hooks.d.ts +46 -0
  1694. package/dist/src/hooks.js +1 -0
  1695. package/dist/src/hooks.test.d.ts +4 -0
  1696. package/dist/src/interceptor.d.ts +44 -0
  1697. package/dist/src/interceptor.js +123 -0
  1698. package/dist/src/interceptor.test.d.ts +4 -0
  1699. package/dist/src/launcher.d.ts +41 -0
  1700. package/dist/src/launcher.js +7 -0
  1701. package/dist/src/launcher.test.d.ts +1 -0
  1702. package/dist/src/logger.d.ts +26 -0
  1703. package/dist/src/logger.js +9 -0
  1704. package/dist/src/main.d.ts +5 -0
  1705. package/dist/src/main.js +10 -0
  1706. package/dist/src/manifest-types.d.ts +43 -0
  1707. package/dist/src/manifest-types.js +1 -0
  1708. package/dist/src/node-network.d.ts +10 -0
  1709. package/dist/src/node-network.js +1 -0
  1710. package/dist/src/node-network.test.d.ts +1 -0
  1711. package/dist/src/observation/artifact.d.ts +16 -0
  1712. package/dist/src/observation/artifact.js +8 -0
  1713. package/dist/src/observation/artifact.test.d.ts +1 -0
  1714. package/dist/src/observation/events.d.ts +89 -0
  1715. package/dist/src/observation/events.js +1 -0
  1716. package/dist/src/observation/index.d.ts +7 -0
  1717. package/dist/src/observation/index.js +1 -0
  1718. package/dist/src/observation/manager.d.ts +9 -0
  1719. package/dist/src/observation/manager.js +1 -0
  1720. package/dist/src/observation/manager.test.d.ts +1 -0
  1721. package/dist/src/observation/redaction.d.ts +11 -0
  1722. package/dist/src/observation/redaction.js +2 -0
  1723. package/dist/src/observation/redaction.test.d.ts +1 -0
  1724. package/dist/src/observation/retention.d.ts +32 -0
  1725. package/dist/src/observation/retention.js +1 -0
  1726. package/dist/src/observation/retention.test.d.ts +1 -0
  1727. package/dist/src/observation/ring-buffer.d.ts +22 -0
  1728. package/dist/src/observation/ring-buffer.js +1 -0
  1729. package/dist/src/observation/ring-buffer.test.d.ts +1 -0
  1730. package/dist/src/observation/session.d.ts +25 -0
  1731. package/dist/src/observation/session.js +1 -0
  1732. package/dist/src/output.d.ts +14 -0
  1733. package/dist/src/output.js +2 -0
  1734. package/dist/src/output.test.d.ts +1 -0
  1735. package/dist/src/package-exports.test.d.ts +1 -0
  1736. package/dist/src/package-paths.d.ts +8 -0
  1737. package/dist/src/package-paths.js +1 -0
  1738. package/dist/src/pipeline/executor.d.ts +11 -0
  1739. package/dist/src/pipeline/executor.js +1 -0
  1740. package/dist/src/pipeline/executor.test.d.ts +4 -0
  1741. package/dist/src/pipeline/index.d.ts +5 -0
  1742. package/dist/src/pipeline/index.js +1 -0
  1743. package/dist/src/pipeline/registry.d.ts +28 -0
  1744. package/dist/src/pipeline/registry.js +1 -0
  1745. package/dist/src/pipeline/steps/browser.d.ts +13 -0
  1746. package/dist/src/pipeline/steps/browser.js +1 -0
  1747. package/dist/src/pipeline/steps/download.d.ts +18 -0
  1748. package/dist/src/pipeline/steps/download.js +1 -0
  1749. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  1750. package/dist/src/pipeline/steps/fetch.d.ts +5 -0
  1751. package/dist/src/pipeline/steps/fetch.js +31 -0
  1752. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  1753. package/dist/src/pipeline/steps/intercept.d.ts +5 -0
  1754. package/dist/src/pipeline/steps/intercept.js +1 -0
  1755. package/dist/src/pipeline/steps/tap.d.ts +12 -0
  1756. package/dist/src/pipeline/steps/tap.js +53 -0
  1757. package/dist/src/pipeline/steps/transform.d.ts +9 -0
  1758. package/dist/src/pipeline/steps/transform.js +1 -0
  1759. package/dist/src/pipeline/template.d.ts +17 -0
  1760. package/dist/src/pipeline/template.js +1 -0
  1761. package/dist/src/pipeline/template.test.d.ts +4 -0
  1762. package/dist/src/pipeline/transform.test.d.ts +4 -0
  1763. package/dist/src/plugin-manifest.d.ts +70 -0
  1764. package/dist/src/plugin-manifest.js +1 -0
  1765. package/dist/src/plugin-manifest.test.d.ts +4 -0
  1766. package/dist/src/plugin-scaffold.d.ts +28 -0
  1767. package/dist/src/plugin-scaffold.js +75 -0
  1768. package/dist/src/plugin-scaffold.test.d.ts +4 -0
  1769. package/dist/src/plugin.d.ts +145 -0
  1770. package/dist/src/plugin.js +20 -0
  1771. package/dist/src/plugin.test.d.ts +4 -0
  1772. package/dist/src/rate-limit.d.ts +15 -0
  1773. package/dist/src/rate-limit.js +2 -0
  1774. package/dist/src/rate-limit.test.d.ts +1 -0
  1775. package/dist/src/registry-api.d.ts +13 -0
  1776. package/dist/src/registry-api.js +1 -0
  1777. package/dist/src/registry.d.ts +130 -0
  1778. package/dist/src/registry.js +1 -0
  1779. package/dist/src/registry.test.d.ts +4 -0
  1780. package/dist/src/runtime-detect.d.ts +31 -0
  1781. package/dist/src/runtime-detect.js +1 -0
  1782. package/dist/src/runtime-detect.test.d.ts +1 -0
  1783. package/dist/src/runtime.d.ts +57 -0
  1784. package/dist/src/runtime.js +1 -0
  1785. package/dist/src/scripts/framework.d.ts +7 -0
  1786. package/dist/src/scripts/framework.js +1 -0
  1787. package/dist/src/scripts/interact.d.ts +4 -0
  1788. package/dist/src/scripts/interact.js +1 -0
  1789. package/dist/src/scripts/store.d.ts +13 -0
  1790. package/dist/src/scripts/store.js +1 -0
  1791. package/dist/src/serialization.d.ts +42 -0
  1792. package/dist/src/serialization.js +4 -0
  1793. package/dist/src/serialization.test.d.ts +1 -0
  1794. package/dist/src/skills.d.ts +14 -0
  1795. package/dist/src/skills.js +6 -0
  1796. package/dist/src/skills.test.d.ts +1 -0
  1797. package/dist/src/snapshotFormatter.d.ts +11 -0
  1798. package/dist/src/snapshotFormatter.js +3 -0
  1799. package/dist/src/snapshotFormatter.test.d.ts +7 -0
  1800. package/dist/src/tui.d.ts +28 -0
  1801. package/dist/src/tui.js +16 -0
  1802. package/dist/src/tui.test.d.ts +1 -0
  1803. package/dist/src/types.d.ts +236 -0
  1804. package/dist/src/types.js +1 -0
  1805. package/dist/src/utils.d.ts +57 -0
  1806. package/dist/src/utils.js +38 -0
  1807. package/dist/src/utils.test.d.ts +1 -0
  1808. package/dist/src/validate.d.ts +21 -0
  1809. package/dist/src/validate.js +3 -0
  1810. package/dist/src/validate.test.d.ts +9 -0
  1811. package/dist/src/verify.d.ts +27 -0
  1812. package/dist/src/verify.js +2 -0
  1813. package/dist/src/verify.test.d.ts +8 -0
  1814. package/dist/src/version.d.ts +4 -0
  1815. package/dist/src/version.js +1 -0
  1816. package/dist/src/weixin-download.test.d.ts +1 -0
  1817. package/docs/guide/browser-bridge.md +94 -0
  1818. package/docs/guide/electron-app-cli.md +199 -0
  1819. package/docs/guide/exit-codes.md +24 -0
  1820. package/docs/guide/extending-opencli.md +134 -0
  1821. package/docs/guide/getting-started.md +81 -0
  1822. package/docs/guide/installation.md +52 -0
  1823. package/docs/guide/plugins.md +226 -0
  1824. package/docs/guide/remote-orchestration.md +116 -0
  1825. package/docs/guide/troubleshooting.md +69 -0
  1826. package/package.json +116 -0
  1827. package/scripts/check-doc-coverage.sh +81 -0
  1828. package/scripts/check-listing-id-pairing.mjs +193 -0
  1829. package/scripts/check-silent-column-drop.mjs +105 -0
  1830. package/scripts/check-typed-error-lint.mjs +118 -0
  1831. package/scripts/clean-dist.cjs +13 -0
  1832. package/scripts/copy-yaml.cjs +12 -0
  1833. package/scripts/fetch-adapters.js +293 -0
  1834. package/scripts/minify-release.mjs +115 -0
  1835. package/scripts/postinstall.js +174 -0
  1836. package/scripts/silent-column-drop-baseline.json +910 -0
  1837. package/scripts/typed-error-lint-baseline.json +1098 -0
  1838. package/skills/opencli-adapter-author/SKILL.md +256 -0
  1839. package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
  1840. package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
  1841. package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
  1842. package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
  1843. package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
  1844. package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
  1845. package/skills/opencli-adapter-author/references/output-design.md +149 -0
  1846. package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
  1847. package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
  1848. package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
  1849. package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
  1850. package/skills/opencli-adapter-author/references/site-memory.md +231 -0
  1851. package/skills/opencli-adapter-author/references/site-recon.md +134 -0
  1852. package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
  1853. package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
  1854. package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
  1855. package/skills/opencli-autofix/SKILL.md +297 -0
  1856. package/skills/opencli-browser/SKILL.md +468 -0
  1857. package/skills/opencli-browser-sitemap/SKILL.md +96 -0
  1858. package/skills/opencli-sitemap-author/SKILL.md +161 -0
  1859. package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
  1860. package/skills/opencli-usage/SKILL.md +168 -0
@@ -0,0 +1,337 @@
1
+ import{htmlToMarkdown as k}from"@jackwener/opencli/utils";import{ArgumentError as j,AuthRequiredError as z}from"@jackwener/opencli/errors";export const GROK_DOMAIN="grok.com",GROK_URL="https://grok.com/",IS_VISIBLE_JS=`
2
+ const isVisible = (node) => {
3
+ if (!(node instanceof Element)) return false;
4
+ const style = window.getComputedStyle(node);
5
+ if (style.visibility === 'hidden' || style.display === 'none') return false;
6
+ const rect = node.getBoundingClientRect();
7
+ return rect.width > 0 && rect.height > 0;
8
+ };
9
+ `;export function authRequired(H){return new z(GROK_DOMAIN,H||"Sign in to grok.com in your browser, then retry.")}export function normalizeBooleanFlag(H,Y=!1){if(typeof H==="boolean")return H;if(H==null||H==="")return Y;const X=String(H).trim().toLowerCase();return X==="true"||X==="1"||X==="yes"||X==="on"}const F=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;export function parseGrokSessionId(H){const Y=String(H??"").trim();if(!Y)throw new j("id","must be a non-empty session ID or grok.com chat URL");let X=Y;if(/^[a-z][a-z0-9+.-]*:\/\//i.test(Y)){let q;try{q=new URL(Y)}catch{throw new j("id",`not a valid Grok URL (got "${H}")`)}const Z=q.hostname.toLowerCase(),$=q.pathname.match(/^\/c\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/?$/i);if(q.protocol!=="https:"||Z!=="grok.com"&&!Z.endsWith(".grok.com")||!$)throw new j("id",`not a valid Grok conversation URL (got "${H}"); expected https://grok.com/c/<id>`);X=$[1]}if(!F.test(X))throw new j("id",`not a valid Grok session ID (got "${H}"); expected a UUID like "7c4197f2-10a1-4ebb-a84a-fea89f4f1d06" or a full https://grok.com/c/<id> URL`);return X.toLowerCase()}export async function isOnGrok(H){const Y=await H.evaluate("window.location.href").catch(()=>"");if(typeof Y!=="string"||!Y)return!1;try{const X=new URL(Y).hostname;return X==="grok.com"||X.endsWith(".grok.com")}catch{return!1}}export async function ensureOnGrok(H){if(await isOnGrok(H))return;await H.goto(GROK_URL);await H.wait(2)}export async function isLoggedIn(H){const Y=await H.evaluate(`(() => {
10
+ ${IS_VISIBLE_JS}
11
+ const composer = document.querySelector('.ProseMirror[contenteditable="true"]');
12
+ if (composer && isVisible(composer)) {
13
+ const signInCta = Array.from(document.querySelectorAll('button, a'))
14
+ .some((node) => isVisible(node) && /^(sign in|log in)$/i.test((node.textContent || '').trim()));
15
+ return !signInCta;
16
+ }
17
+ return false;
18
+ })()`);return Boolean(Y)}export async function getCurrentSessionId(H){const Y=await H.evaluate("window.location.href").catch(()=>"");if(typeof Y!=="string")return"";const X=Y.match(/\/c\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);return X?X[1].toLowerCase():""}const B=["#model-select-trigger",'button[aria-label="Model select"]','button[aria-label="模型选择"]','button[aria-label="モデル選択"]'];export async function getModelLabel(H){const Y=JSON.stringify(B),X=await H.evaluate(`(() => {
19
+ ${IS_VISIBLE_JS}
20
+ const selectors = ${Y};
21
+ let trigger = null;
22
+ for (const sel of selectors) {
23
+ trigger = Array.from(document.querySelectorAll(sel)).find((node) => isVisible(node));
24
+ if (trigger) break;
25
+ }
26
+ if (!trigger) return '';
27
+ return (trigger.innerText || trigger.textContent || '').trim().split('\\n')[0].trim();
28
+ })()`);return typeof X==="string"?X:""}export async function getMessageBubbles(H){const Y=await H.evaluate(`(() => {
29
+ ${IS_VISIBLE_JS}
30
+ const findResponseId = (node) => {
31
+ let parent = node.parentElement;
32
+ while (parent && parent !== document.body) {
33
+ const id = parent.getAttribute('id') || '';
34
+ if (id.startsWith('response-')) return id.slice('response-'.length);
35
+ parent = parent.parentElement;
36
+ }
37
+ return '';
38
+ };
39
+ const bubbles = Array.from(document.querySelectorAll('[data-testid="user-message"], [data-testid="assistant-message"]'))
40
+ .filter((node) => node instanceof HTMLElement && isVisible(node));
41
+ const out = [];
42
+ let positional = 0;
43
+ for (const node of bubbles) {
44
+ const isAssistant = node.getAttribute('data-testid') === 'assistant-message';
45
+ const responseId = findResponseId(node);
46
+ const baseId = responseId || ('pos-' + positional);
47
+ const id = baseId + (isAssistant ? '-assistant' : '-user');
48
+ positional += 1;
49
+ const html = node.innerHTML || '';
50
+ const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();
51
+ out.push({ id, role: isAssistant ? 'Assistant' : 'User', text, html });
52
+ }
53
+ return out;
54
+ })()`);if(!Array.isArray(Y))return[];return Y.map((X)=>({id:String(X?.id||""),role:X?.role==="Assistant"?"Assistant":"User",text:String(X?.text||"").trim(),html:String(X?.html||"")})).filter((X)=>X.id&&(X.text||X.html))}export function bubbleHtmlToMarkdown(H){try{return k(H).trim()}catch{return(H||"").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim()}}export async function getHistoryFromSidebar(H,Y){const X=await H.evaluate(`(() => {
55
+ ${IS_VISIBLE_JS}
56
+ const re = /^\\/c\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;
57
+ const seen = new Set();
58
+ const out = [];
59
+ const anchors = Array.from(document.querySelectorAll('a[href^="/c/"]'));
60
+ for (const a of anchors) {
61
+ if (!(a instanceof HTMLElement) || !isVisible(a)) continue;
62
+ const href = a.getAttribute('href') || '';
63
+ const m = href.match(re);
64
+ if (!m) continue;
65
+ const id = m[1].toLowerCase();
66
+ if (seen.has(id)) continue;
67
+ const title = (a.innerText || a.textContent || '').trim();
68
+ // Sidebar renders the conversation title in one anchor and a separate
69
+ // icon-only anchor for hover affordances. Keep the first occurrence with
70
+ // a non-empty title; if the icon anchor wins the DOM order, fall back to
71
+ // the second pass below.
72
+ seen.add(id);
73
+ out.push({ id, title });
74
+ }
75
+ // Second pass: backfill empty titles from later anchors with the same id.
76
+ const titleById = new Map(out.map((entry) => [entry.id, entry.title]));
77
+ for (const a of anchors) {
78
+ if (!(a instanceof HTMLElement) || !isVisible(a)) continue;
79
+ const href = a.getAttribute('href') || '';
80
+ const m = href.match(re);
81
+ if (!m) continue;
82
+ const id = m[1].toLowerCase();
83
+ const title = (a.innerText || a.textContent || '').trim();
84
+ if (title && !titleById.get(id)) {
85
+ titleById.set(id, title);
86
+ }
87
+ }
88
+ return out.map((entry) => ({ id: entry.id, title: titleById.get(entry.id) || entry.title }));
89
+ })()`);if(!Array.isArray(X))return[];return X.slice(0,Y).map((Z)=>({id:String(Z?.id||""),title:String(Z?.title||"")}))}export async function startNewChat(H){await H.goto(GROK_URL);await H.wait(2)}export async function clickConversationMenuItem(H,Y,X){const q=String(Y).toLowerCase(),Z=JSON.stringify(q),$=JSON.stringify(X.map((Q)=>Q.toLowerCase()));return await H.evaluate(`(async () => {
90
+ const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
91
+ const id = ${Z};
92
+ const labels = ${$};
93
+ // Find the sidebar anchor for this conversation.
94
+ let link = null;
95
+ for (let attempt = 0; attempt < 10; attempt += 1) {
96
+ link = Array.from(document.querySelectorAll('a[href^="/c/"]'))
97
+ .find((a) => a instanceof HTMLElement && a.offsetParent && (a.getAttribute('href') || '').toLowerCase().includes(id));
98
+ if (link) break;
99
+ await waitFor(300);
100
+ }
101
+ if (!link) {
102
+ return { ok: false, reason: 'Conversation not found in sidebar.', detail: 'id=' + id };
103
+ }
104
+ // Trigger the radix context menu — radix listens to PointerEvent +
105
+ // contextmenu, so plain MouseEvent('contextmenu') alone is ignored.
106
+ // Dispatch the full sequence pointerdown/mousedown/contextmenu/pointerup/mouseup
107
+ // with right-button state to mirror a real right-click.
108
+ {
109
+ const rect = link.getBoundingClientRect();
110
+ const init = {
111
+ bubbles: true, cancelable: true, button: 2, buttons: 2,
112
+ clientX: Math.round(rect.left + Math.min(rect.width / 2, 16)),
113
+ clientY: Math.round(rect.top + Math.min(rect.height / 2, 16)),
114
+ };
115
+ link.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
116
+ link.dispatchEvent(new MouseEvent('mousedown', init));
117
+ link.dispatchEvent(new MouseEvent('contextmenu', init));
118
+ link.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
119
+ link.dispatchEvent(new MouseEvent('mouseup', init));
120
+ }
121
+ // Wait for menu items to appear.
122
+ let items = [];
123
+ for (let attempt = 0; attempt < 10; attempt += 1) {
124
+ items = Array.from(document.querySelectorAll('[role="menuitem"]'))
125
+ .filter((it) => it instanceof HTMLElement && it.offsetParent);
126
+ if (items.length) break;
127
+ await waitFor(150);
128
+ }
129
+ if (!items.length) {
130
+ return { ok: false, reason: 'Context menu did not open for the conversation.' };
131
+ }
132
+ const target = items.find((it) => {
133
+ const text = (it.textContent || '').trim().toLowerCase();
134
+ return labels.some((l) => text === l);
135
+ });
136
+ if (!target) {
137
+ return {
138
+ ok: false,
139
+ reason: 'No menu item matched the requested label.',
140
+ detail: 'available=' + JSON.stringify(items.map((it) => (it.textContent || '').trim())),
141
+ };
142
+ }
143
+ target.click();
144
+ return { ok: true, clicked: (target.textContent || '').trim() };
145
+ })()`)}export function getPinStateFromMenuLabels(H){const Y=(Array.isArray(H)?H:[]).map((X)=>String(X||"").trim().toLowerCase()).filter(Boolean);if(Y.some((X)=>X==="取消置顶"||X==="unpin"))return"pinned";if(Y.some((X)=>X==="置顶"||X==="pin"))return"unpinned";return""}export async function isConversationVisibleInSidebar(H,Y){const X=String(Y).toLowerCase(),q=JSON.stringify(X),Z=await H.evaluate(`(() => {
146
+ const id = ${q};
147
+ return Array.from(document.querySelectorAll('a[href^="/c/"]'))
148
+ .some((a) => a instanceof HTMLElement && a.offsetParent && (a.getAttribute('href') || '').toLowerCase().includes(id));
149
+ })()`);return Boolean(Z)}export async function waitForConversationToDisappear(H,Y,X=5000){const q=Date.now();while(Date.now()-q<X){if(!await isConversationVisibleInSidebar(H,Y))return!0;await H.wait(0.25)}return!await isConversationVisibleInSidebar(H,Y)}export async function readConversationMenuLabels(H,Y){const X=String(Y).toLowerCase(),q=JSON.stringify(X),Z=await H.evaluate(`(async () => {
150
+ const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
151
+ const id = ${q};
152
+ let link = null;
153
+ for (let attempt = 0; attempt < 10; attempt += 1) {
154
+ link = Array.from(document.querySelectorAll('a[href^="/c/"]'))
155
+ .find((a) => a instanceof HTMLElement && a.offsetParent && (a.getAttribute('href') || '').toLowerCase().includes(id));
156
+ if (link) break;
157
+ await waitFor(300);
158
+ }
159
+ if (!link) {
160
+ return { ok: false, reason: 'Conversation not found in sidebar.', detail: 'id=' + id, labels: [] };
161
+ }
162
+ const rect = link.getBoundingClientRect();
163
+ const init = {
164
+ bubbles: true, cancelable: true, button: 2, buttons: 2,
165
+ clientX: Math.round(rect.left + Math.min(rect.width / 2, 16)),
166
+ clientY: Math.round(rect.top + Math.min(rect.height / 2, 16)),
167
+ };
168
+ link.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
169
+ link.dispatchEvent(new MouseEvent('mousedown', init));
170
+ link.dispatchEvent(new MouseEvent('contextmenu', init));
171
+ link.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
172
+ link.dispatchEvent(new MouseEvent('mouseup', init));
173
+
174
+ let items = [];
175
+ for (let attempt = 0; attempt < 10; attempt += 1) {
176
+ items = Array.from(document.querySelectorAll('[role="menuitem"]'))
177
+ .filter((it) => it instanceof HTMLElement && it.offsetParent);
178
+ if (items.length) break;
179
+ await waitFor(150);
180
+ }
181
+ const labels = items.map((it) => (it.textContent || '').trim()).filter(Boolean);
182
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
183
+ return items.length
184
+ ? { ok: true, labels }
185
+ : { ok: false, reason: 'Context menu did not open for the conversation.', labels: [] };
186
+ })()`);try{await H.keys("Escape")}catch{}if(!Z||typeof Z!=="object")return{ok:!1,reason:"Malformed context-menu result.",labels:[]};return{ok:Boolean(Z.ok),reason:String(Z.reason||""),detail:String(Z.detail||""),labels:Array.isArray(Z.labels)?Z.labels.map(($)=>String($||"")):[]}}export async function waitForConversationPinState(H,Y,X,q=5000){const Z=Date.now();let $=null;while(Date.now()-Z<q){$=await readConversationMenuLabels(H,Y);if($.ok&&getPinStateFromMenuLabels($.labels)===X)return{ok:!0,state:X,labels:$.labels};await H.wait(0.25)}$=await readConversationMenuLabels(H,Y);const Q=$.ok?getPinStateFromMenuLabels($.labels):"";return{ok:$.ok&&Q===X,state:Q,labels:$.labels||[],reason:$.reason||`Conversation did not reach ${X} state.`,detail:$.detail||""}}export async function fillRenameInputAndSubmit(H,Y){const X=JSON.stringify(Y);return await H.evaluate(`(async () => {
187
+ const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
188
+ let input = null;
189
+ for (let attempt = 0; attempt < 15; attempt += 1) {
190
+ // The inline rename UI surfaces as a single visible <input> or a
191
+ // contenteditable inside the sidebar row.
192
+ input = Array.from(document.querySelectorAll('input[type="text"], [contenteditable="true"]:not(.ProseMirror)'))
193
+ .find((el) => el instanceof HTMLElement && el.offsetParent && el.getBoundingClientRect().left < 260);
194
+ if (input) break;
195
+ await waitFor(200);
196
+ }
197
+ if (!input) {
198
+ return { ok: false, reason: 'Inline rename input did not appear.' };
199
+ }
200
+ input.focus();
201
+ if (input instanceof HTMLInputElement) {
202
+ const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
203
+ setter.call(input, ${X});
204
+ input.dispatchEvent(new Event('input', { bubbles: true }));
205
+ } else {
206
+ // contenteditable path
207
+ input.innerText = '';
208
+ document.execCommand('insertText', false, ${X});
209
+ }
210
+ // Commit by Enter (Grok accepts Enter to confirm, Escape to cancel).
211
+ input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
212
+ return { ok: true, value: ${X} };
213
+ })()`)}export async function sendMessage(H,Y){const X=JSON.stringify(Y);return await H.evaluate(`(async () => {
214
+ const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
215
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
216
+ const composerSelector = '.ProseMirror[contenteditable="true"]';
217
+ const isVisible = (node) => {
218
+ if (!(node instanceof Element)) return false;
219
+ const style = window.getComputedStyle(node);
220
+ if (style.visibility === 'hidden' || style.display === 'none') return false;
221
+ const rect = node.getBoundingClientRect();
222
+ return rect.width > 0 && rect.height > 0;
223
+ };
224
+ const responseIdFor = (node) => {
225
+ let parent = node.parentElement;
226
+ while (parent && parent !== document.body) {
227
+ const id = parent.getAttribute('id') || '';
228
+ if (id.startsWith('response-')) return id.slice('response-'.length);
229
+ parent = parent.parentElement;
230
+ }
231
+ return '';
232
+ };
233
+ const userTurns = () => Array.from(document.querySelectorAll('[data-testid="user-message"]'))
234
+ .filter((node) => node instanceof HTMLElement && isVisible(node))
235
+ .map((node, index) => ({
236
+ id: responseIdFor(node) || ('pos-' + index),
237
+ text: normalize(node.innerText || node.textContent || ''),
238
+ }))
239
+ .filter((turn) => turn.text);
240
+ const promptText = normalize(${X});
241
+ const beforeTurns = userTurns();
242
+ const beforeKeys = new Set(beforeTurns.map((turn) => turn.id + '\\n' + turn.text));
243
+ const waitForSubmittedUserTurn = async () => {
244
+ for (let attempt = 0; attempt < 20; attempt += 1) {
245
+ const turns = userTurns();
246
+ const latest = turns[turns.length - 1];
247
+ const hasNewMatchingTurn = turns.some((turn) => turn.text === promptText && !beforeKeys.has(turn.id + '\\n' + turn.text));
248
+ const appendedMatchingTurn = turns.length > beforeTurns.length && latest?.text === promptText;
249
+ if (hasNewMatchingTurn || appendedMatchingTurn) return true;
250
+ await waitFor(250);
251
+ }
252
+ return false;
253
+ };
254
+ let composer = null;
255
+ for (let attempt = 0; attempt < 12; attempt += 1) {
256
+ const candidate = document.querySelector(composerSelector);
257
+ if (candidate instanceof HTMLElement) { composer = candidate; break; }
258
+ await waitFor(500);
259
+ }
260
+ if (!(composer instanceof HTMLElement)) {
261
+ return { ok: false, reason: 'Grok composer (.ProseMirror) was not found on grok.com.' };
262
+ }
263
+ const editor = composer.editor;
264
+ if (!editor || !editor.commands || typeof editor.commands.focus !== 'function' || typeof editor.commands.insertContent !== 'function') {
265
+ return { ok: false, reason: 'Grok composer editor API was unavailable (page may still be loading).' };
266
+ }
267
+ try {
268
+ if (typeof editor.commands.clearContent === 'function') editor.commands.clearContent();
269
+ editor.commands.focus();
270
+ editor.commands.insertContent(${X});
271
+ } catch (error) {
272
+ return {
273
+ ok: false,
274
+ reason: 'Failed to insert the prompt into the Grok composer.',
275
+ detail: error instanceof Error ? error.message : String(error),
276
+ };
277
+ }
278
+ const isClickableSubmit = (node) => {
279
+ if (!(node instanceof HTMLButtonElement)) return false;
280
+ if (node.disabled) return false;
281
+ return isVisible(node);
282
+ };
283
+ // Prefer data-testid (locale-independent); fall back to aria-label per
284
+ // language. As of 2026-05-31 Grok renders button[data-testid="chat-submit"]
285
+ // once the composer has content. The aria-label varies: "Submit" (en),
286
+ // "提交" (zh-CN), and presumably other locales.
287
+ const submitSelectors = [
288
+ 'button[data-testid="chat-submit"]',
289
+ 'button[aria-label="Submit"]',
290
+ 'button[aria-label="提交"]',
291
+ 'button[aria-label="送信"]',
292
+ ];
293
+ let submit = null;
294
+ for (let attempt = 0; attempt < 12; attempt += 1) {
295
+ for (const sel of submitSelectors) {
296
+ const candidate = Array.from(document.querySelectorAll(sel)).find(isClickableSubmit);
297
+ if (candidate instanceof HTMLButtonElement) { submit = candidate; break; }
298
+ }
299
+ if (submit) break;
300
+ await waitFor(500);
301
+ }
302
+ if (submit instanceof HTMLButtonElement) {
303
+ submit.click();
304
+ if (!(await waitForSubmittedUserTurn())) {
305
+ return { ok: false, reason: 'Grok submit button was clicked but no new user turn appeared.' };
306
+ }
307
+ return { ok: true, submittedVia: 'submit-button' };
308
+ }
309
+ // Fallback: some Grok deployments / locales never surface a
310
+ // submit-labelled button (see #1782); the composer commits on Enter
311
+ // when there is no Shift modifier, and Tiptap honours the synthetic
312
+ // keypress because the editor is focused. Dispatch a full keydown +
313
+ // keypress + keyup chain so any modifier / IME listener stays
314
+ // consistent with a real user pressing Enter.
315
+ const dispatchEnter = (target) => {
316
+ const opts = { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true, cancelable: true };
317
+ target.dispatchEvent(new KeyboardEvent('keydown', opts));
318
+ target.dispatchEvent(new KeyboardEvent('keypress', opts));
319
+ target.dispatchEvent(new KeyboardEvent('keyup', opts));
320
+ };
321
+ try {
322
+ // Re-focus first; insertContent above may have moved focus elsewhere.
323
+ editor.commands.focus();
324
+ const focusTarget = document.activeElement instanceof HTMLElement ? document.activeElement : composer;
325
+ dispatchEnter(focusTarget);
326
+ if (!(await waitForSubmittedUserTurn())) {
327
+ return { ok: false, reason: 'Grok Enter-key fallback fired but no new user turn appeared.' };
328
+ }
329
+ return { ok: true, submittedVia: 'enter-key' };
330
+ } catch (error) {
331
+ return {
332
+ ok: false,
333
+ reason: 'Grok submit button never appeared and Enter-key fallback failed.',
334
+ detail: error instanceof Error ? error.message : String(error),
335
+ };
336
+ }
337
+ })()`)}const D=2,N=6000,V=2;function G(H){return(H||"").replace(/\u00a0/g," ").trim()}export async function waitForAnswer(H,Y,X,q){const Z=Date.now();let $="",Q=0,y="";while(Date.now()-Z<X*1000){await H.wait(D);const f=[...await getMessageBubbles(H)].reverse().find((P)=>P.role==="Assistant");if(!f)continue;if(q&&f.id===q)continue;const W=G(f.text);if(!W||W===Y.trim())continue;y=W;const K=Date.now()-Z>=N;if(W===$){Q+=1;if(K&&Q>=V)return{status:"ok",assistant:f}}else{$=W;Q=0}}if(y)return{status:"partial",assistant:[...await getMessageBubbles(H)].reverse().find((W)=>W.role==="Assistant")};return{status:"timeout"}}export const __test__={GROK_SESSION_ID_RE:F,getPinStateFromMenuLabels};
@@ -0,0 +1,7 @@
1
+ <!doctype html><html><head>
2
+ <meta property="og:title" content="【准新车】二手奔腾T90 2025款 龙耀版 1.5T 舒享型报价,真实车源图片/视频 - 瓜子二手车"/>
3
+ </head><body><script>
4
+ ess=image/quality,q_88/resize,m_fill,w_750,h_750\"}],\"type\":2}],\"videoList\":[],\"videoAbResult\":true,\"videoFeedsSwitch\":true,\"imageCropRatio1x1\":false},\"carRecordInfo\":{\"simpleSummary\":[{\"label\":\"首次上牌\",\"value\":\"2024-12\",\"fullRow\":false},{\"label\":\"表显里程\",\"value\":\"0.17万公里\",\"fullRow\":false},{\"label\":\"过户次数\",\"value\":\"0次\",\"fullRow\":false,\"bottomBall\":{\"title\":\"关于过户次数\",\"desc\":\"部分商家为周转车辆会临时过户至他人名下,建议通过视频看车功能直接与商家确认最新状态。\"}},{\"label\":\"车源地\",\"value\":\"苏州\",\"fullRow\":false}],\"carParamsSummary\":[{\"label\":\"发动机\",\"value\":\"1.5T\",\"fullRow\":false},{\"label\":\"变速箱\",\"value\":\"自动\",\"fullRow\":false},{\"key\":\"emission\",\"label\":\"排放标准\",\"value\":\"国六b\",\"fullRow\":false},{\"label\":\"驱动方式\",\"value\":\"前置前驱\",\"fullRow\":false}],\"archiveSummary\":[{\"key\":\"emission\",\"label\":\"排放标准\",\"value\":\"国六b\",\"fullRow\":false},{\"label\":\"车源地\",\"value\":\"苏州\",\"fullRow\":false},{\"label\":\"车身颜色\",\"value\":\"白色\",\"fullRow\":false},{\"label\":\"车源编号\",\"value\":\"162563585\",\"fullRow\":false}],\"highlightConfigItem\":[{\"id\":5,\"title\":\"方向盘加热\",\"image\":\"https://image1.guazistatic.com/qn2105181024035ead3ad6da599924f0d05a54e3f30885.png\",\"desc\":\"由方向盘内的加热系统实现,由方向盘或中控台上的按钮开启或关闭。属于较高的舒适型配置。\"},{\"id\":11,\"title\":\"自适应巡航\",\"image\":\"https://image1.guazistatic.com/qn2105181212480a405f49434fc91994a49bed6888e181.png\",\"desc\":\"Adaptive Cruise Control简称ACC,可依所设定速度行驶,还可保持预设跟车距离,随着车距变化自动加速与减速。\"},{\"id\":13,\"title\":\"自适应远近光\",\"image\":\"https://image1.guazistatic.com/qn210518121604812071c5c5251de8b33dcf01a5319478.png\",\"desc\":\"开启大灯时,行驶中传感器判断对向或同向车辆情况,自动切换远近光灯,有效保护其他车辆行车安全。\"},{\"id\":14,\"title\":\"并线辅
5
+ s://m.guazi.com/car-detail/c162563585115789.html","price":73800,"priceCurrency":"CNY","priceValidUnt
6
+ 1年6个月,车况S,基础车况极品/理赔0次/过户0次,瓜子二手车,每车必检,超200项官方检测认证,
7
+ </script></body></html>
@@ -0,0 +1,5 @@
1
+ <!doctype html><html><body><div class="list">
2
+ <a class="text-gz-black-303740" href="/car-detail/c168029452296957.html"><section class="mb-20 flex justify-between gap-12"><div class="overflow-hidden rounded-md w-114 h-85"><div class="rounded-md object-cover w-114 h-85" style="position:relative;overflow:hidden"><img alt="创维汽车 创维HT-i 2024款 1.5L PHEV 115KM 泰道版" loading="lazy" width="114" height="85" decoding="async" data-nimg="1" class="object-cover" style="color:transparent;position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transition:opacity 0.3s ease" src="https://image-public.guazistatic.com/qnbdp7206xf2022ab5473b42ad9bced3eb032b23b71780880135.jpg?x-bce-process=image/quality,q_88/resize,m_fill,w_280,h_210"/></div></div><div class="flex-1"><h4 class="line-height-1.5 line-clamp-2"><img alt="icon" loading="lazy" width="41" height="14" decoding="async" data-nimg="1" class="mr-5 inline-block h-14 w-41 -translate-y-1.5" style="color:transparent" src="https://image-public.guazistatic.com/qnbdp1066x2bcdce4af34c493db02eddd6babff42e1754566654.png"/>创维汽车 创维HT-i 2024款 1.5L PHEV 115KM 泰道版</h4><div class="flex h-20 flex-wrap gap-y-10 overflow-hidden whitespace-nowrap w-274 py-4"><span class="text-10 mr-3 flex h-14 items-center justify-center rounded-xs border border-solid px-3" data-text="已检测" style="color:#009B3F;border-color:#99D7B2">已检测</span><span class="text-10 mr-3 flex h-14 items-center justify-center rounded-xs border border-solid px-3" data-text="插电混动" style="color:#009B3F;border-color:#99D7B2">插电混动</span></div><p class="text-11 text-gz-gray-999 leading-11"><span>2025年</span><span>|</span><span>0.64万公里</span><span>|</span><span>北京</span></p><div class="flex justify-start pt-4 leading-12"><div class="flex items-end justify-start"><span class="text-gz-red-f22a18 font-din text-18 leading-12 font-bold">6.85</span><span class="text-gz-red-f22a18 text-12 mr-2">万</span></div><div class="flex flex-1 items-end justify-between"><span class="text-gz-glod-997147 text-12 ml-4">首付<!-- -->0.69万</span></div></div></div></section></a>
3
+ <a class="text-gz-black-303740" href="/car-detail/c168569647231900.html"><section class="mb-20 flex justify-between gap-12"><div class="overflow-hidden rounded-md w-114 h-85"><div class="rounded-md object-cover w-114 h-85" style="position:relative;overflow:hidden"><img alt="雪佛兰 科帕奇 2014款 2.4L 四驱旗舰版 7座" loading="lazy" width="114" height="85" decoding="async" data-nimg="1" class="object-cover" style="color:transparent;position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transition:opacity 0.3s ease" src="https://image-public.guazistatic.com/qnbdp7206x97a811e2903f49e09bb878a57fdcbd0b1781747835.jpg?x-bce-process=image/quality,q_88/resize,m_fill,w_280,h_210"/></div></div><div class="flex-1"><h4 class="line-height-1.5 line-clamp-2"><img alt="icon" loading="lazy" width="41" height="14" decoding="async" data-nimg="1" class="mr-5 inline-block h-14 w-41 -translate-y-1.5" style="color:transparent" src="https://image-public.guazistatic.com/qnbdp1066x1ee05047385e452c90ad8ae7a264a0b51754566654.png"/>雪佛兰 科帕奇 2014款 2.4L 四驱旗舰版 7座</h4><div class="flex h-20 flex-wrap gap-y-10 overflow-hidden whitespace-nowrap w-274 py-4"><span class="text-10 mr-3 flex h-14 items-center justify-center rounded-xs border border-solid px-3" data-text="已检测" style="color:#009B3F;border-color:#99D7B2">已检测</span><span class="text-10 mr-3 flex h-14 items-center justify-center rounded-xs border border-solid px-3" data-text="顶配" style="color:#303741;border-color:#DFE0E2">顶配</span></div><p class="text-11 text-gz-gray-999 leading-11"><span>2015年</span><span>|</span><span>18.27万公里</span><span>|</span><span>北京</span></p><div class="flex justify-start pt-4 leading-12"><div class="flex items-end justify-start"><span class="text-gz-red-f22a18 font-din text-18 leading-12 font-bold">1.41</span><span class="text-gz-red-f22a18 text-12 mr-2">万</span></div><div class="flex flex-1 items-end justify-between"><span class="text-gz-glod-997147 text-12 ml-4">首付<!-- -->0.14万</span></div></div></div></section></a>
4
+ <a class="text-gz-black-303740" href="/car-detail/c168109339309545.html"><section class="mb-20 flex justify-between gap-12"><div class="overflow-hidden rounded-md w-114 h-85"><div class="rounded-md object-cover w-114 h-85" style="position:relative;overflow:hidden"><img alt="吉利银河 银河A7 2026款 EV 550km 臻享版" loading="lazy" width="114" height="85" decoding="async" data-nimg="1" class="object-cover" style="color:transparent;position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transition:opacity 0.3s ease" src="https://image-public.guazistatic.com/qnbdp7206xfeffa252cc524361918effe5eca6e18b1780731400.jpg?x-bce-process=image/quality,q_88/resize,m_fill,w_280,h_210"/></div></div><div class="flex-1"><h4 class="line-height-1.5 line-clamp-2"><img alt="icon" loading="lazy" width="41" height="14" decoding="async" data-nimg="1" class="mr-5 inline-block h-14 w-41 -translate-y-1.5" style="color:transparent" src="https://image-public.guazistatic.com/qnbdp1066x2bcdce4af34c493db02eddd6babff42e1754566654.png"/>吉利银河 银河A7 2026款 EV 550km 臻享版</h4><div class="flex h-20 flex-wrap gap-y-10 overflow-hidden whitespace-nowrap w-274 py-4"><span class="text-10 mr-3 flex h-14 items-center justify-center rounded-xs border border-solid px-3" data-text="已检测" style="color:#009B3F;border-color:#99D7B2">已检测</span><span class="text-10 mr-3 flex h-14 items-center justify-center rounded-xs border border-solid px-3" data-text="纯电动" style="color:#009B3F;border-color:#99D7B2">纯电动</span></div><p class="text-11 text-gz-gray-999 leading-11"><span>2026年</span><span>|</span><span>300公里</span><span>|</span><span>北京</span></p><div class="flex justify-start pt-4 leading-12"><div class="flex items-end justify-start"><span class="text-gz-red-f22a18 font-din text-18 leading-12 font-bold">10.08</span><span class="text-gz-red-f22a18 text-12 mr-2">万</span></div><div class="flex flex-1 items-end justify-between"><span class="text-gz-glod-997147 text-12 ml-4">首付<!-- -->1.01万</span></div></div></div></section></a>
5
+ </div></body></html>
@@ -0,0 +1 @@
1
+ import{cli as j,Strategy as A}from"@jackwener/opencli/registry";import{BROWSE_COLUMNS as B,CommandExecutionError as G,GUAZI_M_BASE as N,clean as W,guaziFetch as O,requireStableId as R,requireText as U,requireLimit as q,resolveCityCode as L}from"./utils.js";const _=["插电混动","纯电动","油电混动","增程式","汽油","柴油"];export function parseListings(P,H){const Q=String(P||"").match(/<a[^>]+href="\/car-detail\/c\d+\.html"[\s\S]*?<\/a>/g)||[],f=[],J=new Set;for(const V of Q){const X=V.match(/car-detail\/c(\d+)\.html/);if(!X)continue;const K=R(X[1],`guazi listing row ${f.length+1}`);if(J.has(K))continue;J.add(K);const $=V.match(/<img[^>]+alt="([^"]+)"/),Y=U($&&$[1],`guazi listing ${K} title`),D=W(V.replace(/<[^>]+>/g," ")),k=D.match(/(\d+(?:\.\d+)?)\s*万\s*首付/),v=D.match(/首付\s*(\d+(?:\.\d+)?)\s*万/),z=D.match(/(\d+(?:\.\d+)?万公里|\d+公里)/),F=D.match(/(\d{4})年/),T=D.match(/[||]\s*([^||]{1,8}?)\s+\d+(?:\.\d+)?\s*万\s*首付/),Z=_.find((b)=>D.includes(b))||"";f.push({rank:f.length+1,clue_id:K,title:Y,price:k?`${k[1]}万`:"",down_payment:v?`${v[1]}万`:"",mileage:z?z[1]:"",year:F?F[1]:"",city:T?W(T[1]):Z,url:`${N}/car-detail/c${K}.html`});if(f.length>=H)break}return f}j({site:"guazi",name:"browse",access:"read",aliases:["list"],description:"瓜子二手车在售车源列表(按城市,含售价/首付/里程/年份)",strategy:A.PUBLIC,browser:!1,args:[{name:"city",positional:!0,help:"城市名(北京/上海/...)或瓜子城市码(bj/sh/...)。默认 bj 北京"},{name:"limit",type:"int",default:20,help:"返回的车源数量(最多 40,单页 SSR 上限)"}],columns:B,func:async(P)=>{const H=L(P.city),Q=q(P.limit,20,40),f=await O(`/${H}/buy/`,`browse ${H}`),J=parseListings(f,Q);if(J.length===0)throw new G(`guazi browse ${H}`,"No SSR listing anchors found on a successful Guazi mobile page; the mobile layout may have changed.");return J}});
@@ -0,0 +1 @@
1
+ import{cli as O,Strategy as W}from"@jackwener/opencli/registry";import{CAR_COLUMNS as Z,EmptyResultError as j,GUAZI_M_BASE as q,clean as Y,guaziFetch as x,normalizeClueId as z,requireText as L}from"./utils.js";const A=["首次上牌","表显里程","过户次数","车源地","车身颜色","发动机","变速箱","驱动方式","排放标准","车源编号"];function D(P){let H=Y(P);H=H.replace(/^【[^】]*】/,"");H=H.replace(/^二手/,"");H=H.replace(/报价[,,].*$/,"");H=H.replace(/\s*-\s*瓜子二手车.*$/,"");return Y(H)}export function parseCarDetail(P,H){const K=String(P||"").replace(/\\"/g,'"'),Q=K.match(/<meta[^>]+property="og:title"[^>]+content="([^"]+)"/)||K.match(/"title":"([^"]{6,80})"/),V=Q?Q[1]:"",X=Y(V).match(/^【([^】]+)】/),F=K.match(/"price":(\d{4,8})/),N=F?`${(Number(F[1])/1e4).toFixed(2)}万`:"",J={};for(const[,$,B]of K.matchAll(/"label":"([^"]{1,12})","value":"([^"]{1,40})"/g))if(!($ in J))J[$]=Y(B);const G=K.match(/基础车况[^,,"<]{0,16}/);return[["clue_id",String(H)],["title",V?D(V):""],["tag",X?X[1]:""],["price",N],["reg_date",J["首次上牌"]||""],["mileage",J["表显里程"]||""],["transfers",J["过户次数"]||""],["source_city",J["车源地"]||""],["color",J["车身颜色"]||""],["engine",J["发动机"]||""],["gearbox",J["变速箱"]||""],["drivetrain",J["驱动方式"]||""],["emission",J["排放标准"]||""],["condition",G?Y(G[0]):""],["listing_no",J["车源编号"]||""],["url",`${q}/car-detail/c${H}.html`]].map(([$,B])=>({field:$,value:B}))}function R(P){const H=Object.fromEntries(P.map((K)=>[K.field,K.value]));return Boolean(H.title||H.price||H.reg_date)}O({site:"guazi",name:"car",access:"read",aliases:["detail"],description:"瓜子二手车车源详情(售价 / 上牌 / 里程 / 过户 / 配置 / 车况)",strategy:W.PUBLIC,browser:!1,args:[{name:"clue_id",required:!0,positional:!0,help:"车源 ID(来自 browse 的 clue_id,或 /car-detail/c<id>.html URL)"}],columns:Z,func:async(P)=>{const H=z(P.clue_id),K=await x(`/car-detail/c${H}.html`,`car ${H}`),Q=parseCarDetail(K,H);if(!R(Q))throw new j(`guazi car ${H}`,"No listing detail found — the car may have been sold/removed, or the id is wrong.");const V=Object.fromEntries(Q.map((X)=>[X.field,X.value]));L(V.title,`guazi car ${H} title`);L(V.price,`guazi car ${H} price`);return Q}});
@@ -0,0 +1 @@
1
+ import{ArgumentError,AuthRequiredError as Q,CommandExecutionError,EmptyResultError}from"@jackwener/opencli/errors";export const GUAZI_M_BASE="https://m.guazi.com";const V="Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1";export const BROWSE_COLUMNS=["rank","clue_id","title","price","down_payment","mileage","year","city","url"],CAR_COLUMNS=["field","value"],CITY_CODE={beijing:"bj","北京":"bj",shanghai:"sh","上海":"sh",guangzhou:"gz","广州":"gz",shenzhen:"sz","深圳":"sz",hangzhou:"hz","杭州":"hz",chengdu:"cd","成都":"cd",chongqing:"cq","重庆":"cq",nanjing:"nj","南京":"nj",wuhan:"wh","武汉":"wh",tianjin:"tj","天津":"tj",xian:"xa","西安":"xa",suzhou:"su","苏州":"su",zhengzhou:"zz","郑州":"zz",changsha:"cs","长沙":"cs",qingdao:"qd","青岛":"qd",shenyang:"sy","沈阳":"sy",dalian:"dl","大连":"dl",jinan:"jn","济南":"jn",hefei:"hf","合肥":"hf",foshan:"fs","佛山":"fs"};export function resolveCityCode(F){if(F==null||F==="")return"bj";const K=String(F).trim().toLowerCase();if(CITY_CODE[K])return CITY_CODE[K];if(CITY_CODE[String(F).trim()])return CITY_CODE[String(F).trim()];if(/^[a-z]{2,3}$/.test(K))return K;const L=Object.keys(CITY_CODE).filter((N)=>/^[a-z]+$/.test(N)).join(", ");throw new ArgumentError("city",`unknown city '${F}'. pass a Guazi city code or one of: ${L}`)}export function normalizeClueId(F){const K=String(F||"").trim();if(!K)throw new ArgumentError("clue_id must be a non-empty value");const L=K.match(/car-detail\/c(\d+)/)||K.match(/^c?(\d+)$/);if(!L)throw new ArgumentError(`'${F}' does not look like a guazi clue id (a number, or a /car-detail/c<id>.html URL)`);return L[1]}export function requireLimit(F,K,L){const N=F==null||F===""?K:F,P=typeof N==="number"?N:Number(String(N).trim());if(!Number.isInteger(P)||P<1||P>L)throw new ArgumentError(`limit must be an integer between 1 and ${L}`);return P}export function clean(F){return String(F==null?"":F).replace(/\s+/g," ").trim()}export function requireText(F,K){const L=clean(F);if(!L)throw new CommandExecutionError(`${K} did not include a stable text value.`);return L}export function requireStableId(F,K){const L=String(F??"").trim();if(!/^\d+$/.test(L))throw new CommandExecutionError(`${K} did not include a stable numeric id.`);return L}export async function guaziFetch(F,K){let L;try{L=await fetch(`${GUAZI_M_BASE}${F}`,{headers:{"User-Agent":V,Referer:`${GUAZI_M_BASE}/`,"Accept-Language":"zh-CN,zh;q=0.9"}})}catch(P){throw new CommandExecutionError(`guazi ${K} network error: ${P?.message||P}`)}if(!L.ok)throw new CommandExecutionError(`guazi ${K} HTTP ${L.status}`);const N=await L.text();if(/瑞数|reese84|captcha|滑动验证|verify\.guazi|安全验证/i.test(N)&&!/car-detail\/c\d+/.test(N))throw new Q("guazi.com",`guazi ${K} hit an anti-bot challenge — Guazi may have started gating the mobile site.`);return N}export{ArgumentError,CommandExecutionError,EmptyResultError};
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as t}from"@jackwener/opencli/registry";e({site:"hackernews",name:"ask",access:"read",description:"Hacker News Ask HN posts",domain:"news.ycombinator.com",strategy:t.PUBLIC,browser:!1,args:[{name:"limit",type:"int",default:20,help:"Number of stories"}],columns:["rank","id","title","score","author","comments","url"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/askstories.json"}},{limit:"${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"},{map:{id:"${{ item }}"}},{fetch:{url:"https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json"}},{filter:"item.title && !item.deleted && !item.dead"},{map:{rank:"${{ index + 1 }}",id:"${{ item.id }}",title:"${{ item.title }}",score:"${{ item.score }}",author:"${{ item.by }}",comments:"${{ item.descendants }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1,9 @@
1
+ import{AuthRequiredError as n,CommandExecutionError as c}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as i}from"../_shared/site-auth.js";const t="https://news.ycombinator.com";async function r(e){return(await e.getCookies({url:t})).some((a)=>a.name==="user"&&a.value)}async function s(e){if(!await r(e))throw new n("news.ycombinator.com","Hacker News `user` cookie missing — not signed in");await e.goto(`${t}/news`);await e.wait(1);const o=await e.evaluate(`(() => {
2
+ // The top-right nav shows "<username> (karma) | logout" only when signed in.
3
+ const userLink = document.querySelector('span.pagetop a[href^="user?id="]');
4
+ const logout = document.querySelector('a[href^="logout"]');
5
+ if (!userLink || !logout) return { anon: true };
6
+ const username = (userLink.textContent || '').trim();
7
+ const karmaMatch = (document.querySelector('span.pagetop')?.textContent || '').match(/\\((\\d+)\\)/);
8
+ return { username, karma: karmaMatch ? karmaMatch[1] : '' };
9
+ })()`);if(o?.anon||!o?.username)throw new n("news.ycombinator.com","Hacker News shows no signed-in user — cookie stale");return{username:o.username,karma:o.karma||""}}i({site:"hackernews",domain:"news.ycombinator.com",loginUrl:`${t}/login`,columns:["username","karma"],quickCheck:r,verify:s,poll:async(e)=>{if(!await r(e))throw new n("news.ycombinator.com","Waiting for Hacker News `user` cookie");return s(e)}});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as t}from"@jackwener/opencli/registry";e({site:"hackernews",name:"best",access:"read",description:"Hacker News best stories",domain:"news.ycombinator.com",strategy:t.PUBLIC,browser:!1,args:[{name:"limit",type:"int",default:20,help:"Number of stories"}],columns:["rank","id","title","score","author","comments","url"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/beststories.json"}},{limit:"${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"},{map:{id:"${{ item }}"}},{fetch:{url:"https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json"}},{filter:"item.title && !item.deleted && !item.dead"},{map:{rank:"${{ index + 1 }}",id:"${{ item.id }}",title:"${{ item.title }}",score:"${{ item.score }}",author:"${{ item.by }}",comments:"${{ item.descendants }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1,61 @@
1
+ import{ArgumentError as Q,AuthRequiredError as T,CommandExecutionError as L}from"@jackwener/opencli/errors";import{cli as U,Strategy as V}from"@jackwener/opencli/registry";const M="https://news.ycombinator.com";export function normalizeItemId(F){const J=String(F||"").trim();if(!J)throw new Q("Item id is required.","Pass an HN item id (story or comment), e.g. 48811591.");if(/^\d+$/.test(J))return J;const B=J.match(/[?&]id=(\d+)/);if(B)return B[1];throw new Q(`Invalid HN item reference: ${JSON.stringify(J)}`,"Pass a numeric id or an item?id=… URL.")}U({site:"hackernews",name:"comment",access:"write",description:"Post a comment on a Hacker News item. Pass the parent id (a story to comment on it, or a comment to reply). Contribute a substantive, on-topic comment — HN flags low-effort or off-topic replies.",domain:"news.ycombinator.com",strategy:V.COOKIE,browser:!0,args:[{name:"parent",type:"string",required:!0,positional:!0,help:"Parent item id (story or comment) to reply to"},{name:"text",type:"string",required:!0,positional:!0,help:"Comment text (HN markup: blank line = paragraph)"}],columns:["status","id","url","parent","message"],func:async(F,J)=>{if(!F)throw new L("Browser session required");const B=normalizeItemId(J.parent),P=String(J.text??"");if(!P.trim())throw new Q("Comment text cannot be empty.");await F.goto(`${M}/item?id=${B}`);await F.wait(1);const D=await F.evaluate(`(async () => {
2
+ try {
3
+ if (/\\/login/.test(location.pathname)) return { kind: 'auth', detail: 'redirected to /login' };
4
+ // The reply form posts to "comment" (relative). Match it by the hidden
5
+ // fields it carries rather than the action attribute, which HN writes
6
+ // relative ("comment") so /comment suffix selectors miss it.
7
+ const forms = [...document.querySelectorAll('form')].filter(f => f.querySelector('input[name="hmac"]') && f.querySelector('input[name="parent"]'));
8
+ const form = forms.find(f => (f.querySelector('input[name="parent"]')?.value) === ${JSON.stringify(B)}) || forms[0];
9
+ if (!form) return { kind: 'notfound', detail: 'No comment form on this item — it may be closed, deleted, or you are signed out.' };
10
+ const hmac = form.querySelector('input[name="hmac"]')?.value;
11
+ const goto = form.querySelector('input[name="goto"]')?.value || ('item?id=' + ${JSON.stringify(B)});
12
+ const parentVal = form.querySelector('input[name="parent"]')?.value || ${JSON.stringify(B)};
13
+ if (!hmac) return { kind: 'auth', detail: 'comment hmac token missing — likely signed out' };
14
+
15
+ const p = new URLSearchParams();
16
+ p.set('parent', parentVal);
17
+ p.set('goto', goto);
18
+ p.set('hmac', hmac);
19
+ p.set('text', ${JSON.stringify(P)});
20
+
21
+ const res = await fetch('/comment', {
22
+ method: 'POST',
23
+ credentials: 'include',
24
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
25
+ body: p.toString(),
26
+ redirect: 'manual',
27
+ });
28
+ if (res.type === 'opaqueredirect' || res.status === 302 || res.status === 0) {
29
+ return { ok: true };
30
+ }
31
+ const body = await res.text();
32
+ let msg = '';
33
+ if (/Please try again/i.test(body)) msg = 'HN asked to try again (possible rate limit or expired token).';
34
+ else if (/You're posting too fast|too fast/i.test(body)) msg = 'Posting too fast — HN rate limited the comment.';
35
+ else {
36
+ const td = body.match(/<td[^>]*>\\s*([^<][^<]{0,200}?)\\s*<\\/td>/i);
37
+ if (td) msg = td[1].replace(/\\s+/g, ' ').trim();
38
+ }
39
+ return { kind: 'reject', detail: msg || ('HTTP ' + res.status + ' without redirect'), status: res.status };
40
+ } catch (e) {
41
+ return { kind: 'exception', detail: String((e && e.message) || e) };
42
+ }
43
+ })()`);if(D?.kind==="auth")throw new T("news.ycombinator.com",D.detail);if(D?.kind==="notfound")throw new L(D.detail);if(D?.kind==="exception")throw new L(`HN comment failed: ${D.detail}`);if(D?.kind==="reject")return[{status:"failed",id:"",url:"",parent:B,message:D.detail}];if(!D?.ok)throw new L(`Unexpected HN comment result: ${JSON.stringify(D)}`);await F.goto(`${M}/item?id=${B}`);await F.wait(1);const K=(await F.evaluate(`(() => {
44
+ try {
45
+ let username = '';
46
+ const navLink = document.querySelector('span.pagetop a[href^="user?id="]');
47
+ if (navLink) username = (navLink.getAttribute('href') || '').replace('user?id=', '');
48
+ const want = ${JSON.stringify(P)}.replace(/\\s+/g, ' ').trim();
49
+ const rows = [...document.querySelectorAll('tr.athing.comtr')];
50
+ // Newest first: our fresh comment is usually near the top of its thread.
51
+ for (const row of rows) {
52
+ const by = (row.querySelector('a.hnuser')?.textContent || '').trim();
53
+ if (username && by !== username) continue;
54
+ const commentText = (row.querySelector('.commtext')?.textContent || '').replace(/\\s+/g, ' ').trim();
55
+ if (commentText.startsWith(want.slice(0, 60))) {
56
+ return { id: row.id };
57
+ }
58
+ }
59
+ return null;
60
+ } catch { return null; }
61
+ })()`))?.id||"";return[{status:"success",id:K,url:K?`${M}/item?id=${K}`:`${M}/item?id=${B}`,parent:B,message:K?"Comment posted":"Comment posted (id not confirmed on reload)"}]}});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as i}from"@jackwener/opencli/registry";e({site:"hackernews",name:"jobs",access:"read",description:"Hacker News job postings",domain:"news.ycombinator.com",strategy:i.PUBLIC,browser:!1,args:[{name:"limit",type:"int",default:20,help:"Number of job postings"}],columns:["rank","id","title","author","url"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/jobstories.json"}},{limit:"${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"},{map:{id:"${{ item }}"}},{fetch:{url:"https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json"}},{filter:"item.title && !item.deleted && !item.dead"},{map:{rank:"${{ index + 1 }}",id:"${{ item.id }}",title:"${{ item.title }}",author:"${{ item.by }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as t}from"@jackwener/opencli/registry";e({site:"hackernews",name:"new",access:"read",description:"Hacker News newest stories",domain:"news.ycombinator.com",strategy:t.PUBLIC,browser:!1,args:[{name:"limit",type:"int",default:20,help:"Number of stories"}],columns:["rank","id","title","score","author","comments","url"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/newstories.json"}},{limit:"${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"},{map:{id:"${{ item }}"}},{fetch:{url:"https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json"}},{filter:"item.title && !item.deleted && !item.dead"},{map:{rank:"${{ index + 1 }}",id:"${{ item.id }}",title:"${{ item.title }}",score:"${{ item.score }}",author:"${{ item.by }}",comments:"${{ item.descendants }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1,11 @@
1
+ import{cli as P,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentError as F,CommandExecutionError as E,EmptyResultError as T}from"@jackwener/opencli/errors";const I="https://hacker-news.firebaseio.com/v0/item";async function K(z){const G=await fetch(`${I}/${z}.json`);if(!G.ok)throw new E(`HN API HTTP ${G.status} for item ${z}`,"Check the item ID");return G.json()}function M(z,G){if(!Number.isInteger(z)||z<=0)throw new F(`${G} must be a positive integer`);return z}function x(z,G,V){if(!Number.isInteger(z)||z<G)throw new F(`${V} must be an integer >= ${G}`);return z}function B(z){if(!z)return"";return String(z).replace(/<p>/gi,`
2
+
3
+ `).replace(/<\/p>/gi,"").replace(/<br\s*\/?>/gi,`
4
+ `).replace(/<i>(.*?)<\/i>/gi,"$1").replace(/<a[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/gi,"$2 ($1)").replace(/<pre><code>([\s\S]*?)<\/code><\/pre>/gi,`
5
+ $1
6
+ `).replace(/<[^>]+>/g,"").replace(/&#x27;/g,"'").replace(/&quot;/g,'"').replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&nbsp;/g," ").replace(/&#x2F;/g,"/").trim()}function v(z,G){if(G===0)return z;const Y=`${" ".repeat(G)}> `;return z.split(`
7
+ `).map((Z)=>Y+Z).join(`
8
+ `)}function b(z){return" ".repeat(z+1)}P({site:"hackernews",name:"read",access:"read",description:"Read a Hacker News story and its comment tree",domain:"news.ycombinator.com",strategy:w.PUBLIC,browser:!1,args:[{name:"id",required:!0,positional:!0,help:"HN item ID (e.g. 39847301)"},{name:"limit",type:"int",default:25,help:"Max top-level comments"},{name:"depth",type:"int",default:2,help:"Max reply depth (1=no replies, 2=one level of replies, etc.)"},{name:"replies",type:"int",default:5,help:"Max replies shown per comment at each level"},{name:"max-length",type:"int",default:2000,help:"Max characters per comment body (min 100)"}],columns:["type","author","score","text"],func:async(z)=>{const G=String(z.id||"").trim();if(!/^\d+$/.test(G))throw new F(`Invalid HN item id: ${z.id}`,"Pass a numeric id like 39847301");const V=M(z.limit??25,"hackernews read --limit"),Y=M(z.depth??2,"hackernews read --depth"),Z=M(z.replies??5,"hackernews read --replies"),W=x(z["max-length"]??2000,100,"hackernews read --max-length"),O=await K(G);if(!O||O.deleted||O.dead)throw new T(`hackernews/${G}`,"Story not found, deleted, or dead");const U=[],$=B(O.text||""),N=$.length>W?$.slice(0,W)+`
9
+ ... [truncated]`:$,D=[O.title||""];if(N)D.push(`
10
+ `+N);if(O.url)D.push(`
11
+ `+O.url);U.push({type:"POST",author:O.by||"[deleted]",score:O.score??0,text:D.join("").trim()});const S=Array.isArray(O.kids)?O.kids:[],_=S.slice(0,V),k=await Promise.all(_.map((J)=>K(J).catch(()=>null)));async function C(J,Q){if(!J||J.deleted||J.dead||J.type!=="comment")return;const H=B(J.text||""),L=H.length>W?H.slice(0,W)+"...":H;U.push({type:Q===0?"L0":`L${Q}`,author:J.by||"[deleted]",score:"",text:v(L,Q)});const X=Array.isArray(J.kids)?J.kids:[];if(Q+1>=Y){if(X.length>0)U.push({type:`L${Q+1}`,author:"",score:"",text:`${b(Q)}[+${X.length} more replies]`});return}const A=X.slice(0,Z),R=await Promise.all(A.map((j)=>K(j).catch(()=>null)));for(const j of R)await C(j,Q+1);const f=X.length-A.length;if(f>0)U.push({type:`L${Q+1}`,author:"",score:"",text:`${b(Q)}[+${f} more replies]`})}for(const J of k)await C(J,0);const q=Math.max(0,S.length-_.length);if(q>0)U.push({type:"",author:"",score:"",text:`[+${q} more top-level comments]`});return U}});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as t}from"@jackwener/opencli/registry";e({site:"hackernews",name:"search",access:"read",description:"Search Hacker News stories",domain:"news.ycombinator.com",strategy:t.PUBLIC,browser:!1,args:[{name:"query",required:!0,positional:!0,help:"Search query"},{name:"limit",type:"int",default:20,help:"Number of results"},{name:"sort",default:"relevance",help:"Sort by relevance or date",choices:["relevance","date"]}],columns:["rank","id","title","score","author","comments","url"],pipeline:[{fetch:{url:"https://hn.algolia.com/api/v1/${{ args.sort === 'date' ? 'search_by_date' : 'search' }}",params:{query:"${{ args.query }}",tags:"story",hitsPerPage:"${{ args.limit }}"}}},{select:"hits"},{map:{rank:"${{ index + 1 }}",id:"${{ item.objectID }}",title:"${{ item.title }}",score:"${{ item.points }}",author:"${{ item.author }}",comments:"${{ item.num_comments }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as t}from"@jackwener/opencli/registry";e({site:"hackernews",name:"show",access:"read",description:"Hacker News Show HN posts",domain:"news.ycombinator.com",strategy:t.PUBLIC,browser:!1,args:[{name:"limit",type:"int",default:20,help:"Number of stories"}],columns:["rank","id","title","score","author","comments","url"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/showstories.json"}},{limit:"${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"},{map:{id:"${{ item }}"}},{fetch:{url:"https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json"}},{filter:"item.title && !item.deleted && !item.dead"},{map:{rank:"${{ index + 1 }}",id:"${{ item.id }}",title:"${{ item.title }}",score:"${{ item.score }}",author:"${{ item.by }}",comments:"${{ item.descendants }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1,65 @@
1
+ import{ArgumentError as F,AuthRequiredError as Q,CommandExecutionError as L}from"@jackwener/opencli/errors";import{cli as T,Strategy as V}from"@jackwener/opencli/registry";const M="https://news.ycombinator.com";T({site:"hackernews",name:"submit",access:"write",description:"Submit a story to Hacker News. Link post by default (--url), or an Ask/text post with --text. HN gates submissions on account age/karma and dedupes URLs — rejections are surfaced verbatim. Post genuinely worthwhile content; low-effort submissions hurt the account.",domain:"news.ycombinator.com",strategy:V.COOKIE,browser:!0,args:[{name:"title",type:"string",required:!0,positional:!0,help:"Story title (max 80 chars)"},{name:"url",type:"string",help:"External URL for a link post (mutually exclusive with --text)"},{name:"text",type:"string",help:"Body text for an Ask HN / text post (mutually exclusive with --url)"}],columns:["status","id","url","title","message"],func:async(v,D)=>{if(!v)throw new L("Browser session required");const z=String(D.title??"").trim();if(!z)throw new F("Title is required.");if(z.length>80)throw new F("HN titles must be at most 80 characters.");const B=typeof D.url==="string"?D.url.trim():"",K=typeof D.text==="string"?D.text:"";if(B&&K)throw new F("Pass either --url (link post) or --text (text post), not both.");if(!B&&!K)throw new F("A story needs either --url or --text.","Give a link to submit, or --text for an Ask HN post.");if(B)try{new URL(B)}catch{throw new F(`Invalid --url: ${B}`)}await v.goto(`${M}/submit`);await v.wait(1);const f=await v.evaluate(`(async () => {
2
+ try {
3
+ // The submit form only renders for a signed-in user; if HN bounced us
4
+ // to /login the form (and its fnid) will be absent.
5
+ if (/\\/login/.test(location.pathname)) return { kind: 'auth', detail: 'redirected to /login' };
6
+ const form = document.querySelector('form[action$="/r"], form[action="/r"], form[action="https://news.ycombinator.com/r"]')
7
+ || [...document.querySelectorAll('form')].find(f => f.querySelector('input[name="fnid"]'));
8
+ if (!form) return { kind: 'auth', detail: 'submit form not found — not signed in' };
9
+ const fnid = form.querySelector('input[name="fnid"]')?.value;
10
+ if (!fnid) return { kind: 'auth', detail: 'fnid token missing' };
11
+
12
+ const p = new URLSearchParams();
13
+ p.set('fnid', fnid);
14
+ p.set('fnop', 'submit-page');
15
+ p.set('title', ${JSON.stringify(z)});
16
+ p.set('url', ${JSON.stringify(B)});
17
+ p.set('text', ${JSON.stringify(K)});
18
+
19
+ const res = await fetch('/r', {
20
+ method: 'POST',
21
+ credentials: 'include',
22
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
23
+ body: p.toString(),
24
+ redirect: 'manual',
25
+ });
26
+ // A same-origin 302 comes back as an opaque redirect (status 0) — that
27
+ // is the success path. A 200 means HN re-rendered the form with an error.
28
+ if (res.type === 'opaqueredirect' || res.status === 302 || res.status === 0) {
29
+ return { ok: true };
30
+ }
31
+ const body = await res.text();
32
+ // Pull the first human-readable error HN prints above the form.
33
+ let msg = '';
34
+ const td = body.match(/<td[^>]*>\\s*([^<][^<]{0,200}?)\\s*<\\/td>/i);
35
+ if (/Please try again/i.test(body)) msg = 'HN asked to try again (possible rate limit or expired token).';
36
+ else if (/already been submitted/i.test(body)) msg = 'That URL has already been submitted.';
37
+ else if (td) msg = td[1].replace(/\\s+/g, ' ').trim();
38
+ return { kind: 'reject', detail: msg || ('HTTP ' + res.status + ' without redirect'), status: res.status };
39
+ } catch (e) {
40
+ return { kind: 'exception', detail: String((e && e.message) || e) };
41
+ }
42
+ })()`);if(f?.kind==="auth")throw new Q("news.ycombinator.com",f.detail);if(f?.kind==="exception")throw new L(`HN submit failed: ${f.detail}`);if(f?.kind==="reject")return[{status:"failed",id:"",url:"",title:z,message:f.detail}];if(!f?.ok)throw new L(`Unexpected HN submit result: ${JSON.stringify(f)}`);await v.wait(1);const J=(await v.evaluate(`(async () => {
43
+ try {
44
+ const uc = document.cookie.match(/(?:^|; )user=([^;]+)/);
45
+ // Cookie value is "<username>&<hash>"; the nav link is more reliable.
46
+ let username = '';
47
+ const navLink = document.querySelector('span.pagetop a[href^="user?id="]');
48
+ if (navLink) username = (navLink.getAttribute('href') || '').replace('user?id=', '');
49
+ if (!username && uc) username = decodeURIComponent(uc[1]).split('&')[0];
50
+ if (!username) return null;
51
+ const res = await fetch('/submitted?id=' + encodeURIComponent(username), { credentials: 'include' });
52
+ const html = await res.text();
53
+ const doc = new DOMParser().parseFromString(html, 'text/html');
54
+ const rows = [...doc.querySelectorAll('tr.athing')];
55
+ const want = ${JSON.stringify(z)}.replace(/\\s+/g, ' ').trim();
56
+ for (const row of rows.slice(0, 5)) {
57
+ const link = row.querySelector('.titleline a, a.storylink, .title a');
58
+ const t = (link?.textContent || '').replace(/\\s+/g, ' ').trim();
59
+ if (t === want) {
60
+ return { id: row.id, href: link?.getAttribute('href') || '' };
61
+ }
62
+ }
63
+ return { id: rows[0]?.id || '', href: '' };
64
+ } catch { return null; }
65
+ })()`))?.id||"",P=J?`${M}/item?id=${J}`:"";return[{status:"success",id:J,url:P,title:z,message:J?"Story submitted":"Story submitted (item id not confirmed; check /newest)"}]}});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as t}from"@jackwener/opencli/registry";e({site:"hackernews",name:"top",access:"read",description:"Hacker News top stories",domain:"news.ycombinator.com",strategy:t.PUBLIC,browser:!1,args:[{name:"limit",type:"int",default:20,help:"Number of stories"}],columns:["rank","id","title","score","author","comments","url"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/topstories.json"}},{limit:"${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"},{map:{id:"${{ item }}"}},{fetch:{url:"https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json"}},{filter:"item.title && !item.deleted && !item.dead"},{map:{rank:"${{ index + 1 }}",id:"${{ item.id }}",title:"${{ item.title }}",score:"${{ item.score }}",author:"${{ item.by }}",comments:"${{ item.descendants }}",url:"${{ item.url }}"}},{limit:"${{ args.limit }}"}]});
@@ -0,0 +1 @@
1
+ import{cli as e,Strategy as r}from"@jackwener/opencli/registry";e({site:"hackernews",name:"user",access:"read",description:"Hacker News user profile",domain:"news.ycombinator.com",strategy:r.PUBLIC,browser:!1,args:[{name:"username",required:!0,positional:!0,help:"HN username"}],columns:["username","karma","created","about"],pipeline:[{fetch:{url:"https://hacker-news.firebaseio.com/v0/user/${{ args.username }}.json"}},{map:{username:"${{ item.id }}",karma:"${{ item.karma }}",created:"${{ item.created ? new Date(item.created * 1000).toISOString().slice(0, 10) : '' }}",about:"${{ item.about }}"}}]});