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,25 @@
1
+ import{cli as n,Strategy as t}from"@jackwener/opencli/registry";export const readCommand=n({site:"chatwise",name:"read",access:"read",description:"Read the current ChatWise conversation history",domain:"localhost",strategy:t.UI,browser:!0,args:[],columns:["Content"],func:async(e)=>{return[{Content:await e.evaluate(`
2
+ (function() {
3
+ // Try common chat message selectors
4
+ const selectors = [
5
+ '[data-message-id]',
6
+ '[class*="message"]',
7
+ '[class*="chat-item"]',
8
+ '[class*="bubble"]',
9
+ '[role="log"] > *',
10
+ ];
11
+
12
+ for (const sel of selectors) {
13
+ const nodes = document.querySelectorAll(sel);
14
+ if (nodes.length > 0) {
15
+ return Array.from(nodes).map(n => (n.innerText || n.textContent).trim()).filter(Boolean).join('\\n\\n---\\n\\n');
16
+ }
17
+ }
18
+
19
+ // Fallback: main content area
20
+ const main = document.querySelector('main, [role="main"], [class*="chat-container"], [class*="conversation"]');
21
+ if (main) return main.innerText || main.textContent;
22
+
23
+ return document.body.innerText;
24
+ })()
25
+ `)}]}});
@@ -0,0 +1 @@
1
+ import{makeScreenshotCommand as e}from"../_shared/desktop-commands.js";export const screenshotCommand=e("chatwise","ChatWise");
@@ -0,0 +1 @@
1
+ import{cli as a,Strategy as r}from"@jackwener/opencli/registry";import{selectorError as i}from"@jackwener/opencli/errors";import{buildChatwiseInjectTextJs as n}from"./utils.js";export const sendCommand=a({site:"chatwise",name:"send",access:"write",description:"Send a message to the active ChatWise conversation",domain:"localhost",strategy:r.UI,browser:!0,args:[{name:"text",required:!0,positional:!0,help:"Message to send"}],columns:["Status","InjectedText"],func:async(t,s)=>{const e=s.text;if(!await t.evaluate(n(e)))throw i("ChatWise input element");await t.wait(0.5);await t.pressKey("Enter");return[{Status:"Success",InjectedText:e}]}});
@@ -0,0 +1 @@
1
+ import{makeStatusCommand as t}from"../_shared/desktop-commands.js";export const statusCommand=t("chatwise","ChatWise Desktop");
@@ -0,0 +1,75 @@
1
+ import{ArgumentError as c}from"@jackwener/opencli/errors";export const MESSAGE_WRAPPER_SELECTOR='[class*="group/message"]',MIN_COMPOSER_SCORE=120;export function requirePositiveTimeout(e){const r=e;if(!Number.isInteger(r)||r<=0)throw new c("--timeout must be a positive integer (seconds)");return r}export function scoreChatwiseComposerCandidate(e,r=0){if(e.hidden)return-1000;let t=0;if(String(e.role||"").toLowerCase()==="textbox")t+=10;const n=`${e.classes||""} ${e.editorClasses||""} ${e.ariaLabel||""}`.toLowerCase();if(n.includes("cm-content"))t+=20;if(n.includes("cm-editor"))t+=30;if(n.includes("simple-editor"))t-=140;const o=`${e.placeholder||""} ${e.ariaLabel||""} ${e.text||""}`.toLowerCase();if(o.includes("enter a message here"))t+=220;if(o.includes("press ⏎ to send"))t+=80;if(o.includes("press enter to send"))t+=80;if(o.includes("message"))t+=20;if(o.includes("optional description"))t-=140;if(o.includes("user context document"))t-=220;if(r>0&&e.rect){const i=e.rect.y+e.rect.h,l=Math.abs(r-i);t+=Math.max(0,80-l/8)}return t}export function selectBestChatwiseComposer(e,r=0,t=MIN_COMPOSER_SCORE){if(!Array.isArray(e)||e.length===0)return null;const s=[...e].sort((n,o)=>{const i=scoreChatwiseComposerCandidate(o,r)-scoreChatwiseComposerCandidate(n,r);return i!==0?i:n.index-o.index})[0]??null;if(!s||scoreChatwiseComposerCandidate(s,r)<t)return null;return s}export function buildChatwiseInjectTextJs(e){const r=scoreChatwiseComposerCandidate.toString(),t=selectBestChatwiseComposer.toString(),s=JSON.stringify(String(e??""));return`
2
+ (function(text) {
3
+ const scoreChatwiseComposerCandidate = ${r};
4
+ const selectBestChatwiseComposer = ${t};
5
+ const MIN_COMPOSER_SCORE = ${MIN_COMPOSER_SCORE};
6
+
7
+ const composers = Array.from(document.querySelectorAll([
8
+ 'textarea[aria-label*="message" i]',
9
+ 'textarea[placeholder*="message" i]',
10
+ '[contenteditable="true"][role="textbox"]',
11
+ '[contenteditable="true"]'
12
+ ].join(',')));
13
+ const candidates = composers.map((el, index) => {
14
+ const rect = el.getBoundingClientRect();
15
+ const editor = el.closest('.cm-editor');
16
+ const placeholderEl = editor?.querySelector('.cm-placeholder');
17
+ return {
18
+ index,
19
+ hidden: !(el.offsetWidth || el.offsetHeight || el.getClientRects().length),
20
+ role: el.getAttribute('role'),
21
+ classes: el.className || '',
22
+ editorClasses: editor?.className || '',
23
+ ariaLabel: el.getAttribute('aria-label') || '',
24
+ placeholder: placeholderEl?.getAttribute('aria-label') || placeholderEl?.textContent || el.getAttribute('placeholder') || '',
25
+ text: (el.textContent || '').trim(),
26
+ rect: { y: rect.y, h: rect.height },
27
+ };
28
+ });
29
+
30
+ const best = selectBestChatwiseComposer(candidates, window.innerHeight, MIN_COMPOSER_SCORE);
31
+ if (!best) return false;
32
+
33
+ const composer = composers[best.index];
34
+ composer.focus();
35
+
36
+ if (composer.tagName === 'TEXTAREA') {
37
+ const setter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, 'value')?.set;
38
+ if (setter) setter.call(composer, text);
39
+ else composer.value = text;
40
+ composer.dispatchEvent(new Event('input', { bubbles: true }));
41
+ return true;
42
+ }
43
+
44
+ const selection = window.getSelection();
45
+ const range = document.createRange();
46
+ range.selectNodeContents(composer);
47
+ selection?.removeAllRanges();
48
+ selection?.addRange(range);
49
+
50
+ const inserted = document.execCommand?.('insertText', false, text);
51
+ if (!inserted) {
52
+ composer.textContent = text;
53
+ }
54
+ composer.dispatchEvent(new Event('input', { bubbles: true }));
55
+ return true;
56
+ })(${s})
57
+ `}export function buildChatwiseMessageCountJs(){return`
58
+ (function() {
59
+ return Array.from(document.querySelectorAll(${JSON.stringify(MESSAGE_WRAPPER_SELECTOR)}))
60
+ .map(node => (node.innerText || node.textContent || '').trim())
61
+ .filter(Boolean)
62
+ .length;
63
+ })()
64
+ `}export function buildChatwiseResponseAfterJs(e,r){return`
65
+ (function(previousCount, userText) {
66
+ const messages = Array.from(document.querySelectorAll(${JSON.stringify(MESSAGE_WRAPPER_SELECTOR)}))
67
+ .map(node => (node.innerText || node.textContent || '').trim())
68
+ .filter(Boolean);
69
+ if (messages.length <= previousCount) return null;
70
+ const fresh = messages.slice(previousCount)
71
+ .filter(text => text && text !== userText);
72
+ if (fresh.length === 0) return null;
73
+ return fresh[fresh.length - 1];
74
+ })(${Number(e)||0}, ${JSON.stringify(String(r??""))})
75
+ `}
@@ -0,0 +1 @@
1
+ import{cli as n,Strategy as m}from"@jackwener/opencli/registry";import{CommandExecutionError as t}from"@jackwener/opencli/errors";import{parseGameUrl as l}from"./utils.js";n({site:"chess",name:"analyze",access:"read",description:"Open a Chess.com game in the browser analysis board",domain:"www.chess.com",strategy:m.UI,browser:!0,navigateBefore:!1,args:[{name:"game-url",type:"string",required:!0,positional:!0,help:"Full game URL, e.g. https://www.chess.com/game/live/168842570216"}],columns:["kind","game_id","analysis_url"],func:async(e,i)=>{if(!e)throw new t("Browser session required for chess analyze");const{kind:s,id:a}=l(i["game-url"]),r=`https://www.chess.com/analysis/game/${s}/${a}`;try{await e.goto(r);await e.wait(2)}catch(o){throw new t(`Failed to open Chess.com analysis board: ${o?.message||o}`)}return[{kind:s,game_id:a,analysis_url:r}]}});
@@ -0,0 +1 @@
1
+ import{cli as k,Strategy as C}from"@jackwener/opencli/registry";import{CommandExecutionError as n,EmptyResultError as _}from"@jackwener/opencli/errors";import{UA as $,formatDate as E,isPlainObject as h,parseGameUrl as b}from"./utils.js";const O="https://www.chess.com/callback";function r(t){return typeof t==="string"?t:""}function d(t){return typeof t==="string"||typeof t==="number"||typeof t==="boolean"?t:""}export function summarizeGame({kind:t,id:l,payload:a}){if(!h(a)||!h(a.game))throw new n("Chess.com callback returned no game payload");const e=a.game;if(e.pgnHeaders!==void 0&&!h(e.pgnHeaders))throw new n("Chess.com callback returned malformed PGN headers");if(a.players!==void 0&&!h(a.players))throw new n("Chess.com callback returned malformed player metadata");const o=a.players||{},i={};for(const y of["top","bottom"]){const m=o[y];if(m!==void 0&&!h(m))throw new n("Chess.com callback returned malformed player metadata");if(m?.color)i[m.color]=m}const c=i.white||{},u=i.black||{},s=e.pgnHeaders||{},w=r(c.username)||r(s.White),g=r(u.username)||r(s.Black),p=r(s.Result);if(!w||!g||!p)throw new n("Chess.com callback payload is missing stable game summary fields");const f=r(s.Date);return{kind:t,game_id:l,date:f?f.replace(/\./g,"-"):E(e.endTime),white:w,white_rating:d(c.rating)||d(s.WhiteElo),black:g,black_rating:d(u.rating)||d(s.BlackElo),result:p,winner_color:r(e.colorOfWinner),termination:r(s.Termination)||r(e.resultMessage),eco:r(s.ECO),time_control:r(s.TimeControl)||(typeof e.daysPerTurn==="number"?`${e.daysPerTurn}d/turn`:""),rated:e.isRated===!0,ply_count:e.plyCount??"",url:`https://www.chess.com/game/${t}/${l}`}}k({site:"chess",name:"game",access:"read",description:"Chess.com single-game detail (white, black, result, ECO, time control) by full game URL",domain:"www.chess.com",strategy:C.PUBLIC,browser:!1,args:[{name:"game-url",type:"string",required:!0,positional:!0,help:"Full game URL, e.g. https://www.chess.com/game/live/168842570216"}],columns:["kind","game_id","date","white","white_rating","black","black_rating","result","winner_color","termination","eco","time_control","rated","ply_count","url"],func:async(t)=>{const{kind:l,id:a}=b(t["game-url"]),e=`${O}/${l}/game/${a}`;let o;try{o=await fetch(e,{headers:{"User-Agent":$,accept:"application/json"}})}catch(c){throw new n(`Failed to fetch Chess.com callback ${e}: ${c?.message||c}`)}if(!o||typeof o!=="object")throw new n(`Chess.com callback returned an invalid response object for ${e}`);if(o.status===404)throw new _(`Chess.com has no ${l} game with id ${a}`);if(!o.ok)throw new n(`Chess.com callback returned HTTP ${o.status} for ${e}`);let i;try{i=await o.json()}catch(c){throw new n(`Chess.com callback returned malformed JSON for ${e}: ${c?.message||c}`)}return[summarizeGame({kind:l,id:a,payload:i})]}});export const __test__={parseGameUrl:b,summarizeGame};
@@ -0,0 +1 @@
1
+ import{cli as y,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentError as d,CommandExecutionError as i,EmptyResultError as h}from"@jackwener/opencli/errors";import{chessApi as l,validateUsername as _,mapGameRow as v}from"./utils.js";const o=100,p=6;function f(s){if(s===void 0||s===null||s==="")return 10;const e=Number(s);if(!Number.isInteger(e)||e<1||e>o)throw new d(`--limit must be an integer between 1 and ${o}`);return e}y({site:"chess",name:"games",access:"read",description:"Chess.com recent games for a player, newest first",domain:"api.chess.com",strategy:w.PUBLIC,browser:!1,args:[{name:"username",type:"string",required:!0,positional:!0,help:"Chess.com username"},{name:"limit",type:"int",default:10,help:`Number of recent games (1-${o})`}],columns:["date","time_class","rated","my_color","my_rating","my_result","opponent","opponent_rating","accuracy_white","accuracy_black","eco","opening_name","url"],func:async(s)=>{const e=_(s.username),n=f(s.limit),c=await l(`/player/${encodeURIComponent(e)}/games/archives`);if(!Array.isArray(c.archives))throw new i("Chess.com archives payload is missing archives array");const t=c.archives.slice().reverse();if(t.length===0)throw new h(`Chess.com has no game archives for ${e}`);const a=[];for(let r=0;r<t.length&&r<p&&a.length<n;r++){if(typeof t[r]!=="string"||!t[r].startsWith("https://api.chess.com/pub/player/"))throw new i("Chess.com archives payload contains an unexpected archive URL");const m=await l(t[r]);if(!Array.isArray(m.games))throw new i("Chess.com monthly archive payload is missing games array");const g=m.games.slice().reverse();for(const u of g){a.push(v(u,e));if(a.length>=n)break}}if(a.length===0)throw new h(`Chess.com has games archives for ${e} but no games in the most recent ${p} months`);return a.slice(0,n)}});export const __test__={parseLimit:f};
@@ -0,0 +1 @@
1
+ import{cli as i,Strategy as n}from"@jackwener/opencli/registry";import{EmptyResultError as o}from"@jackwener/opencli/errors";import{chessApi as c,validateUsername as m,summarizeStats as l}from"./utils.js";const d=["chess_rapid","chess_blitz","chess_bullet","chess_daily","chess960_daily","chess_daily_960"];i({site:"chess",name:"stats",access:"read",description:"Chess.com player ratings + win/loss record across game kinds",domain:"api.chess.com",strategy:n.PUBLIC,browser:!1,args:[{name:"username",type:"string",required:!0,positional:!0,help:"Chess.com username (case-insensitive)"}],columns:["kind","rating_current","rating_best","wins","losses","draws"],func:async(t)=>{const s=m(t.username),a=await c(`/player/${encodeURIComponent(s)}/stats`),e=d.map((r)=>l(a,r)).filter(Boolean);if(e.length===0)throw new o(`Chess.com returned no stats for ${s}`);return e}});
@@ -0,0 +1 @@
1
+ import{ArgumentError as X,CommandExecutionError as K,EmptyResultError as B}from"@jackwener/opencli/errors";export const API_BASE="https://api.chess.com/pub",UA="Mozilla/5.0 (compatible; opencli/1.0)";const D=/^[a-zA-Z0-9_-]{3,25}$/,G=/^https:\/\/www\.chess\.com\/game\/(live|daily)\/(\d+)/i;export function isPlainObject(q){return q!==null&&typeof q==="object"&&!Array.isArray(q)}function Y(q){return q===void 0||q===null||isPlainObject(q)}export function validateUsername(q){const H=String(q??"").trim().toLowerCase();if(!H)throw new X("<username> is required");if(!D.test(H))throw new X(`Invalid Chess.com username "${q}"`,"Usernames are 3-25 chars: a-z, 0-9, hyphen, underscore.");return H}export function parseGameUrl(q){const H=String(q??"").trim();if(!H)throw new X("<game-url> is required");const F=H.match(G);if(!F)throw new X(`Invalid Chess.com game URL: "${q}"`,"Expected https://www.chess.com/game/live/<id> or https://www.chess.com/game/daily/<id>.");return{kind:F[1].toLowerCase(),id:F[2]}}export async function chessApi(q,H=fetch){const F=q.startsWith("http")?q:`${API_BASE}${q}`;let J;try{J=await H(F,{headers:{"User-Agent":UA,accept:"application/json"}})}catch(Q){throw new K(`Failed to fetch Chess.com API ${F}: ${Q?.message||Q}`)}if(!J||typeof J!=="object")throw new K(`Chess.com API returned an invalid response object for ${F}`);if(J.status===404)throw new B(`Chess.com returned 404 for ${F}`);if(!J.ok)throw new K(`Chess.com API returned HTTP ${J.status} for ${F}`);let V;try{V=await J.json()}catch(Q){throw new K(`Chess.com API returned malformed JSON for ${F}: ${Q?.message||Q}`)}if(!isPlainObject(V))throw new K(`Chess.com API returned an unexpected payload shape for ${F}`);return V}export function summarizeStats(q,H){const F=q?.[H];if(!F)return null;if(!isPlainObject(F))throw new K(`Chess.com stats payload for ${H} is not an object`);if(!Y(F.last))throw new K(`Chess.com stats payload for ${H}.last is not an object`);if(!Y(F.best))throw new K(`Chess.com stats payload for ${H}.best is not an object`);if(!Y(F.record))throw new K(`Chess.com stats payload for ${H}.record is not an object`);const J=isPlainObject(F.record)?F.record:{};return{kind:H.replace(/^chess_/,""),rating_current:F.last?.rating??"",rating_best:F.best?.rating??"",wins:J.win??"",losses:J.loss??"",draws:J.draw??""}}export function formatDate(q){if(!q||typeof q!=="number")return"";return new Date(q*1000).toISOString().slice(0,10)}export function openingName(q){if(typeof q!=="string"||!q.startsWith("http"))return"";const H=q.replace(/\/+$/,"").split("/").pop()||"";if(!H)return"";const F=H.match(/^([^.]+?)(?:-\d|\.\.\.|$)/);return(F?F[1]:H).replace(/-/g," ").trim()}export function mapGameRow(q,H){if(!isPlainObject(q))throw new K("Chess.com game archive entry is not an object");if(typeof q.url!=="string"||!/^https:\/\/www\.chess\.com\/game\/(?:live|daily)\/\d+(?:$|[/?#])/i.test(q.url))throw new K("Chess.com game archive entry is missing a stable game URL");const F=q?.white||{},J=q?.black||{};if(!isPlainObject(F)||!isPlainObject(J))throw new K("Chess.com game archive entry has malformed player objects");if(typeof F.username!=="string"||!F.username.trim()||typeof J.username!=="string"||!J.username.trim())throw new K("Chess.com game archive entry is missing stable player identities");const V=String(H||"").toLowerCase(),Q=String(F.username||"").toLowerCase()===V,T=String(J.username||"").toLowerCase()===V;if(!Q&&!T)throw new K("Chess.com game archive entry does not include the requested player");const Z=Q?F:J,$=Q?J:F,z=q?.eco||"";return{date:formatDate(q?.end_time),time_class:q?.time_class||"",rated:q?.rated===!0,my_color:Q?"white":"black",my_rating:Z?.rating??"",my_result:Z?.result||"",opponent:$?.username||"",opponent_rating:$?.rating??"",accuracy_white:typeof q?.accuracies?.white==="number"?q.accuracies.white:"",accuracy_black:typeof q?.accuracies?.black==="number"?q.accuracies.black:"",eco:z,opening_name:openingName(z),url:q?.url||""}}export const __test__={validateUsername,parseGameUrl,isPlainObject,isOptionalPlainObject:Y,chessApi,summarizeStats,formatDate,mapGameRow,openingName};
@@ -0,0 +1,4 @@
1
+ import{cli as v,Strategy as x}from"@jackwener/opencli/registry";import{ArgumentError as f,CommandExecutionError as Y,EmptyResultError as j}from"@jackwener/opencli/errors";import{CLAUDE_DOMAIN as F,CLAUDE_URL as L,COMPOSER_SELECTOR as T,MESSAGE_SELECTOR as b,ensureOnClaude as O,selectModel as A,setAdaptiveThinking as S,sendMessage as y,sendWithFile as M,getBubbleCount as D,waitForResponse as P,parseBoolFlag as U,withRetry as K,ensureClaudeComposer as h,requireNonEmptyPrompt as C,requirePositiveInt as c}from"./utils.js";export const askCommand=v({site:"claude",name:"ask",access:"write",description:"Send a prompt to Claude and get the response",domain:F,strategy:x.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"prompt",positional:!0,required:!0,help:"Prompt to send"},{name:"timeout",type:"int",default:120,help:"Max seconds to wait for response"},{name:"new",type:"boolean",default:!1,help:"Start a new chat before sending"},{name:"model",default:"sonnet",choices:["sonnet","opus","haiku"],help:"Model to use: sonnet, opus, or haiku"},{name:"think",type:"boolean",default:!1,help:"Enable Adaptive thinking"},{name:"file",help:"Attach a file (image, PDF, text) with the prompt"}],columns:["response"],func:async(z,H)=>{const V=C(H.prompt,"claude ask"),Z=c(Number(H.timeout??120),"claude ask --timeout",'Example: opencli claude ask "hello" --timeout 120'),$=Z*1000,G=U(H.think);if(U(H.new)){await z.goto(L);try{await z.wait({selector:T,timeout:8})}catch{}}else if(await O(z)){await z.evaluate(`(() => {
2
+ var link = document.querySelector('a[href*="/chat/"]');
3
+ if (link) link.click();
4
+ })()`);try{await z.wait({selector:b,timeout:5})}catch{}}await K(()=>h(z,"Claude ask requires a visible composer on the current page."));const W=(await z.evaluate("window.location.href")||"").includes("/chat/"),B=H.__opencliOptionSources?.model==="cli",X=H.model||"sonnet";if(W&&B)throw new f(`Cannot switch to ${X} model inside an existing conversation.`,"Re-run with --new to start a fresh chat before selecting a model.");if(!W){const Q=await K(()=>A(z,X));if(!Q?.ok){if(Q?.upgrade)throw new f(`${X} model requires a paid Claude plan.`,"Pick --model sonnet or --model haiku, or upgrade your account.");throw new Y(`Could not switch to ${X} model`)}}if(!(await K(()=>S(z,G)))?.ok&&G)throw new Y("Could not enable Adaptive thinking");if(H.file){const Q=await K(()=>D(z));try{const J=await M(z,H.file,V);if(J&&!J.ok)throw new Y(J.reason||"Failed to attach file")}catch(J){if(!String(J?.message||J).includes("Promise was collected"))throw J}const N=await P(z,Q,V,$);if(!N)throw new j("claude ask",`No Claude response appeared within ${Z}s. Re-run with a higher --timeout if the model is still generating.`);return[{response:N}]}const _=await K(()=>D(z)),q=await K(()=>y(z,V));if(!q?.ok)throw new Y(q?.reason||"Failed to send message");const I=await P(z,_,V,$);if(!I)throw new j("claude ask",`No Claude response appeared within ${Z}s. Re-run with a higher --timeout if the model is still generating.`);return[{response:I}]}});
@@ -0,0 +1,19 @@
1
+ import{AuthRequiredError as t,CommandExecutionError as a}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as n}from"../_shared/site-auth.js";async function o(e){return(await e.getCookies({url:"https://claude.ai"})).some((r)=>r.name==="sessionKey"&&r.value)}async function s(e){if(!await o(e))throw new t("claude.ai","Claude sessionKey cookie missing");await e.goto("https://claude.ai/");await e.wait(2);const i=await e.evaluate(`(async () => {
2
+ try {
3
+ const res = await fetch('/api/organizations', { credentials: 'include' });
4
+ if (res.status === 401 || res.status === 403) {
5
+ return { kind: 'auth', detail: 'Claude /api/organizations HTTP ' + res.status };
6
+ }
7
+ if (!res.ok) return { kind: 'http', httpStatus: res.status };
8
+ const d = await res.json();
9
+ if (!Array.isArray(d) || d.length === 0) {
10
+ return { kind: 'auth', detail: 'Claude /api/organizations empty' };
11
+ }
12
+ const userIdCookie = (document.cookie.split('; ').find(c => c.startsWith('ajs_user_id=')) || '').split('=')[1] || '';
13
+ const activeOrgCookie = (document.cookie.split('; ').find(c => c.startsWith('lastActiveOrg=')) || '').split('=')[1] || '';
14
+ const activeOrg = d.find(o => o.uuid === activeOrgCookie) || d[0];
15
+ return { ok: true, user_id: userIdCookie, org_name: activeOrg.name || '', org_uuid: activeOrg.uuid || '' };
16
+ } catch (e) {
17
+ return { kind: 'exception', detail: String(e && e.message || e) };
18
+ }
19
+ })()`);if(i?.kind==="auth")throw new t("claude.ai",i.detail);if(i?.kind==="http")throw new a(`HTTP ${i.httpStatus} from /api/organizations`);if(i?.kind==="exception")throw new a(`Claude whoami failed: ${i.detail}`);if(!i?.ok)throw new a(`Unexpected Claude probe: ${JSON.stringify(i)}`);if(!i.user_id)throw new t("claude.ai","Claude session incomplete — ajs_user_id cookie missing");return{user_id:String(i.user_id),org_name:String(i.org_name),org_uuid:String(i.org_uuid)}}n({site:"claude",domain:"claude.ai",loginUrl:"https://claude.ai/login",columns:["user_id","org_name","org_uuid"],quickCheck:o,verify:s,poll:async(e)=>{if(!await o(e))throw new t("claude.ai","Waiting for Claude sessionKey cookie");return s(e)}});
@@ -0,0 +1 @@
1
+ import{cli as F,Strategy as H}from"@jackwener/opencli/registry";import{EmptyResultError as J}from"@jackwener/opencli/errors";import{CLAUDE_DOMAIN as K,MESSAGE_SELECTOR as P,getVisibleMessages as Q,ensureClaudeLogin as W,requireConversationId as X}from"./utils.js";export const detailCommand=F({site:"claude",name:"detail",access:"read",description:"Open a Claude conversation by ID and read its messages",domain:K,strategy:H.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"id",positional:!0,required:!0,help:"Conversation ID (UUID from /chat/<id>)"}],columns:["Index","Role","Text"],func:async(f,B)=>{const x=X(B.id);await f.goto(`https://claude.ai/chat/${x}`);try{await f.wait({selector:P,timeout:10})}catch{}await W(f,"Claude detail requires a logged-in Claude session.");const z=await Q(f);if(z.length>0)return z;throw new J("claude detail",`No visible Claude messages were found for conversation ${x}.`)}});
@@ -0,0 +1 @@
1
+ import{cli as o,Strategy as r}from"@jackwener/opencli/registry";import{EmptyResultError as n}from"@jackwener/opencli/errors";import{CLAUDE_DOMAIN as a,getConversationList as l,ensureClaudeLogin as c,requirePositiveInt as m}from"./utils.js";export const historyCommand=o({site:"claude",name:"history",access:"read",description:"List conversation history from Claude /recents",domain:a,strategy:r.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"limit",type:"int",default:20,help:"Max conversations to show"}],columns:["Index","Id","Title","Url"],func:async(e,i)=>{const s=m(Number(i.limit??20),"claude history --limit","Example: opencli claude history --limit 20"),t=await l(e);await c(e,"Claude history requires a logged-in Claude session.");if(t.length===0)throw new n("claude history","No Claude conversation history was visible on /recents.");return t.slice(0,s)}});
@@ -0,0 +1 @@
1
+ import{cli as v,Strategy as z}from"@jackwener/opencli/registry";import{CLAUDE_DOMAIN as B,CLAUDE_URL as F,COMPOSER_SELECTOR as G,ensureClaudeComposer as H}from"./utils.js";export const newCommand=v({site:"claude",name:"new",access:"read",description:"Start a new conversation in Claude",domain:B,strategy:z.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status"],func:async(f)=>{await f.goto(F);try{await f.wait({selector:G,timeout:8})}catch{}await H(f,"Claude new requires a logged-in Claude session with a visible composer.");return[{Status:"New chat started"}]}});
@@ -0,0 +1 @@
1
+ import{cli as x,Strategy as z}from"@jackwener/opencli/registry";import{EmptyResultError as B}from"@jackwener/opencli/errors";import{CLAUDE_DOMAIN as F,ensureOnClaude as G,getVisibleMessages as H,ensureClaudeLogin as J}from"./utils.js";export const readCommand=x({site:"claude",name:"read",access:"read",description:"Read the current Claude conversation",domain:F,strategy:z.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Index","Role","Text"],func:async(f)=>{await G(f);await J(f,"Claude read requires a logged-in Claude session.");const q=await H(f);if(q.length>0)return q;throw new B("claude read","No visible Claude messages were found in the current conversation.")}});
@@ -0,0 +1 @@
1
+ import{cli as K,Strategy as Q}from"@jackwener/opencli/registry";import{CommandExecutionError as V}from"@jackwener/opencli/errors";import{CLAUDE_DOMAIN as W,CLAUDE_URL as X,COMPOSER_SELECTOR as Y,ensureOnClaude as Z,sendMessage as $,parseBoolFlag as q,withRetry as J,ensureClaudeComposer as x,requireNonEmptyPrompt as B}from"./utils.js";export const sendCommand=K({site:"claude",name:"send",access:"write",description:"Send a prompt to Claude without waiting for the response",domain:W,strategy:Q.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"prompt",positional:!0,required:!0,help:"Prompt to send"},{name:"new",type:"boolean",default:!1,help:"Start a new chat before sending"}],columns:["Status","SubmittedBy","InjectedText"],func:async(f,G)=>{const H=B(G.prompt,"claude send");if(q(G.new)){await f.goto(X);try{await f.wait({selector:Y,timeout:8})}catch{}}else await Z(f);await J(()=>x(f,"Claude send requires a visible composer on the current page."));const z=await J(()=>$(f,H));if(!z?.ok)throw new V(z?.reason||"Failed to send message");return[{Status:"Success",SubmittedBy:z.method||"send-button",InjectedText:H}]}});
@@ -0,0 +1 @@
1
+ import{cli as a,Strategy as s}from"@jackwener/opencli/registry";import{CLAUDE_DOMAIN as n,ensureOnClaude as o,getPageState as r}from"./utils.js";export const statusCommand=a({site:"claude",name:"status",access:"read",description:"Check Claude page availability and login state",domain:n,strategy:s.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status","Login","Url"],func:async(t)=>{await o(t);const e=await r(t);return[{Status:e.hasComposer?"Connected":"Page not ready",Login:e.isLoggedIn?"Yes":"No",Url:e.url}]}});
@@ -0,0 +1,179 @@
1
+ import{ArgumentError as Y,AuthRequiredError as F,CommandExecutionError as W}from"@jackwener/opencli/errors";export const CLAUDE_DOMAIN="claude.ai",CLAUDE_URL="https://claude.ai/new",COMPOSER_SELECTOR='[data-testid="chat-input"]',MESSAGE_SELECTOR=".font-claude-response",MODEL_DROPDOWN_SELECTOR='[data-testid="model-selector-dropdown"]';const G={sonnet:"Sonnet 4.6",opus:"Opus 4.7",haiku:"Haiku 4.5"};export async function isOnClaude(z){const B=await z.evaluate("window.location.href").catch(()=>"");if(typeof B!=="string"||!B)return!1;try{const H=new URL(B).hostname;return H===CLAUDE_DOMAIN||H.endsWith(`.${CLAUDE_DOMAIN}`)}catch{return!1}}export async function ensureOnClaude(z){if(await isOnClaude(z))return!1;await z.goto(CLAUDE_URL);try{await z.wait({selector:COMPOSER_SELECTOR,timeout:8})}catch{}return!0}export async function getPageState(z){return z.evaluate(`(() => {
2
+ var composer = document.querySelector('${COMPOSER_SELECTOR}');
3
+ var userMenu = document.querySelector('[data-testid="user-menu-button"]');
4
+ return {
5
+ url: window.location.href,
6
+ title: document.title,
7
+ hasComposer: !!composer,
8
+ isLoggedIn: !!userMenu,
9
+ };
10
+ })()`)}export async function ensureClaudeLogin(z,B="Claude requires a logged-in browser session."){const H=await getPageState(z);if(!H.isLoggedIn)throw new F(CLAUDE_DOMAIN,B);return H}export async function ensureClaudeComposer(z,B="Claude composer is not available on the current page."){const H=await ensureClaudeLogin(z,B);if(!H.hasComposer)throw new W(B);return H}export function requireNonEmptyPrompt(z,B){const H=String(z??"").trim();if(!H)throw new Y(`${B} prompt cannot be empty`,`Example: opencli ${B} "hello"`);return H}export function requirePositiveInt(z,B,H){if(!Number.isInteger(z)||z<1)throw new Y(`${B} must be a positive integer`,H);return z}export function requireConversationId(z){const B=String(z??"").trim();if(!B)throw new Y("claude detail requires a conversation id","Example: opencli claude detail 123e4567-e89b-12d3-a456-426614174000");return B}export async function getVisibleMessages(z){const B=await z.evaluate(`(() => {
11
+ var nodes = document.querySelectorAll('[data-testid="user-message"], ${MESSAGE_SELECTOR}');
12
+ var rows = [];
13
+ Array.from(nodes).forEach(function(el) {
14
+ var isUser = el.getAttribute('data-testid') === 'user-message';
15
+ var raw = (el.innerText || '').trim();
16
+ if (!isUser) {
17
+ var parts = raw.split(/\\n\\n+/);
18
+ while (parts.length > 1 && /^(Thought|View)\\b/i.test(parts[0])) parts.shift();
19
+ raw = parts.join('\\n\\n').trim();
20
+ }
21
+ if (raw) rows.push({ role: isUser ? 'user' : 'assistant', text: raw });
22
+ });
23
+ return rows;
24
+ })()`);if(!Array.isArray(B))return[];return B.map(function(H,K){return{Index:K,Role:H.role,Text:H.text}})}export async function getConversationList(z){if(!await isOnClaude(z)||!(await z.evaluate("window.location.href")||"").includes("/recents")){await z.goto("https://claude.ai/recents");try{await z.wait({selector:'a[href*="/chat/"]',timeout:8})}catch{}}const B=await z.evaluate(`(() => {
25
+ var links = Array.from(document.querySelectorAll('a[href*="/chat/"]'));
26
+ return links.map(function(link, i) {
27
+ var href = link.getAttribute('href') || '';
28
+ var idMatch = href.match(/\\/chat\\/([a-f0-9-]+)/);
29
+ return {
30
+ Index: i + 1,
31
+ Id: idMatch ? idMatch[1] : href,
32
+ Title: (link.innerText || '').trim().split('\\n')[0].trim() || '(untitled)',
33
+ Url: href.startsWith('http') ? href : ('https://claude.ai' + href),
34
+ };
35
+ });
36
+ })()`);return Array.isArray(B)?B:[]}export async function selectModel(z,B){const H=G[String(B).toLowerCase()];if(!H)return{ok:!1};const K=await z.evaluate(`(() => {
37
+ var trigger = document.querySelector('${MODEL_DROPDOWN_SELECTOR}');
38
+ if (!trigger) return { ok: false };
39
+ var label = trigger.getAttribute('aria-label') || '';
40
+ if (label.indexOf(${JSON.stringify(H)}) >= 0) {
41
+ return { ok: true, toggled: false };
42
+ }
43
+ trigger.click();
44
+ return { ok: true, opened: true };
45
+ })()`);if(!K?.ok)return K;if(!K.opened)return K;try{await z.wait({selector:'div[role="menuitemradio"]',timeout:3})}catch{}return z.evaluate(`(() => {
46
+ var items = Array.from(document.querySelectorAll('div[role="menuitemradio"]'));
47
+ var target = items.find(function(el) { return (el.innerText || '').indexOf(${JSON.stringify(H)}) >= 0; });
48
+ if (!target) return { ok: false };
49
+ // Free-tier locked options carry an inline "Upgrade" button next to the label.
50
+ var upgrade = target.querySelector('button');
51
+ if (upgrade && (upgrade.innerText || '').toLowerCase().indexOf('upgrade') >= 0) {
52
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
53
+ return { ok: false, upgrade: true };
54
+ }
55
+ var alreadySelected = target.getAttribute('aria-checked') === 'true';
56
+ if (!alreadySelected) target.click();
57
+ else document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
58
+ return { ok: true, toggled: !alreadySelected };
59
+ })()`)}export async function setAdaptiveThinking(z,B){if(!(await z.evaluate(`(() => {
60
+ var trigger = document.querySelector('${MODEL_DROPDOWN_SELECTOR}');
61
+ if (!trigger) return { ok: false };
62
+ trigger.click();
63
+ return { ok: true };
64
+ })()`))?.ok)return{ok:!1};try{await z.wait({selector:'div[role="menuitem"]',timeout:3})}catch{}return z.evaluate(`(() => {
65
+ var items = Array.from(document.querySelectorAll('div[role="menuitem"]'));
66
+ var target = items.find(function(el) { return (el.innerText || '').indexOf('Adaptive thinking') >= 0; });
67
+ if (!target) {
68
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
69
+ return { ok: false };
70
+ }
71
+ var isActive = target.getAttribute('aria-checked') === 'true';
72
+ if (${B} !== isActive) target.click();
73
+ else document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
74
+ return { ok: true, toggled: ${B} !== isActive };
75
+ })()`)}export async function sendMessage(z,B){const H=JSON.stringify(B);if(!await z.evaluate(`(() => {
76
+ var box = document.querySelector('${COMPOSER_SELECTOR}');
77
+ if (!box) return false;
78
+ box.focus();
79
+ // ProseMirror editors hold content in nested <p>; clear via Range/delete
80
+ // rather than .value or textContent, which the editor won't notice.
81
+ var sel = window.getSelection();
82
+ sel.removeAllRanges();
83
+ var range = document.createRange();
84
+ range.selectNodeContents(box);
85
+ sel.addRange(range);
86
+ document.execCommand('delete', false);
87
+ return true;
88
+ })()`))return{ok:!1,reason:"composer not found"};let X=!1;if(z.nativeType)try{await z.nativeType(B);X=!0}catch(Q){const V=String(Q?.message||Q);if(!V.includes("Unknown action")&&!V.includes("not supported"))throw Q}if(!X)await z.evaluate(`(() => {
89
+ var box = document.querySelector('${COMPOSER_SELECTOR}');
90
+ if (!box) return;
91
+ box.focus();
92
+ document.execCommand('insertText', false, ${H});
93
+ })()`);await z.wait(1.2);return z.evaluate(`(() => {
94
+ var ariaCandidates = [
95
+ 'button[aria-label="Send Message"]',
96
+ 'button[aria-label="Send message"]',
97
+ 'button[aria-label="Send"]',
98
+ 'button[aria-label*="Send"]',
99
+ ];
100
+ for (var i = 0; i < ariaCandidates.length; i++) {
101
+ var btn = document.querySelector(ariaCandidates[i]);
102
+ if (btn && !btn.disabled) { btn.click(); return { ok: true }; }
103
+ }
104
+ // Fallback: rightmost enabled button with an svg in the composer container.
105
+ var box = document.querySelector('${COMPOSER_SELECTOR}');
106
+ if (box) {
107
+ var c = box.parentElement;
108
+ for (var hop = 0; hop < 6 && c; hop++) {
109
+ var btns = Array.from(c.querySelectorAll('button')).filter(function(b) { return !b.disabled && b.querySelector('svg'); });
110
+ if (btns.length) { btns[btns.length - 1].click(); return { ok: true, method: 'fallback' }; }
111
+ c = c.parentElement;
112
+ }
113
+ }
114
+ var box2 = document.querySelector('${COMPOSER_SELECTOR}');
115
+ if (box2) {
116
+ box2.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, bubbles: true }));
117
+ return { ok: true, method: 'enter' };
118
+ }
119
+ return { ok: false, reason: 'send button not found' };
120
+ })()`)}export async function getBubbleCount(z){return await z.evaluate(`(() => {
121
+ return document.querySelectorAll('${MESSAGE_SELECTOR}').length;
122
+ })()`)||0}export async function waitForResponse(z,B,H,K){const X=Date.now();let Q="",V=0;while(Date.now()-X<K){await z.wait(3);let $;try{$=await z.evaluate(`(() => {
123
+ var bubbles = document.querySelectorAll('${MESSAGE_SELECTOR}');
124
+ // Adaptive thinking renders "Thought process" labels at the top
125
+ // of the response (often duplicated for the expand/collapse widget).
126
+ // Strip them so the row value is the actual answer text.
127
+ var texts = Array.from(bubbles).map(function(b) {
128
+ var raw = (b.innerText || '').trim();
129
+ // Drop leading paragraphs that are widget labels:
130
+ // "Thought process" / "Thought for Xs" — Adaptive thinking expand widget
131
+ // "View uploaded image" / "View attachment" — file thumbnail label
132
+ // These render twice (collapsed + expanded) and are followed by a blank line.
133
+ var parts = raw.split(/\\n\\n+/);
134
+ while (parts.length > 1 && /^(Thought|View)\\b/i.test(parts[0])) parts.shift();
135
+ return parts.join('\\n\\n').trim();
136
+ }).filter(Boolean);
137
+ return {
138
+ count: texts.length,
139
+ last: texts[texts.length - 1] || '',
140
+ streaming: !!document.querySelector('[data-is-streaming="true"]'),
141
+ };
142
+ })()`)}catch{continue}if(!$)continue;const Z=$.last;if(!Z||Z===H.trim())continue;if($.count<=B)continue;if($.streaming){Q=Z;V=0;continue}if(Z===Q){V++;if(V>=3)return Z}else{V=0;Q=Z}}return Q||null}async function k(z,B){for(let H=0;H<12;H++){await z.wait(1);if(await z.evaluate(`(() => {
143
+ // Claude renders attachments as data-testid="file-thumbnail" cards with
144
+ // a sibling Remove button. Either signal indicates the file took.
145
+ if (document.querySelector('[data-testid="file-thumbnail"]')) return true;
146
+ var removeBtn = Array.from(document.querySelectorAll('button'))
147
+ .find(function(b) { return (b.getAttribute('aria-label') || '') === 'Remove'; });
148
+ return !!removeBtn;
149
+ })()`))return!0}return!1}export async function sendWithFile(z,B,H){const K=await import("node:fs"),X=await import("node:path"),Q=X.default.resolve(B);if(!K.default.existsSync(Q))return{ok:!1,reason:`File not found: ${Q}`};const V=K.default.statSync(Q);if(V.size>31457280)return{ok:!1,reason:`File too large (${(V.size/1024/1024).toFixed(1)} MB). Max: 30 MB`};const $=X.default.basename(Q);let Z=!1;if(z.setFileInput)try{await z.setFileInput([Q],'input[data-testid="file-upload"]');const j=await z.evaluate(`(() => {
150
+ var inp = document.querySelector('input[data-testid="file-upload"]');
151
+ if (!inp) return { ok: false, reason: 'file input not found' };
152
+ var propsKey = Object.keys(inp).find(function(k) { return k.startsWith('__reactProps$'); });
153
+ if (propsKey && typeof inp[propsKey].onChange === 'function') {
154
+ inp[propsKey].onChange({ target: { files: inp.files } });
155
+ return { ok: true, via: 'react' };
156
+ }
157
+ inp.dispatchEvent(new Event('change', { bubbles: true }));
158
+ return { ok: true, via: 'native' };
159
+ })()`);if(!j?.ok)return j;Z=!0}catch(j){const q=String(j?.message||j);if(!q.includes("Unknown action")&&!q.includes("not supported")&&!q.includes("Not allowed"))throw j}if(!Z){const q=K.default.readFileSync(Q).toString("base64"),J=await z.evaluate(`(async () => {
160
+ var binary = atob('${q}');
161
+ var bytes = new Uint8Array(binary.length);
162
+ for (var i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
163
+
164
+ var file = new File([bytes], ${JSON.stringify($)});
165
+ var dt = new DataTransfer();
166
+ dt.items.add(file);
167
+
168
+ var inp = document.querySelector('input[data-testid="file-upload"]');
169
+ if (!inp) return { ok: false, reason: 'file input not found' };
170
+
171
+ var propsKey = Object.keys(inp).find(function(k) { return k.startsWith('__reactProps$'); });
172
+ if (!propsKey || typeof inp[propsKey].onChange !== 'function') {
173
+ return { ok: false, reason: 'React onChange not found' };
174
+ }
175
+
176
+ inp.files = dt.files;
177
+ inp[propsKey].onChange({ target: { files: inp.files } });
178
+ return { ok: true };
179
+ })()`);if(J&&!J.ok)return J}if(!await k(z,$))return{ok:!1,reason:"file preview did not appear"};return sendMessage(z,H)}export async function withRetry(z,B=2){for(let H=0;H<=B;H++)try{return await z()}catch(K){const X=String(K?.message||K);if(H<B&&X.includes("Promise was collected")){await new Promise((Q)=>setTimeout(Q,2000));continue}throw K}}export function parseBoolFlag(z){if(typeof z==="boolean")return z;return String(z??"").trim().toLowerCase()==="true"}
@@ -0,0 +1 @@
1
+ import{CliError as Z,CommandExecutionError as M}from"@jackwener/opencli/errors";import{cli as N,Strategy as v}from"@jackwener/opencli/registry";import{publishArticle as U}from"../_shared/article/publish.js";export const cnblogsProfile={home:"https://i.cnblogs.com/posts/edit",outputFormat:"markdown",image:{uploadFn:async(K,z)=>{const G=z.cookie("XSRF-TOKEN");if(!G)throw Error("未找到 XSRF-TOKEN cookie,请确认已登录博客园");const Q=await fetch(K,{credentials:"omit"});if(!Q.ok)throw Error("图片下载失败: "+K+"(HTTP "+Q.status+")");const Y=await Q.blob(),H=new FormData;H.append("image",Y,"image.png");H.append("app","blog");H.append("uploadType","Select");const X=await fetch("https://upload.cnblogs.com/v2/images/cors-upload",{method:"POST",credentials:"include",headers:{"x-xsrf-token":G},body:H}),W=await X.text();if(!X.ok)throw Error("图片上传失败: HTTP "+X.status+" "+W.slice(0,150));let V=null;try{V=JSON.parse(W)}catch(q){}if(!V)throw Error("图片上传失败: 响应不是 JSON - "+W.slice(0,100));const $=V.data||V.url||V.imageUrl||V.src;if(!$||typeof $!=="string")throw Error("图片上传失败: 无法解析图片 URL - "+JSON.stringify(V).slice(0,150));return{url:$}},skip:["cnblogs.com"]},publish:async(K,z)=>{const G=z.cookie("XSRF-TOKEN");if(!G)return{ok:!1,stage:"auth",status:401,message:"未找到 XSRF-TOKEN cookie,请确认已登录博客园并在 i.cnblogs.com 下访问过"};const Q={"Content-Type":"application/json","x-xsrf-token":G},Y={id:null,postType:2,accessPermission:0,title:K.title,url:null,postBody:K.content,categoryIds:null,categories:null,collectionIds:[],inSiteCandidate:!1,inSiteHome:!1,siteCategoryId:null,blogTeamIds:null,isPublished:!1,displayOnHomePage:!1,isAllowComments:!0,includeInMainSyndication:!1,isPinned:!1,showBodyWhenPinned:!1,isOnlyForRegisterUser:!1,isUpdateDateAdded:!1,entryName:null,description:null,featuredImage:null,tags:null,password:null,publishAt:null,datePublished:new Date().toISOString(),dateUpdated:null,isMarkdown:!0,isDraft:!0,autoDesc:null,changePostType:!1,blogId:0,author:null,removeScript:!1,clientInfo:null,changeCreatedTime:!1,canChangeCreatedTime:!1,isContributeToImpressiveBugActivity:!1,usingEditorId:5,sourceUrl:null},H=await fetch("https://i.cnblogs.com/api/posts",{method:"POST",credentials:"include",headers:Q,body:JSON.stringify(Y)}),X=await H.text();if(!H.ok)return{ok:!1,stage:"create",status:H.status,message:X.slice(0,300)};let W=null;try{W=JSON.parse(X)}catch(j){}if(!W||!W.id)return{ok:!1,stage:"create",status:H.status,message:"创建草稿失败: "+X.slice(0,300)};const V=String(W.id),$="https://i.cnblogs.com/articles/edit;postId="+V;if(K.draftOnly)return{ok:!0,draft:!0,id:V,url:$};const q=await fetch("https://i.cnblogs.com/api/articles/"+V,{credentials:"include",headers:Q}),O=await q.text();let B=null;try{B=JSON.parse(O)}catch(j){}const A=B&&B.blogPost;if(!q.ok||!A)return{ok:!1,stage:"publish",status:q.status,message:"读取草稿完整对象失败: "+O.slice(0,300),id:V};A.isPublished=!0;A.isDraft=!1;const F=await fetch("https://i.cnblogs.com/api/posts",{method:"POST",credentials:"include",headers:Q,body:JSON.stringify(A)}),_=await F.text();if(!F.ok)return{ok:!1,stage:"publish",status:F.status,message:_.slice(0,300),id:V};let L=null;try{L=JSON.parse(_)}catch(j){}const S=L&&L.url||$;return{ok:!0,draft:!1,id:V,url:S}}},cnblogsAuthProfile={home:"https://home.cnblogs.com",checkAuth:async(K)=>{try{const z=await fetch("https://home.cnblogs.com/user/CurrentUserInfo",{method:"GET",credentials:"include"});if(!z.ok)return{isAuthenticated:!1,error:"HTTP "+z.status};const G=await z.text(),Q=G.match(/href="\/u\/([^/]+)\/"/),Y=G.match(/<img[^>]+class="pfs"[^>]+src="([^"]+)"/);if(!Q)return{isAuthenticated:!1};const H=Q[1];return{isAuthenticated:!0,userId:H,username:H,avatar:Y?Y[1]:""}}catch(z){return{isAuthenticated:!1,error:String(z&&z.message||z)}}}};function J(K){if(!K.execute)throw new Z("INVALID_INPUT","此命令需要 --execute 参数才会实际写入博客园。注意:本报错仅表示缺少 --execute,并未校验其余参数,不能当 dry-run 预览用")}async function y(K){const z=typeof K.text==="string"?K.text:void 0,G=typeof K.file==="string"?K.file:void 0;if(z&&G)throw new Z("INVALID_INPUT","不能同时使用 <text> 和 --file,选其一即可");let Q=z??"";if(G){const{readFile:Y,stat:H}=await import("node:fs/promises");let X;try{X=await H(G)}catch{throw new Z("INVALID_INPUT","文件不存在: "+G)}if(!X.isFile())throw new Z("INVALID_INPUT","必须是可读文本文件: "+G);let W;try{W=await Y(G)}catch{throw new Z("INVALID_INPUT","文件读取失败: "+G)}try{Q=new TextDecoder("utf-8",{fatal:!0}).decode(W)}catch{throw new Z("INVALID_INPUT","文件不是有效 UTF-8 编码: "+G)}}if(!Q.trim())throw new Z("INVALID_INPUT","正文不能为空");return Q}function C(K,z,G,Q,Y={}){return[{status:"success",outcome:Q,message:K,target_type:z,target:G,...Y}]}N({site:"cnblogs",name:"article",access:"write",description:"发布博客园文章(Markdown)。正文默认 Markdown;图片自动转存到博客园图床。",domain:"cnblogs.com",strategy:v.COOKIE,browser:!0,args:[{name:"title",positional:!0,required:!0,help:"文章标题"},{name:"text",positional:!0,help:"文章正文(Markdown,默认;--html 时按 HTML 处理)"},{name:"file",help:"从文件读取正文(UTF-8,Markdown 默认)"},{name:"html",type:"boolean",help:"将正文当作原始 HTML 而非 Markdown"},{name:"draft",type:"boolean",help:"仅保存草稿,不发布"},{name:"execute",type:"boolean",help:"实际执行写入。不加此参数命令拒绝写入。"}],columns:["status","outcome","message","target_type","target","created_target","created_url"],func:async(K,z)=>{if(!K)throw new M("博客园文章发布需要浏览器会话");J(z);const G=String(z.title??"").trim();if(!G)throw new Z("INVALID_INPUT","文章标题不能为空");const Q=await y(z),Y=Boolean(z.draft),H=await U(K,{title:G,body:Q,format:z.html?"html":"markdown",draftOnly:Y,profile:cnblogsProfile}),X=H.images.uploaded.length|0,W=H.images.failed.length|0;let V=H.draft?"已保存博客园草稿":"已发布博客园文章";if(X||W)V+="·图片: "+X+" 张已转存"+(W?","+W+" 张失败":"");return C(V,"article","",H.draft?"draft":"created",{created_target:"article:"+H.id,created_url:H.url})}});
@@ -0,0 +1 @@
1
+ import{registerArticleLogin as m}from"../_shared/article/login.js";import{cnblogsAuthProfile as k}from"./article.js";m({site:"cnblogs",domain:"cnblogs.com",profile:{home:k.home,checkAuth:k.checkAuth},loginDescription:"打开博客园登录页并等待浏览器完成登录(供桌面客户端引导登录)。"});
@@ -0,0 +1,37 @@
1
+ import{cli as Q,Strategy as U}from"@jackwener/opencli/registry";import{CliError as V,CommandExecutionError as N,EmptyResultError as W}from"@jackwener/opencli/errors";const X=10;async function Y(F,J){const H=await F.evaluate(`(async () => {
2
+ if (location.href.includes('account.cnblogs.com')) {
3
+ return JSON.stringify({ authFail: true, reason: 'redirected_to_login' });
4
+ }
5
+ const all = [];
6
+ for (const type of [1, 2]) {
7
+ for (let p = 1; p <= 100; p++) {
8
+ const resp = await fetch('/api/posts/list?p=' + p + '&cid=&t=' + type + '&cfg=0&search=&orderBy=&s=&scid=', { credentials: 'include' });
9
+ if (resp.status === 401 || resp.status === 403) {
10
+ return JSON.stringify({ authFail: true, reason: 'HTTP ' + resp.status });
11
+ }
12
+ if (!resp.ok) {
13
+ return JSON.stringify({ error: '列表接口 HTTP ' + resp.status });
14
+ }
15
+ let json = null;
16
+ try { json = await resp.json(); } catch (e) {
17
+ return JSON.stringify({ authFail: true, reason: 'non_json_response' });
18
+ }
19
+ const items = Array.isArray(json.postList) ? json.postList : [];
20
+ // 越界时博客园会回卷到第 1 页:pageIndex 与请求页不符即停止。
21
+ if (json.pageIndex !== p || items.length === 0) break;
22
+ for (const it of items) all.push(it);
23
+ if (all.length >= ${Number(J)} * 2) break;
24
+ if (items.length < ${X}) break;
25
+ }
26
+ }
27
+ return JSON.stringify({ items: all });
28
+ })()`);let v=null;try{v=JSON.parse(typeof H==="string"?H:JSON.stringify(H))}catch(B){}if(!v)throw new N("博客园列表响应解析失败");if(v.authFail)throw new V("AUTH_REQUIRED","未登录博客园("+v.reason+"),请先在 Chrome 中登录 cnblogs.com 后重试");if(v.error)throw new N("博客园列表接口出错: "+v.error);return Array.isArray(v.items)?v.items:[]}async function $(F,J,H){try{await F.goto("https://www.cnblogs.com/"+J+"/");const v=await F.evaluate(`(async () => {
29
+ const resp = await fetch('https://www.cnblogs.com/' + ${JSON.stringify(J)} + '/ajax/GetPostStat', {
30
+ method: 'POST',
31
+ credentials: 'include',
32
+ headers: { 'Content-Type': 'application/json' },
33
+ body: JSON.stringify(${JSON.stringify(H)}),
34
+ });
35
+ if (!resp.ok) return JSON.stringify({ error: 'HTTP ' + resp.status });
36
+ return JSON.stringify({ stats: await resp.json() });
37
+ })()`),B=JSON.parse(typeof v==="string"?v:JSON.stringify(v));if(!B||B.error||!Array.isArray(B.stats))return null;const K=new Map;for(const D of B.stats)if(D&&typeof D.postId==="number")K.set(D.postId,D);return K}catch(v){return null}}Q({site:"cnblogs",name:"stats",access:"read",description:"博客园文章数据(每篇阅读/评论/推荐等全量运营指标)",domain:"i.cnblogs.com",strategy:U.COOKIE,browser:!0,args:[{name:"limit",type:"number",default:20,help:"返回条数"}],columns:["id","type","title","url","published_at","views","likes","comments","collects","shares","status","extra"],func:async(F,J)=>{if(!F)throw new N("博客园数据统计需要浏览器会话");const H=Math.max(1,Number(J.limit)||20),v=await Y(F,H);if(v.length===0)throw new W("cnblogs stats","博客园后台没有任何随笔或文章。若确认已发布过内容,请检查是否登录了正确的账号。");v.sort((q,z)=>String(z.datePublished||"").localeCompare(String(q.datePublished||"")));const B=v.slice(0,H);let K="";for(const q of B){const z=String(q.url||"").match(/cnblogs\.com\/([^/]+)\//);if(z){K=z[1];break}}let D=null;if(K)D=await $(F,K,B.map((q)=>q.id));return B.map((q)=>{const z=D?D.get(q.id):null,O={buries:z?z.buryCount:null,web_views:q.webCount??null,feed_views:q.aggCount??null,updated_at:q.dateUpdated||"",is_pinned:Boolean(q.isPinned),is_in_site_home:Boolean(q.isInSiteHome),is_in_site_candidate:Boolean(q.isInSiteCandidate),access_permission:q.accessPermission??0,is_markdown:Boolean(q.isMarkdown)};if(!D)O.stat_note="推荐/反对数暂不可用(GetPostStat 请求失败),阅读/评论来自后台列表";return{id:String(q.id),type:q.postType===1?"随笔":"文章",title:q.title||"",url:q.url||"",published_at:q.datePublished||"",views:z?z.viewCount:q.viewCount??0,likes:z?z.diggCount:"",comments:z?z.feedbackCount:q.feedBackCount??0,collects:"",shares:"",status:q.isDraft?"草稿":q.isPublished?"已发布":"未发布",extra:JSON.stringify(O)}})}});
@@ -0,0 +1 @@
1
+ import{cli as v,Strategy as x}from"@jackwener/opencli/registry";import{checkLogin as z,cookieQuickCheck as B}from"../_shared/article/auth.js";import{cnblogsAuthProfile as D}from"./article.js";v({site:"cnblogs",name:"whoami",access:"read",description:"查看当前博客园登录账号信息。",domain:"cnblogs.com",strategy:x.COOKIE,browser:!0,columns:["logged_in","user_id","username"],authStatus:{quickCheck:B("https://home.cnblogs.com",[".Cnblogs.AspNetCore.Cookies"])},func:async(q)=>{const m=await z(q,D);return[{logged_in:m.isAuthenticated,user_id:m.userId||"",username:m.username||""}]}});
@@ -0,0 +1,38 @@
1
+ import{cli as n,Strategy as a}from"@jackwener/opencli/registry";import{clampInt as s,requireNonEmptyQuery as i}from"../_shared/common.js";n({site:"cnki",name:"search",access:"read",description:"中国知网论文搜索(海外版)",domain:"oversea.cnki.net",strategy:a.COOKIE,args:[{name:"query",positional:!0,required:!0,help:"搜索关键词"},{name:"limit",type:"int",default:10,help:"返回结果数量 (max 20)"}],columns:["rank","title","authors","journal","date","url"],navigateBefore:!1,func:async(t,e)=>{const l=s(e.limit,10,1,20),o=i(e.query);await t.goto(`https://oversea.cnki.net/kns/search?dbcode=CFLS&kw=${encodeURIComponent(o)}&korder=SU`);await t.wait(8);const r=await t.evaluate(`
2
+ (async () => {
3
+ const normalize = v => (v || '').replace(/\\s+/g, ' ').trim();
4
+ for (let i = 0; i < 40; i++) {
5
+ if (document.querySelector('.result-table-list tbody tr, #gridTable tbody tr')) break;
6
+ await new Promise(r => setTimeout(r, 500));
7
+ }
8
+ const rows = document.querySelectorAll('.result-table-list tbody tr, #gridTable tbody tr');
9
+ const results = [];
10
+ for (const row of rows) {
11
+ const tds = row.querySelectorAll('td');
12
+ if (tds.length < 5) continue;
13
+
14
+ const nameCell = row.querySelector('td.name') || tds[2];
15
+ const titleEl = nameCell?.querySelector('a');
16
+ const title = normalize(titleEl?.textContent).replace(/免费$/, '');
17
+ if (!title) continue;
18
+
19
+ let url = titleEl?.getAttribute('href') || '';
20
+ if (url && !url.startsWith('http')) url = 'https://oversea.cnki.net' + url;
21
+
22
+ const authorCell = row.querySelector('td.author') || tds[3];
23
+ const journalCell = row.querySelector('td.source') || tds[4];
24
+ const dateCell = row.querySelector('td.date') || tds[5];
25
+
26
+ results.push({
27
+ rank: results.length + 1,
28
+ title,
29
+ authors: normalize(authorCell?.textContent),
30
+ journal: normalize(journalCell?.textContent),
31
+ date: normalize(dateCell?.textContent),
32
+ url,
33
+ });
34
+ if (results.length >= ${l}) break;
35
+ }
36
+ return results;
37
+ })()
38
+ `);return Array.isArray(r)?r:[]}});
@@ -0,0 +1,72 @@
1
+ import{CommandExecutionError as I}from"@jackwener/opencli/errors";import{collectCodexProjectsFromDocument as Q,conversationSelectionArgs,hasConversationTarget as S,openCodexConversation as U}from"./sidebar.js";export{conversationSelectionArgs};export function unwrapEvaluateResult(q){if(q&&typeof q==="object"&&"data"in q&&"session"in q)return q.data;return q}function K(q){return String(q??"").replace(/\s+/g," ").trim()}function V(q,y){const z=K(q).toLowerCase(),B=K(y).toLowerCase();return!z||!B||z===B}export function findCodexConversation(q,y){if(!Array.isArray(q))return null;for(const z of q)for(const B of z.conversations||[]){if(y.threadId&&B.threadId===y.threadId)return{project:z,conversation:B};if(!y.threadId&&y.conversation&&K(B.title)===K(y.conversation)&&V(z.project,y.project))return{project:z,conversation:B}}return null}export function findActiveCodexConversation(q){const y=[];for(const z of q||[])for(const B of z.conversations||[])if(B.active)y.push({project:z,conversation:B});return y.length===1?y[0]:null}export async function readConversationProjects(q){const y=unwrapEvaluateResult(await q.evaluate(`(${Q.toString()})()`));if(!Array.isArray(y))throw new I("Codex sidebar extraction returned an invalid payload.");return y}export async function resolveActionConversation(q,y){const z=await U(q,y),B=await readConversationProjects(q),G=z?findCodexConversation(B,z):findActiveCodexConversation(B);if(!G){const H=S(y)?"The selected Codex conversation was not visible after selection.":"Pass --project/--conversation/--index/--thread-id, or keep the active conversation visible in the sidebar.";throw new I("Could not resolve a stable Codex conversation identity.",H)}if(!G.conversation.threadId)throw new I("Could not resolve a stable Codex conversation identity.","The selected sidebar row is missing its Codex thread id; selectors may have drifted.");return{project:G.project.project,projectPath:G.project.projectPath,conversation:G.conversation.title,threadId:G.conversation.threadId,pinned:G.conversation.pinned,index:G.conversation.index}}function W(q){return q.threadId||`${q.project||"(unknown project)"}/${q.conversation||"(unknown conversation)"}`}export async function clickChatActionsMenuItem(q,y){const z=JSON.stringify(y);return unwrapEvaluateResult(await q.evaluate(`(async () => {
2
+ const wait = (ms) => new Promise((r) => setTimeout(r, ms));
3
+ const labels = ${z};
4
+
5
+ const trigger = document.querySelector('button[aria-label="Chat actions"]');
6
+ if (!(trigger instanceof HTMLButtonElement)) {
7
+ return { ok: false, reason: 'Chat actions button not found in the chat header.' };
8
+ }
9
+
10
+ // Radix listens to pointer events — bare .click() is silently ignored.
11
+ const rect = trigger.getBoundingClientRect();
12
+ const init = {
13
+ bubbles: true, cancelable: true, button: 0, buttons: 1,
14
+ clientX: Math.round(rect.left + rect.width / 2),
15
+ clientY: Math.round(rect.top + rect.height / 2),
16
+ };
17
+ trigger.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
18
+ trigger.dispatchEvent(new MouseEvent('mousedown', init));
19
+ trigger.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
20
+ trigger.dispatchEvent(new MouseEvent('mouseup', init));
21
+ trigger.dispatchEvent(new MouseEvent('click', init));
22
+
23
+ // Poll for menu items to mount (typically < 300ms).
24
+ let menuItems = [];
25
+ for (let attempt = 0; attempt < 20; attempt += 1) {
26
+ await wait(75);
27
+ menuItems = Array.from(document.querySelectorAll('[role="menuitem"]'))
28
+ .filter((it) => it instanceof HTMLElement && it.offsetParent);
29
+ if (menuItems.length) break;
30
+ }
31
+ if (!menuItems.length) {
32
+ return { ok: false, reason: 'Chat actions menu did not open after pointer click.' };
33
+ }
34
+
35
+ // Match by label — menu items render as "<label><kbd>shortcut</kbd>" so
36
+ // we compare the leading text (innerText through the first newline /
37
+ // kbd boundary).
38
+ function leadingText(el) {
39
+ const clone = el.cloneNode(true);
40
+ clone.querySelectorAll('kbd').forEach((k) => k.remove());
41
+ return (clone.textContent || '').trim();
42
+ }
43
+
44
+ let target = null;
45
+ for (const item of menuItems) {
46
+ const text = leadingText(item);
47
+ for (const label of labels) {
48
+ if (text === label || text.startsWith(label)) {
49
+ target = item;
50
+ break;
51
+ }
52
+ }
53
+ if (target) break;
54
+ }
55
+
56
+ if (!target) {
57
+ const visible = menuItems.map(leadingText);
58
+ // Close the menu so it doesn't stay open as a side effect.
59
+ document.body.click();
60
+ return {
61
+ ok: false,
62
+ reason: 'No menu item matched the requested label.',
63
+ detail: 'wanted=' + JSON.stringify(labels) + ' visible=' + JSON.stringify(visible),
64
+ };
65
+ }
66
+
67
+ // Defer click to a microtask so the eval response returns BEFORE the
68
+ // action triggers a re-render that could swallow our reply.
69
+ const matchedLabel = leadingText(target);
70
+ Promise.resolve().then(() => { try { target.click(); } catch {} });
71
+ return { ok: true, clicked: matchedLabel };
72
+ })()`))||{ok:!1,reason:"Empty result from page.evaluate."}}export async function selectAndClickAction(q,y,z){const B=await resolveActionConversation(q,y);await q.wait(0.4);const G=await clickChatActionsMenuItem(q,z);if(!G.ok){const H=G.detail?` ${G.detail}`:"";throw new I(`${G.reason||"Failed to perform action."}${H}`,"Make sure Codex Desktop is running and the target conversation is selectable.")}return{...G,selected:B}}export async function waitForConversationPostcondition(q,y,z,B,G=4000){const H=Date.now()+G;let L=null;while(Date.now()<H){const N=await readConversationProjects(q);L=findCodexConversation(N,y);if(z(L))return L;await q.wait(0.2)}throw new I(`Codex ${B} was not verified for ${W(y)}.`,"The UI action may have failed or the sidebar selectors may have drifted.")}export async function setConversationPinned(q,y,z){const B=await resolveActionConversation(q,y);if(B.pinned===z)return{status:z?"already-pinned":"already-unpinned",selected:B};const G=await selectAndClickAction(q,y,[z?"Pin chat":"Unpin chat"]);await waitForConversationPostcondition(q,G.selected,(H)=>H?.conversation?.pinned===z,z?"pin":"unpin");return{status:z?"pinned":"unpinned",selected:G.selected}}export async function archiveConversation(q,y){const z=await selectAndClickAction(q,y,["Archive chat"]);await waitForConversationPostcondition(q,z.selected,(B)=>!B,"archive");return{status:"archived",selected:z.selected}}
@@ -0,0 +1 @@
1
+ import{cli as B,Strategy as E}from"@jackwener/opencli/registry";import{archiveConversation as F,conversationSelectionArgs as G,resolveActionConversation as H}from"./_actions.js";B({site:"codex",name:"archive",access:"write",description:"Archive (Codex's term for delete) the selected conversation via the Chat actions header menu. No confirmation in UI — pass --yes to actually archive.",domain:"localhost",strategy:E.UI,browser:!0,args:[{name:"yes",type:"boolean",default:!1,help:"Actually archive (default: dry-run preview)"},...G],columns:["status","thread_id","project","conversation"],func:async(z,f)=>{if(!(f.yes===!0||f.yes==="true"||f.yes==="1")){const x=await H(z,f);return[{status:"dry-run",thread_id:x.threadId,project:x.project,conversation:x.conversation}]}const q=await F(z,f);return[{status:q.status,thread_id:q.selected.threadId,project:q.selected.project,conversation:q.selected.conversation}]}});