@jackwener/opencli 1.6.2 → 1.6.3

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 (1894) hide show
  1. package/README.md +7 -7
  2. package/README.zh-CN.md +9 -9
  3. package/dist/browser/cdp.d.ts +1 -40
  4. package/dist/browser/cdp.js +2 -310
  5. package/dist/browser/page.d.ts +1 -62
  6. package/dist/browser/page.js +2 -304
  7. package/dist/browser/utils.d.ts +1 -10
  8. package/dist/browser/utils.js +2 -27
  9. package/dist/cli-manifest.json +546 -2
  10. package/dist/clis/1688/item.js +3 -3
  11. package/dist/clis/1688/search.js +2 -2
  12. package/dist/clis/1688/shared.d.ts +1 -1
  13. package/dist/clis/1688/shared.js +1 -1
  14. package/dist/clis/1688/store.js +2 -2
  15. package/dist/clis/36kr/article.js +2 -2
  16. package/dist/clis/36kr/hot.js +12 -6
  17. package/dist/clis/36kr/news.js +1 -1
  18. package/dist/clis/36kr/search.js +12 -6
  19. package/dist/clis/_shared/desktop-commands.d.ts +5 -5
  20. package/dist/clis/_shared/desktop-commands.js +1 -1
  21. package/dist/clis/amazon/bestsellers.js +1 -1
  22. package/dist/clis/amazon/discussion.js +2 -2
  23. package/dist/clis/amazon/movers-shakers.js +1 -1
  24. package/dist/clis/amazon/new-releases.js +1 -1
  25. package/dist/clis/amazon/offer.js +2 -2
  26. package/dist/clis/amazon/product.js +2 -2
  27. package/dist/clis/amazon/rankings.d.ts +1 -1
  28. package/dist/clis/amazon/rankings.js +2 -2
  29. package/dist/clis/amazon/search.js +2 -2
  30. package/dist/clis/amazon/shared.d.ts +1 -1
  31. package/dist/clis/amazon/shared.js +1 -1
  32. package/dist/clis/antigravity/dump.d.ts +1 -1
  33. package/dist/clis/antigravity/dump.js +1 -1
  34. package/dist/clis/antigravity/extract-code.d.ts +1 -1
  35. package/dist/clis/antigravity/extract-code.js +1 -1
  36. package/dist/clis/antigravity/model.d.ts +1 -1
  37. package/dist/clis/antigravity/model.js +1 -1
  38. package/dist/clis/antigravity/new.d.ts +1 -1
  39. package/dist/clis/antigravity/new.js +1 -1
  40. package/dist/clis/antigravity/read.d.ts +1 -1
  41. package/dist/clis/antigravity/read.js +1 -1
  42. package/dist/clis/antigravity/send.d.ts +1 -1
  43. package/dist/clis/antigravity/send.js +1 -1
  44. package/dist/clis/antigravity/serve.js +2 -2
  45. package/dist/clis/antigravity/status.d.ts +1 -1
  46. package/dist/clis/antigravity/status.js +1 -1
  47. package/dist/clis/antigravity/watch.d.ts +1 -1
  48. package/dist/clis/antigravity/watch.js +1 -1
  49. package/dist/clis/apple-podcasts/commands.test.js +1 -1
  50. package/dist/clis/apple-podcasts/episodes.js +2 -2
  51. package/dist/clis/apple-podcasts/search.js +2 -2
  52. package/dist/clis/apple-podcasts/top.js +2 -2
  53. package/dist/clis/apple-podcasts/utils.js +1 -1
  54. package/dist/clis/arxiv/paper.js +2 -2
  55. package/dist/clis/arxiv/search.js +2 -2
  56. package/dist/clis/arxiv/utils.js +1 -1
  57. package/dist/clis/band/bands.js +2 -2
  58. package/dist/clis/band/mentions.js +2 -2
  59. package/dist/clis/band/post.js +2 -2
  60. package/dist/clis/band/posts.js +2 -2
  61. package/dist/clis/barchart/flow.js +1 -1
  62. package/dist/clis/barchart/greeks.js +1 -1
  63. package/dist/clis/barchart/options.js +1 -1
  64. package/dist/clis/barchart/quote.js +1 -1
  65. package/dist/clis/bbc/news.js +1 -1
  66. package/dist/clis/bilibili/comments.js +1 -1
  67. package/dist/clis/bilibili/comments.test.js +1 -1
  68. package/dist/clis/bilibili/download.js +1 -1
  69. package/dist/clis/bilibili/dynamic.js +1 -1
  70. package/dist/clis/bilibili/dynamic.test.js +1 -1
  71. package/dist/clis/bilibili/favorite.js +1 -1
  72. package/dist/clis/bilibili/feed.js +1 -1
  73. package/dist/clis/bilibili/following.js +2 -2
  74. package/dist/clis/bilibili/history.js +1 -1
  75. package/dist/clis/bilibili/me.js +1 -1
  76. package/dist/clis/bilibili/ranking.js +1 -1
  77. package/dist/clis/bilibili/search.js +1 -1
  78. package/dist/clis/bilibili/subtitle.js +2 -2
  79. package/dist/clis/bilibili/subtitle.test.js +2 -2
  80. package/dist/clis/bilibili/user-videos.js +1 -1
  81. package/dist/clis/bilibili/utils.d.ts +1 -1
  82. package/dist/clis/bilibili/utils.js +1 -1
  83. package/dist/clis/bloomberg/businessweek.js +1 -1
  84. package/dist/clis/bloomberg/economics.js +1 -1
  85. package/dist/clis/bloomberg/feeds.js +1 -1
  86. package/dist/clis/bloomberg/industries.js +1 -1
  87. package/dist/clis/bloomberg/main.js +1 -1
  88. package/dist/clis/bloomberg/markets.js +1 -1
  89. package/dist/clis/bloomberg/news.js +2 -2
  90. package/dist/clis/bloomberg/opinions.js +1 -1
  91. package/dist/clis/bloomberg/politics.js +1 -1
  92. package/dist/clis/bloomberg/tech.js +1 -1
  93. package/dist/clis/bloomberg/utils.js +1 -1
  94. package/dist/clis/boss/batchgreet.js +1 -1
  95. package/dist/clis/boss/chatlist.js +1 -1
  96. package/dist/clis/boss/chatmsg.js +1 -1
  97. package/dist/clis/boss/detail.js +1 -1
  98. package/dist/clis/boss/exchange.js +1 -1
  99. package/dist/clis/boss/greet.js +1 -1
  100. package/dist/clis/boss/invite.js +1 -1
  101. package/dist/clis/boss/joblist.js +1 -1
  102. package/dist/clis/boss/mark.js +2 -2
  103. package/dist/clis/boss/recommend.js +1 -1
  104. package/dist/clis/boss/resume.js +1 -1
  105. package/dist/clis/boss/search.js +1 -1
  106. package/dist/clis/boss/send.js +2 -2
  107. package/dist/clis/boss/stats.js +1 -1
  108. package/dist/clis/boss/utils.d.ts +1 -1
  109. package/dist/clis/chaoxing/assignments.js +2 -2
  110. package/dist/clis/chaoxing/exams.js +1 -1
  111. package/dist/clis/chaoxing/utils.d.ts +1 -1
  112. package/dist/clis/chatgpt/ask.d.ts +1 -1
  113. package/dist/clis/chatgpt/ask.js +2 -2
  114. package/dist/clis/chatgpt/model.d.ts +1 -1
  115. package/dist/clis/chatgpt/model.js +2 -2
  116. package/dist/clis/chatgpt/new.d.ts +1 -1
  117. package/dist/clis/chatgpt/new.js +2 -2
  118. package/dist/clis/chatgpt/read.d.ts +1 -1
  119. package/dist/clis/chatgpt/read.js +2 -2
  120. package/dist/clis/chatgpt/send.d.ts +1 -1
  121. package/dist/clis/chatgpt/send.js +2 -2
  122. package/dist/clis/chatgpt/status.d.ts +1 -1
  123. package/dist/clis/chatgpt/status.js +2 -2
  124. package/dist/clis/chatwise/ask.d.ts +1 -1
  125. package/dist/clis/chatwise/ask.js +2 -2
  126. package/dist/clis/chatwise/export.d.ts +1 -1
  127. package/dist/clis/chatwise/export.js +1 -1
  128. package/dist/clis/chatwise/history.d.ts +1 -1
  129. package/dist/clis/chatwise/history.js +1 -1
  130. package/dist/clis/chatwise/model.d.ts +1 -1
  131. package/dist/clis/chatwise/model.js +2 -2
  132. package/dist/clis/chatwise/new.d.ts +1 -1
  133. package/dist/clis/chatwise/read.d.ts +1 -1
  134. package/dist/clis/chatwise/read.js +1 -1
  135. package/dist/clis/chatwise/screenshot.d.ts +1 -1
  136. package/dist/clis/chatwise/send.d.ts +1 -1
  137. package/dist/clis/chatwise/send.js +2 -2
  138. package/dist/clis/chatwise/status.d.ts +1 -1
  139. package/dist/clis/codex/ask.d.ts +1 -1
  140. package/dist/clis/codex/ask.js +2 -2
  141. package/dist/clis/codex/dump.d.ts +1 -1
  142. package/dist/clis/codex/export.d.ts +1 -1
  143. package/dist/clis/codex/export.js +1 -1
  144. package/dist/clis/codex/extract-diff.d.ts +1 -1
  145. package/dist/clis/codex/extract-diff.js +1 -1
  146. package/dist/clis/codex/history.d.ts +1 -1
  147. package/dist/clis/codex/history.js +1 -1
  148. package/dist/clis/codex/model.d.ts +1 -1
  149. package/dist/clis/codex/model.js +1 -1
  150. package/dist/clis/codex/new.d.ts +1 -1
  151. package/dist/clis/codex/read.d.ts +1 -1
  152. package/dist/clis/codex/read.js +1 -1
  153. package/dist/clis/codex/screenshot.d.ts +1 -1
  154. package/dist/clis/codex/send.d.ts +1 -1
  155. package/dist/clis/codex/send.js +2 -2
  156. package/dist/clis/codex/status.d.ts +1 -1
  157. package/dist/clis/coupang/add-to-cart.js +1 -1
  158. package/dist/clis/coupang/search.js +1 -1
  159. package/dist/clis/ctrip/search.js +2 -2
  160. package/dist/clis/ctrip/search.test.js +1 -1
  161. package/dist/clis/cursor/ask.d.ts +1 -1
  162. package/dist/clis/cursor/ask.js +2 -2
  163. package/dist/clis/cursor/composer.d.ts +1 -1
  164. package/dist/clis/cursor/composer.js +2 -2
  165. package/dist/clis/cursor/dump.d.ts +1 -1
  166. package/dist/clis/cursor/export.d.ts +1 -1
  167. package/dist/clis/cursor/export.js +1 -1
  168. package/dist/clis/cursor/extract-code.d.ts +1 -1
  169. package/dist/clis/cursor/extract-code.js +1 -1
  170. package/dist/clis/cursor/history.d.ts +1 -1
  171. package/dist/clis/cursor/history.js +1 -1
  172. package/dist/clis/cursor/model.d.ts +1 -1
  173. package/dist/clis/cursor/model.js +1 -1
  174. package/dist/clis/cursor/new.d.ts +1 -1
  175. package/dist/clis/cursor/read.d.ts +1 -1
  176. package/dist/clis/cursor/read.js +2 -2
  177. package/dist/clis/cursor/screenshot.d.ts +1 -1
  178. package/dist/clis/cursor/send.d.ts +1 -1
  179. package/dist/clis/cursor/send.js +2 -2
  180. package/dist/clis/cursor/status.d.ts +1 -1
  181. package/dist/clis/discord-app/channels.d.ts +1 -1
  182. package/dist/clis/discord-app/channels.js +1 -1
  183. package/dist/clis/discord-app/members.d.ts +1 -1
  184. package/dist/clis/discord-app/members.js +1 -1
  185. package/dist/clis/discord-app/read.d.ts +1 -1
  186. package/dist/clis/discord-app/read.js +1 -1
  187. package/dist/clis/discord-app/search.d.ts +1 -1
  188. package/dist/clis/discord-app/search.js +1 -1
  189. package/dist/clis/discord-app/send.d.ts +1 -1
  190. package/dist/clis/discord-app/send.js +1 -1
  191. package/dist/clis/discord-app/servers.d.ts +1 -1
  192. package/dist/clis/discord-app/servers.js +1 -1
  193. package/dist/clis/discord-app/status.d.ts +1 -1
  194. package/dist/clis/discord-app/status.js +1 -1
  195. package/dist/clis/douban/book-hot.js +1 -1
  196. package/dist/clis/douban/download.js +2 -2
  197. package/dist/clis/douban/download.test.js +1 -1
  198. package/dist/clis/douban/marks.js +1 -1
  199. package/dist/clis/douban/movie-hot.js +1 -1
  200. package/dist/clis/douban/photos.js +1 -1
  201. package/dist/clis/douban/reviews.js +1 -1
  202. package/dist/clis/douban/search.js +1 -1
  203. package/dist/clis/douban/utils.d.ts +1 -1
  204. package/dist/clis/douban/utils.js +1 -1
  205. package/dist/clis/doubao/ask.d.ts +1 -1
  206. package/dist/clis/doubao/ask.js +1 -1
  207. package/dist/clis/doubao/detail.d.ts +1 -1
  208. package/dist/clis/doubao/detail.js +1 -1
  209. package/dist/clis/doubao/detail.test.js +1 -1
  210. package/dist/clis/doubao/history.d.ts +1 -1
  211. package/dist/clis/doubao/history.js +1 -1
  212. package/dist/clis/doubao/history.test.js +1 -1
  213. package/dist/clis/doubao/meeting-summary.d.ts +1 -1
  214. package/dist/clis/doubao/meeting-summary.js +1 -1
  215. package/dist/clis/doubao/meeting-transcript.d.ts +1 -1
  216. package/dist/clis/doubao/meeting-transcript.js +1 -1
  217. package/dist/clis/doubao/new.d.ts +1 -1
  218. package/dist/clis/doubao/new.js +1 -1
  219. package/dist/clis/doubao/read.d.ts +1 -1
  220. package/dist/clis/doubao/read.js +1 -1
  221. package/dist/clis/doubao/send.d.ts +1 -1
  222. package/dist/clis/doubao/send.js +1 -1
  223. package/dist/clis/doubao/status.d.ts +1 -1
  224. package/dist/clis/doubao/status.js +1 -1
  225. package/dist/clis/doubao/utils.d.ts +1 -1
  226. package/dist/clis/doubao-app/ask.d.ts +1 -1
  227. package/dist/clis/doubao-app/ask.js +1 -1
  228. package/dist/clis/doubao-app/dump.d.ts +1 -1
  229. package/dist/clis/doubao-app/dump.js +1 -1
  230. package/dist/clis/doubao-app/new.d.ts +1 -1
  231. package/dist/clis/doubao-app/new.js +1 -1
  232. package/dist/clis/doubao-app/read.d.ts +1 -1
  233. package/dist/clis/doubao-app/read.js +1 -1
  234. package/dist/clis/doubao-app/screenshot.d.ts +1 -1
  235. package/dist/clis/doubao-app/screenshot.js +1 -1
  236. package/dist/clis/doubao-app/send.d.ts +1 -1
  237. package/dist/clis/doubao-app/send.js +1 -1
  238. package/dist/clis/doubao-app/status.d.ts +1 -1
  239. package/dist/clis/doubao-app/status.js +1 -1
  240. package/dist/clis/douyin/_shared/browser-fetch.d.ts +1 -1
  241. package/dist/clis/douyin/_shared/browser-fetch.js +1 -1
  242. package/dist/clis/douyin/_shared/imagex-upload.js +1 -1
  243. package/dist/clis/douyin/_shared/imagex-upload.test.js +1 -1
  244. package/dist/clis/douyin/_shared/public-api.d.ts +1 -1
  245. package/dist/clis/douyin/_shared/sts2.d.ts +1 -1
  246. package/dist/clis/douyin/_shared/sts2.js +1 -1
  247. package/dist/clis/douyin/_shared/sts2.test.js +1 -1
  248. package/dist/clis/douyin/_shared/tos-upload-short-read.test.js +1 -1
  249. package/dist/clis/douyin/_shared/tos-upload.js +1 -1
  250. package/dist/clis/douyin/_shared/transcode.d.ts +1 -1
  251. package/dist/clis/douyin/_shared/transcode.js +1 -1
  252. package/dist/clis/douyin/_shared/transcode.test.js +1 -1
  253. package/dist/clis/douyin/activities.js +1 -1
  254. package/dist/clis/douyin/activities.test.js +1 -1
  255. package/dist/clis/douyin/collections.js +1 -1
  256. package/dist/clis/douyin/collections.test.js +1 -1
  257. package/dist/clis/douyin/delete.js +1 -1
  258. package/dist/clis/douyin/delete.test.js +1 -1
  259. package/dist/clis/douyin/draft.js +2 -2
  260. package/dist/clis/douyin/draft.test.js +1 -1
  261. package/dist/clis/douyin/drafts.js +1 -1
  262. package/dist/clis/douyin/drafts.test.js +1 -1
  263. package/dist/clis/douyin/hashtag.js +2 -2
  264. package/dist/clis/douyin/hashtag.test.js +1 -1
  265. package/dist/clis/douyin/location.js +1 -1
  266. package/dist/clis/douyin/location.test.js +1 -1
  267. package/dist/clis/douyin/profile.js +2 -2
  268. package/dist/clis/douyin/profile.test.js +1 -1
  269. package/dist/clis/douyin/publish.js +2 -2
  270. package/dist/clis/douyin/publish.test.js +1 -1
  271. package/dist/clis/douyin/stats.js +1 -1
  272. package/dist/clis/douyin/stats.test.js +1 -1
  273. package/dist/clis/douyin/update.js +2 -2
  274. package/dist/clis/douyin/update.test.js +1 -1
  275. package/dist/clis/douyin/user-videos.js +1 -1
  276. package/dist/clis/douyin/user-videos.test.js +1 -1
  277. package/dist/clis/douyin/videos.js +1 -1
  278. package/dist/clis/douyin/videos.test.js +1 -1
  279. package/dist/clis/gemini/ask.d.ts +1 -1
  280. package/dist/clis/gemini/ask.js +1 -1
  281. package/dist/clis/gemini/deep-research-result.d.ts +1 -0
  282. package/dist/clis/gemini/deep-research-result.js +91 -0
  283. package/dist/clis/gemini/deep-research-result.test.js +154 -0
  284. package/dist/clis/gemini/deep-research.d.ts +1 -0
  285. package/dist/clis/gemini/deep-research.js +98 -0
  286. package/dist/clis/gemini/deep-research.test.js +184 -0
  287. package/dist/clis/gemini/image.d.ts +1 -1
  288. package/dist/clis/gemini/image.js +2 -2
  289. package/dist/clis/gemini/new.d.ts +1 -1
  290. package/dist/clis/gemini/new.js +1 -1
  291. package/dist/clis/gemini/reply-state.test.js +30 -0
  292. package/dist/clis/gemini/utils.d.ts +30 -1
  293. package/dist/clis/gemini/utils.js +1014 -2
  294. package/dist/clis/gemini/utils.test.js +21 -1
  295. package/dist/clis/google/news.js +2 -2
  296. package/dist/clis/google/search.js +2 -2
  297. package/dist/clis/google/suggest.js +2 -2
  298. package/dist/clis/google/trends.js +2 -2
  299. package/dist/clis/grok/ask.d.ts +2 -2
  300. package/dist/clis/grok/ask.js +1 -1
  301. package/dist/clis/hf/top.js +2 -2
  302. package/dist/clis/hupu/detail.js +1 -1
  303. package/dist/clis/hupu/like.js +2 -2
  304. package/dist/clis/hupu/mentions.js +159 -0
  305. package/dist/clis/hupu/reply.js +2 -2
  306. package/dist/clis/hupu/search.js +1 -1
  307. package/dist/clis/hupu/unlike.js +2 -2
  308. package/dist/clis/hupu/utils.d.ts +1 -1
  309. package/dist/clis/hupu/utils.js +1 -1
  310. package/dist/clis/imdb/person.js +2 -2
  311. package/dist/clis/imdb/reviews.js +2 -2
  312. package/dist/clis/imdb/search.js +2 -2
  313. package/dist/clis/imdb/title.js +2 -2
  314. package/dist/clis/imdb/top.js +2 -2
  315. package/dist/clis/imdb/trending.js +2 -2
  316. package/dist/clis/imdb/utils.d.ts +1 -1
  317. package/dist/clis/imdb/utils.js +1 -1
  318. package/dist/clis/instagram/_shared/private-publish.d.ts +1 -1
  319. package/dist/clis/instagram/_shared/private-publish.js +1 -1
  320. package/dist/clis/instagram/_shared/protocol-capture.d.ts +1 -1
  321. package/dist/clis/instagram/_shared/runtime-info.d.ts +1 -1
  322. package/dist/clis/instagram/download.js +2 -2
  323. package/dist/clis/instagram/download.test.js +2 -2
  324. package/dist/clis/instagram/note.js +2 -2
  325. package/dist/clis/instagram/note.test.js +2 -2
  326. package/dist/clis/instagram/post.js +2 -2
  327. package/dist/clis/instagram/post.test.js +2 -2
  328. package/dist/clis/instagram/reel.js +2 -2
  329. package/dist/clis/instagram/reel.test.js +2 -2
  330. package/dist/clis/instagram/story.js +2 -2
  331. package/dist/clis/instagram/story.test.js +2 -2
  332. package/dist/clis/jd/item.js +1 -1
  333. package/dist/clis/jd/item.test.js +1 -1
  334. package/dist/clis/jike/comment.js +1 -1
  335. package/dist/clis/jike/create.js +1 -1
  336. package/dist/clis/jike/feed.js +1 -1
  337. package/dist/clis/jike/like.js +1 -1
  338. package/dist/clis/jike/notifications.js +1 -1
  339. package/dist/clis/jike/repost.js +1 -1
  340. package/dist/clis/jike/search.js +1 -1
  341. package/dist/clis/lesswrong/_helpers.d.ts +15 -0
  342. package/dist/clis/lesswrong/_helpers.js +75 -0
  343. package/dist/clis/lesswrong/comments.js +64 -0
  344. package/dist/clis/lesswrong/curated.js +30 -0
  345. package/dist/clis/lesswrong/frontpage.js +30 -0
  346. package/dist/clis/lesswrong/new.js +30 -0
  347. package/dist/clis/lesswrong/read.js +45 -0
  348. package/dist/clis/lesswrong/sequences.js +27 -0
  349. package/dist/clis/lesswrong/shortform.js +30 -0
  350. package/dist/clis/lesswrong/tag.js +45 -0
  351. package/dist/clis/lesswrong/tags.js +27 -0
  352. package/dist/clis/lesswrong/top-month.js +30 -0
  353. package/dist/clis/lesswrong/top-week.js +30 -0
  354. package/dist/clis/lesswrong/top-year.js +30 -0
  355. package/dist/clis/lesswrong/top.js +30 -0
  356. package/dist/clis/lesswrong/user-posts.js +41 -0
  357. package/dist/clis/lesswrong/user.js +44 -0
  358. package/dist/clis/linkedin/search.js +2 -2
  359. package/dist/clis/linkedin/timeline.js +2 -2
  360. package/dist/clis/linkedin/timeline.test.js +1 -1
  361. package/dist/clis/linux-do/category.js +1 -1
  362. package/dist/clis/linux-do/feed.d.ts +2 -2
  363. package/dist/clis/linux-do/feed.js +2 -2
  364. package/dist/clis/linux-do/hot.js +1 -1
  365. package/dist/clis/linux-do/latest.js +1 -1
  366. package/dist/clis/medium/feed.js +1 -1
  367. package/dist/clis/medium/search.js +1 -1
  368. package/dist/clis/medium/user.js +1 -1
  369. package/dist/clis/medium/utils.d.ts +1 -1
  370. package/dist/clis/medium/utils.js +1 -1
  371. package/dist/clis/notebooklm/compat.test.js +1 -1
  372. package/dist/clis/notebooklm/current.js +2 -2
  373. package/dist/clis/notebooklm/get.js +2 -2
  374. package/dist/clis/notebooklm/history.js +2 -2
  375. package/dist/clis/notebooklm/history.test.js +1 -1
  376. package/dist/clis/notebooklm/list.js +2 -2
  377. package/dist/clis/notebooklm/note-list.js +2 -2
  378. package/dist/clis/notebooklm/note-list.test.js +1 -1
  379. package/dist/clis/notebooklm/notes-get.js +2 -2
  380. package/dist/clis/notebooklm/notes-get.test.js +1 -1
  381. package/dist/clis/notebooklm/open.js +2 -2
  382. package/dist/clis/notebooklm/open.test.js +1 -1
  383. package/dist/clis/notebooklm/rpc.d.ts +1 -1
  384. package/dist/clis/notebooklm/rpc.js +1 -1
  385. package/dist/clis/notebooklm/rpc.test.js +1 -1
  386. package/dist/clis/notebooklm/source-fulltext.js +2 -2
  387. package/dist/clis/notebooklm/source-fulltext.test.js +1 -1
  388. package/dist/clis/notebooklm/source-get.js +2 -2
  389. package/dist/clis/notebooklm/source-get.test.js +1 -1
  390. package/dist/clis/notebooklm/source-guide.js +2 -2
  391. package/dist/clis/notebooklm/source-guide.test.js +1 -1
  392. package/dist/clis/notebooklm/source-list.js +2 -2
  393. package/dist/clis/notebooklm/status.js +1 -1
  394. package/dist/clis/notebooklm/summary.js +2 -2
  395. package/dist/clis/notebooklm/summary.test.js +1 -1
  396. package/dist/clis/notebooklm/utils.d.ts +1 -1
  397. package/dist/clis/notebooklm/utils.js +1 -1
  398. package/dist/clis/notion/export.d.ts +1 -1
  399. package/dist/clis/notion/export.js +1 -1
  400. package/dist/clis/notion/favorites.d.ts +1 -1
  401. package/dist/clis/notion/favorites.js +1 -1
  402. package/dist/clis/notion/new.d.ts +1 -1
  403. package/dist/clis/notion/new.js +1 -1
  404. package/dist/clis/notion/read.d.ts +1 -1
  405. package/dist/clis/notion/read.js +1 -1
  406. package/dist/clis/notion/search.d.ts +1 -1
  407. package/dist/clis/notion/search.js +1 -1
  408. package/dist/clis/notion/sidebar.d.ts +1 -1
  409. package/dist/clis/notion/sidebar.js +1 -1
  410. package/dist/clis/notion/status.d.ts +1 -1
  411. package/dist/clis/notion/status.js +1 -1
  412. package/dist/clis/notion/write.d.ts +1 -1
  413. package/dist/clis/notion/write.js +1 -1
  414. package/dist/clis/ones/common.d.ts +1 -1
  415. package/dist/clis/ones/common.js +1 -1
  416. package/dist/clis/ones/enrich-tasks.d.ts +1 -1
  417. package/dist/clis/ones/login.js +2 -2
  418. package/dist/clis/ones/logout.js +1 -1
  419. package/dist/clis/ones/me.js +2 -2
  420. package/dist/clis/ones/my-tasks.js +2 -2
  421. package/dist/clis/ones/resolve-labels.d.ts +1 -1
  422. package/dist/clis/ones/task-helpers.js +1 -1
  423. package/dist/clis/ones/task.js +2 -2
  424. package/dist/clis/ones/tasks.js +2 -2
  425. package/dist/clis/ones/token-info.js +2 -2
  426. package/dist/clis/ones/worklog.js +2 -2
  427. package/dist/clis/paperreview/commands.test.js +1 -1
  428. package/dist/clis/paperreview/feedback.js +2 -2
  429. package/dist/clis/paperreview/review.js +2 -2
  430. package/dist/clis/paperreview/submit.js +2 -2
  431. package/dist/clis/paperreview/utils.js +1 -1
  432. package/dist/clis/paperreview/utils.test.js +1 -1
  433. package/dist/clis/pixiv/download.js +2 -2
  434. package/dist/clis/pixiv/download.test.js +2 -2
  435. package/dist/clis/pixiv/illusts.js +2 -2
  436. package/dist/clis/pixiv/illusts.test.js +2 -2
  437. package/dist/clis/pixiv/search.js +1 -1
  438. package/dist/clis/pixiv/search.test.js +2 -2
  439. package/dist/clis/pixiv/test-utils.d.ts +1 -1
  440. package/dist/clis/pixiv/utils.d.ts +1 -1
  441. package/dist/clis/pixiv/utils.js +1 -1
  442. package/dist/clis/producthunt/browse.js +2 -2
  443. package/dist/clis/producthunt/hot.js +2 -2
  444. package/dist/clis/producthunt/posts.js +1 -1
  445. package/dist/clis/producthunt/today.js +1 -1
  446. package/dist/clis/reddit/comment.js +2 -2
  447. package/dist/clis/reddit/read.js +2 -2
  448. package/dist/clis/reddit/read.test.js +1 -1
  449. package/dist/clis/reddit/save.js +2 -2
  450. package/dist/clis/reddit/saved.js +2 -2
  451. package/dist/clis/reddit/subscribe.js +2 -2
  452. package/dist/clis/reddit/upvote.js +2 -2
  453. package/dist/clis/reddit/upvoted.js +2 -2
  454. package/dist/clis/reuters/search.js +1 -1
  455. package/dist/clis/sinablog/article.js +1 -1
  456. package/dist/clis/sinablog/hot.js +1 -1
  457. package/dist/clis/sinablog/search.js +1 -1
  458. package/dist/clis/sinablog/user.js +1 -1
  459. package/dist/clis/sinablog/utils.d.ts +1 -1
  460. package/dist/clis/sinafinance/news.js +2 -2
  461. package/dist/clis/sinafinance/rolling-news.js +1 -1
  462. package/dist/clis/sinafinance/stock-rank.js +1 -1
  463. package/dist/clis/sinafinance/stock.js +2 -2
  464. package/dist/clis/smzdm/search.js +1 -1
  465. package/dist/clis/spotify/spotify.js +2 -2
  466. package/dist/clis/spotify/utils.js +1 -1
  467. package/dist/clis/substack/feed.js +1 -1
  468. package/dist/clis/substack/publication.js +1 -1
  469. package/dist/clis/substack/search.js +2 -2
  470. package/dist/clis/substack/utils.d.ts +1 -1
  471. package/dist/clis/substack/utils.js +1 -1
  472. package/dist/clis/tieba/commands.test.js +1 -1
  473. package/dist/clis/tieba/hot.js +2 -2
  474. package/dist/clis/tieba/posts.js +2 -2
  475. package/dist/clis/tieba/read.js +2 -2
  476. package/dist/clis/tieba/search.js +2 -2
  477. package/dist/clis/twitter/accept.js +2 -2
  478. package/dist/clis/twitter/article.js +2 -2
  479. package/dist/clis/twitter/block.js +2 -2
  480. package/dist/clis/twitter/bookmark.js +2 -2
  481. package/dist/clis/twitter/bookmarks.js +2 -2
  482. package/dist/clis/twitter/delete.d.ts +6 -0
  483. package/dist/clis/twitter/delete.js +82 -47
  484. package/dist/clis/twitter/delete.test.d.ts +1 -0
  485. package/dist/clis/twitter/delete.test.js +73 -0
  486. package/dist/clis/twitter/download.js +1 -1
  487. package/dist/clis/twitter/follow.js +2 -2
  488. package/dist/clis/twitter/followers.js +2 -2
  489. package/dist/clis/twitter/following.js +2 -2
  490. package/dist/clis/twitter/hide-reply.js +2 -2
  491. package/dist/clis/twitter/like.js +2 -2
  492. package/dist/clis/twitter/likes.js +2 -2
  493. package/dist/clis/twitter/notifications.js +2 -2
  494. package/dist/clis/twitter/post.js +2 -2
  495. package/dist/clis/twitter/post.test.js +1 -1
  496. package/dist/clis/twitter/profile.js +2 -2
  497. package/dist/clis/twitter/reply-dm.js +2 -2
  498. package/dist/clis/twitter/reply.js +2 -2
  499. package/dist/clis/twitter/reply.test.js +1 -1
  500. package/dist/clis/twitter/search.js +2 -2
  501. package/dist/clis/twitter/search.test.js +1 -1
  502. package/dist/clis/twitter/shared.d.ts +1 -1
  503. package/dist/clis/twitter/thread.js +2 -2
  504. package/dist/clis/twitter/timeline.js +2 -2
  505. package/dist/clis/twitter/trending.js +2 -2
  506. package/dist/clis/twitter/unblock.js +2 -2
  507. package/dist/clis/twitter/unbookmark.js +2 -2
  508. package/dist/clis/twitter/unfollow.js +2 -2
  509. package/dist/clis/v2ex/daily.js +2 -2
  510. package/dist/clis/v2ex/me.js +2 -2
  511. package/dist/clis/v2ex/notifications.js +2 -2
  512. package/dist/clis/web/read.js +1 -1
  513. package/dist/clis/weibo/comments.js +1 -1
  514. package/dist/clis/weibo/feed.js +1 -1
  515. package/dist/clis/weibo/hot.js +1 -1
  516. package/dist/clis/weibo/me.js +2 -2
  517. package/dist/clis/weibo/post.js +2 -2
  518. package/dist/clis/weibo/search.js +2 -2
  519. package/dist/clis/weibo/user.js +2 -2
  520. package/dist/clis/weibo/utils.d.ts +1 -1
  521. package/dist/clis/weibo/utils.js +1 -1
  522. package/dist/clis/weixin/download.js +1 -1
  523. package/dist/clis/weread/book.js +2 -2
  524. package/dist/clis/weread/commands.test.js +2 -2
  525. package/dist/clis/weread/highlights.js +1 -1
  526. package/dist/clis/weread/notebooks.js +1 -1
  527. package/dist/clis/weread/notes.js +1 -1
  528. package/dist/clis/weread/private-api-regression.test.js +2 -2
  529. package/dist/clis/weread/ranking.js +1 -1
  530. package/dist/clis/weread/search-regression.test.js +1 -1
  531. package/dist/clis/weread/search.js +1 -1
  532. package/dist/clis/weread/shelf.js +3 -3
  533. package/dist/clis/weread/utils.d.ts +1 -1
  534. package/dist/clis/weread/utils.js +1 -1
  535. package/dist/clis/wikipedia/random.js +2 -2
  536. package/dist/clis/wikipedia/search.js +2 -2
  537. package/dist/clis/wikipedia/summary.js +2 -2
  538. package/dist/clis/wikipedia/trending.js +2 -2
  539. package/dist/clis/wikipedia/utils.js +1 -1
  540. package/dist/clis/xianyu/chat.js +2 -2
  541. package/dist/clis/xianyu/item.js +2 -2
  542. package/dist/clis/xianyu/item.test.js +2 -2
  543. package/dist/clis/xianyu/search.js +2 -2
  544. package/dist/clis/xianyu/utils.js +1 -1
  545. package/dist/clis/xiaohongshu/comments.js +2 -2
  546. package/dist/clis/xiaohongshu/comments.test.js +3 -3
  547. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +1 -1
  548. package/dist/clis/xiaohongshu/creator-note-detail.js +1 -1
  549. package/dist/clis/xiaohongshu/creator-note-detail.test.js +1 -1
  550. package/dist/clis/xiaohongshu/creator-notes-summary.js +1 -1
  551. package/dist/clis/xiaohongshu/creator-notes.d.ts +1 -1
  552. package/dist/clis/xiaohongshu/creator-notes.js +1 -1
  553. package/dist/clis/xiaohongshu/creator-notes.test.js +1 -1
  554. package/dist/clis/xiaohongshu/creator-profile.js +1 -1
  555. package/dist/clis/xiaohongshu/creator-stats.js +1 -1
  556. package/dist/clis/xiaohongshu/download.js +1 -1
  557. package/dist/clis/xiaohongshu/download.test.js +1 -1
  558. package/dist/clis/xiaohongshu/note-helpers.d.ts +2 -2
  559. package/dist/clis/xiaohongshu/note-helpers.js +5 -3
  560. package/dist/clis/xiaohongshu/note.d.ts +4 -0
  561. package/dist/clis/xiaohongshu/note.js +10 -12
  562. package/dist/clis/xiaohongshu/note.test.js +6 -6
  563. package/dist/clis/xiaohongshu/publish.js +1 -1
  564. package/dist/clis/xiaohongshu/publish.test.js +1 -1
  565. package/dist/clis/xiaohongshu/search.js +2 -2
  566. package/dist/clis/xiaohongshu/search.test.js +1 -1
  567. package/dist/clis/xiaohongshu/user.js +1 -1
  568. package/dist/clis/xiaoyuzhou/episode.js +2 -2
  569. package/dist/clis/xiaoyuzhou/podcast-episodes.js +2 -2
  570. package/dist/clis/xiaoyuzhou/podcast.js +2 -2
  571. package/dist/clis/xiaoyuzhou/utils.js +1 -1
  572. package/dist/clis/xueqiu/comments.d.ts +1 -1
  573. package/dist/clis/xueqiu/comments.js +4 -4
  574. package/dist/clis/xueqiu/comments.test.js +3 -3
  575. package/dist/clis/xueqiu/danjuan-utils.d.ts +1 -1
  576. package/dist/clis/xueqiu/fund-holdings.js +1 -1
  577. package/dist/clis/xueqiu/fund-snapshot.js +1 -1
  578. package/dist/clis/yahoo-finance/quote.js +1 -1
  579. package/dist/clis/yollomi/background.js +2 -2
  580. package/dist/clis/yollomi/edit.js +2 -2
  581. package/dist/clis/yollomi/face-swap.js +2 -2
  582. package/dist/clis/yollomi/generate.js +2 -2
  583. package/dist/clis/yollomi/models.js +1 -1
  584. package/dist/clis/yollomi/object-remover.js +2 -2
  585. package/dist/clis/yollomi/remove-bg.js +2 -2
  586. package/dist/clis/yollomi/restore.js +2 -2
  587. package/dist/clis/yollomi/try-on.js +2 -2
  588. package/dist/clis/yollomi/upload.js +2 -2
  589. package/dist/clis/yollomi/upscale.js +2 -2
  590. package/dist/clis/yollomi/utils.d.ts +1 -1
  591. package/dist/clis/yollomi/utils.js +1 -1
  592. package/dist/clis/yollomi/video.js +2 -2
  593. package/dist/clis/youtube/channel.js +2 -2
  594. package/dist/clis/youtube/comments.js +2 -2
  595. package/dist/clis/youtube/search.js +1 -1
  596. package/dist/clis/youtube/transcript.js +2 -2
  597. package/dist/clis/youtube/utils.d.ts +1 -1
  598. package/dist/clis/youtube/video.js +2 -2
  599. package/dist/clis/yuanbao/ask.d.ts +1 -1
  600. package/dist/clis/yuanbao/ask.js +2 -2
  601. package/dist/clis/yuanbao/ask.test.js +1 -1
  602. package/dist/clis/yuanbao/new.d.ts +1 -1
  603. package/dist/clis/yuanbao/new.js +1 -1
  604. package/dist/clis/yuanbao/new.test.js +1 -1
  605. package/dist/clis/yuanbao/shared.d.ts +2 -2
  606. package/dist/clis/yuanbao/shared.js +1 -1
  607. package/dist/clis/zhihu/download.js +1 -1
  608. package/dist/clis/zhihu/question.js +2 -2
  609. package/dist/clis/zhihu/question.test.js +2 -2
  610. package/dist/clis/zsxq/dynamics.js +1 -1
  611. package/dist/clis/zsxq/groups.js +1 -1
  612. package/dist/clis/zsxq/search.js +1 -1
  613. package/dist/clis/zsxq/search.test.js +1 -1
  614. package/dist/clis/zsxq/topic.js +2 -2
  615. package/dist/clis/zsxq/topic.test.js +1 -1
  616. package/dist/clis/zsxq/topics.js +1 -1
  617. package/dist/clis/zsxq/topics.test.js +1 -1
  618. package/dist/clis/zsxq/utils.d.ts +1 -1
  619. package/dist/clis/zsxq/utils.js +1 -1
  620. package/dist/download/article-download.d.ts +1 -59
  621. package/dist/download/article-download.js +2 -178
  622. package/dist/download/index.d.ts +1 -71
  623. package/dist/download/index.js +2 -345
  624. package/dist/download/media-download.d.ts +1 -49
  625. package/dist/download/media-download.js +2 -114
  626. package/dist/download/progress.d.ts +1 -36
  627. package/dist/download/progress.js +2 -111
  628. package/dist/pipeline/index.d.ts +1 -5
  629. package/dist/pipeline/index.js +2 -5
  630. package/dist/src/browser/cdp.d.ts +40 -0
  631. package/dist/src/browser/cdp.js +310 -0
  632. package/dist/src/browser/page.d.ts +62 -0
  633. package/dist/src/browser/page.js +304 -0
  634. package/dist/src/browser/utils.d.ts +10 -0
  635. package/dist/src/browser/utils.js +27 -0
  636. package/dist/{build-manifest.js → src/build-manifest.js} +5 -4
  637. package/dist/{cascade.js → src/cascade.js} +16 -31
  638. package/dist/src/cli.d.ts +22 -0
  639. package/dist/{cli.js → src/cli.js} +78 -8
  640. package/dist/{cli.test.js → src/cli.test.js} +84 -1
  641. package/dist/{commanderAdapter.d.ts → src/commanderAdapter.d.ts} +1 -0
  642. package/dist/{commanderAdapter.js → src/commanderAdapter.js} +26 -46
  643. package/dist/{discovery.d.ts → src/discovery.d.ts} +11 -2
  644. package/dist/{discovery.js → src/discovery.js} +96 -12
  645. package/dist/src/doctor.test.d.ts +1 -0
  646. package/dist/src/download/article-download.d.ts +59 -0
  647. package/dist/src/download/article-download.js +178 -0
  648. package/dist/src/download/index.d.ts +71 -0
  649. package/dist/src/download/index.js +345 -0
  650. package/dist/src/download/index.test.d.ts +1 -0
  651. package/dist/src/download/media-download.d.ts +49 -0
  652. package/dist/src/download/media-download.js +114 -0
  653. package/dist/src/download/progress.d.ts +36 -0
  654. package/dist/src/download/progress.js +111 -0
  655. package/dist/src/electron-apps.test.d.ts +1 -0
  656. package/dist/src/engine.test.d.ts +1 -0
  657. package/dist/src/errors.test.d.ts +1 -0
  658. package/dist/src/execution.test.d.ts +1 -0
  659. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  660. package/dist/src/external.test.d.ts +1 -0
  661. package/dist/{interceptor.d.ts → src/interceptor.d.ts} +2 -0
  662. package/dist/{interceptor.js → src/interceptor.js} +3 -6
  663. package/dist/src/launcher.test.d.ts +1 -0
  664. package/dist/{main.js → src/main.js} +3 -2
  665. package/dist/src/node-network.test.d.ts +1 -0
  666. package/dist/src/output.test.d.ts +1 -0
  667. package/{src/pipeline/index.ts → dist/src/pipeline/index.d.ts} +0 -1
  668. package/dist/src/pipeline/index.js +5 -0
  669. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  670. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  671. package/dist/{record.js → src/record.js} +1 -1
  672. package/dist/src/record.test.d.ts +1 -0
  673. package/dist/src/runtime-detect.test.d.ts +1 -0
  674. package/dist/src/serialization.test.d.ts +1 -0
  675. package/dist/{synthesize.d.ts → src/synthesize.d.ts} +0 -4
  676. package/dist/{synthesize.js → src/synthesize.js} +4 -15
  677. package/dist/src/tui.test.d.ts +1 -0
  678. package/dist/src/weixin-download.test.d.ts +1 -0
  679. package/dist/{weixin-download.test.js → src/weixin-download.test.js} +1 -1
  680. package/package.json +26 -9
  681. package/scripts/check-doc-coverage.sh +2 -2
  682. package/scripts/copy-yaml.cjs +4 -4
  683. package/scripts/fetch-adapters.js +157 -0
  684. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -83
  685. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  686. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
  687. package/.github/ISSUE_TEMPLATE/new_site_adapter.yml +0 -57
  688. package/.github/actions/setup-chrome/action.yml +0 -27
  689. package/.github/dependabot.yml +0 -27
  690. package/.github/pull_request_template.md +0 -33
  691. package/.github/workflows/build-extension.yml +0 -67
  692. package/.github/workflows/ci.yml +0 -147
  693. package/.github/workflows/doc-check.yml +0 -36
  694. package/.github/workflows/docs.yml +0 -17
  695. package/.github/workflows/e2e-headed.yml +0 -74
  696. package/.github/workflows/release.yml +0 -44
  697. package/.github/workflows/security.yml +0 -33
  698. package/CHANGELOG.md +0 -321
  699. package/CONTRIBUTING.md +0 -208
  700. package/PRIVACY.md +0 -57
  701. package/TESTING.md +0 -252
  702. package/autoresearch/baseline-browse.txt +0 -1
  703. package/autoresearch/baseline-skill.txt +0 -1
  704. package/autoresearch/browse-tasks.json +0 -686
  705. package/autoresearch/commands/debug.ts +0 -163
  706. package/autoresearch/commands/fix.ts +0 -145
  707. package/autoresearch/commands/plan.ts +0 -88
  708. package/autoresearch/commands/run.ts +0 -138
  709. package/autoresearch/config.ts +0 -82
  710. package/autoresearch/engine.ts +0 -359
  711. package/autoresearch/eval-all.ts +0 -127
  712. package/autoresearch/eval-browse.ts +0 -185
  713. package/autoresearch/eval-publish.ts +0 -238
  714. package/autoresearch/eval-save.ts +0 -249
  715. package/autoresearch/eval-skill.ts +0 -254
  716. package/autoresearch/eval-v2ex.ts +0 -220
  717. package/autoresearch/eval-zhihu.ts +0 -230
  718. package/autoresearch/logger.ts +0 -69
  719. package/autoresearch/presets/combined-reliability.ts +0 -27
  720. package/autoresearch/presets/index.ts +0 -23
  721. package/autoresearch/presets/operate-reliability.ts +0 -24
  722. package/autoresearch/presets/save-reliability.ts +0 -26
  723. package/autoresearch/presets/skill-quality.ts +0 -20
  724. package/autoresearch/presets/v2ex-reliability.ts +0 -24
  725. package/autoresearch/presets/zhihu-reliability.ts +0 -25
  726. package/autoresearch/publish-tasks.json +0 -345
  727. package/autoresearch/run-browse.sh +0 -9
  728. package/autoresearch/run-save.sh +0 -11
  729. package/autoresearch/run-skill.sh +0 -9
  730. package/autoresearch/save-adapters/xhs-explore-deep.ts +0 -64
  731. package/autoresearch/save-adapters/xhs-note-comments.ts +0 -61
  732. package/autoresearch/save-adapters/xhs-search-full.ts +0 -62
  733. package/autoresearch/save-adapters/zhihu-hot-detail.ts +0 -52
  734. package/autoresearch/save-adapters/zhihu-question-full.ts +0 -57
  735. package/autoresearch/save-adapters/zhihu-search-detail.ts +0 -53
  736. package/autoresearch/save-tasks.json +0 -281
  737. package/autoresearch/v2ex-tasks.json +0 -899
  738. package/autoresearch/zhihu-tasks.json +0 -848
  739. package/bun.lock +0 -615
  740. package/dist/cli.d.ts +0 -9
  741. package/docs/.vitepress/config.mts +0 -238
  742. package/docs/adapters/browser/1688.md +0 -52
  743. package/docs/adapters/browser/36kr.md +0 -48
  744. package/docs/adapters/browser/amazon.md +0 -53
  745. package/docs/adapters/browser/apple-podcasts.md +0 -28
  746. package/docs/adapters/browser/arxiv.md +0 -27
  747. package/docs/adapters/browser/band.md +0 -63
  748. package/docs/adapters/browser/barchart.md +0 -33
  749. package/docs/adapters/browser/bbc.md +0 -26
  750. package/docs/adapters/browser/bilibili.md +0 -47
  751. package/docs/adapters/browser/bloomberg.md +0 -70
  752. package/docs/adapters/browser/bluesky.md +0 -53
  753. package/docs/adapters/browser/boss.md +0 -28
  754. package/docs/adapters/browser/chaoxing.md +0 -39
  755. package/docs/adapters/browser/coupang.md +0 -28
  756. package/docs/adapters/browser/ctrip.md +0 -27
  757. package/docs/adapters/browser/devto.md +0 -35
  758. package/docs/adapters/browser/dictionary.md +0 -27
  759. package/docs/adapters/browser/douban.md +0 -62
  760. package/docs/adapters/browser/doubao.md +0 -39
  761. package/docs/adapters/browser/douyin.md +0 -75
  762. package/docs/adapters/browser/facebook.md +0 -36
  763. package/docs/adapters/browser/gemini.md +0 -72
  764. package/docs/adapters/browser/google.md +0 -62
  765. package/docs/adapters/browser/grok.md +0 -53
  766. package/docs/adapters/browser/hackernews.md +0 -42
  767. package/docs/adapters/browser/hf.md +0 -42
  768. package/docs/adapters/browser/hupu.md +0 -53
  769. package/docs/adapters/browser/imdb.md +0 -47
  770. package/docs/adapters/browser/instagram.md +0 -46
  771. package/docs/adapters/browser/jd.md +0 -27
  772. package/docs/adapters/browser/jike.md +0 -45
  773. package/docs/adapters/browser/jimeng.md +0 -39
  774. package/docs/adapters/browser/linkedin.md +0 -33
  775. package/docs/adapters/browser/linux-do.md +0 -206
  776. package/docs/adapters/browser/lobsters.md +0 -32
  777. package/docs/adapters/browser/medium.md +0 -32
  778. package/docs/adapters/browser/notebooklm.md +0 -69
  779. package/docs/adapters/browser/ones.md +0 -59
  780. package/docs/adapters/browser/paperreview.md +0 -43
  781. package/docs/adapters/browser/pixiv.md +0 -92
  782. package/docs/adapters/browser/producthunt.md +0 -49
  783. package/docs/adapters/browser/reddit.md +0 -50
  784. package/docs/adapters/browser/reuters.md +0 -27
  785. package/docs/adapters/browser/sinablog.md +0 -36
  786. package/docs/adapters/browser/sinafinance.md +0 -115
  787. package/docs/adapters/browser/smzdm.md +0 -27
  788. package/docs/adapters/browser/spotify.md +0 -62
  789. package/docs/adapters/browser/stackoverflow.md +0 -35
  790. package/docs/adapters/browser/steam.md +0 -26
  791. package/docs/adapters/browser/substack.md +0 -38
  792. package/docs/adapters/browser/tieba.md +0 -45
  793. package/docs/adapters/browser/tiktok.md +0 -68
  794. package/docs/adapters/browser/twitter.md +0 -56
  795. package/docs/adapters/browser/v2ex.md +0 -53
  796. package/docs/adapters/browser/web.md +0 -30
  797. package/docs/adapters/browser/weibo.md +0 -36
  798. package/docs/adapters/browser/weixin.md +0 -33
  799. package/docs/adapters/browser/weread.md +0 -48
  800. package/docs/adapters/browser/wikipedia.md +0 -32
  801. package/docs/adapters/browser/xianyu.md +0 -42
  802. package/docs/adapters/browser/xiaoe.md +0 -44
  803. package/docs/adapters/browser/xiaohongshu.md +0 -47
  804. package/docs/adapters/browser/xiaoyuzhou.md +0 -28
  805. package/docs/adapters/browser/xueqiu.md +0 -65
  806. package/docs/adapters/browser/yahoo-finance.md +0 -27
  807. package/docs/adapters/browser/yollomi.md +0 -69
  808. package/docs/adapters/browser/youtube.md +0 -29
  809. package/docs/adapters/browser/yuanbao.md +0 -64
  810. package/docs/adapters/browser/zhihu.md +0 -30
  811. package/docs/adapters/browser/zsxq.md +0 -49
  812. package/docs/adapters/desktop/antigravity.md +0 -49
  813. package/docs/adapters/desktop/chatgpt.md +0 -49
  814. package/docs/adapters/desktop/chatwise.md +0 -38
  815. package/docs/adapters/desktop/codex.md +0 -36
  816. package/docs/adapters/desktop/cursor.md +0 -37
  817. package/docs/adapters/desktop/discord.md +0 -28
  818. package/docs/adapters/desktop/doubao-app.md +0 -35
  819. package/docs/adapters/desktop/notion.md +0 -29
  820. package/docs/adapters/index.md +0 -96
  821. package/docs/adapters-doc/ones.md +0 -32
  822. package/docs/advanced/cdp.md +0 -103
  823. package/docs/advanced/download.md +0 -71
  824. package/docs/advanced/electron.md +0 -125
  825. package/docs/advanced/rate-limiter-plugin.md +0 -99
  826. package/docs/advanced/remote-chrome.md +0 -72
  827. package/docs/comparison.md +0 -125
  828. package/docs/developer/ai-workflow.md +0 -66
  829. package/docs/developer/architecture.md +0 -103
  830. package/docs/developer/contributing.md +0 -155
  831. package/docs/developer/testing.md +0 -263
  832. package/docs/developer/ts-adapter.md +0 -105
  833. package/docs/developer/yaml-adapter.md +0 -124
  834. package/docs/guide/browser-bridge.md +0 -49
  835. package/docs/guide/electron-app-cli.md +0 -200
  836. package/docs/guide/getting-started.md +0 -79
  837. package/docs/guide/installation.md +0 -37
  838. package/docs/guide/plugins.md +0 -261
  839. package/docs/guide/troubleshooting.md +0 -72
  840. package/docs/index.md +0 -35
  841. package/docs/superpowers/plans/2026-03-28-perf-smart-wait.md +0 -1143
  842. package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +0 -857
  843. package/docs/superpowers/specs/2026-03-28-perf-smart-wait-design.md +0 -170
  844. package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +0 -208
  845. package/docs/superpowers/specs/2026-04-02-browse-skill-testing-design.md +0 -144
  846. package/docs/superpowers/specs/2026-04-03-v2ex-autoresearch-design.md +0 -41
  847. package/docs/zh/adapters/index.md +0 -5
  848. package/docs/zh/advanced/cdp.md +0 -3
  849. package/docs/zh/developer/contributing.md +0 -24
  850. package/docs/zh/guide/browser-bridge.md +0 -36
  851. package/docs/zh/guide/electron-app-cli.md +0 -188
  852. package/docs/zh/guide/getting-started.md +0 -62
  853. package/docs/zh/guide/installation.md +0 -37
  854. package/docs/zh/guide/plugins.md +0 -183
  855. package/docs/zh/index.md +0 -29
  856. package/extension/dist/background.js +0 -1127
  857. package/extension/icons/icon-128.png +0 -0
  858. package/extension/icons/icon-16.png +0 -0
  859. package/extension/icons/icon-32.png +0 -0
  860. package/extension/icons/icon-48.png +0 -0
  861. package/extension/manifest.json +0 -39
  862. package/extension/package-lock.json +0 -1156
  863. package/extension/package.json +0 -17
  864. package/extension/popup.html +0 -84
  865. package/extension/popup.js +0 -25
  866. package/extension/scripts/package-release.mjs +0 -179
  867. package/extension/src/background.test.ts +0 -279
  868. package/extension/src/background.ts +0 -878
  869. package/extension/src/cdp.test.ts +0 -75
  870. package/extension/src/cdp.ts +0 -440
  871. package/extension/src/protocol.ts +0 -87
  872. package/extension/store-assets/screenshot-1280x800.png +0 -0
  873. package/extension/tsconfig.json +0 -15
  874. package/extension/vite.config.ts +0 -18
  875. package/skills/opencli-explorer/SKILL.md +0 -853
  876. package/skills/opencli-oneshot/SKILL.md +0 -222
  877. package/skills/opencli-operate/SKILL.md +0 -306
  878. package/skills/opencli-usage/SKILL.md +0 -163
  879. package/skills/opencli-usage/browser.md +0 -527
  880. package/skills/opencli-usage/desktop.md +0 -118
  881. package/skills/opencli-usage/plugins.md +0 -82
  882. package/skills/opencli-usage/public-api.md +0 -178
  883. package/skills/smart-search/SKILL.md +0 -156
  884. package/skills/smart-search/references/sources-ai.md +0 -74
  885. package/skills/smart-search/references/sources-info.md +0 -43
  886. package/skills/smart-search/references/sources-media.md +0 -50
  887. package/skills/smart-search/references/sources-other.md +0 -42
  888. package/skills/smart-search/references/sources-shopping.md +0 -31
  889. package/skills/smart-search/references/sources-social.md +0 -51
  890. package/skills/smart-search/references/sources-tech.md +0 -42
  891. package/skills/smart-search/references/sources-travel.md +0 -20
  892. package/src/analysis.ts +0 -170
  893. package/src/browser/base-page.ts +0 -232
  894. package/src/browser/bridge.ts +0 -129
  895. package/src/browser/cdp.test.ts +0 -66
  896. package/src/browser/cdp.ts +0 -341
  897. package/src/browser/daemon-client.test.ts +0 -103
  898. package/src/browser/daemon-client.ts +0 -175
  899. package/src/browser/discover.ts +0 -26
  900. package/src/browser/dom-helpers.test.ts +0 -114
  901. package/src/browser/dom-helpers.ts +0 -238
  902. package/src/browser/dom-snapshot.test.ts +0 -291
  903. package/src/browser/dom-snapshot.ts +0 -845
  904. package/src/browser/errors.ts +0 -63
  905. package/src/browser/index.ts +0 -14
  906. package/src/browser/page.test.ts +0 -58
  907. package/src/browser/page.ts +0 -315
  908. package/src/browser/stealth.test.ts +0 -153
  909. package/src/browser/stealth.ts +0 -354
  910. package/src/browser/tabs.ts +0 -76
  911. package/src/browser/utils.ts +0 -27
  912. package/src/browser.test.ts +0 -195
  913. package/src/build-manifest.test.ts +0 -200
  914. package/src/build-manifest.ts +0 -279
  915. package/src/capabilityRouting.test.ts +0 -47
  916. package/src/capabilityRouting.ts +0 -29
  917. package/src/cascade.ts +0 -192
  918. package/src/cli.test.ts +0 -133
  919. package/src/cli.ts +0 -1012
  920. package/src/clis/1688/item.test.ts +0 -69
  921. package/src/clis/1688/item.ts +0 -282
  922. package/src/clis/1688/search.test.ts +0 -81
  923. package/src/clis/1688/search.ts +0 -402
  924. package/src/clis/1688/shared.test.ts +0 -75
  925. package/src/clis/1688/shared.ts +0 -623
  926. package/src/clis/1688/store.test.ts +0 -69
  927. package/src/clis/1688/store.ts +0 -300
  928. package/src/clis/36kr/article.ts +0 -69
  929. package/src/clis/36kr/hot.test.ts +0 -19
  930. package/src/clis/36kr/hot.ts +0 -100
  931. package/src/clis/36kr/news.test.ts +0 -90
  932. package/src/clis/36kr/news.ts +0 -54
  933. package/src/clis/36kr/search.ts +0 -78
  934. package/src/clis/_shared/common.ts +0 -11
  935. package/src/clis/_shared/desktop-commands.ts +0 -121
  936. package/src/clis/amazon/bestsellers.test.ts +0 -31
  937. package/src/clis/amazon/bestsellers.ts +0 -8
  938. package/src/clis/amazon/discussion.test.ts +0 -38
  939. package/src/clis/amazon/discussion.ts +0 -131
  940. package/src/clis/amazon/movers-shakers.ts +0 -8
  941. package/src/clis/amazon/new-releases.ts +0 -8
  942. package/src/clis/amazon/offer.test.ts +0 -35
  943. package/src/clis/amazon/offer.ts +0 -185
  944. package/src/clis/amazon/product.test.ts +0 -26
  945. package/src/clis/amazon/product.ts +0 -131
  946. package/src/clis/amazon/rankings.test.ts +0 -47
  947. package/src/clis/amazon/rankings.ts +0 -312
  948. package/src/clis/amazon/search.test.ts +0 -24
  949. package/src/clis/amazon/search.ts +0 -128
  950. package/src/clis/amazon/shared.test.ts +0 -53
  951. package/src/clis/amazon/shared.ts +0 -438
  952. package/src/clis/antigravity/SKILL.md +0 -38
  953. package/src/clis/antigravity/dump.ts +0 -30
  954. package/src/clis/antigravity/extract-code.ts +0 -34
  955. package/src/clis/antigravity/model.ts +0 -47
  956. package/src/clis/antigravity/new.ts +0 -28
  957. package/src/clis/antigravity/read.ts +0 -36
  958. package/src/clis/antigravity/send.ts +0 -40
  959. package/src/clis/antigravity/serve.ts +0 -600
  960. package/src/clis/antigravity/status.ts +0 -19
  961. package/src/clis/antigravity/watch.ts +0 -45
  962. package/src/clis/apple-podcasts/commands.test.ts +0 -123
  963. package/src/clis/apple-podcasts/episodes.ts +0 -28
  964. package/src/clis/apple-podcasts/search.ts +0 -30
  965. package/src/clis/apple-podcasts/top.ts +0 -47
  966. package/src/clis/apple-podcasts/utils.test.ts +0 -72
  967. package/src/clis/apple-podcasts/utils.ts +0 -37
  968. package/src/clis/arxiv/paper.ts +0 -21
  969. package/src/clis/arxiv/search.ts +0 -24
  970. package/src/clis/arxiv/utils.ts +0 -63
  971. package/src/clis/band/bands.ts +0 -76
  972. package/src/clis/band/mentions.ts +0 -134
  973. package/src/clis/band/post.ts +0 -187
  974. package/src/clis/band/posts.ts +0 -106
  975. package/src/clis/barchart/flow.ts +0 -120
  976. package/src/clis/barchart/greeks.ts +0 -123
  977. package/src/clis/barchart/options.ts +0 -110
  978. package/src/clis/barchart/quote.ts +0 -137
  979. package/src/clis/bbc/news.ts +0 -41
  980. package/src/clis/bilibili/comments.test.ts +0 -103
  981. package/src/clis/bilibili/comments.ts +0 -44
  982. package/src/clis/bilibili/download.ts +0 -93
  983. package/src/clis/bilibili/dynamic.test.ts +0 -79
  984. package/src/clis/bilibili/dynamic.ts +0 -34
  985. package/src/clis/bilibili/favorite.ts +0 -45
  986. package/src/clis/bilibili/feed.ts +0 -71
  987. package/src/clis/bilibili/following.ts +0 -51
  988. package/src/clis/bilibili/history.ts +0 -48
  989. package/src/clis/bilibili/hot.yaml +0 -38
  990. package/src/clis/bilibili/me.ts +0 -14
  991. package/src/clis/bilibili/ranking.ts +0 -25
  992. package/src/clis/bilibili/search.ts +0 -25
  993. package/src/clis/bilibili/subtitle.test.ts +0 -61
  994. package/src/clis/bilibili/subtitle.ts +0 -106
  995. package/src/clis/bilibili/user-videos.ts +0 -42
  996. package/src/clis/bilibili/utils.test.ts +0 -21
  997. package/src/clis/bilibili/utils.ts +0 -143
  998. package/src/clis/bloomberg/businessweek.ts +0 -18
  999. package/src/clis/bloomberg/economics.ts +0 -18
  1000. package/src/clis/bloomberg/feeds.ts +0 -16
  1001. package/src/clis/bloomberg/industries.ts +0 -18
  1002. package/src/clis/bloomberg/main.ts +0 -18
  1003. package/src/clis/bloomberg/markets.ts +0 -18
  1004. package/src/clis/bloomberg/news.ts +0 -136
  1005. package/src/clis/bloomberg/opinions.ts +0 -18
  1006. package/src/clis/bloomberg/politics.ts +0 -18
  1007. package/src/clis/bloomberg/tech.ts +0 -18
  1008. package/src/clis/bloomberg/utils.test.ts +0 -135
  1009. package/src/clis/bloomberg/utils.ts +0 -429
  1010. package/src/clis/bluesky/feeds.yaml +0 -29
  1011. package/src/clis/bluesky/followers.yaml +0 -33
  1012. package/src/clis/bluesky/following.yaml +0 -33
  1013. package/src/clis/bluesky/profile.yaml +0 -27
  1014. package/src/clis/bluesky/search.yaml +0 -34
  1015. package/src/clis/bluesky/starter-packs.yaml +0 -34
  1016. package/src/clis/bluesky/thread.yaml +0 -32
  1017. package/src/clis/bluesky/trending.yaml +0 -27
  1018. package/src/clis/bluesky/user.yaml +0 -34
  1019. package/src/clis/boss/batchgreet.ts +0 -75
  1020. package/src/clis/boss/chatlist.ts +0 -36
  1021. package/src/clis/boss/chatmsg.ts +0 -46
  1022. package/src/clis/boss/detail.ts +0 -69
  1023. package/src/clis/boss/exchange.ts +0 -52
  1024. package/src/clis/boss/greet.ts +0 -61
  1025. package/src/clis/boss/invite.ts +0 -80
  1026. package/src/clis/boss/joblist.ts +0 -34
  1027. package/src/clis/boss/mark.ts +0 -75
  1028. package/src/clis/boss/recommend.ts +0 -49
  1029. package/src/clis/boss/resume.ts +0 -157
  1030. package/src/clis/boss/search.ts +0 -162
  1031. package/src/clis/boss/send.ts +0 -54
  1032. package/src/clis/boss/stats.ts +0 -75
  1033. package/src/clis/boss/utils.ts +0 -287
  1034. package/src/clis/chaoxing/assignments.ts +0 -89
  1035. package/src/clis/chaoxing/exams.ts +0 -88
  1036. package/src/clis/chaoxing/utils.test.ts +0 -53
  1037. package/src/clis/chaoxing/utils.ts +0 -266
  1038. package/src/clis/chatgpt/ask.ts +0 -95
  1039. package/src/clis/chatgpt/ax.ts +0 -260
  1040. package/src/clis/chatgpt/model.ts +0 -27
  1041. package/src/clis/chatgpt/new.ts +0 -29
  1042. package/src/clis/chatgpt/read.ts +0 -35
  1043. package/src/clis/chatgpt/send.ts +0 -59
  1044. package/src/clis/chatgpt/status.ts +0 -27
  1045. package/src/clis/chatwise/ask.ts +0 -90
  1046. package/src/clis/chatwise/export.ts +0 -51
  1047. package/src/clis/chatwise/history.ts +0 -61
  1048. package/src/clis/chatwise/model.ts +0 -89
  1049. package/src/clis/chatwise/new.ts +0 -3
  1050. package/src/clis/chatwise/read.ts +0 -42
  1051. package/src/clis/chatwise/screenshot.ts +0 -3
  1052. package/src/clis/chatwise/send.ts +0 -53
  1053. package/src/clis/chatwise/status.ts +0 -3
  1054. package/src/clis/codex/ask.ts +0 -80
  1055. package/src/clis/codex/dump.ts +0 -3
  1056. package/src/clis/codex/export.ts +0 -42
  1057. package/src/clis/codex/extract-diff.ts +0 -48
  1058. package/src/clis/codex/history.ts +0 -47
  1059. package/src/clis/codex/model.ts +0 -59
  1060. package/src/clis/codex/new.ts +0 -3
  1061. package/src/clis/codex/read.ts +0 -37
  1062. package/src/clis/codex/screenshot.ts +0 -3
  1063. package/src/clis/codex/send.ts +0 -48
  1064. package/src/clis/codex/status.ts +0 -3
  1065. package/src/clis/coupang/add-to-cart.ts +0 -148
  1066. package/src/clis/coupang/search.ts +0 -464
  1067. package/src/clis/coupang/utils.test.ts +0 -78
  1068. package/src/clis/coupang/utils.ts +0 -302
  1069. package/src/clis/ctrip/search.test.ts +0 -73
  1070. package/src/clis/ctrip/search.ts +0 -111
  1071. package/src/clis/cursor/ask.ts +0 -82
  1072. package/src/clis/cursor/composer.ts +0 -51
  1073. package/src/clis/cursor/dump.ts +0 -3
  1074. package/src/clis/cursor/export.ts +0 -57
  1075. package/src/clis/cursor/extract-code.ts +0 -39
  1076. package/src/clis/cursor/history.ts +0 -47
  1077. package/src/clis/cursor/model.ts +0 -57
  1078. package/src/clis/cursor/new.ts +0 -3
  1079. package/src/clis/cursor/read.ts +0 -48
  1080. package/src/clis/cursor/screenshot.ts +0 -3
  1081. package/src/clis/cursor/send.ts +0 -48
  1082. package/src/clis/cursor/status.ts +0 -3
  1083. package/src/clis/devto/tag.yaml +0 -34
  1084. package/src/clis/devto/top.yaml +0 -29
  1085. package/src/clis/devto/user.yaml +0 -33
  1086. package/src/clis/dictionary/examples.yaml +0 -25
  1087. package/src/clis/dictionary/search.yaml +0 -27
  1088. package/src/clis/dictionary/synonyms.yaml +0 -25
  1089. package/src/clis/discord-app/channels.ts +0 -60
  1090. package/src/clis/discord-app/members.ts +0 -41
  1091. package/src/clis/discord-app/read.ts +0 -49
  1092. package/src/clis/discord-app/search.ts +0 -64
  1093. package/src/clis/discord-app/send.ts +0 -32
  1094. package/src/clis/discord-app/servers.ts +0 -39
  1095. package/src/clis/discord-app/status.ts +0 -18
  1096. package/src/clis/douban/book-hot.ts +0 -15
  1097. package/src/clis/douban/download.test.ts +0 -196
  1098. package/src/clis/douban/download.ts +0 -78
  1099. package/src/clis/douban/marks.ts +0 -135
  1100. package/src/clis/douban/movie-hot.ts +0 -15
  1101. package/src/clis/douban/photos.ts +0 -36
  1102. package/src/clis/douban/reviews.ts +0 -127
  1103. package/src/clis/douban/search.ts +0 -17
  1104. package/src/clis/douban/subject.yaml +0 -107
  1105. package/src/clis/douban/top250.yaml +0 -70
  1106. package/src/clis/douban/utils.test.ts +0 -97
  1107. package/src/clis/douban/utils.ts +0 -472
  1108. package/src/clis/doubao/ask.ts +0 -40
  1109. package/src/clis/doubao/detail.test.ts +0 -53
  1110. package/src/clis/doubao/detail.ts +0 -41
  1111. package/src/clis/doubao/history.test.ts +0 -45
  1112. package/src/clis/doubao/history.ts +0 -32
  1113. package/src/clis/doubao/meeting-summary.ts +0 -53
  1114. package/src/clis/doubao/meeting-transcript.ts +0 -48
  1115. package/src/clis/doubao/new.ts +0 -22
  1116. package/src/clis/doubao/read.ts +0 -20
  1117. package/src/clis/doubao/send.ts +0 -25
  1118. package/src/clis/doubao/status.ts +0 -27
  1119. package/src/clis/doubao/utils.test.ts +0 -45
  1120. package/src/clis/doubao/utils.ts +0 -1010
  1121. package/src/clis/doubao-app/ask.ts +0 -60
  1122. package/src/clis/doubao-app/dump.ts +0 -28
  1123. package/src/clis/doubao-app/new.ts +0 -21
  1124. package/src/clis/doubao-app/read.ts +0 -21
  1125. package/src/clis/doubao-app/screenshot.ts +0 -19
  1126. package/src/clis/doubao-app/send.ts +0 -30
  1127. package/src/clis/doubao-app/status.ts +0 -17
  1128. package/src/clis/doubao-app/utils.ts +0 -116
  1129. package/src/clis/douyin/_shared/browser-fetch.test.ts +0 -37
  1130. package/src/clis/douyin/_shared/browser-fetch.ts +0 -45
  1131. package/src/clis/douyin/_shared/creation-id.test.ts +0 -26
  1132. package/src/clis/douyin/_shared/creation-id.ts +0 -8
  1133. package/src/clis/douyin/_shared/imagex-upload.test.ts +0 -113
  1134. package/src/clis/douyin/_shared/imagex-upload.ts +0 -76
  1135. package/src/clis/douyin/_shared/public-api.ts +0 -84
  1136. package/src/clis/douyin/_shared/sts2.test.ts +0 -31
  1137. package/src/clis/douyin/_shared/sts2.ts +0 -28
  1138. package/src/clis/douyin/_shared/text-extra.test.ts +0 -42
  1139. package/src/clis/douyin/_shared/text-extra.ts +0 -33
  1140. package/src/clis/douyin/_shared/timing.test.ts +0 -38
  1141. package/src/clis/douyin/_shared/timing.ts +0 -22
  1142. package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +0 -102
  1143. package/src/clis/douyin/_shared/tos-upload.test.ts +0 -281
  1144. package/src/clis/douyin/_shared/tos-upload.ts +0 -444
  1145. package/src/clis/douyin/_shared/transcode.test.ts +0 -115
  1146. package/src/clis/douyin/_shared/transcode.ts +0 -78
  1147. package/src/clis/douyin/_shared/types.ts +0 -29
  1148. package/src/clis/douyin/activities.test.ts +0 -65
  1149. package/src/clis/douyin/activities.ts +0 -32
  1150. package/src/clis/douyin/collections.test.ts +0 -59
  1151. package/src/clis/douyin/collections.ts +0 -25
  1152. package/src/clis/douyin/delete.test.ts +0 -12
  1153. package/src/clis/douyin/delete.ts +0 -20
  1154. package/src/clis/douyin/draft.test.ts +0 -452
  1155. package/src/clis/douyin/draft.ts +0 -446
  1156. package/src/clis/douyin/drafts.test.ts +0 -12
  1157. package/src/clis/douyin/drafts.ts +0 -27
  1158. package/src/clis/douyin/hashtag.test.ts +0 -68
  1159. package/src/clis/douyin/hashtag.ts +0 -64
  1160. package/src/clis/douyin/location.test.ts +0 -26
  1161. package/src/clis/douyin/location.ts +0 -27
  1162. package/src/clis/douyin/profile.test.ts +0 -54
  1163. package/src/clis/douyin/profile.ts +0 -44
  1164. package/src/clis/douyin/publish.test.ts +0 -45
  1165. package/src/clis/douyin/publish.ts +0 -340
  1166. package/src/clis/douyin/stats.test.ts +0 -25
  1167. package/src/clis/douyin/stats.ts +0 -30
  1168. package/src/clis/douyin/update.test.ts +0 -12
  1169. package/src/clis/douyin/update.ts +0 -43
  1170. package/src/clis/douyin/user-videos.test.ts +0 -122
  1171. package/src/clis/douyin/user-videos.ts +0 -101
  1172. package/src/clis/douyin/videos.test.ts +0 -62
  1173. package/src/clis/douyin/videos.ts +0 -83
  1174. package/src/clis/facebook/add-friend.yaml +0 -43
  1175. package/src/clis/facebook/events.yaml +0 -44
  1176. package/src/clis/facebook/feed.yaml +0 -63
  1177. package/src/clis/facebook/friends.yaml +0 -42
  1178. package/src/clis/facebook/groups.yaml +0 -50
  1179. package/src/clis/facebook/join-group.yaml +0 -44
  1180. package/src/clis/facebook/memories.yaml +0 -39
  1181. package/src/clis/facebook/notifications.yaml +0 -40
  1182. package/src/clis/facebook/profile.yaml +0 -37
  1183. package/src/clis/facebook/search.test.ts +0 -68
  1184. package/src/clis/facebook/search.yaml +0 -47
  1185. package/src/clis/gemini/ask.test.ts +0 -116
  1186. package/src/clis/gemini/ask.ts +0 -53
  1187. package/src/clis/gemini/image.ts +0 -115
  1188. package/src/clis/gemini/new.ts +0 -22
  1189. package/src/clis/gemini/reply-state.test.ts +0 -708
  1190. package/src/clis/gemini/utils.test.ts +0 -218
  1191. package/src/clis/gemini/utils.ts +0 -1051
  1192. package/src/clis/google/news.ts +0 -66
  1193. package/src/clis/google/search.ts +0 -133
  1194. package/src/clis/google/suggest.ts +0 -40
  1195. package/src/clis/google/trends.ts +0 -44
  1196. package/src/clis/google/utils.test.ts +0 -82
  1197. package/src/clis/google/utils.ts +0 -24
  1198. package/src/clis/grok/ask.test.ts +0 -78
  1199. package/src/clis/grok/ask.ts +0 -334
  1200. package/src/clis/hackernews/ask.yaml +0 -38
  1201. package/src/clis/hackernews/best.yaml +0 -38
  1202. package/src/clis/hackernews/jobs.yaml +0 -36
  1203. package/src/clis/hackernews/new.yaml +0 -38
  1204. package/src/clis/hackernews/search.yaml +0 -44
  1205. package/src/clis/hackernews/show.yaml +0 -38
  1206. package/src/clis/hackernews/top.yaml +0 -38
  1207. package/src/clis/hackernews/user.yaml +0 -25
  1208. package/src/clis/hf/top.ts +0 -141
  1209. package/src/clis/hupu/detail.ts +0 -126
  1210. package/src/clis/hupu/hot.yaml +0 -43
  1211. package/src/clis/hupu/like.ts +0 -76
  1212. package/src/clis/hupu/reply.ts +0 -76
  1213. package/src/clis/hupu/search.ts +0 -95
  1214. package/src/clis/hupu/unlike.ts +0 -76
  1215. package/src/clis/hupu/utils.ts +0 -381
  1216. package/src/clis/imdb/person.ts +0 -232
  1217. package/src/clis/imdb/reviews.ts +0 -111
  1218. package/src/clis/imdb/search.ts +0 -179
  1219. package/src/clis/imdb/title.ts +0 -121
  1220. package/src/clis/imdb/top.ts +0 -67
  1221. package/src/clis/imdb/trending.ts +0 -66
  1222. package/src/clis/imdb/utils.test.ts +0 -117
  1223. package/src/clis/imdb/utils.ts +0 -305
  1224. package/src/clis/instagram/_shared/private-publish.test.ts +0 -827
  1225. package/src/clis/instagram/_shared/private-publish.ts +0 -1303
  1226. package/src/clis/instagram/_shared/protocol-capture.test.ts +0 -148
  1227. package/src/clis/instagram/_shared/protocol-capture.ts +0 -321
  1228. package/src/clis/instagram/_shared/runtime-info.ts +0 -91
  1229. package/src/clis/instagram/comment.yaml +0 -52
  1230. package/src/clis/instagram/download.test.ts +0 -159
  1231. package/src/clis/instagram/download.ts +0 -286
  1232. package/src/clis/instagram/explore.yaml +0 -43
  1233. package/src/clis/instagram/follow.yaml +0 -41
  1234. package/src/clis/instagram/followers.yaml +0 -51
  1235. package/src/clis/instagram/following.yaml +0 -51
  1236. package/src/clis/instagram/like.yaml +0 -46
  1237. package/src/clis/instagram/note.test.ts +0 -96
  1238. package/src/clis/instagram/note.ts +0 -254
  1239. package/src/clis/instagram/post.test.ts +0 -1716
  1240. package/src/clis/instagram/post.ts +0 -1620
  1241. package/src/clis/instagram/profile.yaml +0 -42
  1242. package/src/clis/instagram/reel.test.ts +0 -191
  1243. package/src/clis/instagram/reel.ts +0 -886
  1244. package/src/clis/instagram/save.yaml +0 -46
  1245. package/src/clis/instagram/saved.yaml +0 -40
  1246. package/src/clis/instagram/search.yaml +0 -44
  1247. package/src/clis/instagram/story.test.ts +0 -191
  1248. package/src/clis/instagram/story.ts +0 -151
  1249. package/src/clis/instagram/unfollow.yaml +0 -38
  1250. package/src/clis/instagram/unlike.yaml +0 -46
  1251. package/src/clis/instagram/unsave.yaml +0 -46
  1252. package/src/clis/instagram/user.yaml +0 -54
  1253. package/src/clis/jd/item.test.ts +0 -52
  1254. package/src/clis/jd/item.ts +0 -104
  1255. package/src/clis/jike/comment.ts +0 -112
  1256. package/src/clis/jike/create.ts +0 -112
  1257. package/src/clis/jike/feed.ts +0 -73
  1258. package/src/clis/jike/like.ts +0 -64
  1259. package/src/clis/jike/notifications.ts +0 -184
  1260. package/src/clis/jike/post.yaml +0 -59
  1261. package/src/clis/jike/repost.ts +0 -113
  1262. package/src/clis/jike/search.ts +0 -73
  1263. package/src/clis/jike/topic.yaml +0 -53
  1264. package/src/clis/jike/user.yaml +0 -52
  1265. package/src/clis/jike/utils.ts +0 -36
  1266. package/src/clis/jimeng/generate.yaml +0 -85
  1267. package/src/clis/jimeng/history.yaml +0 -46
  1268. package/src/clis/linkedin/search.ts +0 -417
  1269. package/src/clis/linkedin/timeline.test.ts +0 -99
  1270. package/src/clis/linkedin/timeline.ts +0 -532
  1271. package/src/clis/linux-do/categories.yaml +0 -70
  1272. package/src/clis/linux-do/category.ts +0 -37
  1273. package/src/clis/linux-do/feed.test.ts +0 -132
  1274. package/src/clis/linux-do/feed.ts +0 -501
  1275. package/src/clis/linux-do/hot.ts +0 -26
  1276. package/src/clis/linux-do/latest.ts +0 -19
  1277. package/src/clis/linux-do/search.yaml +0 -48
  1278. package/src/clis/linux-do/tags.yaml +0 -41
  1279. package/src/clis/linux-do/topic.yaml +0 -77
  1280. package/src/clis/linux-do/user-posts.yaml +0 -67
  1281. package/src/clis/linux-do/user-topics.yaml +0 -54
  1282. package/src/clis/lobsters/active.yaml +0 -29
  1283. package/src/clis/lobsters/hot.yaml +0 -29
  1284. package/src/clis/lobsters/newest.yaml +0 -29
  1285. package/src/clis/lobsters/tag.yaml +0 -34
  1286. package/src/clis/medium/feed.ts +0 -16
  1287. package/src/clis/medium/search.ts +0 -16
  1288. package/src/clis/medium/user.ts +0 -16
  1289. package/src/clis/medium/utils.ts +0 -84
  1290. package/src/clis/notebooklm/compat.test.ts +0 -19
  1291. package/src/clis/notebooklm/current.ts +0 -37
  1292. package/src/clis/notebooklm/get.ts +0 -51
  1293. package/src/clis/notebooklm/history.test.ts +0 -70
  1294. package/src/clis/notebooklm/history.ts +0 -34
  1295. package/src/clis/notebooklm/list.ts +0 -40
  1296. package/src/clis/notebooklm/note-list.test.ts +0 -64
  1297. package/src/clis/notebooklm/note-list.ts +0 -40
  1298. package/src/clis/notebooklm/notes-get.test.ts +0 -88
  1299. package/src/clis/notebooklm/notes-get.ts +0 -65
  1300. package/src/clis/notebooklm/open.test.ts +0 -78
  1301. package/src/clis/notebooklm/open.ts +0 -61
  1302. package/src/clis/notebooklm/rpc.test.ts +0 -126
  1303. package/src/clis/notebooklm/rpc.ts +0 -286
  1304. package/src/clis/notebooklm/shared.ts +0 -98
  1305. package/src/clis/notebooklm/source-fulltext.test.ts +0 -123
  1306. package/src/clis/notebooklm/source-fulltext.ts +0 -67
  1307. package/src/clis/notebooklm/source-get.test.ts +0 -100
  1308. package/src/clis/notebooklm/source-get.ts +0 -58
  1309. package/src/clis/notebooklm/source-guide.test.ts +0 -121
  1310. package/src/clis/notebooklm/source-guide.ts +0 -67
  1311. package/src/clis/notebooklm/source-list.ts +0 -43
  1312. package/src/clis/notebooklm/status.ts +0 -33
  1313. package/src/clis/notebooklm/summary.test.ts +0 -94
  1314. package/src/clis/notebooklm/summary.ts +0 -43
  1315. package/src/clis/notebooklm/utils.test.ts +0 -446
  1316. package/src/clis/notebooklm/utils.ts +0 -902
  1317. package/src/clis/notion/export.ts +0 -36
  1318. package/src/clis/notion/favorites.ts +0 -87
  1319. package/src/clis/notion/new.ts +0 -39
  1320. package/src/clis/notion/read.ts +0 -33
  1321. package/src/clis/notion/search.ts +0 -54
  1322. package/src/clis/notion/sidebar.ts +0 -44
  1323. package/src/clis/notion/status.ts +0 -18
  1324. package/src/clis/notion/write.ts +0 -45
  1325. package/src/clis/ones/common.ts +0 -187
  1326. package/src/clis/ones/enrich-tasks.ts +0 -47
  1327. package/src/clis/ones/login.ts +0 -103
  1328. package/src/clis/ones/logout.ts +0 -19
  1329. package/src/clis/ones/me.ts +0 -34
  1330. package/src/clis/ones/my-tasks.ts +0 -148
  1331. package/src/clis/ones/resolve-labels.ts +0 -80
  1332. package/src/clis/ones/task-helpers.test.ts +0 -14
  1333. package/src/clis/ones/task-helpers.ts +0 -214
  1334. package/src/clis/ones/task.ts +0 -79
  1335. package/src/clis/ones/tasks.ts +0 -92
  1336. package/src/clis/ones/token-info.ts +0 -46
  1337. package/src/clis/ones/worklog.test.ts +0 -24
  1338. package/src/clis/ones/worklog.ts +0 -306
  1339. package/src/clis/paperreview/commands.test.ts +0 -283
  1340. package/src/clis/paperreview/feedback.ts +0 -64
  1341. package/src/clis/paperreview/review.ts +0 -47
  1342. package/src/clis/paperreview/submit.ts +0 -119
  1343. package/src/clis/paperreview/utils.test.ts +0 -68
  1344. package/src/clis/paperreview/utils.ts +0 -276
  1345. package/src/clis/pixiv/detail.yaml +0 -49
  1346. package/src/clis/pixiv/download.test.ts +0 -114
  1347. package/src/clis/pixiv/download.ts +0 -91
  1348. package/src/clis/pixiv/illusts.test.ts +0 -115
  1349. package/src/clis/pixiv/illusts.ts +0 -78
  1350. package/src/clis/pixiv/ranking.yaml +0 -53
  1351. package/src/clis/pixiv/search.test.ts +0 -97
  1352. package/src/clis/pixiv/search.ts +0 -53
  1353. package/src/clis/pixiv/test-utils.ts +0 -29
  1354. package/src/clis/pixiv/user.yaml +0 -46
  1355. package/src/clis/pixiv/utils.ts +0 -62
  1356. package/src/clis/producthunt/browse.ts +0 -109
  1357. package/src/clis/producthunt/hot.ts +0 -127
  1358. package/src/clis/producthunt/posts.ts +0 -29
  1359. package/src/clis/producthunt/today.ts +0 -37
  1360. package/src/clis/producthunt/utils.test.ts +0 -72
  1361. package/src/clis/producthunt/utils.ts +0 -122
  1362. package/src/clis/reddit/comment.ts +0 -60
  1363. package/src/clis/reddit/frontpage.yaml +0 -30
  1364. package/src/clis/reddit/hot.yaml +0 -47
  1365. package/src/clis/reddit/popular.yaml +0 -40
  1366. package/src/clis/reddit/read.test.ts +0 -34
  1367. package/src/clis/reddit/read.ts +0 -186
  1368. package/src/clis/reddit/save.ts +0 -54
  1369. package/src/clis/reddit/saved.ts +0 -51
  1370. package/src/clis/reddit/search.yaml +0 -61
  1371. package/src/clis/reddit/subreddit.yaml +0 -50
  1372. package/src/clis/reddit/subscribe.ts +0 -53
  1373. package/src/clis/reddit/upvote.ts +0 -67
  1374. package/src/clis/reddit/upvoted.ts +0 -51
  1375. package/src/clis/reddit/user-comments.yaml +0 -46
  1376. package/src/clis/reddit/user-posts.yaml +0 -44
  1377. package/src/clis/reddit/user.yaml +0 -40
  1378. package/src/clis/reuters/search.ts +0 -51
  1379. package/src/clis/sinablog/article.ts +0 -15
  1380. package/src/clis/sinablog/hot.ts +0 -15
  1381. package/src/clis/sinablog/search.ts +0 -56
  1382. package/src/clis/sinablog/user.ts +0 -16
  1383. package/src/clis/sinablog/utils.ts +0 -197
  1384. package/src/clis/sinafinance/news.ts +0 -76
  1385. package/src/clis/sinafinance/rolling-news.ts +0 -42
  1386. package/src/clis/sinafinance/stock-rank.ts +0 -68
  1387. package/src/clis/sinafinance/stock.ts +0 -127
  1388. package/src/clis/smzdm/search.ts +0 -56
  1389. package/src/clis/spotify/spotify.ts +0 -328
  1390. package/src/clis/spotify/utils.test.ts +0 -87
  1391. package/src/clis/spotify/utils.ts +0 -92
  1392. package/src/clis/stackoverflow/bounties.yaml +0 -29
  1393. package/src/clis/stackoverflow/hot.yaml +0 -28
  1394. package/src/clis/stackoverflow/search.yaml +0 -33
  1395. package/src/clis/stackoverflow/unanswered.yaml +0 -28
  1396. package/src/clis/steam/top-sellers.yaml +0 -29
  1397. package/src/clis/substack/feed.ts +0 -16
  1398. package/src/clis/substack/publication.ts +0 -16
  1399. package/src/clis/substack/search.ts +0 -92
  1400. package/src/clis/substack/utils.test.ts +0 -52
  1401. package/src/clis/substack/utils.ts +0 -141
  1402. package/src/clis/tieba/commands.test.ts +0 -86
  1403. package/src/clis/tieba/hot.ts +0 -52
  1404. package/src/clis/tieba/posts.ts +0 -108
  1405. package/src/clis/tieba/read.ts +0 -158
  1406. package/src/clis/tieba/search.ts +0 -119
  1407. package/src/clis/tieba/utils.test.ts +0 -322
  1408. package/src/clis/tieba/utils.ts +0 -348
  1409. package/src/clis/tiktok/comment.yaml +0 -66
  1410. package/src/clis/tiktok/explore.yaml +0 -39
  1411. package/src/clis/tiktok/follow.yaml +0 -39
  1412. package/src/clis/tiktok/following.yaml +0 -46
  1413. package/src/clis/tiktok/friends.yaml +0 -47
  1414. package/src/clis/tiktok/like.yaml +0 -38
  1415. package/src/clis/tiktok/live.yaml +0 -51
  1416. package/src/clis/tiktok/notifications.yaml +0 -52
  1417. package/src/clis/tiktok/profile.yaml +0 -45
  1418. package/src/clis/tiktok/save.yaml +0 -34
  1419. package/src/clis/tiktok/search.yaml +0 -47
  1420. package/src/clis/tiktok/unfollow.yaml +0 -44
  1421. package/src/clis/tiktok/unlike.yaml +0 -38
  1422. package/src/clis/tiktok/unsave.yaml +0 -36
  1423. package/src/clis/tiktok/user.yaml +0 -44
  1424. package/src/clis/twitter/accept.ts +0 -214
  1425. package/src/clis/twitter/article.ts +0 -170
  1426. package/src/clis/twitter/block.ts +0 -93
  1427. package/src/clis/twitter/bookmark.ts +0 -68
  1428. package/src/clis/twitter/bookmarks.ts +0 -202
  1429. package/src/clis/twitter/delete.ts +0 -78
  1430. package/src/clis/twitter/download.ts +0 -118
  1431. package/src/clis/twitter/follow.ts +0 -70
  1432. package/src/clis/twitter/followers.ts +0 -116
  1433. package/src/clis/twitter/following.ts +0 -109
  1434. package/src/clis/twitter/hide-reply.ts +0 -71
  1435. package/src/clis/twitter/like.ts +0 -74
  1436. package/src/clis/twitter/likes.test.ts +0 -91
  1437. package/src/clis/twitter/likes.ts +0 -256
  1438. package/src/clis/twitter/notifications.ts +0 -136
  1439. package/src/clis/twitter/post.test.ts +0 -157
  1440. package/src/clis/twitter/post.ts +0 -110
  1441. package/src/clis/twitter/profile.ts +0 -108
  1442. package/src/clis/twitter/reply-dm.ts +0 -194
  1443. package/src/clis/twitter/reply.test.ts +0 -177
  1444. package/src/clis/twitter/reply.ts +0 -309
  1445. package/src/clis/twitter/search.test.ts +0 -265
  1446. package/src/clis/twitter/search.ts +0 -185
  1447. package/src/clis/twitter/shared.ts +0 -45
  1448. package/src/clis/twitter/thread.ts +0 -182
  1449. package/src/clis/twitter/timeline.test.ts +0 -109
  1450. package/src/clis/twitter/timeline.ts +0 -248
  1451. package/src/clis/twitter/trending.ts +0 -66
  1452. package/src/clis/twitter/unblock.ts +0 -76
  1453. package/src/clis/twitter/unbookmark.ts +0 -67
  1454. package/src/clis/twitter/unfollow.ts +0 -76
  1455. package/src/clis/v2ex/daily.ts +0 -106
  1456. package/src/clis/v2ex/hot.yaml +0 -28
  1457. package/src/clis/v2ex/latest.yaml +0 -28
  1458. package/src/clis/v2ex/me.ts +0 -104
  1459. package/src/clis/v2ex/member.yaml +0 -29
  1460. package/src/clis/v2ex/node.yaml +0 -34
  1461. package/src/clis/v2ex/nodes.yaml +0 -31
  1462. package/src/clis/v2ex/notifications.ts +0 -76
  1463. package/src/clis/v2ex/replies.yaml +0 -32
  1464. package/src/clis/v2ex/topic.yaml +0 -33
  1465. package/src/clis/v2ex/user.yaml +0 -34
  1466. package/src/clis/web/read.ts +0 -210
  1467. package/src/clis/weibo/comments.ts +0 -54
  1468. package/src/clis/weibo/feed.ts +0 -57
  1469. package/src/clis/weibo/hot.ts +0 -39
  1470. package/src/clis/weibo/me.ts +0 -77
  1471. package/src/clis/weibo/post.ts +0 -77
  1472. package/src/clis/weibo/search.ts +0 -78
  1473. package/src/clis/weibo/user.ts +0 -64
  1474. package/src/clis/weibo/utils.ts +0 -32
  1475. package/src/clis/weixin/download.ts +0 -382
  1476. package/src/clis/weread/book.ts +0 -271
  1477. package/src/clis/weread/commands.test.ts +0 -466
  1478. package/src/clis/weread/highlights.ts +0 -25
  1479. package/src/clis/weread/notebooks.ts +0 -23
  1480. package/src/clis/weread/notes.ts +0 -31
  1481. package/src/clis/weread/private-api-regression.test.ts +0 -435
  1482. package/src/clis/weread/ranking.ts +0 -29
  1483. package/src/clis/weread/search-regression.test.ts +0 -440
  1484. package/src/clis/weread/search.ts +0 -207
  1485. package/src/clis/weread/shelf.ts +0 -84
  1486. package/src/clis/weread/utils.test.ts +0 -153
  1487. package/src/clis/weread/utils.ts +0 -390
  1488. package/src/clis/wikipedia/random.ts +0 -19
  1489. package/src/clis/wikipedia/search.ts +0 -38
  1490. package/src/clis/wikipedia/summary.ts +0 -23
  1491. package/src/clis/wikipedia/trending.ts +0 -41
  1492. package/src/clis/wikipedia/utils.ts +0 -51
  1493. package/src/clis/xianyu/chat.test.ts +0 -20
  1494. package/src/clis/xianyu/chat.ts +0 -175
  1495. package/src/clis/xianyu/item.test.ts +0 -67
  1496. package/src/clis/xianyu/item.ts +0 -172
  1497. package/src/clis/xianyu/search.test.ts +0 -22
  1498. package/src/clis/xianyu/search.ts +0 -151
  1499. package/src/clis/xianyu/utils.ts +0 -9
  1500. package/src/clis/xiaoe/catalog.yaml +0 -129
  1501. package/src/clis/xiaoe/content.yaml +0 -43
  1502. package/src/clis/xiaoe/courses.yaml +0 -73
  1503. package/src/clis/xiaoe/detail.yaml +0 -39
  1504. package/src/clis/xiaoe/play-url.yaml +0 -124
  1505. package/src/clis/xiaohongshu/comments.test.ts +0 -171
  1506. package/src/clis/xiaohongshu/comments.ts +0 -140
  1507. package/src/clis/xiaohongshu/creator-note-detail.test.ts +0 -273
  1508. package/src/clis/xiaohongshu/creator-note-detail.ts +0 -447
  1509. package/src/clis/xiaohongshu/creator-notes-summary.test.ts +0 -54
  1510. package/src/clis/xiaohongshu/creator-notes-summary.ts +0 -120
  1511. package/src/clis/xiaohongshu/creator-notes.test.ts +0 -212
  1512. package/src/clis/xiaohongshu/creator-notes.ts +0 -295
  1513. package/src/clis/xiaohongshu/creator-profile.ts +0 -59
  1514. package/src/clis/xiaohongshu/creator-stats.ts +0 -80
  1515. package/src/clis/xiaohongshu/download.test.ts +0 -94
  1516. package/src/clis/xiaohongshu/download.ts +0 -174
  1517. package/src/clis/xiaohongshu/feed.yaml +0 -31
  1518. package/src/clis/xiaohongshu/note-helpers.ts +0 -25
  1519. package/src/clis/xiaohongshu/note.test.ts +0 -213
  1520. package/src/clis/xiaohongshu/note.ts +0 -104
  1521. package/src/clis/xiaohongshu/notifications.yaml +0 -37
  1522. package/src/clis/xiaohongshu/publish.test.ts +0 -228
  1523. package/src/clis/xiaohongshu/publish.ts +0 -598
  1524. package/src/clis/xiaohongshu/search.test.ts +0 -191
  1525. package/src/clis/xiaohongshu/search.ts +0 -143
  1526. package/src/clis/xiaohongshu/user-helpers.test.ts +0 -129
  1527. package/src/clis/xiaohongshu/user-helpers.ts +0 -89
  1528. package/src/clis/xiaohongshu/user.ts +0 -64
  1529. package/src/clis/xiaoyuzhou/episode.ts +0 -28
  1530. package/src/clis/xiaoyuzhou/podcast-episodes.ts +0 -36
  1531. package/src/clis/xiaoyuzhou/podcast.ts +0 -27
  1532. package/src/clis/xiaoyuzhou/utils.test.ts +0 -122
  1533. package/src/clis/xiaoyuzhou/utils.ts +0 -65
  1534. package/src/clis/xueqiu/comments.test.ts +0 -823
  1535. package/src/clis/xueqiu/comments.ts +0 -461
  1536. package/src/clis/xueqiu/danjuan-utils.test.ts +0 -49
  1537. package/src/clis/xueqiu/danjuan-utils.ts +0 -176
  1538. package/src/clis/xueqiu/earnings-date.yaml +0 -69
  1539. package/src/clis/xueqiu/feed.yaml +0 -53
  1540. package/src/clis/xueqiu/fund-holdings.ts +0 -32
  1541. package/src/clis/xueqiu/fund-snapshot.ts +0 -27
  1542. package/src/clis/xueqiu/hot-stock.yaml +0 -49
  1543. package/src/clis/xueqiu/hot.yaml +0 -46
  1544. package/src/clis/xueqiu/search.yaml +0 -55
  1545. package/src/clis/xueqiu/stock.yaml +0 -69
  1546. package/src/clis/xueqiu/watchlist.yaml +0 -46
  1547. package/src/clis/yahoo-finance/quote.ts +0 -72
  1548. package/src/clis/yollomi/background.ts +0 -48
  1549. package/src/clis/yollomi/edit.ts +0 -58
  1550. package/src/clis/yollomi/face-swap.ts +0 -45
  1551. package/src/clis/yollomi/generate.ts +0 -95
  1552. package/src/clis/yollomi/models.ts +0 -38
  1553. package/src/clis/yollomi/object-remover.ts +0 -44
  1554. package/src/clis/yollomi/remove-bg.ts +0 -40
  1555. package/src/clis/yollomi/restore.ts +0 -40
  1556. package/src/clis/yollomi/try-on.ts +0 -48
  1557. package/src/clis/yollomi/upload.ts +0 -78
  1558. package/src/clis/yollomi/upscale.ts +0 -49
  1559. package/src/clis/yollomi/utils.ts +0 -202
  1560. package/src/clis/yollomi/video.ts +0 -61
  1561. package/src/clis/youtube/channel.ts +0 -155
  1562. package/src/clis/youtube/comments.ts +0 -97
  1563. package/src/clis/youtube/search.ts +0 -99
  1564. package/src/clis/youtube/transcript-group.test.ts +0 -108
  1565. package/src/clis/youtube/transcript-group.ts +0 -287
  1566. package/src/clis/youtube/transcript.ts +0 -279
  1567. package/src/clis/youtube/utils.test.ts +0 -43
  1568. package/src/clis/youtube/utils.ts +0 -97
  1569. package/src/clis/youtube/video.ts +0 -118
  1570. package/src/clis/yuanbao/ask.test.ts +0 -156
  1571. package/src/clis/yuanbao/ask.ts +0 -522
  1572. package/src/clis/yuanbao/new.test.ts +0 -36
  1573. package/src/clis/yuanbao/new.ts +0 -81
  1574. package/src/clis/yuanbao/shared.ts +0 -57
  1575. package/src/clis/zhihu/download.test.ts +0 -14
  1576. package/src/clis/zhihu/download.ts +0 -87
  1577. package/src/clis/zhihu/hot.yaml +0 -46
  1578. package/src/clis/zhihu/question.test.ts +0 -96
  1579. package/src/clis/zhihu/question.ts +0 -63
  1580. package/src/clis/zhihu/search.yaml +0 -59
  1581. package/src/clis/zsxq/dynamics.ts +0 -60
  1582. package/src/clis/zsxq/groups.ts +0 -41
  1583. package/src/clis/zsxq/search.test.ts +0 -29
  1584. package/src/clis/zsxq/search.ts +0 -54
  1585. package/src/clis/zsxq/topic.test.ts +0 -34
  1586. package/src/clis/zsxq/topic.ts +0 -68
  1587. package/src/clis/zsxq/topics.test.ts +0 -29
  1588. package/src/clis/zsxq/topics.ts +0 -36
  1589. package/src/clis/zsxq/utils.ts +0 -351
  1590. package/src/commanderAdapter.test.ts +0 -315
  1591. package/src/commanderAdapter.ts +0 -319
  1592. package/src/commands/daemon.test.ts +0 -204
  1593. package/src/commands/daemon.ts +0 -87
  1594. package/src/completion.test.ts +0 -30
  1595. package/src/completion.ts +0 -132
  1596. package/src/constants.ts +0 -41
  1597. package/src/daemon.test.ts +0 -88
  1598. package/src/daemon.ts +0 -339
  1599. package/src/discovery.ts +0 -328
  1600. package/src/doctor.test.ts +0 -111
  1601. package/src/doctor.ts +0 -163
  1602. package/src/download/article-download.ts +0 -272
  1603. package/src/download/index.test.ts +0 -135
  1604. package/src/download/index.ts +0 -422
  1605. package/src/download/media-download.ts +0 -180
  1606. package/src/download/progress.ts +0 -125
  1607. package/src/electron-apps.test.ts +0 -50
  1608. package/src/electron-apps.ts +0 -97
  1609. package/src/engine.test.ts +0 -323
  1610. package/src/errors.test.ts +0 -79
  1611. package/src/errors.ts +0 -162
  1612. package/src/execution.test.ts +0 -47
  1613. package/src/execution.ts +0 -235
  1614. package/src/explore.ts +0 -502
  1615. package/src/extension-manifest-regression.test.ts +0 -18
  1616. package/src/external-clis.yaml +0 -56
  1617. package/src/external.test.ts +0 -97
  1618. package/src/external.ts +0 -246
  1619. package/src/generate.ts +0 -161
  1620. package/src/hooks.test.ts +0 -126
  1621. package/src/hooks.ts +0 -91
  1622. package/src/idle-manager.ts +0 -60
  1623. package/src/interceptor.test.ts +0 -94
  1624. package/src/interceptor.ts +0 -204
  1625. package/src/launcher.test.ts +0 -181
  1626. package/src/launcher.ts +0 -263
  1627. package/src/logger.ts +0 -57
  1628. package/src/main.ts +0 -66
  1629. package/src/node-network.test.ts +0 -93
  1630. package/src/node-network.ts +0 -213
  1631. package/src/output.test.ts +0 -69
  1632. package/src/output.ts +0 -145
  1633. package/src/pipeline/executor.test.ts +0 -191
  1634. package/src/pipeline/executor.ts +0 -110
  1635. package/src/pipeline/registry.ts +0 -62
  1636. package/src/pipeline/steps/browser.ts +0 -76
  1637. package/src/pipeline/steps/download.test.ts +0 -135
  1638. package/src/pipeline/steps/download.ts +0 -320
  1639. package/src/pipeline/steps/fetch.test.ts +0 -179
  1640. package/src/pipeline/steps/fetch.ts +0 -160
  1641. package/src/pipeline/steps/intercept.ts +0 -55
  1642. package/src/pipeline/steps/tap.ts +0 -100
  1643. package/src/pipeline/steps/transform.ts +0 -71
  1644. package/src/pipeline/template.test.ts +0 -177
  1645. package/src/pipeline/template.ts +0 -269
  1646. package/src/pipeline/transform.test.ts +0 -140
  1647. package/src/plugin-manifest.test.ts +0 -223
  1648. package/src/plugin-manifest.ts +0 -206
  1649. package/src/plugin-scaffold.test.ts +0 -98
  1650. package/src/plugin-scaffold.ts +0 -170
  1651. package/src/plugin.test.ts +0 -1427
  1652. package/src/plugin.ts +0 -1537
  1653. package/src/record.test.ts +0 -362
  1654. package/src/record.ts +0 -824
  1655. package/src/registry-api.ts +0 -14
  1656. package/src/registry.test.ts +0 -133
  1657. package/src/registry.ts +0 -160
  1658. package/src/runtime-detect.test.ts +0 -30
  1659. package/src/runtime-detect.ts +0 -36
  1660. package/src/runtime.ts +0 -86
  1661. package/src/scripts/framework.ts +0 -20
  1662. package/src/scripts/interact.ts +0 -22
  1663. package/src/scripts/store.ts +0 -40
  1664. package/src/serialization.test.ts +0 -44
  1665. package/src/serialization.ts +0 -92
  1666. package/src/snapshotFormatter.test.ts +0 -579
  1667. package/src/snapshotFormatter.ts +0 -359
  1668. package/src/synthesize.ts +0 -296
  1669. package/src/tui.test.ts +0 -23
  1670. package/src/tui.ts +0 -237
  1671. package/src/types.ts +0 -95
  1672. package/src/update-check.ts +0 -114
  1673. package/src/utils.ts +0 -44
  1674. package/src/validate.ts +0 -103
  1675. package/src/verify.ts +0 -93
  1676. package/src/version.ts +0 -18
  1677. package/src/weixin-download.test.ts +0 -91
  1678. package/src/yaml-schema.ts +0 -48
  1679. package/tests/e2e/band-auth.test.ts +0 -20
  1680. package/tests/e2e/browser-auth-helpers.ts +0 -18
  1681. package/tests/e2e/browser-auth.test.ts +0 -150
  1682. package/tests/e2e/browser-public-extended.test.ts +0 -166
  1683. package/tests/e2e/browser-public.test.ts +0 -417
  1684. package/tests/e2e/helpers.ts +0 -64
  1685. package/tests/e2e/management.test.ts +0 -106
  1686. package/tests/e2e/output-formats.test.ts +0 -44
  1687. package/tests/e2e/plugin-management.test.ts +0 -140
  1688. package/tests/e2e/public-commands.test.ts +0 -569
  1689. package/tests/smoke/api-health.test.ts +0 -131
  1690. package/tsconfig.json +0 -17
  1691. package/vitest.config.ts +0 -50
  1692. /package/dist/{browser.test.d.ts → clis/gemini/deep-research-result.test.d.ts} +0 -0
  1693. /package/dist/{browser/cdp.test.d.ts → clis/gemini/deep-research.test.d.ts} +0 -0
  1694. /package/dist/{browser/daemon-client.test.d.ts → clis/hupu/mentions.d.ts} +0 -0
  1695. /package/dist/{browser/dom-helpers.test.d.ts → clis/lesswrong/comments.d.ts} +0 -0
  1696. /package/dist/{browser/page.test.d.ts → clis/lesswrong/curated.d.ts} +0 -0
  1697. /package/dist/{browser/stealth.test.d.ts → clis/lesswrong/frontpage.d.ts} +0 -0
  1698. /package/dist/{build-manifest.test.d.ts → clis/lesswrong/new.d.ts} +0 -0
  1699. /package/dist/{capabilityRouting.test.d.ts → clis/lesswrong/read.d.ts} +0 -0
  1700. /package/dist/{cli.test.d.ts → clis/lesswrong/sequences.d.ts} +0 -0
  1701. /package/dist/{commanderAdapter.test.d.ts → clis/lesswrong/shortform.d.ts} +0 -0
  1702. /package/dist/{commands/daemon.test.d.ts → clis/lesswrong/tag.d.ts} +0 -0
  1703. /package/dist/{completion.test.d.ts → clis/lesswrong/tags.d.ts} +0 -0
  1704. /package/dist/{daemon.test.d.ts → clis/lesswrong/top-month.d.ts} +0 -0
  1705. /package/dist/{doctor.test.d.ts → clis/lesswrong/top-week.d.ts} +0 -0
  1706. /package/dist/{download/index.test.d.ts → clis/lesswrong/top-year.d.ts} +0 -0
  1707. /package/dist/{electron-apps.test.d.ts → clis/lesswrong/top.d.ts} +0 -0
  1708. /package/dist/{engine.test.d.ts → clis/lesswrong/user-posts.d.ts} +0 -0
  1709. /package/dist/{errors.test.d.ts → clis/lesswrong/user.d.ts} +0 -0
  1710. /package/dist/{analysis.d.ts → src/analysis.d.ts} +0 -0
  1711. /package/dist/{analysis.js → src/analysis.js} +0 -0
  1712. /package/dist/{browser → src/browser}/base-page.d.ts +0 -0
  1713. /package/dist/{browser → src/browser}/base-page.js +0 -0
  1714. /package/dist/{browser → src/browser}/bridge.d.ts +0 -0
  1715. /package/dist/{browser → src/browser}/bridge.js +0 -0
  1716. /package/dist/{extension-manifest-regression.test.d.ts → src/browser/cdp.test.d.ts} +0 -0
  1717. /package/dist/{browser → src/browser}/cdp.test.js +0 -0
  1718. /package/dist/{browser → src/browser}/daemon-client.d.ts +0 -0
  1719. /package/dist/{browser → src/browser}/daemon-client.js +0 -0
  1720. /package/dist/{external.test.d.ts → src/browser/daemon-client.test.d.ts} +0 -0
  1721. /package/dist/{browser → src/browser}/daemon-client.test.js +0 -0
  1722. /package/dist/{browser → src/browser}/discover.d.ts +0 -0
  1723. /package/dist/{browser → src/browser}/discover.js +0 -0
  1724. /package/dist/{browser → src/browser}/dom-helpers.d.ts +0 -0
  1725. /package/dist/{browser → src/browser}/dom-helpers.js +0 -0
  1726. /package/dist/{launcher.test.d.ts → src/browser/dom-helpers.test.d.ts} +0 -0
  1727. /package/dist/{browser → src/browser}/dom-helpers.test.js +0 -0
  1728. /package/dist/{browser → src/browser}/dom-snapshot.d.ts +0 -0
  1729. /package/dist/{browser → src/browser}/dom-snapshot.js +0 -0
  1730. /package/dist/{browser → src/browser}/dom-snapshot.test.d.ts +0 -0
  1731. /package/dist/{browser → src/browser}/dom-snapshot.test.js +0 -0
  1732. /package/dist/{browser → src/browser}/errors.d.ts +0 -0
  1733. /package/dist/{browser → src/browser}/errors.js +0 -0
  1734. /package/dist/{browser → src/browser}/index.d.ts +0 -0
  1735. /package/dist/{browser → src/browser}/index.js +0 -0
  1736. /package/dist/{node-network.test.d.ts → src/browser/page.test.d.ts} +0 -0
  1737. /package/dist/{browser → src/browser}/page.test.js +0 -0
  1738. /package/dist/{browser → src/browser}/stealth.d.ts +0 -0
  1739. /package/dist/{browser → src/browser}/stealth.js +0 -0
  1740. /package/dist/{output.test.d.ts → src/browser/stealth.test.d.ts} +0 -0
  1741. /package/dist/{browser → src/browser}/stealth.test.js +0 -0
  1742. /package/dist/{browser → src/browser}/tabs.d.ts +0 -0
  1743. /package/dist/{browser → src/browser}/tabs.js +0 -0
  1744. /package/dist/{execution.test.d.ts → src/browser.test.d.ts} +0 -0
  1745. /package/dist/{browser.test.js → src/browser.test.js} +0 -0
  1746. /package/dist/{build-manifest.d.ts → src/build-manifest.d.ts} +0 -0
  1747. /package/dist/{pipeline/steps/download.test.d.ts → src/build-manifest.test.d.ts} +0 -0
  1748. /package/dist/{build-manifest.test.js → src/build-manifest.test.js} +0 -0
  1749. /package/dist/{capabilityRouting.d.ts → src/capabilityRouting.d.ts} +0 -0
  1750. /package/dist/{capabilityRouting.js → src/capabilityRouting.js} +0 -0
  1751. /package/dist/{pipeline/steps/fetch.test.d.ts → src/capabilityRouting.test.d.ts} +0 -0
  1752. /package/dist/{capabilityRouting.test.js → src/capabilityRouting.test.js} +0 -0
  1753. /package/dist/{cascade.d.ts → src/cascade.d.ts} +0 -0
  1754. /package/dist/{record.test.d.ts → src/cli.test.d.ts} +0 -0
  1755. /package/dist/{runtime-detect.test.d.ts → src/commanderAdapter.test.d.ts} +0 -0
  1756. /package/dist/{commanderAdapter.test.js → src/commanderAdapter.test.js} +0 -0
  1757. /package/dist/{commands → src/commands}/daemon.d.ts +0 -0
  1758. /package/dist/{commands → src/commands}/daemon.js +0 -0
  1759. /package/dist/{serialization.test.d.ts → src/commands/daemon.test.d.ts} +0 -0
  1760. /package/dist/{commands → src/commands}/daemon.test.js +0 -0
  1761. /package/dist/{completion.d.ts → src/completion.d.ts} +0 -0
  1762. /package/dist/{completion.js → src/completion.js} +0 -0
  1763. /package/dist/{tui.test.d.ts → src/completion.test.d.ts} +0 -0
  1764. /package/dist/{completion.test.js → src/completion.test.js} +0 -0
  1765. /package/dist/{constants.d.ts → src/constants.d.ts} +0 -0
  1766. /package/dist/{constants.js → src/constants.js} +0 -0
  1767. /package/dist/{daemon.d.ts → src/daemon.d.ts} +0 -0
  1768. /package/dist/{daemon.js → src/daemon.js} +0 -0
  1769. /package/dist/{weixin-download.test.d.ts → src/daemon.test.d.ts} +0 -0
  1770. /package/dist/{daemon.test.js → src/daemon.test.js} +0 -0
  1771. /package/dist/{doctor.d.ts → src/doctor.d.ts} +0 -0
  1772. /package/dist/{doctor.js → src/doctor.js} +0 -0
  1773. /package/dist/{doctor.test.js → src/doctor.test.js} +0 -0
  1774. /package/dist/{download → src/download}/index.test.js +0 -0
  1775. /package/dist/{electron-apps.d.ts → src/electron-apps.d.ts} +0 -0
  1776. /package/dist/{electron-apps.js → src/electron-apps.js} +0 -0
  1777. /package/dist/{electron-apps.test.js → src/electron-apps.test.js} +0 -0
  1778. /package/dist/{engine.test.js → src/engine.test.js} +0 -0
  1779. /package/dist/{errors.d.ts → src/errors.d.ts} +0 -0
  1780. /package/dist/{errors.js → src/errors.js} +0 -0
  1781. /package/dist/{errors.test.js → src/errors.test.js} +0 -0
  1782. /package/dist/{execution.d.ts → src/execution.d.ts} +0 -0
  1783. /package/dist/{execution.js → src/execution.js} +0 -0
  1784. /package/dist/{execution.test.js → src/execution.test.js} +0 -0
  1785. /package/dist/{explore.d.ts → src/explore.d.ts} +0 -0
  1786. /package/dist/{explore.js → src/explore.js} +0 -0
  1787. /package/dist/{extension-manifest-regression.test.js → src/extension-manifest-regression.test.js} +0 -0
  1788. /package/dist/{external-clis.yaml → src/external-clis.yaml} +0 -0
  1789. /package/dist/{external.d.ts → src/external.d.ts} +0 -0
  1790. /package/dist/{external.js → src/external.js} +0 -0
  1791. /package/dist/{external.test.js → src/external.test.js} +0 -0
  1792. /package/dist/{generate.d.ts → src/generate.d.ts} +0 -0
  1793. /package/dist/{generate.js → src/generate.js} +0 -0
  1794. /package/dist/{hooks.d.ts → src/hooks.d.ts} +0 -0
  1795. /package/dist/{hooks.js → src/hooks.js} +0 -0
  1796. /package/dist/{hooks.test.d.ts → src/hooks.test.d.ts} +0 -0
  1797. /package/dist/{hooks.test.js → src/hooks.test.js} +0 -0
  1798. /package/dist/{idle-manager.d.ts → src/idle-manager.d.ts} +0 -0
  1799. /package/dist/{idle-manager.js → src/idle-manager.js} +0 -0
  1800. /package/dist/{interceptor.test.d.ts → src/interceptor.test.d.ts} +0 -0
  1801. /package/dist/{interceptor.test.js → src/interceptor.test.js} +0 -0
  1802. /package/dist/{launcher.d.ts → src/launcher.d.ts} +0 -0
  1803. /package/dist/{launcher.js → src/launcher.js} +0 -0
  1804. /package/dist/{launcher.test.js → src/launcher.test.js} +0 -0
  1805. /package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
  1806. /package/dist/{logger.js → src/logger.js} +0 -0
  1807. /package/dist/{main.d.ts → src/main.d.ts} +0 -0
  1808. /package/dist/{node-network.d.ts → src/node-network.d.ts} +0 -0
  1809. /package/dist/{node-network.js → src/node-network.js} +0 -0
  1810. /package/dist/{node-network.test.js → src/node-network.test.js} +0 -0
  1811. /package/dist/{output.d.ts → src/output.d.ts} +0 -0
  1812. /package/dist/{output.js → src/output.js} +0 -0
  1813. /package/dist/{output.test.js → src/output.test.js} +0 -0
  1814. /package/dist/{pipeline → src/pipeline}/executor.d.ts +0 -0
  1815. /package/dist/{pipeline → src/pipeline}/executor.js +0 -0
  1816. /package/dist/{pipeline → src/pipeline}/executor.test.d.ts +0 -0
  1817. /package/dist/{pipeline → src/pipeline}/executor.test.js +0 -0
  1818. /package/dist/{pipeline → src/pipeline}/registry.d.ts +0 -0
  1819. /package/dist/{pipeline → src/pipeline}/registry.js +0 -0
  1820. /package/dist/{pipeline → src/pipeline}/steps/browser.d.ts +0 -0
  1821. /package/dist/{pipeline → src/pipeline}/steps/browser.js +0 -0
  1822. /package/dist/{pipeline → src/pipeline}/steps/download.d.ts +0 -0
  1823. /package/dist/{pipeline → src/pipeline}/steps/download.js +0 -0
  1824. /package/dist/{pipeline → src/pipeline}/steps/download.test.js +0 -0
  1825. /package/dist/{pipeline → src/pipeline}/steps/fetch.d.ts +0 -0
  1826. /package/dist/{pipeline → src/pipeline}/steps/fetch.js +0 -0
  1827. /package/dist/{pipeline → src/pipeline}/steps/fetch.test.js +0 -0
  1828. /package/dist/{pipeline → src/pipeline}/steps/intercept.d.ts +0 -0
  1829. /package/dist/{pipeline → src/pipeline}/steps/intercept.js +0 -0
  1830. /package/dist/{pipeline → src/pipeline}/steps/tap.d.ts +0 -0
  1831. /package/dist/{pipeline → src/pipeline}/steps/tap.js +0 -0
  1832. /package/dist/{pipeline → src/pipeline}/steps/transform.d.ts +0 -0
  1833. /package/dist/{pipeline → src/pipeline}/steps/transform.js +0 -0
  1834. /package/dist/{pipeline → src/pipeline}/template.d.ts +0 -0
  1835. /package/dist/{pipeline → src/pipeline}/template.js +0 -0
  1836. /package/dist/{pipeline → src/pipeline}/template.test.d.ts +0 -0
  1837. /package/dist/{pipeline → src/pipeline}/template.test.js +0 -0
  1838. /package/dist/{pipeline → src/pipeline}/transform.test.d.ts +0 -0
  1839. /package/dist/{pipeline → src/pipeline}/transform.test.js +0 -0
  1840. /package/dist/{plugin-manifest.d.ts → src/plugin-manifest.d.ts} +0 -0
  1841. /package/dist/{plugin-manifest.js → src/plugin-manifest.js} +0 -0
  1842. /package/dist/{plugin-manifest.test.d.ts → src/plugin-manifest.test.d.ts} +0 -0
  1843. /package/dist/{plugin-manifest.test.js → src/plugin-manifest.test.js} +0 -0
  1844. /package/dist/{plugin-scaffold.d.ts → src/plugin-scaffold.d.ts} +0 -0
  1845. /package/dist/{plugin-scaffold.js → src/plugin-scaffold.js} +0 -0
  1846. /package/dist/{plugin-scaffold.test.d.ts → src/plugin-scaffold.test.d.ts} +0 -0
  1847. /package/dist/{plugin-scaffold.test.js → src/plugin-scaffold.test.js} +0 -0
  1848. /package/dist/{plugin.d.ts → src/plugin.d.ts} +0 -0
  1849. /package/dist/{plugin.js → src/plugin.js} +0 -0
  1850. /package/dist/{plugin.test.d.ts → src/plugin.test.d.ts} +0 -0
  1851. /package/dist/{plugin.test.js → src/plugin.test.js} +0 -0
  1852. /package/dist/{record.d.ts → src/record.d.ts} +0 -0
  1853. /package/dist/{record.test.js → src/record.test.js} +0 -0
  1854. /package/dist/{registry-api.d.ts → src/registry-api.d.ts} +0 -0
  1855. /package/dist/{registry-api.js → src/registry-api.js} +0 -0
  1856. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  1857. /package/dist/{registry.js → src/registry.js} +0 -0
  1858. /package/dist/{registry.test.d.ts → src/registry.test.d.ts} +0 -0
  1859. /package/dist/{registry.test.js → src/registry.test.js} +0 -0
  1860. /package/dist/{runtime-detect.d.ts → src/runtime-detect.d.ts} +0 -0
  1861. /package/dist/{runtime-detect.js → src/runtime-detect.js} +0 -0
  1862. /package/dist/{runtime-detect.test.js → src/runtime-detect.test.js} +0 -0
  1863. /package/dist/{runtime.d.ts → src/runtime.d.ts} +0 -0
  1864. /package/dist/{runtime.js → src/runtime.js} +0 -0
  1865. /package/dist/{scripts → src/scripts}/framework.d.ts +0 -0
  1866. /package/dist/{scripts → src/scripts}/framework.js +0 -0
  1867. /package/dist/{scripts → src/scripts}/interact.d.ts +0 -0
  1868. /package/dist/{scripts → src/scripts}/interact.js +0 -0
  1869. /package/dist/{scripts → src/scripts}/store.d.ts +0 -0
  1870. /package/dist/{scripts → src/scripts}/store.js +0 -0
  1871. /package/dist/{serialization.d.ts → src/serialization.d.ts} +0 -0
  1872. /package/dist/{serialization.js → src/serialization.js} +0 -0
  1873. /package/dist/{serialization.test.js → src/serialization.test.js} +0 -0
  1874. /package/dist/{snapshotFormatter.d.ts → src/snapshotFormatter.d.ts} +0 -0
  1875. /package/dist/{snapshotFormatter.js → src/snapshotFormatter.js} +0 -0
  1876. /package/dist/{snapshotFormatter.test.d.ts → src/snapshotFormatter.test.d.ts} +0 -0
  1877. /package/dist/{snapshotFormatter.test.js → src/snapshotFormatter.test.js} +0 -0
  1878. /package/dist/{tui.d.ts → src/tui.d.ts} +0 -0
  1879. /package/dist/{tui.js → src/tui.js} +0 -0
  1880. /package/dist/{tui.test.js → src/tui.test.js} +0 -0
  1881. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  1882. /package/dist/{types.js → src/types.js} +0 -0
  1883. /package/dist/{update-check.d.ts → src/update-check.d.ts} +0 -0
  1884. /package/dist/{update-check.js → src/update-check.js} +0 -0
  1885. /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
  1886. /package/dist/{utils.js → src/utils.js} +0 -0
  1887. /package/dist/{validate.d.ts → src/validate.d.ts} +0 -0
  1888. /package/dist/{validate.js → src/validate.js} +0 -0
  1889. /package/dist/{verify.d.ts → src/verify.d.ts} +0 -0
  1890. /package/dist/{verify.js → src/verify.js} +0 -0
  1891. /package/dist/{version.d.ts → src/version.d.ts} +0 -0
  1892. /package/dist/{version.js → src/version.js} +0 -0
  1893. /package/dist/{yaml-schema.d.ts → src/yaml-schema.d.ts} +0 -0
  1894. /package/dist/{yaml-schema.js → src/yaml-schema.js} +0 -0
