publishport-opencli 1.0.20 → 1.0.21

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 (1041) hide show
  1. package/clis/12306/me.js +2 -2
  2. package/clis/12306/orders.js +3 -3
  3. package/clis/12306/passengers.js +3 -3
  4. package/clis/12306/price.js +1 -1
  5. package/clis/12306/stations.js +1 -1
  6. package/clis/12306/train.js +1 -1
  7. package/clis/12306/trains.js +1 -1
  8. package/clis/12306/utils.js +1 -1
  9. package/clis/1688/download.js +1 -1
  10. package/clis/1688/item.js +4 -4
  11. package/clis/1688/search.js +4 -4
  12. package/clis/1688/store.js +4 -4
  13. package/clis/1point3acres/forum.js +1 -1
  14. package/clis/1point3acres/forums.js +1 -1
  15. package/clis/1point3acres/notifications.js +1 -1
  16. package/clis/1point3acres/search.js +1 -1
  17. package/clis/1point3acres/thread.js +2 -2
  18. package/clis/1point3acres/user.js +1 -1
  19. package/clis/1point3acres/utils.js +2 -2
  20. package/clis/36kr/article.js +2 -2
  21. package/clis/36kr/hot.js +2 -2
  22. package/clis/36kr/news.js +1 -1
  23. package/clis/36kr/search.js +2 -2
  24. package/clis/51job/company.js +2 -2
  25. package/clis/51job/detail.js +2 -2
  26. package/clis/51job/hot.js +1 -1
  27. package/clis/51job/search.js +1 -1
  28. package/clis/51job/utils.js +7 -7
  29. package/clis/_atlassian/shared.js +9 -9
  30. package/clis/_shared/article/auth.js +4 -4
  31. package/clis/_shared/article/douban-md2draft.js +4 -4
  32. package/clis/_shared/article/format.js +1 -1
  33. package/clis/_shared/article/images.js +7 -7
  34. package/clis/_shared/article/login.js +1 -1
  35. package/clis/_shared/article/publish.js +11 -11
  36. package/clis/_shared/common.js +1 -1
  37. package/clis/_shared/content-guard.js +1 -1
  38. package/clis/_shared/desktop-commands.js +1 -1
  39. package/clis/_shared/file-inject.js +12 -12
  40. package/clis/_shared/self-hosted-sites.js +2 -2
  41. package/clis/_shared/site-auth.js +1 -1
  42. package/clis/_shared/token-auth.js +2 -2
  43. package/clis/_shared/video-publish.js +9 -9
  44. package/clis/amazon/offer.js +3 -3
  45. package/clis/amazon/product.js +5 -5
  46. package/clis/amazon/shared.js +6 -6
  47. package/clis/antigravity/_actions.js +13 -13
  48. package/clis/antigravity/audit-extras.js +10 -10
  49. package/clis/antigravity/delete.js +1 -1
  50. package/clis/antigravity/model.js +6 -6
  51. package/clis/antigravity/new.js +2 -2
  52. package/clis/antigravity/read.js +2 -2
  53. package/clis/antigravity/rename.js +1 -1
  54. package/clis/antigravity/send.js +3 -3
  55. package/clis/antigravity/serve.js +17 -17
  56. package/clis/antigravity/storage.js +6 -6
  57. package/clis/antigravity/watch.js +2 -2
  58. package/clis/apple-podcasts/episodes.js +1 -1
  59. package/clis/apple-podcasts/top.js +1 -1
  60. package/clis/apple-podcasts/utils.js +1 -1
  61. package/clis/archive/item.js +1 -1
  62. package/clis/archive/search.js +1 -1
  63. package/clis/archive/snapshots.js +1 -1
  64. package/clis/archive/wayback.js +1 -1
  65. package/clis/arxiv/author.js +1 -1
  66. package/clis/arxiv/utils.js +1 -1
  67. package/clis/autohome/brand.js +1 -1
  68. package/clis/autohome/score.js +1 -1
  69. package/clis/autohome/utils.js +1 -1
  70. package/clis/baijiahao/article.js +1 -1
  71. package/clis/baijiahao/lists.js +1 -1
  72. package/clis/baijiahao/login.js +1 -1
  73. package/clis/baijiahao/publish.js +9 -9
  74. package/clis/baijiahao/stats.js +1 -1
  75. package/clis/baijiahao/whoami.js +1 -1
  76. package/clis/band/bands.js +2 -2
  77. package/clis/band/mentions.js +2 -2
  78. package/clis/band/post.js +4 -4
  79. package/clis/band/posts.js +3 -3
  80. package/clis/barchart/flow.js +3 -3
  81. package/clis/barchart/greeks.js +2 -2
  82. package/clis/barchart/quote.js +3 -3
  83. package/clis/bbc/news.js +1 -1
  84. package/clis/bbc/topic.js +1 -1
  85. package/clis/bbc/utils.js +1 -1
  86. package/clis/bilibili/article.js +1 -1
  87. package/clis/bilibili/categories.js +1 -1
  88. package/clis/bilibili/coin.js +1 -1
  89. package/clis/bilibili/comment-del.js +1 -1
  90. package/clis/bilibili/comment-like.js +1 -1
  91. package/clis/bilibili/comment.js +1 -1
  92. package/clis/bilibili/comments.js +1 -1
  93. package/clis/bilibili/dm-list.js +1 -1
  94. package/clis/bilibili/dm-read.js +1 -1
  95. package/clis/bilibili/dm-send.js +1 -1
  96. package/clis/bilibili/download.js +2 -2
  97. package/clis/bilibili/drafts.js +1 -1
  98. package/clis/bilibili/dynamic-post.js +3 -3
  99. package/clis/bilibili/favorite-add.js +1 -1
  100. package/clis/bilibili/favorite.js +1 -1
  101. package/clis/bilibili/feed.js +2 -2
  102. package/clis/bilibili/follow.js +1 -1
  103. package/clis/bilibili/following.js +1 -1
  104. package/clis/bilibili/like.js +1 -1
  105. package/clis/bilibili/partitions.js +1 -1
  106. package/clis/bilibili/stats.js +1 -1
  107. package/clis/bilibili/subtitle.js +3 -3
  108. package/clis/bilibili/summary.js +1 -1
  109. package/clis/bilibili/topics.js +1 -1
  110. package/clis/bilibili/unfollow.js +1 -1
  111. package/clis/bilibili/upload.js +1 -1
  112. package/clis/bilibili/utils.js +10 -10
  113. package/clis/bilibili/video-drafts.js +1 -1
  114. package/clis/bilibili/video.js +1 -1
  115. package/clis/bloomberg/businessweek.js +4 -4
  116. package/clis/bloomberg/news.js +2 -2
  117. package/clis/bloomberg/utils.js +13 -13
  118. package/clis/bluesky/post.js +1 -1
  119. package/clis/bluesky/shared.js +11 -11
  120. package/clis/bluesky/whoami.js +1 -1
  121. package/clis/booking/search.js +2 -2
  122. package/clis/boss/accept.js +1 -1
  123. package/clis/boss/applied.js +1 -1
  124. package/clis/boss/auth.js +1 -1
  125. package/clis/boss/batchgreet.js +1 -1
  126. package/clis/boss/bossinfo.js +1 -1
  127. package/clis/boss/chatlist.js +1 -1
  128. package/clis/boss/chatmsg.js +1 -1
  129. package/clis/boss/cities.js +1 -1
  130. package/clis/boss/detail.js +1 -1
  131. package/clis/boss/exchange.js +1 -1
  132. package/clis/boss/greet.js +1 -1
  133. package/clis/boss/interviews.js +1 -1
  134. package/clis/boss/invite.js +1 -1
  135. package/clis/boss/joblist.js +1 -1
  136. package/clis/boss/mark.js +1 -1
  137. package/clis/boss/me.js +2 -2
  138. package/clis/boss/recommend.js +1 -1
  139. package/clis/boss/resumedelete.js +1 -1
  140. package/clis/boss/resumelist.js +1 -1
  141. package/clis/boss/resumeupload.js +11 -11
  142. package/clis/boss/search.js +1 -1
  143. package/clis/boss/send.js +1 -1
  144. package/clis/boss/sendresume.js +1 -1
  145. package/clis/boss/stats.js +1 -1
  146. package/clis/boss/unread.js +1 -1
  147. package/clis/boss/utils.js +13 -13
  148. package/clis/chaoxing/assignments.js +1 -1
  149. package/clis/chaoxing/exams.js +1 -1
  150. package/clis/chaoxing/utils.js +9 -9
  151. package/clis/chatgpt/ask.js +1 -1
  152. package/clis/chatgpt/auth.js +2 -2
  153. package/clis/chatgpt/detail.js +1 -1
  154. package/clis/chatgpt/image.js +1 -1
  155. package/clis/chatgpt/read.js +1 -1
  156. package/clis/chatgpt/send.js +1 -1
  157. package/clis/chatgpt/utils.js +59 -59
  158. package/clis/chatgpt-app/ask.js +1 -1
  159. package/clis/chatgpt-app/send.js +1 -1
  160. package/clis/chatwise/model.js +6 -6
  161. package/clis/chess/analyze.js +1 -1
  162. package/clis/chess/game.js +1 -1
  163. package/clis/chess/games.js +1 -1
  164. package/clis/chess/stats.js +1 -1
  165. package/clis/chess/utils.js +1 -1
  166. package/clis/claude/ask.js +2 -2
  167. package/clis/claude/detail.js +1 -1
  168. package/clis/claude/new.js +1 -1
  169. package/clis/claude/read.js +1 -1
  170. package/clis/claude/send.js +1 -1
  171. package/clis/claude/utils.js +23 -23
  172. package/clis/cnblogs/article.js +1 -1
  173. package/clis/cnblogs/login.js +1 -1
  174. package/clis/cnblogs/stats.js +7 -7
  175. package/clis/cnblogs/whoami.js +1 -1
  176. package/clis/codex/_actions.js +3 -3
  177. package/clis/codex/archive.js +1 -1
  178. package/clis/codex/ask.js +6 -6
  179. package/clis/codex/model.js +8 -8
  180. package/clis/codex/pin.js +1 -1
  181. package/clis/codex/rename.js +4 -4
  182. package/clis/codex/send.js +3 -3
  183. package/clis/codex/sidebar.js +1 -1
  184. package/clis/coingecko/categories.js +1 -1
  185. package/clis/coingecko/coin.js +1 -1
  186. package/clis/coingecko/derivatives.js +1 -1
  187. package/clis/coingecko/exchanges.js +1 -1
  188. package/clis/coingecko/global.js +1 -1
  189. package/clis/coingecko/trending.js +1 -1
  190. package/clis/confluence/search.js +1 -1
  191. package/clis/coupang/product.js +3 -3
  192. package/clis/coupang/utils.js +1 -1
  193. package/clis/crates/crate.js +1 -1
  194. package/clis/crates/search.js +1 -1
  195. package/clis/crates/utils.js +1 -1
  196. package/clis/csdn/article.js +13 -13
  197. package/clis/csdn/columns.js +1 -1
  198. package/clis/csdn/login.js +1 -1
  199. package/clis/csdn/stats.js +4 -4
  200. package/clis/csdn/whoami.js +1 -1
  201. package/clis/cto51/article.js +1 -1
  202. package/clis/cto51/whoami.js +1 -1
  203. package/clis/ctrip/flight.js +2 -2
  204. package/clis/ctrip/hotel-search.js +3 -3
  205. package/clis/ctrip/hotel-suggest.js +1 -1
  206. package/clis/ctrip/search.js +1 -1
  207. package/clis/ctrip/utils.js +6 -6
  208. package/clis/cursor/ask.js +5 -5
  209. package/clis/cursor/composer.js +2 -2
  210. package/clis/cursor/model.js +4 -4
  211. package/clis/cursor/send.js +2 -2
  212. package/clis/dblp/author.js +1 -1
  213. package/clis/dblp/paper.js +1 -1
  214. package/clis/dblp/search.js +1 -1
  215. package/clis/dblp/utils.js +1 -1
  216. package/clis/dblp/venue.js +1 -1
  217. package/clis/deepseek/ask.js +1 -1
  218. package/clis/deepseek/auth.js +2 -2
  219. package/clis/deepseek/detail.js +1 -1
  220. package/clis/deepseek/new.js +1 -1
  221. package/clis/deepseek/read.js +1 -1
  222. package/clis/deepseek/send.js +7 -7
  223. package/clis/deepseek/utils.js +25 -25
  224. package/clis/defillama/protocol.js +1 -1
  225. package/clis/defillama/protocols.js +1 -1
  226. package/clis/defillama/utils.js +1 -1
  227. package/clis/devto/auth.js +2 -2
  228. package/clis/devto/latest.js +1 -1
  229. package/clis/devto/publish.js +5 -5
  230. package/clis/devto/read.js +2 -2
  231. package/clis/devto/stats.js +3 -3
  232. package/clis/dianping/auth.js +2 -2
  233. package/clis/dianping/cityResolver.js +2 -2
  234. package/clis/dianping/search.js +1 -1
  235. package/clis/dianping/shop.js +1 -1
  236. package/clis/dianping/utils.js +1 -1
  237. package/clis/discord-app/delete.js +3 -3
  238. package/clis/discord-app/read.js +1 -1
  239. package/clis/discord-app/thread-read.js +1 -1
  240. package/clis/discord-web/auth.js +2 -2
  241. package/clis/discord-web/send.js +5 -5
  242. package/clis/dockerhub/image.js +1 -1
  243. package/clis/dockerhub/search.js +1 -1
  244. package/clis/dockerhub/utils.js +1 -1
  245. package/clis/dongchedi/koubei.js +1 -1
  246. package/clis/dongchedi/models.js +1 -1
  247. package/clis/dongchedi/score.js +1 -1
  248. package/clis/dongchedi/search.js +1 -1
  249. package/clis/dongchedi/series.js +1 -1
  250. package/clis/dongchedi/specs.js +1 -1
  251. package/clis/dongchedi/utils.js +1 -1
  252. package/clis/douban/article.js +3 -3
  253. package/clis/douban/auth.js +2 -2
  254. package/clis/douban/download.js +1 -1
  255. package/clis/douban/utils.js +23 -23
  256. package/clis/doubao/auth.js +3 -3
  257. package/clis/doubao/utils.js +39 -39
  258. package/clis/doubao-app/ask.js +1 -1
  259. package/clis/doubao-app/utils.js +4 -4
  260. package/clis/douyin/_shared/browser-fetch.js +7 -7
  261. package/clis/douyin/_shared/draft-cache.js +1 -1
  262. package/clis/douyin/_shared/imagex-upload.js +1 -1
  263. package/clis/douyin/_shared/sts2.js +1 -1
  264. package/clis/douyin/_shared/text-extra.js +1 -1
  265. package/clis/douyin/_shared/tos-upload.js +4 -4
  266. package/clis/douyin/_shared/transcode.js +1 -1
  267. package/clis/douyin/_shared/vod-upload.js +4 -4
  268. package/clis/douyin/draft.js +18 -18
  269. package/clis/douyin/drafts.js +1 -1
  270. package/clis/douyin/publish-image.js +12 -12
  271. package/clis/douyin/publish.js +9 -9
  272. package/clis/douyin/search.js +3 -3
  273. package/clis/douyin/videos.js +1 -1
  274. package/clis/eastmoney/_secid.js +1 -1
  275. package/clis/eastmoney/announcement.js +1 -1
  276. package/clis/eastmoney/article.js +1 -1
  277. package/clis/eastmoney/convertible.js +1 -1
  278. package/clis/eastmoney/etf.js +1 -1
  279. package/clis/eastmoney/holders.js +1 -1
  280. package/clis/eastmoney/index-board.js +1 -1
  281. package/clis/eastmoney/kline.js +1 -1
  282. package/clis/eastmoney/kuaixun.js +1 -1
  283. package/clis/eastmoney/longhu.js +1 -1
  284. package/clis/eastmoney/money-flow.js +1 -1
  285. package/clis/eastmoney/northbound.js +1 -1
  286. package/clis/eastmoney/quote.js +1 -1
  287. package/clis/eastmoney/rank.js +1 -1
  288. package/clis/eastmoney/sectors.js +1 -1
  289. package/clis/endoflife/product.js +1 -1
  290. package/clis/endoflife/utils.js +1 -1
  291. package/clis/facebook/comment.js +8 -8
  292. package/clis/facebook/feed.js +4 -4
  293. package/clis/facebook/like.js +5 -5
  294. package/clis/facebook/notifications.js +3 -3
  295. package/clis/facebook/post.js +11 -11
  296. package/clis/facebook/search.js +3 -3
  297. package/clis/flathub/app.js +1 -1
  298. package/clis/flathub/search.js +1 -1
  299. package/clis/flathub/utils.js +1 -1
  300. package/clis/flomo/memos.js +1 -1
  301. package/clis/gemini/deep-research-result.js +4 -4
  302. package/clis/gemini/deep-research.js +1 -1
  303. package/clis/gemini/detail.js +1 -1
  304. package/clis/gemini/history.js +1 -1
  305. package/clis/gemini/image.js +2 -2
  306. package/clis/gemini/status.js +1 -1
  307. package/clis/gemini/utils.js +43 -43
  308. package/clis/geogebra/hexagon.js +1 -1
  309. package/clis/geogebra/info.js +3 -3
  310. package/clis/geogebra/triangle.js +1 -1
  311. package/clis/geogebra/utils.js +11 -11
  312. package/clis/ghost/login.js +1 -1
  313. package/clis/ghost/shared.js +2 -2
  314. package/clis/gitee/auth.js +2 -2
  315. package/clis/github-trending/repos.js +1 -1
  316. package/clis/google/news.js +1 -1
  317. package/clis/google/search.js +2 -2
  318. package/clis/google/suggest.js +1 -1
  319. package/clis/google/trends.js +1 -1
  320. package/clis/google/utils.js +1 -1
  321. package/clis/goproxy/module.js +1 -1
  322. package/clis/goproxy/utils.js +1 -1
  323. package/clis/goproxy/versions.js +1 -1
  324. package/clis/gov-policy/recent.js +2 -2
  325. package/clis/gov-policy/search.js +2 -2
  326. package/clis/grok/ask.js +1 -1
  327. package/clis/grok/detail.js +1 -1
  328. package/clis/grok/image.js +8 -8
  329. package/clis/grok/pin.js +1 -1
  330. package/clis/grok/send.js +1 -1
  331. package/clis/grok/status.js +1 -1
  332. package/clis/grok/utils.js +21 -21
  333. package/clis/guazi/browse.js +1 -1
  334. package/clis/guazi/car.js +1 -1
  335. package/clis/guazi/utils.js +1 -1
  336. package/clis/hackernews/auth.js +2 -2
  337. package/clis/hackernews/comment.js +8 -8
  338. package/clis/hackernews/read.js +7 -7
  339. package/clis/hackernews/submit.js +7 -7
  340. package/clis/hashnode/auth.js +3 -3
  341. package/clis/hashnode/publish.js +14 -14
  342. package/clis/hf/auth.js +2 -2
  343. package/clis/hf/models.js +1 -1
  344. package/clis/hf/paper.js +1 -1
  345. package/clis/hf/spaces.js +1 -1
  346. package/clis/hf/top.js +1 -1
  347. package/clis/homebrew/cask.js +1 -1
  348. package/clis/homebrew/formula.js +1 -1
  349. package/clis/homebrew/popular.js +1 -1
  350. package/clis/homebrew/utils.js +1 -1
  351. package/clis/huodongxing/events.js +1 -1
  352. package/clis/hupu/detail.js +4 -4
  353. package/clis/hupu/hot.js +3 -3
  354. package/clis/hupu/reply.js +1 -1
  355. package/clis/hupu/search.js +1 -1
  356. package/clis/hupu/unlike.js +1 -1
  357. package/clis/hupu/utils.js +10 -10
  358. package/clis/imdb/person.js +2 -2
  359. package/clis/imdb/reviews.js +3 -3
  360. package/clis/imdb/search.js +2 -2
  361. package/clis/imdb/title.js +1 -1
  362. package/clis/imdb/top.js +1 -1
  363. package/clis/imdb/trending.js +1 -1
  364. package/clis/imdb/utils.js +13 -13
  365. package/clis/imooc/article.js +6 -6
  366. package/clis/imooc/login.js +1 -1
  367. package/clis/imooc/whoami.js +1 -1
  368. package/clis/indeed/job.js +2 -2
  369. package/clis/indeed/search.js +2 -2
  370. package/clis/indeed/utils.js +1 -1
  371. package/clis/infoq/article.js +2 -2
  372. package/clis/infoq/login.js +1 -1
  373. package/clis/infoq/whoami.js +1 -1
  374. package/clis/instagram/_shared/private-publish.js +4 -4
  375. package/clis/instagram/_shared/protocol-capture.js +9 -9
  376. package/clis/instagram/detail.js +3 -3
  377. package/clis/instagram/post.js +25 -25
  378. package/clis/instagram/reel.js +18 -18
  379. package/clis/instagram/story.js +4 -4
  380. package/clis/instagram/user.js +2 -2
  381. package/clis/jd/item.js +65 -65
  382. package/clis/jianshu/article.js +1 -1
  383. package/clis/jianshu/login.js +1 -1
  384. package/clis/jianshu/notebooks.js +1 -1
  385. package/clis/jianshu/whoami.js +1 -1
  386. package/clis/jianyu/search.js +6 -6
  387. package/clis/jianyu/shared/procurement-contract.js +1 -1
  388. package/clis/jike/api.js +6 -6
  389. package/clis/jike/auth.js +3 -3
  390. package/clis/jike/comment.js +1 -1
  391. package/clis/jike/create.js +6 -6
  392. package/clis/jike/feed.js +3 -3
  393. package/clis/jike/like.js +1 -1
  394. package/clis/jike/notifications.js +3 -3
  395. package/clis/jike/repost.js +13 -13
  396. package/clis/jike/search.js +3 -3
  397. package/clis/jimeng/auth.js +2 -2
  398. package/clis/jimeng/generate.js +10 -10
  399. package/clis/jira/shared.js +1 -1
  400. package/clis/juejin/article.js +4 -4
  401. package/clis/juejin/categories.js +1 -1
  402. package/clis/juejin/hot.js +1 -1
  403. package/clis/juejin/login.js +1 -1
  404. package/clis/juejin/recommend.js +1 -1
  405. package/clis/juejin/stats.js +3 -3
  406. package/clis/juejin/tags.js +1 -1
  407. package/clis/juejin/utils.js +1 -1
  408. package/clis/juejin/whoami.js +1 -1
  409. package/clis/ke/utils.js +4 -4
  410. package/clis/kimi/_utils.js +7 -7
  411. package/clis/kimi/audit-extras.js +14 -14
  412. package/clis/kimi/auth.js +3 -3
  413. package/clis/kimi/chat.js +15 -15
  414. package/clis/kimi/storage.js +5 -5
  415. package/clis/kimi/ui.js +13 -13
  416. package/clis/kimi/usage.js +3 -3
  417. package/clis/kuaishou/auth.js +1 -1
  418. package/clis/kuaishou/publish.js +6 -6
  419. package/clis/lesswrong/_helpers.js +5 -5
  420. package/clis/lesswrong/comments.js +5 -5
  421. package/clis/lichess/top.js +1 -1
  422. package/clis/lichess/user.js +1 -1
  423. package/clis/lichess/utils.js +1 -1
  424. package/clis/linkedin/comment.js +1 -1
  425. package/clis/linkedin/connect.js +11 -11
  426. package/clis/linkedin/create.js +5 -5
  427. package/clis/linkedin/follow.js +1 -1
  428. package/clis/linkedin/inbox.js +1 -1
  429. package/clis/linkedin/job-detail.js +3 -3
  430. package/clis/linkedin/like.js +1 -1
  431. package/clis/linkedin/notifications.js +1 -1
  432. package/clis/linkedin/people-search.js +1 -1
  433. package/clis/linkedin/post-comments.js +1 -1
  434. package/clis/linkedin/post-detail.js +1 -1
  435. package/clis/linkedin/profile-analytics.js +1 -1
  436. package/clis/linkedin/profile-api.js +13 -13
  437. package/clis/linkedin/profile-experience.js +1 -1
  438. package/clis/linkedin/profile-projects.js +1 -1
  439. package/clis/linkedin/profile-read.js +3 -3
  440. package/clis/linkedin/reply.js +1 -1
  441. package/clis/linkedin/repost.js +1 -1
  442. package/clis/linkedin/safe-send.js +8 -8
  443. package/clis/linkedin/salesnav-inbox.js +5 -5
  444. package/clis/linkedin/salesnav-message.js +3 -3
  445. package/clis/linkedin/salesnav-search.js +4 -4
  446. package/clis/linkedin/salesnav-thread.js +1 -1
  447. package/clis/linkedin/search-api.js +3 -3
  448. package/clis/linkedin/search.js +8 -8
  449. package/clis/linkedin/social-api.js +31 -31
  450. package/clis/linkedin/timeline.js +3 -3
  451. package/clis/linkedin-learning/search.js +2 -2
  452. package/clis/linkedin-learning/trending.js +2 -2
  453. package/clis/linux-do/feed.js +4 -4
  454. package/clis/linux-do/topic-content.js +8 -8
  455. package/clis/lobsters/domain.js +1 -1
  456. package/clis/lobsters/read.js +7 -7
  457. package/clis/maimai/auth.js +2 -2
  458. package/clis/maimai/search-talents.js +4 -4
  459. package/clis/manus/_utils.js +1 -1
  460. package/clis/mastodon/login.js +1 -1
  461. package/clis/mastodon/post.js +1 -1
  462. package/clis/mastodon/shared.js +12 -12
  463. package/clis/mastodon/whoami.js +1 -1
  464. package/clis/maven/artifact.js +1 -1
  465. package/clis/maven/search.js +1 -1
  466. package/clis/maven/utils.js +1 -1
  467. package/clis/mdn/search.js +1 -1
  468. package/clis/medium/article.js +5 -5
  469. package/clis/medium/login.js +1 -1
  470. package/clis/medium/stats.js +3 -3
  471. package/clis/medium/tag.js +1 -1
  472. package/clis/medium/whoami.js +1 -1
  473. package/clis/mubu/notes.js +1 -1
  474. package/clis/mubu/utils.js +15 -15
  475. package/clis/note/auth.js +2 -2
  476. package/clis/note/note-utils.js +2 -2
  477. package/clis/note/publish.js +8 -8
  478. package/clis/notebooklm/add-source.js +8 -8
  479. package/clis/notebooklm/create.js +1 -1
  480. package/clis/notebooklm/generate-slides.js +1 -1
  481. package/clis/notebooklm/notes-get.js +1 -1
  482. package/clis/notebooklm/rpc.js +8 -8
  483. package/clis/notebooklm/source-fulltext.js +1 -1
  484. package/clis/notebooklm/utils.js +10 -10
  485. package/clis/nowcoder/auth.js +2 -2
  486. package/clis/nowcoder/comment.js +1 -1
  487. package/clis/nowcoder/comments.js +1 -1
  488. package/clis/nowcoder/dm-list.js +1 -1
  489. package/clis/nowcoder/dm-read.js +1 -1
  490. package/clis/nowcoder/dm-send.js +1 -1
  491. package/clis/nowcoder/drafts.js +1 -1
  492. package/clis/nowcoder/inbox.js +1 -1
  493. package/clis/nowcoder/like.js +1 -1
  494. package/clis/nowcoder/my.js +1 -1
  495. package/clis/nowcoder/post.js +1 -1
  496. package/clis/nowcoder/utils.js +13 -13
  497. package/clis/npm/downloads.js +1 -1
  498. package/clis/npm/package.js +1 -1
  499. package/clis/npm/search.js +1 -1
  500. package/clis/npm/utils.js +1 -1
  501. package/clis/nuget/package.js +1 -1
  502. package/clis/nuget/search.js +1 -1
  503. package/clis/nuget/utils.js +1 -1
  504. package/clis/nvd/cve.js +1 -1
  505. package/clis/oeis/search.js +1 -1
  506. package/clis/oeis/sequence.js +1 -1
  507. package/clis/oeis/utils.js +1 -1
  508. package/clis/ones/common.js +6 -6
  509. package/clis/ones/enrich-tasks.js +1 -1
  510. package/clis/ones/my-tasks.js +1 -1
  511. package/clis/ones/resolve-labels.js +1 -1
  512. package/clis/ones/task-helpers.js +1 -1
  513. package/clis/ones/task.js +1 -1
  514. package/clis/ones/worklog.js +7 -7
  515. package/clis/openalex/search.js +1 -1
  516. package/clis/openalex/utils.js +1 -1
  517. package/clis/openalex/work.js +1 -1
  518. package/clis/openfda/drug-label.js +1 -1
  519. package/clis/openfda/food-recall.js +1 -1
  520. package/clis/openfda/utils.js +1 -1
  521. package/clis/openreview/author.js +1 -1
  522. package/clis/openreview/paper.js +1 -1
  523. package/clis/openreview/reviews.js +3 -3
  524. package/clis/openreview/search.js +1 -1
  525. package/clis/openreview/utils.js +1 -1
  526. package/clis/openreview/venue.js +1 -1
  527. package/clis/oschina/article.js +1 -1
  528. package/clis/oschina/catalogs.js +1 -1
  529. package/clis/oschina/login.js +1 -1
  530. package/clis/oschina/stats.js +6 -6
  531. package/clis/oschina/whoami.js +1 -1
  532. package/clis/osv/query.js +1 -1
  533. package/clis/osv/utils.js +1 -1
  534. package/clis/osv/vulnerability.js +1 -1
  535. package/clis/packagist/package.js +1 -1
  536. package/clis/packagist/search.js +1 -1
  537. package/clis/packagist/utils.js +1 -1
  538. package/clis/pinterest/api.js +1 -1
  539. package/clis/pinterest/auth.js +1 -1
  540. package/clis/pinterest/boards.js +1 -1
  541. package/clis/pinterest/client.js +6 -6
  542. package/clis/pinterest/publish.js +5 -5
  543. package/clis/pixiv/auth.js +2 -2
  544. package/clis/pixiv/download.js +1 -1
  545. package/clis/pixiv/illusts.js +1 -1
  546. package/clis/pixiv/search.js +1 -1
  547. package/clis/pixiv/utils.js +3 -3
  548. package/clis/powerchina/auth.js +2 -2
  549. package/clis/powerchina/search.js +1 -1
  550. package/clis/producthunt/browse.js +2 -2
  551. package/clis/producthunt/hot.js +2 -2
  552. package/clis/producthunt/posts.js +1 -1
  553. package/clis/producthunt/today.js +1 -1
  554. package/clis/producthunt/utils.js +1 -1
  555. package/clis/pypi/downloads.js +1 -1
  556. package/clis/pypi/package.js +1 -1
  557. package/clis/pypi/utils.js +1 -1
  558. package/clis/qiita/auth.js +1 -1
  559. package/clis/qiita/gql.js +6 -6
  560. package/clis/qiita/publish.js +4 -4
  561. package/clis/qiita/stats.js +4 -4
  562. package/clis/qoder/_utils.js +16 -16
  563. package/clis/qoder/composer.js +1 -1
  564. package/clis/qoder/quest.js +1 -1
  565. package/clis/qoder/ui.js +14 -14
  566. package/clis/quark/auth.js +2 -2
  567. package/clis/quark/utils.js +2 -2
  568. package/clis/quora/answer-comments.js +3 -3
  569. package/clis/quora/create-answer.js +4 -4
  570. package/clis/quora/create-question.js +3 -3
  571. package/clis/quora/shared.js +17 -17
  572. package/clis/quora/whoami.js +1 -1
  573. package/clis/qwen/ask.js +1 -1
  574. package/clis/qwen/auth.js +3 -3
  575. package/clis/qwen/detail.js +1 -1
  576. package/clis/qwen/image.js +5 -5
  577. package/clis/qwen/status.js +1 -1
  578. package/clis/qwen/utils.js +16 -16
  579. package/clis/reddit/home.js +3 -3
  580. package/clis/reddit/read.js +10 -10
  581. package/clis/reddit/reply.js +4 -4
  582. package/clis/reddit/submit.js +11 -11
  583. package/clis/reddit/subreddit-info.js +3 -3
  584. package/clis/reddit/subscribed.js +4 -4
  585. package/clis/reddit/whoami.js +2 -2
  586. package/clis/rednote/comments.js +1 -1
  587. package/clis/rednote/download.js +1 -1
  588. package/clis/rednote/feed.js +1 -1
  589. package/clis/rednote/note.js +1 -1
  590. package/clis/rednote/notifications.js +2 -2
  591. package/clis/rednote/search.js +2 -2
  592. package/clis/rest-countries/country.js +1 -1
  593. package/clis/rest-countries/region.js +1 -1
  594. package/clis/rest-countries/utils.js +1 -1
  595. package/clis/reuters/article-detail.js +1 -1
  596. package/clis/reuters/auth.js +3 -3
  597. package/clis/reuters/search.js +1 -1
  598. package/clis/reuters/utils.js +4 -4
  599. package/clis/rfc/rfc.js +1 -1
  600. package/clis/rfc/utils.js +1 -1
  601. package/clis/rubygems/gem.js +1 -1
  602. package/clis/rubygems/search.js +1 -1
  603. package/clis/rubygems/utils.js +1 -1
  604. package/clis/segmentfault/article.js +3 -3
  605. package/clis/segmentfault/channels.js +1 -1
  606. package/clis/segmentfault/login.js +1 -1
  607. package/clis/segmentfault/stats.js +4 -4
  608. package/clis/segmentfault/tags.js +1 -1
  609. package/clis/segmentfault/whoami.js +1 -1
  610. package/clis/semanticscholar/citations.js +1 -1
  611. package/clis/semanticscholar/paper.js +1 -1
  612. package/clis/semanticscholar/recommendations.js +1 -1
  613. package/clis/semanticscholar/search.js +1 -1
  614. package/clis/semanticscholar/utils.js +1 -1
  615. package/clis/sinafinance/news.js +1 -1
  616. package/clis/sinafinance/stock-rank.js +1 -1
  617. package/clis/sinafinance/stock.js +1 -1
  618. package/clis/slock/attachment-download.js +1 -1
  619. package/clis/slock/attachment-upload.js +7 -7
  620. package/clis/slock/attachment-url.js +1 -1
  621. package/clis/slock/auth-verify.js +1 -1
  622. package/clis/slock/bookmark-add.js +1 -1
  623. package/clis/slock/bookmark-remove.js +1 -1
  624. package/clis/slock/channel-action.js +1 -1
  625. package/clis/slock/channel-create.js +1 -1
  626. package/clis/slock/channel-files.js +1 -1
  627. package/clis/slock/channel-list.js +1 -1
  628. package/clis/slock/channel-mark.js +1 -1
  629. package/clis/slock/channel-members.js +1 -1
  630. package/clis/slock/channel-unarchive.js +1 -1
  631. package/clis/slock/dm-list.js +1 -1
  632. package/clis/slock/errors.js +1 -1
  633. package/clis/slock/in-page.js +28 -28
  634. package/clis/slock/inbox-done.js +5 -5
  635. package/clis/slock/inbox.js +1 -1
  636. package/clis/slock/message-read.js +22 -22
  637. package/clis/slock/message-search.js +10 -10
  638. package/clis/slock/message-send.js +25 -25
  639. package/clis/slock/reaction-add.js +1 -1
  640. package/clis/slock/reaction-remove.js +1 -1
  641. package/clis/slock/resolve.js +1 -1
  642. package/clis/slock/server-list.js +2 -2
  643. package/clis/slock/task-claim.js +4 -4
  644. package/clis/slock/task-convert.js +13 -13
  645. package/clis/slock/task-create.js +1 -1
  646. package/clis/slock/task-delete.js +5 -5
  647. package/clis/slock/task-get.js +5 -5
  648. package/clis/slock/task-list-server.js +4 -4
  649. package/clis/slock/task-list.js +5 -5
  650. package/clis/slock/task-status.js +3 -3
  651. package/clis/slock/task-unclaim.js +3 -3
  652. package/clis/slock/thread-follow.js +1 -1
  653. package/clis/slock/thread-state.js +1 -1
  654. package/clis/slock/unread-summary.js +5 -5
  655. package/clis/slock/whoami.js +1 -1
  656. package/clis/smzdm/search.js +3 -3
  657. package/clis/sohu/article.js +1 -1
  658. package/clis/sohu/attributes.js +1 -1
  659. package/clis/sohu/categories.js +1 -1
  660. package/clis/sohu/channels.js +1 -1
  661. package/clis/sohu/columns.js +1 -1
  662. package/clis/sohu/login.js +1 -1
  663. package/clis/sohu/stats.js +3 -3
  664. package/clis/sohu/topics.js +1 -1
  665. package/clis/sohu/whoami.js +1 -1
  666. package/clis/spotify/spotify.js +1 -1
  667. package/clis/stackoverflow/read.js +6 -6
  668. package/clis/stackoverflow/related.js +1 -1
  669. package/clis/stackoverflow/tag.js +1 -1
  670. package/clis/stackoverflow/user.js +1 -1
  671. package/clis/stackoverflow/utils.js +1 -1
  672. package/clis/steam/app.js +1 -1
  673. package/clis/steam/search.js +1 -1
  674. package/clis/steam/utils.js +1 -1
  675. package/clis/substack/auth.js +2 -2
  676. package/clis/substack/post-utils.js +2 -2
  677. package/clis/substack/publish.js +5 -5
  678. package/clis/suno/auth.js +2 -2
  679. package/clis/suno/download.js +5 -5
  680. package/clis/suno/generate.js +3 -3
  681. package/clis/suno/list.js +1 -1
  682. package/clis/suno/status.js +1 -1
  683. package/clis/suno/utils.js +29 -29
  684. package/clis/telegram/send.js +7 -7
  685. package/clis/telegram/shared.js +2 -2
  686. package/clis/telegram/whoami.js +1 -1
  687. package/clis/test-utils.js +1 -1
  688. package/clis/threads/post.js +23 -23
  689. package/clis/threads/shared.js +3 -3
  690. package/clis/threads/whoami.js +1 -1
  691. package/clis/tieba/hot.js +3 -3
  692. package/clis/tieba/posts.js +1 -1
  693. package/clis/tieba/read.js +2 -2
  694. package/clis/tieba/search.js +3 -3
  695. package/clis/tieba/utils.js +1 -1
  696. package/clis/tiktok/comment.js +2 -2
  697. package/clis/tiktok/creator-videos.js +3 -3
  698. package/clis/tiktok/explore.js +3 -3
  699. package/clis/tiktok/follow.js +8 -8
  700. package/clis/tiktok/following.js +4 -4
  701. package/clis/tiktok/friends.js +7 -7
  702. package/clis/tiktok/live.js +3 -3
  703. package/clis/tiktok/notifications.js +6 -6
  704. package/clis/tiktok/publish.js +17 -17
  705. package/clis/tiktok/unfollow.js +4 -4
  706. package/clis/tiktok/user.js +2 -2
  707. package/clis/tiktok/utils.js +1 -1
  708. package/clis/toutiao/article.js +1 -1
  709. package/clis/toutiao/articles.js +2 -2
  710. package/clis/toutiao/auth.js +2 -2
  711. package/clis/toutiao/hot.js +1 -1
  712. package/clis/toutiao/recommend.js +1 -1
  713. package/clis/toutiao/utils.js +2 -2
  714. package/clis/trae-solo/_actions.js +4 -4
  715. package/clis/trae-solo/_fs.js +5 -5
  716. package/clis/trae-solo/_state.js +2 -2
  717. package/clis/trae-solo/automation.js +4 -4
  718. package/clis/trae-solo/mode.js +4 -4
  719. package/clis/trae-solo/model.js +4 -4
  720. package/clis/trae-solo/renderer-storage.js +4 -4
  721. package/clis/trae-solo/settings.js +1 -1
  722. package/clis/trae-solo/skill-fs.js +1 -1
  723. package/clis/trae-solo/skill.js +12 -12
  724. package/clis/trae-solo/state-fs.js +2 -2
  725. package/clis/trae-solo/task-fs.js +5 -5
  726. package/clis/trae-solo/workspaces-fs.js +1 -1
  727. package/clis/tumblr/auth.js +2 -2
  728. package/clis/tumblr/publish.js +3 -3
  729. package/clis/tvmaze/search.js +1 -1
  730. package/clis/tvmaze/show.js +1 -1
  731. package/clis/tvmaze/utils.js +1 -1
  732. package/clis/twitter/accept.js +7 -7
  733. package/clis/twitter/article.js +7 -7
  734. package/clis/twitter/bookmark-folder.js +3 -3
  735. package/clis/twitter/bookmark-folders.js +3 -3
  736. package/clis/twitter/bookmarks.js +4 -4
  737. package/clis/twitter/delete.js +5 -5
  738. package/clis/twitter/device-follow.js +3 -3
  739. package/clis/twitter/dm-list.js +1 -1
  740. package/clis/twitter/dm-read.js +1 -1
  741. package/clis/twitter/dm-send.js +5 -5
  742. package/clis/twitter/dm-shared.js +3 -3
  743. package/clis/twitter/download.js +6 -6
  744. package/clis/twitter/followers.js +5 -5
  745. package/clis/twitter/following.js +2 -2
  746. package/clis/twitter/like.js +3 -3
  747. package/clis/twitter/likes.js +8 -8
  748. package/clis/twitter/list-add-core.js +9 -9
  749. package/clis/twitter/list-create.js +5 -5
  750. package/clis/twitter/list-remove-core.js +9 -9
  751. package/clis/twitter/list-tweets.js +7 -7
  752. package/clis/twitter/lists.js +6 -6
  753. package/clis/twitter/notifications.js +2 -2
  754. package/clis/twitter/post.js +24 -24
  755. package/clis/twitter/profile.js +7 -7
  756. package/clis/twitter/quote.js +7 -7
  757. package/clis/twitter/reply-dm.js +7 -7
  758. package/clis/twitter/reply.js +12 -12
  759. package/clis/twitter/retweet.js +3 -3
  760. package/clis/twitter/scheduled-delete.js +3 -3
  761. package/clis/twitter/scheduled-list.js +2 -2
  762. package/clis/twitter/scheduled-utils.js +3 -3
  763. package/clis/twitter/search.js +5 -5
  764. package/clis/twitter/shared.js +6 -6
  765. package/clis/twitter/thread.js +4 -4
  766. package/clis/twitter/timeline.js +3 -3
  767. package/clis/twitter/trending.js +2 -2
  768. package/clis/twitter/tweets.js +11 -11
  769. package/clis/twitter/unlike.js +3 -3
  770. package/clis/twitter/unretweet.js +3 -3
  771. package/clis/twitter/utils.js +6 -6
  772. package/clis/upwork/detail.js +2 -2
  773. package/clis/upwork/feed.js +2 -2
  774. package/clis/upwork/search.js +2 -2
  775. package/clis/upwork/utils.js +1 -1
  776. package/clis/v2ex/auth.js +2 -2
  777. package/clis/v2ex/daily.js +3 -3
  778. package/clis/v2ex/me.js +2 -2
  779. package/clis/v2ex/notifications.js +2 -2
  780. package/clis/vk/post.js +1 -1
  781. package/clis/vk/shared.js +2 -2
  782. package/clis/vk/whoami.js +1 -1
  783. package/clis/web/read.js +8 -8
  784. package/clis/wechat-channels/auth.js +2 -2
  785. package/clis/wechat-channels/publish.js +30 -30
  786. package/clis/weibo/article.js +1 -1
  787. package/clis/weibo/auth.js +3 -3
  788. package/clis/weibo/comments.js +1 -1
  789. package/clis/weibo/delete.js +2 -2
  790. package/clis/weibo/feed.js +3 -3
  791. package/clis/weibo/hot.js +1 -1
  792. package/clis/weibo/publish.js +10 -10
  793. package/clis/weibo/search.js +2 -2
  794. package/clis/weibo/user-posts.js +3 -3
  795. package/clis/weibo/user.js +2 -2
  796. package/clis/weibo/utils.js +3 -3
  797. package/clis/weixin/article.js +1 -1
  798. package/clis/weixin/create-draft.js +26 -26
  799. package/clis/weixin/download.js +2 -2
  800. package/clis/weixin/login.js +1 -1
  801. package/clis/weixin/search.js +2 -2
  802. package/clis/weixin/stats.js +3 -3
  803. package/clis/weixin/whoami.js +1 -1
  804. package/clis/weread/ai-outline.js +2 -2
  805. package/clis/weread/book-search.js +2 -2
  806. package/clis/weread/book.js +2 -2
  807. package/clis/weread/notebooks.js +1 -1
  808. package/clis/weread/search.js +1 -1
  809. package/clis/weread/shelf.js +1 -1
  810. package/clis/weread/utils.js +6 -6
  811. package/clis/weread-official/book.js +1 -1
  812. package/clis/weread-official/discover.js +1 -1
  813. package/clis/weread-official/list-apis.js +1 -1
  814. package/clis/weread-official/notes.js +1 -1
  815. package/clis/weread-official/readdata.js +1 -1
  816. package/clis/weread-official/review.js +1 -1
  817. package/clis/weread-official/search.js +1 -1
  818. package/clis/weread-official/shelf.js +1 -1
  819. package/clis/weread-official/utils.js +1 -1
  820. package/clis/wikidata/entity.js +1 -1
  821. package/clis/wikidata/search.js +1 -1
  822. package/clis/wikidata/utils.js +1 -1
  823. package/clis/wikipedia/page.js +1 -1
  824. package/clis/wikipedia/trending.js +1 -1
  825. package/clis/wikipedia/utils.js +1 -1
  826. package/clis/wordpress/login.js +1 -1
  827. package/clis/wordpress/publish.js +1 -1
  828. package/clis/wordpress/shared.js +3 -3
  829. package/clis/wordpress/whoami.js +1 -1
  830. package/clis/woshipm/article.js +1 -1
  831. package/clis/woshipm/login.js +1 -1
  832. package/clis/woshipm/stats.js +4 -4
  833. package/clis/woshipm/whoami.js +1 -1
  834. package/clis/wttr/current.js +1 -1
  835. package/clis/wttr/forecast.js +1 -1
  836. package/clis/wttr/utils.js +1 -1
  837. package/clis/xianyu/collect.js +1 -1
  838. package/clis/xianyu/inbox.js +1 -1
  839. package/clis/xianyu/item-stats.js +2 -2
  840. package/clis/xianyu/location.js +1 -1
  841. package/clis/xianyu/manage.js +1 -1
  842. package/clis/xianyu/messages.js +1 -1
  843. package/clis/xianyu/mtop.js +5 -5
  844. package/clis/xianyu/order.js +1 -1
  845. package/clis/xianyu/promote-stats.js +2 -2
  846. package/clis/xianyu/publish.js +17 -17
  847. package/clis/xianyu/rate.js +1 -1
  848. package/clis/xianyu/reply.js +1 -1
  849. package/clis/xianyu/search.js +8 -8
  850. package/clis/xianyu/seller-data.js +1 -1
  851. package/clis/xianyu/seller-list.js +1 -1
  852. package/clis/xianyu/user.js +1 -1
  853. package/clis/xiaoe/catalog.js +2 -2
  854. package/clis/xiaoe/content.js +2 -2
  855. package/clis/xiaoe/courses.js +2 -2
  856. package/clis/xiaohongshu/ask.js +6 -6
  857. package/clis/xiaohongshu/comments.js +6 -6
  858. package/clis/xiaohongshu/creator-note-detail.js +7 -7
  859. package/clis/xiaohongshu/creator-notes-summary.js +1 -1
  860. package/clis/xiaohongshu/creator-notes.js +13 -13
  861. package/clis/xiaohongshu/creator-profile.js +2 -2
  862. package/clis/xiaohongshu/creator-stats.js +2 -2
  863. package/clis/xiaohongshu/delete-note.js +7 -7
  864. package/clis/xiaohongshu/download.js +4 -4
  865. package/clis/xiaohongshu/feed.js +2 -2
  866. package/clis/xiaohongshu/follow.js +3 -3
  867. package/clis/xiaohongshu/human.js +3 -3
  868. package/clis/xiaohongshu/note-helpers.js +1 -1
  869. package/clis/xiaohongshu/note.js +2 -2
  870. package/clis/xiaohongshu/notifications.js +1 -1
  871. package/clis/xiaohongshu/publish-video.js +8 -8
  872. package/clis/xiaohongshu/publish.js +59 -59
  873. package/clis/xiaohongshu/search.js +8 -8
  874. package/clis/xiaohongshu/unfollow.js +4 -4
  875. package/clis/xiaohongshu/user-helpers.js +1 -1
  876. package/clis/xiaohongshu/user.js +2 -2
  877. package/clis/xiaoyuzhou/auth.js +3 -3
  878. package/clis/xiaoyuzhou/download.js +1 -1
  879. package/clis/xiaoyuzhou/utils.js +1 -1
  880. package/clis/xueqiu/article.js +4 -4
  881. package/clis/xueqiu/comments.js +4 -4
  882. package/clis/xueqiu/danjuan-utils.js +4 -4
  883. package/clis/xueqiu/earnings-date.js +1 -1
  884. package/clis/xueqiu/events.js +3 -3
  885. package/clis/xueqiu/hashtags.js +3 -3
  886. package/clis/xueqiu/stocks.js +3 -3
  887. package/clis/xueqiu/users.js +3 -3
  888. package/clis/xueqiu/utils.js +3 -3
  889. package/clis/yahoo-finance/quote.js +1 -1
  890. package/clis/yollomi/background.js +1 -1
  891. package/clis/yollomi/edit.js +1 -1
  892. package/clis/yollomi/face-swap.js +1 -1
  893. package/clis/yollomi/generate.js +1 -1
  894. package/clis/yollomi/object-remover.js +1 -1
  895. package/clis/yollomi/remove-bg.js +1 -1
  896. package/clis/yollomi/restore.js +1 -1
  897. package/clis/yollomi/try-on.js +1 -1
  898. package/clis/yollomi/upload.js +4 -4
  899. package/clis/yollomi/upscale.js +1 -1
  900. package/clis/yollomi/utils.js +4 -4
  901. package/clis/yollomi/video.js +1 -1
  902. package/clis/youtube/channel.js +4 -4
  903. package/clis/youtube/feed.js +2 -2
  904. package/clis/youtube/like.js +5 -5
  905. package/clis/youtube/playlist.js +7 -7
  906. package/clis/youtube/publish.js +11 -11
  907. package/clis/youtube/search.js +3 -3
  908. package/clis/youtube/subscribe.js +7 -7
  909. package/clis/youtube/subscriptions.js +1 -1
  910. package/clis/youtube/transcript-group.js +2 -2
  911. package/clis/youtube/transcript.js +13 -13
  912. package/clis/youtube/unlike.js +5 -5
  913. package/clis/youtube/unsubscribe.js +7 -7
  914. package/clis/youtube/utils.js +3 -3
  915. package/clis/youtube/video.js +4 -4
  916. package/clis/youtube/watch-later.js +2 -2
  917. package/clis/yuanbao/ask.js +18 -18
  918. package/clis/yuanbao/detail.js +1 -1
  919. package/clis/yuanbao/read.js +1 -1
  920. package/clis/yuanbao/shared.js +9 -9
  921. package/clis/yuanbao/status.js +1 -1
  922. package/clis/yuque/article.js +1 -1
  923. package/clis/yuque/whoami.js +1 -1
  924. package/clis/zhihu/answer-comments.js +2 -2
  925. package/clis/zhihu/answer-detail.js +3 -3
  926. package/clis/zhihu/answer.js +1 -1
  927. package/clis/zhihu/article-transform.js +1 -1
  928. package/clis/zhihu/article.js +1 -1
  929. package/clis/zhihu/auth.js +2 -2
  930. package/clis/zhihu/collection.js +3 -3
  931. package/clis/zhihu/collections.js +3 -3
  932. package/clis/zhihu/download.js +2 -2
  933. package/clis/zhihu/image-profile.js +6 -6
  934. package/clis/zhihu/paginate.js +3 -3
  935. package/clis/zhihu/pin.js +4 -4
  936. package/clis/zhihu/question.js +3 -3
  937. package/clis/zhihu/recommend.js +3 -3
  938. package/clis/zhihu/search.js +3 -3
  939. package/clis/zhihu/stats.js +3 -3
  940. package/clis/zhihu/user-arg.js +1 -1
  941. package/clis/zhihu/write-shared.js +7 -7
  942. package/clis/zlibrary/utils.js +6 -6
  943. package/clis/zsxq/auth.js +3 -3
  944. package/clis/zsxq/search.js +1 -1
  945. package/clis/zsxq/topic.js +1 -1
  946. package/clis/zsxq/utils.js +5 -5
  947. package/dist/src/adapter-source.js +1 -1
  948. package/dist/src/browser/analyze.js +1 -1
  949. package/dist/src/browser/article-extract.js +2 -2
  950. package/dist/src/browser/ax-snapshot.js +2 -2
  951. package/dist/src/browser/base-page.js +25 -25
  952. package/dist/src/browser/bridge.js +1 -1
  953. package/dist/src/browser/cdp.js +1 -1
  954. package/dist/src/browser/daemon-client.js +1 -1
  955. package/dist/src/browser/daemon-lifecycle.js +7 -7
  956. package/dist/src/browser/dom-helpers.js +35 -35
  957. package/dist/src/browser/dom-snapshot.js +19 -19
  958. package/dist/src/browser/errors.js +3 -3
  959. package/dist/src/browser/extract.js +5 -5
  960. package/dist/src/browser/find.js +13 -13
  961. package/dist/src/browser/fingerprint.js +2 -2
  962. package/dist/src/browser/html-tree.js +6 -6
  963. package/dist/src/browser/managed-chrome.js +1 -1
  964. package/dist/src/browser/network-cache.js +1 -1
  965. package/dist/src/browser/network-key.js +1 -1
  966. package/dist/src/browser/page.js +7 -7
  967. package/dist/src/browser/profile.js +2 -2
  968. package/dist/src/browser/proxy-test.js +8 -8
  969. package/dist/src/browser/shape-filter.js +1 -1
  970. package/dist/src/browser/shape.js +1 -1
  971. package/dist/src/browser/stealth.js +3 -3
  972. package/dist/src/browser/tabs.js +2 -2
  973. package/dist/src/browser/target-errors.js +1 -1
  974. package/dist/src/browser/target-resolver.js +23 -23
  975. package/dist/src/browser/trace.js +2 -2
  976. package/dist/src/browser/utils.js +1 -1
  977. package/dist/src/browser/verify-fixture.js +2 -2
  978. package/dist/src/browser-session-lock.js +1 -1
  979. package/dist/src/build-manifest.js +11 -11
  980. package/dist/src/capabilityRouting.js +1 -1
  981. package/dist/src/cli-argv-preprocess.js +1 -1
  982. package/dist/src/cli.js +32 -32
  983. package/dist/src/commanderAdapter.js +3 -3
  984. package/dist/src/commands/auth.js +3 -3
  985. package/dist/src/commands/daemon.js +1 -1
  986. package/dist/src/completion-fast.js +1 -1
  987. package/dist/src/completion.js +1 -1
  988. package/dist/src/constants.js +1 -1
  989. package/dist/src/convention-audit.js +2 -2
  990. package/dist/src/daemon-utils.js +1 -1
  991. package/dist/src/daemon.js +1 -1
  992. package/dist/src/discovery.js +2 -2
  993. package/dist/src/doctor.js +9 -9
  994. package/dist/src/download/article-download.js +15 -15
  995. package/dist/src/download/index.js +4 -4
  996. package/dist/src/download/media-download.js +1 -1
  997. package/dist/src/download/progress.js +3 -3
  998. package/dist/src/electron-apps.js +1 -1
  999. package/dist/src/errors.js +2 -2
  1000. package/dist/src/execution.js +2 -2
  1001. package/dist/src/external.js +1 -1
  1002. package/dist/src/help.js +8 -8
  1003. package/dist/src/hooks.js +1 -1
  1004. package/dist/src/interceptor.js +21 -21
  1005. package/dist/src/launcher.js +7 -7
  1006. package/dist/src/logger.js +8 -8
  1007. package/dist/src/main.js +7 -7
  1008. package/dist/src/observation/artifact.js +5 -5
  1009. package/dist/src/observation/retention.js +1 -1
  1010. package/dist/src/output.js +2 -2
  1011. package/dist/src/package-paths.js +1 -1
  1012. package/dist/src/pipeline/executor.js +1 -1
  1013. package/dist/src/pipeline/registry.js +1 -1
  1014. package/dist/src/pipeline/steps/browser.js +1 -1
  1015. package/dist/src/pipeline/steps/download.js +1 -1
  1016. package/dist/src/pipeline/steps/fetch.js +6 -6
  1017. package/dist/src/pipeline/steps/intercept.js +1 -1
  1018. package/dist/src/pipeline/steps/tap.js +17 -17
  1019. package/dist/src/pipeline/steps/transform.js +1 -1
  1020. package/dist/src/pipeline/template.js +1 -1
  1021. package/dist/src/plugin-manifest.js +1 -1
  1022. package/dist/src/plugin-scaffold.js +19 -19
  1023. package/dist/src/plugin.js +12 -12
  1024. package/dist/src/rate-limit.js +1 -1
  1025. package/dist/src/registry.js +1 -1
  1026. package/dist/src/runtime-detect.js +1 -1
  1027. package/dist/src/runtime.js +1 -1
  1028. package/dist/src/scripts/framework.js +1 -1
  1029. package/dist/src/scripts/interact.js +1 -1
  1030. package/dist/src/scripts/store.js +1 -1
  1031. package/dist/src/serialization.js +2 -2
  1032. package/dist/src/session-lease.js +1 -1
  1033. package/dist/src/snapshotFormatter.js +2 -2
  1034. package/dist/src/tui.js +12 -12
  1035. package/dist/src/user-runtime.js +1 -1
  1036. package/dist/src/utils.d.ts +12 -0
  1037. package/dist/src/utils.js +4 -4
  1038. package/dist/src/validate.js +2 -2
  1039. package/dist/src/verify.js +2 -2
  1040. package/dist/src/version.js +1 -1
  1041. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const DOUBAO_DOMAIN="www.doubao.com",DOUBAO_CHAT_URL="https://www.doubao.com/chat",DOUBAO_NEW_CHAT_URL="https://www.doubao.com/chat/new-thread/create-by-msg";const k=['textarea[data-testid="chat_input_input"]','[data-testid="chat_input"] textarea',".chat-input textarea",'.chat-input [contenteditable="true"]',".chat-editor textarea",'.chat-editor [contenteditable="true"]','textarea[placeholder*="发消息"]','textarea[placeholder*="Message"]','[contenteditable="true"][placeholder*="发消息"]','[contenteditable="true"][placeholder*="Message"]','[contenteditable="true"][aria-label*="发消息"]','[contenteditable="true"][aria-label*="Message"]',"textarea",'[contenteditable="true"]'];function E(){return`
1
+ import{CommandExecutionError as p}from"@jackwener/opencli/errors";export const DOUBAO_DOMAIN="www.doubao.com",DOUBAO_CHAT_URL="https://www.doubao.com/chat",DOUBAO_NEW_CHAT_URL="https://www.doubao.com/chat/new-thread/create-by-msg";const _=['textarea[data-testid="chat_input_input"]','[data-testid="chat_input"] textarea',".chat-input textarea",'.chat-input [contenteditable="true"]',".chat-editor textarea",'.chat-editor [contenteditable="true"]','textarea[placeholder*="发消息"]','textarea[placeholder*="Message"]','[contenteditable="true"][placeholder*="发消息"]','[contenteditable="true"][placeholder*="Message"]','[contenteditable="true"][aria-label*="发消息"]','[contenteditable="true"][aria-label*="Message"]',"textarea",'[contenteditable="true"]'];function f(){return`
2
2
  const isVisible = (el) => {
3
3
  if (!(el instanceof HTMLElement)) return false;
4
4
  const style = window.getComputedStyle(el);
@@ -7,7 +7,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
7
7
  return rect.width > 0 && rect.height > 0;
8
8
  };
9
9
 
10
- const composerSelectors = ${JSON.stringify(k)};
10
+ const composerSelectors = ${JSON.stringify(_)};
11
11
  const findComposer = () => {
12
12
  for (const selector of composerSelectors) {
13
13
  const node = Array.from(document.querySelectorAll(selector)).find(isVisible);
@@ -15,7 +15,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
15
15
  }
16
16
  return null;
17
17
  };
18
- `}function B(){return`
18
+ `}function x(){return`
19
19
  (() => {
20
20
  const clean = (value) => (value || '')
21
21
  .replace(/\\u00a0/g, ' ')
@@ -78,7 +78,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
78
78
  && !stopLines.has(line)
79
79
  && !noisyPatterns.some((pattern) => pattern.test(line)));
80
80
  })()
