@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,1620 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
-
4
- import { cli, Strategy } from '../../registry.js';
5
- import { ArgumentError, AuthRequiredError, CommandExecutionError } from '../../errors.js';
6
- import type { IPage } from '../../types.js';
7
- import {
8
- installInstagramProtocolCapture,
9
- readInstagramProtocolCapture,
10
- type InstagramProtocolCaptureEntry,
11
- } from './_shared/protocol-capture.js';
12
- import {
13
- publishMediaViaPrivateApi,
14
- publishImagesViaPrivateApi,
15
- resolveInstagramPrivatePublishConfig,
16
- } from './_shared/private-publish.js';
17
- import { resolveInstagramRuntimeInfo } from './_shared/runtime-info.js';
18
-
19
- const INSTAGRAM_HOME_URL = 'https://www.instagram.com/';
20
- const SUPPORTED_IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.webp']);
21
- const SUPPORTED_VIDEO_EXTENSIONS = new Set(['.mp4']);
22
- const MAX_MEDIA_ITEMS = 10;
23
- const INSTAGRAM_PROTOCOL_TRACE_OUTPUT_PATH = '/tmp/instagram_post_protocol_trace.json';
24
-
25
- type InstagramProtocolDrain = () => Promise<void>;
26
- type InstagramSuccessRow = {
27
- status: string;
28
- detail: string;
29
- url: string;
30
- };
31
- type InstagramPostMediaItem = {
32
- type: 'image' | 'video';
33
- filePath: string;
34
- };
35
-
36
- async function gotoInstagramHome(page: IPage, forceReload = false): Promise<void> {
37
- if (forceReload) {
38
- await page.goto(`${INSTAGRAM_HOME_URL}?__opencli_reset=${Date.now()}`);
39
- await page.wait({ time: 1 });
40
- }
41
- await page.goto(INSTAGRAM_HOME_URL);
42
- }
43
-
44
- export function buildEnsureComposerOpenJs(): string {
45
- return `
46
- (() => {
47
- const path = window.location?.pathname || '';
48
- const onLoginRoute = /\\/accounts\\/login\\/?/.test(path);
49
- const hasLoginField = !!document.querySelector('input[name="username"], input[name="password"]');
50
- const hasLoginButton = Array.from(document.querySelectorAll('button, div[role="button"]')).some((el) => {
51
- const text = (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
52
- return text === 'log in' || text === 'login' || text === '登录';
53
- });
54
-
55
- if (onLoginRoute || (hasLoginField && hasLoginButton)) {
56
- return { ok: false, reason: 'auth' };
57
- }
58
-
59
- const alreadyOpen = document.querySelector('input[type="file"]');
60
- if (alreadyOpen) return { ok: true };
61
-
62
- const labels = ['Create', 'New post', 'Post', '创建', '新帖子'];
63
- const nodes = Array.from(document.querySelectorAll('a, button, div[role="button"], svg[aria-label], [aria-label]'));
64
- for (const node of nodes) {
65
- const text = ((node.textContent || '') + ' ' + (node.getAttribute?.('aria-label') || '')).trim();
66
- if (labels.some((label) => text.toLowerCase().includes(label.toLowerCase()))) {
67
- const clickable = node.closest('a, button, div[role="button"]') || node;
68
- if (clickable instanceof HTMLElement) {
69
- clickable.click();
70
- return { ok: true };
71
- }
72
- }
73
- }
74
-
75
- return { ok: true };
76
- })()
77
- `;
78
- }
79
-
80
- export function buildPublishStatusProbeJs(): string {
81
- return `
82
- (() => {
83
- const isVisible = (el) => {
84
- if (!(el instanceof HTMLElement)) return false;
85
- const style = window.getComputedStyle(el);
86
- const rect = el.getBoundingClientRect();
87
- return style.display !== 'none'
88
- && style.visibility !== 'hidden'
89
- && rect.width > 0
90
- && rect.height > 0;
91
- };
92
- const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
93
- const dialogText = dialogs
94
- .map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim())
95
- .join(' ');
96
- const url = window.location.href;
97
- const visibleText = dialogText.toLowerCase();
98
- const sharingVisible = /sharing/.test(visibleText);
99
- const shared = /post shared|your post has been shared|已分享|已发布/.test(visibleText)
100
- || /\\/p\\//.test(url);
101
- const failed = !shared && !sharingVisible && (
102
- /couldn['’]t be shared|could not be shared|failed to share|share failed|无法分享|分享失败/.test(visibleText)
103
- || (/something went wrong/.test(visibleText) && /try again/.test(visibleText))
104
- );
105
- const composerOpen = dialogs.some((dialog) =>
106
- !!dialog.querySelector('textarea, [contenteditable="true"], input[type="file"]')
107
- || /write a caption|add location|advanced settings|select from computer|crop|filters|adjustments|sharing/.test((dialog.textContent || '').toLowerCase())
108
- );
109
- const settled = !shared && !composerOpen && !/sharing/.test(visibleText);
110
- return { ok: shared, failed, settled, url: /\\/p\\//.test(url) ? url : '' };
111
- })()
112
- `;
113
- }
114
-
115
- function requirePage(page: IPage | null): IPage {
116
- if (!page) throw new CommandExecutionError('Browser session required for instagram post');
117
- return page;
118
- }
119
-
120
- function validateMixedMediaItems(inputs: string[]): InstagramPostMediaItem[] {
121
- if (!inputs.length) {
122
- throw new ArgumentError(
123
- 'Argument "media" is required.',
124
- 'Provide --media /path/to/file.jpg or --media /path/a.jpg,/path/b.mp4',
125
- );
126
- }
127
- if (inputs.length > MAX_MEDIA_ITEMS) {
128
- throw new ArgumentError(`Too many media items: ${inputs.length}`, `Instagram carousel posts support at most ${MAX_MEDIA_ITEMS} items`);
129
- }
130
-
131
- const items = inputs.map((input) => {
132
- const resolved = path.resolve(String(input || '').trim());
133
- if (!resolved) {
134
- throw new ArgumentError('Media path cannot be empty');
135
- }
136
- if (!fs.existsSync(resolved)) {
137
- throw new ArgumentError(`Media file not found: ${resolved}`);
138
- }
139
- const ext = path.extname(resolved).toLowerCase();
140
- if (SUPPORTED_IMAGE_EXTENSIONS.has(ext)) {
141
- return { type: 'image' as const, filePath: resolved };
142
- }
143
- if (SUPPORTED_VIDEO_EXTENSIONS.has(ext)) {
144
- return { type: 'video' as const, filePath: resolved };
145
- }
146
- throw new ArgumentError(`Unsupported media format: ${ext}`, 'Supported formats: images (.jpg, .jpeg, .png, .webp) and videos (.mp4)');
147
- });
148
-
149
- return items;
150
- }
151
-
152
- function normalizePostMediaItems(kwargs: Record<string, unknown>): InstagramPostMediaItem[] {
153
- const media = String(kwargs.media ?? '').trim();
154
- return validateMixedMediaItems(media.split(',').map((part) => part.trim()).filter(Boolean));
155
- }
156
-
157
- function validateInstagramPostArgs(kwargs: Record<string, unknown>): void {
158
- const media = kwargs.media;
159
- if (media === undefined) {
160
- throw new ArgumentError(
161
- 'Argument "media" is required.',
162
- 'Provide --media /path/to/file.jpg or --media /path/a.jpg,/path/b.mp4',
163
- );
164
- }
165
- }
166
-
167
- function isSafePrivateRouteFallbackError(error: unknown): boolean {
168
- if (!(error instanceof CommandExecutionError)) return false;
169
- return error.message.startsWith('Instagram private publish')
170
- || error.message.startsWith('Instagram private route');
171
- }
172
-
173
- function buildInstagramSuccessResult(mediaItems: InstagramPostMediaItem[], url: string): InstagramSuccessRow[] {
174
- return [{
175
- status: '✅ Posted',
176
- detail: describePostDetail(mediaItems),
177
- url,
178
- }];
179
- }
180
-
181
- function buildFallbackHint(privateError: unknown, uiError: unknown): string {
182
- const privateMessage = privateError instanceof Error ? privateError.message : String(privateError);
183
- const uiMessage = uiError instanceof Error ? uiError.message : String(uiError);
184
- return `Private route failed first: ${privateMessage}. UI fallback then failed: ${uiMessage}`;
185
- }
186
-
187
- async function executePrivateInstagramPost(input: {
188
- page: IPage;
189
- mediaItems: InstagramPostMediaItem[];
190
- content: string;
191
- existingPostPaths: Set<string>;
192
- }): Promise<InstagramSuccessRow[]> {
193
- const privateConfig = await resolveInstagramPrivatePublishConfig(input.page);
194
- const privateResult = input.mediaItems.every((item) => item.type === 'image')
195
- ? await publishImagesViaPrivateApi({
196
- page: input.page,
197
- imagePaths: input.mediaItems.map((item) => item.filePath),
198
- caption: input.content,
199
- apiContext: privateConfig.apiContext,
200
- jazoest: privateConfig.jazoest,
201
- })
202
- : await publishMediaViaPrivateApi({
203
- page: input.page,
204
- mediaItems: input.mediaItems,
205
- caption: input.content,
206
- apiContext: privateConfig.apiContext,
207
- jazoest: privateConfig.jazoest,
208
- });
209
- const url = privateResult.code
210
- ? new URL(`/p/${privateResult.code}/`, INSTAGRAM_HOME_URL).toString()
211
- : await resolveLatestPostUrl(input.page, input.existingPostPaths);
212
- return buildInstagramSuccessResult(input.mediaItems, url);
213
- }
214
-
215
- async function executeUiInstagramPost(input: {
216
- page: IPage;
217
- mediaItems: InstagramPostMediaItem[];
218
- content: string;
219
- existingPostPaths: Set<string>;
220
- commandAttemptBudget: number;
221
- preUploadDelaySeconds: number;
222
- uploadAttemptBudget: number;
223
- previewProbeWindowSeconds: number;
224
- finalPreviewWaitSeconds: number;
225
- preShareDelaySeconds: number;
226
- inlineUploadRetryBudget: number;
227
- installProtocolCapture: () => Promise<void>;
228
- drainProtocolCapture: InstagramProtocolDrain;
229
- forceFreshStart?: boolean;
230
- }): Promise<InstagramSuccessRow[]> {
231
- let lastError: unknown;
232
- let lastSpecificCommandError: CommandExecutionError | null = null;
233
- for (let attempt = 0; attempt < input.commandAttemptBudget; attempt++) {
234
- let shareClicked = false;
235
- try {
236
- await gotoInstagramHome(input.page, input.forceFreshStart || attempt > 0);
237
- await input.installProtocolCapture();
238
- await input.page.wait({ time: 2 });
239
- await dismissResidualDialogs(input.page);
240
-
241
- await ensureComposerOpen(input.page);
242
- const uploadSelectors = await resolveUploadSelectors(input.page, input.mediaItems);
243
- if (input.preUploadDelaySeconds > 0) {
244
- await input.page.wait({ time: input.preUploadDelaySeconds });
245
- }
246
- let uploaded = false;
247
- let uploadFailure: CommandExecutionError | null = null;
248
- for (const selector of uploadSelectors) {
249
- let activeSelector = selector;
250
- for (let uploadAttempt = 0; uploadAttempt < input.uploadAttemptBudget; uploadAttempt++) {
251
- await uploadMedia(input.page, input.mediaItems, activeSelector);
252
- const uploadState = await waitForPreviewMaybe(input.page, input.previewProbeWindowSeconds);
253
- if (uploadState.state === 'preview') {
254
- uploaded = true;
255
- break;
256
- }
257
- if (uploadState.state === 'failed') {
258
- uploadFailure = makeUploadFailure(uploadState.detail);
259
- for (let inlineRetry = 0; inlineRetry < input.inlineUploadRetryBudget; inlineRetry++) {
260
- const clickedRetry = await clickVisibleUploadRetry(input.page);
261
- if (!clickedRetry) break;
262
- await input.page.wait({ time: 3 });
263
- const retriedState = await waitForPreviewMaybe(input.page, Math.max(3, Math.floor(input.previewProbeWindowSeconds / 2)));
264
- if (retriedState.state === 'preview') {
265
- uploaded = true;
266
- break;
267
- }
268
- if (retriedState.state !== 'failed') break;
269
- }
270
- if (uploaded) break;
271
- await dismissUploadErrorDialog(input.page);
272
- await dismissResidualDialogs(input.page);
273
- if (uploadAttempt < input.uploadAttemptBudget - 1) {
274
- try {
275
- await input.drainProtocolCapture();
276
- await gotoInstagramHome(input.page, true);
277
- await input.installProtocolCapture();
278
- await input.page.wait({ time: 2 });
279
- await dismissResidualDialogs(input.page);
280
- await ensureComposerOpen(input.page);
281
- activeSelector = await resolveFreshUploadSelector(input.page, activeSelector, input.mediaItems);
282
- if (input.preUploadDelaySeconds > 0) {
283
- await input.page.wait({ time: input.preUploadDelaySeconds });
284
- }
285
- } catch {
286
- throw uploadFailure;
287
- }
288
- await input.page.wait({ time: 1.5 });
289
- continue;
290
- }
291
- break;
292
- }
293
- break;
294
- }
295
- if (uploaded) break;
296
- }
297
- if (!uploaded) {
298
- if (uploadFailure) throw uploadFailure;
299
- await waitForPreview(input.page, input.finalPreviewWaitSeconds);
300
- }
301
- try {
302
- await advanceToCaptionEditor(input.page);
303
- } catch (error) {
304
- await rethrowUploadFailureIfPresent(input.page, error);
305
- }
306
- if (input.content) {
307
- await fillCaption(input.page, input.content);
308
- await ensureCaptionFilled(input.page, input.content);
309
- }
310
- if (input.preShareDelaySeconds > 0) {
311
- await input.page.wait({ time: input.preShareDelaySeconds });
312
- }
313
- await clickAction(input.page, ['Share', '分享'], 'caption');
314
- shareClicked = true;
315
- let url = '';
316
- try {
317
- url = await waitForPublishSuccess(input.page);
318
- } catch (error) {
319
- if (
320
- error instanceof CommandExecutionError
321
- && error.message === 'Instagram post share failed'
322
- && await clickVisibleShareRetry(input.page)
323
- ) {
324
- await input.page.wait({ time: Math.max(2, input.preShareDelaySeconds) });
325
- url = await waitForPublishSuccess(input.page);
326
- } else {
327
- throw error;
328
- }
329
- }
330
- await input.drainProtocolCapture();
331
- if (!url) {
332
- url = await resolveLatestPostUrl(input.page, input.existingPostPaths);
333
- }
334
-
335
- return buildInstagramSuccessResult(input.mediaItems, url);
336
- } catch (error) {
337
- lastError = error;
338
- if (error instanceof CommandExecutionError && error.message !== 'Failed to open Instagram post composer') {
339
- lastSpecificCommandError = error;
340
- }
341
- if (error instanceof AuthRequiredError) throw error;
342
- if (shareClicked) {
343
- throw error;
344
- }
345
- if (!(error instanceof CommandExecutionError) || attempt === input.commandAttemptBudget - 1) {
346
- if (error instanceof CommandExecutionError && error.message === 'Failed to open Instagram post composer' && lastSpecificCommandError) {
347
- throw lastSpecificCommandError;
348
- }
349
- throw error;
350
- }
351
- let resetWindow = false;
352
- if (input.mediaItems.length >= 10 && input.page.closeWindow) {
353
- try {
354
- await input.drainProtocolCapture();
355
- await input.page.closeWindow();
356
- resetWindow = true;
357
- } catch {
358
- // Best-effort: a fresh automation window is safer than reusing a polluted one.
359
- }
360
- }
361
- if (!resetWindow) {
362
- await dismissResidualDialogs(input.page);
363
- await input.page.wait({ time: 1 });
364
- }
365
- }
366
- }
367
-
368
- throw lastError instanceof Error ? lastError : new CommandExecutionError('Instagram post failed');
369
- }
370
-
371
- async function ensureComposerOpen(page: IPage): Promise<void> {
372
- const result = await page.evaluate(buildEnsureComposerOpenJs()) as { ok?: boolean; reason?: string };
373
-
374
- if (!result?.ok) {
375
- if (result?.reason === 'auth') throw new AuthRequiredError('www.instagram.com', 'Instagram login required before posting');
376
- throw new CommandExecutionError('Failed to open Instagram post composer');
377
- }
378
- }
379
-
380
- async function dismissResidualDialogs(page: IPage): Promise<void> {
381
- for (let attempt = 0; attempt < 4; attempt++) {
382
- const result = await page.evaluate(`
383
- (() => {
384
- const isVisible = (el) => {
385
- if (!(el instanceof HTMLElement)) return false;
386
- const style = window.getComputedStyle(el);
387
- const rect = el.getBoundingClientRect();
388
- return style.display !== 'none'
389
- && style.visibility !== 'hidden'
390
- && rect.width > 0
391
- && rect.height > 0;
392
- };
393
-
394
- const dialogs = Array.from(document.querySelectorAll('[role="dialog"]'))
395
- .filter((el) => el instanceof HTMLElement && isVisible(el));
396
- for (const dialog of dialogs) {
397
- const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
398
- if (!text) continue;
399
- if (
400
- text.includes('post shared')
401
- || text.includes('your post has been shared')
402
- || text.includes('something went wrong')
403
- || text.includes('sharing')
404
- || text.includes('create new post')
405
- || text.includes('crop')
406
- || text.includes('edit')
407
- ) {
408
- const close = dialog.querySelector('[aria-label="Close"], button[aria-label="Close"], div[role="button"][aria-label="Close"]');
409
- if (close instanceof HTMLElement && isVisible(close)) {
410
- close.click();
411
- return { ok: true };
412
- }
413
- const closeByText = Array.from(dialog.querySelectorAll('button, div[role="button"]')).find((el) => {
414
- const buttonText = (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
415
- return isVisible(el) && (buttonText === 'close' || buttonText === 'cancel' || buttonText === '取消');
416
- });
417
- if (closeByText instanceof HTMLElement) {
418
- closeByText.click();
419
- return { ok: true };
420
- }
421
- }
422
- }
423
-
424
- return { ok: false };
425
- })()
426
- `) as { ok?: boolean };
427
-
428
- if (!result?.ok) return;
429
- await page.wait({ time: 0.5 });
430
- }
431
- }
432
-
433
- async function findUploadSelectors(page: IPage, mediaItems: InstagramPostMediaItem[]): Promise<string[]> {
434
- const includesVideo = mediaItems.some((item) => item.type === 'video');
435
- const result = await page.evaluate(`
436
- ((includesVideo) => {
437
- const isVisible = (el) => {
438
- if (!(el instanceof HTMLElement)) return false;
439
- const style = window.getComputedStyle(el);
440
- const rect = el.getBoundingClientRect();
441
- return style.display !== 'none'
442
- && style.visibility !== 'hidden'
443
- && rect.width > 0
444
- && rect.height > 0;
445
- };
446
- const hasButtonText = (root, labels) => {
447
- if (!root || !(root instanceof Element)) return false;
448
- return Array.from(root.querySelectorAll('button, div[role="button"], span'))
449
- .some((el) => {
450
- const text = (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
451
- return labels.some((label) => text === label.toLowerCase());
452
- });
453
- };
454
-
455
- const inputs = Array.from(document.querySelectorAll('input[type="file"]'));
456
- const candidates = inputs.filter((el) => {
457
- if (!(el instanceof HTMLInputElement)) return false;
458
- if (el.disabled) return false;
459
- const accept = (el.getAttribute('accept') || '').toLowerCase();
460
- if (!accept) return true;
461
- if (includesVideo) return true;
462
- return accept.includes('image') || accept.includes('.jpg') || accept.includes('.jpeg') || accept.includes('.png') || accept.includes('.webp');
463
- });
464
-
465
- const dialogInputs = candidates.filter((el) => {
466
- const dialog = el.closest('[role="dialog"]');
467
- return hasButtonText(dialog, ['Select from computer', '从电脑中选择']);
468
- });
469
-
470
- const visibleDialogInputs = dialogInputs.filter((el) => {
471
- const dialog = el.closest('[role="dialog"]');
472
- return dialog instanceof HTMLElement && isVisible(dialog);
473
- });
474
-
475
- const pickerInputs = candidates.filter((el) => {
476
- return hasButtonText(el.parentElement, ['Select from computer', '从电脑中选择']);
477
- });
478
-
479
- const primary = visibleDialogInputs.length
480
- ? [visibleDialogInputs[visibleDialogInputs.length - 1]]
481
- : dialogInputs.length
482
- ? [dialogInputs[dialogInputs.length - 1]]
483
- : [];
484
- const ordered = [...primary, ...pickerInputs, ...candidates]
485
- .filter((el, index, arr) => arr.indexOf(el) === index);
486
- if (!ordered.length) return { ok: false };
487
-
488
- document.querySelectorAll('[data-opencli-ig-upload-index]').forEach((el) => el.removeAttribute('data-opencli-ig-upload-index'));
489
- const selectors = ordered.map((input, index) => {
490
- input.setAttribute('data-opencli-ig-upload-index', String(index));
491
- return '[data-opencli-ig-upload-index="' + index + '"]';
492
- });
493
- return { ok: true, selectors };
494
- })(${JSON.stringify(includesVideo)})
495
- `) as { ok?: boolean; selectors?: string[] };
496
-
497
- if (!result?.ok || !result.selectors?.length) {
498
- throw new CommandExecutionError('Instagram upload input not found', 'Open the new-post composer in a logged-in browser session and retry');
499
- }
500
- return result.selectors;
501
- }
502
-
503
- async function resolveUploadSelectors(page: IPage, mediaItems: InstagramPostMediaItem[]): Promise<string[]> {
504
- try {
505
- return await findUploadSelectors(page, mediaItems);
506
- } catch (error) {
507
- if (!(error instanceof CommandExecutionError) || !error.message.includes('upload input not found')) {
508
- throw error;
509
- }
510
-
511
- await ensureComposerOpen(page);
512
- await page.wait({ time: 1.5 });
513
-
514
- try {
515
- return await findUploadSelectors(page, mediaItems);
516
- } catch (retryError) {
517
- if (!(retryError instanceof CommandExecutionError) || !retryError.message.includes('upload input not found')) {
518
- throw retryError;
519
- }
520
-
521
- await gotoInstagramHome(page, true);
522
- await page.wait({ time: 2 });
523
- await dismissResidualDialogs(page);
524
- await ensureComposerOpen(page);
525
- await page.wait({ time: 2 });
526
- return findUploadSelectors(page, mediaItems);
527
- }
528
- }
529
- }
530
-
531
- function extractSelectorIndex(selector: string): number | null {
532
- const match = selector.match(/data-opencli-ig-upload-index="(\d+)"/);
533
- if (!match) return null;
534
- const index = Number.parseInt(match[1] || '', 10);
535
- return Number.isNaN(index) ? null : index;
536
- }
537
-
538
- async function resolveFreshUploadSelector(page: IPage, previousSelector: string, mediaItems: InstagramPostMediaItem[]): Promise<string> {
539
- const selectors = await resolveUploadSelectors(page, mediaItems);
540
- const index = extractSelectorIndex(previousSelector);
541
- if (index !== null && selectors[index]) return selectors[index]!;
542
- return selectors[0] || previousSelector;
543
- }
544
-
545
- async function injectImageViaBrowser(page: IPage, imagePaths: string[], selector: string): Promise<void> {
546
- const images = imagePaths.map((imagePath) => {
547
- const ext = path.extname(imagePath).toLowerCase();
548
- const mimeType = ext === '.png'
549
- ? 'image/png'
550
- : ext === '.webp'
551
- ? 'image/webp'
552
- : 'image/jpeg';
553
-
554
- return {
555
- name: path.basename(imagePath),
556
- type: mimeType,
557
- base64: fs.readFileSync(imagePath).toString('base64'),
558
- };
559
- });
560
- const chunkKey = `__opencliInstagramUpload_${Date.now()}_${Math.random().toString(36).slice(2)}`;
561
- const chunkSize = 256 * 1024;
562
-
563
- await page.evaluate(`
564
- (() => {
565
- window[${JSON.stringify(chunkKey)}] = [];
566
- return { ok: true };
567
- })()
568
- `);
569
-
570
- const payload = JSON.stringify(images);
571
- for (let offset = 0; offset < payload.length; offset += chunkSize) {
572
- const chunk = payload.slice(offset, offset + chunkSize);
573
- await page.evaluate(`
574
- (() => {
575
- const key = ${JSON.stringify(chunkKey)};
576
- const chunk = ${JSON.stringify(chunk)};
577
- const parts = Array.isArray(window[key]) ? window[key] : [];
578
- parts.push(chunk);
579
- window[key] = parts;
580
- return { ok: true, count: parts.length };
581
- })()
582
- `);
583
- }
584
-
585
- const result = await page.evaluate(`
586
- (() => {
587
- const selector = ${JSON.stringify(selector)};
588
- const key = ${JSON.stringify(chunkKey)};
589
- const payload = JSON.parse(Array.isArray(window[key]) ? window[key].join('') : '[]');
590
-
591
- const cleanup = () => { try { delete window[key]; } catch {} };
592
- const input = document.querySelector(selector);
593
- if (!(input instanceof HTMLInputElement)) {
594
- cleanup();
595
- return { ok: false, error: 'File input not found for fallback injection' };
596
- }
597
-
598
- try {
599
- const dt = new DataTransfer();
600
- for (const img of payload) {
601
- const binary = atob(img.base64);
602
- const bytes = new Uint8Array(binary.length);
603
- for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
604
- const blob = new Blob([bytes], { type: img.type });
605
- const file = new File([blob], img.name, { type: img.type });
606
- dt.items.add(file);
607
- }
608
- Object.defineProperty(input, 'files', { value: dt.files, configurable: true });
609
- input.dispatchEvent(new Event('change', { bubbles: true }));
610
- input.dispatchEvent(new Event('input', { bubbles: true }));
611
- cleanup();
612
- return { ok: true, count: dt.files.length };
613
- } catch (error) {
614
- cleanup();
615
- return { ok: false, error: String(error) };
616
- }
617
- })()
618
- `) as { ok?: boolean; error?: string };
619
-
620
- if (!result?.ok) {
621
- throw new CommandExecutionError(result?.error || 'Instagram fallback file injection failed');
622
- }
623
- }
624
-
625
- async function dispatchUploadEvents(page: IPage, selector: string): Promise<void> {
626
- await page.evaluate(`
627
- (() => {
628
- const input = document.querySelector(${JSON.stringify(selector)});
629
- if (!(input instanceof HTMLInputElement)) return { ok: false };
630
- input.dispatchEvent(new Event('input', { bubbles: true }));
631
- input.dispatchEvent(new Event('change', { bubbles: true }));
632
- return { ok: true };
633
- })()
634
- `);
635
- }
636
-
637
- type UploadStageState = {
638
- state: 'preview' | 'failed' | 'pending';
639
- detail?: string;
640
- };
641
-
642
- export function buildInspectUploadStageJs(): string {
643
- return `
644
- (() => {
645
- const isVisible = (el) => {
646
- if (!(el instanceof HTMLElement)) return false;
647
- const style = window.getComputedStyle(el);
648
- const rect = el.getBoundingClientRect();
649
- return style.display !== 'none'
650
- && style.visibility !== 'hidden'
651
- && rect.width > 0
652
- && rect.height > 0;
653
- };
654
- const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
655
- const visibleTexts = dialogs.map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim());
656
- const dialogText = visibleTexts.join(' ');
657
- const combined = dialogText.toLowerCase();
658
- const hasVisibleButtonInDialogs = (labels) => {
659
- return dialogs.some((dialog) =>
660
- Array.from(dialog.querySelectorAll('button, div[role="button"]')).some((el) => {
661
- const text = (el.textContent || '').replace(/\\s+/g, ' ').trim();
662
- const aria = (el.getAttribute?.('aria-label') || '').replace(/\\s+/g, ' ').trim();
663
- return isVisible(el) && (labels.includes(text) || labels.includes(aria));
664
- })
665
- );
666
- };
667
- const hasCaption = dialogs.some((dialog) => !!dialog.querySelector('textarea, [contenteditable="true"]'));
668
- const hasPicker = hasVisibleButtonInDialogs(['Select from computer', '从电脑中选择']);
669
- const hasNext = hasVisibleButtonInDialogs(['Next', '下一步']);
670
- const hasPreviewUi = hasCaption
671
- || (!hasPicker && hasNext)
672
- || /crop|select crop|select zoom|open media gallery|filters|adjustments|裁剪|缩放|滤镜|调整/.test(combined);
673
- const failed = /something went wrong|please try again|couldn['’]t upload|could not upload|upload failed|try again|出错|失败/.test(combined);
674
- if (hasPreviewUi) return { state: 'preview', detail: dialogText || '' };
675
- if (failed) return { state: 'failed', detail: dialogText || 'Something went wrong' };
676
- return { state: 'pending', detail: dialogText || '' };
677
- })()
678
- `;
679
- }
680
-
681
- async function inspectUploadStage(page: IPage): Promise<UploadStageState> {
682
- const result = await page.evaluate(buildInspectUploadStageJs()) as UploadStageState & { ok?: boolean };
683
-
684
- if (result?.state) return result;
685
- if (result?.ok === true) return { state: 'preview', detail: result.detail };
686
- return { state: 'pending', detail: result?.detail };
687
- }
688
-
689
- function makeUploadFailure(detail?: string): CommandExecutionError {
690
- return new CommandExecutionError(
691
- 'Instagram image upload failed',
692
- detail ? `Instagram rejected the upload: ${detail}` : 'Instagram rejected the upload before the preview stage',
693
- );
694
- }
695
-
696
- async function uploadMedia(page: IPage, mediaItems: InstagramPostMediaItem[], selector: string): Promise<void> {
697
- const mediaPaths = mediaItems.map((item) => item.filePath);
698
- if (!page.setFileInput) {
699
- throw new CommandExecutionError(
700
- 'Instagram posting requires Browser Bridge file upload support',
701
- 'Use Browser Bridge or another browser mode that supports setFileInput',
702
- );
703
- }
704
-
705
- let activeSelector = selector;
706
- for (let attempt = 0; attempt < 2; attempt++) {
707
- try {
708
- await page.setFileInput(mediaPaths, activeSelector);
709
- await dispatchUploadEvents(page, activeSelector);
710
- return;
711
- } catch (error) {
712
- const message = error instanceof Error ? error.message : String(error);
713
- const staleSelector = message.includes('No element found matching selector')
714
- || message.includes('Could not find node with given id')
715
- || message.includes('No node with given id found');
716
- if (staleSelector && attempt === 0) {
717
- activeSelector = await resolveFreshUploadSelector(page, activeSelector, mediaItems);
718
- continue;
719
- }
720
- if (!message.includes('Unknown action') && !message.includes('set-file-input') && !message.includes('not supported')) {
721
- throw error;
722
- }
723
- if (mediaItems.some((item) => item.type === 'video')) {
724
- throw new CommandExecutionError(
725
- 'Instagram mixed-media posting requires Browser Bridge file upload support',
726
- 'Use Browser Bridge or another browser mode that supports setFileInput for image/video uploads',
727
- );
728
- }
729
- await injectImageViaBrowser(page, mediaPaths, activeSelector);
730
- return;
731
- }
732
- }
733
- }
734
-
735
- function describePostDetail(mediaItems: InstagramPostMediaItem[]): string {
736
- if (mediaItems.every((item) => item.type === 'image')) {
737
- return mediaItems.length === 1
738
- ? 'Single image post shared successfully'
739
- : `${mediaItems.length}-image carousel post shared successfully`;
740
- }
741
- return mediaItems.length === 1
742
- ? 'Single mixed-media post shared successfully'
743
- : `${mediaItems.length}-item mixed-media carousel post shared successfully`;
744
- }
745
-
746
- function getCommandAttemptBudget(mediaItems: InstagramPostMediaItem[]): number {
747
- if (mediaItems.length >= 10) return 6;
748
- if (mediaItems.length >= 5) return 4;
749
- return 3;
750
- }
751
-
752
- function getPreUploadDelaySeconds(mediaItems: InstagramPostMediaItem[]): number {
753
- if (mediaItems.length >= 10) return 3;
754
- if (mediaItems.length >= 5) return 1.5;
755
- return 0;
756
- }
757
-
758
- function getUploadAttemptBudget(mediaItems: InstagramPostMediaItem[]): number {
759
- if (mediaItems.length >= 10) return 3;
760
- if (mediaItems.length >= 5) return 3;
761
- return 2;
762
- }
763
-
764
- function getPreviewProbeWindowSeconds(mediaItems: InstagramPostMediaItem[]): number {
765
- if (mediaItems.length >= 10) return 6;
766
- if (mediaItems.length >= 5) return 6;
767
- return 4;
768
- }
769
-
770
- function getFinalPreviewWaitSeconds(mediaItems: InstagramPostMediaItem[]): number {
771
- if (mediaItems.length >= 10) return 12;
772
- if (mediaItems.length >= 5) return 16;
773
- return 12;
774
- }
775
-
776
- function getPreShareDelaySeconds(mediaItems: InstagramPostMediaItem[]): number {
777
- if (mediaItems.length >= 10) return 4;
778
- if (mediaItems.length >= 5) return 3;
779
- return 0;
780
- }
781
-
782
- function getInlineUploadRetryBudget(mediaItems: InstagramPostMediaItem[]): number {
783
- if (mediaItems.length >= 10) return 3;
784
- if (mediaItems.length >= 5) return 2;
785
- return 1;
786
- }
787
-
788
- async function dismissUploadErrorDialog(page: IPage): Promise<boolean> {
789
- const result = await page.evaluate(`
790
- (() => {
791
- const isVisible = (el) => {
792
- if (!(el instanceof HTMLElement)) return false;
793
- const style = window.getComputedStyle(el);
794
- const rect = el.getBoundingClientRect();
795
- return style.display !== 'none'
796
- && style.visibility !== 'hidden'
797
- && rect.width > 0
798
- && rect.height > 0;
799
- };
800
- const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
801
- for (const dialog of dialogs) {
802
- const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
803
- if (!text.includes('something went wrong') && !text.includes('try again') && !text.includes('失败') && !text.includes('出错')) continue;
804
- const close = dialog.querySelector('[aria-label="Close"], button[aria-label="Close"], div[role="button"][aria-label="Close"]');
805
- if (close instanceof HTMLElement && isVisible(close)) {
806
- close.click();
807
- return { ok: true };
808
- }
809
- }
810
- return { ok: false };
811
- })()
812
- `) as { ok?: boolean };
813
-
814
- return !!result?.ok;
815
- }
816
-
817
- async function clickVisibleUploadRetry(page: IPage): Promise<boolean> {
818
- const result = await page.evaluate(`
819
- (() => {
820
- const isVisible = (el) => {
821
- if (!(el instanceof HTMLElement)) return false;
822
- const style = window.getComputedStyle(el);
823
- const rect = el.getBoundingClientRect();
824
- return style.display !== 'none'
825
- && style.visibility !== 'hidden'
826
- && rect.width > 0
827
- && rect.height > 0;
828
- };
829
- const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
830
- for (const dialog of dialogs) {
831
- const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
832
- if (!text.includes('something went wrong') && !text.includes('try again') && !text.includes('失败') && !text.includes('出错')) continue;
833
- const retry = Array.from(dialog.querySelectorAll('button, div[role="button"]')).find((el) => {
834
- const label = ((el.textContent || '') + ' ' + (el.getAttribute?.('aria-label') || ''))
835
- .replace(/\\s+/g, ' ')
836
- .trim()
837
- .toLowerCase();
838
- return isVisible(el) && (
839
- label === 'try again'
840
- || label === 'retry'
841
- || label === '再试一次'
842
- || label === '重试'
843
- );
844
- });
845
- if (retry instanceof HTMLElement) {
846
- retry.click();
847
- return { ok: true };
848
- }
849
- }
850
- return { ok: false };
851
- })()
852
- `) as { ok?: boolean };
853
-
854
- return !!result?.ok;
855
- }
856
-
857
- async function waitForPreview(page: IPage, maxWaitSeconds = 12): Promise<void> {
858
- const attempts = Math.max(1, Math.ceil(maxWaitSeconds));
859
- for (let attempt = 0; attempt < attempts; attempt++) {
860
- const state = await inspectUploadStage(page);
861
- if (state.state === 'preview') return;
862
- if (state.state === 'failed') {
863
- await page.screenshot({ path: '/tmp/instagram_post_preview_debug.png' });
864
- throw makeUploadFailure('Inspect /tmp/instagram_post_preview_debug.png. ' + (state.detail || ''));
865
- }
866
- if (attempt < attempts - 1) await page.wait({ time: 1 });
867
- }
868
-
869
- await page.screenshot({ path: '/tmp/instagram_post_preview_debug.png' });
870
- throw new CommandExecutionError(
871
- 'Instagram image preview did not appear after upload',
872
- 'The selected file input may not match the active composer; inspect /tmp/instagram_post_preview_debug.png',
873
- );
874
- }
875
-
876
- async function waitForPreviewMaybe(page: IPage, maxWaitSeconds = 4): Promise<UploadStageState> {
877
- const attempts = Math.max(1, Math.ceil(maxWaitSeconds * 2));
878
- for (let attempt = 0; attempt < attempts; attempt++) {
879
- const state = await inspectUploadStage(page);
880
- if (state.state !== 'pending') return state;
881
- if (attempt < attempts - 1) await page.wait({ time: 0.5 });
882
- }
883
- return { state: 'pending' };
884
- }
885
-
886
- export function buildClickActionJs(labels: string[], scope: 'any' | 'media' | 'caption' = 'any'): string {
887
- return `
888
- ((labels, scope) => {
889
- const isVisible = (el) => {
890
- if (!(el instanceof HTMLElement)) return false;
891
- const style = window.getComputedStyle(el);
892
- const rect = el.getBoundingClientRect();
893
- return style.display !== 'none'
894
- && style.visibility !== 'hidden'
895
- && rect.width > 0
896
- && rect.height > 0;
897
- };
898
-
899
- const matchesScope = (dialog) => {
900
- if (!(dialog instanceof HTMLElement) || !isVisible(dialog)) return false;
901
- const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
902
- if (scope === 'caption') {
903
- return !!dialog.querySelector('textarea, [contenteditable="true"]')
904
- || text.includes('write a caption')
905
- || text.includes('add location')
906
- || text.includes('add collaborators')
907
- || text.includes('accessibility')
908
- || text.includes('advanced settings');
909
- }
910
- if (scope === 'media') {
911
- return !!dialog.querySelector('input[type="file"]')
912
- || text.includes('select from computer')
913
- || text.includes('crop')
914
- || text.includes('filters')
915
- || text.includes('adjustments')
916
- || text.includes('open media gallery')
917
- || text.includes('select crop')
918
- || text.includes('select zoom');
919
- }
920
- return true;
921
- };
922
-
923
- const containers = scope !== 'any'
924
- ? Array.from(document.querySelectorAll('[role="dialog"]')).filter(matchesScope)
925
- : [document.body];
926
-
927
- for (const container of containers) {
928
- const nodes = Array.from(container.querySelectorAll('button, div[role="button"]'));
929
- for (const node of nodes) {
930
- const text = (node.textContent || '').replace(/\\s+/g, ' ').trim();
931
- const aria = (node.getAttribute?.('aria-label') || '').replace(/\\s+/g, ' ').trim();
932
- if (!text && !aria) continue;
933
- if (!labels.includes(text) && !labels.includes(aria)) continue;
934
- if (node instanceof HTMLElement && isVisible(node) && node.getAttribute('aria-disabled') !== 'true') {
935
- node.click();
936
- return { ok: true, label: text || aria };
937
- }
938
- }
939
- }
940
- return { ok: false };
941
- })(${JSON.stringify(labels)}, ${JSON.stringify(scope)})
942
- `;
943
- }
944
-
945
- async function clickAction(page: IPage, labels: string[], scope: 'any' | 'media' | 'caption' = 'any'): Promise<string> {
946
- const result = await page.evaluate(buildClickActionJs(labels, scope)) as { ok?: boolean; label?: string };
947
-
948
- if (!result?.ok) {
949
- throw new CommandExecutionError(`Instagram action button not found: ${labels.join(' / ')}`);
950
- }
951
- return result.label || labels[0]!;
952
- }
953
-
954
- async function clickVisibleShareRetry(page: IPage): Promise<boolean> {
955
- const result = await page.evaluate(`
956
- (() => {
957
- const isVisible = (el) => {
958
- if (!(el instanceof HTMLElement)) return false;
959
- const style = window.getComputedStyle(el);
960
- const rect = el.getBoundingClientRect();
961
- return style.display !== 'none'
962
- && style.visibility !== 'hidden'
963
- && rect.width > 0
964
- && rect.height > 0;
965
- };
966
-
967
- const dialogs = Array.from(document.querySelectorAll('[role="dialog"]')).filter((el) => isVisible(el));
968
- for (const dialog of dialogs) {
969
- const text = (dialog.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();
970
- if (!text.includes('post couldn') && !text.includes('could not be shared') && !text.includes('share failed')) continue;
971
-
972
- const retry = Array.from(dialog.querySelectorAll('button, div[role="button"]')).find((el) => {
973
- const label = ((el.textContent || '') + ' ' + (el.getAttribute?.('aria-label') || ''))
974
- .replace(/\\s+/g, ' ')
975
- .trim()
976
- .toLowerCase();
977
- return isVisible(el) && (
978
- label === 'try again'
979
- || label === 'retry'
980
- || label === '再试一次'
981
- || label === '重试'
982
- );
983
- });
984
-
985
- if (retry instanceof HTMLElement) {
986
- retry.click();
987
- return { ok: true };
988
- }
989
- }
990
-
991
- return { ok: false };
992
- })()
993
- `) as { ok?: boolean };
994
-
995
- return !!result?.ok;
996
- }
997
-
998
- async function hasCaptionEditor(page: IPage): Promise<boolean> {
999
- const result = await page.evaluate(`
1000
- (() => {
1001
- const editable = document.querySelector('textarea, [contenteditable="true"]');
1002
- return { ok: !!editable };
1003
- })()
1004
- `) as { ok?: boolean };
1005
-
1006
- return !!result?.ok;
1007
- }
1008
-
1009
- async function isCaptionStage(page: IPage): Promise<boolean> {
1010
- const result = await page.evaluate(`
1011
- (() => {
1012
- const editable = document.querySelector('textarea, [contenteditable="true"]');
1013
- const dialogText = Array.from(document.querySelectorAll('[role="dialog"]'))
1014
- .map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase())
1015
- .join(' ');
1016
- return {
1017
- ok: !!editable
1018
- || dialogText.includes('write a caption')
1019
- || dialogText.includes('add location')
1020
- || dialogText.includes('add collaborators')
1021
- || dialogText.includes('advanced settings'),
1022
- };
1023
- })()
1024
- `) as { ok?: boolean };
1025
-
1026
- return !!result?.ok;
1027
- }
1028
-
1029
- async function advanceToCaptionEditor(page: IPage): Promise<void> {
1030
- for (let attempt = 0; attempt < 3; attempt++) {
1031
- if (await isCaptionStage(page)) {
1032
- return;
1033
- }
1034
- try {
1035
- await clickAction(page, ['Next', '下一步'], 'media');
1036
- } catch (error) {
1037
- if (error instanceof CommandExecutionError) {
1038
- await page.wait({ time: 1.5 });
1039
- if (await isCaptionStage(page)) {
1040
- return;
1041
- }
1042
- const uploadState = await inspectUploadStage(page);
1043
- if (uploadState.state === 'failed') {
1044
- throw makeUploadFailure(uploadState.detail);
1045
- }
1046
- if (attempt < 2) {
1047
- continue;
1048
- }
1049
- }
1050
- throw error;
1051
- }
1052
- await page.wait({ time: 1.5 });
1053
- if (await hasCaptionEditor(page)) {
1054
- return;
1055
- }
1056
- const uploadState = await inspectUploadStage(page);
1057
- if (uploadState.state === 'failed') {
1058
- throw makeUploadFailure(uploadState.detail);
1059
- }
1060
- }
1061
-
1062
- await page.screenshot({ path: '/tmp/instagram_post_caption_debug.png' });
1063
- throw new CommandExecutionError(
1064
- 'Instagram caption editor did not appear',
1065
- 'Instagram may have changed the publish flow; inspect /tmp/instagram_post_caption_debug.png',
1066
- );
1067
- }
1068
-
1069
- async function waitForCaptionEditor(page: IPage): Promise<void> {
1070
- if (!(await hasCaptionEditor(page))) {
1071
- await page.screenshot({ path: '/tmp/instagram_post_caption_debug.png' });
1072
- throw new CommandExecutionError(
1073
- 'Instagram caption editor did not appear',
1074
- 'Instagram may have changed the publish flow; inspect /tmp/instagram_post_caption_debug.png',
1075
- );
1076
- }
1077
- }
1078
-
1079
- async function rethrowUploadFailureIfPresent(page: IPage, originalError: unknown): Promise<never> {
1080
- const uploadState = await inspectUploadStage(page);
1081
- if (uploadState.state === 'failed') {
1082
- throw makeUploadFailure(uploadState.detail);
1083
- }
1084
- throw originalError;
1085
- }
1086
-
1087
- async function focusCaptionEditorForNativeInsert(page: IPage): Promise<boolean> {
1088
- const result = await page.evaluate(`
1089
- (() => {
1090
- const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1091
- if (textarea instanceof HTMLTextAreaElement) {
1092
- textarea.focus();
1093
- textarea.select();
1094
- return { ok: true, kind: 'textarea' };
1095
- }
1096
-
1097
- const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1098
- || document.querySelector('[contenteditable="true"]');
1099
- if (!(editor instanceof HTMLElement)) return { ok: false };
1100
-
1101
- const lexical = editor.__lexicalEditor;
1102
- try {
1103
- if (lexical && typeof lexical.getEditorState === 'function' && typeof lexical.parseEditorState === 'function') {
1104
- const emptyState = {
1105
- root: {
1106
- children: [{
1107
- children: [],
1108
- direction: null,
1109
- format: '',
1110
- indent: 0,
1111
- textFormat: 0,
1112
- textStyle: '',
1113
- type: 'paragraph',
1114
- version: 1,
1115
- }],
1116
- direction: null,
1117
- format: '',
1118
- indent: 0,
1119
- type: 'root',
1120
- version: 1,
1121
- },
1122
- };
1123
- const nextState = lexical.parseEditorState(JSON.stringify(emptyState));
1124
- try {
1125
- lexical.setEditorState(nextState, { tag: 'history-merge', discrete: true });
1126
- } catch {
1127
- lexical.setEditorState(nextState);
1128
- }
1129
- } else {
1130
- editor.textContent = '';
1131
- }
1132
- } catch {
1133
- editor.textContent = '';
1134
- }
1135
-
1136
- editor.focus();
1137
- const selection = window.getSelection();
1138
- if (selection) {
1139
- selection.removeAllRanges();
1140
- const range = document.createRange();
1141
- range.selectNodeContents(editor);
1142
- range.collapse(false);
1143
- selection.addRange(range);
1144
- }
1145
-
1146
- return { ok: true, kind: 'contenteditable' };
1147
- })()
1148
- `) as { ok?: boolean };
1149
-
1150
- return !!result?.ok;
1151
- }
1152
-
1153
- async function fillCaption(page: IPage, content: string): Promise<void> {
1154
- if (page.insertText && await focusCaptionEditorForNativeInsert(page)) {
1155
- try {
1156
- await page.insertText(content);
1157
- await page.wait({ time: 0.3 });
1158
- await page.evaluate(`
1159
- (() => {
1160
- const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1161
- if (textarea instanceof HTMLTextAreaElement) {
1162
- textarea.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType: 'insertText' }));
1163
- textarea.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1164
- textarea.blur();
1165
- return { ok: true };
1166
- }
1167
-
1168
- const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1169
- || document.querySelector('[contenteditable="true"]');
1170
- if (!(editor instanceof HTMLElement)) return { ok: false };
1171
- try {
1172
- editor.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType: 'insertText' }));
1173
- } catch {
1174
- editor.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
1175
- }
1176
- editor.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1177
- editor.blur();
1178
- return { ok: true };
1179
- })()
1180
- `);
1181
- return;
1182
- } catch {
1183
- // Fall back to browser-side editor manipulation below.
1184
- }
1185
- }
1186
-
1187
- const result = await page.evaluate(`
1188
- ((content) => {
1189
- const createParagraph = (text) => ({
1190
- children: text
1191
- ? [{ detail: 0, format: 0, mode: 'normal', style: '', text, type: 'text', version: 1 }]
1192
- : [],
1193
- direction: null,
1194
- format: '',
1195
- indent: 0,
1196
- textFormat: 0,
1197
- textStyle: '',
1198
- type: 'paragraph',
1199
- version: 1,
1200
- });
1201
-
1202
- const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1203
- if (textarea instanceof HTMLTextAreaElement) {
1204
- textarea.focus();
1205
- const dt = new DataTransfer();
1206
- dt.setData('text/plain', content);
1207
- textarea.dispatchEvent(new ClipboardEvent('paste', {
1208
- clipboardData: dt,
1209
- bubbles: true,
1210
- cancelable: true,
1211
- }));
1212
- const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;
1213
- setter?.call(textarea, content);
1214
- textarea.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
1215
- textarea.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1216
- return { ok: true, mode: 'textarea' };
1217
- }
1218
-
1219
- const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1220
- || document.querySelector('[contenteditable="true"]');
1221
- if (editor instanceof HTMLElement) {
1222
- editor.focus();
1223
- const lexical = editor.__lexicalEditor;
1224
- if (lexical && typeof lexical.getEditorState === 'function' && typeof lexical.parseEditorState === 'function') {
1225
- const currentState = lexical.getEditorState && lexical.getEditorState();
1226
- const base = currentState && typeof currentState.toJSON === 'function' ? currentState.toJSON() : {};
1227
- const lines = String(content).split(/\\r?\\n/);
1228
- const paragraphs = lines.map((line) => createParagraph(line));
1229
- base.root = {
1230
- children: paragraphs.length ? paragraphs : [createParagraph('')],
1231
- direction: null,
1232
- format: '',
1233
- indent: 0,
1234
- type: 'root',
1235
- version: 1,
1236
- };
1237
-
1238
- const nextState = lexical.parseEditorState(JSON.stringify(base));
1239
- try {
1240
- lexical.setEditorState(nextState, { tag: 'history-merge', discrete: true });
1241
- } catch {
1242
- lexical.setEditorState(nextState);
1243
- }
1244
-
1245
- editor.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
1246
- editor.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
1247
- const nextCurrentState = lexical.getEditorState && lexical.getEditorState();
1248
- const pendingState = lexical._pendingEditorState;
1249
- return {
1250
- ok: true,
1251
- mode: 'lexical',
1252
- value: editor.textContent || '',
1253
- current: nextCurrentState && typeof nextCurrentState.toJSON === 'function' ? nextCurrentState.toJSON() : null,
1254
- pending: pendingState && typeof pendingState.toJSON === 'function' ? pendingState.toJSON() : null,
1255
- };
1256
- }
1257
-
1258
- const selection = window.getSelection();
1259
- if (selection) {
1260
- selection.removeAllRanges();
1261
- const range = document.createRange();
1262
- range.selectNodeContents(editor);
1263
- selection.addRange(range);
1264
- }
1265
- const dt = new DataTransfer();
1266
- dt.setData('text/plain', content);
1267
- editor.dispatchEvent(new ClipboardEvent('paste', {
1268
- clipboardData: dt,
1269
- bubbles: true,
1270
- cancelable: true,
1271
- }));
1272
- return { ok: true, mode: 'contenteditable', value: editor.textContent || '' };
1273
- }
1274
-
1275
- return { ok: false };
1276
- })(${JSON.stringify(content)})
1277
- `) as { ok?: boolean };
1278
-
1279
- if (!result?.ok) {
1280
- throw new CommandExecutionError('Failed to fill Instagram caption');
1281
- }
1282
- }
1283
-
1284
- async function captionMatches(page: IPage, content: string): Promise<boolean> {
1285
- const result = await page.evaluate(`
1286
- ((content) => {
1287
- const normalized = content.trim();
1288
- const readLexicalText = (node) => {
1289
- if (!node || typeof node !== 'object') return '';
1290
- if (node.type === 'text' && typeof node.text === 'string') return node.text;
1291
- if (!Array.isArray(node.children)) return '';
1292
- if (node.type === 'root') {
1293
- return node.children.map((child) => readLexicalText(child)).join('\\n');
1294
- }
1295
- if (node.type === 'paragraph') {
1296
- return node.children.map((child) => readLexicalText(child)).join('');
1297
- }
1298
- return node.children.map((child) => readLexicalText(child)).join('');
1299
- };
1300
-
1301
- const textarea = document.querySelector('[aria-label="Write a caption..."], textarea');
1302
- if (textarea instanceof HTMLTextAreaElement) {
1303
- return { ok: textarea.value.trim() === normalized };
1304
- }
1305
-
1306
- const editor = document.querySelector('[aria-label="Write a caption..."][contenteditable="true"]')
1307
- || document.querySelector('[contenteditable="true"]');
1308
- if (editor instanceof HTMLElement) {
1309
- const lexical = editor.__lexicalEditor;
1310
- if (lexical && typeof lexical.getEditorState === 'function') {
1311
- const currentState = lexical.getEditorState();
1312
- const pendingState = lexical._pendingEditorState;
1313
- const current = currentState && typeof currentState.toJSON === 'function' ? currentState.toJSON() : null;
1314
- const pending = pendingState && typeof pendingState.toJSON === 'function' ? pendingState.toJSON() : null;
1315
- const currentText = readLexicalText(current && current.root).trim();
1316
- const pendingText = readLexicalText(pending && pending.root).trim();
1317
- if (currentText === normalized || pendingText === normalized) {
1318
- return { ok: true, currentText, pendingText };
1319
- }
1320
- }
1321
-
1322
- const text = (editor.textContent || '').replace(/\\u00a0/g, ' ').trim();
1323
- if (text === normalized) return { ok: true };
1324
-
1325
- const counters = Array.from(document.querySelectorAll('div, span'))
1326
- .map((el) => (el.textContent || '').replace(/\\s+/g, ' ').trim())
1327
- .filter(Boolean);
1328
- const counter = counters.find((value) => /\\d+\\s*\\/\\s*2,?200/.test(value));
1329
- if (counter) {
1330
- const match = counter.match(/(\\d+)\\s*\\/\\s*2,?200/);
1331
- if (match && Number(match[1]) >= normalized.length) return { ok: true };
1332
- }
1333
-
1334
- return { ok: false, text, counter: counter || '' };
1335
- }
1336
-
1337
- return { ok: false };
1338
- })(${JSON.stringify(content)})
1339
- `) as { ok?: boolean };
1340
-
1341
- return !!result?.ok;
1342
- }
1343
-
1344
- async function ensureCaptionFilled(page: IPage, content: string): Promise<void> {
1345
- for (let attempt = 0; attempt < 6; attempt++) {
1346
- if (await captionMatches(page, content)) {
1347
- return;
1348
- }
1349
- if (attempt < 5) {
1350
- await page.wait({ time: 0.5 });
1351
- }
1352
- }
1353
-
1354
- await page.screenshot({ path: '/tmp/instagram_post_caption_fill_debug.png' });
1355
- throw new CommandExecutionError(
1356
- 'Instagram caption did not stick before sharing',
1357
- 'Inspect /tmp/instagram_post_caption_fill_debug.png for the caption editor state',
1358
- );
1359
- }
1360
-
1361
- async function waitForPublishSuccess(page: IPage): Promise<string> {
1362
- let settledStreak = 0;
1363
- for (let attempt = 0; attempt < 90; attempt++) {
1364
- const result = await page.evaluate(buildPublishStatusProbeJs()) as { ok?: boolean; failed?: boolean; settled?: boolean; url?: string };
1365
-
1366
- if (result?.failed) {
1367
- await page.screenshot({ path: '/tmp/instagram_post_share_debug.png' });
1368
- throw new CommandExecutionError(
1369
- 'Instagram post share failed',
1370
- 'Inspect /tmp/instagram_post_share_debug.png for the share failure state',
1371
- );
1372
- }
1373
-
1374
- if (result?.ok) {
1375
- return result.url || '';
1376
- }
1377
- if (result?.settled) {
1378
- settledStreak += 1;
1379
- if (settledStreak >= 3) return '';
1380
- } else {
1381
- settledStreak = 0;
1382
- }
1383
- if (attempt < 89) {
1384
- await page.wait({ time: 1 });
1385
- }
1386
- }
1387
-
1388
- await page.screenshot({ path: '/tmp/instagram_post_share_debug.png' });
1389
- throw new CommandExecutionError(
1390
- 'Instagram post share confirmation did not appear',
1391
- 'Inspect /tmp/instagram_post_share_debug.png for the final publish state',
1392
- );
1393
- }
1394
-
1395
- async function resolveCurrentUserId(page: IPage): Promise<string> {
1396
- const cookies = await page.getCookies({ domain: 'instagram.com' });
1397
- return cookies.find((cookie) => cookie.name === 'ds_user_id')?.value || '';
1398
- }
1399
-
1400
- async function resolveProfileUrl(page: IPage, currentUserId = ''): Promise<string> {
1401
- if (currentUserId) {
1402
- const runtimeInfo = await resolveInstagramRuntimeInfo(page);
1403
- const apiResult = await page.evaluate(`
1404
- (async () => {
1405
- const userId = ${JSON.stringify(currentUserId)};
1406
- const appId = ${JSON.stringify(runtimeInfo.appId || '')};
1407
- try {
1408
- const res = await fetch(
1409
- 'https://www.instagram.com/api/v1/users/' + encodeURIComponent(userId) + '/info/',
1410
- {
1411
- credentials: 'include',
1412
- headers: appId ? { 'X-IG-App-ID': appId } : {},
1413
- },
1414
- );
1415
- if (!res.ok) return { ok: false };
1416
- const data = await res.json();
1417
- const username = data?.user?.username || '';
1418
- return { ok: !!username, username };
1419
- } catch {
1420
- return { ok: false };
1421
- }
1422
- })()
1423
- `) as { ok?: boolean; username?: string };
1424
-
1425
- if (apiResult?.ok && apiResult.username) {
1426
- return new URL(`/${apiResult.username}/`, INSTAGRAM_HOME_URL).toString();
1427
- }
1428
- }
1429
-
1430
- const result = await page.evaluate(`
1431
- (() => {
1432
- const isVisible = (el) => {
1433
- if (!(el instanceof HTMLElement)) return false;
1434
- const style = window.getComputedStyle(el);
1435
- const rect = el.getBoundingClientRect();
1436
- return style.display !== 'none'
1437
- && style.visibility !== 'hidden'
1438
- && rect.width > 0
1439
- && rect.height > 0;
1440
- };
1441
-
1442
- const anchors = Array.from(document.querySelectorAll('a[href]'))
1443
- .filter((el) => el instanceof HTMLAnchorElement && isVisible(el))
1444
- .map((el) => ({
1445
- href: el.getAttribute('href') || '',
1446
- text: (el.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase(),
1447
- aria: (el.getAttribute('aria-label') || '').replace(/\\s+/g, ' ').trim().toLowerCase(),
1448
- }))
1449
- .filter((el) => /^\\/[^/?#]+\\/$/.test(el.href));
1450
-
1451
- const explicitProfile = anchors.find((el) => el.text === 'profile' || el.aria === 'profile')?.href || '';
1452
- const path = explicitProfile;
1453
- return { ok: !!path, path };
1454
- })()
1455
- `) as { ok?: boolean; path?: string };
1456
-
1457
- if (!result?.ok || !result.path) return '';
1458
- return new URL(result.path, INSTAGRAM_HOME_URL).toString();
1459
- }
1460
-
1461
- async function collectVisibleProfilePostPaths(page: IPage): Promise<string[]> {
1462
- const result = await page.evaluate(`
1463
- (() => {
1464
- const isVisible = (el) => {
1465
- if (!(el instanceof HTMLElement)) return false;
1466
- const style = window.getComputedStyle(el);
1467
- const rect = el.getBoundingClientRect();
1468
- return style.display !== 'none'
1469
- && style.visibility !== 'hidden'
1470
- && rect.width > 0
1471
- && rect.height > 0;
1472
- };
1473
-
1474
- const hrefs = Array.from(document.querySelectorAll('a[href*="/p/"]'))
1475
- .filter((el) => el instanceof HTMLAnchorElement && isVisible(el))
1476
- .map((el) => el.getAttribute('href') || '')
1477
- .filter((href) => /^\\/(?:[^/?#]+\\/)?p\\/[^/?#]+\\/?$/.test(href))
1478
- .filter((href, index, arr) => arr.indexOf(href) === index);
1479
-
1480
- return { ok: hrefs.length > 0, hrefs };
1481
- })()
1482
- `) as { ok?: boolean; hrefs?: string[] };
1483
-
1484
- return Array.isArray(result?.hrefs) ? result.hrefs.filter(Boolean) : [];
1485
- }
1486
-
1487
- async function captureExistingProfilePostPaths(page: IPage): Promise<Set<string>> {
1488
- const currentUserId = await resolveCurrentUserId(page);
1489
- if (!currentUserId) return new Set();
1490
-
1491
- const profileUrl = await resolveProfileUrl(page, currentUserId);
1492
- if (!profileUrl) return new Set();
1493
-
1494
- try {
1495
- await page.goto(profileUrl);
1496
- await page.wait({ time: 3 });
1497
- return new Set(await collectVisibleProfilePostPaths(page));
1498
- } catch {
1499
- return new Set();
1500
- }
1501
- }
1502
-
1503
- async function resolveLatestPostUrl(page: IPage, existingPostPaths: ReadonlySet<string>): Promise<string> {
1504
- const currentUrl = await page.getCurrentUrl?.();
1505
- if (currentUrl && /\/p\//.test(currentUrl)) return currentUrl;
1506
-
1507
- const currentUserId = await resolveCurrentUserId(page);
1508
- const profileUrl = await resolveProfileUrl(page, currentUserId);
1509
- if (!profileUrl) return '';
1510
-
1511
- await page.goto(profileUrl);
1512
- await page.wait({ time: 4 });
1513
-
1514
- for (let attempt = 0; attempt < 8; attempt++) {
1515
- const hrefs = await collectVisibleProfilePostPaths(page);
1516
- const href = hrefs.find((candidate) => !existingPostPaths.has(candidate)) || '';
1517
- if (href) {
1518
- return new URL(href, INSTAGRAM_HOME_URL).toString();
1519
- }
1520
-
1521
- if (attempt < 7) await page.wait({ time: 1 });
1522
- }
1523
-
1524
- return '';
1525
- }
1526
-
1527
- cli({
1528
- site: 'instagram',
1529
- name: 'post',
1530
- description: 'Post an Instagram feed image or mixed-media carousel',
1531
- domain: 'www.instagram.com',
1532
- strategy: Strategy.UI,
1533
- browser: true,
1534
- timeoutSeconds: 300,
1535
- args: [
1536
- { name: 'media', required: false, valueRequired: true, help: `Comma-separated media paths (images/videos, up to ${MAX_MEDIA_ITEMS})` },
1537
- { name: 'content', positional: true, required: false, help: 'Caption text' },
1538
- ],
1539
- columns: ['status', 'detail', 'url'],
1540
- validateArgs: validateInstagramPostArgs,
1541
- func: async (page: IPage | null, kwargs) => {
1542
- const browserPage = requirePage(page);
1543
- const mediaItems = normalizePostMediaItems(kwargs as Record<string, unknown>);
1544
- const content = String(kwargs.content ?? '').trim();
1545
- const existingPostPaths = await captureExistingProfilePostPaths(browserPage);
1546
- const commandAttemptBudget = getCommandAttemptBudget(mediaItems);
1547
- const preUploadDelaySeconds = getPreUploadDelaySeconds(mediaItems);
1548
- const uploadAttemptBudget = getUploadAttemptBudget(mediaItems);
1549
- const previewProbeWindowSeconds = getPreviewProbeWindowSeconds(mediaItems);
1550
- const finalPreviewWaitSeconds = getFinalPreviewWaitSeconds(mediaItems);
1551
- const preShareDelaySeconds = getPreShareDelaySeconds(mediaItems);
1552
- const inlineUploadRetryBudget = getInlineUploadRetryBudget(mediaItems);
1553
- const protocolCaptureEnabled = process.env.OPENCLI_INSTAGRAM_CAPTURE === '1';
1554
- const protocolCaptureData: InstagramProtocolCaptureEntry[] = [];
1555
- const protocolCaptureErrors: string[] = [];
1556
-
1557
- const installProtocolCapture = async (): Promise<void> => {
1558
- if (!protocolCaptureEnabled) return;
1559
- await installInstagramProtocolCapture(browserPage);
1560
- };
1561
-
1562
- const drainProtocolCapture = async (): Promise<void> => {
1563
- if (!protocolCaptureEnabled) return;
1564
- const payload = await readInstagramProtocolCapture(browserPage);
1565
- if (payload.data.length) protocolCaptureData.push(...payload.data);
1566
- if (payload.errors.length) protocolCaptureErrors.push(...payload.errors);
1567
- };
1568
-
1569
- try {
1570
- try {
1571
- return await executePrivateInstagramPost({
1572
- page: browserPage,
1573
- mediaItems,
1574
- content,
1575
- existingPostPaths,
1576
- });
1577
- } catch (error) {
1578
- if (error instanceof AuthRequiredError || !isSafePrivateRouteFallbackError(error)) {
1579
- throw error;
1580
- }
1581
- try {
1582
- return await executeUiInstagramPost({
1583
- page: browserPage,
1584
- mediaItems,
1585
- content,
1586
- existingPostPaths,
1587
- commandAttemptBudget,
1588
- preUploadDelaySeconds,
1589
- uploadAttemptBudget,
1590
- previewProbeWindowSeconds,
1591
- finalPreviewWaitSeconds,
1592
- preShareDelaySeconds,
1593
- inlineUploadRetryBudget,
1594
- installProtocolCapture,
1595
- drainProtocolCapture,
1596
- forceFreshStart: true,
1597
- });
1598
- } catch (uiError) {
1599
- if (uiError instanceof AuthRequiredError) throw uiError;
1600
- if (uiError instanceof CommandExecutionError) {
1601
- throw new CommandExecutionError(uiError.message, buildFallbackHint(error, uiError));
1602
- }
1603
- throw uiError;
1604
- }
1605
- }
1606
- } finally {
1607
- if (protocolCaptureEnabled) {
1608
- try {
1609
- await drainProtocolCapture();
1610
- } catch {
1611
- // Best-effort: capture export should not hide the main command result.
1612
- }
1613
- fs.writeFileSync(INSTAGRAM_PROTOCOL_TRACE_OUTPUT_PATH, JSON.stringify({
1614
- data: protocolCaptureData,
1615
- errors: protocolCaptureErrors,
1616
- }, null, 2));
1617
- }
1618
- }
1619
- },
1620
- });