@@ -1,1716 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as os from 'node:os';
3
- import * as path from 'node:path';
4
-
5
- import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
-
7
- import { AuthRequiredError, CommandExecutionError } from '../../errors.js';
8
- import { getRegistry } from '../../registry.js';
9
- import type { IPage } from '../../types.js';
10
- import * as privatePublish from './_shared/private-publish.js';
11
- import { buildClickActionJs, buildEnsureComposerOpenJs, buildInspectUploadStageJs, buildPublishStatusProbeJs } from './post.js';
12
- import './post.js';
13
-
14
- const tempDirs: string[] = [];
15
-
16
- function createTempImage(name = 'demo.jpg', bytes = Buffer.from([0xff, 0xd8, 0xff, 0xd9])): string {
17
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'opencli-instagram-post-'));
18
- tempDirs.push(dir);
19
- const filePath = path.join(dir, name);
20
- fs.writeFileSync(filePath, bytes);
21
- return filePath;
22
- }
23
-
24
- function createTempVideo(name = 'demo.mp4', bytes = Buffer.from('video')): string {
25
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'opencli-instagram-post-video-'));
26
- tempDirs.push(dir);
27
- const filePath = path.join(dir, name);
28
- fs.writeFileSync(filePath, bytes);
29
- return filePath;
30
- }
31
-
32
- function withInitialDialogDismiss(results: unknown[]): unknown[] {
33
- return [{ ok: false }, ...results];
34
- }
35
-
36
- function createPageMock(evaluateResults: unknown[], overrides: Partial<IPage> = {}): IPage {
37
- const evaluate = vi.fn();
38
- for (const result of evaluateResults) {
39
- evaluate.mockResolvedValueOnce(result);
40
- }
41
-
42
- return {
43
- goto: vi.fn().mockResolvedValue(undefined),
44
- evaluate,
45
- getCookies: vi.fn().mockResolvedValue([]),
46
- snapshot: vi.fn().mockResolvedValue(undefined),
47
- click: vi.fn().mockResolvedValue(undefined),
48
- typeText: vi.fn().mockResolvedValue(undefined),
49
- pressKey: vi.fn().mockResolvedValue(undefined),
50
- scrollTo: vi.fn().mockResolvedValue(undefined),
51
- getFormState: vi.fn().mockResolvedValue({ forms: [], orphanFields: [] }),
52
- wait: vi.fn().mockResolvedValue(undefined),
53
- tabs: vi.fn().mockResolvedValue([]),
54
- closeTab: vi.fn().mockResolvedValue(undefined),
55
- newTab: vi.fn().mockResolvedValue(undefined),
56
- selectTab: vi.fn().mockResolvedValue(undefined),
57
- networkRequests: vi.fn().mockResolvedValue([]),
58
- consoleMessages: vi.fn().mockResolvedValue([]),
59
- scroll: vi.fn().mockResolvedValue(undefined),
60
- autoScroll: vi.fn().mockResolvedValue(undefined),
61
- installInterceptor: vi.fn().mockResolvedValue(undefined),
62
- getInterceptedRequests: vi.fn().mockResolvedValue([]),
63
- waitForCapture: vi.fn().mockResolvedValue(undefined),
64
- screenshot: vi.fn().mockResolvedValue(''),
65
- setFileInput: vi.fn().mockResolvedValue(undefined),
66
- insertText: undefined,
67
- getCurrentUrl: vi.fn().mockResolvedValue(null),
68
- ...overrides,
69
- };
70
- }
71
-
72
- afterAll(() => {
73
- for (const dir of tempDirs) {
74
- fs.rmSync(dir, { recursive: true, force: true });
75
- }
76
- delete process.env.OPENCLI_INSTAGRAM_CAPTURE;
77
- });
78
-
79
- describe('instagram auth detection', () => {
80
- it('does not treat generic homepage text containing "log in" as an auth failure', () => {
81
- const globalState = globalThis as typeof globalThis & {
82
- document?: unknown;
83
- window?: unknown;
84
- };
85
-
86
- const originalDocument = globalState.document;
87
- const originalWindow = globalState.window;
88
-
89
- globalState.document = {
90
- body: { innerText: 'Suggested for you Log in to see more content' },
91
- querySelector: () => null,
92
- querySelectorAll: () => [],
93
- } as unknown as Document;
94
- globalState.window = { location: { pathname: '/' } } as unknown as Window & typeof globalThis;
95
-
96
- try {
97
- expect(eval(buildEnsureComposerOpenJs()) as { ok: boolean; reason?: string }).toEqual({ ok: true });
98
- } finally {
99
- globalState.document = originalDocument;
100
- globalState.window = originalWindow;
101
- }
102
- });
103
- });
104
-
105
- describe('instagram publish status detection', () => {
106
- it('does not treat unrelated page text as share failure while the sharing dialog is still visible', () => {
107
- const globalState = globalThis as typeof globalThis & {
108
- document?: unknown;
109
- window?: unknown;
110
- HTMLElement?: unknown;
111
- };
112
-
113
- class MockHTMLElement {}
114
-
115
- const visibleDialog = new MockHTMLElement() as MockHTMLElement & {
116
- textContent: string;
117
- querySelector: () => null;
118
- getBoundingClientRect: () => { width: number; height: number };
119
- };
120
- visibleDialog.textContent = 'Sharing';
121
- visibleDialog.querySelector = () => null;
122
- visibleDialog.getBoundingClientRect = () => ({ width: 100, height: 100 });
123
-
124
- const originalDocument = globalState.document;
125
- const originalWindow = globalState.window;
126
- const originalHTMLElement = globalState.HTMLElement;
127
-
128
- globalState.HTMLElement = MockHTMLElement as unknown as typeof HTMLElement;
129
- globalState.document = {
130
- querySelectorAll: (selector: string) => selector === '[role="dialog"]' ? [visibleDialog] : [],
131
- } as unknown as Document;
132
- globalState.window = {
133
- location: { href: 'https://www.instagram.com/' },
134
- getComputedStyle: () => ({ display: 'block', visibility: 'visible' }),
135
- } as unknown as Window & typeof globalThis;
136
-
137
- try {
138
- expect(eval(buildPublishStatusProbeJs()) as { failed?: boolean; settled?: boolean; ok?: boolean }).toEqual({
139
- ok: false,
140
- failed: false,
141
- settled: false,
142
- url: '',
143
- });
144
- } finally {
145
- globalState.document = originalDocument;
146
- globalState.window = originalWindow;
147
- globalState.HTMLElement = originalHTMLElement;
148
- }
149
- });
150
-
151
- it('does not treat a stale visible error dialog as share failure while sharing is still in progress', () => {
152
- const globalState = globalThis as typeof globalThis & {
153
- document?: unknown;
154
- window?: unknown;
155
- HTMLElement?: unknown;
156
- };
157
-
158
- class MockHTMLElement {}
159
-
160
- const sharingDialog = new MockHTMLElement() as MockHTMLElement & {
161
- textContent: string;
162
- querySelector: () => null;
163
- getBoundingClientRect: () => { width: number; height: number };
164
- };
165
- sharingDialog.textContent = 'Sharing';
166
- sharingDialog.querySelector = () => null;
167
- sharingDialog.getBoundingClientRect = () => ({ width: 100, height: 100 });
168
-
169
- const staleErrorDialog = new MockHTMLElement() as MockHTMLElement & {
170
- textContent: string;
171
- querySelector: () => null;
172
- getBoundingClientRect: () => { width: number; height: number };
173
- };
174
- staleErrorDialog.textContent = 'Something went wrong. Please try again. Try again';
175
- staleErrorDialog.querySelector = () => null;
176
- staleErrorDialog.getBoundingClientRect = () => ({ width: 100, height: 100 });
177
-
178
- const originalDocument = globalState.document;
179
- const originalWindow = globalState.window;
180
- const originalHTMLElement = globalState.HTMLElement;
181
-
182
- globalState.HTMLElement = MockHTMLElement as unknown as typeof HTMLElement;
183
- globalState.document = {
184
- querySelectorAll: (selector: string) => selector === '[role="dialog"]' ? [sharingDialog, staleErrorDialog] : [],
185
- } as unknown as Document;
186
- globalState.window = {
187
- location: { href: 'https://www.instagram.com/' },
188
- getComputedStyle: () => ({ display: 'block', visibility: 'visible' }),
189
- } as unknown as Window & typeof globalThis;
190
-
191
- try {
192
- expect(eval(buildPublishStatusProbeJs()) as { failed?: boolean; settled?: boolean; ok?: boolean }).toEqual({
193
- ok: false,
194
- failed: false,
195
- settled: false,
196
- url: '',
197
- });
198
- } finally {
199
- globalState.document = originalDocument;
200
- globalState.window = originalWindow;
201
- globalState.HTMLElement = originalHTMLElement;
202
- }
203
- });
204
-
205
- it('prefers explicit post-shared success over stale visible error text', () => {
206
- const globalState = globalThis as typeof globalThis & {
207
- document?: unknown;
208
- window?: unknown;
209
- HTMLElement?: unknown;
210
- };
211
-
212
- class MockHTMLElement {}
213
-
214
- const sharedDialog = new MockHTMLElement() as MockHTMLElement & {
215
- textContent: string;
216
- querySelector: () => null;
217
- getBoundingClientRect: () => { width: number; height: number };
218
- };
219
- sharedDialog.textContent = 'Post shared Your post has been shared.';
220
- sharedDialog.querySelector = () => null;
221
- sharedDialog.getBoundingClientRect = () => ({ width: 100, height: 100 });
222
-
223
- const staleErrorDialog = new MockHTMLElement() as MockHTMLElement & {
224
- textContent: string;
225
- querySelector: () => null;
226
- getBoundingClientRect: () => { width: number; height: number };
227
- };
228
- staleErrorDialog.textContent = 'Something went wrong. Please try again. Try again';
229
- staleErrorDialog.querySelector = () => null;
230
- staleErrorDialog.getBoundingClientRect = () => ({ width: 100, height: 100 });
231
-
232
- const originalDocument = globalState.document;
233
- const originalWindow = globalState.window;
234
- const originalHTMLElement = globalState.HTMLElement;
235
-
236
- globalState.HTMLElement = MockHTMLElement as unknown as typeof HTMLElement;
237
- globalState.document = {
238
- querySelectorAll: (selector: string) => selector === '[role="dialog"]' ? [sharedDialog, staleErrorDialog] : [],
239
- } as unknown as Document;
240
- globalState.window = {
241
- location: { href: 'https://www.instagram.com/' },
242
- getComputedStyle: () => ({ display: 'block', visibility: 'visible' }),
243
- } as unknown as Window & typeof globalThis;
244
-
245
- try {
246
- expect(eval(buildPublishStatusProbeJs()) as { failed?: boolean; settled?: boolean; ok?: boolean }).toEqual({
247
- ok: true,
248
- failed: false,
249
- settled: false,
250
- url: '',
251
- });
252
- } finally {
253
- globalState.document = originalDocument;
254
- globalState.window = originalWindow;
255
- globalState.HTMLElement = originalHTMLElement;
256
- }
257
- });
258
- });
259
-
260
- describe('instagram click action detection', () => {
261
- it('matches aria-label-only Next buttons in the media dialog', () => {
262
- const globalState = globalThis as typeof globalThis & {
263
- document?: unknown;
264
- window?: unknown;
265
- HTMLElement?: unknown;
266
- };
267
-
268
- class MockHTMLElement {
269
- textContent = '';
270
- ariaLabel = '';
271
- clicked = false;
272
- querySelectorAll = (_selector: string) => [] as unknown[];
273
- querySelector = (_selector: string) => null as unknown;
274
- getAttribute(name: string): string | null {
275
- if (name === 'aria-label') return this.ariaLabel || null;
276
- return null;
277
- }
278
- getBoundingClientRect() {
279
- return { width: 100, height: 40 };
280
- }
281
- click() {
282
- this.clicked = true;
283
- }
284
- }
285
-
286
- const nextButton = new MockHTMLElement();
287
- nextButton.ariaLabel = 'Next';
288
-
289
- const dialog = new MockHTMLElement();
290
- dialog.textContent = 'Crop Back Select crop Open media gallery';
291
- dialog.querySelector = (selector: string) => selector === 'input[type="file"]' ? {} as Element : null;
292
- dialog.querySelectorAll = (selector: string) => selector === 'button, div[role="button"]' ? [nextButton] : [];
293
-
294
- const body = new MockHTMLElement();
295
-
296
- const originalDocument = globalState.document;
297
- const originalWindow = globalState.window;
298
- const originalHTMLElement = globalState.HTMLElement;
299
-
300
- globalState.HTMLElement = MockHTMLElement as unknown as typeof HTMLElement;
301
- globalState.document = {
302
- body,
303
- querySelectorAll: (selector: string) => selector === '[role="dialog"]' ? [dialog] : [],
304
- } as unknown as Document;
305
- globalState.window = {
306
- getComputedStyle: () => ({ display: 'block', visibility: 'visible' }),
307
- } as unknown as Window & typeof globalThis;
308
-
309
- try {
310
- expect(eval(buildClickActionJs(['Next', '下一步'], 'media')) as { ok: boolean; label?: string }).toEqual({
311
- ok: true,
312
- label: 'Next',
313
- });
314
- expect(nextButton.clicked).toBe(true);
315
- } finally {
316
- globalState.document = originalDocument;
317
- globalState.window = originalWindow;
318
- globalState.HTMLElement = originalHTMLElement;
319
- }
320
- });
321
-
322
- it('does not click a body-level Next button when media scope has no matching dialog controls', () => {
323
- const globalState = globalThis as typeof globalThis & {
324
- document?: unknown;
325
- window?: unknown;
326
- HTMLElement?: unknown;
327
- };
328
-
329
- class MockHTMLElement {
330
- textContent = '';
331
- ariaLabel = '';
332
- clicked = false;
333
- children: unknown[] = [];
334
- querySelectorAll = (_selector: string) => this.children;
335
- querySelector = (_selector: string) => null as unknown;
336
- getAttribute(name: string): string | null {
337
- if (name === 'aria-label') return this.ariaLabel || null;
338
- return null;
339
- }
340
- getBoundingClientRect() {
341
- return { width: 100, height: 40 };
342
- }
343
- click() {
344
- this.clicked = true;
345
- }
346
- }
347
-
348
- const bodyNext = new MockHTMLElement();
349
- bodyNext.ariaLabel = 'Next';
350
-
351
- const errorDialog = new MockHTMLElement();
352
- errorDialog.textContent = 'Something went wrong Try again';
353
- errorDialog.children = [];
354
-
355
- const body = new MockHTMLElement();
356
- body.children = [bodyNext];
357
-
358
- const originalDocument = globalState.document;
359
- const originalWindow = globalState.window;
360
- const originalHTMLElement = globalState.HTMLElement;
361
-
362
- globalState.HTMLElement = MockHTMLElement as unknown as typeof HTMLElement;
363
- globalState.document = {
364
- body,
365
- querySelectorAll: (selector: string) => selector === '[role="dialog"]' ? [errorDialog] : [],
366
- } as unknown as Document;
367
- globalState.window = {
368
- getComputedStyle: () => ({ display: 'block', visibility: 'visible' }),
369
- } as unknown as Window & typeof globalThis;
370
-
371
- try {
372
- expect(eval(buildClickActionJs(['Next', '下一步'], 'media')) as { ok: boolean }).toEqual({ ok: false });
373
- expect(bodyNext.clicked).toBe(false);
374
- } finally {
375
- globalState.document = originalDocument;
376
- globalState.window = originalWindow;
377
- globalState.HTMLElement = originalHTMLElement;
378
- }
379
- });
380
- });
381
-
382
- describe('instagram upload stage detection', () => {
383
- it('does not treat a body-level Next button as upload preview when the visible dialog is an error', () => {
384
- const globalState = globalThis as typeof globalThis & {
385
- document?: unknown;
386
- window?: unknown;
387
- HTMLElement?: unknown;
388
- };
389
-
390
- class MockHTMLElement {
391
- textContent = '';
392
- ariaLabel = '';
393
- children: unknown[] = [];
394
- querySelectorAll = (_selector: string) => this.children;
395
- querySelector = (_selector: string) => null as unknown;
396
- getAttribute(name: string): string | null {
397
- if (name === 'aria-label') return this.ariaLabel || null;
398
- return null;
399
- }
400
- getBoundingClientRect() {
401
- return { width: 100, height: 40 };
402
- }
403
- }
404
-
405
- const bodyNext = new MockHTMLElement();
406
- bodyNext.ariaLabel = 'Next';
407
-
408
- const errorDialog = new MockHTMLElement();
409
- errorDialog.textContent = 'Something went wrong. Please try again. Try again';
410
-
411
- const body = new MockHTMLElement();
412
- body.children = [bodyNext];
413
-
414
- const originalDocument = globalState.document;
415
- const originalWindow = globalState.window;
416
- const originalHTMLElement = globalState.HTMLElement;
417
-
418
- globalState.HTMLElement = MockHTMLElement as unknown as typeof HTMLElement;
419
- globalState.document = {
420
- body,
421
- querySelectorAll: (selector: string) => {
422
- if (selector === '[role="dialog"]') return [errorDialog];
423
- return [];
424
- },
425
- } as unknown as Document;
426
- globalState.window = {
427
- getComputedStyle: () => ({ display: 'block', visibility: 'visible' }),
428
- } as unknown as Window & typeof globalThis;
429
-
430
- try {
431
- expect(eval(buildInspectUploadStageJs()) as { state: string; detail: string }).toEqual({
432
- state: 'failed',
433
- detail: 'Something went wrong. Please try again. Try again',
434
- });
435
- } finally {
436
- globalState.document = originalDocument;
437
- globalState.window = originalWindow;
438
- globalState.HTMLElement = originalHTMLElement;
439
- }
440
- });
441
- });
442
-
443
- describe('instagram post registration', () => {
444
- beforeEach(() => {
445
- vi.spyOn(privatePublish, 'resolveInstagramPrivatePublishConfig').mockResolvedValue({
446
- apiContext: {
447
- asbdId: '',
448
- csrfToken: 'csrf-token',
449
- igAppId: '936619743392459',
450
- igWwwClaim: '',
451
- instagramAjax: '1036523242',
452
- webSessionId: '',
453
- },
454
- jazoest: '22047',
455
- });
456
- vi.spyOn(privatePublish, 'publishImagesViaPrivateApi').mockRejectedValue(
457
- new CommandExecutionError('Instagram private publish configure failed: 400 {"message":"fallback to ui"}'),
458
- );
459
- });
460
-
461
- afterEach(() => {
462
- vi.restoreAllMocks();
463
- });
464
-
465
- it('registers the post command with a required-value media arg', () => {
466
- const cmd = getRegistry().get('instagram/post');
467
- expect(cmd).toBeDefined();
468
- expect(cmd?.browser).toBe(true);
469
- expect(cmd?.timeoutSeconds).toBe(300);
470
- expect(cmd?.args.some((arg) => arg.name === 'media' && !arg.required && arg.valueRequired)).toBe(true);
471
- expect(cmd?.args.some((arg) => arg.name === 'content' && !arg.required && arg.positional)).toBe(true);
472
- });
473
-
474
- it('prefers the private route by default and returns without touching UI upload steps when private publish succeeds', async () => {
475
- const imagePath = createTempImage('private-default.jpg');
476
- const privateSpy = vi.spyOn(privatePublish, 'publishImagesViaPrivateApi').mockResolvedValueOnce({
477
- code: 'PRIVATEDEFAULT123',
478
- uploadIds: ['111'],
479
- });
480
- const evaluate = vi.fn(async (js: string) => {
481
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
482
- if (js.includes('window.location?.pathname')) return { ok: true };
483
- if (js.includes('const data = Array.isArray(window[') && js.includes('__opencli_ig_protocol_capture')) return { data: [], errors: [] };
484
- return { ok: true };
485
- });
486
- const page = createPageMock([], {
487
- evaluate,
488
- getCookies: vi.fn().mockResolvedValue([{ name: 'csrftoken', value: 'csrf-token', domain: 'instagram.com' }]),
489
- });
490
- const cmd = getRegistry().get('instagram/post');
491
-
492
- const result = await cmd!.func!(page, { media: imagePath, content: 'private default' });
493
-
494
- expect(privateSpy).toHaveBeenCalledTimes(1);
495
- expect(page.setFileInput).not.toHaveBeenCalled();
496
- expect(result).toEqual([
497
- {
498
- status: '✅ Posted',
499
- detail: 'Single image post shared successfully',
500
- url: 'https://www.instagram.com/p/PRIVATEDEFAULT123/',
501
- },
502
- ]);
503
- privateSpy.mockRestore();
504
- });
505
-
506
- it('falls back to the UI route when the default private route fails safely before publishing', async () => {
507
- const imagePath = createTempImage('private-fallback-ui.jpg');
508
- const privateSpy = vi.spyOn(privatePublish, 'publishImagesViaPrivateApi').mockRejectedValueOnce(
509
- new CommandExecutionError('Instagram private publish configure_sidecar failed: 400 {"message":"Uploaded image is invalid"}'),
510
- );
511
- const evaluate = vi.fn(async (js: string) => {
512
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
513
- if (js.includes('window.location?.pathname')) return { ok: true };
514
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
515
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
516
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
517
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
518
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
519
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/PRIVATEFALLBACK123/' };
520
- return { ok: true };
521
- });
522
- const page = createPageMock([], {
523
- evaluate,
524
- getCookies: vi.fn().mockResolvedValue([{ name: 'csrftoken', value: 'csrf-token', domain: 'instagram.com' }]),
525
- });
526
- const cmd = getRegistry().get('instagram/post');
527
-
528
- const result = await cmd!.func!(page, { media: imagePath, content: 'private fallback' });
529
-
530
- expect(privateSpy).toHaveBeenCalledTimes(1);
531
- expect(page.setFileInput).toHaveBeenCalledWith([imagePath], '[data-opencli-ig-upload-index="0"]');
532
- expect(result).toEqual([
533
- {
534
- status: '✅ Posted',
535
- detail: 'Single image post shared successfully',
536
- url: 'https://www.instagram.com/p/PRIVATEFALLBACK123/',
537
- },
538
- ]);
539
- privateSpy.mockRestore();
540
- });
541
-
542
- it('falls back to the UI route for mixed-media posts when the private route fails safely before publishing', async () => {
543
- const imagePath = createTempImage('mixed-fallback-image.jpg');
544
- const videoPath = createTempVideo('mixed-fallback-video.mp4');
545
- const privateSpy = vi.spyOn(privatePublish, 'publishMediaViaPrivateApi').mockRejectedValueOnce(
546
- new CommandExecutionError('Instagram private publish configure_sidecar failed: 400 {"message":"fallback to ui"}'),
547
- );
548
- const evaluate = vi.fn(async (js: string) => {
549
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
550
- if (js.includes('window.location?.pathname')) return { ok: true };
551
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
552
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
553
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
554
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
555
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
556
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/MIXEDFALLBACK123/' };
557
- return { ok: true };
558
- });
559
- const page = createPageMock([], {
560
- evaluate,
561
- getCookies: vi.fn().mockResolvedValue([{ name: 'csrftoken', value: 'csrf-token', domain: 'instagram.com' }]),
562
- });
563
- const cmd = getRegistry().get('instagram/post');
564
-
565
- const result = await cmd!.func!(page, {
566
- media: `${imagePath},${videoPath}`,
567
- content: 'mixed ui fallback',
568
- });
569
-
570
- expect(privateSpy).toHaveBeenCalledTimes(1);
571
- expect(page.setFileInput).toHaveBeenCalledWith([imagePath, videoPath], '[data-opencli-ig-upload-index="0"]');
572
- expect(result).toEqual([
573
- {
574
- status: '✅ Posted',
575
- detail: '2-item mixed-media carousel post shared successfully',
576
- url: 'https://www.instagram.com/p/MIXEDFALLBACK123/',
577
- },
578
- ]);
579
- privateSpy.mockRestore();
580
- });
581
-
582
- it('prefers the private route by default for mixed-media posts and preserves input order', async () => {
583
- const imagePath = createTempImage('mixed-default.jpg');
584
- const videoPath = createTempVideo('mixed-default.mp4');
585
- const privateSpy = vi.spyOn(privatePublish, 'publishMediaViaPrivateApi').mockResolvedValueOnce({
586
- code: 'MIXEDPRIVATE123',
587
- uploadIds: ['111', '222'],
588
- });
589
- const page = createPageMock([], {
590
- evaluate: vi.fn(async () => ({ ok: true })),
591
- getCookies: vi.fn().mockResolvedValue([{ name: 'csrftoken', value: 'csrf-token', domain: 'instagram.com' }]),
592
- });
593
- const cmd = getRegistry().get('instagram/post');
594
-
595
- const result = await cmd!.func!(page, {
596
- media: `${imagePath},${videoPath}`,
597
- content: 'mixed private default',
598
- });
599
-
600
- expect(privateSpy).toHaveBeenCalledWith(expect.objectContaining({
601
- mediaItems: [
602
- { type: 'image', filePath: imagePath },
603
- { type: 'video', filePath: videoPath },
604
- ],
605
- caption: 'mixed private default',
606
- }));
607
- expect(page.setFileInput).not.toHaveBeenCalled();
608
- expect(result).toEqual([
609
- {
610
- status: '✅ Posted',
611
- detail: '2-item mixed-media carousel post shared successfully',
612
- url: 'https://www.instagram.com/p/MIXEDPRIVATE123/',
613
- },
614
- ]);
615
- privateSpy.mockRestore();
616
- });
617
-
618
- it('rejects missing --media before browser work', async () => {
619
- const page = createPageMock([]);
620
- const cmd = getRegistry().get('instagram/post');
621
-
622
- await expect(cmd!.func!(page, {
623
- content: 'missing media',
624
- })).rejects.toThrow('Argument "media" is required.');
625
- });
626
-
627
- it('rejects empty or invalid --media inputs', async () => {
628
- const imagePath = createTempImage('invalid-media-image.jpg');
629
- const page = createPageMock([]);
630
- const cmd = getRegistry().get('instagram/post');
631
-
632
- await expect(cmd!.func!(page, {
633
- media: '',
634
- })).rejects.toThrow('Argument "media" is required.');
635
-
636
- await expect(cmd!.func!(page, {
637
- media: `${imagePath},/tmp/does-not-exist.mp4`,
638
- })).rejects.toThrow('Media file not found');
639
- });
640
-
641
- it('uploads a single image, fills caption, and shares the post', async () => {
642
- const imagePath = createTempImage();
643
- const page = createPageMock(withInitialDialogDismiss([
644
- { ok: true },
645
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
646
- { ok: true },
647
- { ok: true },
648
- { ok: false },
649
- { ok: true, label: 'Next' },
650
- { ok: true },
651
- { ok: true },
652
- { ok: true },
653
- { ok: true, label: 'Share' },
654
- { ok: true, url: 'https://www.instagram.com/p/ABC123xyz/' },
655
- ]));
656
-
657
- const cmd = getRegistry().get('instagram/post');
658
- const result = await cmd!.func!(page, {
659
- media: imagePath,
660
- content: 'hello from opencli',
661
- });
662
-
663
- expect(page.goto).toHaveBeenCalledWith('https://www.instagram.com/');
664
- expect(page.setFileInput).toHaveBeenCalledWith([imagePath], '[data-opencli-ig-upload-index="0"]');
665
- expect((page.evaluate as any).mock.calls.some((args: any[]) => String(args[0]).includes("dispatchEvent(new Event('change'"))).toBe(true);
666
- expect(result).toEqual([
667
- {
668
- status: '✅ Posted',
669
- detail: 'Single image post shared successfully',
670
- url: 'https://www.instagram.com/p/ABC123xyz/',
671
- },
672
- ]);
673
- });
674
-
675
- it('uploads multiple images as a carousel and shares the post', async () => {
676
- const firstImagePath = createTempImage('carousel-1.jpg');
677
- const secondImagePath = createTempImage('carousel-2.jpg');
678
- const page = createPageMock(withInitialDialogDismiss([
679
- { ok: true },
680
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
681
- { ok: true },
682
- { ok: true },
683
- { ok: false },
684
- { ok: true, label: 'Next' },
685
- { ok: true },
686
- { ok: true },
687
- { ok: true },
688
- { ok: true, label: 'Share' },
689
- { ok: true, url: 'https://www.instagram.com/p/CAROUSEL123/' },
690
- ]));
691
-
692
- const cmd = getRegistry().get('instagram/post');
693
- const result = await cmd!.func!(page, {
694
- media: `${firstImagePath},${secondImagePath}`,
695
- content: 'hello carousel',
696
- });
697
-
698
- expect(page.setFileInput).toHaveBeenCalledWith(
699
- [firstImagePath, secondImagePath],
700
- '[data-opencli-ig-upload-index="0"]',
701
- );
702
- expect(result).toEqual([
703
- {
704
- status: '✅ Posted',
705
- detail: '2-image carousel post shared successfully',
706
- url: 'https://www.instagram.com/p/CAROUSEL123/',
707
- },
708
- ]);
709
- });
710
-
711
- it('installs and dumps protocol capture when OPENCLI_INSTAGRAM_CAPTURE is enabled', async () => {
712
- process.env.OPENCLI_INSTAGRAM_CAPTURE = '1';
713
- const imagePath = createTempImage('capture-enabled.jpg');
714
- const evaluate = vi.fn(async (js: string) => {
715
- if (js.includes('__opencli_ig_protocol_capture') && js.includes('PATCH_GUARD')) return { ok: true };
716
- if (js.includes('const data = Array.isArray(window[') && js.includes('__opencli_ig_protocol_capture')) {
717
- return { data: [], errors: [] };
718
- }
719
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
720
- if (js.includes('window.location?.pathname')) return { ok: true };
721
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
722
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
723
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
724
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
725
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
726
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/CAPTURE123/' };
727
- return { ok: true };
728
- });
729
- const page = createPageMock([], { evaluate });
730
- const cmd = getRegistry().get('instagram/post');
731
-
732
- const result = await cmd!.func!(page, {
733
- media: imagePath,
734
- content: 'capture enabled',
735
- });
736
-
737
- const evaluateCalls = evaluate.mock.calls.map((args) => String(args[0]));
738
- expect(evaluateCalls.some((js) => js.includes('__opencli_ig_protocol_capture') && js.includes('PATCH_GUARD'))).toBe(true);
739
- expect(evaluateCalls.some((js) => js.includes('const data = Array.isArray(window[') && js.includes('__opencli_ig_protocol_capture'))).toBe(true);
740
- expect(result).toEqual([
741
- {
742
- status: '✅ Posted',
743
- detail: 'Single image post shared successfully',
744
- url: 'https://www.instagram.com/p/CAPTURE123/',
745
- },
746
- ]);
747
-
748
- delete process.env.OPENCLI_INSTAGRAM_CAPTURE;
749
- });
750
-
751
- it('retries media Next when preview is visible before the button becomes clickable', async () => {
752
- const firstImagePath = createTempImage('carousel-delay-1.jpg');
753
- const secondImagePath = createTempImage('carousel-delay-2.jpg');
754
- let nextAttempts = 0;
755
- const evaluate = vi.fn(async (js: string) => {
756
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
757
- if (js.includes('window.location?.pathname')) return { ok: true };
758
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
759
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
760
- if (js.includes('const hasVisibleButtonInDialogs')) return { state: 'preview', detail: 'Crop Back Next Select crop' };
761
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
762
- return { ok: nextAttempts >= 2 };
763
- }
764
- if (js.includes("!labels.includes(text) && !labels.includes(aria)")) {
765
- nextAttempts += 1;
766
- if (nextAttempts === 1) return { ok: false };
767
- return { ok: true, label: 'Next' };
768
- }
769
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
770
- if (js.includes('readLexicalText')) return { ok: true };
771
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/CAROUSELRETRY123/' };
772
- return { ok: true };
773
- });
774
- const page = createPageMock([], { evaluate });
775
-
776
- const cmd = getRegistry().get('instagram/post');
777
- const result = await cmd!.func!(page, {
778
- media: `${firstImagePath},${secondImagePath}`,
779
- content: 'hello delayed carousel',
780
- });
781
-
782
- expect(result).toEqual([
783
- {
784
- status: '✅ Posted',
785
- detail: '2-image carousel post shared successfully',
786
- url: 'https://www.instagram.com/p/CAROUSELRETRY123/',
787
- },
788
- ]);
789
- });
790
-
791
- it('retries the whole carousel flow when preview briefly appears and then degrades into an upload error before Next is usable', async () => {
792
- const firstImagePath = createTempImage('carousel-race-1.jpg');
793
- const secondImagePath = createTempImage('carousel-race-2.jpg');
794
- let composerRuns = 0;
795
- let uploadStageChecks = 0;
796
- let secondAttemptAdvanced = false;
797
- const evaluate = vi.fn(async (js: string) => {
798
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
799
- if (js.includes('window.location?.pathname')) {
800
- composerRuns += 1;
801
- return { ok: true };
802
- }
803
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
804
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
805
- if (js.includes('const hasVisibleButtonInDialogs')) {
806
- uploadStageChecks += 1;
807
- if (composerRuns === 1 && uploadStageChecks === 1) {
808
- return { state: 'preview', detail: 'Crop Back Next Select crop' };
809
- }
810
- if (composerRuns === 1) {
811
- return { state: 'failed', detail: 'Something went wrong. Please try again.' };
812
- }
813
- return { state: 'preview', detail: 'Crop Back Next Select crop' };
814
- }
815
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
816
- return { ok: composerRuns >= 2 && secondAttemptAdvanced };
817
- }
818
- if (js.includes("!labels.includes(text) && !labels.includes(aria)")) {
819
- if (composerRuns === 1) return { ok: false };
820
- secondAttemptAdvanced = true;
821
- return { ok: true, label: 'Next' };
822
- }
823
- if (js.includes('button[aria-label="Close"]')) return { ok: true };
824
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
825
- if (js.includes('readLexicalText')) return { ok: true };
826
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/CAROUSELFRESH123/' };
827
- return { ok: true };
828
- });
829
- const page = createPageMock([], { evaluate });
830
-
831
- const cmd = getRegistry().get('instagram/post');
832
- const result = await cmd!.func!(page, {
833
- media: `${firstImagePath},${secondImagePath}`,
834
- content: 'hello recovered carousel',
835
- });
836
-
837
- expect(result).toEqual([
838
- {
839
- status: '✅ Posted',
840
- detail: '2-image carousel post shared successfully',
841
- url: 'https://www.instagram.com/p/CAROUSELFRESH123/',
842
- },
843
- ]);
844
- });
845
-
846
- it('uploads a single image and shares it without a caption when content is omitted', async () => {
847
- const imagePath = createTempImage('no-caption.jpg');
848
- const evaluate = vi.fn(async (js: string) => {
849
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
850
- if (js.includes('window.location?.pathname')) return { ok: true };
851
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
852
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
853
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
854
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
855
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
856
- if (js.includes('const editable = document.querySelector(\'textarea, [contenteditable="true"]\');')) return { ok: true };
857
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/NOCAPTION123/' };
858
- return { ok: false };
859
- });
860
- const page = createPageMock([], { evaluate });
861
-
862
- const cmd = getRegistry().get('instagram/post');
863
- const result = await cmd!.func!(page, {
864
- media: imagePath,
865
- });
866
-
867
- const evaluateCalls = (page.evaluate as any).mock.calls.map((args: any[]) => String(args[0]));
868
- expect(evaluateCalls.some((js: string) => js.includes('Write a caption'))).toBe(false);
869
- expect(result).toEqual([
870
- {
871
- status: '✅ Posted',
872
- detail: 'Single image post shared successfully',
873
- url: 'https://www.instagram.com/p/NOCAPTION123/',
874
- },
875
- ]);
876
- });
877
-
878
- it('falls back to browser-side file injection when the extension does not support set-file-input', async () => {
879
- const imagePath = createTempImage('legacy-extension.jpg');
880
- const evaluate = vi.fn(async (js: string) => {
881
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
882
- if (js.includes('window.location?.pathname')) return { ok: true };
883
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
884
- if (js.includes('__opencliInstagramUpload_') && js.includes('] = [];')) return { ok: true };
885
- if (js.includes('parts.push(chunk)')) return { ok: true, count: 1 };
886
- if (js.includes('File input not found for fallback injection')) return { ok: true, count: 1 };
887
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
888
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
889
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
890
- if (js.includes('labels.includes(text)')) return { ok: false };
891
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
892
- if (js.includes('readLexicalText')) return { ok: true };
893
- if (js.includes('couldn') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/LEGACY123/' };
894
- return { ok: true };
895
- });
896
- const page = createPageMock([], {
897
- evaluate,
898
- setFileInput: vi.fn().mockRejectedValue(new Error('Unknown action: set-file-input')),
899
- });
900
-
901
- const cmd = getRegistry().get('instagram/post');
902
- const result = await cmd!.func!(page, {
903
- media: imagePath,
904
- content: 'legacy bridge fallback',
905
- });
906
-
907
- expect(page.setFileInput).toHaveBeenCalledWith([imagePath], '[data-opencli-ig-upload-index="0"]');
908
- expect(result).toEqual([
909
- {
910
- status: '✅ Posted',
911
- detail: 'Single image post shared successfully',
912
- url: 'https://www.instagram.com/p/LEGACY123/',
913
- },
914
- ]);
915
- });
916
-
917
- it('chunks large legacy fallback uploads instead of embedding the whole image in one evaluate payload', async () => {
918
- const imagePath = createTempImage('legacy-large.jpg', Buffer.alloc(900 * 1024, 1));
919
- const evaluate = vi.fn(async (js: string) => {
920
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
921
- if (js.includes('window.location?.pathname')) return { ok: true };
922
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
923
- if (js.includes('window[') && js.includes('] = [];')) return { ok: true };
924
- if (js.includes('parts.push(chunk)')) return { ok: true, count: 1 };
925
- if (js.includes('File input not found for fallback injection')) return { ok: true, count: 1 };
926
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
927
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
928
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
929
- if (js.includes('labels.includes(text)')) return { ok: false };
930
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
931
- if (js.includes('readLexicalText')) return { ok: true };
932
- if (js.includes('couldn') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/LARGELEGACY123/' };
933
- return { ok: true };
934
- });
935
- const page = createPageMock([], {
936
- evaluate,
937
- setFileInput: vi.fn().mockRejectedValue(new Error('Unknown action: set-file-input')),
938
- });
939
-
940
- const cmd = getRegistry().get('instagram/post');
941
- const result = await cmd!.func!(page, {
942
- media: imagePath,
943
- content: 'legacy large bridge fallback',
944
- });
945
-
946
- const chunkCalls = evaluate.mock.calls.filter((args) => String(args[0]).includes('parts.push(chunk)'));
947
- expect(chunkCalls.length).toBeGreaterThan(1);
948
- expect(result).toEqual([
949
- {
950
- status: '✅ Posted',
951
- detail: 'Single image post shared successfully',
952
- url: 'https://www.instagram.com/p/LARGELEGACY123/',
953
- },
954
- ]);
955
- });
956
-
957
- it('fails clearly when Browser Bridge file upload support is unavailable', async () => {
958
- const imagePath = createTempImage('missing-bridge.jpg');
959
- const page = createPageMock([], { setFileInput: undefined });
960
- const cmd = getRegistry().get('instagram/post');
961
-
962
- await expect(cmd!.func!(page, {
963
- media: imagePath,
964
- content: 'hello from opencli',
965
- })).rejects.toThrow(CommandExecutionError);
966
- });
967
-
968
- it('maps login-gated composer access to AuthRequiredError', async () => {
969
- const imagePath = createTempImage('auth.jpg');
970
- const page = createPageMock(withInitialDialogDismiss([
971
- { ok: false, reason: 'auth' },
972
- ]));
973
- const cmd = getRegistry().get('instagram/post');
974
-
975
- await expect(cmd!.func!(page, {
976
- media: imagePath,
977
- content: 'login required',
978
- })).rejects.toThrow(AuthRequiredError);
979
- });
980
-
981
- it('captures a debug screenshot when the upload preview never appears', async () => {
982
- const imagePath = createTempImage('no-preview.jpg');
983
- const page = createPageMock(withInitialDialogDismiss([
984
- { ok: true },
985
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
986
- { ok: true },
987
- { ok: false },
988
- { ok: false },
989
- { ok: false },
990
- { ok: false },
991
- { ok: false },
992
- { ok: false },
993
- { ok: false },
994
- { ok: false },
995
- { ok: false },
996
- { ok: false },
997
- { ok: false },
998
- { ok: false },
999
- { ok: false },
1000
- ]));
1001
- const cmd = getRegistry().get('instagram/post');
1002
-
1003
- await expect(cmd!.func!(page, {
1004
- media: imagePath,
1005
- content: 'preview missing',
1006
- })).rejects.toThrow('Instagram image preview did not appear after upload');
1007
-
1008
- expect(page.screenshot).toHaveBeenCalledWith({ path: '/tmp/instagram_post_preview_debug.png' });
1009
- });
1010
-
1011
- it('fails clearly when Instagram shows an upload-stage error dialog', async () => {
1012
- const imagePath = createTempImage('upload-error.jpg');
1013
- const page = createPageMock(withInitialDialogDismiss([
1014
- { ok: true },
1015
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1016
- { ok: true },
1017
- { ok: false, state: 'failed', detail: 'Something went wrong. Please try again.' },
1018
- ]));
1019
- const cmd = getRegistry().get('instagram/post');
1020
-
1021
- await expect(cmd!.func!(page, {
1022
- media: imagePath,
1023
- content: 'upload should fail clearly',
1024
- })).rejects.toThrow('Instagram image upload failed');
1025
- });
1026
-
1027
- it('treats crop/next preview UI as success even if stale error text is still visible', async () => {
1028
- const imagePath = createTempImage('upload-preview-wins.jpg');
1029
- const page = createPageMock(withInitialDialogDismiss([
1030
- { ok: true },
1031
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1032
- { ok: true },
1033
- {
1034
- ok: false,
1035
- state: 'preview',
1036
- detail: 'Something went wrong. Please try again. Crop Back Next Select crop Select zoom Open media gallery',
1037
- },
1038
- { ok: false },
1039
- { ok: true, label: 'Next' },
1040
- { ok: true },
1041
- { ok: true },
1042
- { ok: true },
1043
- { ok: true, label: 'Share' },
1044
- { ok: true, url: 'https://www.instagram.com/p/PREVIEWWINS123/' },
1045
- ]));
1046
- const cmd = getRegistry().get('instagram/post');
1047
-
1048
- const result = await cmd!.func!(page, {
1049
- media: imagePath,
1050
- content: 'preview state wins over stale error text',
1051
- });
1052
-
1053
- expect(result).toEqual([
1054
- {
1055
- status: '✅ Posted',
1056
- detail: 'Single image post shared successfully',
1057
- url: 'https://www.instagram.com/p/PREVIEWWINS123/',
1058
- },
1059
- ]);
1060
- });
1061
-
1062
- it('retries the same upload selector once after an upload-stage error and can still succeed', async () => {
1063
- const imagePath = createTempImage('upload-retry.jpg');
1064
- const setFileInput = vi.fn().mockResolvedValue(undefined);
1065
- let uploadProbeCount = 0;
1066
- const evaluate = vi.fn(async (js: string) => {
1067
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
1068
- if (js.includes('window.location?.pathname')) return { ok: true };
1069
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1070
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1071
- if (js.includes('const failed =') && js.includes('const hasCaption =')) {
1072
- uploadProbeCount += 1;
1073
- return uploadProbeCount === 1
1074
- ? { ok: false, state: 'failed', detail: 'Something went wrong. Please try again.' }
1075
- : { ok: true, state: 'preview' };
1076
- }
1077
- if (js.includes('button[aria-label="Close"]')) return { ok: true };
1078
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
1079
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
1080
- if (js.includes('readLexicalText')) return { ok: true };
1081
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
1082
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/UPLOADRETRY123/' };
1083
- return { ok: true };
1084
- });
1085
- const page = createPageMock([], { setFileInput, evaluate });
1086
- const cmd = getRegistry().get('instagram/post');
1087
-
1088
- const result = await cmd!.func!(page, {
1089
- media: imagePath,
1090
- content: 'upload retry succeeds',
1091
- });
1092
-
1093
- expect(setFileInput).toHaveBeenCalledTimes(1);
1094
- expect(result).toEqual([
1095
- {
1096
- status: '✅ Posted',
1097
- detail: 'Single image post shared successfully',
1098
- url: 'https://www.instagram.com/p/UPLOADRETRY123/',
1099
- },
1100
- ]);
1101
- });
1102
-
1103
- it('clicks upload Try again in-place before resetting the whole flow when Instagram shows an upload error dialog', async () => {
1104
- const imagePath = createTempImage('upload-inline-retry.jpg');
1105
- let uploadProbeCount = 0;
1106
- const evaluate = vi.fn(async (js: string) => {
1107
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
1108
- if (js.includes('window.location?.pathname')) return { ok: true };
1109
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1110
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1111
- if (js.includes('const hasVisibleButtonInDialogs')) {
1112
- uploadProbeCount += 1;
1113
- return uploadProbeCount === 1
1114
- ? { state: 'failed', detail: 'Something went wrong. Please try again.' }
1115
- : { state: 'preview', detail: 'Crop Back Next Select crop' };
1116
- }
1117
- if (js.includes('something went wrong') && js.includes('label === \'try again\'')) return { ok: true };
1118
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
1119
- return { ok: true };
1120
- }
1121
- if (js.includes("!labels.includes(text) && !labels.includes(aria)")) {
1122
- if (js.includes('"Share"')) return { ok: true, label: 'Share' };
1123
- return { ok: true, label: 'Next' };
1124
- }
1125
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
1126
- if (js.includes('readLexicalText')) return { ok: true };
1127
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/UPLOADINLINERETRY123/' };
1128
- return { ok: true };
1129
- });
1130
- const page = createPageMock([], { evaluate });
1131
- const cmd = getRegistry().get('instagram/post');
1132
-
1133
- const result = await cmd!.func!(page, {
1134
- media: imagePath,
1135
- content: 'upload inline retry succeeds',
1136
- });
1137
-
1138
- expect(result).toEqual([
1139
- {
1140
- status: '✅ Posted',
1141
- detail: 'Single image post shared successfully',
1142
- url: 'https://www.instagram.com/p/UPLOADINLINERETRY123/',
1143
- },
1144
- ]);
1145
- });
1146
-
1147
- it('retries max-size carousel upload failures beyond the expanded large-carousel budget before succeeding', async () => {
1148
- const paths = [
1149
- createTempImage('carousel-10-1.jpg'),
1150
- createTempImage('carousel-10-2.jpg'),
1151
- createTempImage('carousel-10-3.jpg'),
1152
- createTempImage('carousel-10-4.jpg'),
1153
- createTempImage('carousel-10-5.jpg'),
1154
- createTempImage('carousel-10-6.jpg'),
1155
- createTempImage('carousel-10-7.jpg'),
1156
- createTempImage('carousel-10-8.jpg'),
1157
- createTempImage('carousel-10-9.jpg'),
1158
- createTempImage('carousel-10-10.jpg'),
1159
- ];
1160
- const setFileInput = vi.fn().mockResolvedValue(undefined);
1161
- let uploadProbeCount = 0;
1162
- const evaluate = vi.fn(async (js: string) => {
1163
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
1164
- if (js.includes('window.location?.pathname')) return { ok: true };
1165
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1166
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1167
- if (js.includes('const hasVisibleButtonInDialogs')) {
1168
- uploadProbeCount += 1;
1169
- if (uploadProbeCount <= 16) {
1170
- return { state: 'failed', detail: 'Something went wrong. Please try again.' };
1171
- }
1172
- return { state: 'preview', detail: 'Crop Back Next Select crop' };
1173
- }
1174
- if (js.includes('button[aria-label="Close"]')) return { ok: true };
1175
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
1176
- return { ok: true };
1177
- }
1178
- if (js.includes("!labels.includes(text) && !labels.includes(aria)")) {
1179
- if (js.includes('"Share"')) return { ok: true, label: 'Share' };
1180
- return { ok: true, label: 'Next' };
1181
- }
1182
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/CAROUSEL10RETRY123/' };
1183
- return { ok: true };
1184
- });
1185
- const page = createPageMock([], { setFileInput, evaluate });
1186
- const cmd = getRegistry().get('instagram/post');
1187
-
1188
- const result = await cmd!.func!(page, {
1189
- media: paths.join(','),
1190
- });
1191
-
1192
- expect(setFileInput).toHaveBeenCalledTimes(5);
1193
- expect(result).toEqual([
1194
- {
1195
- status: '✅ Posted',
1196
- detail: '10-image carousel post shared successfully',
1197
- url: 'https://www.instagram.com/p/CAROUSEL10RETRY123/',
1198
- },
1199
- ]);
1200
- });
1201
-
1202
- it('forces a fresh home reload before retrying after an upload-stage error', async () => {
1203
- const imagePath = createTempImage('upload-fresh-reload.jpg');
1204
- const gotoUrls: string[] = [];
1205
- const goto = vi.fn(async (url: string) => {
1206
- gotoUrls.push(String(url));
1207
- });
1208
- let uploadProbeCount = 0;
1209
- let advancedToCaption = false;
1210
- const evaluate = vi.fn(async (js: string) => {
1211
- if (js.includes('window.location?.pathname')) return { ok: true };
1212
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1213
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1214
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
1215
- return { ok: advancedToCaption };
1216
- }
1217
- if (js.includes('const hasPreviewUi =')) {
1218
- uploadProbeCount += 1;
1219
- if (uploadProbeCount === 1) {
1220
- return { ok: false, state: 'failed', detail: 'Something went wrong. Please try again.' };
1221
- }
1222
- return gotoUrls.some((url) => url.includes('__opencli_reset='))
1223
- ? { ok: true, state: 'preview' }
1224
- : { ok: false, state: 'failed', detail: 'Something went wrong. Please try again.' };
1225
- }
1226
- if (js.includes('button[aria-label="Close"]')) return { ok: false };
1227
- if (js.includes("scope === 'media'")) {
1228
- advancedToCaption = true;
1229
- return { ok: true, label: 'Next' };
1230
- }
1231
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
1232
- if (js.includes('readLexicalText')) return { ok: true };
1233
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
1234
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/FRESHRELOAD123/' };
1235
- return { ok: false };
1236
- });
1237
- const page = createPageMock([], {
1238
- goto,
1239
- evaluate,
1240
- setFileInput: vi.fn().mockResolvedValue(undefined),
1241
- });
1242
- const cmd = getRegistry().get('instagram/post');
1243
-
1244
- const result = await cmd!.func!(page, {
1245
- media: imagePath,
1246
- content: 'fresh reload after upload failure',
1247
- });
1248
-
1249
- expect(gotoUrls.some((url) => url.includes('__opencli_reset='))).toBe(true);
1250
- expect(result).toEqual([
1251
- {
1252
- status: '✅ Posted',
1253
- detail: 'Single image post shared successfully',
1254
- url: 'https://www.instagram.com/p/FRESHRELOAD123/',
1255
- },
1256
- ]);
1257
- });
1258
-
1259
- it('retries the share action in-place when Instagram shows a visible try-again share failure dialog', async () => {
1260
- const imagePath = createTempImage('share-retry.jpg');
1261
- let shareStatusChecks = 0;
1262
- const evaluate = vi.fn(async (js: string) => {
1263
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
1264
- if (js.includes('window.location?.pathname')) return { ok: true };
1265
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1266
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1267
- if (js.includes('const hasVisibleButtonInDialogs')) return { state: 'preview', detail: 'Crop Back Next Select crop' };
1268
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
1269
- return { ok: true };
1270
- }
1271
- if (js.includes("!labels.includes(text) && !labels.includes(aria)")) {
1272
- if (js.includes('"Share"')) return { ok: true, label: 'Share' };
1273
- return { ok: true, label: 'Next' };
1274
- }
1275
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
1276
- if (js.includes('readLexicalText')) return { ok: true };
1277
- if (js.includes('post shared') && js.includes('your post has been shared')) {
1278
- shareStatusChecks += 1;
1279
- return shareStatusChecks === 1
1280
- ? { ok: false, failed: true, settled: false, url: '' }
1281
- : { ok: true, failed: false, settled: false, url: 'https://www.instagram.com/p/SHARERETRY123/' };
1282
- }
1283
- if (js.includes('post couldn') && js.includes('try again')) return { ok: true };
1284
- return { ok: true };
1285
- });
1286
- const page = createPageMock([], { evaluate });
1287
- const cmd = getRegistry().get('instagram/post');
1288
-
1289
- const result = await cmd!.func!(page, {
1290
- media: imagePath,
1291
- content: 'share retry succeeds',
1292
- });
1293
-
1294
- expect(result).toEqual([
1295
- {
1296
- status: '✅ Posted',
1297
- detail: 'Single image post shared successfully',
1298
- url: 'https://www.instagram.com/p/SHARERETRY123/',
1299
- },
1300
- ]);
1301
- });
1302
-
1303
- it('re-resolves the upload input when the tagged selector goes stale before setFileInput runs', async () => {
1304
- const imagePath = createTempImage('stale-selector.jpg');
1305
- const setFileInput = vi.fn()
1306
- .mockRejectedValueOnce(new Error('No element found matching selector: [data-opencli-ig-upload-index="0"]'))
1307
- .mockResolvedValueOnce(undefined);
1308
- const page = createPageMock(withInitialDialogDismiss([
1309
- { ok: true },
1310
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1311
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1312
- { ok: true },
1313
- { ok: true },
1314
- { ok: false },
1315
- { ok: true, label: 'Next' },
1316
- { ok: true },
1317
- { ok: true },
1318
- { ok: true },
1319
- { ok: true, label: 'Share' },
1320
- { ok: true, url: 'https://www.instagram.com/p/STALE123/' },
1321
- ]), { setFileInput });
1322
- const cmd = getRegistry().get('instagram/post');
1323
-
1324
- const result = await cmd!.func!(page, {
1325
- media: imagePath,
1326
- content: 'stale selector recovery',
1327
- });
1328
-
1329
- expect(setFileInput).toHaveBeenCalledTimes(2);
1330
- expect(result).toEqual([
1331
- {
1332
- status: '✅ Posted',
1333
- detail: 'Single image post shared successfully',
1334
- url: 'https://www.instagram.com/p/STALE123/',
1335
- },
1336
- ]);
1337
- });
1338
-
1339
- it('re-resolves the upload input when CDP loses the matched file-input node before setFileInput runs', async () => {
1340
- const imagePath = createTempImage('stale-node-id.jpg');
1341
- const setFileInput = vi.fn()
1342
- .mockRejectedValueOnce(new Error('{"code":-32000,"message":"Could not find node with given id"}'))
1343
- .mockResolvedValueOnce(undefined);
1344
- const page = createPageMock(withInitialDialogDismiss([
1345
- { ok: true },
1346
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1347
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1348
- { ok: true },
1349
- { ok: true },
1350
- { ok: false },
1351
- { ok: true, label: 'Next' },
1352
- { ok: true },
1353
- { ok: true },
1354
- { ok: true },
1355
- { ok: true, label: 'Share' },
1356
- { ok: true, url: 'https://www.instagram.com/p/STALEID123/' },
1357
- ]), { setFileInput });
1358
- const cmd = getRegistry().get('instagram/post');
1359
-
1360
- const result = await cmd!.func!(page, {
1361
- media: imagePath,
1362
- content: 'stale node id recovery',
1363
- });
1364
-
1365
- expect(setFileInput).toHaveBeenCalledTimes(2);
1366
- expect(result).toEqual([
1367
- {
1368
- status: '✅ Posted',
1369
- detail: 'Single image post shared successfully',
1370
- url: 'https://www.instagram.com/p/STALEID123/',
1371
- },
1372
- ]);
1373
- });
1374
-
1375
- it('retries opening the home composer instead of navigating to the broken /create/select route', async () => {
1376
- const imagePath = createTempImage('retry-composer.jpg');
1377
- const page = createPageMock(withInitialDialogDismiss([
1378
- { ok: true },
1379
- { ok: false },
1380
- { ok: true },
1381
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1382
- { ok: true },
1383
- { ok: true },
1384
- { ok: false },
1385
- { ok: true, label: 'Next' },
1386
- { ok: true },
1387
- { ok: true },
1388
- { ok: true },
1389
- { ok: true, label: 'Share' },
1390
- { ok: true, url: 'https://www.instagram.com/p/FALLBACK123/' },
1391
- ]));
1392
- const cmd = getRegistry().get('instagram/post');
1393
-
1394
- const result = await cmd!.func!(page, {
1395
- media: imagePath,
1396
- content: 'retry composer',
1397
- });
1398
-
1399
- const gotoCalls = (page.goto as any).mock.calls.map((args: any[]) => String(args[0]));
1400
- expect(gotoCalls.every((url: string) => !url.includes('/create/select'))).toBe(true);
1401
- expect(gotoCalls.some((url: string) => url === 'https://www.instagram.com/')).toBe(true);
1402
- expect(result).toEqual([
1403
- {
1404
- status: '✅ Posted',
1405
- detail: 'Single image post shared successfully',
1406
- url: 'https://www.instagram.com/p/FALLBACK123/',
1407
- },
1408
- ]);
1409
- });
1410
-
1411
- it('clicks Next twice when Instagram shows an intermediate preview step before the caption editor', async () => {
1412
- const imagePath = createTempImage('double-next.jpg');
1413
- let nextClicks = 0;
1414
- const evaluate = vi.fn(async (js: string) => {
1415
- if (js.includes('sharing') && js.includes('create new post')) return { ok: false };
1416
- if (js.includes('window.location?.pathname')) return { ok: true };
1417
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1418
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1419
- if (js.includes('const hasVisibleButtonInDialogs')) return { state: 'preview', detail: 'Crop Back Next Select crop' };
1420
- if (js.includes("dialogText.includes('write a caption')") || js.includes("const editable = document.querySelector('textarea, [contenteditable=\"true\"]');")) {
1421
- return { ok: nextClicks >= 2 };
1422
- }
1423
- if (js.includes("!labels.includes(text) && !labels.includes(aria)")) {
1424
- if (js.includes('"Share"')) return { ok: true, label: 'Share' };
1425
- nextClicks += 1;
1426
- return { ok: true, label: 'Next' };
1427
- }
1428
- if (js.includes('ClipboardEvent') && js.includes('textarea')) return { ok: true, mode: 'textarea' };
1429
- if (js.includes('readLexicalText')) return { ok: true };
1430
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: 'https://www.instagram.com/p/DOUBLE123/' };
1431
- return { ok: true };
1432
- });
1433
- const page = createPageMock([], { evaluate });
1434
- const cmd = getRegistry().get('instagram/post');
1435
-
1436
- const result = await cmd!.func!(page, {
1437
- media: imagePath,
1438
- content: 'double next flow',
1439
- });
1440
-
1441
- expect(result).toEqual([
1442
- {
1443
- status: '✅ Posted',
1444
- detail: 'Single image post shared successfully',
1445
- url: 'https://www.instagram.com/p/DOUBLE123/',
1446
- },
1447
- ]);
1448
- });
1449
-
1450
- it('tries the next upload input when the first candidate never opens the preview', async () => {
1451
- const imagePath = createTempImage('second-input.jpg');
1452
- const setFileInput = vi.fn()
1453
- .mockResolvedValueOnce(undefined)
1454
- .mockResolvedValueOnce(undefined);
1455
- const page = createPageMock(withInitialDialogDismiss([
1456
- { ok: true },
1457
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]', '[data-opencli-ig-upload-index="1"]'] },
1458
- { ok: true },
1459
- { ok: false },
1460
- { ok: false },
1461
- { ok: false },
1462
- { ok: false },
1463
- { ok: false },
1464
- { ok: false },
1465
- { ok: false },
1466
- { ok: false },
1467
- { ok: true },
1468
- { ok: true },
1469
- { ok: false },
1470
- { ok: true, label: 'Next' },
1471
- { ok: true },
1472
- { ok: true },
1473
- { ok: true },
1474
- { ok: true, label: 'Share' },
1475
- { ok: true, url: 'https://www.instagram.com/p/SECOND123/' },
1476
- ]), { setFileInput });
1477
-
1478
- const cmd = getRegistry().get('instagram/post');
1479
- const result = await cmd!.func!(page, {
1480
- media: imagePath,
1481
- content: 'second input works',
1482
- });
1483
-
1484
- expect(setFileInput).toHaveBeenNthCalledWith(1, [imagePath], '[data-opencli-ig-upload-index="0"]');
1485
- expect(setFileInput).toHaveBeenNthCalledWith(2, [imagePath], '[data-opencli-ig-upload-index="1"]');
1486
- expect(result).toEqual([
1487
- {
1488
- status: '✅ Posted',
1489
- detail: 'Single image post shared successfully',
1490
- url: 'https://www.instagram.com/p/SECOND123/',
1491
- },
1492
- ]);
1493
- });
1494
-
1495
- it('fails fast when Instagram reports that the post could not be shared', async () => {
1496
- const imagePath = createTempImage('share-failed.jpg');
1497
- const page = createPageMock(withInitialDialogDismiss([
1498
- { ok: true },
1499
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1500
- { ok: true },
1501
- { ok: true },
1502
- { ok: false },
1503
- { ok: true, label: 'Next' },
1504
- { ok: true },
1505
- { ok: true },
1506
- { ok: true },
1507
- { ok: true, label: 'Share' },
1508
- { ok: false, failed: true, url: '' },
1509
- ]));
1510
-
1511
- const cmd = getRegistry().get('instagram/post');
1512
-
1513
- await expect(cmd!.func!(page, {
1514
- media: imagePath,
1515
- content: 'share should fail',
1516
- })).rejects.toThrow('Instagram post share failed');
1517
- });
1518
-
1519
- it('keeps waiting across the full publish timeout window instead of fast-forwarding after 30 polls', async () => {
1520
- const imagePath = createTempImage('slow-share.jpg');
1521
- const page = createPageMock(withInitialDialogDismiss([
1522
- { ok: true },
1523
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1524
- { ok: true },
1525
- { ok: true },
1526
- { ok: false },
1527
- { ok: true, label: 'Next' },
1528
- { ok: true },
1529
- { ok: true },
1530
- { ok: true },
1531
- { ok: true, label: 'Share' },
1532
- ...Array.from({ length: 35 }, () => ({ ok: false, failed: false, settled: false, url: '' })),
1533
- { ok: true, url: 'https://www.instagram.com/p/SLOWSHARE123/' },
1534
- ]));
1535
- const cmd = getRegistry().get('instagram/post');
1536
-
1537
- const result = await cmd!.func!(page, {
1538
- media: imagePath,
1539
- content: 'slow share eventually succeeds',
1540
- });
1541
-
1542
- const waitCalls = (page.wait as any).mock.calls.filter((args: any[]) => args[0]?.time === 1);
1543
- expect(waitCalls.length).toBeGreaterThanOrEqual(35);
1544
- expect(result).toEqual([
1545
- {
1546
- status: '✅ Posted',
1547
- detail: 'Single image post shared successfully',
1548
- url: 'https://www.instagram.com/p/SLOWSHARE123/',
1549
- },
1550
- ]);
1551
- });
1552
-
1553
- it('does not retry the upload flow after Share has already been clicked', async () => {
1554
- const imagePath = createTempImage('no-duplicate-retry.jpg');
1555
- const setFileInput = vi.fn().mockResolvedValue(undefined);
1556
- const page = createPageMock(withInitialDialogDismiss([
1557
- { ok: true },
1558
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1559
- { ok: true },
1560
- { ok: true },
1561
- { ok: false },
1562
- { ok: true, label: 'Next' },
1563
- { ok: true },
1564
- { ok: true },
1565
- { ok: true },
1566
- { ok: true, label: 'Share' },
1567
- ...Array.from({ length: 30 }, () => ({ ok: false, failed: false, url: '' })),
1568
- ]), { setFileInput });
1569
-
1570
- const cmd = getRegistry().get('instagram/post');
1571
-
1572
- await expect(cmd!.func!(page, {
1573
- media: imagePath,
1574
- content: 'share observation stalled',
1575
- })).rejects.toThrow('Instagram post share confirmation did not appear');
1576
-
1577
- expect(setFileInput).toHaveBeenCalledTimes(1);
1578
- });
1579
-
1580
- it('recovers the latest post URL from the current logged-in profile when success does not navigate to /p/', async () => {
1581
- const imagePath = createTempImage('url-recovery.jpg');
1582
- const evaluate = vi.fn(async (js: string) => {
1583
- if (js.includes('const data = Array.isArray(window[') && js.includes('__opencli_ig_protocol_capture')) {
1584
- return { data: [], errors: [] };
1585
- }
1586
- if (js.includes('fetch(') && js.includes('/api/v1/users/') && js.includes('X-IG-App-ID')) {
1587
- return js.includes('dynamic-runtime-app-id')
1588
- ? { ok: true, username: 'tsezi_ray' }
1589
- : { ok: false };
1590
- }
1591
- if (js.includes('window.location?.pathname')) return { ok: true };
1592
- if (js.includes('data-opencli-ig-upload-index')) return { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] };
1593
- if (js.includes("dispatchEvent(new Event('input'")) return { ok: true };
1594
- if (js.includes('const hasPreviewUi =')) return { ok: true, state: 'preview' };
1595
- if (js.includes("scope === 'media'")) return { ok: true, label: 'Next' };
1596
- if (js.includes("scope === 'caption'")) return { ok: true, label: 'Share' };
1597
- if (js.includes('post shared') && js.includes('your post has been shared')) return { ok: true, url: '' };
1598
- if (js.includes('const hrefs = Array.from(document.querySelectorAll(\'a[href*="/p/"]\'))')) {
1599
- const calls = evaluate.mock.calls.filter(([script]) =>
1600
- typeof script === 'string' && script.includes('const hrefs = Array.from(document.querySelectorAll(\'a[href*="/p/"]\'))'),
1601
- ).length;
1602
- return calls === 1
1603
- ? { ok: true, hrefs: ['/tsezi_ray/p/PINNED111/', '/tsezi_ray/p/OLD222/'] }
1604
- : { ok: true, hrefs: ['/tsezi_ray/p/PINNED111/', '/tsezi_ray/p/OLD222/', '/tsezi_ray/p/RECOVER123/'] };
1605
- }
1606
- if (js.includes('document.documentElement?.outerHTML')) {
1607
- return {
1608
- appId: 'dynamic-runtime-app-id',
1609
- csrfToken: 'csrf-token',
1610
- instagramAjax: 'dynamic-rollout',
1611
- };
1612
- }
1613
- return { ok: true };
1614
- });
1615
- const page = createPageMock([], {
1616
- evaluate,
1617
- getCookies: vi.fn().mockResolvedValue([{ name: 'ds_user_id', value: '61236465677', domain: 'instagram.com' }]),
1618
- });
1619
-
1620
- const cmd = getRegistry().get('instagram/post');
1621
- const result = await cmd!.func!(page, {
1622
- media: imagePath,
1623
- content: 'url recovery',
1624
- });
1625
-
1626
- expect(result).toEqual([
1627
- {
1628
- status: '✅ Posted',
1629
- detail: 'Single image post shared successfully',
1630
- url: 'https://www.instagram.com/tsezi_ray/p/RECOVER123/',
1631
- },
1632
- ]);
1633
- });
1634
-
1635
- it('treats a closed composer as a successful share and falls back to URL recovery', async () => {
1636
- const imagePath = createTempImage('share-settled.jpg');
1637
- const page = createPageMock([
1638
- { appId: 'dynamic-runtime-app-id', csrfToken: 'csrf-token', instagramAjax: 'dynamic-rollout' },
1639
- { ok: true, username: 'tsezi_ray' },
1640
- { ok: true, hrefs: ['/p/OLD111/'] },
1641
- { ok: false },
1642
- { ok: true },
1643
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1644
- { ok: true },
1645
- { ok: true },
1646
- { ok: false },
1647
- { ok: true, label: 'Next' },
1648
- { ok: true },
1649
- { ok: true },
1650
- { ok: true },
1651
- { ok: true, label: 'Share' },
1652
- { ok: false, failed: false, settled: true, url: '' },
1653
- { ok: false, failed: false, settled: true, url: '' },
1654
- { ok: false, failed: false, settled: true, url: '' },
1655
- { appId: 'dynamic-runtime-app-id', csrfToken: 'csrf-token', instagramAjax: 'dynamic-rollout' },
1656
- { ok: true, username: 'tsezi_ray' },
1657
- { ok: true, hrefs: ['/p/OLD111/', '/p/RECOVER789/'] },
1658
- ], {
1659
- getCookies: vi.fn().mockResolvedValue([{ name: 'ds_user_id', value: '61236465677', domain: 'instagram.com' }]),
1660
- });
1661
-
1662
- const cmd = getRegistry().get('instagram/post');
1663
- const result = await cmd!.func!(page, {
1664
- media: imagePath,
1665
- content: 'share settled recovery',
1666
- });
1667
-
1668
- expect(result).toEqual([
1669
- {
1670
- status: '✅ Posted',
1671
- detail: 'Single image post shared successfully',
1672
- url: 'https://www.instagram.com/p/RECOVER789/',
1673
- },
1674
- ]);
1675
- });
1676
-
1677
- it('accepts standard /p/... profile links during URL recovery', async () => {
1678
- const imagePath = createTempImage('url-recovery-standard-shape.jpg');
1679
- const page = createPageMock([
1680
- { appId: 'dynamic-runtime-app-id', csrfToken: 'csrf-token', instagramAjax: 'dynamic-rollout' },
1681
- { ok: true, username: 'tsezi_ray' },
1682
- { ok: true, hrefs: ['/p/PINNED111/', '/p/OLD222/'] },
1683
- { ok: false },
1684
- { ok: true },
1685
- { ok: true, selectors: ['[data-opencli-ig-upload-index="0"]'] },
1686
- { ok: true },
1687
- { ok: true },
1688
- { ok: false },
1689
- { ok: true, label: 'Next' },
1690
- { ok: true },
1691
- { ok: true },
1692
- { ok: true },
1693
- { ok: true, label: 'Share' },
1694
- { ok: true, url: '' },
1695
- { appId: 'dynamic-runtime-app-id', csrfToken: 'csrf-token', instagramAjax: 'dynamic-rollout' },
1696
- { ok: true, username: 'tsezi_ray' },
1697
- { ok: true, hrefs: ['/p/PINNED111/', '/p/OLD222/', '/p/RECOVER456/'] },
1698
- ], {
1699
- getCookies: vi.fn().mockResolvedValue([{ name: 'ds_user_id', value: '61236465677', domain: 'instagram.com' }]),
1700
- });
1701
-
1702
- const cmd = getRegistry().get('instagram/post');
1703
- const result = await cmd!.func!(page, {
1704
- media: imagePath,
1705
- content: 'url recovery standard shape',
1706
- });
1707
-
1708
- expect(result).toEqual([
1709
- {
1710
- status: '✅ Posted',
1711
- detail: 'Single image post shared successfully',
1712
- url: 'https://www.instagram.com/p/RECOVER456/',
1713
- },
1714
- ]);
1715
- });
1716
- });