81
- `}function w(){return`
81
+ `}function k(){return`
82
82
  (() => {
83
83
  const routerData = window._ROUTER_DATA?.loaderData?.chat_layout;
84
84
  const placeholderNode = document.querySelector(
@@ -96,7 +96,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
96
96
  || '',
97
97
  };
98
98
  })()
99
- `}function P(){return`
99
+ `}function w(){return`
100
100
  (() => {
101
101
  const clean = (value) => (value || '')
102
102
  .replace(/\\u00a0/g, ' ')
@@ -264,9 +264,9 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
264
264
  if (deduped.length > 0) return deduped;
265
265
  return [];
266
266
  })()
267
- `}function h(){return`
267
+ `}function L(){return`
268
268
  (() => {
269
- ${E()}
269
+ ${f()}
270
270
  const composer = findComposer();
271
271
 
272
272
  if (
@@ -299,9 +299,9 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
299
299
 
300
300
  return { ok: true };
301
301
  })()
302
- `}function V(){return`
302
+ `}function v(){return`
303
303
  (() => {
304
- ${E()}
304
+ ${f()}
305
305
  const composer = findComposer();
306
306
 
307
307
  if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
@@ -318,9 +318,9 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
318
318
 
319
319
  return { hasText: false, text: '' };
320
320
  })()
321
- `}function C(){return`
321
+ `}function M(){return`
322
322
  (() => {
323
- ${E()}
323
+ ${f()}
324
324
  const composer = findComposer();
325
325
 
326
326
  if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
@@ -341,9 +341,9 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
341
341
 
342
342
  return { hasText: false, text: '' };
343
343
  })()
344
- `}function S(j){return`
344
+ `}function D(e){return`
345
345
  ((inputText) => {
346
- ${E()}
346
+ ${f()}
347
347
  const composer = findComposer();
348
348
 
349
349
  if (!composer) throw new Error('Could not find Doubao input element');
@@ -382,8 +382,8 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
382
382
  }
383
383
 
384
384
  throw new Error('Unsupported Doubao input element');
385
- })(${JSON.stringify(j)})
386
- `}function D(){return`
385
+ })(${JSON.stringify(e)})
386
+ `}function y(){return`
387
387
  (() => {
388
388
  const isVisible = (el) => {
389
389
  if (!(el instanceof HTMLElement)) return false;
@@ -423,9 +423,9 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
423
423
  reason: match ? ((match.innerText || match.textContent || '').trim().slice(0, 80) || 'challenge-ui') : '',
424
424
  };
425
425
  })()
