@jackwener/opencli 1.6.2 → 1.6.4

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} +101 -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/{version.js → src/version.js} +7 -1
  679. package/dist/src/weixin-download.test.d.ts +1 -0
  680. package/dist/{weixin-download.test.js → src/weixin-download.test.js} +1 -1
  681. package/package.json +26 -9
  682. package/scripts/check-doc-coverage.sh +2 -2
  683. package/scripts/copy-yaml.cjs +4 -4
  684. package/scripts/fetch-adapters.js +157 -0
  685. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -83
  686. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  687. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
  688. package/.github/ISSUE_TEMPLATE/new_site_adapter.yml +0 -57
  689. package/.github/actions/setup-chrome/action.yml +0 -27
  690. package/.github/dependabot.yml +0 -27
  691. package/.github/pull_request_template.md +0 -33
  692. package/.github/workflows/build-extension.yml +0 -67
  693. package/.github/workflows/ci.yml +0 -147
  694. package/.github/workflows/doc-check.yml +0 -36
  695. package/.github/workflows/docs.yml +0 -17
  696. package/.github/workflows/e2e-headed.yml +0 -74
  697. package/.github/workflows/release.yml +0 -44
  698. package/.github/workflows/security.yml +0 -33
  699. package/CHANGELOG.md +0 -321
  700. package/CONTRIBUTING.md +0 -208
  701. package/PRIVACY.md +0 -57
  702. package/TESTING.md +0 -252
  703. package/autoresearch/baseline-browse.txt +0 -1
  704. package/autoresearch/baseline-skill.txt +0 -1
  705. package/autoresearch/browse-tasks.json +0 -686
  706. package/autoresearch/commands/debug.ts +0 -163
  707. package/autoresearch/commands/fix.ts +0 -145
  708. package/autoresearch/commands/plan.ts +0 -88
  709. package/autoresearch/commands/run.ts +0 -138
  710. package/autoresearch/config.ts +0 -82
  711. package/autoresearch/engine.ts +0 -359
  712. package/autoresearch/eval-all.ts +0 -127
  713. package/autoresearch/eval-browse.ts +0 -185
  714. package/autoresearch/eval-publish.ts +0 -238
  715. package/autoresearch/eval-save.ts +0 -249
  716. package/autoresearch/eval-skill.ts +0 -254
  717. package/autoresearch/eval-v2ex.ts +0 -220
  718. package/autoresearch/eval-zhihu.ts +0 -230
  719. package/autoresearch/logger.ts +0 -69
  720. package/autoresearch/presets/combined-reliability.ts +0 -27
  721. package/autoresearch/presets/index.ts +0 -23
  722. package/autoresearch/presets/operate-reliability.ts +0 -24
  723. package/autoresearch/presets/save-reliability.ts +0 -26
  724. package/autoresearch/presets/skill-quality.ts +0 -20
  725. package/autoresearch/presets/v2ex-reliability.ts +0 -24
  726. package/autoresearch/presets/zhihu-reliability.ts +0 -25
  727. package/autoresearch/publish-tasks.json +0 -345
  728. package/autoresearch/run-browse.sh +0 -9
  729. package/autoresearch/run-save.sh +0 -11
  730. package/autoresearch/run-skill.sh +0 -9
  731. package/autoresearch/save-adapters/xhs-explore-deep.ts +0 -64
  732. package/autoresearch/save-adapters/xhs-note-comments.ts +0 -61
  733. package/autoresearch/save-adapters/xhs-search-full.ts +0 -62
  734. package/autoresearch/save-adapters/zhihu-hot-detail.ts +0 -52
  735. package/autoresearch/save-adapters/zhihu-question-full.ts +0 -57
  736. package/autoresearch/save-adapters/zhihu-search-detail.ts +0 -53
  737. package/autoresearch/save-tasks.json +0 -281
  738. package/autoresearch/v2ex-tasks.json +0 -899
  739. package/autoresearch/zhihu-tasks.json +0 -848
  740. package/bun.lock +0 -615
  741. package/dist/cli.d.ts +0 -9
  742. package/docs/.vitepress/config.mts +0 -238
  743. package/docs/adapters/browser/1688.md +0 -52
  744. package/docs/adapters/browser/36kr.md +0 -48
  745. package/docs/adapters/browser/amazon.md +0 -53
  746. package/docs/adapters/browser/apple-podcasts.md +0 -28
  747. package/docs/adapters/browser/arxiv.md +0 -27
  748. package/docs/adapters/browser/band.md +0 -63
  749. package/docs/adapters/browser/barchart.md +0 -33
  750. package/docs/adapters/browser/bbc.md +0 -26
  751. package/docs/adapters/browser/bilibili.md +0 -47
  752. package/docs/adapters/browser/bloomberg.md +0 -70
  753. package/docs/adapters/browser/bluesky.md +0 -53
  754. package/docs/adapters/browser/boss.md +0 -28
  755. package/docs/adapters/browser/chaoxing.md +0 -39
  756. package/docs/adapters/browser/coupang.md +0 -28
  757. package/docs/adapters/browser/ctrip.md +0 -27
  758. package/docs/adapters/browser/devto.md +0 -35
  759. package/docs/adapters/browser/dictionary.md +0 -27
  760. package/docs/adapters/browser/douban.md +0 -62
  761. package/docs/adapters/browser/doubao.md +0 -39
  762. package/docs/adapters/browser/douyin.md +0 -75
  763. package/docs/adapters/browser/facebook.md +0 -36
  764. package/docs/adapters/browser/gemini.md +0 -72
  765. package/docs/adapters/browser/google.md +0 -62
  766. package/docs/adapters/browser/grok.md +0 -53
  767. package/docs/adapters/browser/hackernews.md +0 -42
  768. package/docs/adapters/browser/hf.md +0 -42
  769. package/docs/adapters/browser/hupu.md +0 -53
  770. package/docs/adapters/browser/imdb.md +0 -47
  771. package/docs/adapters/browser/instagram.md +0 -46
  772. package/docs/adapters/browser/jd.md +0 -27
  773. package/docs/adapters/browser/jike.md +0 -45
  774. package/docs/adapters/browser/jimeng.md +0 -39
  775. package/docs/adapters/browser/linkedin.md +0 -33
  776. package/docs/adapters/browser/linux-do.md +0 -206
  777. package/docs/adapters/browser/lobsters.md +0 -32
  778. package/docs/adapters/browser/medium.md +0 -32
  779. package/docs/adapters/browser/notebooklm.md +0 -69
  780. package/docs/adapters/browser/ones.md +0 -59
  781. package/docs/adapters/browser/paperreview.md +0 -43
  782. package/docs/adapters/browser/pixiv.md +0 -92
  783. package/docs/adapters/browser/producthunt.md +0 -49
  784. package/docs/adapters/browser/reddit.md +0 -50
  785. package/docs/adapters/browser/reuters.md +0 -27
  786. package/docs/adapters/browser/sinablog.md +0 -36
  787. package/docs/adapters/browser/sinafinance.md +0 -115
  788. package/docs/adapters/browser/smzdm.md +0 -27
  789. package/docs/adapters/browser/spotify.md +0 -62
  790. package/docs/adapters/browser/stackoverflow.md +0 -35
  791. package/docs/adapters/browser/steam.md +0 -26
  792. package/docs/adapters/browser/substack.md +0 -38
  793. package/docs/adapters/browser/tieba.md +0 -45
  794. package/docs/adapters/browser/tiktok.md +0 -68
  795. package/docs/adapters/browser/twitter.md +0 -56
  796. package/docs/adapters/browser/v2ex.md +0 -53
  797. package/docs/adapters/browser/web.md +0 -30
  798. package/docs/adapters/browser/weibo.md +0 -36
  799. package/docs/adapters/browser/weixin.md +0 -33
  800. package/docs/adapters/browser/weread.md +0 -48
  801. package/docs/adapters/browser/wikipedia.md +0 -32
  802. package/docs/adapters/browser/xianyu.md +0 -42
  803. package/docs/adapters/browser/xiaoe.md +0 -44
  804. package/docs/adapters/browser/xiaohongshu.md +0 -47
  805. package/docs/adapters/browser/xiaoyuzhou.md +0 -28
  806. package/docs/adapters/browser/xueqiu.md +0 -65
  807. package/docs/adapters/browser/yahoo-finance.md +0 -27
  808. package/docs/adapters/browser/yollomi.md +0 -69
  809. package/docs/adapters/browser/youtube.md +0 -29
  810. package/docs/adapters/browser/yuanbao.md +0 -64
  811. package/docs/adapters/browser/zhihu.md +0 -30
  812. package/docs/adapters/browser/zsxq.md +0 -49
  813. package/docs/adapters/desktop/antigravity.md +0 -49
  814. package/docs/adapters/desktop/chatgpt.md +0 -49
  815. package/docs/adapters/desktop/chatwise.md +0 -38
  816. package/docs/adapters/desktop/codex.md +0 -36
  817. package/docs/adapters/desktop/cursor.md +0 -37
  818. package/docs/adapters/desktop/discord.md +0 -28
  819. package/docs/adapters/desktop/doubao-app.md +0 -35
  820. package/docs/adapters/desktop/notion.md +0 -29
  821. package/docs/adapters/index.md +0 -96
  822. package/docs/adapters-doc/ones.md +0 -32
  823. package/docs/advanced/cdp.md +0 -103
  824. package/docs/advanced/download.md +0 -71
  825. package/docs/advanced/electron.md +0 -125
  826. package/docs/advanced/rate-limiter-plugin.md +0 -99
  827. package/docs/advanced/remote-chrome.md +0 -72
  828. package/docs/comparison.md +0 -125
  829. package/docs/developer/ai-workflow.md +0 -66
  830. package/docs/developer/architecture.md +0 -103
  831. package/docs/developer/contributing.md +0 -155
  832. package/docs/developer/testing.md +0 -263
  833. package/docs/developer/ts-adapter.md +0 -105
  834. package/docs/developer/yaml-adapter.md +0 -124
  835. package/docs/guide/browser-bridge.md +0 -49
  836. package/docs/guide/electron-app-cli.md +0 -200
  837. package/docs/guide/getting-started.md +0 -79
  838. package/docs/guide/installation.md +0 -37
  839. package/docs/guide/plugins.md +0 -261
  840. package/docs/guide/troubleshooting.md +0 -72
  841. package/docs/index.md +0 -35
  842. package/docs/superpowers/plans/2026-03-28-perf-smart-wait.md +0 -1143
  843. package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +0 -857
  844. package/docs/superpowers/specs/2026-03-28-perf-smart-wait-design.md +0 -170
  845. package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +0 -208
  846. package/docs/superpowers/specs/2026-04-02-browse-skill-testing-design.md +0 -144
  847. package/docs/superpowers/specs/2026-04-03-v2ex-autoresearch-design.md +0 -41
  848. package/docs/zh/adapters/index.md +0 -5
  849. package/docs/zh/advanced/cdp.md +0 -3
  850. package/docs/zh/developer/contributing.md +0 -24
  851. package/docs/zh/guide/browser-bridge.md +0 -36
  852. package/docs/zh/guide/electron-app-cli.md +0 -188
  853. package/docs/zh/guide/getting-started.md +0 -62
  854. package/docs/zh/guide/installation.md +0 -37
  855. package/docs/zh/guide/plugins.md +0 -183
  856. package/docs/zh/index.md +0 -29
  857. package/extension/dist/background.js +0 -1127
  858. package/extension/icons/icon-128.png +0 -0
  859. package/extension/icons/icon-16.png +0 -0
  860. package/extension/icons/icon-32.png +0 -0
  861. package/extension/icons/icon-48.png +0 -0
  862. package/extension/manifest.json +0 -39
  863. package/extension/package-lock.json +0 -1156
  864. package/extension/package.json +0 -17
  865. package/extension/popup.html +0 -84
  866. package/extension/popup.js +0 -25
  867. package/extension/scripts/package-release.mjs +0 -179
  868. package/extension/src/background.test.ts +0 -279
  869. package/extension/src/background.ts +0 -878
  870. package/extension/src/cdp.test.ts +0 -75
  871. package/extension/src/cdp.ts +0 -440
  872. package/extension/src/protocol.ts +0 -87
  873. package/extension/store-assets/screenshot-1280x800.png +0 -0
  874. package/extension/tsconfig.json +0 -15
  875. package/extension/vite.config.ts +0 -18
  876. package/skills/opencli-explorer/SKILL.md +0 -853
  877. package/skills/opencli-oneshot/SKILL.md +0 -222
  878. package/skills/opencli-operate/SKILL.md +0 -306
  879. package/skills/opencli-usage/SKILL.md +0 -163
  880. package/skills/opencli-usage/browser.md +0 -527
  881. package/skills/opencli-usage/desktop.md +0 -118
  882. package/skills/opencli-usage/plugins.md +0 -82
  883. package/skills/opencli-usage/public-api.md +0 -178
  884. package/skills/smart-search/SKILL.md +0 -156
  885. package/skills/smart-search/references/sources-ai.md +0 -74
  886. package/skills/smart-search/references/sources-info.md +0 -43
  887. package/skills/smart-search/references/sources-media.md +0 -50
  888. package/skills/smart-search/references/sources-other.md +0 -42
  889. package/skills/smart-search/references/sources-shopping.md +0 -31
  890. package/skills/smart-search/references/sources-social.md +0 -51
  891. package/skills/smart-search/references/sources-tech.md +0 -42
  892. package/skills/smart-search/references/sources-travel.md +0 -20
  893. package/src/analysis.ts +0 -170
  894. package/src/browser/base-page.ts +0 -232
  895. package/src/browser/bridge.ts +0 -129
  896. package/src/browser/cdp.test.ts +0 -66
  897. package/src/browser/cdp.ts +0 -341
  898. package/src/browser/daemon-client.test.ts +0 -103
  899. package/src/browser/daemon-client.ts +0 -175
  900. package/src/browser/discover.ts +0 -26
  901. package/src/browser/dom-helpers.test.ts +0 -114
  902. package/src/browser/dom-helpers.ts +0 -238
  903. package/src/browser/dom-snapshot.test.ts +0 -291
  904. package/src/browser/dom-snapshot.ts +0 -845
  905. package/src/browser/errors.ts +0 -63
  906. package/src/browser/index.ts +0 -14
  907. package/src/browser/page.test.ts +0 -58
  908. package/src/browser/page.ts +0 -315
  909. package/src/browser/stealth.test.ts +0 -153
  910. package/src/browser/stealth.ts +0 -354
  911. package/src/browser/tabs.ts +0 -76
  912. package/src/browser/utils.ts +0 -27
  913. package/src/browser.test.ts +0 -195
  914. package/src/build-manifest.test.ts +0 -200
  915. package/src/build-manifest.ts +0 -279
  916. package/src/capabilityRouting.test.ts +0 -47
  917. package/src/capabilityRouting.ts +0 -29
  918. package/src/cascade.ts +0 -192
  919. package/src/cli.test.ts +0 -133
  920. package/src/cli.ts +0 -1012
  921. package/src/clis/1688/item.test.ts +0 -69
  922. package/src/clis/1688/item.ts +0 -282
  923. package/src/clis/1688/search.test.ts +0 -81
  924. package/src/clis/1688/search.ts +0 -402
  925. package/src/clis/1688/shared.test.ts +0 -75
  926. package/src/clis/1688/shared.ts +0 -623
  927. package/src/clis/1688/store.test.ts +0 -69
  928. package/src/clis/1688/store.ts +0 -300
  929. package/src/clis/36kr/article.ts +0 -69
  930. package/src/clis/36kr/hot.test.ts +0 -19
  931. package/src/clis/36kr/hot.ts +0 -100
  932. package/src/clis/36kr/news.test.ts +0 -90
  933. package/src/clis/36kr/news.ts +0 -54
  934. package/src/clis/36kr/search.ts +0 -78
  935. package/src/clis/_shared/common.ts +0 -11
  936. package/src/clis/_shared/desktop-commands.ts +0 -121
  937. package/src/clis/amazon/bestsellers.test.ts +0 -31
  938. package/src/clis/amazon/bestsellers.ts +0 -8
  939. package/src/clis/amazon/discussion.test.ts +0 -38
  940. package/src/clis/amazon/discussion.ts +0 -131
  941. package/src/clis/amazon/movers-shakers.ts +0 -8
  942. package/src/clis/amazon/new-releases.ts +0 -8
  943. package/src/clis/amazon/offer.test.ts +0 -35
  944. package/src/clis/amazon/offer.ts +0 -185
  945. package/src/clis/amazon/product.test.ts +0 -26
  946. package/src/clis/amazon/product.ts +0 -131
  947. package/src/clis/amazon/rankings.test.ts +0 -47
  948. package/src/clis/amazon/rankings.ts +0 -312
  949. package/src/clis/amazon/search.test.ts +0 -24
  950. package/src/clis/amazon/search.ts +0 -128
  951. package/src/clis/amazon/shared.test.ts +0 -53
  952. package/src/clis/amazon/shared.ts +0 -438
  953. package/src/clis/antigravity/SKILL.md +0 -38
  954. package/src/clis/antigravity/dump.ts +0 -30
  955. package/src/clis/antigravity/extract-code.ts +0 -34
  956. package/src/clis/antigravity/model.ts +0 -47
  957. package/src/clis/antigravity/new.ts +0 -28
  958. package/src/clis/antigravity/read.ts +0 -36
  959. package/src/clis/antigravity/send.ts +0 -40
  960. package/src/clis/antigravity/serve.ts +0 -600
  961. package/src/clis/antigravity/status.ts +0 -19
  962. package/src/clis/antigravity/watch.ts +0 -45
  963. package/src/clis/apple-podcasts/commands.test.ts +0 -123
  964. package/src/clis/apple-podcasts/episodes.ts +0 -28
  965. package/src/clis/apple-podcasts/search.ts +0 -30
  966. package/src/clis/apple-podcasts/top.ts +0 -47
  967. package/src/clis/apple-podcasts/utils.test.ts +0 -72
  968. package/src/clis/apple-podcasts/utils.ts +0 -37
  969. package/src/clis/arxiv/paper.ts +0 -21
  970. package/src/clis/arxiv/search.ts +0 -24
  971. package/src/clis/arxiv/utils.ts +0 -63
  972. package/src/clis/band/bands.ts +0 -76
  973. package/src/clis/band/mentions.ts +0 -134
  974. package/src/clis/band/post.ts +0 -187
  975. package/src/clis/band/posts.ts +0 -106
  976. package/src/clis/barchart/flow.ts +0 -120
  977. package/src/clis/barchart/greeks.ts +0 -123
  978. package/src/clis/barchart/options.ts +0 -110
  979. package/src/clis/barchart/quote.ts +0 -137
  980. package/src/clis/bbc/news.ts +0 -41
  981. package/src/clis/bilibili/comments.test.ts +0 -103
  982. package/src/clis/bilibili/comments.ts +0 -44
  983. package/src/clis/bilibili/download.ts +0 -93
  984. package/src/clis/bilibili/dynamic.test.ts +0 -79
  985. package/src/clis/bilibili/dynamic.ts +0 -34
  986. package/src/clis/bilibili/favorite.ts +0 -45
  987. package/src/clis/bilibili/feed.ts +0 -71
  988. package/src/clis/bilibili/following.ts +0 -51
  989. package/src/clis/bilibili/history.ts +0 -48
  990. package/src/clis/bilibili/hot.yaml +0 -38
  991. package/src/clis/bilibili/me.ts +0 -14
  992. package/src/clis/bilibili/ranking.ts +0 -25
  993. package/src/clis/bilibili/search.ts +0 -25
  994. package/src/clis/bilibili/subtitle.test.ts +0 -61
  995. package/src/clis/bilibili/subtitle.ts +0 -106
  996. package/src/clis/bilibili/user-videos.ts +0 -42
  997. package/src/clis/bilibili/utils.test.ts +0 -21
  998. package/src/clis/bilibili/utils.ts +0 -143
  999. package/src/clis/bloomberg/businessweek.ts +0 -18
  1000. package/src/clis/bloomberg/economics.ts +0 -18
  1001. package/src/clis/bloomberg/feeds.ts +0 -16
  1002. package/src/clis/bloomberg/industries.ts +0 -18
  1003. package/src/clis/bloomberg/main.ts +0 -18
  1004. package/src/clis/bloomberg/markets.ts +0 -18
  1005. package/src/clis/bloomberg/news.ts +0 -136
  1006. package/src/clis/bloomberg/opinions.ts +0 -18
  1007. package/src/clis/bloomberg/politics.ts +0 -18
  1008. package/src/clis/bloomberg/tech.ts +0 -18
  1009. package/src/clis/bloomberg/utils.test.ts +0 -135
  1010. package/src/clis/bloomberg/utils.ts +0 -429
  1011. package/src/clis/bluesky/feeds.yaml +0 -29
  1012. package/src/clis/bluesky/followers.yaml +0 -33
  1013. package/src/clis/bluesky/following.yaml +0 -33
  1014. package/src/clis/bluesky/profile.yaml +0 -27
  1015. package/src/clis/bluesky/search.yaml +0 -34
  1016. package/src/clis/bluesky/starter-packs.yaml +0 -34
  1017. package/src/clis/bluesky/thread.yaml +0 -32
  1018. package/src/clis/bluesky/trending.yaml +0 -27
  1019. package/src/clis/bluesky/user.yaml +0 -34
  1020. package/src/clis/boss/batchgreet.ts +0 -75
  1021. package/src/clis/boss/chatlist.ts +0 -36
  1022. package/src/clis/boss/chatmsg.ts +0 -46
  1023. package/src/clis/boss/detail.ts +0 -69
  1024. package/src/clis/boss/exchange.ts +0 -52
  1025. package/src/clis/boss/greet.ts +0 -61
  1026. package/src/clis/boss/invite.ts +0 -80
  1027. package/src/clis/boss/joblist.ts +0 -34
  1028. package/src/clis/boss/mark.ts +0 -75
  1029. package/src/clis/boss/recommend.ts +0 -49
  1030. package/src/clis/boss/resume.ts +0 -157
  1031. package/src/clis/boss/search.ts +0 -162
  1032. package/src/clis/boss/send.ts +0 -54
  1033. package/src/clis/boss/stats.ts +0 -75
  1034. package/src/clis/boss/utils.ts +0 -287
  1035. package/src/clis/chaoxing/assignments.ts +0 -89
  1036. package/src/clis/chaoxing/exams.ts +0 -88
  1037. package/src/clis/chaoxing/utils.test.ts +0 -53
  1038. package/src/clis/chaoxing/utils.ts +0 -266
  1039. package/src/clis/chatgpt/ask.ts +0 -95
  1040. package/src/clis/chatgpt/ax.ts +0 -260
  1041. package/src/clis/chatgpt/model.ts +0 -27
  1042. package/src/clis/chatgpt/new.ts +0 -29
  1043. package/src/clis/chatgpt/read.ts +0 -35
  1044. package/src/clis/chatgpt/send.ts +0 -59
  1045. package/src/clis/chatgpt/status.ts +0 -27
  1046. package/src/clis/chatwise/ask.ts +0 -90
  1047. package/src/clis/chatwise/export.ts +0 -51
  1048. package/src/clis/chatwise/history.ts +0 -61
  1049. package/src/clis/chatwise/model.ts +0 -89
  1050. package/src/clis/chatwise/new.ts +0 -3
  1051. package/src/clis/chatwise/read.ts +0 -42
  1052. package/src/clis/chatwise/screenshot.ts +0 -3
  1053. package/src/clis/chatwise/send.ts +0 -53
  1054. package/src/clis/chatwise/status.ts +0 -3
  1055. package/src/clis/codex/ask.ts +0 -80
  1056. package/src/clis/codex/dump.ts +0 -3
  1057. package/src/clis/codex/export.ts +0 -42
  1058. package/src/clis/codex/extract-diff.ts +0 -48
  1059. package/src/clis/codex/history.ts +0 -47
  1060. package/src/clis/codex/model.ts +0 -59
  1061. package/src/clis/codex/new.ts +0 -3
  1062. package/src/clis/codex/read.ts +0 -37
  1063. package/src/clis/codex/screenshot.ts +0 -3
  1064. package/src/clis/codex/send.ts +0 -48
  1065. package/src/clis/codex/status.ts +0 -3
  1066. package/src/clis/coupang/add-to-cart.ts +0 -148
  1067. package/src/clis/coupang/search.ts +0 -464
  1068. package/src/clis/coupang/utils.test.ts +0 -78
  1069. package/src/clis/coupang/utils.ts +0 -302
  1070. package/src/clis/ctrip/search.test.ts +0 -73
  1071. package/src/clis/ctrip/search.ts +0 -111
  1072. package/src/clis/cursor/ask.ts +0 -82
  1073. package/src/clis/cursor/composer.ts +0 -51
  1074. package/src/clis/cursor/dump.ts +0 -3
  1075. package/src/clis/cursor/export.ts +0 -57
  1076. package/src/clis/cursor/extract-code.ts +0 -39
  1077. package/src/clis/cursor/history.ts +0 -47
  1078. package/src/clis/cursor/model.ts +0 -57
  1079. package/src/clis/cursor/new.ts +0 -3
  1080. package/src/clis/cursor/read.ts +0 -48
  1081. package/src/clis/cursor/screenshot.ts +0 -3
  1082. package/src/clis/cursor/send.ts +0 -48
  1083. package/src/clis/cursor/status.ts +0 -3
  1084. package/src/clis/devto/tag.yaml +0 -34
  1085. package/src/clis/devto/top.yaml +0 -29
  1086. package/src/clis/devto/user.yaml +0 -33
  1087. package/src/clis/dictionary/examples.yaml +0 -25
  1088. package/src/clis/dictionary/search.yaml +0 -27
  1089. package/src/clis/dictionary/synonyms.yaml +0 -25
  1090. package/src/clis/discord-app/channels.ts +0 -60
  1091. package/src/clis/discord-app/members.ts +0 -41
  1092. package/src/clis/discord-app/read.ts +0 -49
  1093. package/src/clis/discord-app/search.ts +0 -64
  1094. package/src/clis/discord-app/send.ts +0 -32
  1095. package/src/clis/discord-app/servers.ts +0 -39
  1096. package/src/clis/discord-app/status.ts +0 -18
  1097. package/src/clis/douban/book-hot.ts +0 -15
  1098. package/src/clis/douban/download.test.ts +0 -196
  1099. package/src/clis/douban/download.ts +0 -78
  1100. package/src/clis/douban/marks.ts +0 -135
  1101. package/src/clis/douban/movie-hot.ts +0 -15
  1102. package/src/clis/douban/photos.ts +0 -36
  1103. package/src/clis/douban/reviews.ts +0 -127
  1104. package/src/clis/douban/search.ts +0 -17
  1105. package/src/clis/douban/subject.yaml +0 -107
  1106. package/src/clis/douban/top250.yaml +0 -70
  1107. package/src/clis/douban/utils.test.ts +0 -97
  1108. package/src/clis/douban/utils.ts +0 -472
  1109. package/src/clis/doubao/ask.ts +0 -40
  1110. package/src/clis/doubao/detail.test.ts +0 -53
  1111. package/src/clis/doubao/detail.ts +0 -41
  1112. package/src/clis/doubao/history.test.ts +0 -45
  1113. package/src/clis/doubao/history.ts +0 -32
  1114. package/src/clis/doubao/meeting-summary.ts +0 -53
  1115. package/src/clis/doubao/meeting-transcript.ts +0 -48
  1116. package/src/clis/doubao/new.ts +0 -22
  1117. package/src/clis/doubao/read.ts +0 -20
  1118. package/src/clis/doubao/send.ts +0 -25
  1119. package/src/clis/doubao/status.ts +0 -27
  1120. package/src/clis/doubao/utils.test.ts +0 -45
  1121. package/src/clis/doubao/utils.ts +0 -1010
  1122. package/src/clis/doubao-app/ask.ts +0 -60
  1123. package/src/clis/doubao-app/dump.ts +0 -28
  1124. package/src/clis/doubao-app/new.ts +0 -21
  1125. package/src/clis/doubao-app/read.ts +0 -21
  1126. package/src/clis/doubao-app/screenshot.ts +0 -19
  1127. package/src/clis/doubao-app/send.ts +0 -30
  1128. package/src/clis/doubao-app/status.ts +0 -17
  1129. package/src/clis/doubao-app/utils.ts +0 -116
  1130. package/src/clis/douyin/_shared/browser-fetch.test.ts +0 -37
  1131. package/src/clis/douyin/_shared/browser-fetch.ts +0 -45
  1132. package/src/clis/douyin/_shared/creation-id.test.ts +0 -26
  1133. package/src/clis/douyin/_shared/creation-id.ts +0 -8
  1134. package/src/clis/douyin/_shared/imagex-upload.test.ts +0 -113
  1135. package/src/clis/douyin/_shared/imagex-upload.ts +0 -76
  1136. package/src/clis/douyin/_shared/public-api.ts +0 -84
  1137. package/src/clis/douyin/_shared/sts2.test.ts +0 -31
  1138. package/src/clis/douyin/_shared/sts2.ts +0 -28
  1139. package/src/clis/douyin/_shared/text-extra.test.ts +0 -42
  1140. package/src/clis/douyin/_shared/text-extra.ts +0 -33
  1141. package/src/clis/douyin/_shared/timing.test.ts +0 -38
  1142. package/src/clis/douyin/_shared/timing.ts +0 -22
  1143. package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +0 -102
  1144. package/src/clis/douyin/_shared/tos-upload.test.ts +0 -281
  1145. package/src/clis/douyin/_shared/tos-upload.ts +0 -444
  1146. package/src/clis/douyin/_shared/transcode.test.ts +0 -115
  1147. package/src/clis/douyin/_shared/transcode.ts +0 -78
  1148. package/src/clis/douyin/_shared/types.ts +0 -29
  1149. package/src/clis/douyin/activities.test.ts +0 -65
  1150. package/src/clis/douyin/activities.ts +0 -32
  1151. package/src/clis/douyin/collections.test.ts +0 -59
  1152. package/src/clis/douyin/collections.ts +0 -25
  1153. package/src/clis/douyin/delete.test.ts +0 -12
  1154. package/src/clis/douyin/delete.ts +0 -20
  1155. package/src/clis/douyin/draft.test.ts +0 -452
  1156. package/src/clis/douyin/draft.ts +0 -446
  1157. package/src/clis/douyin/drafts.test.ts +0 -12
  1158. package/src/clis/douyin/drafts.ts +0 -27
  1159. package/src/clis/douyin/hashtag.test.ts +0 -68
  1160. package/src/clis/douyin/hashtag.ts +0 -64
  1161. package/src/clis/douyin/location.test.ts +0 -26
  1162. package/src/clis/douyin/location.ts +0 -27
  1163. package/src/clis/douyin/profile.test.ts +0 -54
  1164. package/src/clis/douyin/profile.ts +0 -44
  1165. package/src/clis/douyin/publish.test.ts +0 -45
  1166. package/src/clis/douyin/publish.ts +0 -340
  1167. package/src/clis/douyin/stats.test.ts +0 -25
  1168. package/src/clis/douyin/stats.ts +0 -30
  1169. package/src/clis/douyin/update.test.ts +0 -12
  1170. package/src/clis/douyin/update.ts +0 -43
  1171. package/src/clis/douyin/user-videos.test.ts +0 -122
  1172. package/src/clis/douyin/user-videos.ts +0 -101
  1173. package/src/clis/douyin/videos.test.ts +0 -62
  1174. package/src/clis/douyin/videos.ts +0 -83
  1175. package/src/clis/facebook/add-friend.yaml +0 -43
  1176. package/src/clis/facebook/events.yaml +0 -44
  1177. package/src/clis/facebook/feed.yaml +0 -63
  1178. package/src/clis/facebook/friends.yaml +0 -42
  1179. package/src/clis/facebook/groups.yaml +0 -50
  1180. package/src/clis/facebook/join-group.yaml +0 -44
  1181. package/src/clis/facebook/memories.yaml +0 -39
  1182. package/src/clis/facebook/notifications.yaml +0 -40
  1183. package/src/clis/facebook/profile.yaml +0 -37
  1184. package/src/clis/facebook/search.test.ts +0 -68
  1185. package/src/clis/facebook/search.yaml +0 -47
  1186. package/src/clis/gemini/ask.test.ts +0 -116
  1187. package/src/clis/gemini/ask.ts +0 -53
  1188. package/src/clis/gemini/image.ts +0 -115
  1189. package/src/clis/gemini/new.ts +0 -22
  1190. package/src/clis/gemini/reply-state.test.ts +0 -708
  1191. package/src/clis/gemini/utils.test.ts +0 -218
  1192. package/src/clis/gemini/utils.ts +0 -1051
  1193. package/src/clis/google/news.ts +0 -66
  1194. package/src/clis/google/search.ts +0 -133
  1195. package/src/clis/google/suggest.ts +0 -40
  1196. package/src/clis/google/trends.ts +0 -44
  1197. package/src/clis/google/utils.test.ts +0 -82
  1198. package/src/clis/google/utils.ts +0 -24
  1199. package/src/clis/grok/ask.test.ts +0 -78
  1200. package/src/clis/grok/ask.ts +0 -334
  1201. package/src/clis/hackernews/ask.yaml +0 -38
  1202. package/src/clis/hackernews/best.yaml +0 -38
  1203. package/src/clis/hackernews/jobs.yaml +0 -36
  1204. package/src/clis/hackernews/new.yaml +0 -38
  1205. package/src/clis/hackernews/search.yaml +0 -44
  1206. package/src/clis/hackernews/show.yaml +0 -38
  1207. package/src/clis/hackernews/top.yaml +0 -38
  1208. package/src/clis/hackernews/user.yaml +0 -25
  1209. package/src/clis/hf/top.ts +0 -141
  1210. package/src/clis/hupu/detail.ts +0 -126
  1211. package/src/clis/hupu/hot.yaml +0 -43
  1212. package/src/clis/hupu/like.ts +0 -76
  1213. package/src/clis/hupu/reply.ts +0 -76
  1214. package/src/clis/hupu/search.ts +0 -95
  1215. package/src/clis/hupu/unlike.ts +0 -76
  1216. package/src/clis/hupu/utils.ts +0 -381
  1217. package/src/clis/imdb/person.ts +0 -232
  1218. package/src/clis/imdb/reviews.ts +0 -111
  1219. package/src/clis/imdb/search.ts +0 -179
  1220. package/src/clis/imdb/title.ts +0 -121
  1221. package/src/clis/imdb/top.ts +0 -67
  1222. package/src/clis/imdb/trending.ts +0 -66
  1223. package/src/clis/imdb/utils.test.ts +0 -117
  1224. package/src/clis/imdb/utils.ts +0 -305
  1225. package/src/clis/instagram/_shared/private-publish.test.ts +0 -827
  1226. package/src/clis/instagram/_shared/private-publish.ts +0 -1303
  1227. package/src/clis/instagram/_shared/protocol-capture.test.ts +0 -148
  1228. package/src/clis/instagram/_shared/protocol-capture.ts +0 -321
  1229. package/src/clis/instagram/_shared/runtime-info.ts +0 -91
  1230. package/src/clis/instagram/comment.yaml +0 -52
  1231. package/src/clis/instagram/download.test.ts +0 -159
  1232. package/src/clis/instagram/download.ts +0 -286
  1233. package/src/clis/instagram/explore.yaml +0 -43
  1234. package/src/clis/instagram/follow.yaml +0 -41
  1235. package/src/clis/instagram/followers.yaml +0 -51
  1236. package/src/clis/instagram/following.yaml +0 -51
  1237. package/src/clis/instagram/like.yaml +0 -46
  1238. package/src/clis/instagram/note.test.ts +0 -96
  1239. package/src/clis/instagram/note.ts +0 -254
  1240. package/src/clis/instagram/post.test.ts +0 -1716
  1241. package/src/clis/instagram/post.ts +0 -1620
  1242. package/src/clis/instagram/profile.yaml +0 -42
  1243. package/src/clis/instagram/reel.test.ts +0 -191
  1244. package/src/clis/instagram/reel.ts +0 -886
  1245. package/src/clis/instagram/save.yaml +0 -46
  1246. package/src/clis/instagram/saved.yaml +0 -40
  1247. package/src/clis/instagram/search.yaml +0 -44
  1248. package/src/clis/instagram/story.test.ts +0 -191
  1249. package/src/clis/instagram/story.ts +0 -151
  1250. package/src/clis/instagram/unfollow.yaml +0 -38
  1251. package/src/clis/instagram/unlike.yaml +0 -46
  1252. package/src/clis/instagram/unsave.yaml +0 -46
  1253. package/src/clis/instagram/user.yaml +0 -54
  1254. package/src/clis/jd/item.test.ts +0 -52
  1255. package/src/clis/jd/item.ts +0 -104
  1256. package/src/clis/jike/comment.ts +0 -112
  1257. package/src/clis/jike/create.ts +0 -112
  1258. package/src/clis/jike/feed.ts +0 -73
  1259. package/src/clis/jike/like.ts +0 -64
  1260. package/src/clis/jike/notifications.ts +0 -184
  1261. package/src/clis/jike/post.yaml +0 -59
  1262. package/src/clis/jike/repost.ts +0 -113
  1263. package/src/clis/jike/search.ts +0 -73
  1264. package/src/clis/jike/topic.yaml +0 -53
  1265. package/src/clis/jike/user.yaml +0 -52
  1266. package/src/clis/jike/utils.ts +0 -36
  1267. package/src/clis/jimeng/generate.yaml +0 -85
  1268. package/src/clis/jimeng/history.yaml +0 -46
  1269. package/src/clis/linkedin/search.ts +0 -417
  1270. package/src/clis/linkedin/timeline.test.ts +0 -99
  1271. package/src/clis/linkedin/timeline.ts +0 -532
  1272. package/src/clis/linux-do/categories.yaml +0 -70
  1273. package/src/clis/linux-do/category.ts +0 -37
  1274. package/src/clis/linux-do/feed.test.ts +0 -132
  1275. package/src/clis/linux-do/feed.ts +0 -501
  1276. package/src/clis/linux-do/hot.ts +0 -26
  1277. package/src/clis/linux-do/latest.ts +0 -19
  1278. package/src/clis/linux-do/search.yaml +0 -48
  1279. package/src/clis/linux-do/tags.yaml +0 -41
  1280. package/src/clis/linux-do/topic.yaml +0 -77
  1281. package/src/clis/linux-do/user-posts.yaml +0 -67
  1282. package/src/clis/linux-do/user-topics.yaml +0 -54
  1283. package/src/clis/lobsters/active.yaml +0 -29
  1284. package/src/clis/lobsters/hot.yaml +0 -29
  1285. package/src/clis/lobsters/newest.yaml +0 -29
  1286. package/src/clis/lobsters/tag.yaml +0 -34
  1287. package/src/clis/medium/feed.ts +0 -16
  1288. package/src/clis/medium/search.ts +0 -16
  1289. package/src/clis/medium/user.ts +0 -16
  1290. package/src/clis/medium/utils.ts +0 -84
  1291. package/src/clis/notebooklm/compat.test.ts +0 -19
  1292. package/src/clis/notebooklm/current.ts +0 -37
  1293. package/src/clis/notebooklm/get.ts +0 -51
  1294. package/src/clis/notebooklm/history.test.ts +0 -70
  1295. package/src/clis/notebooklm/history.ts +0 -34
  1296. package/src/clis/notebooklm/list.ts +0 -40
  1297. package/src/clis/notebooklm/note-list.test.ts +0 -64
  1298. package/src/clis/notebooklm/note-list.ts +0 -40
  1299. package/src/clis/notebooklm/notes-get.test.ts +0 -88
  1300. package/src/clis/notebooklm/notes-get.ts +0 -65
  1301. package/src/clis/notebooklm/open.test.ts +0 -78
  1302. package/src/clis/notebooklm/open.ts +0 -61
  1303. package/src/clis/notebooklm/rpc.test.ts +0 -126
  1304. package/src/clis/notebooklm/rpc.ts +0 -286
  1305. package/src/clis/notebooklm/shared.ts +0 -98
  1306. package/src/clis/notebooklm/source-fulltext.test.ts +0 -123
  1307. package/src/clis/notebooklm/source-fulltext.ts +0 -67
  1308. package/src/clis/notebooklm/source-get.test.ts +0 -100
  1309. package/src/clis/notebooklm/source-get.ts +0 -58
  1310. package/src/clis/notebooklm/source-guide.test.ts +0 -121
  1311. package/src/clis/notebooklm/source-guide.ts +0 -67
  1312. package/src/clis/notebooklm/source-list.ts +0 -43
  1313. package/src/clis/notebooklm/status.ts +0 -33
  1314. package/src/clis/notebooklm/summary.test.ts +0 -94
  1315. package/src/clis/notebooklm/summary.ts +0 -43
  1316. package/src/clis/notebooklm/utils.test.ts +0 -446
  1317. package/src/clis/notebooklm/utils.ts +0 -902
  1318. package/src/clis/notion/export.ts +0 -36
  1319. package/src/clis/notion/favorites.ts +0 -87
  1320. package/src/clis/notion/new.ts +0 -39
  1321. package/src/clis/notion/read.ts +0 -33
  1322. package/src/clis/notion/search.ts +0 -54
  1323. package/src/clis/notion/sidebar.ts +0 -44
  1324. package/src/clis/notion/status.ts +0 -18
  1325. package/src/clis/notion/write.ts +0 -45
  1326. package/src/clis/ones/common.ts +0 -187
  1327. package/src/clis/ones/enrich-tasks.ts +0 -47
  1328. package/src/clis/ones/login.ts +0 -103
  1329. package/src/clis/ones/logout.ts +0 -19
  1330. package/src/clis/ones/me.ts +0 -34
  1331. package/src/clis/ones/my-tasks.ts +0 -148
  1332. package/src/clis/ones/resolve-labels.ts +0 -80
  1333. package/src/clis/ones/task-helpers.test.ts +0 -14
  1334. package/src/clis/ones/task-helpers.ts +0 -214
  1335. package/src/clis/ones/task.ts +0 -79
  1336. package/src/clis/ones/tasks.ts +0 -92
  1337. package/src/clis/ones/token-info.ts +0 -46
  1338. package/src/clis/ones/worklog.test.ts +0 -24
  1339. package/src/clis/ones/worklog.ts +0 -306
  1340. package/src/clis/paperreview/commands.test.ts +0 -283
  1341. package/src/clis/paperreview/feedback.ts +0 -64
  1342. package/src/clis/paperreview/review.ts +0 -47
  1343. package/src/clis/paperreview/submit.ts +0 -119
  1344. package/src/clis/paperreview/utils.test.ts +0 -68
  1345. package/src/clis/paperreview/utils.ts +0 -276
  1346. package/src/clis/pixiv/detail.yaml +0 -49
  1347. package/src/clis/pixiv/download.test.ts +0 -114
  1348. package/src/clis/pixiv/download.ts +0 -91
  1349. package/src/clis/pixiv/illusts.test.ts +0 -115
  1350. package/src/clis/pixiv/illusts.ts +0 -78
  1351. package/src/clis/pixiv/ranking.yaml +0 -53
  1352. package/src/clis/pixiv/search.test.ts +0 -97
  1353. package/src/clis/pixiv/search.ts +0 -53
  1354. package/src/clis/pixiv/test-utils.ts +0 -29
  1355. package/src/clis/pixiv/user.yaml +0 -46
  1356. package/src/clis/pixiv/utils.ts +0 -62
  1357. package/src/clis/producthunt/browse.ts +0 -109
  1358. package/src/clis/producthunt/hot.ts +0 -127
  1359. package/src/clis/producthunt/posts.ts +0 -29
  1360. package/src/clis/producthunt/today.ts +0 -37
  1361. package/src/clis/producthunt/utils.test.ts +0 -72
  1362. package/src/clis/producthunt/utils.ts +0 -122
  1363. package/src/clis/reddit/comment.ts +0 -60
  1364. package/src/clis/reddit/frontpage.yaml +0 -30
  1365. package/src/clis/reddit/hot.yaml +0 -47
  1366. package/src/clis/reddit/popular.yaml +0 -40
  1367. package/src/clis/reddit/read.test.ts +0 -34
  1368. package/src/clis/reddit/read.ts +0 -186
  1369. package/src/clis/reddit/save.ts +0 -54
  1370. package/src/clis/reddit/saved.ts +0 -51
  1371. package/src/clis/reddit/search.yaml +0 -61
  1372. package/src/clis/reddit/subreddit.yaml +0 -50
  1373. package/src/clis/reddit/subscribe.ts +0 -53
  1374. package/src/clis/reddit/upvote.ts +0 -67
  1375. package/src/clis/reddit/upvoted.ts +0 -51
  1376. package/src/clis/reddit/user-comments.yaml +0 -46
  1377. package/src/clis/reddit/user-posts.yaml +0 -44
  1378. package/src/clis/reddit/user.yaml +0 -40
  1379. package/src/clis/reuters/search.ts +0 -51
  1380. package/src/clis/sinablog/article.ts +0 -15
  1381. package/src/clis/sinablog/hot.ts +0 -15
  1382. package/src/clis/sinablog/search.ts +0 -56
  1383. package/src/clis/sinablog/user.ts +0 -16
  1384. package/src/clis/sinablog/utils.ts +0 -197
  1385. package/src/clis/sinafinance/news.ts +0 -76
  1386. package/src/clis/sinafinance/rolling-news.ts +0 -42
  1387. package/src/clis/sinafinance/stock-rank.ts +0 -68
  1388. package/src/clis/sinafinance/stock.ts +0 -127
  1389. package/src/clis/smzdm/search.ts +0 -56
  1390. package/src/clis/spotify/spotify.ts +0 -328
  1391. package/src/clis/spotify/utils.test.ts +0 -87
  1392. package/src/clis/spotify/utils.ts +0 -92
  1393. package/src/clis/stackoverflow/bounties.yaml +0 -29
  1394. package/src/clis/stackoverflow/hot.yaml +0 -28
  1395. package/src/clis/stackoverflow/search.yaml +0 -33
  1396. package/src/clis/stackoverflow/unanswered.yaml +0 -28
  1397. package/src/clis/steam/top-sellers.yaml +0 -29
  1398. package/src/clis/substack/feed.ts +0 -16
  1399. package/src/clis/substack/publication.ts +0 -16
  1400. package/src/clis/substack/search.ts +0 -92
  1401. package/src/clis/substack/utils.test.ts +0 -52
  1402. package/src/clis/substack/utils.ts +0 -141
  1403. package/src/clis/tieba/commands.test.ts +0 -86
  1404. package/src/clis/tieba/hot.ts +0 -52
  1405. package/src/clis/tieba/posts.ts +0 -108
  1406. package/src/clis/tieba/read.ts +0 -158
  1407. package/src/clis/tieba/search.ts +0 -119
  1408. package/src/clis/tieba/utils.test.ts +0 -322
  1409. package/src/clis/tieba/utils.ts +0 -348
  1410. package/src/clis/tiktok/comment.yaml +0 -66
  1411. package/src/clis/tiktok/explore.yaml +0 -39
  1412. package/src/clis/tiktok/follow.yaml +0 -39
  1413. package/src/clis/tiktok/following.yaml +0 -46
  1414. package/src/clis/tiktok/friends.yaml +0 -47
  1415. package/src/clis/tiktok/like.yaml +0 -38
  1416. package/src/clis/tiktok/live.yaml +0 -51
  1417. package/src/clis/tiktok/notifications.yaml +0 -52
  1418. package/src/clis/tiktok/profile.yaml +0 -45
  1419. package/src/clis/tiktok/save.yaml +0 -34
  1420. package/src/clis/tiktok/search.yaml +0 -47
  1421. package/src/clis/tiktok/unfollow.yaml +0 -44
  1422. package/src/clis/tiktok/unlike.yaml +0 -38
  1423. package/src/clis/tiktok/unsave.yaml +0 -36
  1424. package/src/clis/tiktok/user.yaml +0 -44
  1425. package/src/clis/twitter/accept.ts +0 -214
  1426. package/src/clis/twitter/article.ts +0 -170
  1427. package/src/clis/twitter/block.ts +0 -93
  1428. package/src/clis/twitter/bookmark.ts +0 -68
  1429. package/src/clis/twitter/bookmarks.ts +0 -202
  1430. package/src/clis/twitter/delete.ts +0 -78
  1431. package/src/clis/twitter/download.ts +0 -118
  1432. package/src/clis/twitter/follow.ts +0 -70
  1433. package/src/clis/twitter/followers.ts +0 -116
  1434. package/src/clis/twitter/following.ts +0 -109
  1435. package/src/clis/twitter/hide-reply.ts +0 -71
  1436. package/src/clis/twitter/like.ts +0 -74
  1437. package/src/clis/twitter/likes.test.ts +0 -91
  1438. package/src/clis/twitter/likes.ts +0 -256
  1439. package/src/clis/twitter/notifications.ts +0 -136
  1440. package/src/clis/twitter/post.test.ts +0 -157
  1441. package/src/clis/twitter/post.ts +0 -110
  1442. package/src/clis/twitter/profile.ts +0 -108
  1443. package/src/clis/twitter/reply-dm.ts +0 -194
  1444. package/src/clis/twitter/reply.test.ts +0 -177
  1445. package/src/clis/twitter/reply.ts +0 -309
  1446. package/src/clis/twitter/search.test.ts +0 -265
  1447. package/src/clis/twitter/search.ts +0 -185
  1448. package/src/clis/twitter/shared.ts +0 -45
  1449. package/src/clis/twitter/thread.ts +0 -182
  1450. package/src/clis/twitter/timeline.test.ts +0 -109
  1451. package/src/clis/twitter/timeline.ts +0 -248
  1452. package/src/clis/twitter/trending.ts +0 -66
  1453. package/src/clis/twitter/unblock.ts +0 -76
  1454. package/src/clis/twitter/unbookmark.ts +0 -67
  1455. package/src/clis/twitter/unfollow.ts +0 -76
  1456. package/src/clis/v2ex/daily.ts +0 -106
  1457. package/src/clis/v2ex/hot.yaml +0 -28
  1458. package/src/clis/v2ex/latest.yaml +0 -28
  1459. package/src/clis/v2ex/me.ts +0 -104
  1460. package/src/clis/v2ex/member.yaml +0 -29
  1461. package/src/clis/v2ex/node.yaml +0 -34
  1462. package/src/clis/v2ex/nodes.yaml +0 -31
  1463. package/src/clis/v2ex/notifications.ts +0 -76
  1464. package/src/clis/v2ex/replies.yaml +0 -32
  1465. package/src/clis/v2ex/topic.yaml +0 -33
  1466. package/src/clis/v2ex/user.yaml +0 -34
  1467. package/src/clis/web/read.ts +0 -210
  1468. package/src/clis/weibo/comments.ts +0 -54
  1469. package/src/clis/weibo/feed.ts +0 -57
  1470. package/src/clis/weibo/hot.ts +0 -39
  1471. package/src/clis/weibo/me.ts +0 -77
  1472. package/src/clis/weibo/post.ts +0 -77
  1473. package/src/clis/weibo/search.ts +0 -78
  1474. package/src/clis/weibo/user.ts +0 -64
  1475. package/src/clis/weibo/utils.ts +0 -32
  1476. package/src/clis/weixin/download.ts +0 -382
  1477. package/src/clis/weread/book.ts +0 -271
  1478. package/src/clis/weread/commands.test.ts +0 -466
  1479. package/src/clis/weread/highlights.ts +0 -25
  1480. package/src/clis/weread/notebooks.ts +0 -23
  1481. package/src/clis/weread/notes.ts +0 -31
  1482. package/src/clis/weread/private-api-regression.test.ts +0 -435
  1483. package/src/clis/weread/ranking.ts +0 -29
  1484. package/src/clis/weread/search-regression.test.ts +0 -440
  1485. package/src/clis/weread/search.ts +0 -207
  1486. package/src/clis/weread/shelf.ts +0 -84
  1487. package/src/clis/weread/utils.test.ts +0 -153
  1488. package/src/clis/weread/utils.ts +0 -390
  1489. package/src/clis/wikipedia/random.ts +0 -19
  1490. package/src/clis/wikipedia/search.ts +0 -38
  1491. package/src/clis/wikipedia/summary.ts +0 -23
  1492. package/src/clis/wikipedia/trending.ts +0 -41
  1493. package/src/clis/wikipedia/utils.ts +0 -51
  1494. package/src/clis/xianyu/chat.test.ts +0 -20
  1495. package/src/clis/xianyu/chat.ts +0 -175
  1496. package/src/clis/xianyu/item.test.ts +0 -67
  1497. package/src/clis/xianyu/item.ts +0 -172
  1498. package/src/clis/xianyu/search.test.ts +0 -22
  1499. package/src/clis/xianyu/search.ts +0 -151
  1500. package/src/clis/xianyu/utils.ts +0 -9
  1501. package/src/clis/xiaoe/catalog.yaml +0 -129
  1502. package/src/clis/xiaoe/content.yaml +0 -43
  1503. package/src/clis/xiaoe/courses.yaml +0 -73
  1504. package/src/clis/xiaoe/detail.yaml +0 -39
  1505. package/src/clis/xiaoe/play-url.yaml +0 -124
  1506. package/src/clis/xiaohongshu/comments.test.ts +0 -171
  1507. package/src/clis/xiaohongshu/comments.ts +0 -140
  1508. package/src/clis/xiaohongshu/creator-note-detail.test.ts +0 -273
  1509. package/src/clis/xiaohongshu/creator-note-detail.ts +0 -447
  1510. package/src/clis/xiaohongshu/creator-notes-summary.test.ts +0 -54
  1511. package/src/clis/xiaohongshu/creator-notes-summary.ts +0 -120
  1512. package/src/clis/xiaohongshu/creator-notes.test.ts +0 -212
  1513. package/src/clis/xiaohongshu/creator-notes.ts +0 -295
  1514. package/src/clis/xiaohongshu/creator-profile.ts +0 -59
  1515. package/src/clis/xiaohongshu/creator-stats.ts +0 -80
  1516. package/src/clis/xiaohongshu/download.test.ts +0 -94
  1517. package/src/clis/xiaohongshu/download.ts +0 -174
  1518. package/src/clis/xiaohongshu/feed.yaml +0 -31
  1519. package/src/clis/xiaohongshu/note-helpers.ts +0 -25
  1520. package/src/clis/xiaohongshu/note.test.ts +0 -213
  1521. package/src/clis/xiaohongshu/note.ts +0 -104
  1522. package/src/clis/xiaohongshu/notifications.yaml +0 -37
  1523. package/src/clis/xiaohongshu/publish.test.ts +0 -228
  1524. package/src/clis/xiaohongshu/publish.ts +0 -598
  1525. package/src/clis/xiaohongshu/search.test.ts +0 -191
  1526. package/src/clis/xiaohongshu/search.ts +0 -143
  1527. package/src/clis/xiaohongshu/user-helpers.test.ts +0 -129
  1528. package/src/clis/xiaohongshu/user-helpers.ts +0 -89
  1529. package/src/clis/xiaohongshu/user.ts +0 -64
  1530. package/src/clis/xiaoyuzhou/episode.ts +0 -28
  1531. package/src/clis/xiaoyuzhou/podcast-episodes.ts +0 -36
  1532. package/src/clis/xiaoyuzhou/podcast.ts +0 -27
  1533. package/src/clis/xiaoyuzhou/utils.test.ts +0 -122
  1534. package/src/clis/xiaoyuzhou/utils.ts +0 -65
  1535. package/src/clis/xueqiu/comments.test.ts +0 -823
  1536. package/src/clis/xueqiu/comments.ts +0 -461
  1537. package/src/clis/xueqiu/danjuan-utils.test.ts +0 -49
  1538. package/src/clis/xueqiu/danjuan-utils.ts +0 -176
  1539. package/src/clis/xueqiu/earnings-date.yaml +0 -69
  1540. package/src/clis/xueqiu/feed.yaml +0 -53
  1541. package/src/clis/xueqiu/fund-holdings.ts +0 -32
  1542. package/src/clis/xueqiu/fund-snapshot.ts +0 -27
  1543. package/src/clis/xueqiu/hot-stock.yaml +0 -49
  1544. package/src/clis/xueqiu/hot.yaml +0 -46
  1545. package/src/clis/xueqiu/search.yaml +0 -55
  1546. package/src/clis/xueqiu/stock.yaml +0 -69
  1547. package/src/clis/xueqiu/watchlist.yaml +0 -46
  1548. package/src/clis/yahoo-finance/quote.ts +0 -72
  1549. package/src/clis/yollomi/background.ts +0 -48
  1550. package/src/clis/yollomi/edit.ts +0 -58
  1551. package/src/clis/yollomi/face-swap.ts +0 -45
  1552. package/src/clis/yollomi/generate.ts +0 -95
  1553. package/src/clis/yollomi/models.ts +0 -38
  1554. package/src/clis/yollomi/object-remover.ts +0 -44
  1555. package/src/clis/yollomi/remove-bg.ts +0 -40
  1556. package/src/clis/yollomi/restore.ts +0 -40
  1557. package/src/clis/yollomi/try-on.ts +0 -48
  1558. package/src/clis/yollomi/upload.ts +0 -78
  1559. package/src/clis/yollomi/upscale.ts +0 -49
  1560. package/src/clis/yollomi/utils.ts +0 -202
  1561. package/src/clis/yollomi/video.ts +0 -61
  1562. package/src/clis/youtube/channel.ts +0 -155
  1563. package/src/clis/youtube/comments.ts +0 -97
  1564. package/src/clis/youtube/search.ts +0 -99
  1565. package/src/clis/youtube/transcript-group.test.ts +0 -108
  1566. package/src/clis/youtube/transcript-group.ts +0 -287
  1567. package/src/clis/youtube/transcript.ts +0 -279
  1568. package/src/clis/youtube/utils.test.ts +0 -43
  1569. package/src/clis/youtube/utils.ts +0 -97
  1570. package/src/clis/youtube/video.ts +0 -118
  1571. package/src/clis/yuanbao/ask.test.ts +0 -156
  1572. package/src/clis/yuanbao/ask.ts +0 -522
  1573. package/src/clis/yuanbao/new.test.ts +0 -36
  1574. package/src/clis/yuanbao/new.ts +0 -81
  1575. package/src/clis/yuanbao/shared.ts +0 -57
  1576. package/src/clis/zhihu/download.test.ts +0 -14
  1577. package/src/clis/zhihu/download.ts +0 -87
  1578. package/src/clis/zhihu/hot.yaml +0 -46
  1579. package/src/clis/zhihu/question.test.ts +0 -96
  1580. package/src/clis/zhihu/question.ts +0 -63
  1581. package/src/clis/zhihu/search.yaml +0 -59
  1582. package/src/clis/zsxq/dynamics.ts +0 -60
  1583. package/src/clis/zsxq/groups.ts +0 -41
  1584. package/src/clis/zsxq/search.test.ts +0 -29
  1585. package/src/clis/zsxq/search.ts +0 -54
  1586. package/src/clis/zsxq/topic.test.ts +0 -34
  1587. package/src/clis/zsxq/topic.ts +0 -68
  1588. package/src/clis/zsxq/topics.test.ts +0 -29
  1589. package/src/clis/zsxq/topics.ts +0 -36
  1590. package/src/clis/zsxq/utils.ts +0 -351
  1591. package/src/commanderAdapter.test.ts +0 -315
  1592. package/src/commanderAdapter.ts +0 -319
  1593. package/src/commands/daemon.test.ts +0 -204
  1594. package/src/commands/daemon.ts +0 -87
  1595. package/src/completion.test.ts +0 -30
  1596. package/src/completion.ts +0 -132
  1597. package/src/constants.ts +0 -41
  1598. package/src/daemon.test.ts +0 -88
  1599. package/src/daemon.ts +0 -339
  1600. package/src/discovery.ts +0 -328
  1601. package/src/doctor.test.ts +0 -111
  1602. package/src/doctor.ts +0 -163
  1603. package/src/download/article-download.ts +0 -272
  1604. package/src/download/index.test.ts +0 -135
  1605. package/src/download/index.ts +0 -422
  1606. package/src/download/media-download.ts +0 -180
  1607. package/src/download/progress.ts +0 -125
  1608. package/src/electron-apps.test.ts +0 -50
  1609. package/src/electron-apps.ts +0 -97
  1610. package/src/engine.test.ts +0 -323
  1611. package/src/errors.test.ts +0 -79
  1612. package/src/errors.ts +0 -162
  1613. package/src/execution.test.ts +0 -47
  1614. package/src/execution.ts +0 -235
  1615. package/src/explore.ts +0 -502
  1616. package/src/extension-manifest-regression.test.ts +0 -18
  1617. package/src/external-clis.yaml +0 -56
  1618. package/src/external.test.ts +0 -97
  1619. package/src/external.ts +0 -246
  1620. package/src/generate.ts +0 -161
  1621. package/src/hooks.test.ts +0 -126
  1622. package/src/hooks.ts +0 -91
  1623. package/src/idle-manager.ts +0 -60
  1624. package/src/interceptor.test.ts +0 -94
  1625. package/src/interceptor.ts +0 -204
  1626. package/src/launcher.test.ts +0 -181
  1627. package/src/launcher.ts +0 -263
  1628. package/src/logger.ts +0 -57
  1629. package/src/main.ts +0 -66
  1630. package/src/node-network.test.ts +0 -93
  1631. package/src/node-network.ts +0 -213
  1632. package/src/output.test.ts +0 -69
  1633. package/src/output.ts +0 -145
  1634. package/src/pipeline/executor.test.ts +0 -191
  1635. package/src/pipeline/executor.ts +0 -110
  1636. package/src/pipeline/registry.ts +0 -62
  1637. package/src/pipeline/steps/browser.ts +0 -76
  1638. package/src/pipeline/steps/download.test.ts +0 -135
  1639. package/src/pipeline/steps/download.ts +0 -320
  1640. package/src/pipeline/steps/fetch.test.ts +0 -179
  1641. package/src/pipeline/steps/fetch.ts +0 -160
  1642. package/src/pipeline/steps/intercept.ts +0 -55
  1643. package/src/pipeline/steps/tap.ts +0 -100
  1644. package/src/pipeline/steps/transform.ts +0 -71
  1645. package/src/pipeline/template.test.ts +0 -177
  1646. package/src/pipeline/template.ts +0 -269
  1647. package/src/pipeline/transform.test.ts +0 -140
  1648. package/src/plugin-manifest.test.ts +0 -223
  1649. package/src/plugin-manifest.ts +0 -206
  1650. package/src/plugin-scaffold.test.ts +0 -98
  1651. package/src/plugin-scaffold.ts +0 -170
  1652. package/src/plugin.test.ts +0 -1427
  1653. package/src/plugin.ts +0 -1537
  1654. package/src/record.test.ts +0 -362
  1655. package/src/record.ts +0 -824
  1656. package/src/registry-api.ts +0 -14
  1657. package/src/registry.test.ts +0 -133
  1658. package/src/registry.ts +0 -160
  1659. package/src/runtime-detect.test.ts +0 -30
  1660. package/src/runtime-detect.ts +0 -36
  1661. package/src/runtime.ts +0 -86
  1662. package/src/scripts/framework.ts +0 -20
  1663. package/src/scripts/interact.ts +0 -22
  1664. package/src/scripts/store.ts +0 -40
  1665. package/src/serialization.test.ts +0 -44
  1666. package/src/serialization.ts +0 -92
  1667. package/src/snapshotFormatter.test.ts +0 -579
  1668. package/src/snapshotFormatter.ts +0 -359
  1669. package/src/synthesize.ts +0 -296
  1670. package/src/tui.test.ts +0 -23
  1671. package/src/tui.ts +0 -237
  1672. package/src/types.ts +0 -95
  1673. package/src/update-check.ts +0 -114
  1674. package/src/utils.ts +0 -44
  1675. package/src/validate.ts +0 -103
  1676. package/src/verify.ts +0 -93
  1677. package/src/version.ts +0 -18
  1678. package/src/weixin-download.test.ts +0 -91
  1679. package/src/yaml-schema.ts +0 -48
  1680. package/tests/e2e/band-auth.test.ts +0 -20
  1681. package/tests/e2e/browser-auth-helpers.ts +0 -18
  1682. package/tests/e2e/browser-auth.test.ts +0 -150
  1683. package/tests/e2e/browser-public-extended.test.ts +0 -166
  1684. package/tests/e2e/browser-public.test.ts +0 -417
  1685. package/tests/e2e/helpers.ts +0 -64
  1686. package/tests/e2e/management.test.ts +0 -106
  1687. package/tests/e2e/output-formats.test.ts +0 -44
  1688. package/tests/e2e/plugin-management.test.ts +0 -140
  1689. package/tests/e2e/public-commands.test.ts +0 -569
  1690. package/tests/smoke/api-health.test.ts +0 -131
  1691. package/tsconfig.json +0 -17
  1692. package/vitest.config.ts +0 -50
  1693. /package/dist/{browser.test.d.ts → clis/gemini/deep-research-result.test.d.ts} +0 -0
  1694. /package/dist/{browser/cdp.test.d.ts → clis/gemini/deep-research.test.d.ts} +0 -0
  1695. /package/dist/{browser/daemon-client.test.d.ts → clis/hupu/mentions.d.ts} +0 -0
  1696. /package/dist/{browser/dom-helpers.test.d.ts → clis/lesswrong/comments.d.ts} +0 -0
  1697. /package/dist/{browser/page.test.d.ts → clis/lesswrong/curated.d.ts} +0 -0
  1698. /package/dist/{browser/stealth.test.d.ts → clis/lesswrong/frontpage.d.ts} +0 -0
  1699. /package/dist/{build-manifest.test.d.ts → clis/lesswrong/new.d.ts} +0 -0
  1700. /package/dist/{capabilityRouting.test.d.ts → clis/lesswrong/read.d.ts} +0 -0
  1701. /package/dist/{cli.test.d.ts → clis/lesswrong/sequences.d.ts} +0 -0
  1702. /package/dist/{commanderAdapter.test.d.ts → clis/lesswrong/shortform.d.ts} +0 -0
  1703. /package/dist/{commands/daemon.test.d.ts → clis/lesswrong/tag.d.ts} +0 -0
  1704. /package/dist/{completion.test.d.ts → clis/lesswrong/tags.d.ts} +0 -0
  1705. /package/dist/{daemon.test.d.ts → clis/lesswrong/top-month.d.ts} +0 -0
  1706. /package/dist/{doctor.test.d.ts → clis/lesswrong/top-week.d.ts} +0 -0
  1707. /package/dist/{download/index.test.d.ts → clis/lesswrong/top-year.d.ts} +0 -0
  1708. /package/dist/{electron-apps.test.d.ts → clis/lesswrong/top.d.ts} +0 -0
  1709. /package/dist/{engine.test.d.ts → clis/lesswrong/user-posts.d.ts} +0 -0
  1710. /package/dist/{errors.test.d.ts → clis/lesswrong/user.d.ts} +0 -0
  1711. /package/dist/{analysis.d.ts → src/analysis.d.ts} +0 -0
  1712. /package/dist/{analysis.js → src/analysis.js} +0 -0
  1713. /package/dist/{browser → src/browser}/base-page.d.ts +0 -0
  1714. /package/dist/{browser → src/browser}/base-page.js +0 -0
  1715. /package/dist/{browser → src/browser}/bridge.d.ts +0 -0
  1716. /package/dist/{browser → src/browser}/bridge.js +0 -0
  1717. /package/dist/{extension-manifest-regression.test.d.ts → src/browser/cdp.test.d.ts} +0 -0
  1718. /package/dist/{browser → src/browser}/cdp.test.js +0 -0
  1719. /package/dist/{browser → src/browser}/daemon-client.d.ts +0 -0
  1720. /package/dist/{browser → src/browser}/daemon-client.js +0 -0
  1721. /package/dist/{external.test.d.ts → src/browser/daemon-client.test.d.ts} +0 -0
  1722. /package/dist/{browser → src/browser}/daemon-client.test.js +0 -0
  1723. /package/dist/{browser → src/browser}/discover.d.ts +0 -0
  1724. /package/dist/{browser → src/browser}/discover.js +0 -0
  1725. /package/dist/{browser → src/browser}/dom-helpers.d.ts +0 -0
  1726. /package/dist/{browser → src/browser}/dom-helpers.js +0 -0
  1727. /package/dist/{launcher.test.d.ts → src/browser/dom-helpers.test.d.ts} +0 -0
  1728. /package/dist/{browser → src/browser}/dom-helpers.test.js +0 -0
  1729. /package/dist/{browser → src/browser}/dom-snapshot.d.ts +0 -0
  1730. /package/dist/{browser → src/browser}/dom-snapshot.js +0 -0
  1731. /package/dist/{browser → src/browser}/dom-snapshot.test.d.ts +0 -0
  1732. /package/dist/{browser → src/browser}/dom-snapshot.test.js +0 -0
  1733. /package/dist/{browser → src/browser}/errors.d.ts +0 -0
  1734. /package/dist/{browser → src/browser}/errors.js +0 -0
  1735. /package/dist/{browser → src/browser}/index.d.ts +0 -0
  1736. /package/dist/{browser → src/browser}/index.js +0 -0
  1737. /package/dist/{node-network.test.d.ts → src/browser/page.test.d.ts} +0 -0
  1738. /package/dist/{browser → src/browser}/page.test.js +0 -0
  1739. /package/dist/{browser → src/browser}/stealth.d.ts +0 -0
  1740. /package/dist/{browser → src/browser}/stealth.js +0 -0
  1741. /package/dist/{output.test.d.ts → src/browser/stealth.test.d.ts} +0 -0
  1742. /package/dist/{browser → src/browser}/stealth.test.js +0 -0
  1743. /package/dist/{browser → src/browser}/tabs.d.ts +0 -0
  1744. /package/dist/{browser → src/browser}/tabs.js +0 -0
  1745. /package/dist/{execution.test.d.ts → src/browser.test.d.ts} +0 -0
  1746. /package/dist/{browser.test.js → src/browser.test.js} +0 -0
  1747. /package/dist/{build-manifest.d.ts → src/build-manifest.d.ts} +0 -0
  1748. /package/dist/{pipeline/steps/download.test.d.ts → src/build-manifest.test.d.ts} +0 -0
  1749. /package/dist/{build-manifest.test.js → src/build-manifest.test.js} +0 -0
  1750. /package/dist/{capabilityRouting.d.ts → src/capabilityRouting.d.ts} +0 -0
  1751. /package/dist/{capabilityRouting.js → src/capabilityRouting.js} +0 -0
  1752. /package/dist/{pipeline/steps/fetch.test.d.ts → src/capabilityRouting.test.d.ts} +0 -0
  1753. /package/dist/{capabilityRouting.test.js → src/capabilityRouting.test.js} +0 -0
  1754. /package/dist/{cascade.d.ts → src/cascade.d.ts} +0 -0
  1755. /package/dist/{record.test.d.ts → src/cli.test.d.ts} +0 -0
  1756. /package/dist/{runtime-detect.test.d.ts → src/commanderAdapter.test.d.ts} +0 -0
  1757. /package/dist/{commanderAdapter.test.js → src/commanderAdapter.test.js} +0 -0
  1758. /package/dist/{commands → src/commands}/daemon.d.ts +0 -0
  1759. /package/dist/{commands → src/commands}/daemon.js +0 -0
  1760. /package/dist/{serialization.test.d.ts → src/commands/daemon.test.d.ts} +0 -0
  1761. /package/dist/{commands → src/commands}/daemon.test.js +0 -0
  1762. /package/dist/{completion.d.ts → src/completion.d.ts} +0 -0
  1763. /package/dist/{completion.js → src/completion.js} +0 -0
  1764. /package/dist/{tui.test.d.ts → src/completion.test.d.ts} +0 -0
  1765. /package/dist/{completion.test.js → src/completion.test.js} +0 -0
  1766. /package/dist/{constants.d.ts → src/constants.d.ts} +0 -0
  1767. /package/dist/{constants.js → src/constants.js} +0 -0
  1768. /package/dist/{daemon.d.ts → src/daemon.d.ts} +0 -0
  1769. /package/dist/{daemon.js → src/daemon.js} +0 -0
  1770. /package/dist/{weixin-download.test.d.ts → src/daemon.test.d.ts} +0 -0
  1771. /package/dist/{daemon.test.js → src/daemon.test.js} +0 -0
  1772. /package/dist/{doctor.d.ts → src/doctor.d.ts} +0 -0
  1773. /package/dist/{doctor.js → src/doctor.js} +0 -0
  1774. /package/dist/{doctor.test.js → src/doctor.test.js} +0 -0
  1775. /package/dist/{download → src/download}/index.test.js +0 -0
  1776. /package/dist/{electron-apps.d.ts → src/electron-apps.d.ts} +0 -0
  1777. /package/dist/{electron-apps.js → src/electron-apps.js} +0 -0
  1778. /package/dist/{electron-apps.test.js → src/electron-apps.test.js} +0 -0
  1779. /package/dist/{engine.test.js → src/engine.test.js} +0 -0
  1780. /package/dist/{errors.d.ts → src/errors.d.ts} +0 -0
  1781. /package/dist/{errors.js → src/errors.js} +0 -0
  1782. /package/dist/{errors.test.js → src/errors.test.js} +0 -0
  1783. /package/dist/{execution.d.ts → src/execution.d.ts} +0 -0
  1784. /package/dist/{execution.js → src/execution.js} +0 -0
  1785. /package/dist/{execution.test.js → src/execution.test.js} +0 -0
  1786. /package/dist/{explore.d.ts → src/explore.d.ts} +0 -0
  1787. /package/dist/{explore.js → src/explore.js} +0 -0
  1788. /package/dist/{extension-manifest-regression.test.js → src/extension-manifest-regression.test.js} +0 -0
  1789. /package/dist/{external-clis.yaml → src/external-clis.yaml} +0 -0
  1790. /package/dist/{external.d.ts → src/external.d.ts} +0 -0
  1791. /package/dist/{external.js → src/external.js} +0 -0
  1792. /package/dist/{external.test.js → src/external.test.js} +0 -0
  1793. /package/dist/{generate.d.ts → src/generate.d.ts} +0 -0
  1794. /package/dist/{generate.js → src/generate.js} +0 -0
  1795. /package/dist/{hooks.d.ts → src/hooks.d.ts} +0 -0
  1796. /package/dist/{hooks.js → src/hooks.js} +0 -0
  1797. /package/dist/{hooks.test.d.ts → src/hooks.test.d.ts} +0 -0
  1798. /package/dist/{hooks.test.js → src/hooks.test.js} +0 -0
  1799. /package/dist/{idle-manager.d.ts → src/idle-manager.d.ts} +0 -0
  1800. /package/dist/{idle-manager.js → src/idle-manager.js} +0 -0
  1801. /package/dist/{interceptor.test.d.ts → src/interceptor.test.d.ts} +0 -0
  1802. /package/dist/{interceptor.test.js → src/interceptor.test.js} +0 -0
  1803. /package/dist/{launcher.d.ts → src/launcher.d.ts} +0 -0
  1804. /package/dist/{launcher.js → src/launcher.js} +0 -0
  1805. /package/dist/{launcher.test.js → src/launcher.test.js} +0 -0
  1806. /package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
  1807. /package/dist/{logger.js → src/logger.js} +0 -0
  1808. /package/dist/{main.d.ts → src/main.d.ts} +0 -0
  1809. /package/dist/{node-network.d.ts → src/node-network.d.ts} +0 -0
  1810. /package/dist/{node-network.js → src/node-network.js} +0 -0
  1811. /package/dist/{node-network.test.js → src/node-network.test.js} +0 -0
  1812. /package/dist/{output.d.ts → src/output.d.ts} +0 -0
  1813. /package/dist/{output.js → src/output.js} +0 -0
  1814. /package/dist/{output.test.js → src/output.test.js} +0 -0
  1815. /package/dist/{pipeline → src/pipeline}/executor.d.ts +0 -0
  1816. /package/dist/{pipeline → src/pipeline}/executor.js +0 -0
  1817. /package/dist/{pipeline → src/pipeline}/executor.test.d.ts +0 -0
  1818. /package/dist/{pipeline → src/pipeline}/executor.test.js +0 -0
  1819. /package/dist/{pipeline → src/pipeline}/registry.d.ts +0 -0
  1820. /package/dist/{pipeline → src/pipeline}/registry.js +0 -0
  1821. /package/dist/{pipeline → src/pipeline}/steps/browser.d.ts +0 -0
  1822. /package/dist/{pipeline → src/pipeline}/steps/browser.js +0 -0
  1823. /package/dist/{pipeline → src/pipeline}/steps/download.d.ts +0 -0
  1824. /package/dist/{pipeline → src/pipeline}/steps/download.js +0 -0
  1825. /package/dist/{pipeline → src/pipeline}/steps/download.test.js +0 -0
  1826. /package/dist/{pipeline → src/pipeline}/steps/fetch.d.ts +0 -0
  1827. /package/dist/{pipeline → src/pipeline}/steps/fetch.js +0 -0
  1828. /package/dist/{pipeline → src/pipeline}/steps/fetch.test.js +0 -0
  1829. /package/dist/{pipeline → src/pipeline}/steps/intercept.d.ts +0 -0
  1830. /package/dist/{pipeline → src/pipeline}/steps/intercept.js +0 -0
  1831. /package/dist/{pipeline → src/pipeline}/steps/tap.d.ts +0 -0
  1832. /package/dist/{pipeline → src/pipeline}/steps/tap.js +0 -0
  1833. /package/dist/{pipeline → src/pipeline}/steps/transform.d.ts +0 -0
  1834. /package/dist/{pipeline → src/pipeline}/steps/transform.js +0 -0
  1835. /package/dist/{pipeline → src/pipeline}/template.d.ts +0 -0
  1836. /package/dist/{pipeline → src/pipeline}/template.js +0 -0
  1837. /package/dist/{pipeline → src/pipeline}/template.test.d.ts +0 -0
  1838. /package/dist/{pipeline → src/pipeline}/template.test.js +0 -0
  1839. /package/dist/{pipeline → src/pipeline}/transform.test.d.ts +0 -0
  1840. /package/dist/{pipeline → src/pipeline}/transform.test.js +0 -0
  1841. /package/dist/{plugin-manifest.d.ts → src/plugin-manifest.d.ts} +0 -0
  1842. /package/dist/{plugin-manifest.js → src/plugin-manifest.js} +0 -0
  1843. /package/dist/{plugin-manifest.test.d.ts → src/plugin-manifest.test.d.ts} +0 -0
  1844. /package/dist/{plugin-manifest.test.js → src/plugin-manifest.test.js} +0 -0
  1845. /package/dist/{plugin-scaffold.d.ts → src/plugin-scaffold.d.ts} +0 -0
  1846. /package/dist/{plugin-scaffold.js → src/plugin-scaffold.js} +0 -0
  1847. /package/dist/{plugin-scaffold.test.d.ts → src/plugin-scaffold.test.d.ts} +0 -0
  1848. /package/dist/{plugin-scaffold.test.js → src/plugin-scaffold.test.js} +0 -0
  1849. /package/dist/{plugin.d.ts → src/plugin.d.ts} +0 -0
  1850. /package/dist/{plugin.js → src/plugin.js} +0 -0
  1851. /package/dist/{plugin.test.d.ts → src/plugin.test.d.ts} +0 -0
  1852. /package/dist/{plugin.test.js → src/plugin.test.js} +0 -0
  1853. /package/dist/{record.d.ts → src/record.d.ts} +0 -0
  1854. /package/dist/{record.test.js → src/record.test.js} +0 -0
  1855. /package/dist/{registry-api.d.ts → src/registry-api.d.ts} +0 -0
  1856. /package/dist/{registry-api.js → src/registry-api.js} +0 -0
  1857. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  1858. /package/dist/{registry.js → src/registry.js} +0 -0
  1859. /package/dist/{registry.test.d.ts → src/registry.test.d.ts} +0 -0
  1860. /package/dist/{registry.test.js → src/registry.test.js} +0 -0
  1861. /package/dist/{runtime-detect.d.ts → src/runtime-detect.d.ts} +0 -0
  1862. /package/dist/{runtime-detect.js → src/runtime-detect.js} +0 -0
  1863. /package/dist/{runtime-detect.test.js → src/runtime-detect.test.js} +0 -0
  1864. /package/dist/{runtime.d.ts → src/runtime.d.ts} +0 -0
  1865. /package/dist/{runtime.js → src/runtime.js} +0 -0
  1866. /package/dist/{scripts → src/scripts}/framework.d.ts +0 -0
  1867. /package/dist/{scripts → src/scripts}/framework.js +0 -0
  1868. /package/dist/{scripts → src/scripts}/interact.d.ts +0 -0
  1869. /package/dist/{scripts → src/scripts}/interact.js +0 -0
  1870. /package/dist/{scripts → src/scripts}/store.d.ts +0 -0
  1871. /package/dist/{scripts → src/scripts}/store.js +0 -0
  1872. /package/dist/{serialization.d.ts → src/serialization.d.ts} +0 -0
  1873. /package/dist/{serialization.js → src/serialization.js} +0 -0
  1874. /package/dist/{serialization.test.js → src/serialization.test.js} +0 -0
  1875. /package/dist/{snapshotFormatter.d.ts → src/snapshotFormatter.d.ts} +0 -0
  1876. /package/dist/{snapshotFormatter.js → src/snapshotFormatter.js} +0 -0
  1877. /package/dist/{snapshotFormatter.test.d.ts → src/snapshotFormatter.test.d.ts} +0 -0
  1878. /package/dist/{snapshotFormatter.test.js → src/snapshotFormatter.test.js} +0 -0
  1879. /package/dist/{tui.d.ts → src/tui.d.ts} +0 -0
  1880. /package/dist/{tui.js → src/tui.js} +0 -0
  1881. /package/dist/{tui.test.js → src/tui.test.js} +0 -0
  1882. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  1883. /package/dist/{types.js → src/types.js} +0 -0
  1884. /package/dist/{update-check.d.ts → src/update-check.d.ts} +0 -0
  1885. /package/dist/{update-check.js → src/update-check.js} +0 -0
  1886. /package/dist/{utils.d.ts → src/utils.d.ts} +0 -0
  1887. /package/dist/{utils.js → src/utils.js} +0 -0
  1888. /package/dist/{validate.d.ts → src/validate.d.ts} +0 -0
  1889. /package/dist/{validate.js → src/validate.js} +0 -0
  1890. /package/dist/{verify.d.ts → src/verify.d.ts} +0 -0
  1891. /package/dist/{verify.js → src/verify.js} +0 -0
  1892. /package/dist/{version.d.ts → src/version.d.ts} +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
- });