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,113 @@
1
+ import{ArgumentError as K,CommandExecutionError as X}from"@jackwener/opencli/errors";export const IS_VISIBLE_JS=`
2
+ const isVisible = (el) => {
3
+ if (!el) return false;
4
+ const r = el.getBoundingClientRect();
5
+ if (r.width < 1 || r.height < 1) return false;
6
+ const cs = getComputedStyle(el);
7
+ if (cs.visibility === 'hidden' || cs.display === 'none' || cs.opacity === '0') return false;
8
+ return true;
9
+ };
10
+ `;export function unwrapEvaluateResult(h){if(h&&typeof h==="object"&&!Array.isArray(h)&&"session"in h&&"data"in h)return h.data;return h}export async function evaluateQoder(h,q){return unwrapEvaluateResult(await h.evaluate(q))}export function requireArrayResult(h,q){if(!Array.isArray(h))throw new X(`${q}: unexpected evaluate result shape`);return h}export function parsePositiveInt(h,q,F){const z=h==null||h===""?q:Number(h);if(!Number.isInteger(z)||z<1)throw new K(`${F} must be a positive integer`);return z}export function clickFirstScript(h){return`(() => {
11
+ ${IS_VISIBLE_JS}
12
+ const sels = ${JSON.stringify(h)};
13
+ for (const sel of sels) {
14
+ const target = Array.from(document.querySelectorAll(sel)).filter(isVisible)[0];
15
+ if (target) {
16
+ const r = target.getBoundingClientRect();
17
+ const opts = { bubbles: true, cancelable: true, clientX: r.x + r.width/2, clientY: r.y + r.height/2 };
18
+ target.dispatchEvent(new PointerEvent('pointerdown', opts));
19
+ target.dispatchEvent(new MouseEvent('mousedown', opts));
20
+ target.dispatchEvent(new PointerEvent('pointerup', opts));
21
+ target.dispatchEvent(new MouseEvent('mouseup', opts));
22
+ target.click();
23
+ return { ok: true, sel };
24
+ }
25
+ }
26
+ return { ok: false, reason: 'No matching visible element.' };
27
+ })()`}export function clickByTextScript(h,q={}){const{exact:F=!1,maxLen:z=60}=q;return`(() => {
28
+ ${IS_VISIBLE_JS}
29
+ const patterns = ${JSON.stringify(h)};
30
+ const exact = ${F?"true":"false"};
31
+ const maxLen = ${z};
32
+ const isVis = isVisible;
33
+ const candidates = Array.from(document.querySelectorAll('button, [role="button"], a, [role="tab"]')).filter(isVis);
34
+ for (const pat of patterns) {
35
+ const target = candidates.find((b) => {
36
+ const tx = (b.innerText || b.textContent || '').trim();
37
+ if (tx.length > maxLen) return false;
38
+ return exact ? tx === pat : tx.toLowerCase().includes(pat.toLowerCase());
39
+ });
40
+ if (target) {
41
+ const r = target.getBoundingClientRect();
42
+ const opts = { bubbles: true, cancelable: true, clientX: r.x + r.width/2, clientY: r.y + r.height/2 };
43
+ target.dispatchEvent(new PointerEvent('pointerdown', opts));
44
+ target.dispatchEvent(new MouseEvent('mousedown', opts));
45
+ target.dispatchEvent(new PointerEvent('pointerup', opts));
46
+ target.dispatchEvent(new MouseEvent('mouseup', opts));
47
+ target.click();
48
+ return { ok: true, matched: pat };
49
+ }
50
+ }
51
+ return { ok: false, reason: 'No button matching: ' + patterns.join(' / ') };
52
+ })()`}export const QODER_TURNS_JS=`(() => {
53
+ ${IS_VISIBLE_JS}
54
+ const chatPanes = Array.from(document.querySelectorAll('[class*="chat"i], [class*="conversation"i], [class*="message"i]')).filter(isVisible);
55
+ if (!chatPanes.length) return [];
56
+ const pane = chatPanes.sort((a, b) => b.getBoundingClientRect().height - a.getBoundingClientRect().height)[0];
57
+ const candidates = Array.from(pane.querySelectorAll('div, article, [class*="message"i], [class*="turn"i], [class*="bubble"i]'))
58
+ .filter(isVisible)
59
+ .filter((el) => {
60
+ const tx = (el.innerText || '').trim();
61
+ return tx.length > 5 && tx.length < 4000 && el.children.length < 20;
62
+ });
63
+ const seen = new Set();
64
+ return candidates.map((el) => {
65
+ const tx = (el.innerText || '').trim().replace(/\\s+/g, ' ');
66
+ if (seen.has(tx)) return null;
67
+ seen.add(tx);
68
+ const cls = (el.className || '').toString().toLowerCase();
69
+ const role = /user|me-|right/.test(cls) ? 'User' : (/assistant|ai|bot|response/.test(cls) ? 'Assistant' : 'Turn');
70
+ return { role, text: tx };
71
+ }).filter(Boolean);
72
+ })()`;export function buildQoderInjectTextScript(h){return`(() => {
73
+ ${IS_VISIBLE_JS}
74
+ const editors = Array.from(document.querySelectorAll('[contenteditable="true"]')).filter(isVisible);
75
+ const candidates = editors.map((editor, index) => {
76
+ const rect = editor.getBoundingClientRect();
77
+ const attrs = [
78
+ editor.getAttribute('aria-label') || '',
79
+ editor.getAttribute('placeholder') || '',
80
+ editor.getAttribute('data-placeholder') || '',
81
+ editor.textContent || '',
82
+ editor.className || '',
83
+ editor.closest('[class*="composer"i], [class*="input"i], [class*="chat"i]')?.className || '',
84
+ ].join(' ').toLowerCase();
85
+ let score = 0;
86
+ if (editor.getAttribute('role') === 'textbox') score += 25;
87
+ if (attrs.includes('message') || attrs.includes('prompt') || attrs.includes('ask')) score += 120;
88
+ if (attrs.includes('composer') || attrs.includes('input')) score += 60;
89
+ if (attrs.includes('optional description') || attrs.includes('user context document') || attrs.includes('knowledge')) score -= 240;
90
+ if (window.innerHeight > 0) score += Math.max(0, 80 - Math.abs(window.innerHeight - (rect.y + rect.height)) / 8);
91
+ return { editor, index, score };
92
+ }).sort((a, b) => b.score - a.score || b.index - a.index);
93
+ const best = candidates[0];
94
+ if (!best || best.score < 40) return { ok: false, reason: 'No high-confidence Qoder composer found.' };
95
+ const editor = best.editor;
96
+ editor.focus();
97
+ document.execCommand('selectAll', false);
98
+ const inserted = document.execCommand('insertText', false, ${JSON.stringify(String(h??""))});
99
+ if (!inserted) {
100
+ editor.textContent = ${JSON.stringify(String(h??""))};
101
+ }
102
+ editor.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ${JSON.stringify(String(h??""))} }));
103
+ return { ok: true, score: best.score };
104
+ })()`}export const QODER_MESSAGE_COUNT_JS=`(() => {
105
+ const turns = ${QODER_TURNS_JS};
106
+ return Array.isArray(turns) ? turns.length : 0;
107
+ })()`;export function qoderResponseAfterScript(h,q){return`(() => {
108
+ const turns = ${QODER_TURNS_JS};
109
+ if (!Array.isArray(turns) || turns.length <= ${Number(h)||0}) return null;
110
+ const fresh = turns.slice(${Number(h)||0})
111
+ .filter((turn) => turn && turn.text && turn.text !== ${JSON.stringify(String(q??""))});
112
+ return fresh.length ? fresh[fresh.length - 1] : null;
113
+ })()`}export async function waitForSelector(h,q,F=5000,z=200){const G=Date.now()+F;while(Date.now()<G){if(await h.evaluate(`!!document.querySelector(${JSON.stringify(q)})`))return!0;await new Promise((H)=>setTimeout(H,z))}return!1}
@@ -0,0 +1 @@
1
+ import{cli as h,Strategy as q}from"@jackwener/opencli/registry";import{CommandExecutionError as z}from"@jackwener/opencli/errors";import{clickByTextScript as A,evaluateQoder as D}from"./_utils.js";h({site:"qoder",name:"prompt-enhance",access:"write",description:'Click "Prompt Enhance" — Qoder rewrites the current composer draft for better LLM consumption.',domain:"localhost",strategy:q.UI,browser:!0,args:[],columns:["Status"],func:async(f)=>{const b=await D(f,A(["Prompt Enhance"]));if(!b?.ok)throw new z(b?.reason||"Prompt Enhance button not found","");await f.wait(0.5);return[{Status:"enhanced (check composer)"}]}});h({site:"qoder",name:"open-editor",access:"write",description:'Click "Open Editor" — opens the current draft in a full editor pane.',domain:"localhost",strategy:q.UI,browser:!0,args:[],columns:["Status"],func:async(f)=>{const b=await D(f,A(["Open Editor"]));if(!b?.ok)throw new z(b?.reason||"Open Editor button not found","");return[{Status:"clicked"}]}});
@@ -0,0 +1,25 @@
1
+ import{cli as o,Strategy as a}from"@jackwener/opencli/registry";import{EmptyResultError as l}from"@jackwener/opencli/errors";import{evaluateQoder as c,IS_VISIBLE_JS as u,parsePositiveInt as d,requireArrayResult as m}from"./_utils.js";o({site:"qoder",name:"history",access:"read",description:"List Quests visible in the Qoder sidebar. Returns title + visible metadata.",domain:"localhost",strategy:a.UI,browser:!0,args:[{name:"limit",type:"int",required:!1,default:50}],columns:["Index","Title"],func:async(t,r)=>{const s=d(r?.limit,50,"--limit"),e=m(await c(t,`(() => {
2
+ ${u}
3
+ // Qoder renders quests in the sidebar Quest List. They appear as
4
+ // clickable rows; structure is iterative-discovery — find rows
5
+ // that have either role=button or a click handler and contain a title.
6
+ // We use the heuristic: any element under the sidebar (left panel)
7
+ // whose textContent looks like a Quest title (< 100 chars, no menu indicator).
8
+ const sidebars = Array.from(document.querySelectorAll('[class*="sidebar"i], [class*="quest-list"i], [class*="quest"i]')).filter(isVisible);
9
+ const seen = new Set();
10
+ const out = [];
11
+ sidebars.forEach((sb) => {
12
+ const rows = Array.from(sb.querySelectorAll('[role="button"], button, [class*="item"i]')).filter(isVisible);
13
+ rows.forEach((r) => {
14
+ const txt = (r.innerText || r.textContent || '').trim().replace(/\\s+/g, ' ');
15
+ if (!txt || txt.length < 2 || txt.length > 200) return;
16
+ // Skip menu items, headers, action buttons.
17
+ if (/^(New Quest|Search|Settings|View all|Knowledge|Marketplace|Credits Usage|Pin|Add Workspace|Open Editor|More Actions|Open Panel|Collapse|leo|button)$/i.test(txt.trim())) return;
18
+ if (txt.includes('⌘')) return;
19
+ if (seen.has(txt)) return;
20
+ seen.add(txt);
21
+ out.push(txt);
22
+ });
23
+ });
24
+ return out;
25
+ })()`),"qoder history");if(!e.length)throw new l("qoder history","No quests visible. Try widening the sidebar or selecting a workspace.");return e.slice(0,s).map((i,n)=>({Index:n+1,Title:i}))}});
@@ -0,0 +1 @@
1
+ import{cli as F,Strategy as I}from"@jackwener/opencli/registry";import{ArgumentError as j,CommandExecutionError as Y,TimeoutError as A}from"@jackwener/opencli/errors";import{buildQoderInjectTextScript as G,clickByTextScript as J,clickFirstScript as B,evaluateQoder as H,parsePositiveInt as R,QODER_MESSAGE_COUNT_JS as $,qoderResponseAfterScript as w}from"./_utils.js";async function y(z,K,L=5000){const W=Math.max(1,Math.ceil(L/500));for(let V=0;V<W;V++){await z.wait(0.5);const X=await H(z,$);if(Number(X)>Number(K))return X}return K}F({site:"qoder",name:"new",access:"write",description:'Start a new Qoder Quest (conversation). Clicks the "New Quest" button in the sidebar (or its ⌘N variant).',domain:"localhost",strategy:I.UI,browser:!0,args:[],columns:["Status"],func:async(z)=>{const K=await H(z,J(["New Quest"]));if(!K?.ok)throw new Y(K?.reason||"New Quest button not found","");await z.wait(0.5);return[{Status:"started"}]}});F({site:"qoder",name:"send",access:"write",description:'Type text into the Qoder composer and click "Send message" (fire-and-forget).',domain:"localhost",strategy:I.UI,browser:!0,args:[{name:"text",positional:!0,required:!0,help:"Text to send"}],columns:["Status","Length"],func:async(z,K)=>{const L=String(K?.text||"").trim();if(!L)throw new j("text is required");const W=await H(z,$),V=await H(z,G(L));if(!V?.ok)throw new Y(V?.reason||"composer type failed","");await z.wait(0.3);if(!(await H(z,B(['button[aria-label="Send message"]','button[title="Send message"]'])))?.ok){if(!(await H(z,J(["Send message","Send","发送"])))?.ok)throw new Y("Send button not found","")}const N=await y(z,W);if(Number(N)<=Number(W))throw new Y("Qoder send did not create a new visible message row");return[{Status:"sent",Length:String(L.length)}]}});F({site:"qoder",name:"ask",access:"write",description:"Send a prompt to Qoder and wait up to --timeout seconds for the reply (best-effort: polls for the chat turn count to grow + stabilize).",domain:"localhost",strategy:I.UI,browser:!0,args:[{name:"text",positional:!0,required:!0,help:"Prompt text"},{name:"timeout",type:"int",required:!1,default:120,help:"Max seconds to wait"}],columns:["Role","Text","WaitedSeconds"],func:async(z,K)=>{const L=String(K?.text||"").trim();if(!L)throw new j("text is required");const W=R(K?.timeout,120,"--timeout"),V=await H(z,$),X=await H(z,G(L));if(!X?.ok)throw new Y(X?.reason||"composer type failed","");await z.wait(0.3);if(!(await H(z,B(['button[aria-label="Send message"]','button[title="Send message"]'])))?.ok){if(!(await H(z,J(["Send message","Send","发送"])))?.ok)throw new Y("Send button not found","")}const q=Date.now(),M=q+W*1000;let P=V,h=0,Z=null;while(Date.now()<M){await new Promise((O)=>setTimeout(O,1500));const D=await H(z,$);if(D!==P){P=D;h=0}else h++;if(P>V&&h>=6){Z=await H(z,w(V,L));if(Z?.text)break}}const U=Math.round((Date.now()-q)/1000);if(!Z?.text)throw new A("Qoder response",W,"Confirm Qoder sent the prompt and finished generating, then retry with a larger --timeout.");return[{Role:"User",Text:L,WaitedSeconds:String(U)},{Role:Z.role||"Assistant",Text:String(Z.text).slice(0,1200),WaitedSeconds:String(U)}]}});
@@ -0,0 +1 @@
1
+ import{cli as a,Strategy as n}from"@jackwener/opencli/registry";import{EmptyResultError as l}from"@jackwener/opencli/errors";import{evaluateQoder as d,parsePositiveInt as m,QODER_TURNS_JS as u,requireArrayResult as c}from"./_utils.js";a({site:"qoder",name:"read",access:"read",description:"Read messages in the current Qoder Quest. Returns role + text for each visible turn.",domain:"localhost",strategy:n.UI,browser:!0,args:[{name:"limit",type:"int",required:!1,default:30}],columns:["Index","Role","Text"],func:async(r,i)=>{const s=m(i?.limit,30,"--limit"),e=c(await d(r,u),"qoder read");if(!e.length)throw new l("qoder read","No chat turns detected. Open a quest first.");return e.slice(0,s).map((t,o)=>({Index:o+1,Role:t.role,Text:(t.text||"").slice(0,1200)}))}});
@@ -0,0 +1 @@
1
+ import{cli as r,Strategy as o}from"@jackwener/opencli/registry";import{evaluateQoder as e}from"./_utils.js";r({site:"qoder",name:"status",access:"read",description:"Check Qoder CDP connection and report the current renderer URL + title.",domain:"localhost",strategy:o.UI,browser:!0,args:[],columns:["Status","Url","Title"],func:async(t)=>{return[{Status:"Connected",Url:await e(t,"window.location.href"),Title:await e(t,"document.title")}]}});
@@ -0,0 +1,59 @@
1
+ import{cli as K,Strategy as M}from"@jackwener/opencli/registry";import{ArgumentError as f,CommandExecutionError as H,EmptyResultError as F}from"@jackwener/opencli/errors";import{IS_VISIBLE_JS as U,clickByTextScript as N,clickFirstScript as j,evaluateQoder as D,parsePositiveInt as A,requireArrayResult as $}from"./_utils.js";K({site:"qoder",name:"sidebar-toggle",access:"write",description:"Collapse / Expand the Qoder Quest List sidebar (⌘B).",domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const z=await D(h,N(["Collapse Quest List","Expand Quest List"]));if(!z?.ok)throw new H(z?.reason||"sidebar-toggle failed","");return[{Status:`clicked: ${z.matched}`}]}});K({site:"qoder",name:"open-panel",access:"write",description:"Open / close the Qoder bottom panel (Output / Terminal / Debug Console). ⌥⌘B equivalent.",domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const z=await D(h,N(["Open Panel","Close Panel"]));if(!z?.ok)throw new H(z?.reason||"open-panel failed","");return[{Status:`clicked: ${z.matched}`}]}});K({site:"qoder",name:"search",access:"read",description:"Open Qoder Search palette (⌘P), type a query, return matched options.",domain:"localhost",strategy:M.UI,browser:!0,args:[{name:"query",positional:!0,required:!0,help:"Search text"},{name:"limit",type:"int",required:!1,default:20}],columns:["Index","Item"],func:async(h,z)=>{const G=String(z?.query||"").trim();if(!G)throw new f("query","is required");const X=A(z?.limit,20,"--limit"),O=await D(h,N(["Search"]));if(!O?.ok)throw new H(O?.reason||"search open failed","");await h.wait(0.5);const W=await D(h,`(() => {
2
+ ${U}
3
+ const inputs = Array.from(document.querySelectorAll('input[type="text"], input[type="search"], input:not([type])')).filter(isVisible);
4
+ const input = inputs[inputs.length - 1];
5
+ if (!input) return { ok: false, reason: 'No input visible.' };
6
+ const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
7
+ setter.call(input, ${JSON.stringify(G)});
8
+ input.dispatchEvent(new Event('input', { bubbles: true }));
9
+ input.dispatchEvent(new Event('change', { bubbles: true }));
10
+ return { ok: true };
11
+ })()`);if(!W?.ok)throw new H(W?.reason||"search type failed","");await h.wait(0.8);const Y=$(await D(h,`(() => {
12
+ ${U}
13
+ // Search palette results: prefer [role=option], else any clickable row in the modal.
14
+ const opts = Array.from(document.querySelectorAll('[role="option"], [role="menuitem"]')).filter(isVisible);
15
+ const titles = opts.map((o) => {
16
+ // Codex-style fix: text may be in per-char spans; use textContent.
17
+ const titleEl = o.querySelector('.truncate, [class*="title"i]') || o;
18
+ return (titleEl.textContent || '').trim().replace(/\\s+/g, ' ').slice(0, 200);
19
+ }).filter(Boolean);
20
+ return [...new Set(titles)];
21
+ })()`),"qoder search");try{await h.evaluate("document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));")}catch{}if(!Y.length)throw new F("qoder search",`No items matched "${G}".`);return Y.slice(0,X).map((Z,P)=>({Index:P+1,Item:Z}))}});K({site:"qoder",name:"settings",access:"write",description:"Click the Settings button in the Qoder sidebar.",domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{if(!(await D(h,N(["Settings"])))?.ok){if(!(await D(h,j(['button[aria-label="Settings"]'])))?.ok)throw new H("Settings button not found","")}await h.wait(0.5);return[{Status:"clicked"}]}});K({site:"qoder",name:"knowledge",access:"write",description:"Open the Knowledge view (Qoder's personal/team knowledge base).",domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const z=await D(h,N(["Knowledge"]));if(!z?.ok)throw new H(z?.reason||"Knowledge button not found","");return[{Status:"clicked"}]}});K({site:"qoder",name:"marketplace",access:"write",description:"Open the Qoder Marketplace.",domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const z=await D(h,N(["Marketplace"]));if(!z?.ok)throw new H(z?.reason||"Marketplace button not found","");return[{Status:"clicked"}]}});K({site:"qoder",name:"credits",access:"read",description:'Click "Credits Usage" and return the credits-usage display text.',domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Field","Value"],func:async(h)=>{const z=await D(h,N(["Credits Usage"]));if(!z?.ok)throw new H(z?.reason||"Credits Usage not visible","");await h.wait(0.5);const G=await D(h,`(() => {
22
+ ${U}
23
+ // Find any dialog/popover that appeared.
24
+ const popovers = Array.from(document.querySelectorAll('[role="dialog"], [class*="popover"i], [class*="popup"i]')).filter(isVisible);
25
+ if (!popovers.length) return null;
26
+ const pop = popovers[popovers.length - 1];
27
+ return (pop.innerText || pop.textContent || '').trim().replace(/\\s+/g, ' ').slice(0, 600);
28
+ })()`);try{await h.evaluate("document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));")}catch{}return[{Field:"Status",Value:"clicked"},{Field:"Info",Value:G||"(no popover detected after click)"}]}});K({site:"qoder",name:"view-all",access:"write",description:'Click "View all" to show all Quests.',domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const z=await D(h,N(["View all"]));if(!z?.ok)throw new H(z?.reason||"View all button not visible","");return[{Status:"clicked"}]}});K({site:"qoder",name:"add-workspace",access:"write",description:'Click "Add Workspace" — opens the folder picker. Note: this opens a system file-picker dialog that Qoder controls; the actual folder selection must be done in the UI by the user.',domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const z=await D(h,N(["Add Workspace"]));if(!z?.ok)throw new H(z?.reason||"Add Workspace button not found","");return[{Status:"clicked — folder picker opened (manual selection required)"}]}});K({site:"qoder",name:"account",access:"read",description:"Click the account button (username) in the Qoder sidebar and return the visible account dropdown items.",domain:"localhost",strategy:M.UI,browser:!0,args:[{name:"username",required:!1,help:"Username text shown in the sidebar (default: tries common short labels)"}],columns:["Field","Value"],func:async(h,z)=>{let G=String(z?.username||"").trim();if(!G)G=await D(h,`(() => {
29
+ ${U}
30
+ const btns = Array.from(document.querySelectorAll('button')).filter(isVisible);
31
+ const known = new Set(['Pin', 'Copy', 'New Quest', 'Search', 'Settings', 'View all', 'Knowledge', 'Marketplace', 'Credits Usage', 'Open Editor', 'Add Workspace', 'More Actions', 'Send message', 'Prompt Enhance', 'Voice input', 'button']);
32
+ const candidate = btns.find((b) => {
33
+ const tx = (b.innerText || '').trim();
34
+ if (!tx || tx.length > 30 || tx.includes('⌘') || known.has(tx)) return false;
35
+ if (/^(New|Open|Add|Save|Edit|Cancel|OK|Close)/.test(tx)) return false;
36
+ return true;
37
+ });
38
+ return candidate ? (candidate.innerText || '').trim() : '';
39
+ })()`);if(!G)throw new H("No account button detected. Pass --username <name> explicitly.","");if(!(await D(h,N([G],{exact:!0,maxLen:60})))?.ok)throw new H(`Click on account button "${G}" failed`,"");await h.wait(0.5);const O=$(await D(h,`(() => {
40
+ ${U}
41
+ const popovers = Array.from(document.querySelectorAll('[role="menu"], [role="dialog"], [class*="popover"i], [class*="dropdown"i]')).filter(isVisible)
42
+ .filter((el) => { const r = el.getBoundingClientRect(); return r.width < 500 && r.height < 600; });
43
+ if (!popovers.length) return [];
44
+ const pop = popovers[popovers.length - 1];
45
+ return Array.from(pop.querySelectorAll('button, [role="menuitem"], a'))
46
+ .filter(isVisible)
47
+ .map((b) => (b.innerText || b.textContent || '').trim().replace(/\\s+/g, ' '))
48
+ .filter(Boolean);
49
+ })()`),"qoder account");try{await h.evaluate("document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));")}catch{}const W=[{Field:"Username",Value:G}];(O||[]).slice(0,20).forEach((Y,Z)=>{W.push({Field:`Item[${Z+1}]`,Value:Y})});return W}});K({site:"qoder",name:"more-actions",access:"read",description:'Click the "More Actions" button and list its menu items.',domain:"localhost",strategy:M.UI,browser:!0,args:[],columns:["Index","Item"],func:async(h)=>{const z=await D(h,N(["More Actions"]));if(!z?.ok)throw new H(z?.reason||"More Actions button not found","");await h.wait(0.4);const G=$(await D(h,`(() => {
50
+ ${U}
51
+ const popovers = Array.from(document.querySelectorAll('[role="menu"], [role="dialog"], [class*="popover"i], [class*="menu"i]')).filter(isVisible)
52
+ .filter((el) => { const r = el.getBoundingClientRect(); return r.width < 500 && r.height < 600; });
53
+ if (!popovers.length) return [];
54
+ const pop = popovers[popovers.length - 1];
55
+ return Array.from(pop.querySelectorAll('[role="menuitem"], button'))
56
+ .filter(isVisible)
57
+ .map((b) => (b.innerText || b.textContent || '').trim().replace(/\\s+/g, ' '))
58
+ .filter(Boolean);
59
+ })()`),"qoder more-actions");try{await h.evaluate("document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));")}catch{}if(!G.length)throw new F("qoder more-actions","Menu opened but no items detected.");return G.map((X,O)=>({Index:O+1,Item:X}))}});
@@ -0,0 +1,16 @@
1
+ import{AuthRequiredError as G,CommandExecutionError as F}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as K}from"../_shared/site-auth.js";const J=`(async () => {
2
+ try {
3
+ const r = await fetch('https://pan.quark.cn/account/info?fr=pc&platform=pc', { credentials: 'include', headers: { Accept: 'application/json' } });
4
+ if (r.status === 401 || r.status === 403) return { kind: 'auth', detail: 'Quark account/info HTTP ' + r.status };
5
+ if (!r.ok) return { kind: 'http', httpStatus: r.status };
6
+ const d = await r.json();
7
+ const data = d && d.data;
8
+ const isEmpty = !data || Array.isArray(data) || Object.keys(data).length === 0;
9
+ if (isEmpty) return { kind: 'auth', detail: 'Quark account/info returned empty data — anonymous' };
10
+ const nickname = String(data.nickname || data.nick_name || data.name || '');
11
+ if (!nickname) return { kind: 'render-error', detail: 'Quark account/info populated but no nickname field — response shape drift' };
12
+ return { ok: true, nickname };
13
+ } catch (e) {
14
+ return { kind: 'exception', detail: String(e && e.message || e) };
15
+ }
16
+ })()`;async function L(D){await D.goto("https://pan.quark.cn/");await D.wait(2);const z=await D.evaluate(J);if(z?.kind==="auth")throw new G("quark.cn",z.detail);if(z?.kind==="http")throw new F(`HTTP ${z.httpStatus} from Quark account/info`);if(z?.kind==="render-error")throw new F(z.detail);if(z?.kind==="exception")throw new F(`Quark whoami failed: ${z.detail}`);if(!z?.ok)throw new F(`Unexpected Quark probe: ${JSON.stringify(z)}`);return{nickname:z.nickname}}K({site:"quark",domain:"quark.cn",loginUrl:"https://pan.quark.cn/",columns:["nickname"],verify:L,poll:async(D)=>{const z=await D.evaluate(J);if(!z?.ok)throw new G("quark.cn","Waiting for Quark login");return{nickname:z.nickname}}});
@@ -0,0 +1 @@
1
+ import{cli as p,Strategy as h}from"@jackwener/opencli/registry";import{findFolder as m,formatSize as y,listMyDrive as _}from"./utils.js";async function c(o,n,i,r,e,s){if(r>e)return[];const a=await _(o,n),d=[];for(const t of a){if(s&&!t.dir)continue;const f=i?`${i}/${t.file_name}`:t.file_name,l={name:t.file_name,fid:t.fid,is_dir:t.dir,size:y(t.size),path:f};if(t.dir&&r<e)l.children=await c(o,t.fid,f,r+1,e,s);d.push(l)}return d}function u(o,n=0){const i=[],r=" ".repeat(n);for(const e of o){i.push({name:`${r}${e.name}`,fid:e.fid,is_dir:e.is_dir,size:e.size,path:e.path});if(e.children)i.push(...u(e.children,n+1))}return i}p({site:"quark",name:"ls",access:"read",description:"List files in your Quark Drive",domain:"pan.quark.cn",strategy:h.COOKIE,args:[{name:"path",positional:!0,default:"",help:"Folder path to list (empty for root)"},{name:"depth",type:"int",default:0,help:"Max depth to traverse"},{name:"dirs-only",type:"boolean",default:!1,help:"Show directories only"}],columns:["name","is_dir","size","fid","path"],func:async(o,n)=>{const i=n.path??"",r=Math.max(0,n.depth??0),e=n["dirs-only"]??!1,s=i?await m(o,i):"0",a=await c(o,s,i,0,r,e);return u(a)}});
@@ -0,0 +1 @@
1
+ import{ArgumentError as a}from"@jackwener/opencli/errors";import{cli as i,Strategy as o}from"@jackwener/opencli/registry";import{DRIVE_API as d,apiPost as p,findFolder as f}from"./utils.js";i({site:"quark",name:"mkdir",access:"write",description:"Create a folder in your Quark Drive",domain:"pan.quark.cn",strategy:o.COOKIE,defaultFormat:"json",args:[{name:"name",required:!0,positional:!0,help:"Folder name"},{name:"parent",help:"Parent folder path (resolved by name)"},{name:"parent-fid",help:"Parent folder fid (use directly)"}],func:async(t,e)=>{const r=e.name;if(!r.trim())throw new a("Folder name cannot be empty");if(e.parent&&e["parent-fid"])throw new a("Cannot use both --parent and --parent-fid");const n=e["parent-fid"]?e["parent-fid"]:e.parent?await f(t,e.parent):"0";return{status:"ok",fid:(await p(t,`${d}?pr=ucpro&fr=pc`,{pdir_fid:n,file_name:r,dir_path:"",dir_init_lock:!1})).fid,name:r}}});
@@ -0,0 +1 @@
1
+ import{ArgumentError as d,CommandExecutionError as m}from"@jackwener/opencli/errors";import{cli as u,Strategy as c}from"@jackwener/opencli/registry";import{DRIVE_API as p,apiPost as h,findFolder as w,pollTask as k}from"./utils.js";u({site:"quark",name:"mv",access:"write",description:"Move files to a folder in your Quark Drive",domain:"pan.quark.cn",strategy:c.COOKIE,defaultFormat:"json",args:[{name:"fids",required:!0,positional:!0,help:"File IDs to move (comma-separated)"},{name:"to",default:"",help:"Destination folder path (required unless --to-fid is set)"},{name:"to-fid",default:"",help:"Destination folder ID (overrides --to)"},{name:"timeout",type:"int",required:!1,default:120,help:"Max seconds for the overall command (default: 120)"}],func:async(r,a)=>{const o=a.to,i=a["to-fid"],l=a.fids,s=[...new Set(l.split(",").map((e)=>e.trim()).filter(Boolean))];if(s.length===0)throw new d("No fids provided");if(!o&&!i)throw new d("Either --to or --to-fid is required");if(o&&i)throw new d("Cannot use both --to and --to-fid");const f=i||await w(r,o),n=await h(r,`${p}/move?pr=ucpro&fr=pc`,{filelist:s,to_pdir_fid:f}),t={status:"pending",count:s.length,destination:o||i,task_id:n.task_id,completed:!1};if(n.task_id){const e=await k(r,n.task_id);t.completed=e;t.status=e?"ok":"error";if(!e)throw new m("quark: Move task timed out")}else{t.status="ok";t.completed=!0}return t}});
@@ -0,0 +1 @@
1
+ import{ArgumentError as t}from"@jackwener/opencli/errors";import{cli as i,Strategy as m}from"@jackwener/opencli/registry";import{DRIVE_API as o,apiPost as u}from"./utils.js";i({site:"quark",name:"rename",access:"write",description:"Rename a file in your Quark Drive",domain:"pan.quark.cn",strategy:m.COOKIE,defaultFormat:"json",args:[{name:"fid",required:!0,positional:!0,help:"File ID to rename"},{name:"name",required:!0,help:"New file name"}],func:async(n,r)=>{const{fid:a,name:e}=r;if(!e.trim())throw new t("New name cannot be empty");await u(n,`${o}/rename?pr=ucpro&fr=pc`,{fid:a,file_name:e});return{status:"ok",fid:a,new_name:e}}});
@@ -0,0 +1 @@
1
+ import{ArgumentError as s}from"@jackwener/opencli/errors";import{cli as a,Strategy as n}from"@jackwener/opencli/registry";import{DRIVE_API as d,apiPost as f}from"./utils.js";a({site:"quark",name:"rm",access:"write",description:"Delete files from your Quark Drive",domain:"pan.quark.cn",strategy:n.COOKIE,defaultFormat:"json",args:[{name:"fids",required:!0,positional:!0,help:"File IDs to delete (comma-separated)"}],func:async(t,r)=>{const i=r.fids,e=[...new Set(i.split(",").map((o)=>o.trim()).filter(Boolean))];if(e.length===0)throw new s("No fids provided");await f(t,`${d}/delete?pr=ucpro&fr=pc`,{filelist:e});return{status:"ok",count:e.length,deleted_fids:e}}});
@@ -0,0 +1 @@
1
+ import{ArgumentError as m,CommandExecutionError as w}from"@jackwener/opencli/errors";import{cli as k,Strategy as q}from"@jackwener/opencli/registry";import{SHARE_API as S,extractPwdId as I,apiPost as y,getToken as E,pollTask as A,findFolder as D}from"./utils.js";async function F(t,e,l,s,a,i){return(await y(t,`${S}/save?pr=ucpro&fr=pc`,{pwd_id:e,stoken:l,pdir_fid:"0",to_pdir_fid:a,fid_list:s,pdir_save_all:i,scene:"link"})).task_id}k({site:"quark",name:"save",access:"write",description:"Save shared files to your Quark Drive",domain:"pan.quark.cn",strategy:q.COOKIE,defaultFormat:"json",args:[{name:"url",required:!0,positional:!0,help:"Quark share URL or pwd_id"},{name:"to",default:"",help:"Destination folder path"},{name:"to-fid",default:"",help:"Destination folder ID (overrides --to)"},{name:"fids",default:"",help:"File IDs to save (comma-separated, from share-tree). Omit to save all."},{name:"stoken",default:"",help:"Share token (from share-tree output, required with --fids)"},{name:"passcode",default:"",help:"Share passcode (if required)"},{name:"timeout",type:"int",required:!1,default:120,help:"Max seconds for the overall command (default: 120)"}],func:async(t,e)=>{const{url:l,to:s}=e,a=e["to-fid"],i=e.fids,d=e.stoken,_=e.passcode;if(!s&&!a)throw new m("Either --to or --to-fid is required");if(s&&a)throw new m("Cannot use both --to and --to-fid");const p=I(l),f=!i;let u,n;if(f){u=d||await E(t,p,_);n=[]}else{if(!d)throw new m("--stoken is required when using --fids");u=d;n=[...new Set(i.split(",").map((r)=>r.trim()).filter(Boolean))]}const h=a||await D(t,s),c=await F(t,p,u,n,h,f),o={success:!1,task_id:c,saved_to:s||a,target_fid:h,...f?{}:{fids:n}};if(c){const r=await A(t,c,(v)=>{o.save_count=v.save_as?.save_as_sum_num});o.completed=r;o.success=r;if(!r)throw new w("quark: Save task timed out")}else o.success=!0;return o}});
@@ -0,0 +1 @@
1
+ import{cli as l,Strategy as p}from"@jackwener/opencli/registry";import{extractPwdId as m,formatDate as u,getShareList as h,getToken as _}from"./utils.js";async function f(a,r,s,o,i,t){if(i>t)return[];const d=await h(a,r,s,o,{sort:"file_type:asc,file_name:asc"}),n=[];for(const e of d){const c={fid:e.fid,name:e.file_name,size:e.size,is_dir:e.dir,created_at:u(e.created_at),updated_at:u(e.updated_at)};if(e.dir&&i<t)c.children=await f(a,r,s,e.fid,i+1,t);n.push(c)}return n}l({site:"quark",name:"share-tree",access:"read",description:"Get directory tree from Quark Drive share link as nested JSON",domain:"pan.quark.cn",strategy:p.COOKIE,defaultFormat:"json",args:[{name:"url",required:!0,positional:!0,help:"Quark share URL or pwd_id"},{name:"passcode",default:"",help:"Share passcode (if required)"},{name:"depth",type:"int",default:10,help:"Max directory depth"}],func:async(a,r)=>{const s=r.url,o=r.passcode||"",i=r.depth??10,t=m(s),d=await _(a,t,o),n=await f(a,t,d,"0",0,i);return{pwd_id:t,stoken:d,tree:n}}});
@@ -0,0 +1,13 @@
1
+ import{ArgumentError as m,AuthRequiredError as d,CommandExecutionError as l,getErrorMessage as y}from"@jackwener/opencli/errors";export const SHARE_API="https://drive-h.quark.cn/1/clouddrive/share/sharepage",DRIVE_API="https://drive-pc.quark.cn/1/clouddrive/file",TASK_API="https://drive-pc.quark.cn/1/clouddrive/task";const f="pan.quark.cn",p="Quark Drive requires a logged-in browser session";function h(t,e){if(e===401||e===403)return!0;return/not logged in|login required|please log in|authentication required|unauthorized|forbidden|未登录|请先登录|需要登录|登录/.test(t.toLowerCase())}function $(t){if(!t||typeof t!=="object"||!("status"in t))return;const e=t.status;return typeof e==="number"?e:void 0}function c(t,e){if(t.status===200)return t.data;if(h(t.message,t.status))throw new d(f,p);throw new l(`quark: ${e}: ${t.message}`)}export function extractPwdId(t){const e=t.match(/\/s\/([a-zA-Z0-9]+)/);if(e)return e[1];if(/^[a-zA-Z0-9]+$/.test(t))return t;throw new m(`Invalid Quark share URL: ${t}`)}export async function fetchJson(t,e,r){const n=r?.method||"GET",a=r?.body?JSON.stringify(r.body):void 0,i=`fetch(${JSON.stringify(e)}, {
2
+ method: ${JSON.stringify(n)},
3
+ headers: { 'Content-Type': 'application/json' },
4
+ credentials: 'include',
5
+ ${a?`body: ${JSON.stringify(a)},`:""}
6
+ }).then(async r => {
7
+ const ct = r.headers.get('content-type') || '';
8
+ if (!ct.includes('json')) {
9
+ const text = await r.text().catch(() => '');
10
+ throw Object.assign(new Error('Non-JSON response: ' + text.slice(0, 200)), { status: r.status });
11
+ }
12
+ return r.json();
13
+ })`;try{return await t.evaluate(i)}catch(o){if(h(y(o),$(o)))throw new d(f,p);throw o}}export async function apiGet(t,e){const r=await fetchJson(t,e);return c(r,"API error")}export async function apiPost(t,e,r){const n=await fetchJson(t,e,{method:"POST",body:r});return c(n,"API error")}export async function getToken(t,e,r=""){const n=await fetchJson(t,`${SHARE_API}/token?pr=ucpro&fr=pc`,{method:"POST",body:{pwd_id:e,passcode:r,support_visit_limit_private_share:!0}});return c(n,"Failed to get token").stoken}export async function getShareList(t,e,r,n="0",a){const i=[];let o=1,s=0;do{const g=a?.sort?`&_sort=${a.sort}`:"",w=`${SHARE_API}/detail?pr=ucpro&fr=pc&ver=2&pwd_id=${e}&stoken=${encodeURIComponent(r)}&pdir_fid=${n}&force=0&_page=${o}&_size=200&_fetch_total=1${g}`,u=await fetchJson(t,w),_=c(u,"Failed to get share list")?.list||[];i.push(..._);s=u.metadata?._total||0;o++}while(i.length<s);return i}export async function listMyDrive(t,e){const r=[];let n=1,a=0;do{const i=`${DRIVE_API}/sort?pr=ucpro&fr=pc&pdir_fid=${e}&_page=${n}&_size=200&_fetch_total=1&_sort=file_type:asc,file_name:asc`,o=await fetchJson(t,i),s=c(o,"Failed to list drive")?.list||[];r.push(...s);a=o.metadata?._total||0;n++}while(r.length<a);return r}export async function findFolder(t,e){const r=e.split("/").filter(Boolean);let n="0";for(const a of r){const o=(await listMyDrive(t,n)).find((s)=>s.dir&&s.file_name===a);if(o)n=o.fid;else throw new l(`quark: Folder "${a}" not found in "${e}"`)}return n}export function formatDate(t){if(!t)return"";return new Date(t).toISOString().replace("T"," ").slice(0,19)}export function formatSize(t){if(t<=0)return"0 B";const e=["B","KB","MB","GB","TB"],r=Math.floor(Math.log(t)/Math.log(1024));return`${(t/Math.pow(1024,r)).toFixed(2)} ${e[r]}`}export async function getTaskStatus(t,e){const r=`${TASK_API}?pr=ucpro&fr=pc&task_id=${e}&retry_index=0`;return apiGet(t,r)}export async function pollTask(t,e,r,n=30,a=500){for(let i=0;i<n;i++){await new Promise((s)=>setTimeout(s,a));const o=await getTaskStatus(t,e);if(o?.status===2){r?.(o);return!0}}return!1}
@@ -0,0 +1,22 @@
1
+ import{ArgumentError as Q,AuthRequiredError as M,CommandExecutionError as z}from"@jackwener/opencli/errors";import{cli as f,Strategy as h}from"@jackwener/opencli/registry";import{assertLiteralContent as B}from"../_shared/content-guard.js";import{tagEditorJs as P,readEditorTextJs as j,insertEditorText as N,clickSubmitJs as I}from"./shared.js";const T=20,S=15,b=["\\banswer\\b","add answer","回答","写回答","répondre","responder","antworten","回答する"],J=["\\bpost\\b","submit","发布","提交","publier","publicar","veröffentlichen","投稿"],O=["\\bpost\\b","done","save","continue","confirm","确定","完成","保存","继续"];function U(){return`(() => {
2
+ const path = location.pathname || '';
3
+ if (/\\blogin\\b/i.test(path + (location.search || ''))) return 'login';
4
+ const visible = (el) => !!el && (el.offsetParent !== null || el.getClientRects().length > 0);
5
+ // 编辑器已开着?
6
+ const scope = document.querySelector('[role="dialog"]') || document;
7
+ const editor = Array.from(scope.querySelectorAll('[contenteditable="true"]'))
8
+ .filter(visible)
9
+ .find((el) => (el.getBoundingClientRect().height || 0) >= 24);
10
+ if (editor) return 'editor';
11
+ // 否则找「Answer」入口按钮点开
12
+ const re = new RegExp(${JSON.stringify(b.join("|"))}, 'i');
13
+ const btn = Array.from(document.querySelectorAll('button, [role="button"], a'))
14
+ .filter(visible)
15
+ .find((el) => re.test((el.getAttribute('aria-label') || '') + ' ' + (el.textContent || '')));
16
+ if (btn) { btn.click(); return 'clicked'; }
17
+ return 'wait';
18
+ })()`}f({site:"quora",name:"create-answer",access:"write",description:"Publish an answer to a Quora question from your logged-in account. Pass the target question URL and the answer body (multi-line allowed). Write a genuine, substantive answer — Quora aggressively flags low-effort/automated content.",domain:"quora.com",strategy:h.UI,browser:!0,args:[{name:"questionUrl",type:"string",required:!0,positional:!0,help:"Target Quora question URL (https://www.quora.com/<question-slug>)"},{name:"content",type:"string",required:!0,positional:!0,help:"Answer body text (multi-line allowed)"}],columns:["status","questionUrl","message"],func:async(v,Z)=>{if(!v)throw new z("Browser session required for quora create-answer");const G=String(Z.questionUrl??"").trim();if(!G)throw new Q("Question URL is required.");let $;try{$=new URL(G)}catch{throw new Q(`Invalid question URL: ${G}`)}if(!/(^|\.)quora\.com$/.test($.hostname))throw new Q("URL must be a quora.com question URL.");const H=String(Z.content??"");B(H,{label:"回答正文"});if(!H.trim())throw new Q("Answer content cannot be empty.");await v.goto(G,{waitUntil:"none"});let D=!1;for(let K=0;K<T;K++){const X=await v.evaluate(U());if(X==="login")throw new M("www.quora.com","Quora 重定向到登录页——未登录");if(X==="editor"){D=!0;break}await v.wait(1)}if(!D)throw new z("未能打开回答编辑器——问题可能不可回答,或页面结构已变(需真机 recon 收紧锚点)。");if(await v.evaluate(P())!=="ready")throw new z("回答编辑器打标失败——未定位到可编辑正文区。");const F=await N(v,H);if(!F?.ok)throw new z(F?.message??"无法把正文写入 Quora 回答编辑器。");const W=await v.evaluate(I(J));if(!W?.ok)throw new z(W?.message??"未找到 Quora 回答提交按钮。");await v.wait(2);if((await v.evaluate(`(() => {
19
+ const dlg = document.querySelector('[role="dialog"]');
20
+ if (!dlg || (dlg.offsetParent === null && dlg.getClientRects().length === 0)) return { present: false };
21
+ return { present: true };
22
+ })()`))?.present){await v.evaluate(I(O));await v.wait(2)}const V=(K)=>String(K||"").replace(/\s+/g," ").trim(),Y=await v.evaluate(j());if(Y!=null&&V(Y).length>0&&V(Y)===V(H))throw new z("Quora 回答提交后正文仍在编辑器中——提交被拦(限流/风控/无权限,或 credential 弹窗未确认)。回查后再决定是否重试。");return[{status:"success",questionUrl:G,message:"Answer posted."}]}});
@@ -0,0 +1,24 @@
1
+ import{ArgumentError as G,AuthRequiredError as X,CommandExecutionError as F}from"@jackwener/opencli/errors";import{cli as D,Strategy as M}from"@jackwener/opencli/registry";import{assertLiteralContent as P}from"../_shared/content-guard.js";import{QUORA_ORIGIN as Q,insertEditorText as f,readEditorTextJs as h,clickSubmitJs as B}from"./shared.js";const J=20,N=["add question","ask question","\\bask\\b","提问","添加问题","poser une question","preguntar","frage stellen"],U=["add question","\\bnext\\b","submit","done","\\bpost\\b","提交","下一步","发布","完成","添加问题"];function j(){return`(() => {
2
+ if (/\\blogin\\b/i.test((location.pathname || '') + (location.search || ''))) return 'login';
3
+ const visible = (el) => !!el && (el.offsetParent !== null || el.getClientRects().length > 0);
4
+ const dlg = document.querySelector('[role="dialog"]');
5
+ if (dlg && visible(dlg)) {
6
+ // 弹窗已开:标题输入框可能是 contenteditable、textarea 或 text input。
7
+ const box = dlg.querySelector('[contenteditable="true"]')
8
+ || dlg.querySelector('textarea')
9
+ || dlg.querySelector('input[type="text"]');
10
+ if (box && visible(box)) {
11
+ box.setAttribute('data-pp-quora-editor', '1');
12
+ box.scrollIntoView({ block: 'center' });
13
+ box.focus();
14
+ return 'editor';
15
+ }
16
+ return 'wait';
17
+ }
18
+ const re = new RegExp(${JSON.stringify(N.join("|"))}, 'i');
19
+ const btn = Array.from(document.querySelectorAll('button, [role="button"], a'))
20
+ .filter(visible)
21
+ .find((el) => re.test((el.getAttribute('aria-label') || '') + ' ' + (el.textContent || '')));
22
+ if (btn) { btn.click(); return 'clicked'; }
23
+ return 'wait';
24
+ })()`}D({site:"quora",name:"create-question",access:"write",description:"Post a new question to Quora from your logged-in account. Pass the question title. Ask a clear, genuine question — Quora aggressively flags low-effort/automated content.",domain:"quora.com",strategy:M.UI,browser:!0,args:[{name:"title",type:"string",required:!0,positional:!0,help:"The question title (a clear, complete question)"}],columns:["status","title","message"],func:async(v,q)=>{if(!v)throw new F("Browser session required for quora create-question");const z=String(q.title??"").trim();if(!z)throw new G("Question title is required.");P(z,{label:"问题标题"});await v.goto(`${Q}/`,{waitUntil:"none"});let W=!1;for(let H=0;H<J;H++){const $=await v.evaluate(j());if($==="login")throw new X("www.quora.com","Quora 重定向到登录页——未登录");if($==="editor"){W=!0;break}await v.wait(1)}if(!W)throw new F("未能打开 Quora 提问弹窗——顶栏入口或弹窗结构已变(需真机 recon 收紧锚点)。");const Y=await f(v,z);if(!Y?.ok)throw new F(Y?.message??"无法把标题写入 Quora 提问框。");const Z=await v.evaluate(B(U));if(!Z?.ok)throw new F(Z?.message??"未找到 Quora 提问提交按钮。");await v.wait(2);const K=(H)=>String(H||"").replace(/\s+/g," ").trim(),V=await v.evaluate(h());if(V!=null&&K(V).length>0&&K(V)===K(z))throw new F("Quora 提问提交后标题仍在框中——提交被拦(限流/风控/需选主题或身份未确认)。回查后再决定是否重试。");return[{status:"success",title:z,message:"Question posted."}]}});
@@ -0,0 +1,43 @@
1
+ import{AuthRequiredError as P}from"@jackwener/opencli/errors";export const QUORA_ORIGIN="https://www.quora.com";export async function hasQuoraAuthCookie(f){return(await f.getCookies({url:QUORA_ORIGIN})).some((F)=>F.name==="m-b"&&F.value)}export async function verifyQuoraAuth(f){if(!await hasQuoraAuthCookie(f))throw new P("www.quora.com","Quora m-b cookie 缺失——当前是游客/未登录会话");await f.goto(QUORA_ORIGIN);await f.wait(2);const y=await f.evaluate("location.pathname + location.search");if(/\blogin\b/i.test(String(y||"")))throw new P("www.quora.com",`Quora 停在登录页 (${y})——已登出`);if(!await hasQuoraAuthCookie(f))throw new P("www.quora.com","Quora m-b cookie 在导航后消失——会话失效");return{logged_in:!0}}export const EDITOR_MARK='[data-pp-quora-editor="1"]';export function tagEditorJs(){return`(() => {
2
+ const visible = (el) => !!el && (el.offsetParent !== null || el.getClientRects().length > 0);
3
+ const scope = document.querySelector('[role="dialog"]') || document;
4
+ const cands = Array.from(scope.querySelectorAll('[contenteditable="true"]'))
5
+ .filter(visible)
6
+ // 排除极小的内联输入(如顶部搜索),正文编辑器有实际高度
7
+ .filter((el) => (el.getBoundingClientRect().height || 0) >= 24);
8
+ const box = cands[0];
9
+ if (!box) return 'wait';
10
+ box.setAttribute('data-pp-quora-editor', '1');
11
+ box.scrollIntoView({ block: 'center' });
12
+ return 'ready';
13
+ })()`}export function readEditorTextJs(){return`(() => {
14
+ const ed = document.querySelector('${EDITOR_MARK}');
15
+ return ed ? (ed.innerText || ed.textContent || '') : null;
16
+ })()`}export function execInsertJs(f){return`(() => {
17
+ try {
18
+ const ed = document.querySelector('${EDITOR_MARK}');
19
+ if (!ed) return { ok: false, message: '编辑器已消失,无法写入。' };
20
+ ed.focus();
21
+ const normalize = (s) => String(s || '').replace(/\\u00a0/g, ' ').replace(/\\s+/g, ' ').trim();
22
+ if (!document.execCommand('insertText', false, ${JSON.stringify(f)})) {
23
+ const dt = new DataTransfer();
24
+ dt.setData('text/plain', ${JSON.stringify(f)});
25
+ ed.dispatchEvent(new ClipboardEvent('paste', { clipboardData: dt, bubbles: true, cancelable: true }));
26
+ }
27
+ const actual = ed.innerText || ed.textContent || '';
28
+ if (normalize(actual).includes(normalize(${JSON.stringify(f)}))) return { ok: true };
29
+ return { ok: false, message: '写入后未在编辑器中校验到正文。', actualText: actual };
30
+ } catch (e) { return { ok: false, message: String(e) }; }
31
+ })()`}export async function insertEditorText(f,y){const F=(H)=>String(H||"").replace(/ /g," ").replace(/\s+/g," ").trim(),S=[f.nativeType?.bind(f),f.insertText?.bind(f)].filter(Boolean);for(const H of S)try{await H(y);const B=await f.evaluate(readEditorTextJs());if(B!=null&&F(B).includes(F(y)))return{ok:!0}}catch(B){const L=(B instanceof Error?B.message:String(B)).toLowerCase();if(!(L.includes("unknown action")||L.includes("not supported")||L.includes("no inserted flag")))throw B}return f.evaluate(execInsertJs(y))}export function clickSubmitJs(f){return`(() => {
32
+ const visible = (el) => !!el && (el.offsetParent !== null || el.getClientRects().length > 0);
33
+ const re = new RegExp(${JSON.stringify(f.join("|"))}, 'i');
34
+ const scope = document.querySelector('[role="dialog"]') || document;
35
+ const btns = Array.from(scope.querySelectorAll('button, [role="button"]')).filter(visible);
36
+ // 文案匹配至多兜底:优先取未禁用且文案命中的按钮
37
+ const enabled = (el) => !el.disabled && el.getAttribute('aria-disabled') !== 'true';
38
+ const hit = btns.find((el) => enabled(el)
39
+ && re.test((el.getAttribute('aria-label') || '') + ' ' + (el.textContent || '')));
40
+ if (!hit) return { ok: false, message: '未找到可用的提交按钮(可能未渲染/被禁用/文案不在兜底名单)。' };
41
+ hit.click();
42
+ return { ok: true };
43
+ })()`}
@@ -0,0 +1 @@
1
+ import{AuthRequiredError as B}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as D}from"../_shared/site-auth.js";import{hasQuoraAuthCookie as x,verifyQuoraAuth as z,QUORA_ORIGIN as F}from"./shared.js";D({site:"quora",domain:"quora.com",loginUrl:`${F}/`,whoamiDescription:"检测 Quora 当前登录状态(返回布尔 logged_in)。",loginDescription:"打开 Quora 登录页并等待浏览器会话完成登录。",columns:[],quickCheck:x,verify:z,poll:async(b)=>{if(!await x(b))throw new B("www.quora.com","等待 Quora 登录(m-b cookie 尚未就绪)");return z(b)}});
@@ -0,0 +1 @@
1
+ import{cli as Q,Strategy as j}from"@jackwener/opencli/registry";import{ArgumentError as $,CommandExecutionError as f,TimeoutError as L}from"@jackwener/opencli/errors";import{QIANWEN_DOMAIN as R,QIANWEN_URL as A,authRequired as D,bubbleHtmlToMarkdown as y,dismissLoginModal as G,ensureOnQianwen as z,getMessageBubbles as N,hasLoginGate as C,normalizeBooleanFlag as X,sendMessage as I,setFeatureToggle as H,startNewChat as T,waitForAnswer as M}from"./utils.js";Q({site:"qwen",name:"ask",access:"write",description:"Send a prompt to Qianwen and return the assistant reply",domain:R,strategy:j.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,defaultFormat:"plain",args:[{name:"prompt",required:!0,positional:!0,help:"Prompt to send to Qianwen"},{name:"timeout",type:"int",default:120,help:"Max seconds to wait for the response"},{name:"new",type:"boolean",default:!1,help:"Start a new chat before sending"},{name:"think",type:"boolean",default:!1,help:"Enable 深度思考 (DeepThink)"},{name:"research",type:"boolean",default:!1,help:"Enable 深度研究 (DeepResearch)"},{name:"markdown",type:"boolean",default:!1,help:"Emit assistant reply as markdown"}],columns:["Role","Text"],func:async(J,v)=>{const P=String(v.prompt||"").trim();if(!P)throw new $("prompt is required");const K=Number(v.timeout??120);if(!Number.isInteger(K)||K<=0)throw new $("timeout must be a positive integer");const U=X(v.new,!1),W=X(v.think,!1),_=X(v.research,!1),q=X(v.markdown,!1);await z(J);await G(J);if(U){await T(J);await G(J)}if(W)await H(J,"think",!0);if(_)await H(J,"research",!0);const x=await S(J),Z=await I(J,P);if(!Z?.ok){if(await C(J))throw D();throw new f(Z?.reason||"Failed to send Qianwen prompt")}const Y=await M(J,P,K,x);if(Y.status==="auth_required")throw D();if(Y.status==="timeout")throw new L("qianwen ask",K,"No Qianwen reply observed before timeout. Retry with --timeout increased.");const V=Y.assistant;if(!V)throw new f("No assistant reply found in Qianwen chat.");const O=q&&V.html?y(V.html)||V.text:V.text;return[{Role:"User",Text:P},{Role:"Assistant",Text:O}]}});async function S(J){const v=await N(J),P=v.length?v[v.length-1].id:"";let K="";for(let U=v.length-1;U>=0;U-=1)if(v[U].role==="Assistant"){K=v[U].id;break}return{lastBubbleId:P,lastAssistantId:K}}export const __test__={getBaselineChatAnchor:S};
@@ -0,0 +1,17 @@
1
+ import{AuthRequiredError as D,CommandExecutionError as F}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as L}from"../_shared/site-auth.js";async function G(z){return(await z.getCookies({url:"https://chat.qwen.ai"})).some((B)=>B.name==="token"&&B.value)}async function H(z){const B=(await z.getCookies({url:"https://chat.qwen.ai"})).find((K)=>K.name==="token")?.value||"";if(!B)throw new D("qwen.ai","Qwen token cookie missing");await z.goto("https://chat.qwen.ai/");await z.wait(2);const b=await z.evaluate(`(async () => {
2
+ try {
3
+ const token = ${JSON.stringify(B)};
4
+ const res = await fetch('/api/v1/auths/', { credentials: 'include', headers: { 'Authorization': 'Bearer ' + token, 'Accept': 'application/json' } });
5
+ if (res.status === 401 || res.status === 403) {
6
+ return { kind: 'auth', detail: 'Qwen /api/v1/auths/ HTTP ' + res.status };
7
+ }
8
+ if (!res.ok) return { kind: 'http', httpStatus: res.status };
9
+ const d = await res.json();
10
+ if (!d || !d.id) {
11
+ return { kind: 'auth', detail: 'Qwen /api/v1/auths/ returned no user id' };
12
+ }
13
+ return { ok: true, user_id: String(d.id), name: String(d.name || '') };
14
+ } catch (e) {
15
+ return { kind: 'exception', detail: String(e && e.message || e) };
16
+ }
17
+ })()`);if(b?.kind==="auth")throw new D("qwen.ai",b.detail);if(b?.kind==="http")throw new F(`HTTP ${b.httpStatus} from /api/v1/auths/`);if(b?.kind==="exception")throw new F(`Qwen whoami failed: ${b.detail}`);if(!b?.ok)throw new F(`Unexpected Qwen probe: ${JSON.stringify(b)}`);return{user_id:b.user_id,name:b.name}}L({site:"qwen",domain:"qwen.ai",loginUrl:"https://chat.qwen.ai/auth?action=login",columns:["user_id","name"],quickCheck:G,verify:H,poll:async(z)=>{if(!await G(z))throw new D("qwen.ai","Waiting for Qwen token cookie");return H(z)}});
@@ -0,0 +1 @@
1
+ import{cli as Z,Strategy as $}from"@jackwener/opencli/registry";import{EmptyResultError as f}from"@jackwener/opencli/errors";import{QIANWEN_DOMAIN as z,bubbleHtmlToMarkdown as C,dismissLoginModal as F,getMessageBubbles as H,normalizeBooleanFlag as V,parseQianwenSessionId as W}from"./utils.js";Z({site:"qwen",name:"detail",access:"read",description:"Open a Qianwen conversation by ID and read its messages",domain:z,strategy:$.COOKIE,browser:!0,navigateBefore:!1,siteSession:"persistent",args:[{name:"id",positional:!0,required:!0,help:"Session ID (32-char hex) or full https://www.qianwen.com/chat/<id> URL"},{name:"markdown",type:"boolean",default:!1,help:"Emit assistant replies as markdown"}],columns:["Role","Text"],func:async(v,G)=>{const J=W(G.id),K=V(G.markdown,!1);await v.goto(`https://www.qianwen.com/chat/${J}`);await v.wait(2);await F(v);let x=[];const U=20000,X=1,Y=Date.now();while(Date.now()-Y<U){x=await H(v);if(x.length>0)break;await v.wait(X)}if(!x.length)throw new f("qwen detail",`No visible messages found for conversation ${J}. Verify the ID is correct and that the session belongs to the current device's b-user-id (or that you are logged in for cross-device sync).`);return x.map((q)=>({Role:q.role,Text:K&&q.role==="Assistant"&&q.html?C(q.html)||q.text:q.text}))}});
@@ -0,0 +1 @@
1
+ import{cli as a,Strategy as u}from"@jackwener/opencli/registry";import{ArgumentError as s,CommandExecutionError as m,EmptyResultError as l}from"@jackwener/opencli/errors";import{QIANWEN_DOMAIN as w,authRequired as d,dismissLoginModal as c,ensureOnQianwen as f,getSessionListFromApi as g}from"./utils.js";function h(r){if(!r)return"";const i=new Date(r);if(Number.isNaN(i.getTime()))return"";const t=(e)=>String(e).padStart(2,"0");return`${i.getFullYear()}-${t(i.getMonth()+1)}-${t(i.getDate())} ${t(i.getHours())}:${t(i.getMinutes())}`}a({site:"qwen",name:"history",access:"read",description:"List recent Qianwen conversations (requires login)",domain:w,strategy:u.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"limit",type:"int",default:20,help:"Max conversations to show (default 20, max 100)"}],columns:["Index","Title","Updated","Url"],func:async(r,i)=>{const t=Number(i.limit??20);if(!Number.isInteger(t)||t<=0)throw new s("limit must be a positive integer");if(t>100)throw new s("limit must be <= 100");await f(r);await c(r);await r.wait(1);const e=await g(r,t);if(!e.ok){if(e.status===401||e.status===403)throw d();if(!e.sessions.length)throw new m(`Qianwen history API failed (status=${e.status}) ${e.error||""}`.trim())}if(!e.sessions.length)throw new l("qwen history","No Qianwen conversations found.");return e.sessions.slice(0,t).map((n,o)=>({Index:o+1,Title:n.title||"(untitled)",Updated:h(n.updated_at),Url:`https://www.qianwen.com/chat/${n.id}`}))}});
@@ -0,0 +1,31 @@
1
+ import*as S from"node:os";import*as F from"node:path";import{cli as P,Strategy as U}from"@jackwener/opencli/registry";import{saveBase64ToFile as b}from"@jackwener/opencli/utils";import{ArgumentError as j,CommandExecutionError as B,EmptyResultError as E,TimeoutError as f}from"@jackwener/opencli/errors";import{QIANWEN_DOMAIN as A,authRequired as L,dismissLoginModal as N,ensureOnQianwen as I,getMessageBubbles as k,hasLoginGate as T,normalizeBooleanFlag as x,sendMessage as h,setFeatureToggle as c,startNewChat as w}from"./utils.js";function d(H){const J=S.homedir();return H.startsWith(J)?`~${H.slice(J.length)}`:H}function m(H){if(!H)return".jpg";if(H.includes("png"))return".png";if(H.includes("webp"))return".webp";if(H.includes("gif"))return".gif";return".jpg"}async function y(H,J){return await H.evaluate(`(() => {
2
+ const scope = ${JSON.stringify(J||"")};
3
+ const bubbles = Array.from(document.querySelectorAll('[data-msgid$="-answer"]'));
4
+ const target = scope
5
+ ? bubbles.find((b) => b.getAttribute('data-msgid') === scope)
6
+ : bubbles[bubbles.length - 1];
7
+ if (!target) return [];
8
+ const imgs = Array.from(target.querySelectorAll('img'))
9
+ .map((node) => node.getAttribute('src') || '')
10
+ .filter((src) => src
11
+ && !src.startsWith('data:')
12
+ && !/\\.(svg)$/i.test(src)
13
+ && !src.includes('alicdn.com/imgextra'));
14
+ return Array.from(new Set(imgs));
15
+ })()`)}async function n(H,J,v){const _=Date.now();let X=[];while(Date.now()-_<v*1000){await H.wait(2);if(await T(H))return{status:"auth_required",urls:[]};const V=await y(H,J);if(V.length&&V.length===X.length&&V.every((K,$)=>K===X[$]))return{status:"ok",urls:V};if(V.length){await H.wait(2);const K=await y(H,J);if(K.length===V.length&&K.every(($,W)=>$===V[W]))return{status:"ok",urls:K};X=K;continue}X=V}return X.length?{status:"partial",urls:X}:{status:"timeout",urls:[]}}async function u(H,J){return await H.evaluate(`(async () => {
16
+ try {
17
+ const res = await fetch(${JSON.stringify(J)}, { credentials: 'include' });
18
+ if (!res.ok) return { ok: false, status: res.status };
19
+ const mime = res.headers.get('content-type') || '';
20
+ const buf = await res.arrayBuffer();
21
+ const bytes = new Uint8Array(buf);
22
+ let binary = '';
23
+ const chunk = 0x8000;
24
+ for (let i = 0; i < bytes.length; i += chunk) {
25
+ binary += String.fromCharCode.apply(null, bytes.subarray(i, i + chunk));
26
+ }
27
+ return { ok: true, mime, base64: btoa(binary) };
28
+ } catch (error) {
29
+ return { ok: false, status: 0, error: String(error?.message || error) };
30
+ }
31
+ })()`)}P({site:"qwen",name:"image",access:"write",description:"Generate images with Qianwen (AI生图) and save them locally",domain:A,strategy:U.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,defaultFormat:"plain",args:[{name:"prompt",required:!0,positional:!0,help:"Image prompt to send"},{name:"op",default:"~/Pictures/qianwen",help:"Output directory"},{name:"new",type:"boolean",default:!0,help:"Start a new chat before generating (default: true)"},{name:"sd",type:"boolean",default:!1,help:"Skip download; only show the Qianwen link"},{name:"timeout",type:"int",default:180,help:"Max seconds to wait for the image response"}],columns:["Status","File","Link"],func:async(H,J)=>{const v=String(J.prompt||"").trim();if(!v)throw new j("prompt is required");const _=String(J.op||"~/Pictures/qianwen").replace(/^~\//,`${S.homedir()}/`),X=x(J.new,!0),V=x(J.sd,!1),K=Number(J.timeout??180);if(!Number.isInteger(K)||K<=0)throw new j("timeout must be a positive integer");await I(H);await N(H);if(X){await w(H);await N(H)}await c(H,"image",!0);await H.wait(0.5);const $=await h(H,v);if(!$?.ok){if(await T(H))throw L();throw new B($?.reason||"Failed to send Qianwen image prompt")}let W="";for(let Y=0;Y<5;Y+=1){await H.wait(1);const Z=[...await k(H)].reverse().find((Q)=>Q.role==="Assistant");if(Z){W=Z.id;break}}const q=await n(H,W,K),C=await H.evaluate("window.location.href").catch(()=>"https://www.qianwen.com/");if(q.status==="auth_required")throw L();if(q.status==="timeout")throw new f("qianwen image",K,"No generated images observed before timeout.");const z=q.urls;if(V)return[{Status:"\uD83C\uDFA8 generated",File:null,Link:C}];const M=Date.now(),O=[];for(let Y=0;Y<z.length;Y+=1){const D=z[Y],Z=await u(H,D);if(!Z?.ok)throw new B(`Failed to fetch generated Qianwen image ${Y+1}: status=${Z?.status||"?"}`);const Q=z.length>1?`_${Y+1}`:"",R=m(Z.mime),G=F.join(_,`qianwen_${M}${Q}${R}`);await b(Z.base64,G);O.push({Status:"✅ saved",File:d(G),Link:C})}if(!O.length)throw new E("qwen image","No generated images were available to download.");return O}});
@@ -0,0 +1 @@
1
+ import{cli as a,Strategy as e}from"@jackwener/opencli/registry";import{QIANWEN_DOMAIN as i,QIANWEN_URL as s,startNewChat as r,dismissLoginModal as n}from"./utils.js";a({site:"qwen",name:"new",access:"write",description:"Start a new conversation in Qianwen",domain:i,strategy:e.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status"],func:async(t)=>{await t.goto(s);await t.wait(2);await n(t);await r(t);return[{Status:"New chat started"}]}});
@@ -0,0 +1 @@
1
+ import{cli as o,Strategy as r}from"@jackwener/opencli/registry";import{QIANWEN_DOMAIN as i,bubbleHtmlToMarkdown as l,dismissLoginModal as m,ensureOnQianwen as w,getMessageBubbles as c,normalizeBooleanFlag as d}from"./utils.js";o({site:"qwen",name:"read",access:"read",description:"Read messages in the current Qianwen conversation",domain:i,strategy:r.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"markdown",type:"boolean",default:!1,help:"Emit assistant replies as markdown"}],columns:["Role","Text"],func:async(t,s)=>{const n=d(s.markdown,!1);await w(t);await m(t);await t.wait(2);const a=await c(t);if(!a.length)return[{Role:"system",Text:"No visible messages in the current conversation."}];return a.map((e)=>({Role:e.role,Text:n&&e.role==="Assistant"&&e.html?l(e.html)||e.text:e.text}))}});
@@ -0,0 +1 @@
1
+ import{cli as f,Strategy as h}from"@jackwener/opencli/registry";import{ArgumentError as p,CommandExecutionError as u}from"@jackwener/opencli/errors";import{QIANWEN_DOMAIN as w,authRequired as d,dismissLoginModal as o,ensureOnQianwen as c,hasLoginGate as b,normalizeBooleanFlag as n,sendMessage as y,setFeatureToggle as i,startNewChat as E}from"./utils.js";f({site:"qwen",name:"send",access:"write",description:"Fire-and-forget: send a prompt to Qianwen without waiting for the reply",domain:w,strategy:h.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"prompt",required:!0,positional:!0,help:"Prompt to send to Qianwen"},{name:"new",type:"boolean",default:!1,help:"Start a new chat before sending"},{name:"think",type:"boolean",default:!1,help:"Enable 深度思考 (DeepThink)"},{name:"research",type:"boolean",default:!1,help:"Enable 深度研究 (DeepResearch)"}],columns:["Status","Prompt"],func:async(e,t)=>{const a=String(t.prompt||"").trim();if(!a)throw new p("prompt is required");const s=n(t.new,!1),l=n(t.think,!1),m=n(t.research,!1);await c(e);await o(e);if(s){await E(e);await o(e)}if(l)await i(e,"think",!0);if(m)await i(e,"research",!0);const r=await y(e,a);if(!r?.ok){if(await b(e))throw d();throw new u(r?.reason||"Failed to send Qianwen prompt")}return[{Status:"sent",Prompt:a}]}});
@@ -0,0 +1 @@
1
+ import{cli as z,Strategy as B}from"@jackwener/opencli/registry";import{QIANWEN_DOMAIN as F,ensureOnQianwen as G,isLoggedIn as H,getCurrentSessionId as J,getModelLabel as K}from"./utils.js";z({site:"qwen",name:"status",access:"read",description:"Check Qianwen page availability, login state, current session and model",domain:F,strategy:B.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status","Login","Model","SessionId","Url"],func:async(f)=>{await G(f);await f.wait(2);const[x,h,q,v]=await Promise.all([H(f),J(f),K(f),f.evaluate("window.location.href").catch(()=>"")]);return[{Status:"Connected",Login:x?"Yes":"No (guest mode)",Model:q?q:null,SessionId:h?h:null,Url:typeof v==="string"?v:""}]}});