426
- `}function y(){return`
426
+ `}function C(){return`
427
427
  (() => {
428
- ${E()}
428
+ ${f()}
429
429
  const directSendButton = document.querySelector('button#flow-end-msg-send');
430
430
  if (directSendButton instanceof HTMLElement && isVisible(directSendButton)) {
431
431
  const disabled = directSendButton.getAttribute('disabled') !== null
@@ -514,7 +514,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
514
514
 
515
515
  return false;
516
516
  })()
517
- `}function L(){return`
517
+ `}function R(){return`
518
518
  (() => {
519
519
  const isVisible = (el) => {
520
520
  if (!(el instanceof HTMLElement)) return false;
@@ -541,10 +541,10 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
541
541
 
542
542
  return '';
543
543
  })()
544
- `}function z(j){return j.map((q,F)=>{const G=q||{};return{index:typeof G.index==="number"?G.index:F,url:typeof G.url==="string"?G.url:"",title:typeof G.title==="string"?G.title:"",active:G.active===!0}}).filter((q)=>q.url.includes("doubao.com/chat"))}async function f(j){const q=await j.tabs().catch(()=>[]);if(!Array.isArray(q)||q.length===0)return!1;const F=z(q);if(F.length===0)return!1;const G=[...F].sort((K,J)=>{const Q=(Y)=>{let Z=Y.index;if(/https:\/\/www\.doubao\.com\/chat\/[A-Za-z0-9_-]+/.test(Y.url))Z+=1000;else if(Y.url.startsWith(DOUBAO_CHAT_URL))Z+=100;if(Y.active)Z+=25;return Z};return Q(J)-Q(K)})[0];if(!G)return!1;await j.selectTab(G.index);await j.wait(0.8);return!0}export async function ensureDoubaoChatPage(j){let q=await j.evaluate("window.location.href").catch(()=>"");if(typeof q==="string"&&q.includes("doubao.com/chat")){await j.wait(1);return}if(await f(j)){q=await j.evaluate("window.location.href").catch(()=>"");if(typeof q==="string"&&q.includes("doubao.com/chat")){await j.wait(1);return}}await j.goto(DOUBAO_CHAT_URL,{waitUntil:"load",settleMs:2500});await j.wait(1.5)}export async function getDoubaoPageState(j){await ensureDoubaoChatPage(j);return await j.evaluate(w())}export async function getDoubaoTurns(j){await ensureDoubaoChatPage(j);const q=await j.evaluate(P());if(q.length>0)return q;return(await j.evaluate(B())).map((G)=>({Role:"System",Text:G}))}export async function getDoubaoVisibleTurns(j){await ensureDoubaoChatPage(j);return await j.evaluate(P())}export async function getDoubaoTranscriptLines(j){await ensureDoubaoChatPage(j);return await j.evaluate(B())}export async function sendDoubaoMessage(j,q){await ensureDoubaoChatPage(j);const F=($)=>$.replace(/\r\n/g,`
545
- `).trim(),G=F(q),K=await j.evaluate(h());if(!K?.ok)throw new N(K?.reason||"Could not find Doubao input element");let J=!1;if(j.nativeType)try{await j.nativeType(q);await j.wait(0.2);await j.evaluate(C());const $=await j.evaluate(V());J=!!$?.hasText&&F($?.text||"")===G}catch{}if(!J){const $=await j.evaluate(S(q));J=!!$?.hasText&&F($?.text||"")===G}if(!J)throw new N("Failed to insert text into Doubao composer");let Q="enter";if(await j.evaluate(y()))Q="button";else if(j.nativeKeyPress)try{await j.nativeKeyPress("Enter")}catch{await j.pressKey("Enter")}else await j.pressKey("Enter");await j.wait(0.8);const Z=await j.evaluate(D());if(Z?.detected)throw new N("Doubao blocked the request with a verification challenge",Z.reason?`Detected challenge signal: ${Z.reason}`:"Please complete the challenge in the browser and try again.");return Q}export async function waitForDoubaoResponse(j,q,F,G,K){const J=new Set(F.filter((X)=>X.Role==="Assistant").map((X)=>`${X.Role}::${X.Text}`)),Q=(X)=>X.replace(G,"").replace(/内容由豆包 AI 生成/g,"").replace(/在此处拖放文件/g,"").replace(/文件数量:.*$/g,"").replace(/\{"namedChunks".*$/g,"").replace(/window\\._SSR_DATA.*$/g,"").trim(),Y=async()=>{const X=await j.evaluate(D());if(X?.detected)throw new N("Doubao blocked the request with a verification challenge",X.reason?`Detected challenge signal: ${X.reason}`:"Please complete the challenge in the browser and try again.");const O=[...await getDoubaoVisibleTurns(j)].reverse().find((W)=>W.Role==="Assistant"&&!J.has(`${W.Role}::${W.Text}`)),R=O?Q(O.Text):"";if(R)return R;const U=await getDoubaoTranscriptLines(j),_=collectDoubaoTranscriptAdditions(q,U,G,Q).split(`
546
- `).filter(Boolean);return _.find((W)=>W.length<=120)||_[_.length-1]||""},Z=2,$=Math.max(1,Math.ceil(K/Z));let A="",M=0;for(let X=0;X<$;X+=1){await j.wait(X===0?1.5:Z);const H=await Y();if(!H)continue;if(H===A)M+=1;else{A=H;M=1}if(M>=2||X===$-1)return H}return A}export function isLikelyDoubaoUiNoise(j){const q=j.replace(/\s+/g,"");if(!q)return!1;return new Set(["快速视频生成深入研究图像生成帮我写作音乐生成更多"]).has(q)}function T(j){const q=j.replace(/\s+/g,"");if(!q)return!1;return new Set(["AI创作云盘更多历史对话"]).has(q)}function v(j,q,F){const G=(Y)=>Y.replace(/\s+/g," ").trim(),K=G(j),J=G(F);if(!J||!K.startsWith(J))return!1;const Q=K.slice(J.length).trim();if(!Q)return!0;return isLikelyDoubaoUiNoise(Q)||isLikelyDoubaoUiNoise(q)}export function collectDoubaoTranscriptAdditions(j,q,F,G=(K)=>K.trim()){const K=new Set(j.map((J)=>G(J)).filter(Boolean));return q.filter((J)=>!j.includes(J)).map((J)=>({raw:J,sanitized:G(J)})).filter(({raw:J,sanitized:Q})=>Q&&Q!==F&&!K.has(Q)&&!T(Q)&&!v(J,Q,F)).map(({sanitized:J})=>J).join(`
547
- `)}function b(){return`
544
+ `}function q(e){return e.map((t,n)=>{const r=t||{};return{index:typeof r.index==="number"?r.index:n,url:typeof r.url==="string"?r.url:"",title:typeof r.title==="string"?r.title:"",active:r.active===!0}}).filter((t)=>t.url.includes("doubao.com/chat"))}async function N(e){const t=await e.tabs().catch(()=>[]);if(!Array.isArray(t)||t.length===0)return!1;const n=q(t);if(n.length===0)return!1;const r=[...n].sort((a,o)=>{const s=(c)=>{let l=c.index;if(/https:\/\/www\.doubao\.com\/chat\/[A-Za-z0-9_-]+/.test(c.url))l+=1000;else if(c.url.startsWith(DOUBAO_CHAT_URL))l+=100;if(c.active)l+=25;return l};return s(o)-s(a)})[0];if(!r)return!1;await e.selectTab(r.index);await e.wait(0.8);return!0}export async function ensureDoubaoChatPage(e){let t=await e.evaluate("window.location.href").catch(()=>"");if(typeof t==="string"&&t.includes("doubao.com/chat")){await e.wait(1);return}if(await N(e)){t=await e.evaluate("window.location.href").catch(()=>"");if(typeof t==="string"&&t.includes("doubao.com/chat")){await e.wait(1);return}}await e.goto(DOUBAO_CHAT_URL,{waitUntil:"load",settleMs:2500});await e.wait(1.5)}export async function getDoubaoPageState(e){await ensureDoubaoChatPage(e);return await e.evaluate(k())}export async function getDoubaoTurns(e){await ensureDoubaoChatPage(e);const t=await e.evaluate(w());if(t.length>0)return t;return(await e.evaluate(x())).map((r)=>({Role:"System",Text:r}))}export async function getDoubaoVisibleTurns(e){await ensureDoubaoChatPage(e);return await e.evaluate(w())}export async function getDoubaoTranscriptLines(e){await ensureDoubaoChatPage(e);return await e.evaluate(x())}export async function sendDoubaoMessage(e,t){await ensureDoubaoChatPage(e);const n=(u)=>u.replace(/\r\n/g,`
545
+ `).trim(),r=n(t),a=await e.evaluate(L());if(!a?.ok)throw new p(a?.reason||"Could not find Doubao input element");let o=!1;if(e.nativeType)try{await e.nativeType(t);await e.wait(0.2);await e.evaluate(M());const u=await e.evaluate(v());o=!!u?.hasText&&n(u?.text||"")===r}catch{}if(!o){const u=await e.evaluate(D(t));o=!!u?.hasText&&n(u?.text||"")===r}if(!o)throw new p("Failed to insert text into Doubao composer");let s="enter";if(await e.evaluate(C()))s="button";else if(e.nativeKeyPress)try{await e.nativeKeyPress("Enter")}catch{await e.pressKey("Enter")}else await e.pressKey("Enter");await e.wait(0.8);const l=await e.evaluate(y());if(l?.detected)throw new p("Doubao blocked the request with a verification challenge",l.reason?`Detected challenge signal: ${l.reason}`:"Please complete the challenge in the browser and try again.");return s}export async function waitForDoubaoResponse(e,t,n,r,a){const o=new Set(n.filter((i)=>i.Role==="Assistant").map((i)=>`${i.Role}::${i.Text}`)),s=(i)=>i.replace(r,"").replace(/内容由豆包 AI 生成/g,"").replace(/在此处拖放文件/g,"").replace(/文件数量:.*$/g,"").replace(/\{"namedChunks".*$/g,"").replace(/window\\._SSR_DATA.*$/g,"").trim(),c=async()=>{const i=await e.evaluate(y());if(i?.detected)throw new p("Doubao blocked the request with a verification challenge",i.reason?`Detected challenge signal: ${i.reason}`:"Please complete the challenge in the browser and try again.");const T=[...await getDoubaoVisibleTurns(e)].reverse().find((m)=>m.Role==="Assistant"&&!o.has(`${m.Role}::${m.Text}`)),S=T?s(T.Text):"";if(S)return S;const E=await getDoubaoTranscriptLines(e),g=collectDoubaoTranscriptAdditions(t,E,r,s).split(`
546
+ `).filter(Boolean);return g.find((m)=>m.length<=120)||g[g.length-1]||""},l=2,u=Math.max(1,Math.ceil(a/l));let b="",h=0;for(let i=0;i<u;i+=1){await e.wait(i===0?1.5:l);const d=await c();if(!d)continue;if(d===b)h+=1;else{b=d;h=1}if(h>=2||i===u-1)return d}return b}export function isLikelyDoubaoUiNoise(e){const t=e.replace(/\s+/g,"");if(!t)return!1;return new Set(["快速视频生成深入研究图像生成帮我写作音乐生成更多"]).has(t)}function I(e){const t=e.replace(/\s+/g,"");if(!t)return!1;return new Set(["AI创作云盘更多历史对话"]).has(t)}function H(e,t,n){const r=(c)=>c.replace(/\s+/g," ").trim(),a=r(e),o=r(n);if(!o||!a.startsWith(o))return!1;const s=a.slice(o.length).trim();if(!s)return!0;return isLikelyDoubaoUiNoise(s)||isLikelyDoubaoUiNoise(t)}export function collectDoubaoTranscriptAdditions(e,t,n,r=(a)=>a.trim()){const a=new Set(e.map((o)=>r(o)).filter(Boolean));return t.filter((o)=>!e.includes(o)).map((o)=>({raw:o,sanitized:r(o)})).filter(({raw:o,sanitized:s})=>s&&s!==n&&!a.has(s)&&!I(s)&&!H(o,s,n)).map(({sanitized:o})=>o).join(`
547
+ `)}function B(){return`
548
548
  (() => {
549
549
  const sidebar = document.querySelector('[data-testid="flow_chat_sidebar"]');
550
550
  if (!sidebar) return [];
@@ -567,7 +567,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
567
567
  })
568
568
  .filter(Boolean);
569
569
  })()
