publishport-opencli 1.8.4-pp.1

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 (2171) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +300 -0
  3. package/README.zh-CN.md +341 -0
  4. package/cli-manifest.json +44212 -0
  5. package/clis/12306/auth.js +59 -0
  6. package/clis/12306/me.js +73 -0
  7. package/clis/12306/orders.js +96 -0
  8. package/clis/12306/passengers.js +90 -0
  9. package/clis/12306/price.js +166 -0
  10. package/clis/12306/stations.js +66 -0
  11. package/clis/12306/train.js +91 -0
  12. package/clis/12306/trains.js +166 -0
  13. package/clis/12306/utils.js +272 -0
  14. package/clis/12306/utils.test.js +424 -0
  15. package/clis/1688/assets.js +205 -0
  16. package/clis/1688/assets.test.js +39 -0
  17. package/clis/1688/auth.js +46 -0
  18. package/clis/1688/download.js +77 -0
  19. package/clis/1688/download.test.js +31 -0
  20. package/clis/1688/item.js +188 -0
  21. package/clis/1688/item.test.js +67 -0
  22. package/clis/1688/search.js +310 -0
  23. package/clis/1688/search.test.js +75 -0
  24. package/clis/1688/shared.js +557 -0
  25. package/clis/1688/shared.test.js +57 -0
  26. package/clis/1688/store.js +227 -0
  27. package/clis/1688/store.test.js +62 -0
  28. package/clis/1point3acres/auth.js +52 -0
  29. package/clis/1point3acres/digest.js +35 -0
  30. package/clis/1point3acres/forum.js +51 -0
  31. package/clis/1point3acres/forums.js +44 -0
  32. package/clis/1point3acres/hot.js +35 -0
  33. package/clis/1point3acres/latest.js +35 -0
  34. package/clis/1point3acres/notifications.js +64 -0
  35. package/clis/1point3acres/search.js +71 -0
  36. package/clis/1point3acres/thread.js +117 -0
  37. package/clis/1point3acres/user.js +77 -0
  38. package/clis/1point3acres/utils.js +247 -0
  39. package/clis/36kr/article.js +66 -0
  40. package/clis/36kr/article.test.js +46 -0
  41. package/clis/36kr/hot.js +87 -0
  42. package/clis/36kr/hot.test.js +15 -0
  43. package/clis/36kr/news.js +52 -0
  44. package/clis/36kr/news.test.js +85 -0
  45. package/clis/36kr/search.js +79 -0
  46. package/clis/51job/company.js +126 -0
  47. package/clis/51job/detail.js +109 -0
  48. package/clis/51job/hot.js +56 -0
  49. package/clis/51job/search.js +80 -0
  50. package/clis/51job/utils.js +302 -0
  51. package/clis/51job/utils.test.js +69 -0
  52. package/clis/_atlassian/shared.js +577 -0
  53. package/clis/_atlassian/shared.test.js +170 -0
  54. package/clis/_shared/common.js +32 -0
  55. package/clis/_shared/desktop-commands.js +112 -0
  56. package/clis/_shared/search-adapter.js +70 -0
  57. package/clis/_shared/site-auth.js +118 -0
  58. package/clis/_shared/site-auth.test.js +98 -0
  59. package/clis/aibase/news.js +110 -0
  60. package/clis/aibase/news.test.js +59 -0
  61. package/clis/amazon/auth.js +53 -0
  62. package/clis/amazon/bestsellers.js +8 -0
  63. package/clis/amazon/bestsellers.test.js +29 -0
  64. package/clis/amazon/discussion.js +123 -0
  65. package/clis/amazon/discussion.test.js +124 -0
  66. package/clis/amazon/movers-shakers.js +8 -0
  67. package/clis/amazon/new-releases.js +8 -0
  68. package/clis/amazon/offer.js +141 -0
  69. package/clis/amazon/offer.test.js +29 -0
  70. package/clis/amazon/product.js +93 -0
  71. package/clis/amazon/product.test.js +24 -0
  72. package/clis/amazon/rankings.js +227 -0
  73. package/clis/amazon/rankings.test.js +41 -0
  74. package/clis/amazon/search.js +88 -0
  75. package/clis/amazon/search.test.js +22 -0
  76. package/clis/amazon/shared.js +365 -0
  77. package/clis/amazon/shared.test.js +44 -0
  78. package/clis/antigravity/SKILL.md +38 -0
  79. package/clis/antigravity/_actions.js +318 -0
  80. package/clis/antigravity/antigravity.test.js +172 -0
  81. package/clis/antigravity/audit-extras.js +341 -0
  82. package/clis/antigravity/delete.js +60 -0
  83. package/clis/antigravity/dump.js +29 -0
  84. package/clis/antigravity/extract-code.js +33 -0
  85. package/clis/antigravity/history.js +26 -0
  86. package/clis/antigravity/mark-read.js +52 -0
  87. package/clis/antigravity/model.js +161 -0
  88. package/clis/antigravity/new.js +26 -0
  89. package/clis/antigravity/read.js +35 -0
  90. package/clis/antigravity/rename.js +33 -0
  91. package/clis/antigravity/send.js +36 -0
  92. package/clis/antigravity/serve.js +558 -0
  93. package/clis/antigravity/status.js +19 -0
  94. package/clis/antigravity/storage.js +366 -0
  95. package/clis/antigravity/watch.js +43 -0
  96. package/clis/apple-podcasts/commands.test.js +119 -0
  97. package/clis/apple-podcasts/episodes.js +29 -0
  98. package/clis/apple-podcasts/search.js +31 -0
  99. package/clis/apple-podcasts/top.js +45 -0
  100. package/clis/apple-podcasts/utils.js +30 -0
  101. package/clis/apple-podcasts/utils.test.js +57 -0
  102. package/clis/archive/archive.test.js +262 -0
  103. package/clis/archive/item.js +92 -0
  104. package/clis/archive/search.js +115 -0
  105. package/clis/archive/snapshots.js +129 -0
  106. package/clis/archive/wayback.js +83 -0
  107. package/clis/arxiv/arxiv.test.js +112 -0
  108. package/clis/arxiv/author.js +44 -0
  109. package/clis/arxiv/paper.js +22 -0
  110. package/clis/arxiv/recent.js +33 -0
  111. package/clis/arxiv/search.js +36 -0
  112. package/clis/arxiv/utils.js +112 -0
  113. package/clis/autohome/__fixtures__/catalog.html +11 -0
  114. package/clis/autohome/__fixtures__/koubei.json +116 -0
  115. package/clis/autohome/autohome.test.js +115 -0
  116. package/clis/autohome/brand.js +108 -0
  117. package/clis/autohome/score.js +103 -0
  118. package/clis/autohome/utils.js +157 -0
  119. package/clis/baidu-scholar/search.js +87 -0
  120. package/clis/baidu-scholar/search.test.js +23 -0
  121. package/clis/band/auth.js +62 -0
  122. package/clis/band/bands.js +73 -0
  123. package/clis/band/mentions.js +128 -0
  124. package/clis/band/post.js +176 -0
  125. package/clis/band/posts.js +95 -0
  126. package/clis/barchart/flow.js +116 -0
  127. package/clis/barchart/greeks.js +208 -0
  128. package/clis/barchart/greeks.test.js +138 -0
  129. package/clis/barchart/options.js +107 -0
  130. package/clis/barchart/quote.js +135 -0
  131. package/clis/bbc/news.js +42 -0
  132. package/clis/bbc/topic.js +57 -0
  133. package/clis/bbc/utils.js +79 -0
  134. package/clis/bilibili/auth.js +36 -0
  135. package/clis/bilibili/comment.js +107 -0
  136. package/clis/bilibili/comment.test.js +153 -0
  137. package/clis/bilibili/comments.js +136 -0
  138. package/clis/bilibili/comments.test.js +142 -0
  139. package/clis/bilibili/download.js +178 -0
  140. package/clis/bilibili/download.test.js +173 -0
  141. package/clis/bilibili/dynamic.js +34 -0
  142. package/clis/bilibili/dynamic.test.js +68 -0
  143. package/clis/bilibili/favorite.js +47 -0
  144. package/clis/bilibili/feed.js +220 -0
  145. package/clis/bilibili/follow.js +140 -0
  146. package/clis/bilibili/follow.test.js +203 -0
  147. package/clis/bilibili/following.js +44 -0
  148. package/clis/bilibili/history.js +45 -0
  149. package/clis/bilibili/hot.js +40 -0
  150. package/clis/bilibili/hot.test.js +17 -0
  151. package/clis/bilibili/me.js +13 -0
  152. package/clis/bilibili/ranking.js +25 -0
  153. package/clis/bilibili/search.js +24 -0
  154. package/clis/bilibili/subtitle.js +141 -0
  155. package/clis/bilibili/subtitle.test.js +240 -0
  156. package/clis/bilibili/summary.js +167 -0
  157. package/clis/bilibili/summary.test.js +210 -0
  158. package/clis/bilibili/unfollow.js +121 -0
  159. package/clis/bilibili/user-videos.js +39 -0
  160. package/clis/bilibili/utils.js +273 -0
  161. package/clis/bilibili/utils.test.js +97 -0
  162. package/clis/bilibili/video.js +155 -0
  163. package/clis/bilibili/video.test.js +308 -0
  164. package/clis/binance/asks.js +22 -0
  165. package/clis/binance/commands.test.js +70 -0
  166. package/clis/binance/depth.js +21 -0
  167. package/clis/binance/gainers.js +23 -0
  168. package/clis/binance/klines.js +22 -0
  169. package/clis/binance/losers.js +23 -0
  170. package/clis/binance/pairs.js +22 -0
  171. package/clis/binance/price.js +19 -0
  172. package/clis/binance/prices.js +20 -0
  173. package/clis/binance/ticker.js +22 -0
  174. package/clis/binance/top.js +22 -0
  175. package/clis/binance/trades.js +21 -0
  176. package/clis/bloomberg/businessweek.js +125 -0
  177. package/clis/bloomberg/businessweek.test.js +149 -0
  178. package/clis/bloomberg/crypto.js +18 -0
  179. package/clis/bloomberg/economics.js +18 -0
  180. package/clis/bloomberg/feeds.js +16 -0
  181. package/clis/bloomberg/green.js +18 -0
  182. package/clis/bloomberg/industries.js +18 -0
  183. package/clis/bloomberg/main.js +18 -0
  184. package/clis/bloomberg/markets.js +18 -0
  185. package/clis/bloomberg/news.js +106 -0
  186. package/clis/bloomberg/opinions.js +18 -0
  187. package/clis/bloomberg/politics.js +18 -0
  188. package/clis/bloomberg/pursuits.js +18 -0
  189. package/clis/bloomberg/tech.js +18 -0
  190. package/clis/bloomberg/utils.js +380 -0
  191. package/clis/bloomberg/utils.test.js +129 -0
  192. package/clis/bluesky/feeds.js +28 -0
  193. package/clis/bluesky/followers.js +28 -0
  194. package/clis/bluesky/following.js +28 -0
  195. package/clis/bluesky/profile.js +30 -0
  196. package/clis/bluesky/search.js +29 -0
  197. package/clis/bluesky/starter-packs.js +29 -0
  198. package/clis/bluesky/thread.js +31 -0
  199. package/clis/bluesky/trending.js +20 -0
  200. package/clis/bluesky/user.js +35 -0
  201. package/clis/booking/booking.test.js +356 -0
  202. package/clis/booking/search.js +351 -0
  203. package/clis/boss/auth.js +47 -0
  204. package/clis/boss/batchgreet.js +61 -0
  205. package/clis/boss/chatlist.js +116 -0
  206. package/clis/boss/chatlist.test.js +211 -0
  207. package/clis/boss/chatmsg.js +117 -0
  208. package/clis/boss/chatmsg.test.js +230 -0
  209. package/clis/boss/detail.js +63 -0
  210. package/clis/boss/exchange.js +46 -0
  211. package/clis/boss/greet.js +49 -0
  212. package/clis/boss/invite.js +64 -0
  213. package/clis/boss/joblist.js +31 -0
  214. package/clis/boss/mark.js +70 -0
  215. package/clis/boss/recommend.js +45 -0
  216. package/clis/boss/resume.js +150 -0
  217. package/clis/boss/search.js +197 -0
  218. package/clis/boss/search.test.js +78 -0
  219. package/clis/boss/send.js +44 -0
  220. package/clis/boss/stats.js +66 -0
  221. package/clis/boss/utils.js +468 -0
  222. package/clis/boss/utils.test.js +34 -0
  223. package/clis/brave/search.js +80 -0
  224. package/clis/brave/search.test.js +76 -0
  225. package/clis/chaoxing/assignments.js +76 -0
  226. package/clis/chaoxing/auth.js +54 -0
  227. package/clis/chaoxing/exams.js +75 -0
  228. package/clis/chaoxing/utils.js +223 -0
  229. package/clis/chaoxing/utils.test.js +45 -0
  230. package/clis/chatgpt/ask.js +129 -0
  231. package/clis/chatgpt/auth.js +52 -0
  232. package/clis/chatgpt/commands.test.js +204 -0
  233. package/clis/chatgpt/detail.js +63 -0
  234. package/clis/chatgpt/envelope.test.js +108 -0
  235. package/clis/chatgpt/history.js +39 -0
  236. package/clis/chatgpt/image.js +167 -0
  237. package/clis/chatgpt/image.test.js +207 -0
  238. package/clis/chatgpt/model.js +31 -0
  239. package/clis/chatgpt/model.test.js +36 -0
  240. package/clis/chatgpt/new.js +32 -0
  241. package/clis/chatgpt/project-file-add.js +74 -0
  242. package/clis/chatgpt/project-list.js +37 -0
  243. package/clis/chatgpt/read.js +44 -0
  244. package/clis/chatgpt/send.js +68 -0
  245. package/clis/chatgpt/status.js +29 -0
  246. package/clis/chatgpt/utils.js +2226 -0
  247. package/clis/chatgpt/utils.test.js +1453 -0
  248. package/clis/chatgpt-app/ask.js +87 -0
  249. package/clis/chatgpt-app/ax.js +603 -0
  250. package/clis/chatgpt-app/ax.test.js +95 -0
  251. package/clis/chatgpt-app/commands.test.js +45 -0
  252. package/clis/chatgpt-app/model.js +25 -0
  253. package/clis/chatgpt-app/new.js +61 -0
  254. package/clis/chatgpt-app/read.js +32 -0
  255. package/clis/chatgpt-app/send.js +37 -0
  256. package/clis/chatgpt-app/status.js +26 -0
  257. package/clis/chatwise/ask.js +54 -0
  258. package/clis/chatwise/composer.test.js +186 -0
  259. package/clis/chatwise/export.js +47 -0
  260. package/clis/chatwise/history.js +61 -0
  261. package/clis/chatwise/model.js +85 -0
  262. package/clis/chatwise/new.js +2 -0
  263. package/clis/chatwise/read.js +40 -0
  264. package/clis/chatwise/screenshot.js +2 -0
  265. package/clis/chatwise/send.js +28 -0
  266. package/clis/chatwise/status.js +2 -0
  267. package/clis/chatwise/utils.js +143 -0
  268. package/clis/chess/analyze.js +35 -0
  269. package/clis/chess/analyze.test.js +79 -0
  270. package/clis/chess/game.js +114 -0
  271. package/clis/chess/game.test.js +178 -0
  272. package/clis/chess/games.js +67 -0
  273. package/clis/chess/games.test.js +164 -0
  274. package/clis/chess/stats.js +32 -0
  275. package/clis/chess/stats.test.js +79 -0
  276. package/clis/chess/utils.js +170 -0
  277. package/clis/chess/utils.test.js +230 -0
  278. package/clis/claude/ask.js +144 -0
  279. package/clis/claude/ask.test.js +338 -0
  280. package/clis/claude/auth.js +55 -0
  281. package/clis/claude/commands.test.js +118 -0
  282. package/clis/claude/detail.js +38 -0
  283. package/clis/claude/history.js +33 -0
  284. package/clis/claude/new.js +29 -0
  285. package/clis/claude/read.js +27 -0
  286. package/clis/claude/send.js +48 -0
  287. package/clis/claude/status.js +26 -0
  288. package/clis/claude/utils.js +463 -0
  289. package/clis/claude/utils.test.js +148 -0
  290. package/clis/cnki/search.js +61 -0
  291. package/clis/cnki/search.test.js +18 -0
  292. package/clis/codex/_actions.js +270 -0
  293. package/clis/codex/archive.js +37 -0
  294. package/clis/codex/ask.js +78 -0
  295. package/clis/codex/dump.js +2 -0
  296. package/clis/codex/export.js +38 -0
  297. package/clis/codex/extract-diff.js +45 -0
  298. package/clis/codex/history.js +27 -0
  299. package/clis/codex/model.js +264 -0
  300. package/clis/codex/new.js +2 -0
  301. package/clis/codex/pin.js +30 -0
  302. package/clis/codex/projects.js +28 -0
  303. package/clis/codex/read.js +41 -0
  304. package/clis/codex/rename.js +86 -0
  305. package/clis/codex/screenshot.js +2 -0
  306. package/clis/codex/send.js +51 -0
  307. package/clis/codex/sidebar.js +356 -0
  308. package/clis/codex/sidebar.test.js +388 -0
  309. package/clis/codex/status.js +2 -0
  310. package/clis/coingecko/categories.js +75 -0
  311. package/clis/coingecko/coin.js +107 -0
  312. package/clis/coingecko/coingecko.test.js +109 -0
  313. package/clis/coingecko/derivatives.js +84 -0
  314. package/clis/coingecko/exchanges.js +74 -0
  315. package/clis/coingecko/global.js +71 -0
  316. package/clis/coingecko/top.js +64 -0
  317. package/clis/coingecko/trending.js +55 -0
  318. package/clis/confluence/commands.test.js +195 -0
  319. package/clis/confluence/create.js +39 -0
  320. package/clis/confluence/page.js +23 -0
  321. package/clis/confluence/search.js +34 -0
  322. package/clis/confluence/shared.js +173 -0
  323. package/clis/confluence/update.js +38 -0
  324. package/clis/coupang/add-to-cart.js +149 -0
  325. package/clis/coupang/auth.js +48 -0
  326. package/clis/coupang/coupang.test.js +159 -0
  327. package/clis/coupang/product.js +257 -0
  328. package/clis/coupang/search.js +474 -0
  329. package/clis/coupang/utils.js +316 -0
  330. package/clis/coupang/utils.test.js +62 -0
  331. package/clis/crates/crate.js +62 -0
  332. package/clis/crates/search.js +44 -0
  333. package/clis/crates/utils.js +72 -0
  334. package/clis/ctrip/auth.js +50 -0
  335. package/clis/ctrip/ctrip.test.js +719 -0
  336. package/clis/ctrip/flight.js +136 -0
  337. package/clis/ctrip/hotel-search.js +132 -0
  338. package/clis/ctrip/hotel-suggest.js +45 -0
  339. package/clis/ctrip/search.js +41 -0
  340. package/clis/ctrip/utils.js +473 -0
  341. package/clis/cursor/ask.js +74 -0
  342. package/clis/cursor/composer.js +43 -0
  343. package/clis/cursor/dump.js +2 -0
  344. package/clis/cursor/export.js +52 -0
  345. package/clis/cursor/extract-code.js +36 -0
  346. package/clis/cursor/history.js +44 -0
  347. package/clis/cursor/model.js +54 -0
  348. package/clis/cursor/new.js +2 -0
  349. package/clis/cursor/read.js +45 -0
  350. package/clis/cursor/screenshot.js +2 -0
  351. package/clis/cursor/send.js +41 -0
  352. package/clis/cursor/status.js +2 -0
  353. package/clis/dblp/author.js +133 -0
  354. package/clis/dblp/dblp.test.js +397 -0
  355. package/clis/dblp/paper.js +40 -0
  356. package/clis/dblp/search.js +45 -0
  357. package/clis/dblp/utils.js +290 -0
  358. package/clis/dblp/venue.js +64 -0
  359. package/clis/deepseek/ask.js +158 -0
  360. package/clis/deepseek/ask.test.js +399 -0
  361. package/clis/deepseek/auth.js +54 -0
  362. package/clis/deepseek/detail.js +46 -0
  363. package/clis/deepseek/detail.test.js +81 -0
  364. package/clis/deepseek/history.js +27 -0
  365. package/clis/deepseek/new.js +33 -0
  366. package/clis/deepseek/read.js +25 -0
  367. package/clis/deepseek/send.js +140 -0
  368. package/clis/deepseek/send.test.js +107 -0
  369. package/clis/deepseek/status.js +26 -0
  370. package/clis/deepseek/utils.js +487 -0
  371. package/clis/deepseek/utils.test.js +370 -0
  372. package/clis/defillama/defillama.test.js +99 -0
  373. package/clis/defillama/protocol.js +84 -0
  374. package/clis/defillama/protocols.js +55 -0
  375. package/clis/defillama/utils.js +99 -0
  376. package/clis/devto/devto.test.js +236 -0
  377. package/clis/devto/latest.js +74 -0
  378. package/clis/devto/read.js +103 -0
  379. package/clis/devto/tag.js +36 -0
  380. package/clis/devto/top.js +30 -0
  381. package/clis/devto/user.js +35 -0
  382. package/clis/dianping/__fixtures__/search.html +168 -0
  383. package/clis/dianping/__fixtures__/shop.html +6 -0
  384. package/clis/dianping/auth.js +49 -0
  385. package/clis/dianping/cityResolver.js +185 -0
  386. package/clis/dianping/dianping.test.js +578 -0
  387. package/clis/dianping/search.js +157 -0
  388. package/clis/dianping/shop.js +173 -0
  389. package/clis/dianping/utils.js +157 -0
  390. package/clis/dictionary/examples.js +28 -0
  391. package/clis/dictionary/search.js +30 -0
  392. package/clis/dictionary/synonyms.js +28 -0
  393. package/clis/discord-app/channels.js +26 -0
  394. package/clis/discord-app/commands.test.js +395 -0
  395. package/clis/discord-app/delete.js +115 -0
  396. package/clis/discord-app/goto.js +38 -0
  397. package/clis/discord-app/members.js +39 -0
  398. package/clis/discord-app/read.js +42 -0
  399. package/clis/discord-app/search.js +67 -0
  400. package/clis/discord-app/send.js +28 -0
  401. package/clis/discord-app/servers.js +26 -0
  402. package/clis/discord-app/status.js +17 -0
  403. package/clis/discord-app/thread-read.js +45 -0
  404. package/clis/discord-app/threads.js +37 -0
  405. package/clis/discord-app/utils.js +610 -0
  406. package/clis/dockerhub/image.js +52 -0
  407. package/clis/dockerhub/search.js +47 -0
  408. package/clis/dockerhub/utils.js +100 -0
  409. package/clis/dongchedi/__fixtures__/search.json +60 -0
  410. package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
  411. package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
  412. package/clis/dongchedi/dongchedi.test.js +191 -0
  413. package/clis/dongchedi/koubei.js +85 -0
  414. package/clis/dongchedi/models.js +91 -0
  415. package/clis/dongchedi/score.js +83 -0
  416. package/clis/dongchedi/search.js +83 -0
  417. package/clis/dongchedi/series.js +87 -0
  418. package/clis/dongchedi/specs.js +115 -0
  419. package/clis/dongchedi/utils.js +180 -0
  420. package/clis/douban/auth.js +50 -0
  421. package/clis/douban/book-hot.js +15 -0
  422. package/clis/douban/download.js +68 -0
  423. package/clis/douban/download.test.js +170 -0
  424. package/clis/douban/marks.js +116 -0
  425. package/clis/douban/movie-hot.js +15 -0
  426. package/clis/douban/movie-hot.test.js +14 -0
  427. package/clis/douban/photos.js +35 -0
  428. package/clis/douban/reviews.js +107 -0
  429. package/clis/douban/search.js +18 -0
  430. package/clis/douban/search.test.js +11 -0
  431. package/clis/douban/subject.js +46 -0
  432. package/clis/douban/subject.test.js +11 -0
  433. package/clis/douban/top250.js +68 -0
  434. package/clis/douban/utils.js +657 -0
  435. package/clis/douban/utils.test.js +488 -0
  436. package/clis/doubao/ask.js +40 -0
  437. package/clis/doubao/auth.js +66 -0
  438. package/clis/doubao/detail.js +35 -0
  439. package/clis/doubao/detail.test.js +42 -0
  440. package/clis/doubao/history.js +30 -0
  441. package/clis/doubao/history.test.js +37 -0
  442. package/clis/doubao/meeting-summary.js +41 -0
  443. package/clis/doubao/meeting-transcript.js +38 -0
  444. package/clis/doubao/new.js +22 -0
  445. package/clis/doubao/read.js +21 -0
  446. package/clis/doubao/send.js +24 -0
  447. package/clis/doubao/status.js +26 -0
  448. package/clis/doubao/utils.js +1156 -0
  449. package/clis/doubao/utils.test.js +396 -0
  450. package/clis/doubao-app/ask.js +54 -0
  451. package/clis/doubao-app/dump.js +25 -0
  452. package/clis/doubao-app/new.js +21 -0
  453. package/clis/doubao-app/read.js +19 -0
  454. package/clis/doubao-app/screenshot.js +19 -0
  455. package/clis/doubao-app/send.js +28 -0
  456. package/clis/doubao-app/status.js +17 -0
  457. package/clis/doubao-app/utils.js +110 -0
  458. package/clis/douyin/_shared/browser-fetch.js +66 -0
  459. package/clis/douyin/_shared/browser-fetch.test.js +64 -0
  460. package/clis/douyin/_shared/creation-id.js +5 -0
  461. package/clis/douyin/_shared/creation-id.test.js +22 -0
  462. package/clis/douyin/_shared/evaluate-result.js +16 -0
  463. package/clis/douyin/_shared/imagex-upload.js +53 -0
  464. package/clis/douyin/_shared/imagex-upload.test.js +87 -0
  465. package/clis/douyin/_shared/public-api.js +29 -0
  466. package/clis/douyin/_shared/sts2.js +21 -0
  467. package/clis/douyin/_shared/sts2.test.js +27 -0
  468. package/clis/douyin/_shared/text-extra.js +15 -0
  469. package/clis/douyin/_shared/text-extra.test.js +37 -0
  470. package/clis/douyin/_shared/timing.js +22 -0
  471. package/clis/douyin/_shared/timing.test.js +28 -0
  472. package/clis/douyin/_shared/tos-upload-short-read.test.js +83 -0
  473. package/clis/douyin/_shared/tos-upload.js +331 -0
  474. package/clis/douyin/_shared/tos-upload.test.js +229 -0
  475. package/clis/douyin/_shared/transcode.js +45 -0
  476. package/clis/douyin/_shared/transcode.test.js +91 -0
  477. package/clis/douyin/_shared/types.js +1 -0
  478. package/clis/douyin/_shared/vod-upload.js +212 -0
  479. package/clis/douyin/_shared/vod-upload.test.js +38 -0
  480. package/clis/douyin/activities.js +23 -0
  481. package/clis/douyin/activities.test.js +55 -0
  482. package/clis/douyin/auth.js +39 -0
  483. package/clis/douyin/collections.js +23 -0
  484. package/clis/douyin/collections.test.js +45 -0
  485. package/clis/douyin/delete.js +152 -0
  486. package/clis/douyin/delete.test.js +100 -0
  487. package/clis/douyin/draft.js +355 -0
  488. package/clis/douyin/draft.test.js +335 -0
  489. package/clis/douyin/drafts.js +24 -0
  490. package/clis/douyin/drafts.test.js +11 -0
  491. package/clis/douyin/hashtag.js +114 -0
  492. package/clis/douyin/hashtag.test.js +171 -0
  493. package/clis/douyin/location.js +25 -0
  494. package/clis/douyin/location.test.js +23 -0
  495. package/clis/douyin/profile.js +29 -0
  496. package/clis/douyin/profile.test.js +46 -0
  497. package/clis/douyin/publish-upload-id.test.js +206 -0
  498. package/clis/douyin/publish.js +341 -0
  499. package/clis/douyin/publish.test.js +38 -0
  500. package/clis/douyin/search.js +308 -0
  501. package/clis/douyin/search.test.js +307 -0
  502. package/clis/douyin/stats.js +28 -0
  503. package/clis/douyin/stats.test.js +22 -0
  504. package/clis/douyin/update.js +32 -0
  505. package/clis/douyin/update.test.js +11 -0
  506. package/clis/douyin/user-videos.js +82 -0
  507. package/clis/douyin/user-videos.test.js +151 -0
  508. package/clis/douyin/videos.js +52 -0
  509. package/clis/douyin/videos.test.js +54 -0
  510. package/clis/duckduckgo/search.js +131 -0
  511. package/clis/duckduckgo/search.test.js +128 -0
  512. package/clis/duckduckgo/suggest.js +45 -0
  513. package/clis/duckduckgo/suggest.test.js +66 -0
  514. package/clis/eastmoney/_secid.js +78 -0
  515. package/clis/eastmoney/announcement.js +53 -0
  516. package/clis/eastmoney/convertible.js +74 -0
  517. package/clis/eastmoney/etf.js +66 -0
  518. package/clis/eastmoney/holders.js +79 -0
  519. package/clis/eastmoney/hot-rank.js +51 -0
  520. package/clis/eastmoney/hot-rank.test.js +59 -0
  521. package/clis/eastmoney/index-board.js +97 -0
  522. package/clis/eastmoney/kline.js +88 -0
  523. package/clis/eastmoney/kuaixun.js +55 -0
  524. package/clis/eastmoney/longhu.js +68 -0
  525. package/clis/eastmoney/money-flow.js +79 -0
  526. package/clis/eastmoney/northbound.js +58 -0
  527. package/clis/eastmoney/quote.js +108 -0
  528. package/clis/eastmoney/rank.js +95 -0
  529. package/clis/eastmoney/sectors.js +77 -0
  530. package/clis/endoflife/endoflife.test.js +51 -0
  531. package/clis/endoflife/product.js +55 -0
  532. package/clis/endoflife/utils.js +89 -0
  533. package/clis/facebook/__fixtures__/notifications-page.html +13 -0
  534. package/clis/facebook/add-friend.js +44 -0
  535. package/clis/facebook/auth.js +43 -0
  536. package/clis/facebook/events.js +41 -0
  537. package/clis/facebook/feed.js +305 -0
  538. package/clis/facebook/feed.test.js +169 -0
  539. package/clis/facebook/friends.js +39 -0
  540. package/clis/facebook/groups.js +47 -0
  541. package/clis/facebook/join-group.js +45 -0
  542. package/clis/facebook/marketplace-inbox.js +84 -0
  543. package/clis/facebook/marketplace-listings.js +84 -0
  544. package/clis/facebook/marketplace.test.js +91 -0
  545. package/clis/facebook/memories.js +36 -0
  546. package/clis/facebook/notifications.js +333 -0
  547. package/clis/facebook/notifications.test.js +458 -0
  548. package/clis/facebook/profile.js +38 -0
  549. package/clis/facebook/search.js +39 -0
  550. package/clis/facebook/search.test.js +55 -0
  551. package/clis/flathub/app.js +71 -0
  552. package/clis/flathub/flathub.test.js +90 -0
  553. package/clis/flathub/search.js +80 -0
  554. package/clis/flathub/utils.js +114 -0
  555. package/clis/flomo/auth.js +55 -0
  556. package/clis/flomo/memos.js +228 -0
  557. package/clis/flomo/memos.test.js +144 -0
  558. package/clis/gemini/ask.js +51 -0
  559. package/clis/gemini/ask.test.js +100 -0
  560. package/clis/gemini/auth.js +48 -0
  561. package/clis/gemini/commands.test.js +212 -0
  562. package/clis/gemini/deep-research-result.js +96 -0
  563. package/clis/gemini/deep-research-result.test.js +155 -0
  564. package/clis/gemini/deep-research.js +103 -0
  565. package/clis/gemini/deep-research.test.js +181 -0
  566. package/clis/gemini/detail.js +82 -0
  567. package/clis/gemini/history.js +70 -0
  568. package/clis/gemini/image.js +111 -0
  569. package/clis/gemini/new.js +22 -0
  570. package/clis/gemini/read.js +36 -0
  571. package/clis/gemini/reply-state.test.js +671 -0
  572. package/clis/gemini/status.js +32 -0
  573. package/clis/gemini/utils.js +2056 -0
  574. package/clis/gemini/utils.test.js +392 -0
  575. package/clis/geogebra/add-circle.js +46 -0
  576. package/clis/geogebra/add-line.js +35 -0
  577. package/clis/geogebra/add-point.js +27 -0
  578. package/clis/geogebra/add-polygon.js +25 -0
  579. package/clis/geogebra/eval.js +35 -0
  580. package/clis/geogebra/geogebra.test.js +175 -0
  581. package/clis/geogebra/hexagon.js +62 -0
  582. package/clis/geogebra/info.js +72 -0
  583. package/clis/geogebra/list.js +35 -0
  584. package/clis/geogebra/triangle.js +60 -0
  585. package/clis/geogebra/utils.js +271 -0
  586. package/clis/gitee/auth.js +41 -0
  587. package/clis/gitee/index.js +3 -0
  588. package/clis/gitee/search.js +137 -0
  589. package/clis/gitee/search.test.js +65 -0
  590. package/clis/gitee/trending.js +568 -0
  591. package/clis/gitee/user.js +200 -0
  592. package/clis/gitee/user.test.js +63 -0
  593. package/clis/github/auth.js +44 -0
  594. package/clis/github-trending/repos.js +168 -0
  595. package/clis/github-trending/repos.test.js +149 -0
  596. package/clis/google/news.js +59 -0
  597. package/clis/google/search.js +138 -0
  598. package/clis/google/suggest.js +35 -0
  599. package/clis/google/trends.js +39 -0
  600. package/clis/google/utils.js +23 -0
  601. package/clis/google/utils.test.js +75 -0
  602. package/clis/google-scholar/cite.js +74 -0
  603. package/clis/google-scholar/cite.test.js +47 -0
  604. package/clis/google-scholar/profile.js +92 -0
  605. package/clis/google-scholar/profile.test.js +49 -0
  606. package/clis/google-scholar/search.js +73 -0
  607. package/clis/google-scholar/search.test.js +71 -0
  608. package/clis/goproxy/goproxy.test.js +103 -0
  609. package/clis/goproxy/module.js +47 -0
  610. package/clis/goproxy/utils.js +165 -0
  611. package/clis/goproxy/versions.js +59 -0
  612. package/clis/gov-law/commands.test.js +39 -0
  613. package/clis/gov-law/recent.js +22 -0
  614. package/clis/gov-law/search.js +41 -0
  615. package/clis/gov-law/shared.js +51 -0
  616. package/clis/gov-policy/__fixtures__/recent.html +16 -0
  617. package/clis/gov-policy/__fixtures__/search.html +41 -0
  618. package/clis/gov-policy/gov-policy.test.js +224 -0
  619. package/clis/gov-policy/recent.js +90 -0
  620. package/clis/gov-policy/search.js +91 -0
  621. package/clis/gov-policy/utils.js +54 -0
  622. package/clis/grok/ask.js +77 -0
  623. package/clis/grok/ask.test.js +29 -0
  624. package/clis/grok/auth.js +52 -0
  625. package/clis/grok/delete.js +54 -0
  626. package/clis/grok/detail.js +60 -0
  627. package/clis/grok/export-all.js +409 -0
  628. package/clis/grok/export-utils.js +94 -0
  629. package/clis/grok/export.js +189 -0
  630. package/clis/grok/export.test.js +210 -0
  631. package/clis/grok/history.js +48 -0
  632. package/clis/grok/image.js +343 -0
  633. package/clis/grok/image.test.ts +127 -0
  634. package/clis/grok/new.js +20 -0
  635. package/clis/grok/pin.js +68 -0
  636. package/clis/grok/read.js +39 -0
  637. package/clis/grok/send.js +50 -0
  638. package/clis/grok/status.js +41 -0
  639. package/clis/grok/utils.js +640 -0
  640. package/clis/grok/utils.test.js +141 -0
  641. package/clis/guazi/__fixtures__/detail.html +7 -0
  642. package/clis/guazi/__fixtures__/list.html +5 -0
  643. package/clis/guazi/browse.js +95 -0
  644. package/clis/guazi/car.js +110 -0
  645. package/clis/guazi/guazi.test.js +126 -0
  646. package/clis/guazi/utils.js +133 -0
  647. package/clis/hackernews/ask.js +31 -0
  648. package/clis/hackernews/best.js +31 -0
  649. package/clis/hackernews/hackernews.test.js +132 -0
  650. package/clis/hackernews/jobs.js +29 -0
  651. package/clis/hackernews/new.js +31 -0
  652. package/clis/hackernews/read.js +188 -0
  653. package/clis/hackernews/search.js +38 -0
  654. package/clis/hackernews/show.js +31 -0
  655. package/clis/hackernews/top.js +31 -0
  656. package/clis/hackernews/user.js +23 -0
  657. package/clis/hf/auth.js +41 -0
  658. package/clis/hf/datasets.js +88 -0
  659. package/clis/hf/hf.test.js +16 -0
  660. package/clis/hf/models.js +91 -0
  661. package/clis/hf/paper.js +79 -0
  662. package/clis/hf/spaces.js +101 -0
  663. package/clis/hf/top.js +121 -0
  664. package/clis/homebrew/cask.js +39 -0
  665. package/clis/homebrew/formula.js +41 -0
  666. package/clis/homebrew/popular.js +54 -0
  667. package/clis/homebrew/utils.js +100 -0
  668. package/clis/huodongxing/events.js +322 -0
  669. package/clis/huodongxing/events.test.js +296 -0
  670. package/clis/hupu/__fixtures__/hot-home.html +64 -0
  671. package/clis/hupu/auth.js +47 -0
  672. package/clis/hupu/detail.js +72 -0
  673. package/clis/hupu/hot.js +163 -0
  674. package/clis/hupu/hot.test.js +224 -0
  675. package/clis/hupu/like.js +76 -0
  676. package/clis/hupu/mentions.js +160 -0
  677. package/clis/hupu/reply.js +72 -0
  678. package/clis/hupu/search.js +60 -0
  679. package/clis/hupu/unlike.js +76 -0
  680. package/clis/hupu/utils.js +319 -0
  681. package/clis/imdb/person.js +204 -0
  682. package/clis/imdb/reviews.js +89 -0
  683. package/clis/imdb/search.js +162 -0
  684. package/clis/imdb/title.js +94 -0
  685. package/clis/imdb/top.js +54 -0
  686. package/clis/imdb/trending.js +53 -0
  687. package/clis/imdb/utils.js +285 -0
  688. package/clis/imdb/utils.test.js +88 -0
  689. package/clis/indeed/indeed.test.js +375 -0
  690. package/clis/indeed/job.js +86 -0
  691. package/clis/indeed/search.js +110 -0
  692. package/clis/indeed/utils.js +152 -0
  693. package/clis/instagram/_shared/private-publish.js +1030 -0
  694. package/clis/instagram/_shared/private-publish.test.js +705 -0
  695. package/clis/instagram/_shared/protocol-capture.js +282 -0
  696. package/clis/instagram/_shared/protocol-capture.test.js +114 -0
  697. package/clis/instagram/_shared/runtime-info.js +81 -0
  698. package/clis/instagram/auth.js +57 -0
  699. package/clis/instagram/collection-create.js +58 -0
  700. package/clis/instagram/collection-delete.js +92 -0
  701. package/clis/instagram/comment.js +48 -0
  702. package/clis/instagram/download.js +226 -0
  703. package/clis/instagram/download.test.js +118 -0
  704. package/clis/instagram/explore.js +42 -0
  705. package/clis/instagram/follow.js +44 -0
  706. package/clis/instagram/followers.js +46 -0
  707. package/clis/instagram/following.js +90 -0
  708. package/clis/instagram/instagram.test.js +381 -0
  709. package/clis/instagram/like.js +46 -0
  710. package/clis/instagram/note.js +223 -0
  711. package/clis/instagram/note.test.js +53 -0
  712. package/clis/instagram/post.js +1497 -0
  713. package/clis/instagram/post.test.js +1647 -0
  714. package/clis/instagram/profile.js +40 -0
  715. package/clis/instagram/reel.js +827 -0
  716. package/clis/instagram/reel.test.js +167 -0
  717. package/clis/instagram/save.js +46 -0
  718. package/clis/instagram/saved.js +53 -0
  719. package/clis/instagram/search.js +39 -0
  720. package/clis/instagram/story.js +116 -0
  721. package/clis/instagram/story.test.js +134 -0
  722. package/clis/instagram/unfollow.js +41 -0
  723. package/clis/instagram/unlike.js +46 -0
  724. package/clis/instagram/unsave.js +46 -0
  725. package/clis/instagram/user.js +49 -0
  726. package/clis/jd/add-cart.js +72 -0
  727. package/clis/jd/auth.js +46 -0
  728. package/clis/jd/cart.js +80 -0
  729. package/clis/jd/commands.test.js +41 -0
  730. package/clis/jd/detail.js +63 -0
  731. package/clis/jd/item.js +730 -0
  732. package/clis/jd/item.test.js +354 -0
  733. package/clis/jd/item.test.ts +517 -0
  734. package/clis/jd/reviews.js +55 -0
  735. package/clis/jd/search.js +66 -0
  736. package/clis/jianyu/auth.js +62 -0
  737. package/clis/jianyu/detail.js +21 -0
  738. package/clis/jianyu/search.js +634 -0
  739. package/clis/jianyu/search.test.js +153 -0
  740. package/clis/jianyu/shared/china-bid-search.js +165 -0
  741. package/clis/jianyu/shared/procurement-contract.js +324 -0
  742. package/clis/jianyu/shared/procurement-contract.test.js +72 -0
  743. package/clis/jianyu/shared/procurement-detail.js +107 -0
  744. package/clis/jianyu/shared/procurement-detail.test.js +84 -0
  745. package/clis/jike/auth.js +48 -0
  746. package/clis/jike/comment.js +107 -0
  747. package/clis/jike/create.js +106 -0
  748. package/clis/jike/feed.js +68 -0
  749. package/clis/jike/like.js +61 -0
  750. package/clis/jike/notifications.js +169 -0
  751. package/clis/jike/post.js +72 -0
  752. package/clis/jike/read.test.js +86 -0
  753. package/clis/jike/repost.js +103 -0
  754. package/clis/jike/search.js +68 -0
  755. package/clis/jike/topic.js +65 -0
  756. package/clis/jike/user.js +65 -0
  757. package/clis/jike/utils.js +25 -0
  758. package/clis/jimeng/auth.js +46 -0
  759. package/clis/jimeng/generate.js +84 -0
  760. package/clis/jimeng/history.js +48 -0
  761. package/clis/jimeng/new.js +44 -0
  762. package/clis/jimeng/workspaces.js +42 -0
  763. package/clis/jira/attachments.js +28 -0
  764. package/clis/jira/commands.test.js +287 -0
  765. package/clis/jira/comments.js +28 -0
  766. package/clis/jira/issue.js +28 -0
  767. package/clis/jira/links.js +28 -0
  768. package/clis/jira/search.js +47 -0
  769. package/clis/jira/shared.js +256 -0
  770. package/clis/juejin/hot.js +37 -0
  771. package/clis/juejin/juejin.test.js +241 -0
  772. package/clis/juejin/recommend.js +61 -0
  773. package/clis/juejin/utils.js +199 -0
  774. package/clis/ke/auth.js +46 -0
  775. package/clis/ke/chengjiao.js +78 -0
  776. package/clis/ke/ershoufang.js +101 -0
  777. package/clis/ke/utils.js +104 -0
  778. package/clis/ke/xiaoqu.js +78 -0
  779. package/clis/ke/zufang.js +95 -0
  780. package/clis/kimi/_utils.js +110 -0
  781. package/clis/kimi/audit-extras.js +268 -0
  782. package/clis/kimi/auth.js +57 -0
  783. package/clis/kimi/chat.js +470 -0
  784. package/clis/kimi/kimi.test.js +187 -0
  785. package/clis/kimi/storage.js +169 -0
  786. package/clis/kimi/ui.js +314 -0
  787. package/clis/kimi/usage.js +144 -0
  788. package/clis/lesswrong/_helpers.js +75 -0
  789. package/clis/lesswrong/comments.js +65 -0
  790. package/clis/lesswrong/curated.js +31 -0
  791. package/clis/lesswrong/frontpage.js +31 -0
  792. package/clis/lesswrong/frontpage.test.js +37 -0
  793. package/clis/lesswrong/new.js +31 -0
  794. package/clis/lesswrong/read.js +46 -0
  795. package/clis/lesswrong/sequences.js +28 -0
  796. package/clis/lesswrong/shortform.js +31 -0
  797. package/clis/lesswrong/tag.js +46 -0
  798. package/clis/lesswrong/tags.js +28 -0
  799. package/clis/lesswrong/top-month.js +31 -0
  800. package/clis/lesswrong/top-week.js +31 -0
  801. package/clis/lesswrong/top-year.js +31 -0
  802. package/clis/lesswrong/top.js +31 -0
  803. package/clis/lesswrong/user-posts.js +42 -0
  804. package/clis/lesswrong/user.js +45 -0
  805. package/clis/lichess/lichess.test.js +85 -0
  806. package/clis/lichess/top.js +46 -0
  807. package/clis/lichess/user.js +91 -0
  808. package/clis/lichess/utils.js +97 -0
  809. package/clis/linkedin/auth.js +62 -0
  810. package/clis/linkedin/connect.js +524 -0
  811. package/clis/linkedin/connect.test.js +328 -0
  812. package/clis/linkedin/inbox.js +234 -0
  813. package/clis/linkedin/inbox.test.js +152 -0
  814. package/clis/linkedin/job-detail.js +167 -0
  815. package/clis/linkedin/job-detail.test.js +38 -0
  816. package/clis/linkedin/jobs-preferences.js +113 -0
  817. package/clis/linkedin/jobs-preferences.test.js +43 -0
  818. package/clis/linkedin/people-search.js +262 -0
  819. package/clis/linkedin/people-search.test.js +216 -0
  820. package/clis/linkedin/post-analytics.js +74 -0
  821. package/clis/linkedin/post-analytics.test.js +40 -0
  822. package/clis/linkedin/posts-core.js +241 -0
  823. package/clis/linkedin/posts.js +22 -0
  824. package/clis/linkedin/posts.test.js +40 -0
  825. package/clis/linkedin/profile-analytics.js +104 -0
  826. package/clis/linkedin/profile-analytics.test.js +67 -0
  827. package/clis/linkedin/profile-experience.js +671 -0
  828. package/clis/linkedin/profile-experience.test.js +152 -0
  829. package/clis/linkedin/profile-projects.js +311 -0
  830. package/clis/linkedin/profile-projects.test.js +111 -0
  831. package/clis/linkedin/profile-read.js +148 -0
  832. package/clis/linkedin/profile-read.test.js +77 -0
  833. package/clis/linkedin/safe-send.js +357 -0
  834. package/clis/linkedin/safe-send.test.js +204 -0
  835. package/clis/linkedin/salesnav-inbox.js +210 -0
  836. package/clis/linkedin/salesnav-inbox.test.js +113 -0
  837. package/clis/linkedin/salesnav-message.js +360 -0
  838. package/clis/linkedin/salesnav-message.test.js +172 -0
  839. package/clis/linkedin/salesnav-search.js +186 -0
  840. package/clis/linkedin/salesnav-search.test.js +76 -0
  841. package/clis/linkedin/salesnav-thread.js +212 -0
  842. package/clis/linkedin/salesnav-thread.test.js +79 -0
  843. package/clis/linkedin/search.js +462 -0
  844. package/clis/linkedin/search.test.js +222 -0
  845. package/clis/linkedin/sent-invitations.js +92 -0
  846. package/clis/linkedin/sent-invitations.test.js +62 -0
  847. package/clis/linkedin/services-read.js +213 -0
  848. package/clis/linkedin/services-read.test.js +105 -0
  849. package/clis/linkedin/shared.js +124 -0
  850. package/clis/linkedin/thread-snapshot.js +214 -0
  851. package/clis/linkedin/thread-snapshot.test.js +89 -0
  852. package/clis/linkedin/timeline.js +511 -0
  853. package/clis/linkedin/timeline.test.js +81 -0
  854. package/clis/linkedin-learning/auth.js +62 -0
  855. package/clis/linkedin-learning/course.js +138 -0
  856. package/clis/linkedin-learning/course.test.js +114 -0
  857. package/clis/linkedin-learning/search.js +155 -0
  858. package/clis/linkedin-learning/search.test.js +144 -0
  859. package/clis/linkedin-learning/trending.js +133 -0
  860. package/clis/linkedin-learning/trending.test.js +123 -0
  861. package/clis/linux-do/auth.js +55 -0
  862. package/clis/linux-do/categories.js +50 -0
  863. package/clis/linux-do/feed.js +395 -0
  864. package/clis/linux-do/feed.test.js +153 -0
  865. package/clis/linux-do/search.js +29 -0
  866. package/clis/linux-do/tags.js +28 -0
  867. package/clis/linux-do/topic-content.js +155 -0
  868. package/clis/linux-do/topic-content.test.js +59 -0
  869. package/clis/linux-do/topic.js +53 -0
  870. package/clis/linux-do/user-posts.js +57 -0
  871. package/clis/linux-do/user-topics.js +37 -0
  872. package/clis/lobsters/active.js +29 -0
  873. package/clis/lobsters/domain.js +92 -0
  874. package/clis/lobsters/hot.js +29 -0
  875. package/clis/lobsters/lobsters.test.js +169 -0
  876. package/clis/lobsters/newest.js +29 -0
  877. package/clis/lobsters/read.js +196 -0
  878. package/clis/lobsters/tag.js +35 -0
  879. package/clis/maimai/auth.js +47 -0
  880. package/clis/maimai/search-talents.js +192 -0
  881. package/clis/maimai/search-talents.test.js +29 -0
  882. package/clis/manus/_utils.js +133 -0
  883. package/clis/manus/auth.js +54 -0
  884. package/clis/manus/connectors.js +40 -0
  885. package/clis/manus/credits.js +39 -0
  886. package/clis/manus/list.js +66 -0
  887. package/clis/manus/manus.test.js +382 -0
  888. package/clis/manus/read.js +63 -0
  889. package/clis/manus/skills.js +61 -0
  890. package/clis/manus/status.js +43 -0
  891. package/clis/maven/artifact.js +49 -0
  892. package/clis/maven/search.js +51 -0
  893. package/clis/maven/utils.js +110 -0
  894. package/clis/mdn/search.js +97 -0
  895. package/clis/medium/feed.js +16 -0
  896. package/clis/medium/search.js +16 -0
  897. package/clis/medium/tag.js +135 -0
  898. package/clis/medium/user.js +16 -0
  899. package/clis/medium/utils.js +79 -0
  900. package/clis/mubu/doc.js +41 -0
  901. package/clis/mubu/docs.js +44 -0
  902. package/clis/mubu/notes.js +245 -0
  903. package/clis/mubu/recent.js +28 -0
  904. package/clis/mubu/search.js +63 -0
  905. package/clis/mubu/utils.js +304 -0
  906. package/clis/notebooklm/add-source.js +269 -0
  907. package/clis/notebooklm/add-source.test.js +97 -0
  908. package/clis/notebooklm/auth.js +55 -0
  909. package/clis/notebooklm/compat.test.js +16 -0
  910. package/clis/notebooklm/create.js +76 -0
  911. package/clis/notebooklm/create.test.js +58 -0
  912. package/clis/notebooklm/current.js +28 -0
  913. package/clis/notebooklm/generate-audio.js +91 -0
  914. package/clis/notebooklm/generate-audio.test.js +63 -0
  915. package/clis/notebooklm/generate-slides.js +106 -0
  916. package/clis/notebooklm/generate-slides.test.js +75 -0
  917. package/clis/notebooklm/get.js +37 -0
  918. package/clis/notebooklm/history.js +25 -0
  919. package/clis/notebooklm/history.test.js +58 -0
  920. package/clis/notebooklm/list.js +36 -0
  921. package/clis/notebooklm/note-list.js +28 -0
  922. package/clis/notebooklm/note-list.test.js +56 -0
  923. package/clis/notebooklm/notes-get.js +47 -0
  924. package/clis/notebooklm/notes-get.test.js +72 -0
  925. package/clis/notebooklm/open.js +42 -0
  926. package/clis/notebooklm/open.test.js +63 -0
  927. package/clis/notebooklm/rpc.js +203 -0
  928. package/clis/notebooklm/rpc.test.js +131 -0
  929. package/clis/notebooklm/shared.js +3 -0
  930. package/clis/notebooklm/source-fulltext.js +44 -0
  931. package/clis/notebooklm/source-fulltext.test.js +106 -0
  932. package/clis/notebooklm/source-get.js +40 -0
  933. package/clis/notebooklm/source-get.test.js +84 -0
  934. package/clis/notebooklm/source-guide.js +44 -0
  935. package/clis/notebooklm/source-guide.test.js +104 -0
  936. package/clis/notebooklm/source-list.js +30 -0
  937. package/clis/notebooklm/status.js +31 -0
  938. package/clis/notebooklm/summary.js +30 -0
  939. package/clis/notebooklm/summary.test.js +78 -0
  940. package/clis/notebooklm/utils.js +814 -0
  941. package/clis/notebooklm/utils.test.js +449 -0
  942. package/clis/notebooklm/write-note.js +103 -0
  943. package/clis/notebooklm/write-note.test.js +70 -0
  944. package/clis/nowcoder/auth.js +65 -0
  945. package/clis/nowcoder/companies.js +24 -0
  946. package/clis/nowcoder/creators.js +28 -0
  947. package/clis/nowcoder/detail.js +62 -0
  948. package/clis/nowcoder/experience.js +37 -0
  949. package/clis/nowcoder/hot.js +25 -0
  950. package/clis/nowcoder/jobs.js +22 -0
  951. package/clis/nowcoder/notifications.js +30 -0
  952. package/clis/nowcoder/papers.js +41 -0
  953. package/clis/nowcoder/practice.js +38 -0
  954. package/clis/nowcoder/recommend.js +31 -0
  955. package/clis/nowcoder/referral.js +40 -0
  956. package/clis/nowcoder/salary.js +41 -0
  957. package/clis/nowcoder/search.js +50 -0
  958. package/clis/nowcoder/suggest.js +34 -0
  959. package/clis/nowcoder/topics.js +28 -0
  960. package/clis/nowcoder/trending.js +26 -0
  961. package/clis/npm/downloads.js +59 -0
  962. package/clis/npm/package.js +70 -0
  963. package/clis/npm/search.js +49 -0
  964. package/clis/npm/utils.js +76 -0
  965. package/clis/nuget/nuget.test.js +111 -0
  966. package/clis/nuget/package.js +101 -0
  967. package/clis/nuget/search.js +69 -0
  968. package/clis/nuget/utils.js +87 -0
  969. package/clis/nvd/cve.js +121 -0
  970. package/clis/oeis/oeis.test.js +88 -0
  971. package/clis/oeis/search.js +63 -0
  972. package/clis/oeis/sequence.js +71 -0
  973. package/clis/oeis/utils.js +88 -0
  974. package/clis/ones/common.js +144 -0
  975. package/clis/ones/enrich-tasks.js +37 -0
  976. package/clis/ones/login.js +81 -0
  977. package/clis/ones/logout.js +18 -0
  978. package/clis/ones/me.js +31 -0
  979. package/clis/ones/my-tasks.js +121 -0
  980. package/clis/ones/resolve-labels.js +64 -0
  981. package/clis/ones/task-helpers.js +212 -0
  982. package/clis/ones/task-helpers.test.js +12 -0
  983. package/clis/ones/task.js +67 -0
  984. package/clis/ones/tasks.js +80 -0
  985. package/clis/ones/token-info.js +43 -0
  986. package/clis/ones/worklog.js +268 -0
  987. package/clis/ones/worklog.test.js +20 -0
  988. package/clis/openalex/search.js +69 -0
  989. package/clis/openalex/utils.js +160 -0
  990. package/clis/openalex/work.js +65 -0
  991. package/clis/openfda/drug-label.js +74 -0
  992. package/clis/openfda/food-recall.js +65 -0
  993. package/clis/openfda/openfda.test.js +114 -0
  994. package/clis/openfda/utils.js +67 -0
  995. package/clis/openreview/author.js +58 -0
  996. package/clis/openreview/openreview.test.js +427 -0
  997. package/clis/openreview/paper.js +43 -0
  998. package/clis/openreview/reviews.js +131 -0
  999. package/clis/openreview/search.js +46 -0
  1000. package/clis/openreview/utils.js +172 -0
  1001. package/clis/openreview/venue.js +63 -0
  1002. package/clis/osv/osv.test.js +97 -0
  1003. package/clis/osv/query.js +72 -0
  1004. package/clis/osv/utils.js +169 -0
  1005. package/clis/osv/vulnerability.js +54 -0
  1006. package/clis/packagist/package.js +49 -0
  1007. package/clis/packagist/search.js +43 -0
  1008. package/clis/packagist/utils.js +113 -0
  1009. package/clis/paperreview/commands.test.js +243 -0
  1010. package/clis/paperreview/feedback.js +53 -0
  1011. package/clis/paperreview/review.js +38 -0
  1012. package/clis/paperreview/submit.js +86 -0
  1013. package/clis/paperreview/utils.js +197 -0
  1014. package/clis/paperreview/utils.test.js +49 -0
  1015. package/clis/pixiv/auth.js +64 -0
  1016. package/clis/pixiv/detail.js +66 -0
  1017. package/clis/pixiv/detail.test.js +93 -0
  1018. package/clis/pixiv/download.js +82 -0
  1019. package/clis/pixiv/download.test.js +97 -0
  1020. package/clis/pixiv/illusts.js +66 -0
  1021. package/clis/pixiv/illusts.test.js +99 -0
  1022. package/clis/pixiv/ranking.js +60 -0
  1023. package/clis/pixiv/search.js +44 -0
  1024. package/clis/pixiv/search.test.js +83 -0
  1025. package/clis/pixiv/user.js +59 -0
  1026. package/clis/pixiv/user.test.js +100 -0
  1027. package/clis/pixiv/utils.js +98 -0
  1028. package/clis/powerchina/auth.js +52 -0
  1029. package/clis/powerchina/search.js +251 -0
  1030. package/clis/powerchina/search.test.js +93 -0
  1031. package/clis/producthunt/browse.js +100 -0
  1032. package/clis/producthunt/hot.js +111 -0
  1033. package/clis/producthunt/posts.js +29 -0
  1034. package/clis/producthunt/today.js +36 -0
  1035. package/clis/producthunt/utils.js +99 -0
  1036. package/clis/producthunt/utils.test.js +64 -0
  1037. package/clis/pubmed/article.js +55 -0
  1038. package/clis/pubmed/author.js +64 -0
  1039. package/clis/pubmed/citations.js +36 -0
  1040. package/clis/pubmed/clinical-trial.js +59 -0
  1041. package/clis/pubmed/journal.js +59 -0
  1042. package/clis/pubmed/mesh.js +47 -0
  1043. package/clis/pubmed/pubmed.test.js +464 -0
  1044. package/clis/pubmed/related.js +45 -0
  1045. package/clis/pubmed/review.js +58 -0
  1046. package/clis/pubmed/search.js +75 -0
  1047. package/clis/pubmed/utils.js +325 -0
  1048. package/clis/pypi/downloads.js +66 -0
  1049. package/clis/pypi/package.js +79 -0
  1050. package/clis/pypi/utils.js +55 -0
  1051. package/clis/qoder/_utils.js +191 -0
  1052. package/clis/qoder/composer.js +45 -0
  1053. package/clis/qoder/history.js +49 -0
  1054. package/clis/qoder/qoder.test.js +125 -0
  1055. package/clis/qoder/quest.js +147 -0
  1056. package/clis/qoder/read.js +29 -0
  1057. package/clis/qoder/status.js +21 -0
  1058. package/clis/qoder/ui.js +332 -0
  1059. package/clis/quark/auth.js +47 -0
  1060. package/clis/quark/ls.js +64 -0
  1061. package/clis/quark/mkdir.js +37 -0
  1062. package/clis/quark/mv.js +54 -0
  1063. package/clis/quark/rename.js +27 -0
  1064. package/clis/quark/rm.js +25 -0
  1065. package/clis/quark/save.js +81 -0
  1066. package/clis/quark/share-tree.js +46 -0
  1067. package/clis/quark/utils.js +146 -0
  1068. package/clis/quark/utils.test.js +58 -0
  1069. package/clis/qwen/ask.js +104 -0
  1070. package/clis/qwen/ask.test.js +36 -0
  1071. package/clis/qwen/auth.js +56 -0
  1072. package/clis/qwen/detail.js +62 -0
  1073. package/clis/qwen/history.js +61 -0
  1074. package/clis/qwen/image.js +179 -0
  1075. package/clis/qwen/new.js +23 -0
  1076. package/clis/qwen/read.js +41 -0
  1077. package/clis/qwen/send.js +55 -0
  1078. package/clis/qwen/status.js +37 -0
  1079. package/clis/qwen/utils.js +461 -0
  1080. package/clis/qwen/utils.test.js +128 -0
  1081. package/clis/reddit/auth.js +52 -0
  1082. package/clis/reddit/comment.js +58 -0
  1083. package/clis/reddit/extract-media.test.js +149 -0
  1084. package/clis/reddit/frontpage.js +70 -0
  1085. package/clis/reddit/frontpage.test.js +34 -0
  1086. package/clis/reddit/home.js +146 -0
  1087. package/clis/reddit/home.test.js +170 -0
  1088. package/clis/reddit/hot.js +81 -0
  1089. package/clis/reddit/hot.test.js +32 -0
  1090. package/clis/reddit/popular.js +79 -0
  1091. package/clis/reddit/popular.test.js +26 -0
  1092. package/clis/reddit/read.js +588 -0
  1093. package/clis/reddit/read.test.js +402 -0
  1094. package/clis/reddit/reply.js +182 -0
  1095. package/clis/reddit/reply.test.js +89 -0
  1096. package/clis/reddit/save.js +52 -0
  1097. package/clis/reddit/saved.js +50 -0
  1098. package/clis/reddit/search.js +102 -0
  1099. package/clis/reddit/search.test.js +26 -0
  1100. package/clis/reddit/subreddit-info.js +116 -0
  1101. package/clis/reddit/subreddit-info.test.js +163 -0
  1102. package/clis/reddit/subreddit.js +97 -0
  1103. package/clis/reddit/subreddit.test.js +31 -0
  1104. package/clis/reddit/subscribe.js +51 -0
  1105. package/clis/reddit/subscribed.js +165 -0
  1106. package/clis/reddit/subscribed.test.js +168 -0
  1107. package/clis/reddit/upvote.js +65 -0
  1108. package/clis/reddit/upvoted.js +50 -0
  1109. package/clis/reddit/user-comments.js +45 -0
  1110. package/clis/reddit/user-posts.js +43 -0
  1111. package/clis/reddit/user.js +38 -0
  1112. package/clis/reddit/whoami.js +83 -0
  1113. package/clis/reddit/whoami.test.js +105 -0
  1114. package/clis/rednote/auth.js +52 -0
  1115. package/clis/rednote/comments.js +85 -0
  1116. package/clis/rednote/download.js +59 -0
  1117. package/clis/rednote/feed.js +27 -0
  1118. package/clis/rednote/navigation.test.js +26 -0
  1119. package/clis/rednote/note.js +68 -0
  1120. package/clis/rednote/notifications.js +139 -0
  1121. package/clis/rednote/rednote.test.js +240 -0
  1122. package/clis/rednote/search.js +107 -0
  1123. package/clis/rednote/user.js +55 -0
  1124. package/clis/rest-countries/country.js +65 -0
  1125. package/clis/rest-countries/region.js +64 -0
  1126. package/clis/rest-countries/rest-countries.test.js +83 -0
  1127. package/clis/rest-countries/utils.js +126 -0
  1128. package/clis/reuters/article-detail.js +53 -0
  1129. package/clis/reuters/auth.js +67 -0
  1130. package/clis/reuters/reuters.test.js +299 -0
  1131. package/clis/reuters/search.js +63 -0
  1132. package/clis/reuters/utils.js +159 -0
  1133. package/clis/rfc/rfc.js +52 -0
  1134. package/clis/rfc/rfc.test.js +74 -0
  1135. package/clis/rfc/utils.js +72 -0
  1136. package/clis/rubygems/gem.js +42 -0
  1137. package/clis/rubygems/search.js +47 -0
  1138. package/clis/rubygems/utils.js +86 -0
  1139. package/clis/semanticscholar/citations.js +61 -0
  1140. package/clis/semanticscholar/paper.js +52 -0
  1141. package/clis/semanticscholar/recommendations.js +47 -0
  1142. package/clis/semanticscholar/search.js +48 -0
  1143. package/clis/semanticscholar/semanticscholar.test.js +279 -0
  1144. package/clis/semanticscholar/utils.js +196 -0
  1145. package/clis/sinablog/article.js +15 -0
  1146. package/clis/sinablog/hot.js +15 -0
  1147. package/clis/sinablog/search.js +52 -0
  1148. package/clis/sinablog/user.js +16 -0
  1149. package/clis/sinablog/utils.js +186 -0
  1150. package/clis/sinafinance/news.js +62 -0
  1151. package/clis/sinafinance/rolling-news.js +41 -0
  1152. package/clis/sinafinance/stock-rank.js +66 -0
  1153. package/clis/sinafinance/stock.js +121 -0
  1154. package/clis/sinafinance/stock.test.js +59 -0
  1155. package/clis/slock/api-base-canary.test.js +62 -0
  1156. package/clis/slock/attachment-download.js +72 -0
  1157. package/clis/slock/attachment-download.test.js +102 -0
  1158. package/clis/slock/attachment-upload.js +112 -0
  1159. package/clis/slock/attachment-upload.test.js +131 -0
  1160. package/clis/slock/attachment-url.js +53 -0
  1161. package/clis/slock/attachment-url.test.js +41 -0
  1162. package/clis/slock/auth-verify.js +19 -0
  1163. package/clis/slock/bookmark-add.js +43 -0
  1164. package/clis/slock/bookmark-add.test.js +38 -0
  1165. package/clis/slock/bookmark-list.js +50 -0
  1166. package/clis/slock/bookmark-list.test.js +47 -0
  1167. package/clis/slock/bookmark-remove.js +42 -0
  1168. package/clis/slock/bookmark-remove.test.js +24 -0
  1169. package/clis/slock/channel-action.js +63 -0
  1170. package/clis/slock/channel-action.test.js +65 -0
  1171. package/clis/slock/channel-archive.js +9 -0
  1172. package/clis/slock/channel-create.js +48 -0
  1173. package/clis/slock/channel-create.test.js +40 -0
  1174. package/clis/slock/channel-files.js +51 -0
  1175. package/clis/slock/channel-files.test.js +32 -0
  1176. package/clis/slock/channel-info.js +42 -0
  1177. package/clis/slock/channel-info.test.js +25 -0
  1178. package/clis/slock/channel-join.js +9 -0
  1179. package/clis/slock/channel-leave.js +9 -0
  1180. package/clis/slock/channel-list.js +40 -0
  1181. package/clis/slock/channel-list.test.js +37 -0
  1182. package/clis/slock/channel-mark.js +71 -0
  1183. package/clis/slock/channel-mark.test.js +49 -0
  1184. package/clis/slock/channel-members.js +64 -0
  1185. package/clis/slock/channel-members.test.js +44 -0
  1186. package/clis/slock/channel-unarchive.js +11 -0
  1187. package/clis/slock/cross-command.test.js +21 -0
  1188. package/clis/slock/dm-list.js +41 -0
  1189. package/clis/slock/dm-list.test.js +26 -0
  1190. package/clis/slock/error-detail-canary.test.js +144 -0
  1191. package/clis/slock/errors.js +30 -0
  1192. package/clis/slock/errors.test.js +29 -0
  1193. package/clis/slock/in-page.js +213 -0
  1194. package/clis/slock/in-page.test.js +362 -0
  1195. package/clis/slock/inbox-done.js +40 -0
  1196. package/clis/slock/inbox-done.test.js +21 -0
  1197. package/clis/slock/inbox-read-all.js +32 -0
  1198. package/clis/slock/inbox-read-all.test.js +20 -0
  1199. package/clis/slock/inbox.js +74 -0
  1200. package/clis/slock/inbox.test.js +46 -0
  1201. package/clis/slock/login.js +3 -0
  1202. package/clis/slock/message-read.js +168 -0
  1203. package/clis/slock/message-read.test.js +83 -0
  1204. package/clis/slock/message-search.js +72 -0
  1205. package/clis/slock/message-search.test.js +61 -0
  1206. package/clis/slock/message-send.js +149 -0
  1207. package/clis/slock/message-send.test.js +127 -0
  1208. package/clis/slock/reaction-add.js +42 -0
  1209. package/clis/slock/reaction-add.test.js +36 -0
  1210. package/clis/slock/reaction-remove.js +42 -0
  1211. package/clis/slock/reaction-remove.test.js +29 -0
  1212. package/clis/slock/resolve.js +74 -0
  1213. package/clis/slock/resolve.test.js +102 -0
  1214. package/clis/slock/server-list.js +38 -0
  1215. package/clis/slock/server-list.test.js +24 -0
  1216. package/clis/slock/server-override-canary.test.js +87 -0
  1217. package/clis/slock/server-use.js +53 -0
  1218. package/clis/slock/server-use.test.js +48 -0
  1219. package/clis/slock/shared.js +14 -0
  1220. package/clis/slock/short-id-canary.test.js +86 -0
  1221. package/clis/slock/site-session-canary.test.js +49 -0
  1222. package/clis/slock/task-claim.js +72 -0
  1223. package/clis/slock/task-claim.test.js +81 -0
  1224. package/clis/slock/task-convert.js +106 -0
  1225. package/clis/slock/task-convert.test.js +82 -0
  1226. package/clis/slock/task-create.js +82 -0
  1227. package/clis/slock/task-create.test.js +65 -0
  1228. package/clis/slock/task-delete.js +55 -0
  1229. package/clis/slock/task-delete.test.js +52 -0
  1230. package/clis/slock/task-get.js +59 -0
  1231. package/clis/slock/task-get.test.js +45 -0
  1232. package/clis/slock/task-list-server.js +63 -0
  1233. package/clis/slock/task-list-server.test.js +48 -0
  1234. package/clis/slock/task-list.js +70 -0
  1235. package/clis/slock/task-list.test.js +59 -0
  1236. package/clis/slock/task-status.js +93 -0
  1237. package/clis/slock/task-status.test.js +76 -0
  1238. package/clis/slock/task-unclaim.js +66 -0
  1239. package/clis/slock/task-unclaim.test.js +49 -0
  1240. package/clis/slock/thread-done.js +9 -0
  1241. package/clis/slock/thread-follow.js +46 -0
  1242. package/clis/slock/thread-follow.test.js +34 -0
  1243. package/clis/slock/thread-list.js +44 -0
  1244. package/clis/slock/thread-list.test.js +24 -0
  1245. package/clis/slock/thread-state.js +45 -0
  1246. package/clis/slock/thread-state.test.js +38 -0
  1247. package/clis/slock/thread-undone.js +9 -0
  1248. package/clis/slock/thread-unfollow.js +9 -0
  1249. package/clis/slock/unread-summary.js +49 -0
  1250. package/clis/slock/unread-summary.test.js +31 -0
  1251. package/clis/slock/whoami.js +12 -0
  1252. package/clis/slock/whoami.test.js +23 -0
  1253. package/clis/smzdm/search.js +149 -0
  1254. package/clis/smzdm/search.test.js +114 -0
  1255. package/clis/spotify/spotify.js +327 -0
  1256. package/clis/spotify/utils.js +66 -0
  1257. package/clis/spotify/utils.test.js +67 -0
  1258. package/clis/stackoverflow/bounties.js +35 -0
  1259. package/clis/stackoverflow/hot.js +32 -0
  1260. package/clis/stackoverflow/read.js +314 -0
  1261. package/clis/stackoverflow/related.js +66 -0
  1262. package/clis/stackoverflow/search.js +35 -0
  1263. package/clis/stackoverflow/stackoverflow.test.js +404 -0
  1264. package/clis/stackoverflow/tag.js +60 -0
  1265. package/clis/stackoverflow/unanswered.js +33 -0
  1266. package/clis/stackoverflow/user.js +50 -0
  1267. package/clis/stackoverflow/utils.js +118 -0
  1268. package/clis/steam/app.js +67 -0
  1269. package/clis/steam/search.js +58 -0
  1270. package/clis/steam/steam.test.js +46 -0
  1271. package/clis/steam/top-sellers.js +26 -0
  1272. package/clis/steam/utils.js +107 -0
  1273. package/clis/substack/feed.js +16 -0
  1274. package/clis/substack/publication.js +16 -0
  1275. package/clis/substack/search.js +79 -0
  1276. package/clis/substack/utils.js +136 -0
  1277. package/clis/substack/utils.test.js +44 -0
  1278. package/clis/suno/auth.js +63 -0
  1279. package/clis/suno/commands.test.js +188 -0
  1280. package/clis/suno/download.js +140 -0
  1281. package/clis/suno/download.test.js +151 -0
  1282. package/clis/suno/generate.js +231 -0
  1283. package/clis/suno/generate.test.js +252 -0
  1284. package/clis/suno/list.js +79 -0
  1285. package/clis/suno/status.js +63 -0
  1286. package/clis/suno/utils.js +549 -0
  1287. package/clis/suno/utils.test.js +329 -0
  1288. package/clis/taobao/add-cart.js +150 -0
  1289. package/clis/taobao/auth.js +58 -0
  1290. package/clis/taobao/cart.js +96 -0
  1291. package/clis/taobao/commands.test.js +41 -0
  1292. package/clis/taobao/detail.js +71 -0
  1293. package/clis/taobao/reviews.js +77 -0
  1294. package/clis/taobao/search.js +97 -0
  1295. package/clis/tdx/hot-rank.js +48 -0
  1296. package/clis/tdx/hot-rank.test.js +59 -0
  1297. package/clis/test-utils.js +61 -0
  1298. package/clis/ths/hot-rank.js +50 -0
  1299. package/clis/ths/hot-rank.test.js +64 -0
  1300. package/clis/tieba/commands.test.js +79 -0
  1301. package/clis/tieba/hot.js +48 -0
  1302. package/clis/tieba/posts.js +86 -0
  1303. package/clis/tieba/read.js +141 -0
  1304. package/clis/tieba/search.js +109 -0
  1305. package/clis/tieba/utils.js +240 -0
  1306. package/clis/tieba/utils.test.js +290 -0
  1307. package/clis/tiktok/auth.js +65 -0
  1308. package/clis/tiktok/comment.js +145 -0
  1309. package/clis/tiktok/creator-videos.js +270 -0
  1310. package/clis/tiktok/creator-videos.test.js +113 -0
  1311. package/clis/tiktok/explore.js +144 -0
  1312. package/clis/tiktok/follow.js +122 -0
  1313. package/clis/tiktok/following.js +164 -0
  1314. package/clis/tiktok/friends.js +146 -0
  1315. package/clis/tiktok/like.js +34 -0
  1316. package/clis/tiktok/live.js +144 -0
  1317. package/clis/tiktok/notifications.js +153 -0
  1318. package/clis/tiktok/profile.js +55 -0
  1319. package/clis/tiktok/refactor.test.js +389 -0
  1320. package/clis/tiktok/save.js +30 -0
  1321. package/clis/tiktok/search.js +40 -0
  1322. package/clis/tiktok/unfollow.js +131 -0
  1323. package/clis/tiktok/unlike.js +34 -0
  1324. package/clis/tiktok/unsave.js +32 -0
  1325. package/clis/tiktok/user.js +216 -0
  1326. package/clis/tiktok/utils.js +505 -0
  1327. package/clis/tiktok/write-refactor.test.js +370 -0
  1328. package/clis/toutiao/articles.js +55 -0
  1329. package/clis/toutiao/auth.js +70 -0
  1330. package/clis/toutiao/hot.js +63 -0
  1331. package/clis/toutiao/toutiao.test.js +378 -0
  1332. package/clis/toutiao/utils.js +161 -0
  1333. package/clis/trae-cn/activity.js +22 -0
  1334. package/clis/trae-cn/approve.js +52 -0
  1335. package/clis/trae-cn/ask.js +99 -0
  1336. package/clis/trae-cn/dump.js +5 -0
  1337. package/clis/trae-cn/export.js +40 -0
  1338. package/clis/trae-cn/model.js +22 -0
  1339. package/clis/trae-cn/new.js +63 -0
  1340. package/clis/trae-cn/read.js +23 -0
  1341. package/clis/trae-cn/screenshot.js +5 -0
  1342. package/clis/trae-cn/select-model.js +25 -0
  1343. package/clis/trae-cn/send.js +23 -0
  1344. package/clis/trae-cn/setup.js +75 -0
  1345. package/clis/trae-cn/status.js +27 -0
  1346. package/clis/trae-cn/targets.js +96 -0
  1347. package/clis/trae-cn/trae-cn.test.js +412 -0
  1348. package/clis/trae-cn/utils.js +750 -0
  1349. package/clis/trae-cn/watch.js +119 -0
  1350. package/clis/trae-solo/_actions.js +60 -0
  1351. package/clis/trae-solo/_fs.js +118 -0
  1352. package/clis/trae-solo/_state.js +111 -0
  1353. package/clis/trae-solo/automation.js +97 -0
  1354. package/clis/trae-solo/history.js +54 -0
  1355. package/clis/trae-solo/mode.js +81 -0
  1356. package/clis/trae-solo/model.js +134 -0
  1357. package/clis/trae-solo/renderer-storage.js +170 -0
  1358. package/clis/trae-solo/settings.js +54 -0
  1359. package/clis/trae-solo/skill-fs.js +123 -0
  1360. package/clis/trae-solo/skill.js +220 -0
  1361. package/clis/trae-solo/state-fs.js +156 -0
  1362. package/clis/trae-solo/status.js +2 -0
  1363. package/clis/trae-solo/task-fs.js +181 -0
  1364. package/clis/trae-solo/trae-solo.test.js +67 -0
  1365. package/clis/trae-solo/user-rules.js +29 -0
  1366. package/clis/trae-solo/workspaces-fs.js +113 -0
  1367. package/clis/tvmaze/search.js +61 -0
  1368. package/clis/tvmaze/show.js +60 -0
  1369. package/clis/tvmaze/tvmaze.test.js +93 -0
  1370. package/clis/tvmaze/utils.js +110 -0
  1371. package/clis/twitter/accept.js +204 -0
  1372. package/clis/twitter/article.js +170 -0
  1373. package/clis/twitter/auth.js +41 -0
  1374. package/clis/twitter/block.js +90 -0
  1375. package/clis/twitter/bookmark-folder.js +190 -0
  1376. package/clis/twitter/bookmark-folder.test.js +396 -0
  1377. package/clis/twitter/bookmark-folders.js +114 -0
  1378. package/clis/twitter/bookmark-folders.test.js +152 -0
  1379. package/clis/twitter/bookmark.js +74 -0
  1380. package/clis/twitter/bookmark.test.js +74 -0
  1381. package/clis/twitter/bookmarks.js +181 -0
  1382. package/clis/twitter/bookmarks.test.js +206 -0
  1383. package/clis/twitter/delete.js +85 -0
  1384. package/clis/twitter/delete.test.js +85 -0
  1385. package/clis/twitter/device-follow.js +194 -0
  1386. package/clis/twitter/device-follow.test.js +287 -0
  1387. package/clis/twitter/download.js +481 -0
  1388. package/clis/twitter/download.test.js +457 -0
  1389. package/clis/twitter/follow-batch.js +162 -0
  1390. package/clis/twitter/follow-batch.test.js +137 -0
  1391. package/clis/twitter/follow.js +67 -0
  1392. package/clis/twitter/followers.js +193 -0
  1393. package/clis/twitter/followers.test.js +62 -0
  1394. package/clis/twitter/following.js +274 -0
  1395. package/clis/twitter/following.test.js +359 -0
  1396. package/clis/twitter/hide-reply.js +87 -0
  1397. package/clis/twitter/hide-reply.test.js +76 -0
  1398. package/clis/twitter/like.js +80 -0
  1399. package/clis/twitter/like.test.js +73 -0
  1400. package/clis/twitter/likes.js +241 -0
  1401. package/clis/twitter/likes.test.js +220 -0
  1402. package/clis/twitter/list-add-batch.js +32 -0
  1403. package/clis/twitter/list-add-core.js +245 -0
  1404. package/clis/twitter/list-add.js +20 -0
  1405. package/clis/twitter/list-add.test.js +133 -0
  1406. package/clis/twitter/list-batch-utils.js +95 -0
  1407. package/clis/twitter/list-batch.test.js +113 -0
  1408. package/clis/twitter/list-create.js +155 -0
  1409. package/clis/twitter/list-create.test.js +169 -0
  1410. package/clis/twitter/list-delete.js +158 -0
  1411. package/clis/twitter/list-delete.test.js +102 -0
  1412. package/clis/twitter/list-remove-batch.js +32 -0
  1413. package/clis/twitter/list-remove-core.js +291 -0
  1414. package/clis/twitter/list-remove.js +20 -0
  1415. package/clis/twitter/list-remove.test.js +147 -0
  1416. package/clis/twitter/list-tweets.js +199 -0
  1417. package/clis/twitter/list-tweets.test.js +198 -0
  1418. package/clis/twitter/lists.js +178 -0
  1419. package/clis/twitter/lists.test.js +253 -0
  1420. package/clis/twitter/notifications.js +128 -0
  1421. package/clis/twitter/post.js +316 -0
  1422. package/clis/twitter/post.test.js +275 -0
  1423. package/clis/twitter/profile.js +174 -0
  1424. package/clis/twitter/profile.test.js +150 -0
  1425. package/clis/twitter/quote.js +172 -0
  1426. package/clis/twitter/quote.test.js +194 -0
  1427. package/clis/twitter/reply-dm.js +183 -0
  1428. package/clis/twitter/reply.js +248 -0
  1429. package/clis/twitter/reply.test.js +237 -0
  1430. package/clis/twitter/retweet.js +94 -0
  1431. package/clis/twitter/retweet.test.js +73 -0
  1432. package/clis/twitter/search.js +346 -0
  1433. package/clis/twitter/search.test.js +400 -0
  1434. package/clis/twitter/shared.js +564 -0
  1435. package/clis/twitter/shared.test.js +1012 -0
  1436. package/clis/twitter/thread.js +164 -0
  1437. package/clis/twitter/thread.test.js +58 -0
  1438. package/clis/twitter/timeline.js +211 -0
  1439. package/clis/twitter/timeline.test.js +104 -0
  1440. package/clis/twitter/trending.js +58 -0
  1441. package/clis/twitter/trending.test.js +15 -0
  1442. package/clis/twitter/tweets.js +314 -0
  1443. package/clis/twitter/tweets.test.js +362 -0
  1444. package/clis/twitter/unblock.js +73 -0
  1445. package/clis/twitter/unbookmark.js +71 -0
  1446. package/clis/twitter/unbookmark.test.js +73 -0
  1447. package/clis/twitter/unfollow.js +73 -0
  1448. package/clis/twitter/unlike.js +80 -0
  1449. package/clis/twitter/unlike.test.js +75 -0
  1450. package/clis/twitter/unretweet.js +94 -0
  1451. package/clis/twitter/unretweet.test.js +73 -0
  1452. package/clis/twitter/utils.js +323 -0
  1453. package/clis/twitter/utils.test.js +169 -0
  1454. package/clis/uisdc/news.js +105 -0
  1455. package/clis/uisdc/news.test.js +66 -0
  1456. package/clis/uiverse/_shared.js +427 -0
  1457. package/clis/uiverse/_shared.test.js +62 -0
  1458. package/clis/uiverse/code.js +49 -0
  1459. package/clis/uiverse/navigation.test.js +12 -0
  1460. package/clis/uiverse/preview.js +73 -0
  1461. package/clis/upwork/auth.js +53 -0
  1462. package/clis/upwork/detail.js +132 -0
  1463. package/clis/upwork/feed.js +109 -0
  1464. package/clis/upwork/search.js +115 -0
  1465. package/clis/upwork/upwork.test.js +566 -0
  1466. package/clis/upwork/utils.js +323 -0
  1467. package/clis/v2ex/auth.js +44 -0
  1468. package/clis/v2ex/daily.js +99 -0
  1469. package/clis/v2ex/hot.js +26 -0
  1470. package/clis/v2ex/latest.js +26 -0
  1471. package/clis/v2ex/me.js +100 -0
  1472. package/clis/v2ex/member.js +28 -0
  1473. package/clis/v2ex/node.js +39 -0
  1474. package/clis/v2ex/nodes.js +26 -0
  1475. package/clis/v2ex/notifications.js +72 -0
  1476. package/clis/v2ex/replies.js +27 -0
  1477. package/clis/v2ex/topic.js +31 -0
  1478. package/clis/v2ex/user.js +34 -0
  1479. package/clis/wanfang/search.js +66 -0
  1480. package/clis/wanfang/search.test.js +23 -0
  1481. package/clis/web/read.js +491 -0
  1482. package/clis/web/read.test.js +392 -0
  1483. package/clis/wechat-channels/auth.js +62 -0
  1484. package/clis/wechat-channels/publish.js +732 -0
  1485. package/clis/wechat-channels/publish.test.js +144 -0
  1486. package/clis/weibo/auth.js +53 -0
  1487. package/clis/weibo/comments.js +53 -0
  1488. package/clis/weibo/delete.js +172 -0
  1489. package/clis/weibo/delete.test.js +94 -0
  1490. package/clis/weibo/envelope.test.js +85 -0
  1491. package/clis/weibo/favorites.js +170 -0
  1492. package/clis/weibo/favorites.test.js +114 -0
  1493. package/clis/weibo/feed.js +69 -0
  1494. package/clis/weibo/hot.js +39 -0
  1495. package/clis/weibo/me.js +75 -0
  1496. package/clis/weibo/post.js +75 -0
  1497. package/clis/weibo/publish.js +306 -0
  1498. package/clis/weibo/publish.test.js +192 -0
  1499. package/clis/weibo/search.js +80 -0
  1500. package/clis/weibo/user-posts.js +234 -0
  1501. package/clis/weibo/user-posts.test.js +92 -0
  1502. package/clis/weibo/user.js +63 -0
  1503. package/clis/weibo/utils.js +59 -0
  1504. package/clis/weibo/utils.test.js +36 -0
  1505. package/clis/weixin/create-draft.js +226 -0
  1506. package/clis/weixin/download.js +371 -0
  1507. package/clis/weixin/download.test.js +106 -0
  1508. package/clis/weixin/drafts.js +66 -0
  1509. package/clis/weixin/drafts.test.js +69 -0
  1510. package/clis/weixin/search.js +157 -0
  1511. package/clis/weixin/search.test.js +227 -0
  1512. package/clis/weread/ai-outline.js +171 -0
  1513. package/clis/weread/ai-outline.test.js +83 -0
  1514. package/clis/weread/auth.js +59 -0
  1515. package/clis/weread/book-search.js +438 -0
  1516. package/clis/weread/book-search.test.js +242 -0
  1517. package/clis/weread/book.js +233 -0
  1518. package/clis/weread/commands.test.js +398 -0
  1519. package/clis/weread/highlights.js +24 -0
  1520. package/clis/weread/notebooks.js +22 -0
  1521. package/clis/weread/notes.js +30 -0
  1522. package/clis/weread/private-api-regression.test.js +369 -0
  1523. package/clis/weread/ranking.js +29 -0
  1524. package/clis/weread/search-regression.test.js +494 -0
  1525. package/clis/weread/search.js +186 -0
  1526. package/clis/weread/shelf.js +66 -0
  1527. package/clis/weread/utils.js +321 -0
  1528. package/clis/weread/utils.test.js +128 -0
  1529. package/clis/weread-official/book.js +135 -0
  1530. package/clis/weread-official/commands.test.js +385 -0
  1531. package/clis/weread-official/discover.js +107 -0
  1532. package/clis/weread-official/list-apis.js +95 -0
  1533. package/clis/weread-official/notes.js +171 -0
  1534. package/clis/weread-official/readdata.js +158 -0
  1535. package/clis/weread-official/review.js +93 -0
  1536. package/clis/weread-official/search.js +106 -0
  1537. package/clis/weread-official/shelf.js +97 -0
  1538. package/clis/weread-official/utils.js +293 -0
  1539. package/clis/weread-official/utils.test.js +242 -0
  1540. package/clis/wikidata/entity.js +60 -0
  1541. package/clis/wikidata/search.js +50 -0
  1542. package/clis/wikidata/utils.js +117 -0
  1543. package/clis/wikidata/wikidata.test.js +83 -0
  1544. package/clis/wikipedia/page.js +95 -0
  1545. package/clis/wikipedia/random.js +20 -0
  1546. package/clis/wikipedia/search.js +31 -0
  1547. package/clis/wikipedia/summary.js +24 -0
  1548. package/clis/wikipedia/trending.js +40 -0
  1549. package/clis/wikipedia/trending.test.js +57 -0
  1550. package/clis/wikipedia/utils.js +31 -0
  1551. package/clis/wttr/current.js +63 -0
  1552. package/clis/wttr/forecast.js +71 -0
  1553. package/clis/wttr/utils.js +50 -0
  1554. package/clis/wttr/wttr.test.js +84 -0
  1555. package/clis/xianyu/auth.js +68 -0
  1556. package/clis/xianyu/chat.js +74 -0
  1557. package/clis/xianyu/chat.test.js +84 -0
  1558. package/clis/xianyu/im.js +322 -0
  1559. package/clis/xianyu/im.test.js +253 -0
  1560. package/clis/xianyu/inbox.js +96 -0
  1561. package/clis/xianyu/item.js +153 -0
  1562. package/clis/xianyu/item.test.js +56 -0
  1563. package/clis/xianyu/messages.js +91 -0
  1564. package/clis/xianyu/publish.js +485 -0
  1565. package/clis/xianyu/publish.test.js +220 -0
  1566. package/clis/xianyu/reply.js +82 -0
  1567. package/clis/xianyu/search.js +135 -0
  1568. package/clis/xianyu/search.test.js +17 -0
  1569. package/clis/xianyu/utils.js +8 -0
  1570. package/clis/xiaoe/auth.js +55 -0
  1571. package/clis/xiaoe/catalog.js +227 -0
  1572. package/clis/xiaoe/content.js +175 -0
  1573. package/clis/xiaoe/courses.js +127 -0
  1574. package/clis/xiaoe/detail.js +36 -0
  1575. package/clis/xiaoe/play-url.js +121 -0
  1576. package/clis/xiaoe/xiaoe.test.js +486 -0
  1577. package/clis/xiaohongshu/ask.js +426 -0
  1578. package/clis/xiaohongshu/ask.test.js +271 -0
  1579. package/clis/xiaohongshu/auth.js +53 -0
  1580. package/clis/xiaohongshu/collection-helpers.js +283 -0
  1581. package/clis/xiaohongshu/collection-helpers.test.js +125 -0
  1582. package/clis/xiaohongshu/comments.js +228 -0
  1583. package/clis/xiaohongshu/comments.test.js +320 -0
  1584. package/clis/xiaohongshu/creator-note-detail.js +482 -0
  1585. package/clis/xiaohongshu/creator-note-detail.test.js +451 -0
  1586. package/clis/xiaohongshu/creator-notes-summary.js +98 -0
  1587. package/clis/xiaohongshu/creator-notes-summary.test.js +94 -0
  1588. package/clis/xiaohongshu/creator-notes.js +479 -0
  1589. package/clis/xiaohongshu/creator-notes.test.js +281 -0
  1590. package/clis/xiaohongshu/creator-profile.js +55 -0
  1591. package/clis/xiaohongshu/creator-stats.js +76 -0
  1592. package/clis/xiaohongshu/creator-stats.test.js +24 -0
  1593. package/clis/xiaohongshu/delete-note.js +260 -0
  1594. package/clis/xiaohongshu/delete-note.test.js +172 -0
  1595. package/clis/xiaohongshu/download.js +249 -0
  1596. package/clis/xiaohongshu/download.test.js +339 -0
  1597. package/clis/xiaohongshu/draft-clear.js +91 -0
  1598. package/clis/xiaohongshu/draft-delete.js +103 -0
  1599. package/clis/xiaohongshu/draft-open.js +43 -0
  1600. package/clis/xiaohongshu/draft-utils.js +142 -0
  1601. package/clis/xiaohongshu/drafts.js +28 -0
  1602. package/clis/xiaohongshu/drafts.test.js +172 -0
  1603. package/clis/xiaohongshu/feed.js +163 -0
  1604. package/clis/xiaohongshu/feed.test.js +126 -0
  1605. package/clis/xiaohongshu/follow.js +226 -0
  1606. package/clis/xiaohongshu/follow.test.js +211 -0
  1607. package/clis/xiaohongshu/liked.js +29 -0
  1608. package/clis/xiaohongshu/liked.test.js +82 -0
  1609. package/clis/xiaohongshu/navigation.test.js +38 -0
  1610. package/clis/xiaohongshu/note-helpers.js +69 -0
  1611. package/clis/xiaohongshu/note.js +104 -0
  1612. package/clis/xiaohongshu/note.test.js +249 -0
  1613. package/clis/xiaohongshu/notifications.js +46 -0
  1614. package/clis/xiaohongshu/publish.js +1423 -0
  1615. package/clis/xiaohongshu/publish.test.js +1141 -0
  1616. package/clis/xiaohongshu/saved.js +29 -0
  1617. package/clis/xiaohongshu/saved.test.js +143 -0
  1618. package/clis/xiaohongshu/search.js +330 -0
  1619. package/clis/xiaohongshu/search.test.js +325 -0
  1620. package/clis/xiaohongshu/unfollow.js +285 -0
  1621. package/clis/xiaohongshu/user-helpers.js +78 -0
  1622. package/clis/xiaohongshu/user-helpers.test.js +160 -0
  1623. package/clis/xiaohongshu/user.js +140 -0
  1624. package/clis/xiaohongshu/user.test.js +141 -0
  1625. package/clis/xiaoyuzhou/auth.js +303 -0
  1626. package/clis/xiaoyuzhou/auth.test.js +124 -0
  1627. package/clis/xiaoyuzhou/download.js +54 -0
  1628. package/clis/xiaoyuzhou/download.test.js +135 -0
  1629. package/clis/xiaoyuzhou/episode.js +34 -0
  1630. package/clis/xiaoyuzhou/podcast-episodes.js +41 -0
  1631. package/clis/xiaoyuzhou/podcast-episodes.test.js +78 -0
  1632. package/clis/xiaoyuzhou/podcast.js +33 -0
  1633. package/clis/xiaoyuzhou/transcript.js +77 -0
  1634. package/clis/xiaoyuzhou/transcript.test.js +195 -0
  1635. package/clis/xiaoyuzhou/utils.js +15 -0
  1636. package/clis/xiaoyuzhou/utils.test.js +39 -0
  1637. package/clis/xueqiu/auth.js +63 -0
  1638. package/clis/xueqiu/comments.js +355 -0
  1639. package/clis/xueqiu/comments.test.js +696 -0
  1640. package/clis/xueqiu/danjuan-utils.js +126 -0
  1641. package/clis/xueqiu/danjuan-utils.test.js +41 -0
  1642. package/clis/xueqiu/earnings-date.js +45 -0
  1643. package/clis/xueqiu/feed.js +39 -0
  1644. package/clis/xueqiu/fund-holdings.js +29 -0
  1645. package/clis/xueqiu/fund-snapshot.js +26 -0
  1646. package/clis/xueqiu/groups.js +23 -0
  1647. package/clis/xueqiu/hot-stock.js +32 -0
  1648. package/clis/xueqiu/hot.js +37 -0
  1649. package/clis/xueqiu/kline.js +44 -0
  1650. package/clis/xueqiu/search.js +37 -0
  1651. package/clis/xueqiu/stock.js +65 -0
  1652. package/clis/xueqiu/utils.js +48 -0
  1653. package/clis/xueqiu/utils.test.js +26 -0
  1654. package/clis/xueqiu/watchlist.js +37 -0
  1655. package/clis/yahoo/search.js +92 -0
  1656. package/clis/yahoo/search.test.js +94 -0
  1657. package/clis/yahoo-finance/quote.js +74 -0
  1658. package/clis/yollomi/background.js +46 -0
  1659. package/clis/yollomi/edit.js +57 -0
  1660. package/clis/yollomi/face-swap.js +44 -0
  1661. package/clis/yollomi/generate.js +101 -0
  1662. package/clis/yollomi/models.js +34 -0
  1663. package/clis/yollomi/object-remover.js +43 -0
  1664. package/clis/yollomi/remove-bg.js +39 -0
  1665. package/clis/yollomi/restore.js +39 -0
  1666. package/clis/yollomi/try-on.js +47 -0
  1667. package/clis/yollomi/upload.js +72 -0
  1668. package/clis/yollomi/upscale.js +54 -0
  1669. package/clis/yollomi/utils.js +180 -0
  1670. package/clis/yollomi/video.js +57 -0
  1671. package/clis/youdao/note.js +258 -0
  1672. package/clis/youdao/note.test.js +99 -0
  1673. package/clis/youtube/auth.js +54 -0
  1674. package/clis/youtube/channel.js +227 -0
  1675. package/clis/youtube/channel.test.js +283 -0
  1676. package/clis/youtube/comments.js +96 -0
  1677. package/clis/youtube/feed.js +121 -0
  1678. package/clis/youtube/feed.test.js +131 -0
  1679. package/clis/youtube/history.js +119 -0
  1680. package/clis/youtube/like.js +67 -0
  1681. package/clis/youtube/playlist.js +98 -0
  1682. package/clis/youtube/search.js +100 -0
  1683. package/clis/youtube/subscribe.js +76 -0
  1684. package/clis/youtube/subscriptions.js +58 -0
  1685. package/clis/youtube/transcript-group.js +226 -0
  1686. package/clis/youtube/transcript-group.test.js +99 -0
  1687. package/clis/youtube/transcript.js +656 -0
  1688. package/clis/youtube/transcript.test.js +296 -0
  1689. package/clis/youtube/unlike.js +67 -0
  1690. package/clis/youtube/unsubscribe.js +76 -0
  1691. package/clis/youtube/utils.js +220 -0
  1692. package/clis/youtube/utils.test.js +84 -0
  1693. package/clis/youtube/video.js +152 -0
  1694. package/clis/youtube/video.test.js +111 -0
  1695. package/clis/youtube/watch-later.js +77 -0
  1696. package/clis/yuanbao/ask.js +362 -0
  1697. package/clis/yuanbao/ask.test.js +124 -0
  1698. package/clis/yuanbao/auth.js +59 -0
  1699. package/clis/yuanbao/detail.js +65 -0
  1700. package/clis/yuanbao/history.js +51 -0
  1701. package/clis/yuanbao/new.js +72 -0
  1702. package/clis/yuanbao/new.test.js +30 -0
  1703. package/clis/yuanbao/read.js +38 -0
  1704. package/clis/yuanbao/send.js +57 -0
  1705. package/clis/yuanbao/shared.js +341 -0
  1706. package/clis/yuanbao/shared.test.js +80 -0
  1707. package/clis/yuanbao/status.js +44 -0
  1708. package/clis/zhihu/answer-comments.js +280 -0
  1709. package/clis/zhihu/answer-comments.test.js +287 -0
  1710. package/clis/zhihu/answer-detail.js +216 -0
  1711. package/clis/zhihu/answer-detail.test.js +338 -0
  1712. package/clis/zhihu/answer.js +54 -0
  1713. package/clis/zhihu/answer.test.js +54 -0
  1714. package/clis/zhihu/auth.js +59 -0
  1715. package/clis/zhihu/collection.js +199 -0
  1716. package/clis/zhihu/collection.test.js +337 -0
  1717. package/clis/zhihu/collections.js +128 -0
  1718. package/clis/zhihu/collections.test.js +182 -0
  1719. package/clis/zhihu/comment.js +55 -0
  1720. package/clis/zhihu/comment.test.js +50 -0
  1721. package/clis/zhihu/download.js +80 -0
  1722. package/clis/zhihu/download.test.js +12 -0
  1723. package/clis/zhihu/favorite.js +87 -0
  1724. package/clis/zhihu/favorite.test.js +59 -0
  1725. package/clis/zhihu/follow.js +50 -0
  1726. package/clis/zhihu/follow.test.js +42 -0
  1727. package/clis/zhihu/followers.js +40 -0
  1728. package/clis/zhihu/followers.test.js +42 -0
  1729. package/clis/zhihu/following.js +40 -0
  1730. package/clis/zhihu/following.test.js +44 -0
  1731. package/clis/zhihu/hot.js +44 -0
  1732. package/clis/zhihu/like.js +47 -0
  1733. package/clis/zhihu/like.test.js +41 -0
  1734. package/clis/zhihu/paginate.js +128 -0
  1735. package/clis/zhihu/pins.js +41 -0
  1736. package/clis/zhihu/pins.test.js +44 -0
  1737. package/clis/zhihu/question.js +113 -0
  1738. package/clis/zhihu/question.test.js +251 -0
  1739. package/clis/zhihu/recommend.js +103 -0
  1740. package/clis/zhihu/recommend.test.js +143 -0
  1741. package/clis/zhihu/search.js +206 -0
  1742. package/clis/zhihu/search.test.js +198 -0
  1743. package/clis/zhihu/target.js +91 -0
  1744. package/clis/zhihu/target.test.js +77 -0
  1745. package/clis/zhihu/text.js +29 -0
  1746. package/clis/zhihu/text.test.js +24 -0
  1747. package/clis/zhihu/user-answers.js +41 -0
  1748. package/clis/zhihu/user-answers.test.js +69 -0
  1749. package/clis/zhihu/user-arg.js +34 -0
  1750. package/clis/zhihu/user-articles.js +40 -0
  1751. package/clis/zhihu/user-articles.test.js +44 -0
  1752. package/clis/zhihu/user.js +59 -0
  1753. package/clis/zhihu/user.test.js +73 -0
  1754. package/clis/zhihu/write-shared.js +228 -0
  1755. package/clis/zhihu/write-shared.test.js +176 -0
  1756. package/clis/zlibrary/commands.test.js +65 -0
  1757. package/clis/zlibrary/info.js +48 -0
  1758. package/clis/zlibrary/search.js +47 -0
  1759. package/clis/zlibrary/utils.js +136 -0
  1760. package/clis/zsxq/auth.js +68 -0
  1761. package/clis/zsxq/dynamics.js +48 -0
  1762. package/clis/zsxq/groups.js +33 -0
  1763. package/clis/zsxq/search.js +44 -0
  1764. package/clis/zsxq/search.test.js +24 -0
  1765. package/clis/zsxq/topic.js +50 -0
  1766. package/clis/zsxq/topic.test.js +30 -0
  1767. package/clis/zsxq/topics.js +26 -0
  1768. package/clis/zsxq/topics.test.js +24 -0
  1769. package/clis/zsxq/utils.js +233 -0
  1770. package/clis/zsxq/utils.test.js +31 -0
  1771. package/dist/src/adapter-shadow.d.ts +11 -0
  1772. package/dist/src/adapter-shadow.js +72 -0
  1773. package/dist/src/adapter-shadow.test.d.ts +1 -0
  1774. package/dist/src/adapter-shadow.test.js +49 -0
  1775. package/dist/src/adapter-source.d.ts +11 -0
  1776. package/dist/src/adapter-source.js +24 -0
  1777. package/dist/src/adapter-source.test.d.ts +1 -0
  1778. package/dist/src/adapter-source.test.js +29 -0
  1779. package/dist/src/browser/analyze.d.ts +118 -0
  1780. package/dist/src/browser/analyze.js +405 -0
  1781. package/dist/src/browser/analyze.test.d.ts +1 -0
  1782. package/dist/src/browser/analyze.test.js +209 -0
  1783. package/dist/src/browser/article-extract.d.ts +57 -0
  1784. package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
  1785. package/dist/src/browser/article-extract.e2e.test.js +105 -0
  1786. package/dist/src/browser/article-extract.js +169 -0
  1787. package/dist/src/browser/article-extract.test.d.ts +1 -0
  1788. package/dist/src/browser/article-extract.test.js +94 -0
  1789. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  1790. package/dist/src/browser/ax-snapshot.js +217 -0
  1791. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  1792. package/dist/src/browser/ax-snapshot.test.js +91 -0
  1793. package/dist/src/browser/base-page.d.ts +151 -0
  1794. package/dist/src/browser/base-page.js +1060 -0
  1795. package/dist/src/browser/base-page.test.d.ts +1 -0
  1796. package/dist/src/browser/base-page.test.js +803 -0
  1797. package/dist/src/browser/bridge.d.ts +28 -0
  1798. package/dist/src/browser/bridge.js +172 -0
  1799. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  1800. package/dist/src/browser/cdp-click-fixture.test.js +87 -0
  1801. package/dist/src/browser/cdp.d.ts +46 -0
  1802. package/dist/src/browser/cdp.js +536 -0
  1803. package/dist/src/browser/cdp.test.d.ts +1 -0
  1804. package/dist/src/browser/cdp.test.js +79 -0
  1805. package/dist/src/browser/compound.d.ts +59 -0
  1806. package/dist/src/browser/compound.js +112 -0
  1807. package/dist/src/browser/compound.test.d.ts +1 -0
  1808. package/dist/src/browser/compound.test.js +175 -0
  1809. package/dist/src/browser/daemon-client.d.ts +133 -0
  1810. package/dist/src/browser/daemon-client.js +154 -0
  1811. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  1812. package/dist/src/browser/daemon-client.test.js +199 -0
  1813. package/dist/src/browser/daemon-lifecycle.d.ts +23 -0
  1814. package/dist/src/browser/daemon-lifecycle.js +67 -0
  1815. package/dist/src/browser/daemon-version.d.ts +4 -0
  1816. package/dist/src/browser/daemon-version.js +12 -0
  1817. package/dist/src/browser/dom-helpers.d.ts +41 -0
  1818. package/dist/src/browser/dom-helpers.js +239 -0
  1819. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  1820. package/dist/src/browser/dom-helpers.test.js +106 -0
  1821. package/dist/src/browser/dom-snapshot.d.ts +93 -0
  1822. package/dist/src/browser/dom-snapshot.js +894 -0
  1823. package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
  1824. package/dist/src/browser/dom-snapshot.test.js +313 -0
  1825. package/dist/src/browser/errors.d.ts +38 -0
  1826. package/dist/src/browser/errors.js +78 -0
  1827. package/dist/src/browser/errors.test.d.ts +1 -0
  1828. package/dist/src/browser/errors.test.js +60 -0
  1829. package/dist/src/browser/extract.d.ts +69 -0
  1830. package/dist/src/browser/extract.js +132 -0
  1831. package/dist/src/browser/extract.test.d.ts +1 -0
  1832. package/dist/src/browser/extract.test.js +129 -0
  1833. package/dist/src/browser/find.d.ts +84 -0
  1834. package/dist/src/browser/find.js +398 -0
  1835. package/dist/src/browser/find.test.d.ts +1 -0
  1836. package/dist/src/browser/find.test.js +180 -0
  1837. package/dist/src/browser/html-tree.d.ts +75 -0
  1838. package/dist/src/browser/html-tree.js +112 -0
  1839. package/dist/src/browser/html-tree.test.d.ts +1 -0
  1840. package/dist/src/browser/html-tree.test.js +181 -0
  1841. package/dist/src/browser/index.d.ts +14 -0
  1842. package/dist/src/browser/index.js +12 -0
  1843. package/dist/src/browser/network-cache.d.ts +49 -0
  1844. package/dist/src/browser/network-cache.js +78 -0
  1845. package/dist/src/browser/network-cache.test.d.ts +1 -0
  1846. package/dist/src/browser/network-cache.test.js +75 -0
  1847. package/dist/src/browser/network-key.d.ts +22 -0
  1848. package/dist/src/browser/network-key.js +66 -0
  1849. package/dist/src/browser/network-key.test.d.ts +1 -0
  1850. package/dist/src/browser/network-key.test.js +49 -0
  1851. package/dist/src/browser/page.d.ts +83 -0
  1852. package/dist/src/browser/page.js +453 -0
  1853. package/dist/src/browser/page.test.d.ts +1 -0
  1854. package/dist/src/browser/page.test.js +406 -0
  1855. package/dist/src/browser/profile.d.ts +14 -0
  1856. package/dist/src/browser/profile.js +85 -0
  1857. package/dist/src/browser/shape-filter.d.ts +52 -0
  1858. package/dist/src/browser/shape-filter.js +101 -0
  1859. package/dist/src/browser/shape-filter.test.d.ts +1 -0
  1860. package/dist/src/browser/shape-filter.test.js +101 -0
  1861. package/dist/src/browser/shape.d.ts +23 -0
  1862. package/dist/src/browser/shape.js +95 -0
  1863. package/dist/src/browser/shape.test.d.ts +1 -0
  1864. package/dist/src/browser/shape.test.js +82 -0
  1865. package/dist/src/browser/stealth.d.ts +11 -0
  1866. package/dist/src/browser/stealth.js +359 -0
  1867. package/dist/src/browser/stealth.test.d.ts +1 -0
  1868. package/dist/src/browser/stealth.test.js +134 -0
  1869. package/dist/src/browser/tabs.d.ts +13 -0
  1870. package/dist/src/browser/tabs.js +70 -0
  1871. package/dist/src/browser/target-errors.d.ts +39 -0
  1872. package/dist/src/browser/target-errors.js +45 -0
  1873. package/dist/src/browser/target-errors.test.d.ts +1 -0
  1874. package/dist/src/browser/target-errors.test.js +94 -0
  1875. package/dist/src/browser/target-resolver.d.ts +158 -0
  1876. package/dist/src/browser/target-resolver.js +570 -0
  1877. package/dist/src/browser/target-resolver.test.d.ts +1 -0
  1878. package/dist/src/browser/target-resolver.test.js +118 -0
  1879. package/dist/src/browser/utils.d.ts +20 -0
  1880. package/dist/src/browser/utils.js +64 -0
  1881. package/dist/src/browser/utils.test.d.ts +1 -0
  1882. package/dist/src/browser/utils.test.js +29 -0
  1883. package/dist/src/browser/verify-fixture.d.ts +65 -0
  1884. package/dist/src/browser/verify-fixture.js +318 -0
  1885. package/dist/src/browser/verify-fixture.test.d.ts +1 -0
  1886. package/dist/src/browser/verify-fixture.test.js +219 -0
  1887. package/dist/src/browser/visual-refs.d.ts +11 -0
  1888. package/dist/src/browser/visual-refs.js +108 -0
  1889. package/dist/src/browser.test.d.ts +1 -0
  1890. package/dist/src/browser.test.js +287 -0
  1891. package/dist/src/build-manifest.d.ts +103 -0
  1892. package/dist/src/build-manifest.js +363 -0
  1893. package/dist/src/build-manifest.test.d.ts +1 -0
  1894. package/dist/src/build-manifest.test.js +341 -0
  1895. package/dist/src/capabilityRouting.d.ts +19 -0
  1896. package/dist/src/capabilityRouting.js +56 -0
  1897. package/dist/src/capabilityRouting.test.d.ts +1 -0
  1898. package/dist/src/capabilityRouting.test.js +63 -0
  1899. package/dist/src/cli-argv-preprocess.d.ts +63 -0
  1900. package/dist/src/cli-argv-preprocess.js +303 -0
  1901. package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
  1902. package/dist/src/cli-argv-preprocess.test.js +304 -0
  1903. package/dist/src/cli.d.ts +79 -0
  1904. package/dist/src/cli.js +3357 -0
  1905. package/dist/src/cli.test.d.ts +1 -0
  1906. package/dist/src/cli.test.js +3003 -0
  1907. package/dist/src/commanderAdapter.d.ts +21 -0
  1908. package/dist/src/commanderAdapter.js +208 -0
  1909. package/dist/src/commanderAdapter.test.d.ts +1 -0
  1910. package/dist/src/commanderAdapter.test.js +352 -0
  1911. package/dist/src/commands/auth.d.ts +40 -0
  1912. package/dist/src/commands/auth.js +434 -0
  1913. package/dist/src/commands/auth.test.d.ts +1 -0
  1914. package/dist/src/commands/auth.test.js +252 -0
  1915. package/dist/src/commands/daemon.d.ts +9 -0
  1916. package/dist/src/commands/daemon.js +98 -0
  1917. package/dist/src/commands/daemon.test.d.ts +1 -0
  1918. package/dist/src/commands/daemon.test.js +283 -0
  1919. package/dist/src/completion-fast.d.ts +22 -0
  1920. package/dist/src/completion-fast.js +88 -0
  1921. package/dist/src/completion-shared.d.ts +13 -0
  1922. package/dist/src/completion-shared.js +60 -0
  1923. package/dist/src/completion.d.ts +21 -0
  1924. package/dist/src/completion.js +68 -0
  1925. package/dist/src/completion.test.d.ts +1 -0
  1926. package/dist/src/completion.test.js +24 -0
  1927. package/dist/src/constants.d.ts +15 -0
  1928. package/dist/src/constants.js +32 -0
  1929. package/dist/src/convention-audit.d.ts +50 -0
  1930. package/dist/src/convention-audit.js +553 -0
  1931. package/dist/src/convention-audit.test.d.ts +1 -0
  1932. package/dist/src/convention-audit.test.js +247 -0
  1933. package/dist/src/daemon-utils.d.ts +18 -0
  1934. package/dist/src/daemon-utils.js +37 -0
  1935. package/dist/src/daemon.d.ts +22 -0
  1936. package/dist/src/daemon.js +437 -0
  1937. package/dist/src/daemon.test.d.ts +1 -0
  1938. package/dist/src/daemon.test.js +60 -0
  1939. package/dist/src/discovery.d.ts +43 -0
  1940. package/dist/src/discovery.js +266 -0
  1941. package/dist/src/doctor.d.ts +39 -0
  1942. package/dist/src/doctor.js +230 -0
  1943. package/dist/src/doctor.test.d.ts +1 -0
  1944. package/dist/src/doctor.test.js +263 -0
  1945. package/dist/src/download/article-download.d.ts +72 -0
  1946. package/dist/src/download/article-download.js +305 -0
  1947. package/dist/src/download/article-download.test.d.ts +1 -0
  1948. package/dist/src/download/article-download.test.js +235 -0
  1949. package/dist/src/download/index.d.ts +71 -0
  1950. package/dist/src/download/index.js +363 -0
  1951. package/dist/src/download/index.test.d.ts +1 -0
  1952. package/dist/src/download/index.test.js +174 -0
  1953. package/dist/src/download/media-download.d.ts +49 -0
  1954. package/dist/src/download/media-download.js +127 -0
  1955. package/dist/src/download/media-download.test.d.ts +1 -0
  1956. package/dist/src/download/media-download.test.js +112 -0
  1957. package/dist/src/download/progress.d.ts +36 -0
  1958. package/dist/src/download/progress.js +120 -0
  1959. package/dist/src/download/progress.test.d.ts +1 -0
  1960. package/dist/src/download/progress.test.js +36 -0
  1961. package/dist/src/electron-apps.d.ts +31 -0
  1962. package/dist/src/electron-apps.js +91 -0
  1963. package/dist/src/electron-apps.test.d.ts +1 -0
  1964. package/dist/src/electron-apps.test.js +76 -0
  1965. package/dist/src/engine.test.d.ts +1 -0
  1966. package/dist/src/engine.test.js +312 -0
  1967. package/dist/src/errors.d.ts +114 -0
  1968. package/dist/src/errors.js +174 -0
  1969. package/dist/src/errors.test.d.ts +1 -0
  1970. package/dist/src/errors.test.js +109 -0
  1971. package/dist/src/execution.d.ts +24 -0
  1972. package/dist/src/execution.js +509 -0
  1973. package/dist/src/execution.test.d.ts +1 -0
  1974. package/dist/src/execution.test.js +645 -0
  1975. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  1976. package/dist/src/extension-manifest-regression.test.js +12 -0
  1977. package/dist/src/external-clis.yaml +109 -0
  1978. package/dist/src/external.d.ts +49 -0
  1979. package/dist/src/external.js +211 -0
  1980. package/dist/src/external.test.d.ts +1 -0
  1981. package/dist/src/external.test.js +110 -0
  1982. package/dist/src/help.d.ts +88 -0
  1983. package/dist/src/help.js +555 -0
  1984. package/dist/src/help.test.d.ts +1 -0
  1985. package/dist/src/help.test.js +58 -0
  1986. package/dist/src/hooks.d.ts +46 -0
  1987. package/dist/src/hooks.js +58 -0
  1988. package/dist/src/hooks.test.d.ts +4 -0
  1989. package/dist/src/hooks.test.js +92 -0
  1990. package/dist/src/interceptor.d.ts +44 -0
  1991. package/dist/src/interceptor.js +183 -0
  1992. package/dist/src/interceptor.test.d.ts +4 -0
  1993. package/dist/src/interceptor.test.js +81 -0
  1994. package/dist/src/launcher.d.ts +41 -0
  1995. package/dist/src/launcher.js +226 -0
  1996. package/dist/src/launcher.test.d.ts +1 -0
  1997. package/dist/src/launcher.test.js +153 -0
  1998. package/dist/src/logger.d.ts +26 -0
  1999. package/dist/src/logger.js +49 -0
  2000. package/dist/src/main.d.ts +5 -0
  2001. package/dist/src/main.js +171 -0
  2002. package/dist/src/manifest-types.d.ts +43 -0
  2003. package/dist/src/manifest-types.js +9 -0
  2004. package/dist/src/node-network.d.ts +10 -0
  2005. package/dist/src/node-network.js +174 -0
  2006. package/dist/src/node-network.test.d.ts +1 -0
  2007. package/dist/src/node-network.test.js +55 -0
  2008. package/dist/src/observation/artifact.d.ts +16 -0
  2009. package/dist/src/observation/artifact.js +260 -0
  2010. package/dist/src/observation/artifact.test.d.ts +1 -0
  2011. package/dist/src/observation/artifact.test.js +121 -0
  2012. package/dist/src/observation/events.d.ts +89 -0
  2013. package/dist/src/observation/events.js +1 -0
  2014. package/dist/src/observation/index.d.ts +7 -0
  2015. package/dist/src/observation/index.js +7 -0
  2016. package/dist/src/observation/manager.d.ts +9 -0
  2017. package/dist/src/observation/manager.js +27 -0
  2018. package/dist/src/observation/manager.test.d.ts +1 -0
  2019. package/dist/src/observation/manager.test.js +13 -0
  2020. package/dist/src/observation/redaction.d.ts +11 -0
  2021. package/dist/src/observation/redaction.js +81 -0
  2022. package/dist/src/observation/redaction.test.d.ts +1 -0
  2023. package/dist/src/observation/redaction.test.js +32 -0
  2024. package/dist/src/observation/retention.d.ts +32 -0
  2025. package/dist/src/observation/retention.js +160 -0
  2026. package/dist/src/observation/retention.test.d.ts +1 -0
  2027. package/dist/src/observation/retention.test.js +118 -0
  2028. package/dist/src/observation/ring-buffer.d.ts +22 -0
  2029. package/dist/src/observation/ring-buffer.js +45 -0
  2030. package/dist/src/observation/ring-buffer.test.d.ts +1 -0
  2031. package/dist/src/observation/ring-buffer.test.js +22 -0
  2032. package/dist/src/observation/session.d.ts +25 -0
  2033. package/dist/src/observation/session.js +50 -0
  2034. package/dist/src/output.d.ts +14 -0
  2035. package/dist/src/output.js +152 -0
  2036. package/dist/src/output.test.d.ts +1 -0
  2037. package/dist/src/output.test.js +53 -0
  2038. package/dist/src/package-exports.test.d.ts +1 -0
  2039. package/dist/src/package-exports.test.js +112 -0
  2040. package/dist/src/package-paths.d.ts +8 -0
  2041. package/dist/src/package-paths.js +41 -0
  2042. package/dist/src/pipeline/executor.d.ts +11 -0
  2043. package/dist/src/pipeline/executor.js +93 -0
  2044. package/dist/src/pipeline/executor.test.d.ts +4 -0
  2045. package/dist/src/pipeline/executor.test.js +182 -0
  2046. package/dist/src/pipeline/index.d.ts +5 -0
  2047. package/dist/src/pipeline/index.js +5 -0
  2048. package/dist/src/pipeline/registry.d.ts +28 -0
  2049. package/dist/src/pipeline/registry.js +55 -0
  2050. package/dist/src/pipeline/steps/browser.d.ts +13 -0
  2051. package/dist/src/pipeline/steps/browser.js +86 -0
  2052. package/dist/src/pipeline/steps/download.d.ts +18 -0
  2053. package/dist/src/pipeline/steps/download.js +252 -0
  2054. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  2055. package/dist/src/pipeline/steps/download.test.js +102 -0
  2056. package/dist/src/pipeline/steps/fetch.d.ts +5 -0
  2057. package/dist/src/pipeline/steps/fetch.js +122 -0
  2058. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  2059. package/dist/src/pipeline/steps/fetch.test.js +117 -0
  2060. package/dist/src/pipeline/steps/intercept.d.ts +5 -0
  2061. package/dist/src/pipeline/steps/intercept.js +50 -0
  2062. package/dist/src/pipeline/steps/tap.d.ts +12 -0
  2063. package/dist/src/pipeline/steps/tap.js +93 -0
  2064. package/dist/src/pipeline/steps/transform.d.ts +9 -0
  2065. package/dist/src/pipeline/steps/transform.js +70 -0
  2066. package/dist/src/pipeline/template.d.ts +17 -0
  2067. package/dist/src/pipeline/template.js +338 -0
  2068. package/dist/src/pipeline/template.test.d.ts +4 -0
  2069. package/dist/src/pipeline/template.test.js +175 -0
  2070. package/dist/src/pipeline/transform.test.d.ts +4 -0
  2071. package/dist/src/pipeline/transform.test.js +133 -0
  2072. package/dist/src/plugin-manifest.d.ts +70 -0
  2073. package/dist/src/plugin-manifest.js +160 -0
  2074. package/dist/src/plugin-manifest.test.d.ts +4 -0
  2075. package/dist/src/plugin-manifest.test.js +179 -0
  2076. package/dist/src/plugin-scaffold.d.ts +28 -0
  2077. package/dist/src/plugin-scaffold.js +143 -0
  2078. package/dist/src/plugin-scaffold.test.d.ts +4 -0
  2079. package/dist/src/plugin-scaffold.test.js +83 -0
  2080. package/dist/src/plugin.d.ts +145 -0
  2081. package/dist/src/plugin.js +1245 -0
  2082. package/dist/src/plugin.test.d.ts +4 -0
  2083. package/dist/src/plugin.test.js +1324 -0
  2084. package/dist/src/registry-api.d.ts +13 -0
  2085. package/dist/src/registry-api.js +10 -0
  2086. package/dist/src/registry.d.ts +123 -0
  2087. package/dist/src/registry.js +125 -0
  2088. package/dist/src/registry.test.d.ts +4 -0
  2089. package/dist/src/registry.test.js +209 -0
  2090. package/dist/src/runtime-detect.d.ts +31 -0
  2091. package/dist/src/runtime-detect.js +47 -0
  2092. package/dist/src/runtime-detect.test.d.ts +1 -0
  2093. package/dist/src/runtime-detect.test.js +39 -0
  2094. package/dist/src/runtime.d.ts +47 -0
  2095. package/dist/src/runtime.js +66 -0
  2096. package/dist/src/scripts/framework.d.ts +7 -0
  2097. package/dist/src/scripts/framework.js +25 -0
  2098. package/dist/src/scripts/interact.d.ts +4 -0
  2099. package/dist/src/scripts/interact.js +20 -0
  2100. package/dist/src/scripts/store.d.ts +13 -0
  2101. package/dist/src/scripts/store.js +48 -0
  2102. package/dist/src/serialization.d.ts +42 -0
  2103. package/dist/src/serialization.js +102 -0
  2104. package/dist/src/serialization.test.d.ts +1 -0
  2105. package/dist/src/serialization.test.js +78 -0
  2106. package/dist/src/skills.d.ts +14 -0
  2107. package/dist/src/skills.js +127 -0
  2108. package/dist/src/skills.test.d.ts +1 -0
  2109. package/dist/src/skills.test.js +71 -0
  2110. package/dist/src/snapshotFormatter.d.ts +11 -0
  2111. package/dist/src/snapshotFormatter.js +338 -0
  2112. package/dist/src/snapshotFormatter.test.d.ts +7 -0
  2113. package/dist/src/snapshotFormatter.test.js +521 -0
  2114. package/dist/src/tui.d.ts +28 -0
  2115. package/dist/src/tui.js +179 -0
  2116. package/dist/src/tui.test.d.ts +1 -0
  2117. package/dist/src/tui.test.js +19 -0
  2118. package/dist/src/types.d.ts +236 -0
  2119. package/dist/src/types.js +7 -0
  2120. package/dist/src/update-check.d.ts +66 -0
  2121. package/dist/src/update-check.js +202 -0
  2122. package/dist/src/update-check.test.d.ts +1 -0
  2123. package/dist/src/update-check.test.js +116 -0
  2124. package/dist/src/utils.d.ts +57 -0
  2125. package/dist/src/utils.js +152 -0
  2126. package/dist/src/utils.test.d.ts +1 -0
  2127. package/dist/src/utils.test.js +155 -0
  2128. package/dist/src/validate.d.ts +21 -0
  2129. package/dist/src/validate.js +129 -0
  2130. package/dist/src/validate.test.d.ts +9 -0
  2131. package/dist/src/validate.test.js +90 -0
  2132. package/dist/src/verify.d.ts +26 -0
  2133. package/dist/src/verify.js +67 -0
  2134. package/dist/src/version.d.ts +4 -0
  2135. package/dist/src/version.js +22 -0
  2136. package/dist/src/weixin-download.test.d.ts +1 -0
  2137. package/dist/src/weixin-download.test.js +45 -0
  2138. package/package.json +109 -0
  2139. package/scripts/check-doc-coverage.sh +81 -0
  2140. package/scripts/check-listing-id-pairing.mjs +193 -0
  2141. package/scripts/check-silent-column-drop.mjs +105 -0
  2142. package/scripts/check-typed-error-lint.mjs +118 -0
  2143. package/scripts/clean-dist.cjs +13 -0
  2144. package/scripts/copy-yaml.cjs +12 -0
  2145. package/scripts/fetch-adapters.js +293 -0
  2146. package/scripts/postinstall.js +174 -0
  2147. package/scripts/silent-column-drop-baseline.json +910 -0
  2148. package/scripts/typed-error-lint-baseline.json +1162 -0
  2149. package/skills/opencli-adapter-author/SKILL.md +256 -0
  2150. package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
  2151. package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
  2152. package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
  2153. package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
  2154. package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
  2155. package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
  2156. package/skills/opencli-adapter-author/references/output-design.md +149 -0
  2157. package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
  2158. package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
  2159. package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
  2160. package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
  2161. package/skills/opencli-adapter-author/references/site-memory.md +231 -0
  2162. package/skills/opencli-adapter-author/references/site-recon.md +134 -0
  2163. package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
  2164. package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
  2165. package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
  2166. package/skills/opencli-autofix/SKILL.md +297 -0
  2167. package/skills/opencli-browser/SKILL.md +444 -0
  2168. package/skills/opencli-browser-sitemap/SKILL.md +96 -0
  2169. package/skills/opencli-sitemap-author/SKILL.md +161 -0
  2170. package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
  2171. package/skills/opencli-usage/SKILL.md +169 -0
