@jackwener/opencli 1.6.2 → 1.6.3

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