570
- `}export async function getDoubaoConversationList(j){await ensureDoubaoChatPage(j);const q=await j.evaluate(b());if(!Array.isArray(q))return[];return q.map((F)=>({Id:F.id,Title:F.title,Url:`${DOUBAO_CHAT_URL}/${F.id}`}))}export function parseDoubaoConversationId(j){const q=j.match(/(\d{10,})/);return q?q[1]:j}function x(){return`
570
+ `}export async function getDoubaoConversationList(e){await ensureDoubaoChatPage(e);const t=await e.evaluate(B());if(!Array.isArray(t))return[];return t.map((n)=>({Id:n.id,Title:n.title,Url:`${DOUBAO_CHAT_URL}/${n.id}`}))}export function parseDoubaoConversationId(e){const t=e.match(/(\d{10,})/);return t?t[1]:e}function P(){return`
571
571
  (() => {
572
572
  const clean = (v) => (v || '').replace(/\\u00a0/g, ' ').replace(/\\n{3,}/g, '\\n\\n').trim();
573
573
 
@@ -600,14 +600,14 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
600
600
 
601
601
  return { messages, meeting };
602
602
  })()
603
- `}export async function navigateToConversation(j,q){const F=`${DOUBAO_CHAT_URL}/${q}`,G=await j.evaluate("window.location.href").catch(()=>"");if(typeof G==="string"&&G.includes(`/chat/${q}`)){await j.wait(1);return}await j.goto(F,{waitUntil:"load",settleMs:3000});await j.wait(2)}export async function getConversationDetail(j,q){await navigateToConversation(j,q);const F=await j.evaluate(x());return{messages:(F.messages||[]).map((K)=>({Role:K.role,Text:K.text,HasMeetingCard:K.hasMeetingCard})),meeting:F.meeting}}function m(){return`
603
+ `}export async function navigateToConversation(e,t){const n=`${DOUBAO_CHAT_URL}/${t}`,r=await e.evaluate("window.location.href").catch(()=>"");if(typeof r==="string"&&r.includes(`/chat/${t}`)){await e.wait(1);return}await e.goto(n,{waitUntil:"load",settleMs:3000});await e.wait(2)}export async function getConversationDetail(e,t){await navigateToConversation(e,t);const n=await e.evaluate(P());return{messages:(n.messages||[]).map((a)=>({Role:a.role,Text:a.text,HasMeetingCard:a.hasMeetingCard})),meeting:n.meeting}}function O(){return`
604
604
  (() => {
605
605
  const card = document.querySelector('[data-testid="meeting-minutes-card"]');
606
606
  if (!card) return false;
607
607
  card.click();
608
608
  return true;
609
609
  })()