@@ -0,0 +1,1497 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { cli, Strategy } from '@jackwener/opencli/registry';
4
+ import { ArgumentError, AuthRequiredError, CommandExecutionError } from '@jackwener/opencli/errors';
5
+ import { installInstagramProtocolCapture, readInstagramProtocolCapture, } from './_shared/protocol-capture.js';
6
+ import { publishMediaViaPrivateApi, publishImagesViaPrivateApi, resolveInstagramPrivatePublishConfig, } from './_shared/private-publish.js';
7
+ import { resolveInstagramRuntimeInfo } from './_shared/runtime-info.js';
8
+ const INSTAGRAM_HOME_URL = 'https://www.instagram.com/';
9
+ const SUPPORTED_IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.webp']);
10
+ const SUPPORTED_VIDEO_EXTENSIONS = new Set(['.mp4']);
11
+ const MAX_MEDIA_ITEMS = 10;
12
+ const INSTAGRAM_PROTOCOL_TRACE_OUTPUT_PATH = '/tmp/instagram_post_protocol_trace.json';
13
+ async function gotoInstagramHome(page, forceReload = false) {
14
+ if (forceReload) {
15
+ await page.goto(`${INSTAGRAM_HOME_URL}?__opencli_reset=${Date.now()}`);
16
+ await page.wait({ time: 1 });
17
+ }
18
+ await page.goto(INSTAGRAM_HOME_URL);
19
+ }
20
+ export function buildEnsureComposerOpenJs() {
21
+ return `
22
+ (() => {
23
+ const path = window.location?.pathname || '';
24
+ const onLoginRoute = /\\/accounts\\/login\\/?/.test(path);
25
+ const hasLoginField = !!document.querySelector('input[name="username"], input[name="password"]');
26
+ const hasLoginButton = Array.from(document.querySelectorAll('button, div[role="button"]')).some((el) => {
27
+ const text = (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
28
+ return text === 'log in' || text === 'login' || text === '登录';
29
+ });
30
+
31
+ if (onLoginRoute || (hasLoginField && hasLoginButton)) {
32
+ return { ok: false, reason: 'auth' };
33
+ }
34
+
35
+ const alreadyOpen = document.querySelector('input[type="file"]');
36
+ if (alreadyOpen) return { ok: true };
37
+
38
+ const labels = ['Create', 'New post', 'Post', '创建', '新帖子'];
39
+ const nodes = Array.from(document.querySelectorAll('a, button, div[role="button"], svg[aria-label], [aria-label]'));
40
+ for (const node of nodes) {
41
+ const text = ((node.textContent || '') + ' ' + (node.getAttribute?.('aria-label') || '')).trim();
42
+ if (labels.some((label) => text.toLowerCase().includes(label.toLowerCase()))) {
43
+ const clickable = node.closest('a, button, div[role="button"]') || node;
44
+ if (clickable instanceof HTMLElement) {
45
+ clickable.click();
46
+ return { ok: true };
47
+ }
48
+ }
49
+ }
50
+
51
+ return { ok: true };
52
+ })()
53
+ `;
54
+ }
55
+ export function buildPublishStatusProbeJs() {
56
+ return `
57
+ (() => {
58
+ const isVisible = (el) => {
59
+ if (!(el instanceof HTMLElement)) return false;
60
+ const style = window.getComputedStyle(el);
61
+ const rect = el.getBoundingClientRect();
62
+ return style.display !== 'none'
63
+ && style.visibility !== 'hidden'
64
+ && rect.width > 0
65
+ && rect.height > 0;
66
+ };
67
+ const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
68
+ const dialogText = dialogs
69
+ .map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim())
70
+ .join(' ');
71
+ const url = window.location.href;
72
+ const visibleText = dialogText.toLowerCase();
73
+ const sharingVisible = /sharing/.test(visibleText);
74
+ const shared = /post shared|your post has been shared|已分享|已发布/.test(visibleText)
75
+ || /\\/p\\//.test(url);
76
+ const failed = !shared && !sharingVisible && (
77
+ /couldn['’]t be shared|could not be shared|failed to share|share failed|无法分享|分享失败/.test(visibleText)
78
+ || (/something went wrong/.test(visibleText) && /try again/.test(visibleText))
79
+ );
80
+ const composerOpen = dialogs.some((dialog) =>
81
+ !!dialog.querySelector('textarea, [contenteditable="true"], input[type="file"]')
82
+ || /write a caption|add location|advanced settings|select from computer|crop|filters|adjustments|sharing/.test((dialog.textContent || '').toLowerCase())
83
+ );
84
+ const settled = !shared && !composerOpen && !/sharing/.test(visibleText);
85
+ return { ok: shared, failed, settled, url: /\\/p\\//.test(url) ? url : '' };
86
+ })()
87
+ `;
88
+ }
89
+ function requirePage(page) {
90
+ if (!page)
91
+ throw new CommandExecutionError('Browser session required for instagram post');
92
+ return page;
93
+ }
94
+ function validateMixedMediaItems(inputs) {
95
+ if (!inputs.length) {
96
+ throw new ArgumentError('Argument "media" is required.', 'Provide --media /path/to/file.jpg or --media /path/a.jpg,/path/b.mp4');
97
+ }
98
+ if (inputs.length > MAX_MEDIA_ITEMS) {
99
+ throw new ArgumentError(`Too many media items: ${inputs.length}`, `Instagram carousel posts support at most ${MAX_MEDIA_ITEMS} items`);
100
+ }
101
+ const items = inputs.map((input) => {
102
+ const resolved = path.resolve(String(input || '').trim());
103
+ if (!resolved) {
104
+ throw new ArgumentError('Media path cannot be empty');
105
+ }
106
+ if (!fs.existsSync(resolved)) {
107
+ throw new ArgumentError(`Media file not found: ${resolved}`);
108
+ }
109
+ const ext = path.extname(resolved).toLowerCase();
110
+ if (SUPPORTED_IMAGE_EXTENSIONS.has(ext)) {
111
+ return { type: 'image', filePath: resolved };
112
+ }
113
+ if (SUPPORTED_VIDEO_EXTENSIONS.has(ext)) {
114
+ return { type: 'video', filePath: resolved };
115
+ }
116
+ throw new ArgumentError(`Unsupported media format: ${ext}`, 'Supported formats: images (.jpg, .jpeg, .png, .webp) and videos (.mp4)');
117
+ });
118
+ return items;
119
+ }
120
+ function normalizePostMediaItems(kwargs) {
121
+ const media = String(kwargs.media ?? '').trim();
122
+ return validateMixedMediaItems(media.split(',').map((part) => part.trim()).filter(Boolean));
123
+ }
124
+ function validateInstagramPostArgs(kwargs) {
125
+ const media = kwargs.media;
126
+ if (media === undefined) {
127
+ throw new ArgumentError('Argument "media" is required.', 'Provide --media /path/to/file.jpg or --media /path/a.jpg,/path/b.mp4');
128
+ }
129
+ }
130
+ function isSafePrivateRouteFallbackError(error) {
131
+ if (!(error instanceof CommandExecutionError))
132
+ return false;
133
+ return error.message.startsWith('Instagram private publish')
134
+ || error.message.startsWith('Instagram private route');
135
+ }
136
+ function buildInstagramSuccessResult(mediaItems, url) {
137
+ return [{
138
+ status: '✅ Posted',
139
+ detail: describePostDetail(mediaItems),
140
+ url,
141
+ }];
142
+ }
143
+ function buildFallbackHint(privateError, uiError) {
144
+ const privateMessage = privateError instanceof Error ? privateError.message : String(privateError);
145
+ const uiMessage = uiError instanceof Error ? uiError.message : String(uiError);
146
+ return `Private route failed first: ${privateMessage}. UI fallback then failed: ${uiMessage}`;
147
+ }
148
+ async function executePrivateInstagramPost(input) {
149
+ const privateConfig = await resolveInstagramPrivatePublishConfig(input.page);
150
+ const privateResult = input.mediaItems.every((item) => item.type === 'image')
151
+ ? await publishImagesViaPrivateApi({
152
+ page: input.page,
153
+ imagePaths: input.mediaItems.map((item) => item.filePath),
154
+ caption: input.content,
155
+ apiContext: privateConfig.apiContext,
156
+ jazoest: privateConfig.jazoest,
157
+ })
158
+ : await publishMediaViaPrivateApi({
159
+ page: input.page,
160
+ mediaItems: input.mediaItems,
161
+ caption: input.content,
162
+ apiContext: privateConfig.apiContext,
163
+ jazoest: privateConfig.jazoest,
164
+ });
165
+ const url = privateResult.code
166
+ ? new URL(`/p/${privateResult.code}/`, INSTAGRAM_HOME_URL).toString()
167
+ : await resolveLatestPostUrl(input.page, input.existingPostPaths);
168
+ return buildInstagramSuccessResult(input.mediaItems, url);
169
+ }
170
+ async function executeUiInstagramPost(input) {
171
+ let lastError;
172
+ let lastSpecificCommandError = null;
173
+ for (let attempt = 0; attempt < input.commandAttemptBudget; attempt++) {
174
+ let shareClicked = false;
175
+ try {
176
+ await gotoInstagramHome(input.page, input.forceFreshStart || attempt > 0);
177
+ await input.installProtocolCapture();
178
+ await input.page.wait({ time: 2 });
179
+ await dismissResidualDialogs(input.page);
180
+ await ensureComposerOpen(input.page);
181
+ const uploadSelectors = await resolveUploadSelectors(input.page, input.mediaItems);
182
+ if (input.preUploadDelaySeconds > 0) {
183
+ await input.page.wait({ time: input.preUploadDelaySeconds });
184
+ }
185
+ let uploaded = false;
186
+ let uploadFailure = null;
187
+ for (const selector of uploadSelectors) {
188
+ let activeSelector = selector;
189
+ for (let uploadAttempt = 0; uploadAttempt < input.uploadAttemptBudget; uploadAttempt++) {
190
+ await uploadMedia(input.page, input.mediaItems, activeSelector);
191
+ const uploadState = await waitForPreviewMaybe(input.page, input.previewProbeWindowSeconds);
192
+ if (uploadState.state === 'preview') {
193
+ uploaded = true;
194
+ break;
195
+ }
196
+ if (uploadState.state === 'failed') {
197
+ uploadFailure = makeUploadFailure(uploadState.detail);
198
+ for (let inlineRetry = 0; inlineRetry < input.inlineUploadRetryBudget; inlineRetry++) {
199
+ const clickedRetry = await clickVisibleUploadRetry(input.page);
200
+ if (!clickedRetry)
201
+ break;
202
+ await input.page.wait({ time: 3 });
203
+ const retriedState = await waitForPreviewMaybe(input.page, Math.max(3, Math.floor(input.previewProbeWindowSeconds / 2)));
204
+ if (retriedState.state === 'preview') {
205
+ uploaded = true;
206
+ break;
207
+ }
208
+ if (retriedState.state !== 'failed')
209
+ break;
210
+ }
211
+ if (uploaded)
212
+ break;
213
+ await dismissUploadErrorDialog(input.page);
214
+ await dismissResidualDialogs(input.page);
215
+ if (uploadAttempt < input.uploadAttemptBudget - 1) {
216
+ try {
217
+ await input.drainProtocolCapture();
218
+ await gotoInstagramHome(input.page, true);
219
+ await input.installProtocolCapture();
220
+ await input.page.wait({ time: 2 });
221
+ await dismissResidualDialogs(input.page);
222
+ await ensureComposerOpen(input.page);
223
+ activeSelector = await resolveFreshUploadSelector(input.page, activeSelector, input.mediaItems);
224
+ if (input.preUploadDelaySeconds > 0) {
225
+ await input.page.wait({ time: input.preUploadDelaySeconds });
226
+ }
227
+ }
228
+ catch {
229
+ throw uploadFailure;
230
+ }
231
+ await input.page.wait({ time: 1.5 });
232
+ continue;
233
+ }
234
+ break;
235
+ }
236
+ break;
237
+ }
238
+ if (uploaded)
239
+ break;
240
+ }
241
+ if (!uploaded) {
242
+ if (uploadFailure)
243
+ throw uploadFailure;
244
+ await waitForPreview(input.page, input.finalPreviewWaitSeconds);
245
+ }
246
+ try {
247
+ await advanceToCaptionEditor(input.page);
248
+ }
249
+ catch (error) {
250
+ await rethrowUploadFailureIfPresent(input.page, error);
251
+ }
252
+ if (input.content) {
253
+ await fillCaption(input.page, input.content);
254
+ await ensureCaptionFilled(input.page, input.content);
255
+ }
256
+ if (input.preShareDelaySeconds > 0) {
257
+ await input.page.wait({ time: input.preShareDelaySeconds });
258
+ }
259
+ await clickAction(input.page, ['Share', '分享'], 'caption');
260
+ shareClicked = true;
261
+ let url = '';
262
+ try {
263
+ url = await waitForPublishSuccess(input.page);
264
+ }
265
+ catch (error) {
266
+ if (error instanceof CommandExecutionError
267
+ && error.message === 'Instagram post share failed'
268
+ && await clickVisibleShareRetry(input.page)) {
269
+ await input.page.wait({ time: Math.max(2, input.preShareDelaySeconds) });
270
+ url = await waitForPublishSuccess(input.page);
271
+ }
272
+ else {
273
+ throw error;
274
+ }
275
+ }
276
+ await input.drainProtocolCapture();
277
+ if (!url) {
278
+ url = await resolveLatestPostUrl(input.page, input.existingPostPaths);
279
+ }
280
+ return buildInstagramSuccessResult(input.mediaItems, url);
281
+ }
282
+ catch (error) {
283
+ lastError = error;
284
+ if (error instanceof CommandExecutionError && error.message !== 'Failed to open Instagram post composer') {
285
+ lastSpecificCommandError = error;
286
+ }
287
+ if (error instanceof AuthRequiredError)
288
+ throw error;
289
+ if (shareClicked) {
290
+ throw error;
291
+ }
292
+ if (!(error instanceof CommandExecutionError) || attempt === input.commandAttemptBudget - 1) {
293
+ if (error instanceof CommandExecutionError && error.message === 'Failed to open Instagram post composer' && lastSpecificCommandError) {
294
+ throw lastSpecificCommandError;
295
+ }
296
+ throw error;
297
+ }
298
+ let resetWindow = false;
299
+ if (input.mediaItems.length >= 10 && input.page.closeWindow) {
300
+ try {
301
+ await input.drainProtocolCapture();
302
+ await input.page.closeWindow();
303
+ resetWindow = true;
304
+ }
305
+ catch {
306
+ // Best-effort: a fresh automation window is safer than reusing a polluted one.
307
+ }
308
+ }
309
+ if (!resetWindow) {
310
+ await dismissResidualDialogs(input.page);
311
+ await input.page.wait({ time: 1 });
312
+ }
313
+ }
314
+ }
315
+ throw lastError instanceof Error ? lastError : new CommandExecutionError('Instagram post failed');
316
+ }
317
+ async function ensureComposerOpen(page) {
318
+ const result = await page.evaluate(buildEnsureComposerOpenJs());
319
+ if (!result?.ok) {
320
+ if (result?.reason === 'auth')
321
+ throw new AuthRequiredError('www.instagram.com', 'Instagram login required before posting');
322
+ throw new CommandExecutionError('Failed to open Instagram post composer');
323
+ }
324
+ }
325
+ async function dismissResidualDialogs(page) {
326
+ for (let attempt = 0; attempt < 4; attempt++) {
327
+ const result = await page.evaluate(`
328
+ (() => {
329
+ const isVisible = (el) => {
330
+ if (!(el instanceof HTMLElement)) return false;
331
+ const style = window.getComputedStyle(el);
332
+ const rect = el.getBoundingClientRect();
333
+ return style.display !== 'none'
334
+ && style.visibility !== 'hidden'
335
+ && rect.width > 0
336
+ && rect.height > 0;
337
+ };
338
+
339
+ const dialogs = Array.from(document.querySelectorAll('[role="dialog"]'))
340
+ .filter((el) => el instanceof HTMLElement && isVisible(el));
341
+ for (const dialog of dialogs) {
342
+ const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
343
+ if (!text) continue;
344
+ if (
345
+ text.includes('post shared')
346
+ || text.includes('your post has been shared')
347
+ || text.includes('something went wrong')
348
+ || text.includes('sharing')
349
+ || text.includes('create new post')
350
+ || text.includes('crop')
351
+ || text.includes('edit')
352
+ ) {
353
+ const close = dialog.querySelector('[aria-label="Close"], button[aria-label="Close"], div[role="button"][aria-label="Close"]');
354
+ if (close instanceof HTMLElement && isVisible(close)) {
355
+ close.click();
356
+ return { ok: true };
357
+ }
358
+ const closeByText = Array.from(dialog.querySelectorAll('button, div[role="button"]')).find((el) => {
359
+ const buttonText = (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
360
+ return isVisible(el) && (buttonText === 'close' || buttonText === 'cancel' || buttonText === '取消');
361
+ });
362
+ if (closeByText instanceof HTMLElement) {
363
+ closeByText.click();
364
+ return { ok: true };
365
+ }
366
+ }
367
+ }
368
+
369
+ return { ok: false };
370
+ })()
371
+ `);
372
+ if (!result?.ok)
373
+ return;
374
+ await page.wait({ time: 0.5 });
375
+ }
376
+ }
377
+ async function findUploadSelectors(page, mediaItems) {
378
+ const includesVideo = mediaItems.some((item) => item.type === 'video');
379
+ const result = await page.evaluate(`
380
+ ((includesVideo) => {
381
+ const isVisible = (el) => {
382
+ if (!(el instanceof HTMLElement)) return false;
383
+ const style = window.getComputedStyle(el);
384
+ const rect = el.getBoundingClientRect();
385
+ return style.display !== 'none'
386
+ && style.visibility !== 'hidden'
387
+ && rect.width > 0
388
+ && rect.height > 0;
389
+ };
390
+ const hasButtonText = (root, labels) => {
391
+ if (!root || !(root instanceof Element)) return false;
392
+ return Array.from(root.querySelectorAll('button, div[role="button"], span'))
393
+ .some((el) => {
394
+ const text = (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
395
+ return labels.some((label) => text === label.toLowerCase());
396
+ });
397
+ };
398
+
399
+ const inputs = Array.from(document.querySelectorAll('input[type="file"]'));
400
+ const candidates = inputs.filter((el) => {
401
+ if (!(el instanceof HTMLInputElement)) return false;
402
+ if (el.disabled) return false;
403
+ const accept = (el.getAttribute('accept') || '').toLowerCase();
404
+ if (!accept) return true;
405
+ if (includesVideo) return true;
406
+ return accept.includes('image') || accept.includes('.jpg') || accept.includes('.jpeg') || accept.includes('.png') || accept.includes('.webp');
407
+ });
408
+
409
+ const dialogInputs = candidates.filter((el) => {
410
+ const dialog = el.closest('[role="dialog"]');
411
+ return hasButtonText(dialog, ['Select from computer', '从电脑中选择']);
412
+ });
413
+
414
+ const visibleDialogInputs = dialogInputs.filter((el) => {
415
+ const dialog = el.closest('[role="dialog"]');
416
+ return dialog instanceof HTMLElement && isVisible(dialog);
417
+ });
418
+
419
+ const pickerInputs = candidates.filter((el) => {
420
+ return hasButtonText(el.parentElement, ['Select from computer', '从电脑中选择']);
421
+ });
422
+
423
+ const primary = visibleDialogInputs.length
424
+ ? [visibleDialogInputs[visibleDialogInputs.length - 1]]
425
+ : dialogInputs.length
426
+ ? [dialogInputs[dialogInputs.length - 1]]
427
+ : [];
428
+ const ordered = [...primary, ...pickerInputs, ...candidates]
429
+ .filter((el, index, arr) => arr.indexOf(el) === index);
430
+ if (!ordered.length) return { ok: false };
431
+
432
+ document.querySelectorAll('[data-opencli-ig-upload-index]').forEach((el) => el.removeAttribute('data-opencli-ig-upload-index'));
433
+ const selectors = ordered.map((input, index) => {
434
+ input.setAttribute('data-opencli-ig-upload-index', String(index));
435
+ return '[data-opencli-ig-upload-index="' + index + '"]';
436
+ });
437
+ return { ok: true, selectors };
438
+ })(${JSON.stringify(includesVideo)})
439
+ `);
440
+ if (!result?.ok || !result.selectors?.length) {
441
+ throw new CommandExecutionError('Instagram upload input not found', 'Open the new-post composer in a logged-in browser session and retry');
442
+ }
443
+ return result.selectors;
444
+ }
445
+ async function resolveUploadSelectors(page, mediaItems) {
446
+ try {
447
+ return await findUploadSelectors(page, mediaItems);
448
+ }
449
+ catch (error) {
450
+ if (!(error instanceof CommandExecutionError) || !error.message.includes('upload input not found')) {
451
+ throw error;
452
+ }
453
+ await ensureComposerOpen(page);
454
+ await page.wait({ time: 1.5 });
455
+ try {
456
+ return await findUploadSelectors(page, mediaItems);
457
+ }
458
+ catch (retryError) {
459
+ if (!(retryError instanceof CommandExecutionError) || !retryError.message.includes('upload input not found')) {
460
+ throw retryError;
461
+ }
462
+ await gotoInstagramHome(page, true);
463
+ await page.wait({ time: 2 });
464
+ await dismissResidualDialogs(page);
465
+ await ensureComposerOpen(page);
466
+ await page.wait({ time: 2 });
467
+ return findUploadSelectors(page, mediaItems);
468
+ }
469
+ }
470
+ }
471
+ function extractSelectorIndex(selector) {
472
+ const match = selector.match(/data-opencli-ig-upload-index="(\d+)"/);
473
+ if (!match)
474
+ return null;
475
+ const index = Number.parseInt(match[1] || '', 10);
476
+ return Number.isNaN(index) ? null : index;
477
+ }
478
+ async function resolveFreshUploadSelector(page, previousSelector, mediaItems) {
479
+ const selectors = await resolveUploadSelectors(page, mediaItems);
480
+ const index = extractSelectorIndex(previousSelector);
481
+ if (index !== null && selectors[index])
482
+ return selectors[index];
483
+ return selectors[0] || previousSelector;
484
+ }
485
+ async function injectImageViaBrowser(page, imagePaths, selector) {
486
+ const images = imagePaths.map((imagePath) => {
487
+ const ext = path.extname(imagePath).toLowerCase();
488
+ const mimeType = ext === '.png'
489
+ ? 'image/png'
490
+ : ext === '.webp'
491
+ ? 'image/webp'
492
+ : 'image/jpeg';
493
+ return {
494
+ name: path.basename(imagePath),
495
+ type: mimeType,
496
+ base64: fs.readFileSync(imagePath).toString('base64'),
497
+ };
498
+ });
499
+ const chunkKey = `__opencliInstagramUpload_${Date.now()}_${Math.random().toString(36).slice(2)}`;
500
+ const chunkSize = 256 * 1024;
501
+ await page.evaluate(`
502
+ (() => {
503
+ window[${JSON.stringify(chunkKey)}] = [];
504
+ return { ok: true };
505
+ })()
506
+ `);
507
+ const payload = JSON.stringify(images);
508
+ for (let offset = 0; offset < payload.length; offset += chunkSize) {
509
+ const chunk = payload.slice(offset, offset + chunkSize);
510
+ await page.evaluate(`
511
+ (() => {
512
+ const key = ${JSON.stringify(chunkKey)};
513
+ const chunk = ${JSON.stringify(chunk)};
514
+ const parts = Array.isArray(window[key]) ? window[key] : [];
515
+ parts.push(chunk);
516
+ window[key] = parts;
517
+ return { ok: true, count: parts.length };
518
+ })()
519
+ `);
520
+ }
521
+ const result = await page.evaluate(`
522
+ (() => {
523
+ const selector = ${JSON.stringify(selector)};
524
+ const key = ${JSON.stringify(chunkKey)};
525
+ const payload = JSON.parse(Array.isArray(window[key]) ? window[key].join('') : '[]');
526
+
527
+ const cleanup = () => { try { delete window[key]; } catch {} };
528
+ const input = document.querySelector(selector);
529
+ if (!(input instanceof HTMLInputElement)) {
530
+ cleanup();
531
+ return { ok: false, error: 'File input not found for fallback injection' };
532
+ }
533
+
534
+ try {
535
+ const dt = new DataTransfer();
536
+ for (const img of payload) {
537
+ const binary = atob(img.base64);
538
+ const bytes = new Uint8Array(binary.length);
539
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
540
+ const blob = new Blob([bytes], { type: img.type });
541
+ const file = new File([blob], img.name, { type: img.type });
542
+ dt.items.add(file);
543
+ }
544
+ Object.defineProperty(input, 'files', { value: dt.files, configurable: true });
545
+ input.dispatchEvent(new Event('change', { bubbles: true }));
546
+ input.dispatchEvent(new Event('input', { bubbles: true }));
547
+ cleanup();
548
+ return { ok: true, count: dt.files.length };
549
+ } catch (error) {
550
+ cleanup();
551
+ return { ok: false, error: String(error) };
552
+ }
553
+ })()
554
+ `);
555
+ if (!result?.ok) {
556
+ throw new CommandExecutionError(result?.error || 'Instagram fallback file injection failed');
557
+ }
558
+ }
559
+ async function dispatchUploadEvents(page, selector) {
560
+ await page.evaluate(`
561
+ (() => {
562
+ const input = document.querySelector(${JSON.stringify(selector)});
563
+ if (!(input instanceof HTMLInputElement)) return { ok: false };
564
+ input.dispatchEvent(new Event('input', { bubbles: true }));
565
+ input.dispatchEvent(new Event('change', { bubbles: true }));
566
+ return { ok: true };
567
+ })()
568
+ `);
569
+ }
570
+ export function buildInspectUploadStageJs() {
571
+ return `
572
+ (() => {
573
+ const isVisible = (el) => {
574
+ if (!(el instanceof HTMLElement)) return false;
575
+ const style = window.getComputedStyle(el);
576
+ const rect = el.getBoundingClientRect();
577
+ return style.display !== 'none'
578
+ && style.visibility !== 'hidden'
579
+ && rect.width > 0
580
+ && rect.height > 0;
581
+ };
582
+ const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
583
+ const visibleTexts = dialogs.map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim());
584
+ const dialogText = visibleTexts.join(' ');
585
+ const combined = dialogText.toLowerCase();
586
+ const hasVisibleButtonInDialogs = (labels) => {
587
+ return dialogs.some((dialog) =>
588
+ Array.from(dialog.querySelectorAll('button, div[role="button"]')).some((el) => {
589
+ const text = (el.textContent || '').replace(/\\s+/g, ' ').trim();
590
+ const aria = (el.getAttribute?.('aria-label') || '').replace(/\\s+/g, ' ').trim();
591
+ return isVisible(el) && (labels.includes(text) || labels.includes(aria));
592
+ })
593
+ );
594
+ };
595
+ const hasCaption = dialogs.some((dialog) => !!dialog.querySelector('textarea, [contenteditable="true"]'));
596
+ const hasPicker = hasVisibleButtonInDialogs(['Select from computer', '从电脑中选择']);
597
+ const hasNext = hasVisibleButtonInDialogs(['Next', '下一步']);
598
+ const hasPreviewUi = hasCaption
599
+ || (!hasPicker && hasNext)
600
+ || /crop|select crop|select zoom|open media gallery|filters|adjustments|裁剪|缩放|滤镜|调整/.test(combined);
601
+ const failed = /something went wrong|please try again|couldn['’]t upload|could not upload|upload failed|try again|出错|失败/.test(combined);
602
+ if (hasPreviewUi) return { state: 'preview', detail: dialogText || '' };
603
+ if (failed) return { state: 'failed', detail: dialogText || 'Something went wrong' };
604
+ return { state: 'pending', detail: dialogText || '' };
605
+ })()
606
+ `;
607
+ }
608
+ async function inspectUploadStage(page) {
609
+ const result = await page.evaluate(buildInspectUploadStageJs());
610
+ if (result?.state)
611
+ return result;
612
+ if (result?.ok === true)
613
+ return { state: 'preview', detail: result.detail };
614
+ return { state: 'pending', detail: result?.detail };
615
+ }
616
+ function makeUploadFailure(detail) {
617
+ return new CommandExecutionError('Instagram image upload failed', detail ? `Instagram rejected the upload: ${detail}` : 'Instagram rejected the upload before the preview stage');
618
+ }
619
+ async function uploadMedia(page, mediaItems, selector) {
620
+ const mediaPaths = mediaItems.map((item) => item.filePath);
621
+ if (!page.setFileInput) {
622
+ throw new CommandExecutionError('Instagram posting requires Browser Bridge file upload support', 'Use Browser Bridge or another browser mode that supports setFileInput');
623
+ }
624
+ let activeSelector = selector;
625
+ for (let attempt = 0; attempt < 2; attempt++) {
626
+ try {
627
+ await page.setFileInput(mediaPaths, activeSelector);
628
+ await dispatchUploadEvents(page, activeSelector);
629
+ return;
630
+ }
631
+ catch (error) {
632
+ const message = error instanceof Error ? error.message : String(error);
633
+ const staleSelector = message.includes('No element found matching selector')
634
+ || message.includes('Could not find node with given id')
635
+ || message.includes('No node with given id found');
636
+ if (staleSelector && attempt === 0) {
637
+ activeSelector = await resolveFreshUploadSelector(page, activeSelector, mediaItems);
638
+ continue;
639
+ }
640
+ if (!message.includes('Unknown action') && !message.includes('set-file-input') && !message.includes('not supported')) {
641
+ throw error;
642
+ }
643
+ if (mediaItems.some((item) => item.type === 'video')) {
644
+ throw new CommandExecutionError('Instagram mixed-media posting requires Browser Bridge file upload support', 'Use Browser Bridge or another browser mode that supports setFileInput for image/video uploads');
645
+ }
646
+ await injectImageViaBrowser(page, mediaPaths, activeSelector);
647
+ return;
648
+ }
649
+ }
650
+ }
651
+ function describePostDetail(mediaItems) {
652
+ if (mediaItems.every((item) => item.type === 'image')) {
653
+ return mediaItems.length === 1
654
+ ? 'Single image post shared successfully'
655
+ : `${mediaItems.length}-image carousel post shared successfully`;
656
+ }
657
+ return mediaItems.length === 1
658
+ ? 'Single mixed-media post shared successfully'
659
+ : `${mediaItems.length}-item mixed-media carousel post shared successfully`;
660
+ }
661
+ function getCommandAttemptBudget(mediaItems) {
662
+ if (mediaItems.length >= 10)
663
+ return 6;
664
+ if (mediaItems.length >= 5)
665
+ return 4;
666
+ return 3;
667
+ }
668
+ function getPreUploadDelaySeconds(mediaItems) {
669
+ if (mediaItems.length >= 10)
670
+ return 3;
671
+ if (mediaItems.length >= 5)
672
+ return 1.5;
673
+ return 0;
674
+ }
675
+ function getUploadAttemptBudget(mediaItems) {
676
+ if (mediaItems.length >= 10)
677
+ return 3;
678
+ if (mediaItems.length >= 5)
679
+ return 3;
680
+ return 2;
681
+ }
682
+ function getPreviewProbeWindowSeconds(mediaItems) {
683
+ if (mediaItems.length >= 10)
684
+ return 6;
685
+ if (mediaItems.length >= 5)
686
+ return 6;
687
+ return 4;
688
+ }
689
+ function getFinalPreviewWaitSeconds(mediaItems) {
690
+ if (mediaItems.length >= 10)
691
+ return 12;
692
+ if (mediaItems.length >= 5)
693
+ return 16;
694
+ return 12;
695
+ }
696
+ function getPreShareDelaySeconds(mediaItems) {
697
+ if (mediaItems.length >= 10)
698
+ return 4;
699
+ if (mediaItems.length >= 5)
700
+ return 3;
701
+ return 0;
702
+ }
703
+ function getInlineUploadRetryBudget(mediaItems) {
704
+ if (mediaItems.length >= 10)
705
+ return 3;
706
+ if (mediaItems.length >= 5)
707
+ return 2;
708
+ return 1;
709
+ }
710
+ async function dismissUploadErrorDialog(page) {
711
+ const result = await page.evaluate(`
712
+ (() => {
713
+ const isVisible = (el) => {
714
+ if (!(el instanceof HTMLElement)) return false;
715
+ const style = window.getComputedStyle(el);
716
+ const rect = el.getBoundingClientRect();
717
+ return style.display !== 'none'
718
+ && style.visibility !== 'hidden'
719
+ && rect.width > 0
720
+ && rect.height > 0;
721
+ };
722
+ const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
723
+ for (const dialog of dialogs) {
724
+ const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
725
+ if (!text.includes('something went wrong') && !text.includes('try again') && !text.includes('失败') && !text.includes('出错')) continue;
726
+ const close = dialog.querySelector('[aria-label="Close"], button[aria-label="Close"], div[role="button"][aria-label="Close"]');
727
+ if (close instanceof HTMLElement && isVisible(close)) {
728
+ close.click();
729
+ return { ok: true };
730
+ }
731
+ }
732
+ return { ok: false };
733
+ })()
734
+ `);
735
+ return !!result?.ok;
736
+ }
737
+ async function clickVisibleUploadRetry(page) {
738
+ const result = await page.evaluate(`
739
+ (() => {
740
+ const isVisible = (el) => {
741
+ if (!(el instanceof HTMLElement)) return false;
742
+ const style = window.getComputedStyle(el);
743
+ const rect = el.getBoundingClientRect();
744
+ return style.display !== 'none'
745
+ && style.visibility !== 'hidden'
746
+ && rect.width > 0
747
+ && rect.height > 0;
748
+ };
749
+ const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
750
+ for (const dialog of dialogs) {
751
+ const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
752
+ if (!text.includes('something went wrong') && !text.includes('try again') && !text.includes('失败') && !text.includes('出错')) continue;
753
+ const retry = Array.from(dialog.querySelectorAll('button, div[role="button"]')).find((el) => {
754
+ const label = ((el.textContent || '') + ' ' + (el.getAttribute?.('aria-label') || ''))
755
+ .replace(/\\s+/g, ' ')
756
+ .trim()
757
+ .toLowerCase();
758
+ return isVisible(el) && (
759
+ label === 'try again'
760
+ || label === 'retry'
761
+ || label === '再试一次'
762
+ || label === '重试'
763
+ );
764
+ });
765
+ if (retry instanceof HTMLElement) {
766
+ retry.click();
767
+ return { ok: true };
768
+ }
769
+ }
770
+ return { ok: false };
771
+ })()
772
+ `);
773
+ return !!result?.ok;
774
+ }
775
+ async function waitForPreview(page, maxWaitSeconds = 12) {
776
+ const attempts = Math.max(1, Math.ceil(maxWaitSeconds));
777
+ for (let attempt = 0; attempt < attempts; attempt++) {
778
+ const state = await inspectUploadStage(page);
779
+ if (state.state === 'preview')
780
+ return;
781
+ if (state.state === 'failed') {
782
+ await page.screenshot({ path: '/tmp/instagram_post_preview_debug.png' });
783
+ throw makeUploadFailure('Inspect /tmp/instagram_post_preview_debug.png. ' + (state.detail || ''));
784
+ }
785
+ if (attempt < attempts - 1)
786
+ await page.wait({ time: 1 });
787
+ }
788
+ await page.screenshot({ path: '/tmp/instagram_post_preview_debug.png' });
789
+ throw new CommandExecutionError('Instagram image preview did not appear after upload', 'The selected file input may not match the active composer; inspect /tmp/instagram_post_preview_debug.png');
790
+ }
791
+ async function waitForPreviewMaybe(page, maxWaitSeconds = 4) {
792
+ const attempts = Math.max(1, Math.ceil(maxWaitSeconds * 2));
793
+ for (let attempt = 0; attempt < attempts; attempt++) {
794
+ const state = await inspectUploadStage(page);
795
+ if (state.state !== 'pending')
796
+ return state;
797
+ if (attempt < attempts - 1)
798
+ await page.wait({ time: 0.5 });
799
+ }
800
+ return { state: 'pending' };
801
+ }
802
+ export function buildClickActionJs(labels, scope = 'any') {
803
+ return `
804
+ ((labels, scope) => {
805
+ const isVisible = (el) => {
806
+ if (!(el instanceof HTMLElement)) return false;
807
+ const style = window.getComputedStyle(el);
808
+ const rect = el.getBoundingClientRect();
809
+ return style.display !== 'none'
810
+ && style.visibility !== 'hidden'
811
+ && rect.width > 0
812
+ && rect.height > 0;
813
+ };
814
+
815
+ const matchesScope = (dialog) => {
816
+ if (!(dialog instanceof HTMLElement) || !isVisible(dialog)) return false;
817
+ const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
818
+ if (scope === 'caption') {
819
+ return !!dialog.querySelector('textarea, [contenteditable="true"]')
820
+ || text.includes('write a caption')
821
+ || text.includes('add location')
822
+ || text.includes('add collaborators')
823
+ || text.includes('accessibility')
824
+ || text.includes('advanced settings');
825
+ }
826
+ if (scope === 'media') {
827
+ return !!dialog.querySelector('input[type="file"]')
828
+ || text.includes('select from computer')
829
+ || text.includes('crop')
830
+ || text.includes('filters')
831
+ || text.includes('adjustments')
832
+ || text.includes('open media gallery')
833
+ || text.includes('select crop')
834
+ || text.includes('select zoom');
835
+ }
836
+ return true;
837
+ };
838
+
839
+ const containers = scope !== 'any'
840
+ ? Array.from(document.querySelectorAll('[role="dialog"]')).filter(matchesScope)
841
+ : [document.body];
842
+
843
+ for (const container of containers) {
844
+ const nodes = Array.from(container.querySelectorAll('button, div[role="button"]'));
845
+ for (const node of nodes) {
846
+ const text = (node.textContent || '').replace(/\\s+/g, ' ').trim();
847
+ const aria = (node.getAttribute?.('aria-label') || '').replace(/\\s+/g, ' ').trim();
848
+ if (!text && !aria) continue;
849
+ if (!labels.includes(text) && !labels.includes(aria)) continue;
850
+ if (node instanceof HTMLElement && isVisible(node) && node.getAttribute('aria-disabled') !== 'true') {
851
+ node.click();
852
+ return { ok: true, label: text || aria };
853
+ }
854
+ }
855
+ }
856
+ return { ok: false };
857
+ })(${JSON.stringify(labels)}, ${JSON.stringify(scope)})
858
+ `;
859
+ }
860
+ async function clickAction(page, labels, scope = 'any') {
861
+ const result = await page.evaluate(buildClickActionJs(labels, scope));
862
+ if (!result?.ok) {
863
+ throw new CommandExecutionError(`Instagram action button not found: ${labels.join(' / ')}`);
864
+ }
865
+ return result.label || labels[0];
866
+ }
867
+ async function clickVisibleShareRetry(page) {
868
+ const result = await page.evaluate(`
869
+ (() => {
870
+ const isVisible = (el) => {
871
+ if (!(el instanceof HTMLElement)) return false;
872
+ const style = window.getComputedStyle(el);
873
+ const rect = el.getBoundingClientRect();
874
+ return style.display !== 'none'
875
+ && style.visibility !== 'hidden'
876
+ && rect.width > 0
877
+ && rect.height > 0;
878
+ };
879
+
880
+ const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
881
+ for (const dialog of dialogs) {
882
+ const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
883
+ if (!text.includes('post couldn') && !text.includes('could not be shared') && !text.includes('share failed')) continue;
884
+
885
+ const retry = Array.from(dialog.querySelectorAll('button, div[role="button"]')).find((el) => {
886
+ const label = ((el.textContent || '') + ' ' + (el.getAttribute?.('aria-label') || ''))
887
+ .replace(/\\s+/g, ' ')
888
+ .trim()
889
+ .toLowerCase();
890
+ return isVisible(el) && (
891
+ label === 'try again'
892
+ || label === 'retry'
893
+ || label === '再试一次'
894
+ || label === '重试'
895
+ );
896
+ });
897
+
898
+ if (retry instanceof HTMLElement) {
899
+ retry.click();
900
+ return { ok: true };
901
+ }
902
+ }
903
+
904
+ return { ok: false };
905
+ })()
906
+ `);
907
+ return !!result?.ok;
908
+ }
909
+ async function hasCaptionEditor(page) {
910
+ const result = await page.evaluate(`
911
+ (() => {
912
+ const editable = document.querySelector('textarea, [contenteditable="true"]');
913
+ return { ok: !!editable };
914
+ })()
915
+ `);
916
+ return !!result?.ok;
917
+ }
918
+ async function isCaptionStage(page) {
919
+ const result = await page.evaluate(`
920
+ (() => {
921
+ const editable = document.querySelector('textarea, [contenteditable="true"]');
922
+ const dialogText = Array.from(document.querySelectorAll('[role="dialog"]'))
923
+ .map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase())
924
+ .join(' ');
925
+ return {
926
+ ok: !!editable
927
+ || dialogText.includes('write a caption')
928
+ || dialogText.includes('add location')
929
+ || dialogText.includes('add collaborators')
930
+ || dialogText.includes('advanced settings'),
931
+ };
932
+ })()
933
+ `);
934
+ return !!result?.ok;
935
+ }
936
+ async function advanceToCaptionEditor(page) {
937
+ for (let attempt = 0; attempt < 3; attempt++) {
938
+ if (await isCaptionStage(page)) {
939
+ return;
940
+ }
941
+ try {
942
+ await clickAction(page, ['Next', '下一步'], 'media');
943
+ }
944
+ catch (error) {
945
+ if (error instanceof CommandExecutionError) {
946
+ await page.wait({ time: 1.5 });
947
+ if (await isCaptionStage(page)) {
948
+ return;
949
+ }
950
+ const uploadState = await inspectUploadStage(page);
951
+ if (uploadState.state === 'failed') {
952
+ throw makeUploadFailure(uploadState.detail);
953
+ }
954
+ if (attempt < 2) {
955
+ continue;
956
+ }
957
+ }
958
+ throw error;
959
+ }
960
+ await page.wait({ time: 1.5 });
961
+ if (await hasCaptionEditor(page)) {
962
+ return;
963
+ }
964
+ const uploadState = await inspectUploadStage(page);
965
+ if (uploadState.state === 'failed') {
966
+ throw makeUploadFailure(uploadState.detail);
967
+ }
968
+ }
969
+ await page.screenshot({ path: '/tmp/instagram_post_caption_debug.png' });
970
+ throw new CommandExecutionError('Instagram caption editor did not appear', 'Instagram may have changed the publish flow; inspect /tmp/instagram_post_caption_debug.png');
971
+ }
972
+ async function waitForCaptionEditor(page) {
973
+ if (!(await hasCaptionEditor(page))) {
974
+ await page.screenshot({ path: '/tmp/instagram_post_caption_debug.png' });
975
+ throw new CommandExecutionError('Instagram caption editor did not appear', 'Instagram may have changed the publish flow; inspect /tmp/instagram_post_caption_debug.png');
976
+ }
977
+ }
978
+ async function rethrowUploadFailureIfPresent(page, originalError) {
979
+ const uploadState = await inspectUploadStage(page);
980
+ if (uploadState.state === 'failed') {
981
+ throw makeUploadFailure(uploadState.detail);
982
+ }
983
+ throw originalError;
984
+ }
985
+ async function focusCaptionEditorForNativeInsert(page) {
986
+ const result = await page.evaluate(`
987
+ (() => {
988
+ const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
989
+ if (textarea instanceof HTMLTextAreaElement) {
990
+ textarea.focus();
991
+ textarea.select();
992
+ return { ok: true, kind: 'textarea' };
993
+ }
994
+
995
+ const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
996
+ || document.querySelector('[contenteditable="true"]');
997
+ if (!(editor instanceof HTMLElement)) return { ok: false };
998
+
999
+ const lexical = editor.__lexicalEditor;
1000
+ try {
1001
+ if (lexical && typeof lexical.getEditorState === 'function' && typeof lexical.parseEditorState === 'function') {
1002
+ const emptyState = {
1003
+ root: {
1004
+ children: [{
1005
+ children: [],
1006
+ direction: null,
1007
+ format: '',
1008
+ indent: 0,
1009
+ textFormat: 0,
1010
+ textStyle: '',
1011
+ type: 'paragraph',
1012
+ version: 1,
1013
+ }],
1014
+ direction: null,
1015
+ format: '',
1016
+ indent: 0,
1017
+ type: 'root',
1018
+ version: 1,
1019
+ },
1020
+ };
1021
+ const nextState = lexical.parseEditorState(JSON.stringify(emptyState));
1022
+ try {
1023
+ lexical.setEditorState(nextState, { tag: 'history-merge', discrete: true });
1024
+ } catch {
1025
+ lexical.setEditorState(nextState);
1026
+ }
1027
+ } else {
1028
+ editor.textContent = '';
1029
+ }
1030
+ } catch {
1031
+ editor.textContent = '';
1032
+ }
1033
+
1034
+ editor.focus();
1035
+ const selection = window.getSelection();
1036
+ if (selection) {
1037
+ selection.removeAllRanges();
1038
+ const range = document.createRange();
1039
+ range.selectNodeContents(editor);
1040
+ range.collapse(false);
1041
+ selection.addRange(range);
1042
+ }
1043
+
1044
+ return { ok: true, kind: 'contenteditable' };
1045
+ })()
1046
+ `);
1047
+ return !!result?.ok;
1048
+ }
1049
+ async function fillCaption(page, content) {
1050
+ if (page.insertText && await focusCaptionEditorForNativeInsert(page)) {
1051
+ try {
1052
+ await page.insertText(content);
1053
+ await page.wait({ time: 0.3 });
1054
+ await page.evaluate(`
1055
+ (() => {
1056
+ const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1057
+ if (textarea instanceof HTMLTextAreaElement) {
1058
+ textarea.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType: 'insertText' }));
1059
+ textarea.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1060
+ textarea.blur();
1061
+ return { ok: true };
1062
+ }
1063
+
1064
+ const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1065
+ || document.querySelector('[contenteditable="true"]');
1066
+ if (!(editor instanceof HTMLElement)) return { ok: false };
1067
+ try {
1068
+ editor.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType: 'insertText' }));
1069
+ } catch {
1070
+ editor.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
1071
+ }
1072
+ editor.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1073
+ editor.blur();
1074
+ return { ok: true };
1075
+ })()
1076
+ `);
1077
+ return;
1078
+ }
1079
+ catch {
1080
+ // Fall back to browser-side editor manipulation below.
1081
+ }
1082
+ }
1083
+ const result = await page.evaluate(`
1084
+ ((content) => {
1085
+ const createParagraph = (text) => ({
1086
+ children: text
1087
+ ? [{ detail: 0, format: 0, mode: 'normal', style: '', text, type: 'text', version: 1 }]
1088
+ : [],
1089
+ direction: null,
1090
+ format: '',
1091
+ indent: 0,
1092
+ textFormat: 0,
1093
+ textStyle: '',
1094
+ type: 'paragraph',
1095
+ version: 1,
1096
+ });
1097
+
1098
+ const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1099
+ if (textarea instanceof HTMLTextAreaElement) {
1100
+ textarea.focus();
1101
+ const dt = new DataTransfer();
1102
+ dt.setData('text/plain', content);
1103
+ textarea.dispatchEvent(new ClipboardEvent('paste', {
1104
+ clipboardData: dt,
1105
+ bubbles: true,
1106
+ cancelable: true,
1107
+ }));
1108
+ const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;
1109
+ setter?.call(textarea, content);
1110
+ textarea.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
1111
+ textarea.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1112
+ return { ok: true, mode: 'textarea' };
1113
+ }
1114
+
1115
+ const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1116
+ || document.querySelector('[contenteditable="true"]');
1117
+ if (editor instanceof HTMLElement) {
1118
+ editor.focus();
1119
+ const lexical = editor.__lexicalEditor;
1120
+ if (lexical && typeof lexical.getEditorState === 'function' && typeof lexical.parseEditorState === 'function') {
1121
+ const currentState = lexical.getEditorState && lexical.getEditorState();
1122
+ const base = currentState && typeof currentState.toJSON === 'function' ? currentState.toJSON() : {};
1123
+ const lines = String(content).split(/\\r?\\n/);
1124
+ const paragraphs = lines.map((line) => createParagraph(line));
1125
+ base.root = {
1126
+ children: paragraphs.length ? paragraphs : [createParagraph('')],
1127
+ direction: null,
1128
+ format: '',
1129
+ indent: 0,
1130
+ type: 'root',
1131
+ version: 1,
1132
+ };
1133
+
1134
+ const nextState = lexical.parseEditorState(JSON.stringify(base));
1135
+ try {
1136
+ lexical.setEditorState(nextState, { tag: 'history-merge', discrete: true });
1137
+ } catch {
1138
+ lexical.setEditorState(nextState);
1139
+ }
1140
+
1141
+ editor.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
1142
+ editor.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1143
+ const nextCurrentState = lexical.getEditorState && lexical.getEditorState();
1144
+ const pendingState = lexical._pendingEditorState;
1145
+ return {
1146
+ ok: true,
1147
+ mode: 'lexical',
1148
+ value: editor.textContent || '',
1149
+ current: nextCurrentState && typeof nextCurrentState.toJSON === 'function' ? nextCurrentState.toJSON() : null,
1150
+ pending: pendingState && typeof pendingState.toJSON === 'function' ? pendingState.toJSON() : null,
1151
+ };
1152
+ }
1153
+
1154
+ const selection = window.getSelection();
1155
+ if (selection) {
1156
+ selection.removeAllRanges();
1157
+ const range = document.createRange();
1158
+ range.selectNodeContents(editor);
1159
+ selection.addRange(range);
1160
+ }
1161
+ const dt = new DataTransfer();
1162
+ dt.setData('text/plain', content);
1163
+ editor.dispatchEvent(new ClipboardEvent('paste', {
1164
+ clipboardData: dt,
1165
+ bubbles: true,
1166
+ cancelable: true,
1167
+ }));
1168
+ return { ok: true, mode: 'contenteditable', value: editor.textContent || '' };
1169
+ }
1170
+
1171
+ return { ok: false };
1172
+ })(${JSON.stringify(content)})
1173
+ `);
1174
+ if (!result?.ok) {
1175
+ throw new CommandExecutionError('Failed to fill Instagram caption');
1176
+ }
1177
+ }
1178
+ async function captionMatches(page, content) {
1179
+ const result = await page.evaluate(`
1180
+ ((content) => {
1181
+ const normalized = content.trim();
1182
+ const readLexicalText = (node) => {
1183
+ if (!node || typeof node !== 'object') return '';
1184
+ if (node.type === 'text' && typeof node.text === 'string') return node.text;
1185
+ if (!Array.isArray(node.children)) return '';
1186
+ if (node.type === 'root') {
1187
+ return node.children.map((child) => readLexicalText(child)).join('\\n');
1188
+ }
1189
+ if (node.type === 'paragraph') {
1190
+ return node.children.map((child) => readLexicalText(child)).join('');
1191
+ }
1192
+ return node.children.map((child) => readLexicalText(child)).join('');
1193
+ };
1194
+
1195
+ const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1196
+ if (textarea instanceof HTMLTextAreaElement) {
1197
+ return { ok: textarea.value.trim() === normalized };
1198
+ }
1199
+
1200
+ const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1201
+ || document.querySelector('[contenteditable="true"]');
1202
+ if (editor instanceof HTMLElement) {
1203
+ const lexical = editor.__lexicalEditor;
1204
+ if (lexical && typeof lexical.getEditorState === 'function') {
1205
+ const currentState = lexical.getEditorState();
1206
+ const pendingState = lexical._pendingEditorState;
1207
+ const current = currentState && typeof currentState.toJSON === 'function' ? currentState.toJSON() : null;
1208
+ const pending = pendingState && typeof pendingState.toJSON === 'function' ? pendingState.toJSON() : null;
1209
+ const currentText = readLexicalText(current && current.root).trim();
1210
+ const pendingText = readLexicalText(pending && pending.root).trim();
1211
+ if (currentText === normalized || pendingText === normalized) {
1212
+ return { ok: true, currentText, pendingText };
1213
+ }
1214
+ }
1215
+
1216
+ const text = (editor.textContent || '').replace(/\\u00a0/g, ' ').trim();
1217
+ if (text === normalized) return { ok: true };
1218
+
1219
+ const counters = Array.from(document.querySelectorAll('div, span'))
1220
+ .map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim())
1221
+ .filter(Boolean);
1222
+ const counter = counters.find((value) => /\\d+\\s*\\/\\s*2,?200/.test(value));
1223
+ if (counter) {
1224
+ const match = counter.match(/(\\d+)\\s*\\/\\s*2,?200/);
1225
+ if (match && Number(match[1]) >= normalized.length) return { ok: true };
1226
+ }
1227
+
1228
+ return { ok: false, text, counter: counter || '' };
1229
+ }
1230
+
1231
+ return { ok: false };
1232
+ })(${JSON.stringify(content)})
1233
+ `);
1234
+ return !!result?.ok;
1235
+ }
1236
+ async function ensureCaptionFilled(page, content) {
1237
+ for (let attempt = 0; attempt < 6; attempt++) {
1238
+ if (await captionMatches(page, content)) {
1239
+ return;
1240
+ }
1241
+ if (attempt < 5) {
1242
+ await page.wait({ time: 0.5 });
1243
+ }
1244
+ }
1245
+ await page.screenshot({ path: '/tmp/instagram_post_caption_fill_debug.png' });
1246
+ throw new CommandExecutionError('Instagram caption did not stick before sharing', 'Inspect /tmp/instagram_post_caption_fill_debug.png for the caption editor state');
1247
+ }
1248
+ async function waitForPublishSuccess(page) {
1249
+ let settledStreak = 0;
1250
+ for (let attempt = 0; attempt < 90; attempt++) {
1251
+ const result = await page.evaluate(buildPublishStatusProbeJs());
1252
+ if (result?.failed) {
1253
+ await page.screenshot({ path: '/tmp/instagram_post_share_debug.png' });
1254
+ throw new CommandExecutionError('Instagram post share failed', 'Inspect /tmp/instagram_post_share_debug.png for the share failure state');
1255
+ }
1256
+ if (result?.ok) {
1257
+ return result.url || '';
1258
+ }
1259
+ if (result?.settled) {
1260
+ settledStreak += 1;
1261
+ if (settledStreak >= 3)
1262
+ return '';
1263
+ }
1264
+ else {
1265
+ settledStreak = 0;
1266
+ }
1267
+ if (attempt < 89) {
1268
+ await page.wait({ time: 1 });
1269
+ }
1270
+ }
1271
+ await page.screenshot({ path: '/tmp/instagram_post_share_debug.png' });
1272
+ throw new CommandExecutionError('Instagram post share confirmation did not appear', 'Inspect /tmp/instagram_post_share_debug.png for the final publish state');
1273
+ }
1274
+ async function resolveCurrentUserId(page) {
1275
+ const cookies = await page.getCookies({ domain: 'instagram.com' });
1276
+ return cookies.find((cookie) => cookie.name === 'ds_user_id')?.value || '';
1277
+ }
1278
+ async function resolveProfileUrl(page, currentUserId = '') {
1279
+ if (currentUserId) {
1280
+ const runtimeInfo = await resolveInstagramRuntimeInfo(page);
1281
+ const apiResult = await page.evaluate(`
1282
+ (async () => {
1283
+ const userId = ${JSON.stringify(currentUserId)};
1284
+ const appId = ${JSON.stringify(runtimeInfo.appId || '')};
1285
+ try {
1286
+ const res = await fetch(
1287
+ 'https://www.instagram.com/api/v1/users/' + encodeURIComponent(userId) + '/info/',
1288
+ {
1289
+ credentials: 'include',
1290
+ headers: appId ? { 'X-IG-App-ID': appId } : {},
1291
+ },
1292
+ );
1293
+ if (!res.ok) return { ok: false };
1294
+ const data = await res.json();
1295
+ const username = data?.user?.username || '';
1296
+ return { ok: !!username, username };
1297
+ } catch {
1298
+ return { ok: false };
1299
+ }
1300
+ })()
1301
+ `);
1302
+ if (apiResult?.ok && apiResult.username) {
1303
+ return new URL(`/${apiResult.username}/`, INSTAGRAM_HOME_URL).toString();
1304
+ }
1305
+ }
1306
+ const result = await page.evaluate(`
1307
+ (() => {
1308
+ const isVisible = (el) => {
1309
+ if (!(el instanceof HTMLElement)) return false;
1310
+ const style = window.getComputedStyle(el);
1311
+ const rect = el.getBoundingClientRect();
1312
+ return style.display !== 'none'
1313
+ && style.visibility !== 'hidden'
1314
+ && rect.width > 0
1315
+ && rect.height > 0;
1316
+ };
1317
+
1318
+ const anchors = Array.from(document.querySelectorAll('a[href]'))
1319
+ .filter((el) => el instanceof HTMLAnchorElement && isVisible(el))
1320
+ .map((el) => ({
1321
+ href: el.getAttribute('href') || '',
1322
+ text: (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase(),
1323
+ aria: (el.getAttribute('aria-label') || '').replace(/\\s+/g, ' ').trim().toLowerCase(),
1324
+ }))
1325
+ .filter((el) => /^\\/[^/?#]+\\/$/.test(el.href));
1326
+
1327
+ const explicitProfile = anchors.find((el) => el.text === 'profile' || el.aria === 'profile')?.href || '';
1328
+ const path = explicitProfile;
1329
+ return { ok: !!path, path };
1330
+ })()
1331
+ `);
1332
+ if (!result?.ok || !result.path)
1333
+ return '';
1334
+ return new URL(result.path, INSTAGRAM_HOME_URL).toString();
1335
+ }
1336
+ async function collectVisibleProfilePostPaths(page) {
1337
+ const result = await page.evaluate(`
1338
+ (() => {
1339
+ const isVisible = (el) => {
1340
+ if (!(el instanceof HTMLElement)) return false;
1341
+ const style = window.getComputedStyle(el);
1342
+ const rect = el.getBoundingClientRect();
1343
+ return style.display !== 'none'
1344
+ && style.visibility !== 'hidden'
1345
+ && rect.width > 0
1346
+ && rect.height > 0;
1347
+ };
1348
+
1349
+ const hrefs = Array.from(document.querySelectorAll('a[href*="/p/"]'))
1350
+ .filter((el) => el instanceof HTMLAnchorElement && isVisible(el))
1351
+ .map((el) => el.getAttribute('href') || '')
1352
+ .filter((href) => /^\\/(?:[^/?#]+\\/)?p\\/[^/?#]+\\/?$/.test(href))
1353
+ .filter((href, index, arr) => arr.indexOf(href) === index);
1354
+
1355
+ return { ok: hrefs.length > 0, hrefs };
1356
+ })()
1357
+ `);
1358
+ return Array.isArray(result?.hrefs) ? result.hrefs.filter(Boolean) : [];
1359
+ }
1360
+ async function captureExistingProfilePostPaths(page) {
1361
+ const currentUserId = await resolveCurrentUserId(page);
1362
+ if (!currentUserId)
1363
+ return new Set();
1364
+ const profileUrl = await resolveProfileUrl(page, currentUserId);
1365
+ if (!profileUrl)
1366
+ return new Set();
1367
+ try {
1368
+ await page.goto(profileUrl);
1369
+ await page.wait({ time: 3 });
1370
+ return new Set(await collectVisibleProfilePostPaths(page));
1371
+ }
1372
+ catch {
1373
+ return new Set();
1374
+ }
1375
+ }
1376
+ async function resolveLatestPostUrl(page, existingPostPaths) {
1377
+ const currentUrl = await page.getCurrentUrl?.();
1378
+ if (currentUrl && /\/p\//.test(currentUrl))
1379
+ return currentUrl;
1380
+ const currentUserId = await resolveCurrentUserId(page);
1381
+ const profileUrl = await resolveProfileUrl(page, currentUserId);
1382
+ if (!profileUrl)
1383
+ return '';
1384
+ await page.goto(profileUrl);
1385
+ await page.wait({ time: 4 });
1386
+ for (let attempt = 0; attempt < 8; attempt++) {
1387
+ const hrefs = await collectVisibleProfilePostPaths(page);
1388
+ const href = hrefs.find((candidate) => !existingPostPaths.has(candidate)) || '';
1389
+ if (href) {
1390
+ return new URL(href, INSTAGRAM_HOME_URL).toString();
1391
+ }
1392
+ if (attempt < 7)
1393
+ await page.wait({ time: 1 });
1394
+ }
1395
+ return '';
1396
+ }
1397
+ cli({
1398
+ site: 'instagram',
1399
+ name: 'post',
1400
+ access: 'write',
1401
+ description: 'Post an Instagram feed image or mixed-media carousel',
1402
+ domain: 'www.instagram.com',
1403
+ strategy: Strategy.UI,
1404
+ browser: true,
1405
+ args: [
1406
+ { name: 'media', required: false, valueRequired: true, help: `Comma-separated media paths (images/videos, up to ${MAX_MEDIA_ITEMS})` },
1407
+ { name: 'content', positional: true, required: false, help: 'Caption text' },
1408
+ { name: 'timeout', type: 'int', required: false, default: 300, help: 'Max seconds for the overall command (default: 300)' },
1409
+ ],
1410
+ columns: ['status', 'detail', 'url'],
1411
+ validateArgs: validateInstagramPostArgs,
1412
+ func: async (page, kwargs) => {
1413
+ const browserPage = requirePage(page);
1414
+ const mediaItems = normalizePostMediaItems(kwargs);
1415
+ const content = String(kwargs.content ?? '').trim();
1416
+ const existingPostPaths = await captureExistingProfilePostPaths(browserPage);
1417
+ const commandAttemptBudget = getCommandAttemptBudget(mediaItems);
1418
+ const preUploadDelaySeconds = getPreUploadDelaySeconds(mediaItems);
1419
+ const uploadAttemptBudget = getUploadAttemptBudget(mediaItems);
1420
+ const previewProbeWindowSeconds = getPreviewProbeWindowSeconds(mediaItems);
1421
+ const finalPreviewWaitSeconds = getFinalPreviewWaitSeconds(mediaItems);
1422
+ const preShareDelaySeconds = getPreShareDelaySeconds(mediaItems);
1423
+ const inlineUploadRetryBudget = getInlineUploadRetryBudget(mediaItems);
1424
+ const protocolCaptureEnabled = process.env.OPENCLI_INSTAGRAM_CAPTURE === '1';
1425
+ const protocolCaptureData = [];
1426
+ const protocolCaptureErrors = [];
1427
+ const installProtocolCapture = async () => {
1428
+ if (!protocolCaptureEnabled)
1429
+ return;
1430
+ await installInstagramProtocolCapture(browserPage);
1431
+ };
1432
+ const drainProtocolCapture = async () => {
1433
+ if (!protocolCaptureEnabled)
1434
+ return;
1435
+ const payload = await readInstagramProtocolCapture(browserPage);
1436
+ if (payload.data.length)
1437
+ protocolCaptureData.push(...payload.data);
1438
+ if (payload.errors.length)
1439
+ protocolCaptureErrors.push(...payload.errors);
1440
+ };
1441
+ try {
1442
+ try {
1443
+ return await executePrivateInstagramPost({
1444
+ page: browserPage,
1445
+ mediaItems,
1446
+ content,
1447
+ existingPostPaths,
1448
+ });
1449
+ }
1450
+ catch (error) {
1451
+ if (error instanceof AuthRequiredError || !isSafePrivateRouteFallbackError(error)) {
1452
+ throw error;
1453
+ }
1454
+ try {
1455
+ return await executeUiInstagramPost({
1456
+ page: browserPage,
1457
+ mediaItems,
1458
+ content,
1459
+ existingPostPaths,
1460
+ commandAttemptBudget,
1461
+ preUploadDelaySeconds,
1462
+ uploadAttemptBudget,
1463
+ previewProbeWindowSeconds,
1464
+ finalPreviewWaitSeconds,
1465
+ preShareDelaySeconds,
1466
+ inlineUploadRetryBudget,
1467
+ installProtocolCapture,
1468
+ drainProtocolCapture,
1469
+ forceFreshStart: true,
1470
+ });
1471
+ }
1472
+ catch (uiError) {
1473
+ if (uiError instanceof AuthRequiredError)
1474
+ throw uiError;
1475
+ if (uiError instanceof CommandExecutionError) {
1476
+ throw new CommandExecutionError(uiError.message, buildFallbackHint(error, uiError));
1477
+ }
1478
+ throw uiError;
1479
+ }
1480
+ }
1481
+ }
1482
+ finally {
1483
+ if (protocolCaptureEnabled) {
1484
+ try {
1485
+ await drainProtocolCapture();
1486
+ }
1487
+ catch {
1488
+ // Best-effort: capture export should not hide the main command result.
1489
+ }
1490
+ fs.writeFileSync(INSTAGRAM_PROTOCOL_TRACE_OUTPUT_PATH, JSON.stringify({
1491
+ data: protocolCaptureData,
1492
+ errors: protocolCaptureErrors,
1493
+ }, null, 2));
1494
+ }
1495
+ }
1496
+ },
1497
+ });