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