610
- `}function u(){return`
610
+ `}function U(){return`
611
611
  (() => {
612
612
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
613
613
  if (!panel) return { error: 'no panel' };
@@ -619,7 +619,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
619
619
 
620
620
  return { summary: summaryText };
621
621
  })()
622
- `}function c(){return`
622
+ `}function V(){return`
623
623
  (() => {
624
624
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
625
625
  if (!panel) return false;
@@ -632,7 +632,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
632
632
  }
633
633
  return false;
634
634
  })()
635
- `}function l(){return`
635
+ `}function j(){return`
636
636
  (() => {
637
637
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
638
638
  if (!panel) return '';
@@ -640,13 +640,13 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
640
640
  if (!textNotes) return '';
641
641
  return (textNotes.innerText || textNotes.textContent || '').trim();
642
642
  })()
643
- `}function I(j){return j.split(`
644
- `).map((q)=>q.trim()).filter(Boolean)}function d(j,q){if(q.length===0)return!0;if(q.length>j.length)return!1;for(let F=0;F<=j.length-q.length;F+=1){let G=!0;for(let K=0;K<q.length;K+=1)if(j[F+K]!==q[K]){G=!1;break}if(G)return!0}return!1}export function mergeTranscriptSnapshots(j,q){const F=I(j),G=I(q);if(G.length===0)return F.join(`
645
- `);if(F.length===0)return G.join(`
646
- `);if(d(F,G))return F.join(`
647
- `);const K=Math.min(F.length,G.length);for(let J=K;J>0;J-=1){let Q=!0;for(let Y=0;Y<J;Y+=1)if(F[F.length-J+Y]!==G[Y]){Q=!1;break}if(Q)return[...F,...G.slice(J)].join(`
648
- `)}return[...F,...G].join(`
649
- `)}function o(){return`
643
+ `}function A(e){return e.split(`
644
+ `).map((t)=>t.trim()).filter(Boolean)}function W(e,t){if(t.length===0)return!0;if(t.length>e.length)return!1;for(let n=0;n<=e.length-t.length;n+=1){let r=!0;for(let a=0;a<t.length;a+=1)if(e[n+a]!==t[a]){r=!1;break}if(r)return!0}return!1}export function mergeTranscriptSnapshots(e,t){const n=A(e),r=A(t);if(r.length===0)return n.join(`
645
+ `);if(n.length===0)return r.join(`
646
+ `);if(W(n,r))return n.join(`
647
+ `);const a=Math.min(n.length,r.length);for(let o=a;o>0;o-=1){let s=!0;for(let c=0;c<o;c+=1)if(n[n.length-o+c]!==r[c]){s=!1;break}if(s)return[...n,...r.slice(o)].join(`
648
+ `)}return[...n,...r].join(`
649
+ `)}function z(){return`
650
650
  (() => {
651
651
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
652
652
  if (!panel) return false;
@@ -659,7 +659,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
659
659
  }
660
660
  return false;
661
661
  })()
662
- `}function s(){return`
662
+ `}function K(){return`
663
663
  (() => {
664
664
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
665
665
  if (!panel) return '';
@@ -667,7 +667,7 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
667
667
  if (!chapter) return '';
668
668
  return (chapter.innerText || chapter.textContent || '').trim();
669
669
  })()
670
- `}function g(){return`
670
+ `}function F(){return`
671
671
  (() => {
672
672
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
673
673
  if (!panel) return { error: 'no panel' };
@@ -678,14 +678,14 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
678
678
  downloadIcon.click();
679
679
  return { clicked: 'icon' };
680
680
  })()
681
- `}function p(){return`
681
+ `}function J(){return`
682
682
  (() => {
683
683
  const btn = document.querySelector('[data-testid="minutes-download-text-btn"]');
684
684
  if (!btn) return { error: 'no download text btn' };
685
685
  btn.click();
686
686
  return { clicked: 'transcript' };
687
687
  })()
688
- `}export async function openMeetingPanel(j,q){await navigateToConversation(j,q);if(!await j.evaluate(m()))return!1;await j.wait(2);return!0}export async function getMeetingSummary(j){return(await j.evaluate(u())).summary||""}export async function getMeetingChapters(j){await j.evaluate(o());await j.wait(1.5);return await j.evaluate(s())}function r(){return`
688
+ `}export async function openMeetingPanel(e,t){await navigateToConversation(e,t);if(!await e.evaluate(O()))return!1;await e.wait(2);return!0}export async function getMeetingSummary(e){return(await e.evaluate(U())).summary||""}export async function getMeetingChapters(e){await e.evaluate(z());await e.wait(1.5);return await e.evaluate(K())}function G(){return`
689
689
  (() => {
690
690
  const panel = document.querySelector('[data-testid="canvas_panel_container"]');
691
691
  if (!panel) return 0;
@@ -701,4 +701,4 @@ import{CommandExecutionError as N}from"@jackwener/opencli/errors";export const D
701
701
  }
702
702
  return maxScroll;
703
703
  })()
704
- `}export async function getMeetingTranscript(j){await j.evaluate(c());await j.wait(2);let q="",F=0;for(let G=0;G<10;G++){await j.evaluate(r());await j.wait(1);const K=await j.evaluate(l()),J=mergeTranscriptSnapshots(q,K);if(J===q&&K.length>0){F+=1;if(F>=2)break}else{F=0;q=J}}return q}export async function triggerTranscriptDownload(j){if((await j.evaluate(g())).error)return!1;await j.wait(1);return!(await j.evaluate(p())).error}export const __test__={clickSendButtonScript:y,composerStateScript:V,detectDoubaoVerificationScript:D,getTurnsScript:P,getTranscriptLinesScript:B};export async function startNewDoubaoChat(j){await ensureDoubaoChatPage(j);const q=await j.evaluate(L());if(q){await j.wait(1.5);return q}await j.goto(DOUBAO_NEW_CHAT_URL,{waitUntil:"load",settleMs:2000});await j.wait(1.5);return"navigate"}
704
+ `}export async function getMeetingTranscript(e){await e.evaluate(V());await e.wait(2);let t="",n=0;for(let r=0;r<10;r++){await e.evaluate(G());await e.wait(1);const a=await e.evaluate(j()),o=mergeTranscriptSnapshots(t,a);if(o===t&&a.length>0){n+=1;if(n>=2)break}else{n=0;t=o}}return t}export async function triggerTranscriptDownload(e){if((await e.evaluate(F())).error)return!1;await e.wait(1);return!(await e.evaluate(J())).error}export const __test__={clickSendButtonScript:C,composerStateScript:v,detectDoubaoVerificationScript:y,getTurnsScript:w,getTranscriptLinesScript:x};export async function startNewDoubaoChat(e){await ensureDoubaoChatPage(e);const t=await e.evaluate(R());if(t){await e.wait(1.5);return t}await e.goto(DOUBAO_NEW_CHAT_URL,{waitUntil:"load",settleMs:2000});await e.wait(1.5);return"navigate"}
@@ -1 +1 @@
1
- import{cli as K,Strategy as M}from"@jackwener/opencli/registry";import{SEL as N,injectTextScript as O,clickSendScript as Q,pollResponseScript as U}from"./utils.js";export const askCommand=K({site:"doubao-app",name:"ask",access:"write",description:"Send a message to Doubao desktop app and wait for the AI response",domain:"doubao-app",strategy:M.UI,browser:!0,args:[{name:"text",fromFile:!0,required:!0,positional:!0,help:"Prompt to send"},{name:"timeout",type:"int",default:30,help:"Max seconds to wait for response"}],columns:["Role","Text"],func:async(h,B)=>{const z=B.text,D=B.timeout||30,H=await h.evaluate(`document.querySelectorAll('${N.MESSAGE}').length`);if(!(await h.evaluate(O(z)))?.ok)throw Error("Could not find chat input.");await h.wait(0.5);if(!await h.evaluate(Q()))await h.pressKey("Enter");const F=1,J=Math.ceil(D/F);let A="";for(let G=0;G<J;G++){await h.wait(F);const q=await h.evaluate(U(H));if(!q)continue;if(q.phase==="done"&&q.text){A=q.text;break}}if(!A)return[{Role:"User",Text:z},{Role:"System",Text:`No response received within ${D}s.`}];return[{Role:"User",Text:z},{Role:"Assistant",Text:A}]}});
1
+ import{cli as u,Strategy as p}from"@jackwener/opencli/registry";import{SEL as d,injectTextScript as m,clickSendScript as f,pollResponseScript as w}from"./utils.js";export const askCommand=u({site:"doubao-app",name:"ask",access:"write",description:"Send a message to Doubao desktop app and wait for the AI response",domain:"doubao-app",strategy:p.UI,browser:!0,args:[{name:"text",fromFile:!0,required:!0,positional:!0,help:"Prompt to send"},{name:"timeout",type:"int",default:30,help:"Max seconds to wait for response"}],columns:["Role","Text"],func:async(t,i)=>{const o=i.text,n=i.timeout||30,c=await t.evaluate(`document.querySelectorAll('${d.MESSAGE}').length`);if(!(await t.evaluate(m(o)))?.ok)throw Error("Could not find chat input.");await t.wait(0.5);if(!await t.evaluate(f()))await t.pressKey("Enter");const r=1,l=Math.ceil(n/r);let a="";for(let s=0;s<l;s++){await t.wait(r);const e=await t.evaluate(w(c));if(!e)continue;if(e.phase==="done"&&e.text){a=e.text;break}}if(!a)return[{Role:"User",Text:o},{Role:"System",Text:`No response received within ${n}s.`}];return[{Role:"User",Text:o},{Role:"Assistant",Text:a}]}});
@@ -1,4 +1,4 @@
1
- export const SEL={INPUT:'[data-testid="chat_input_input"]',SEND_BTN:'[data-testid="chat_input_send_button"]',MESSAGE:'[data-testid="message_content"]',MESSAGE_TEXT:'[data-testid="message_text_content"]',INDICATOR:'[data-testid="indicator"]',NEW_CHAT:'[data-testid="new_chat_button"]',NEW_CHAT_SIDEBAR:'[data-testid="app-open-newChat"]'};export function injectTextScript(j){return`(function(t) {
1
+ export const SEL={INPUT:'[data-testid="chat_input_input"]',SEND_BTN:'[data-testid="chat_input_send_button"]',MESSAGE:'[data-testid="message_content"]',MESSAGE_TEXT:'[data-testid="message_text_content"]',INDICATOR:'[data-testid="indicator"]',NEW_CHAT:'[data-testid="new_chat_button"]',NEW_CHAT_SIDEBAR:'[data-testid="app-open-newChat"]'};export function injectTextScript(t){return`(function(t) {
2
2
  const textarea = document.querySelector('${SEL.INPUT}');
3
3
  if (!textarea) return { ok: false, error: 'No textarea found' };
4
4
  textarea.focus();
@@ -10,7 +10,7 @@ export const SEL={INPUT:'[data-testid="chat_input_input"]',SEND_BTN:'[data-testi
10
10
  textarea.dispatchEvent(new Event('input', { bubbles: true }));
11
11
  textarea.dispatchEvent(new Event('change', { bubbles: true }));
12
12
  return { ok: true };
13
- })(${JSON.stringify(j)})`}export function clickSendScript(){return`(function() {
13
+ })(${JSON.stringify(t)})`}export function clickSendScript(){return`(function() {
14
14
  const btn = document.querySelector('${SEL.SEND_BTN}');
15
15
  if (!btn) return false;
16
16
  btn.click();
@@ -42,7 +42,7 @@ export const SEL={INPUT:'[data-testid="chat_input_input"]',SEND_BTN:'[data-testi
42
42
  btn = document.querySelector('${SEL.NEW_CHAT_SIDEBAR}');
43
43
  if (btn) { btn.click(); return true; }
44
44
  return false;
45
- })()`}export function pollResponseScript(j){return`(function(prevCount) {
45
+ })()`}export function pollResponseScript(t){return`(function(prevCount) {
46
46
  const msgs = document.querySelectorAll('${SEL.MESSAGE}');
47
47
  if (msgs.length <= prevCount) return { phase: 'waiting', text: null };
48
48
  const lastMsg = msgs[msgs.length - 1];
@@ -61,4 +61,4 @@ export const SEL={INPUT:'[data-testid="chat_input_input"]',SEND_BTN:'[data-testi
61
61
  text = textEl.innerText?.trim() || textEl.textContent?.trim() || '';
62
62
  }
63
63
  return { phase: 'done', text };
64
- })(${j})`}
64
+ })(${t})`}
@@ -1,17 +1,17 @@
1
- import{AuthRequiredError as M,CommandExecutionError as I}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as N}from"./evaluate-result.js";function O(G,B){const D=String(B??"");return G===401||G===403||/login|cookie|auth|captcha|verify|forbidden|permission|登录|登陆|权限|验证|验证码/i.test(D)}export async function browserFetch(G,B,D,H={}){const K=`
1
+ import{AuthRequiredError as u,CommandExecutionError as i}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as y}from"./evaluate-result.js";function f(s,t){const e=String(t??"");return s===401||s===403||/login|cookie|auth|captcha|verify|forbidden|permission|登录|登陆|权限|验证|验证码/i.test(e)}export async function browserFetch(s,t,e,n={}){const c=`
2
2
  (async () => {
3
3
  const controller = new AbortController();
4
- const timer = setTimeout(() => controller.abort(), ${Number(H.timeoutMs??30000)});
4
+ const timer = setTimeout(() => controller.abort(), ${Number(n.timeoutMs??30000)});
5
5
  try {
6
- const res = await fetch(${JSON.stringify(D)}, {
7
- method: ${JSON.stringify(B)},
6
+ const res = await fetch(${JSON.stringify(e)}, {
7
+ method: ${JSON.stringify(t)},
8
8
  credentials: 'include',
9
9
  signal: controller.signal,
10
10
  headers: {
11
11
  'Content-Type': 'application/json',
12
- ...${JSON.stringify(H.headers??{})}
12
+ ...${JSON.stringify(n.headers??{})}
13
13
  },
14
- ${H.body?`body: JSON.stringify(${JSON.stringify(H.body)}),`:""}
14
+ ${n.body?`body: JSON.stringify(${JSON.stringify(n.body)}),`:""}
15
15
  });
16
16
  const text = await res.text();
17
17
  try {
@@ -25,4 +25,4 @@ import{AuthRequiredError as M,CommandExecutionError as I}from"@jackwener/opencli
25
25
  clearTimeout(timer);
26
26
  }
27
27
  })()
28
- `;let z;try{z=N(await G.evaluate(K))}catch(F){throw new I(`Douyin API request failed (${B} ${D}): ${F instanceof Error?F.message:String(F)}`)}if(z==null)throw new I(`Empty response from Douyin API (${B} ${D})`);if(Array.isArray(z)||typeof z!=="object")throw new I(`Malformed response from Douyin API (${B} ${D})`);if(z&&typeof z==="object"&&"status_code"in z){const F=z.status_code;if(F!==0){const J=z.status_msg??z.message??"unknown error";if(O(F,J))throw new M("creator.douyin.com",`Douyin API auth/permission error ${F} at ${B} ${D}: ${J}`);throw new I(`Douyin API error ${F} at ${B} ${D}: ${J}`)}}return z}
28
+ `;let r;try{r=y(await s.evaluate(c))}catch(o){throw new i(`Douyin API request failed (${t} ${e}): ${o instanceof Error?o.message:String(o)}`)}if(r==null)throw new i(`Empty response from Douyin API (${t} ${e})`);if(Array.isArray(r)||typeof r!=="object")throw new i(`Malformed response from Douyin API (${t} ${e})`);if(r&&typeof r==="object"&&"status_code"in r){const o=r.status_code;if(o!==0){const a=r.status_msg??r.message??"unknown error";if(f(o,a))throw new u("creator.douyin.com",`Douyin API auth/permission error ${o} at ${t} ${e}: ${a}`);throw new i(`Douyin API error ${o} at ${t} ${e}: ${a}`)}}return r}
@@ -10,4 +10,4 @@ export const IMAGE_DRAFT_KEY_RE=/^publish_cache:\d+:image$/,READ_IMAGE_DRAFT_JS=
10
10
  } catch (e) {}
11
11
  return out;
12
12
  })()
13
- `;export function matchImageDraft(L,q){const z=String(q?.title||"").replace(/\s+/g,""),C=String(q?.content||"").split("#")[0].replace(/\s+/g,"").slice(0,20);for(const j of L||[]){if(!j||!IMAGE_DRAFT_KEY_RE.test(j.key||""))continue;let f=null;try{f=JSON.parse(j.value||"")}catch{continue}if(!f)continue;const N=String(f.title||"").replace(/\s+/g,""),O=String(f.text||"").replace(/\s+/g,""),P=!!z&&N===z,Q=!!C&&O.includes(C);if(P||Q)return{hit:!0,key:j.key,title:f.title||""}}return{hit:!1}}
13
+ `;export function matchImageDraft(c,o){const i=String(o?.title||"").replace(/\s+/g,""),n=String(o?.content||"").split("#")[0].replace(/\s+/g,"").slice(0,20);for(const e of c||[]){if(!e||!IMAGE_DRAFT_KEY_RE.test(e.key||""))continue;let t=null;try{t=JSON.parse(e.value||"")}catch{continue}if(!t)continue;const l=String(t.title||"").replace(/\s+/g,""),a=String(t.text||"").replace(/\s+/g,""),r=!!i&&l===i,s=!!n&&a.includes(n);if(r||s)return{hit:!0,key:e.key,title:t.title||""}}return{hit:!1}}
@@ -1 +1 @@
1
- import*as K from"node:fs";import*as S from"node:path";import{CommandExecutionError as M}from"@jackwener/opencli/errors";function V(q){switch(S.extname(q).toLowerCase()){case".png":return"image/png";case".gif":return"image/gif";case".webp":return"image/webp";default:return"image/jpeg"}}export async function imagexUpload(q,z){if(!K.existsSync(q))throw new M(`Cover image file not found: ${q}`,"Ensure the file path is correct and accessible.");const H=K.readFileSync(q),O=V(q),F=await fetch(z.upload_url,{method:"PUT",headers:{"Content-Type":O,"Content-Length":String(H.byteLength)},body:H});if(!F.ok){const Q=await F.text().catch(()=>"");throw new M(`ImageX upload failed with status ${F.status}: ${Q}`,"Check that the upload URL is valid and has not expired.")}return z.store_uri}
1
+ import*as r from"node:fs";import*as c from"node:path";import{CommandExecutionError as a}from"@jackwener/opencli/errors";function p(e){switch(c.extname(e).toLowerCase()){case".png":return"image/png";case".gif":return"image/gif";case".webp":return"image/webp";default:return"image/jpeg"}}export async function imagexUpload(e,t){if(!r.existsSync(e))throw new a(`Cover image file not found: ${e}`,"Ensure the file path is correct and accessible.");const o=r.readFileSync(e),i=p(e),n=await fetch(t.upload_url,{method:"PUT",headers:{"Content-Type":i,"Content-Length":String(o.byteLength)},body:o});if(!n.ok){const s=await n.text().catch(()=>"");throw new a(`ImageX upload failed with status ${n.status}: ${s}`,"Check that the upload URL is valid and has not expired.")}return t.store_uri}
@@ -1 +1 @@
1
- import{AuthRequiredError as C}from"@jackwener/opencli/errors";const D="https://creator.douyin.com/aweme/mid/video/sts2/?scene=web&aid=1128&cookie_enabled=true&device_platform=web";export async function getSts2Credentials(z){const B=`fetch(${JSON.stringify(D)}, { credentials: 'include' }).then(r => r.json())`,b=await z.evaluate(B),v=typeof b==="object"&&b!==null&&"data"in b&&b.data?b.data:b;if(!v?.access_key_id)throw new C("creator.douyin.com","STS2 credentials missing");return v}
1
+ import{AuthRequiredError as i}from"@jackwener/opencli/errors";const o="https://creator.douyin.com/aweme/mid/video/sts2/?scene=web&aid=1128&cookie_enabled=true&device_platform=web";export async function getSts2Credentials(n){const r=`fetch(${JSON.stringify(o)}, { credentials: 'include' }).then(r => r.json())`,e=await n.evaluate(r),t=typeof e==="object"&&e!==null&&"data"in e&&e.data?e.data:e;if(!t?.access_key_id)throw new i("creator.douyin.com","STS2 credentials missing");return t}
@@ -1 +1 @@
1
- export function parseTextExtra(i,d){return d.map((b)=>({type:1,hashtag_id:b.id,hashtag_name:b.name,start:b.start,end:b.end,caption_start:0,caption_end:b.end-b.start}))}export function extractHashtagNames(i){return[...i.matchAll(/#([^\s#]+)/g)].map((d)=>d[1])}
1
+ export function parseTextExtra(e,a){return a.map((t)=>({type:1,hashtag_id:t.id,hashtag_name:t.name,start:t.start,end:t.end,caption_start:0,caption_end:t.end-t.start}))}export function extractHashtagNames(e){return[...e.matchAll(/#([^\s#]+)/g)].map((a)=>a[1])}
@@ -1,5 +1,5 @@
1
- import*as R from"node:crypto";import*as M from"node:fs";import*as P from"node:os";import*as U from"node:path";import{CommandExecutionError as _}from"@jackwener/opencli/errors";const PART_SIZE=5242880,RESUME_DIR=U.join(P.homedir(),".ppcli","douyin-resume");function getResumeFilePath(J){const G=R.createHash("sha256").update(J).digest("hex");return U.join(RESUME_DIR,`${G}.json`)}function loadResumeState(J,G){try{const Q=M.readFileSync(J,"utf8"),W=JSON.parse(Q);if(W.fileSize===G&&W.uploadId&&Array.isArray(W.parts))return W}catch{}return null}function saveResumeState(J,G){M.mkdirSync(U.dirname(J),{recursive:!0});M.writeFileSync(J,JSON.stringify(G,null,2),"utf8")}function deleteResumeState(J){try{M.unlinkSync(J)}catch{}}function v(J,G){return R.createHmac("sha256",J).update(G,"utf8").digest()}function I(J){const G=R.createHash("sha256");if(typeof J==="string")G.update(J,"utf8");else G.update(J);return G.digest("hex")}const S=new Uint32Array(256).map((J,G)=>{let Q=G;for(let W=0;W<8;W+=1)Q=Q&1?3988292384^Q>>>1:Q>>>1;return Q>>>0});function crc32Hex(J){let G=4294967295;for(const Q of J)G=S[(G^Q)&255]^G>>>8;return((G^4294967295)>>>0).toString(16).padStart(8,"0")}function gatewayBaseUrl(J){const G=new URL(J);return`https://${G.host}/upload/v1${G.pathname}`}function gatewayHeaders(J,G,Q=""){return{Authorization:J,"X-Storage-U":encodeURIComponent(Q),...G??{}}}function extractRegionFromHost(J){const G=J.match(/^tos-([^.]+)\./);if(G)return G[1];return"cn-north-1"}function computeAws4Headers(J){const{method:G,url:Q,credentials:W,service:Y,region:V,datetime:X}=J,K=X.slice(0,8),$=new URL(Q),D=$.pathname||"/",O=[...$.searchParams.entries()].sort(([q],[C])=>q.localeCompare(C)).map(([q,C])=>`${encodeURIComponent(q)}=${encodeURIComponent(C)}`).join("&"),Z=I(J.body),A={...J.headers,host:$.host,"x-amz-content-sha256":Z,"x-amz-date":X,"x-amz-security-token":W.session_token},w=Object.keys(A).sort((q,C)=>q.toLowerCase().localeCompare(C.toLowerCase())),T=w.map((q)=>`${q.toLowerCase()}:${A[q].trim()}`).join(`
1
+ import*as k from"node:crypto";import*as m from"node:fs";import*as D from"node:os";import*as T from"node:path";import{CommandExecutionError as g}from"@jackwener/opencli/errors";const PART_SIZE=5242880,RESUME_DIR=T.join(D.homedir(),".ppcli","douyin-resume");function getResumeFilePath(e){const t=k.createHash("sha256").update(e).digest("hex");return T.join(RESUME_DIR,`${t}.json`)}function loadResumeState(e,t){try{const a=m.readFileSync(e,"utf8"),n=JSON.parse(a);if(n.fileSize===t&&n.uploadId&&Array.isArray(n.parts))return n}catch{}return null}function saveResumeState(e,t){m.mkdirSync(T.dirname(e),{recursive:!0});m.writeFileSync(e,JSON.stringify(t,null,2),"utf8")}function deleteResumeState(e){try{m.unlinkSync(e)}catch{}}function x(e,t){return k.createHmac("sha256",e).update(t,"utf8").digest()}function P(e){const t=k.createHash("sha256");if(typeof e==="string")t.update(e,"utf8");else t.update(e);return t.digest("hex")}const v=new Uint32Array(256).map((e,t)=>{let a=t;for(let n=0;n<8;n+=1)a=a&1?3988292384^a>>>1:a>>>1;return a>>>0});function crc32Hex(e){let t=4294967295;for(const a of e)t=v[(t^a)&255]^t>>>8;return((t^4294967295)>>>0).toString(16).padStart(8,"0")}function gatewayBaseUrl(e){const t=new URL(e);return`https://${t.host}/upload/v1${t.pathname}`}function gatewayHeaders(e,t,a=""){return{Authorization:e,"X-Storage-U":encodeURIComponent(a),...t??{}}}function extractRegionFromHost(e){const t=e.match(/^tos-([^.]+)\./);if(t)return t[1];return"cn-north-1"}function computeAws4Headers(e){const{method:t,url:a,credentials:n,service:s,region:o,datetime:r}=e,l=r.slice(0,8),c=new URL(a),d=c.pathname||"/",i=[...c.searchParams.entries()].sort(([f],[w])=>f.localeCompare(w)).map(([f,w])=>`${encodeURIComponent(f)}=${encodeURIComponent(w)}`).join("&"),h=P(e.body),y={...e.headers,host:c.host,"x-amz-content-sha256":h,"x-amz-date":r,"x-amz-security-token":n.session_token},I=Object.keys(y).sort((f,w)=>f.toLowerCase().localeCompare(w.toLowerCase())),S=I.map((f)=>`${f.toLowerCase()}:${y[f].trim()}`).join(`
2
2
  `)+`
3
- `,L=w.map((q)=>q.toLowerCase()).join(";"),E=[G.toUpperCase(),D,O,T,L,Z].join(`
4
- `),z=`${K}/${V}/${Y}/aws4_request`,N=["AWS4-HMAC-SHA256",X,z,I(E)].join(`
5
- `),x=v(`AWS4${W.secret_access_key}`,K),g=v(x,V),F=v(g,Y),j=v(F,"aws4_request"),B=v(j,N).toString("hex"),k=`AWS4-HMAC-SHA256 Credential=${W.access_key_id}/${z}, SignedHeaders=${L}, Signature=${B}`;return{...A,Authorization:k}}async function H(J){const{method:G,url:Q,headers:W,body:Y}=J,V=Y==null?null:typeof Y==="string"?Y:Y,X=await fetch(Q,{method:G,headers:W,body:V,signal:AbortSignal.timeout(60000)}),K=await X.text(),$={};X.headers.forEach((D,O)=>{$[O.toLowerCase()]=D});return{status:X.status,headers:$,body:K}}function n(){return new Date().toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function extractUploadId(J){const G=J.match(/<UploadId>([^<]+)<\/UploadId>/i);if(G)return G[1];try{const Q=JSON.parse(J);return Q?.payload?.uploadID||Q?.payload?.uploadId||Q?.payload?.UploadID||Q?.payload?.UploadId||Q?.data?.uploadid||Q?.data?.uploadID||Q?.data?.uploadId||Q?.data?.UploadID||Q?.data?.UploadId||Q?.UploadID||Q?.UploadId||Q?.uploadID||Q?.uploadId||null}catch{return null}}async function f(J,G,Q,W){const Y=`${gatewayBaseUrl(J)}?uploadmode=part&phase=init`,V=await H({method:"POST",url:Y,headers:gatewayHeaders(G,Q,W)});if(V.status!==200)throw new _(`TOS init multipart upload failed with status ${V.status}: ${V.body}`,"Check that TOS upload authorization is valid and not expired.");const X=extractUploadId(V.body);if(!X)throw new _(`TOS init response missing UploadId: ${V.body}`);return X}async function h(J,G,Q,W,Y,V,X){const K=crc32Hex(W),$=`${gatewayBaseUrl(J)}?uploadid=${encodeURIComponent(Q)}&part_number=${G}&phase=transfer`,D={...gatewayHeaders(Y,V,X),"Content-CRC32":K,"Content-Type":"application/octet-stream","X-Use-Init-Upload-Optimize":"1","X-Use-Large-Local-Cache":"1"},O=await H({method:"POST",url:$,headers:D,body:W});let Z;try{Z=JSON.parse(O.body)}catch{Z=null}if(O.status!==200||Z?.code!==2000)throw new _(`TOS upload part ${G} failed with status ${O.status}: ${O.body}`,"Check that TOS upload authorization is valid and not expired.");return Z?.data?.crc32||K}async function m(J,G,Q,W,Y,V){const X=`${gatewayBaseUrl(J)}?uploadmode=part&phase=finish&uploadid=${encodeURIComponent(G)}`,K=Q.sort((O,Z)=>O.partNumber-Z.partNumber).map((O)=>`${O.partNumber}:${O.crc32}`).join(","),$=await H({method:"POST",url:X,headers:gatewayHeaders(W,Y,V),body:K});let D;try{D=JSON.parse($.body)}catch{D=null}if($.status!==200||D?.code!==2000)throw new _(`TOS complete multipart upload failed with status ${$.status}: ${$.body}`,"Check that all parts were uploaded successfully.");return D?.data?.key||null}let b=null;export function setReadSyncOverride(J){b=J}export async function tosUpload(J){const{filePath:G,uploadInfo:Q,credentials:W,onProgress:Y}=J;if(!M.existsSync(G))throw new _(`Video file not found: ${G}`,"Ensure the file path is correct and accessible.");const{size:V}=M.statSync(G);if(V===0)throw new _(`Video file is empty: ${G}`);const{tos_upload_url:X,auth:K,upload_header:$,user_id:D}=Q,O=new URL(X),Z=extractRegionFromHost(O.host),A=getResumeFilePath(G);let w=loadResumeState(A,V),T,L;if(w){T=w.uploadId;L=w.parts}else{T=await f(X,K,$,D);L=[];saveResumeState(A,{uploadId:T,fileSize:V,parts:L})}const E=new Set(L.map((F)=>F.partNumber)),z=Math.ceil(V/PART_SIZE);let N=L.length*PART_SIZE;if(Y)Y(Math.min(N,V),V);const x=M.openSync(G,"r");try{for(let F=1;F<=z;F++){if(E.has(F))continue;const j=(F-1)*PART_SIZE,B=Math.min(PART_SIZE,V-j),k=Buffer.allocUnsafe(B),C=(b??M.readSync)(x,k,0,B,j);if(C!==B)throw new _(`Short read on part ${F}: expected ${B} bytes, got ${C}`);const y=await h(X,F,T,k,K,$,D);L.push({partNumber:F,crc32:y});saveResumeState(A,{uploadId:T,fileSize:V,parts:L});N=Math.min(j+B,V);if(Y)Y(N,V)}}finally{M.closeSync(x)}const g=await m(X,T,L,K,$,D);deleteResumeState(A);return g}export{PART_SIZE,RESUME_DIR,extractRegionFromHost,getResumeFilePath,loadResumeState,saveResumeState,deleteResumeState,computeAws4Headers,extractUploadId,crc32Hex,gatewayBaseUrl,gatewayHeaders};
3
+ `,u=I.map((f)=>f.toLowerCase()).join(";"),_=[t.toUpperCase(),d,i,S,u,h].join(`
4
+ `),R=`${l}/${o}/${s}/aws4_request`,b=["AWS4-HMAC-SHA256",r,R,P(_)].join(`
5
+ `),H=x(`AWS4${n.secret_access_key}`,l),A=x(H,o),p=x(A,s),C=x(p,"aws4_request"),U=x(C,b).toString("hex"),O=`AWS4-HMAC-SHA256 Credential=${n.access_key_id}/${R}, SignedHeaders=${u}, Signature=${U}`;return{...y,Authorization:O}}async function z(e){const{method:t,url:a,headers:n,body:s}=e,o=s==null?null:typeof s==="string"?s:s,r=await fetch(a,{method:t,headers:n,body:o,signal:AbortSignal.timeout(60000)}),l=await r.text(),c={};r.headers.forEach((d,i)=>{c[i.toLowerCase()]=d});return{status:r.status,headers:c,body:l}}function F(){return new Date().toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function extractUploadId(e){const t=e.match(/<UploadId>([^<]+)<\/UploadId>/i);if(t)return t[1];try{const a=JSON.parse(e);return a?.payload?.uploadID||a?.payload?.uploadId||a?.payload?.UploadID||a?.payload?.UploadId||a?.data?.uploadid||a?.data?.uploadID||a?.data?.uploadId||a?.data?.UploadID||a?.data?.UploadId||a?.UploadID||a?.UploadId||a?.uploadID||a?.uploadId||null}catch{return null}}async function M(e,t,a,n){const s=`${gatewayBaseUrl(e)}?uploadmode=part&phase=init`,o=await z({method:"POST",url:s,headers:gatewayHeaders(t,a,n)});if(o.status!==200)throw new g(`TOS init multipart upload failed with status ${o.status}: ${o.body}`,"Check that TOS upload authorization is valid and not expired.");const r=extractUploadId(o.body);if(!r)throw new g(`TOS init response missing UploadId: ${o.body}`);return r}async function N(e,t,a,n,s,o,r){const l=crc32Hex(n),c=`${gatewayBaseUrl(e)}?uploadid=${encodeURIComponent(a)}&part_number=${t}&phase=transfer`,d={...gatewayHeaders(s,o,r),"Content-CRC32":l,"Content-Type":"application/octet-stream","X-Use-Init-Upload-Optimize":"1","X-Use-Large-Local-Cache":"1"},i=await z({method:"POST",url:c,headers:d,body:n});let h;try{h=JSON.parse(i.body)}catch{h=null}if(i.status!==200||h?.code!==2000)throw new g(`TOS upload part ${t} failed with status ${i.status}: ${i.body}`,"Check that TOS upload authorization is valid and not expired.");return h?.data?.crc32||l}async function E(e,t,a,n,s,o){const r=`${gatewayBaseUrl(e)}?uploadmode=part&phase=finish&uploadid=${encodeURIComponent(t)}`,l=a.sort((i,h)=>i.partNumber-h.partNumber).map((i)=>`${i.partNumber}:${i.crc32}`).join(","),c=await z({method:"POST",url:r,headers:gatewayHeaders(n,s,o),body:l});let d;try{d=JSON.parse(c.body)}catch{d=null}if(c.status!==200||d?.code!==2000)throw new g(`TOS complete multipart upload failed with status ${c.status}: ${c.body}`,"Check that all parts were uploaded successfully.");return d?.data?.key||null}let L=null;export function setReadSyncOverride(e){L=e}export async function tosUpload(e){const{filePath:t,uploadInfo:a,credentials:n,onProgress:s}=e;if(!m.existsSync(t))throw new g(`Video file not found: ${t}`,"Ensure the file path is correct and accessible.");const{size:o}=m.statSync(t);if(o===0)throw new g(`Video file is empty: ${t}`);const{tos_upload_url:r,auth:l,upload_header:c,user_id:d}=a,i=new URL(r),h=extractRegionFromHost(i.host),y=getResumeFilePath(t);let I=loadResumeState(y,o),S,u;if(I){S=I.uploadId;u=I.parts}else{S=await M(r,l,c,d);u=[];saveResumeState(y,{uploadId:S,fileSize:o,parts:u})}const _=new Set(u.map((p)=>p.partNumber)),R=Math.ceil(o/PART_SIZE);let b=u.length*PART_SIZE;if(s)s(Math.min(b,o),o);const H=m.openSync(t,"r");try{for(let p=1;p<=R;p++){if(_.has(p))continue;const C=(p-1)*PART_SIZE,U=Math.min(PART_SIZE,o-C),O=Buffer.allocUnsafe(U),w=(L??m.readSync)(H,O,0,U,C);if(w!==U)throw new g(`Short read on part ${p}: expected ${U} bytes, got ${w}`);const j=await N(r,p,S,O,l,c,d);u.push({partNumber:p,crc32:j});saveResumeState(y,{uploadId:S,fileSize:o,parts:u});b=Math.min(C+U,o);if(s)s(b,o)}}finally{m.closeSync(H)}const A=await E(r,S,u,l,c,d);deleteResumeState(y);return A}export{PART_SIZE,RESUME_DIR,extractRegionFromHost,getResumeFilePath,loadResumeState,saveResumeState,deleteResumeState,computeAws4Headers,extractUploadId,crc32Hex,gatewayBaseUrl,gatewayHeaders};
@@ -1 +1 @@
1
- import{TimeoutError as Z}from"@jackwener/opencli/errors";import{browserFetch as $}from"./browser-fetch.js";const C=3000,V=300000,W="https://creator.douyin.com/web/api/media/video/transend/";export async function pollTranscodeWithFetch(z,G,q,H=V){const X=`${W}?video_id=${encodeURIComponent(q)}&aid=1128`,J=Date.now()+H;while(Date.now()<J){const K=await z(G,"GET",X);if(K.encode===2)return K;const Q=J-Date.now();if(Q<=0)break;await new Promise((Y)=>setTimeout(Y,Math.min(C,Q)))}throw new Z(`Douyin transcode for video ${q}`,Math.round(H/1000))}export async function pollTranscode(z,G,q){return pollTranscodeWithFetch($,z,G,q)}
1
+ import{TimeoutError as d}from"@jackwener/opencli/errors";import{browserFetch as m}from"./browser-fetch.js";const w=3000,u=300000,T="https://creator.douyin.com/web/api/media/video/transend/";export async function pollTranscodeWithFetch(n,e,o,t=u){const c=`${T}?video_id=${encodeURIComponent(o)}&aid=1128`,r=Date.now()+t;while(Date.now()<r){const i=await n(e,"GET",c);if(i.encode===2)return i;const a=r-Date.now();if(a<=0)break;await new Promise((s)=>setTimeout(s,Math.min(w,a)))}throw new d(`Douyin transcode for video ${o}`,Math.round(t/1000))}export async function pollTranscode(n,e,o){return pollTranscodeWithFetch(m,n,e,o)}
@@ -1,5 +1,5 @@
1
- import*as g from"node:crypto";import{AuthRequiredError as J,CommandExecutionError as d}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as v}from"./evaluate-result.js";const C="https://creator.douyin.com/web/api/media/upload/auth/v5/",_="https://vod.bytedanceapi.com/",$="aweme";function l(s,e){return g.createHmac("sha256",s).update(e,"utf8").digest()}function A(s){const e=g.createHash("sha256");if(Buffer.isBuffer(s)||s instanceof Uint8Array)e.update(s);else e.update(s??"","utf8");return e.digest("hex")}function b(){return new Date().toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function P(s){return[...s.searchParams.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}function U(s,e,t={}){const o=new URL(s),i=b(),u=i.slice(0,8),a=t.method??"GET",h=t.body??"",r=A(h),c={...t.headers??{},host:o.host,"x-amz-content-sha256":r,"x-amz-date":i,"x-amz-security-token":e.session_token},n=Object.keys(c).sort((m,x)=>m.localeCompare(x)),p=n.map((m)=>`${m}:${String(c[m]).trim()}`).join(`
1
+ import*as g from"node:crypto";import{AuthRequiredError as v,CommandExecutionError as d}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as C}from"./evaluate-result.js";const b="https://creator.douyin.com/web/api/media/upload/auth/v5/",_="https://vod.bytedanceapi.com/",A="aweme";function l(s,e){return g.createHmac("sha256",s).update(e,"utf8").digest()}function U(s){const e=g.createHash("sha256");if(Buffer.isBuffer(s)||s instanceof Uint8Array)e.update(s);else e.update(s??"","utf8");return e.digest("hex")}function P(){return new Date().toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function V(s){return[...s.searchParams.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}function O(s,e,t={}){const o=new URL(s),i=P(),u=i.slice(0,8),a=t.method??"GET",h=t.body??"",r=U(h),c={...t.headers??{},host:o.host,"x-amz-content-sha256":r,"x-amz-date":i,"x-amz-security-token":e.session_token},n=Object.keys(c).sort((m,J)=>m.localeCompare(J)),p=n.map((m)=>`${m}:${String(c[m]).trim()}`).join(`
2
2
  `)+`
3
- `,S=n.join(";"),O=[a,o.pathname||"/",P(o),p,S,r].join(`
4
- `),y="vod",f="cn-north-1",w=`${u}/${f}/${y}/aws4_request`,N=["AWS4-HMAC-SHA256",i,w,A(O)].join(`
5
- `),H=l(`AWS4${e.secret_access_key}`,u),T=l(H,f),k=l(T,y),I=l(k,"aws4_request"),R=l(I,N).toString("hex");return{...c,Authorization:`AWS4-HMAC-SHA256 Credential=${e.access_key_id}/${w}, SignedHeaders=${S}, Signature=${R}`}}function V(s){try{const e=s.startsWith("STS2")?s.slice(4):s,t=JSON.parse(Buffer.from(e,"base64").toString("utf8")),i=JSON.parse(t.PolicyString||"{}")?.Statement?.[0]?.Condition;if(typeof i==="string")return JSON.parse(i).UserId||""}catch{return""}return""}export async function getUploadAuthV5Credentials(s){const e=v(await s.evaluate(`fetch(${JSON.stringify(C)}, { credentials: 'include' }).then(r => r.json())`));if(!e||Array.isArray(e)||typeof e!=="object")throw new d(`获取抖音上传授权失败: ${JSON.stringify(e)}`);if(e.status_code!==0){const o=e.status_msg??e.message??"unknown error";if(e.status_code===401||e.status_code===403||/login|cookie|auth|captcha|verify|forbidden|permission|登录|登陆|权限|验证|验证码/i.test(String(o)))throw new J("creator.douyin.com",`获取抖音上传授权失败: ${o}`);throw new d(`获取抖音上传授权失败: ${JSON.stringify(e)}`)}if(!e.auth)throw new d(`获取抖音上传授权失败: ${JSON.stringify(e)}`);let t;try{t=JSON.parse(e.auth)}catch(o){throw new d(`解析抖音上传授权失败: ${o instanceof Error?o.message:String(o)}`)}if(!t.AccessKeyID||!t.SecretAccessKey||!t.SessionToken)throw new d("抖音上传授权缺少 AccessKeyID/SecretAccessKey/SessionToken");return{access_key_id:t.AccessKeyID,secret_access_key:t.SecretAccessKey,session_token:t.SessionToken,user_id:V(t.SessionToken),expired_time:t.ExpiredTime,current_time:t.CurrentTime}}export async function applyVideoUploadInner(s,e){const t=new URLSearchParams({Action:"ApplyUploadInner",Version:"2020-11-19",SpaceName:$,FileType:"video",IsInner:"1",FileSize:String(s)}),o=`${_}?${t.toString()}`,i=await fetch(o,{headers:U(o,e),signal:AbortSignal.timeout(30000)}),u=await i.text();let a;try{a=JSON.parse(u)}catch{throw new d(`申请抖音上传地址失败,非 JSON 响应: HTTP ${i.status} ${u.slice(0,300)}`)}const h=a?.ResponseMetadata?.Error;if(!i.ok||h)throw new d(`申请抖音上传地址失败: HTTP ${i.status} ${JSON.stringify(h??a)}`);const r=a?.Result?.InnerUploadAddress?.UploadNodes?.[0],c=r?.StoreInfos?.[0],n=a?.Result?.Vid||r?.Vid,p=r?.SessionKey??c?.SessionKey??a?.Result?.SessionKey;if(!r?.UploadHost||!c?.StoreUri||!c?.Auth||!n||!p)throw new d(`申请抖音上传地址响应缺少必要字段: ${JSON.stringify(a).slice(0,500)}`);return{video_id:n,tos_upload_url:`https://${r.UploadHost}/${c.StoreUri}`,auth:c.Auth,session_key:p,upload_header:r.UploadHeader??{},user_id:e.user_id??""}}export async function commitVideoUploadInner(s,e){if(!s?.session_key)throw new d("抖音上传提交缺少 SessionKey");const t=new URLSearchParams({Action:"CommitUploadInner",Version:"2020-11-19",SpaceName:$}),o=`${_}?${t.toString()}`,i=JSON.stringify({SessionKey:s.session_key}),u=U(o,e,{method:"POST",body:i,headers:{"content-type":"application/json;charset=UTF-8"}}),a=await fetch(o,{method:"POST",headers:u,body:i,signal:AbortSignal.timeout(30000)}),h=await a.text();let r;try{r=JSON.parse(h)}catch{throw new d(`提交抖音上传失败,非 JSON 响应: HTTP ${a.status} ${h.slice(0,300)}`)}const c=r?.ResponseMetadata?.Error;if(!a.ok||c)throw new d(`提交抖音上传失败: HTTP ${a.status} ${JSON.stringify(c??r)}`);const n=r?.Result?.Results?.[0]??r?.Result??{},p=n.Vid??n.VideoId??n.VideoID??n.vid??s.video_id;if(!p)throw new d(`提交抖音上传响应缺少 video id: ${JSON.stringify(r).slice(0,500)}`);const S=n.Meta??n.VideoMeta??{};return{video_id:p,poster_uri:n.PosterUri??n.PosterURI??n.SnapshotUri??n.SnapshotURI??"",width:Number(S.Width??S.width??720)||720,height:Number(S.Height??S.height??1280)||1280,raw:n}}
3
+ `,S=n.join(";"),N=[a,o.pathname||"/",V(o),p,S,r].join(`
4
+ `),y="vod",f="cn-north-1",w=`${u}/${f}/${y}/aws4_request`,H=["AWS4-HMAC-SHA256",i,w,U(N)].join(`
5
+ `),T=l(`AWS4${e.secret_access_key}`,u),k=l(T,f),I=l(k,y),R=l(I,"aws4_request"),x=l(R,H).toString("hex");return{...c,Authorization:`AWS4-HMAC-SHA256 Credential=${e.access_key_id}/${w}, SignedHeaders=${S}, Signature=${x}`}}function K(s){try{const e=s.startsWith("STS2")?s.slice(4):s,t=JSON.parse(Buffer.from(e,"base64").toString("utf8")),i=JSON.parse(t.PolicyString||"{}")?.Statement?.[0]?.Condition;if(typeof i==="string")return JSON.parse(i).UserId||""}catch{return""}return""}export async function getUploadAuthV5Credentials(s){const e=C(await s.evaluate(`fetch(${JSON.stringify(b)}, { credentials: 'include' }).then(r => r.json())`));if(!e||Array.isArray(e)||typeof e!=="object")throw new d(`获取抖音上传授权失败: ${JSON.stringify(e)}`);if(e.status_code!==0){const o=e.status_msg??e.message??"unknown error";if(e.status_code===401||e.status_code===403||/login|cookie|auth|captcha|verify|forbidden|permission|登录|登陆|权限|验证|验证码/i.test(String(o)))throw new v("creator.douyin.com",`获取抖音上传授权失败: ${o}`);throw new d(`获取抖音上传授权失败: ${JSON.stringify(e)}`)}if(!e.auth)throw new d(`获取抖音上传授权失败: ${JSON.stringify(e)}`);let t;try{t=JSON.parse(e.auth)}catch(o){throw new d(`解析抖音上传授权失败: ${o instanceof Error?o.message:String(o)}`)}if(!t.AccessKeyID||!t.SecretAccessKey||!t.SessionToken)throw new d("抖音上传授权缺少 AccessKeyID/SecretAccessKey/SessionToken");return{access_key_id:t.AccessKeyID,secret_access_key:t.SecretAccessKey,session_token:t.SessionToken,user_id:K(t.SessionToken),expired_time:t.ExpiredTime,current_time:t.CurrentTime}}export async function applyVideoUploadInner(s,e){const t=new URLSearchParams({Action:"ApplyUploadInner",Version:"2020-11-19",SpaceName:A,FileType:"video",IsInner:"1",FileSize:String(s)}),o=`${_}?${t.toString()}`,i=await fetch(o,{headers:O(o,e),signal:AbortSignal.timeout(30000)}),u=await i.text();let a;try{a=JSON.parse(u)}catch{throw new d(`申请抖音上传地址失败,非 JSON 响应: HTTP ${i.status} ${u.slice(0,300)}`)}const h=a?.ResponseMetadata?.Error;if(!i.ok||h)throw new d(`申请抖音上传地址失败: HTTP ${i.status} ${JSON.stringify(h??a)}`);const r=a?.Result?.InnerUploadAddress?.UploadNodes?.[0],c=r?.StoreInfos?.[0],n=a?.Result?.Vid||r?.Vid,p=r?.SessionKey??c?.SessionKey??a?.Result?.SessionKey;if(!r?.UploadHost||!c?.StoreUri||!c?.Auth||!n||!p)throw new d(`申请抖音上传地址响应缺少必要字段: ${JSON.stringify(a).slice(0,500)}`);return{video_id:n,tos_upload_url:`https://${r.UploadHost}/${c.StoreUri}`,auth:c.Auth,session_key:p,upload_header:r.UploadHeader??{},user_id:e.user_id??""}}export async function commitVideoUploadInner(s,e){if(!s?.session_key)throw new d("抖音上传提交缺少 SessionKey");const t=new URLSearchParams({Action:"CommitUploadInner",Version:"2020-11-19",SpaceName:A}),o=`${_}?${t.toString()}`,i=JSON.stringify({SessionKey:s.session_key}),u=O(o,e,{method:"POST",body:i,headers:{"content-type":"application/json;charset=UTF-8"}}),a=await fetch(o,{method:"POST",headers:u,body:i,signal:AbortSignal.timeout(30000)}),h=await a.text();let r;try{r=JSON.parse(h)}catch{throw new d(`提交抖音上传失败,非 JSON 响应: HTTP ${a.status} ${h.slice(0,300)}`)}const c=r?.ResponseMetadata?.Error;if(!a.ok||c)throw new d(`提交抖音上传失败: HTTP ${a.status} ${JSON.stringify(c??r)}`);const n=r?.Result?.Results?.[0]??r?.Result??{},p=n.Vid??n.VideoId??n.VideoID??n.vid??s.video_id;if(!p)throw new d(`提交抖音上传响应缺少 video id: ${JSON.stringify(r).slice(0,500)}`);const S=n.Meta??n.VideoMeta??{};return{video_id:p,poster_uri:n.PosterUri??n.PosterURI??n.SnapshotUri??n.SnapshotURI??"",width:Number(S.Width??S.width??720)||720,height:Number(S.Height??S.height??1280)||1280,raw:n}}