publishport-opencli 1.0.0

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 (1860) hide show
  1. package/LICENSE +214 -0
  2. package/README.md +299 -0
  3. package/README.zh-CN.md +341 -0
  4. package/cli-manifest.json +51513 -0
  5. package/clis/12306/auth.js +25 -0
  6. package/clis/12306/me.js +9 -0
  7. package/clis/12306/orders.js +13 -0
  8. package/clis/12306/passengers.js +14 -0
  9. package/clis/12306/price.js +1 -0
  10. package/clis/12306/stations.js +1 -0
  11. package/clis/12306/train.js +1 -0
  12. package/clis/12306/trains.js +1 -0
  13. package/clis/12306/utils.js +1 -0
  14. package/clis/1688/assets.js +127 -0
  15. package/clis/1688/auth.js +1 -0
  16. package/clis/1688/download.js +1 -0
  17. package/clis/1688/item.js +21 -0
  18. package/clis/1688/search.js +129 -0
  19. package/clis/1688/shared.js +11 -0
  20. package/clis/1688/store.js +26 -0
  21. package/clis/1point3acres/auth.js +18 -0
  22. package/clis/1point3acres/digest.js +1 -0
  23. package/clis/1point3acres/forum.js +1 -0
  24. package/clis/1point3acres/forums.js +1 -0
  25. package/clis/1point3acres/hot.js +1 -0
  26. package/clis/1point3acres/latest.js +1 -0
  27. package/clis/1point3acres/notifications.js +1 -0
  28. package/clis/1point3acres/search.js +1 -0
  29. package/clis/1point3acres/thread.js +2 -0
  30. package/clis/1point3acres/user.js +1 -0
  31. package/clis/1point3acres/utils.js +6 -0
  32. package/clis/36kr/article.js +20 -0
  33. package/clis/36kr/hot.js +16 -0
  34. package/clis/36kr/news.js +1 -0
  35. package/clis/36kr/search.js +36 -0
  36. package/clis/51job/company.js +36 -0
  37. package/clis/51job/detail.js +35 -0
  38. package/clis/51job/hot.js +1 -0
  39. package/clis/51job/search.js +1 -0
  40. package/clis/51job/utils.js +21 -0
  41. package/clis/_atlassian/shared.js +21 -0
  42. package/clis/_shared/article/auth.js +16 -0
  43. package/clis/_shared/article/douban-md2draft.js +4 -0
  44. package/clis/_shared/article/format.js +1 -0
  45. package/clis/_shared/article/images.js +95 -0
  46. package/clis/_shared/article/login.js +1 -0
  47. package/clis/_shared/article/page-runtime.js +745 -0
  48. package/clis/_shared/article/publish.js +34 -0
  49. package/clis/_shared/common.js +1 -0
  50. package/clis/_shared/content-guard.js +1 -0
  51. package/clis/_shared/desktop-commands.js +1 -0
  52. package/clis/_shared/search-adapter.js +1 -0
  53. package/clis/_shared/site-auth.js +1 -0
  54. package/clis/_shared/token-auth.js +2 -0
  55. package/clis/_shared/video-publish.js +62 -0
  56. package/clis/aibase/news.js +31 -0
  57. package/clis/amazon/auth.js +19 -0
  58. package/clis/amazon/bestsellers.js +1 -0
  59. package/clis/amazon/discussion.js +20 -0
  60. package/clis/amazon/movers-shakers.js +1 -0
  61. package/clis/amazon/new-releases.js +1 -0
  62. package/clis/amazon/offer.js +29 -0
  63. package/clis/amazon/product.js +25 -0
  64. package/clis/amazon/rankings.js +68 -0
  65. package/clis/amazon/search.js +16 -0
  66. package/clis/amazon/shared.js +11 -0
  67. package/clis/antigravity/SKILL.md +38 -0
  68. package/clis/antigravity/_actions.js +201 -0
  69. package/clis/antigravity/audit-extras.js +78 -0
  70. package/clis/antigravity/delete.js +1 -0
  71. package/clis/antigravity/dump.js +1 -0
  72. package/clis/antigravity/extract-code.js +18 -0
  73. package/clis/antigravity/history.js +1 -0
  74. package/clis/antigravity/mark-read.js +1 -0
  75. package/clis/antigravity/model.js +90 -0
  76. package/clis/antigravity/new.js +9 -0
  77. package/clis/antigravity/read.js +10 -0
  78. package/clis/antigravity/rename.js +1 -0
  79. package/clis/antigravity/send.js +11 -0
  80. package/clis/antigravity/serve.js +97 -0
  81. package/clis/antigravity/status.js +1 -0
  82. package/clis/antigravity/storage.js +12 -0
  83. package/clis/antigravity/watch.js +6 -0
  84. package/clis/apple-podcasts/episodes.js +1 -0
  85. package/clis/apple-podcasts/search.js +1 -0
  86. package/clis/apple-podcasts/top.js +1 -0
  87. package/clis/apple-podcasts/utils.js +1 -0
  88. package/clis/archive/item.js +1 -0
  89. package/clis/archive/search.js +1 -0
  90. package/clis/archive/snapshots.js +1 -0
  91. package/clis/archive/wayback.js +1 -0
  92. package/clis/arxiv/author.js +1 -0
  93. package/clis/arxiv/paper.js +1 -0
  94. package/clis/arxiv/recent.js +1 -0
  95. package/clis/arxiv/search.js +1 -0
  96. package/clis/arxiv/utils.js +1 -0
  97. package/clis/autohome/__fixtures__/catalog.html +11 -0
  98. package/clis/autohome/__fixtures__/koubei.json +116 -0
  99. package/clis/autohome/brand.js +1 -0
  100. package/clis/autohome/score.js +1 -0
  101. package/clis/autohome/utils.js +1 -0
  102. package/clis/baidu-scholar/search.js +63 -0
  103. package/clis/baijiahao/article.js +1 -0
  104. package/clis/baijiahao/lists.js +1 -0
  105. package/clis/baijiahao/login.js +1 -0
  106. package/clis/baijiahao/publish.js +57 -0
  107. package/clis/baijiahao/stats.js +1 -0
  108. package/clis/baijiahao/whoami.js +1 -0
  109. package/clis/band/auth.js +29 -0
  110. package/clis/band/bands.js +37 -0
  111. package/clis/band/mentions.js +6 -0
  112. package/clis/band/post.js +76 -0
  113. package/clis/band/posts.js +50 -0
  114. package/clis/barchart/flow.js +70 -0
  115. package/clis/barchart/greeks.js +88 -0
  116. package/clis/barchart/options.js +61 -0
  117. package/clis/barchart/quote.js +87 -0
  118. package/clis/bbc/news.js +1 -0
  119. package/clis/bbc/topic.js +1 -0
  120. package/clis/bbc/utils.js +1 -0
  121. package/clis/bilibili/article.js +1 -0
  122. package/clis/bilibili/auth.js +1 -0
  123. package/clis/bilibili/categories.js +1 -0
  124. package/clis/bilibili/coin.js +1 -0
  125. package/clis/bilibili/comment-del.js +1 -0
  126. package/clis/bilibili/comment-like.js +1 -0
  127. package/clis/bilibili/comment.js +1 -0
  128. package/clis/bilibili/comments.js +1 -0
  129. package/clis/bilibili/dm-list.js +1 -0
  130. package/clis/bilibili/dm-read.js +1 -0
  131. package/clis/bilibili/dm-send.js +1 -0
  132. package/clis/bilibili/download.js +7 -0
  133. package/clis/bilibili/drafts.js +1 -0
  134. package/clis/bilibili/dynamic-post.js +24 -0
  135. package/clis/bilibili/dynamic.js +1 -0
  136. package/clis/bilibili/favorite-add.js +1 -0
  137. package/clis/bilibili/favorite.js +1 -0
  138. package/clis/bilibili/feed.js +2 -0
  139. package/clis/bilibili/follow.js +1 -0
  140. package/clis/bilibili/following.js +1 -0
  141. package/clis/bilibili/history.js +1 -0
  142. package/clis/bilibili/hot.js +15 -0
  143. package/clis/bilibili/like.js +1 -0
  144. package/clis/bilibili/me.js +1 -0
  145. package/clis/bilibili/partitions.js +1 -0
  146. package/clis/bilibili/ranking.js +1 -0
  147. package/clis/bilibili/search.js +1 -0
  148. package/clis/bilibili/stats.js +1 -0
  149. package/clis/bilibili/subtitle.js +21 -0
  150. package/clis/bilibili/summary.js +1 -0
  151. package/clis/bilibili/topics.js +1 -0
  152. package/clis/bilibili/unfollow.js +1 -0
  153. package/clis/bilibili/upload.js +1 -0
  154. package/clis/bilibili/user-videos.js +1 -0
  155. package/clis/bilibili/utils.js +50 -0
  156. package/clis/bilibili/video-drafts.js +1 -0
  157. package/clis/bilibili/video.js +1 -0
  158. package/clis/binance/asks.js +1 -0
  159. package/clis/binance/depth.js +1 -0
  160. package/clis/binance/gainers.js +1 -0
  161. package/clis/binance/klines.js +1 -0
  162. package/clis/binance/losers.js +1 -0
  163. package/clis/binance/pairs.js +1 -0
  164. package/clis/binance/price.js +1 -0
  165. package/clis/binance/prices.js +1 -0
  166. package/clis/binance/ticker.js +1 -0
  167. package/clis/binance/top.js +1 -0
  168. package/clis/binance/trades.js +1 -0
  169. package/clis/bloomberg/businessweek.js +12 -0
  170. package/clis/bloomberg/crypto.js +1 -0
  171. package/clis/bloomberg/economics.js +1 -0
  172. package/clis/bloomberg/feeds.js +1 -0
  173. package/clis/bloomberg/green.js +1 -0
  174. package/clis/bloomberg/industries.js +1 -0
  175. package/clis/bloomberg/main.js +1 -0
  176. package/clis/bloomberg/markets.js +1 -0
  177. package/clis/bloomberg/news.js +57 -0
  178. package/clis/bloomberg/opinions.js +1 -0
  179. package/clis/bloomberg/politics.js +1 -0
  180. package/clis/bloomberg/pursuits.js +1 -0
  181. package/clis/bloomberg/tech.js +1 -0
  182. package/clis/bloomberg/utils.js +17 -0
  183. package/clis/bluesky/post.js +1 -0
  184. package/clis/bluesky/shared.js +56 -0
  185. package/clis/bluesky/whoami.js +1 -0
  186. package/clis/booking/search.js +93 -0
  187. package/clis/boss/auth.js +13 -0
  188. package/clis/boss/batchgreet.js +1 -0
  189. package/clis/boss/chatlist.js +1 -0
  190. package/clis/boss/chatmsg.js +1 -0
  191. package/clis/boss/detail.js +1 -0
  192. package/clis/boss/exchange.js +1 -0
  193. package/clis/boss/greet.js +1 -0
  194. package/clis/boss/invite.js +4 -0
  195. package/clis/boss/joblist.js +1 -0
  196. package/clis/boss/mark.js +1 -0
  197. package/clis/boss/recommend.js +1 -0
  198. package/clis/boss/resume.js +90 -0
  199. package/clis/boss/search.js +1 -0
  200. package/clis/boss/send.js +1 -0
  201. package/clis/boss/stats.js +1 -0
  202. package/clis/boss/utils.js +161 -0
  203. package/clis/brave/search.js +23 -0
  204. package/clis/chaoxing/assignments.js +1 -0
  205. package/clis/chaoxing/auth.js +21 -0
  206. package/clis/chaoxing/exams.js +1 -0
  207. package/clis/chaoxing/utils.js +58 -0
  208. package/clis/chatgpt/ask.js +1 -0
  209. package/clis/chatgpt/auth.js +17 -0
  210. package/clis/chatgpt/detail.js +1 -0
  211. package/clis/chatgpt/history.js +1 -0
  212. package/clis/chatgpt/image.js +1 -0
  213. package/clis/chatgpt/model.js +1 -0
  214. package/clis/chatgpt/new.js +1 -0
  215. package/clis/chatgpt/project-file-add.js +1 -0
  216. package/clis/chatgpt/project-list.js +1 -0
  217. package/clis/chatgpt/read.js +1 -0
  218. package/clis/chatgpt/send.js +1 -0
  219. package/clis/chatgpt/status.js +1 -0
  220. package/clis/chatgpt/utils.js +1092 -0
  221. package/clis/chatgpt-app/ask.js +1 -0
  222. package/clis/chatgpt-app/ax.js +512 -0
  223. package/clis/chatgpt-app/model.js +1 -0
  224. package/clis/chatgpt-app/new.js +1 -0
  225. package/clis/chatgpt-app/read.js +1 -0
  226. package/clis/chatgpt-app/send.js +1 -0
  227. package/clis/chatgpt-app/status.js +1 -0
  228. package/clis/chatwise/ask.js +1 -0
  229. package/clis/chatwise/export.js +21 -0
  230. package/clis/chatwise/history.js +26 -0
  231. package/clis/chatwise/model.js +48 -0
  232. package/clis/chatwise/new.js +1 -0
  233. package/clis/chatwise/read.js +25 -0
  234. package/clis/chatwise/screenshot.js +1 -0
  235. package/clis/chatwise/send.js +1 -0
  236. package/clis/chatwise/status.js +1 -0
  237. package/clis/chatwise/utils.js +75 -0
  238. package/clis/chess/analyze.js +1 -0
  239. package/clis/chess/game.js +1 -0
  240. package/clis/chess/games.js +1 -0
  241. package/clis/chess/stats.js +1 -0
  242. package/clis/chess/utils.js +1 -0
  243. package/clis/claude/ask.js +4 -0
  244. package/clis/claude/auth.js +19 -0
  245. package/clis/claude/detail.js +1 -0
  246. package/clis/claude/history.js +1 -0
  247. package/clis/claude/new.js +1 -0
  248. package/clis/claude/read.js +1 -0
  249. package/clis/claude/send.js +1 -0
  250. package/clis/claude/status.js +1 -0
  251. package/clis/claude/utils.js +179 -0
  252. package/clis/cnblogs/article.js +1 -0
  253. package/clis/cnblogs/login.js +1 -0
  254. package/clis/cnblogs/stats.js +37 -0
  255. package/clis/cnblogs/whoami.js +1 -0
  256. package/clis/cnki/search.js +38 -0
  257. package/clis/codex/_actions.js +72 -0
  258. package/clis/codex/archive.js +1 -0
  259. package/clis/codex/ask.js +23 -0
  260. package/clis/codex/dump.js +1 -0
  261. package/clis/codex/export.js +12 -0
  262. package/clis/codex/extract-diff.js +28 -0
  263. package/clis/codex/history.js +1 -0
  264. package/clis/codex/model.js +118 -0
  265. package/clis/codex/new.js +1 -0
  266. package/clis/codex/pin.js +1 -0
  267. package/clis/codex/projects.js +1 -0
  268. package/clis/codex/read.js +16 -0
  269. package/clis/codex/rename.js +34 -0
  270. package/clis/codex/screenshot.js +1 -0
  271. package/clis/codex/send.js +16 -0
  272. package/clis/codex/sidebar.js +1 -0
  273. package/clis/codex/status.js +1 -0
  274. package/clis/coingecko/categories.js +1 -0
  275. package/clis/coingecko/coin.js +1 -0
  276. package/clis/coingecko/derivatives.js +1 -0
  277. package/clis/coingecko/exchanges.js +1 -0
  278. package/clis/coingecko/global.js +1 -0
  279. package/clis/coingecko/top.js +1 -0
  280. package/clis/coingecko/trending.js +1 -0
  281. package/clis/confluence/create.js +1 -0
  282. package/clis/confluence/page.js +1 -0
  283. package/clis/confluence/search.js +1 -0
  284. package/clis/confluence/shared.js +1 -0
  285. package/clis/confluence/update.js +1 -0
  286. package/clis/coupang/add-to-cart.js +86 -0
  287. package/clis/coupang/auth.js +16 -0
  288. package/clis/coupang/product.js +161 -0
  289. package/clis/coupang/search.js +385 -0
  290. package/clis/coupang/utils.js +1 -0
  291. package/clis/crates/crate.js +1 -0
  292. package/clis/crates/search.js +1 -0
  293. package/clis/crates/utils.js +1 -0
  294. package/clis/csdn/article.js +29 -0
  295. package/clis/csdn/columns.js +1 -0
  296. package/clis/csdn/login.js +1 -0
  297. package/clis/csdn/stats.js +71 -0
  298. package/clis/csdn/whoami.js +1 -0
  299. package/clis/cto51/article.js +1 -0
  300. package/clis/cto51/whoami.js +1 -0
  301. package/clis/ctrip/auth.js +1 -0
  302. package/clis/ctrip/flight.js +17 -0
  303. package/clis/ctrip/hotel-search.js +24 -0
  304. package/clis/ctrip/hotel-suggest.js +1 -0
  305. package/clis/ctrip/search.js +1 -0
  306. package/clis/ctrip/utils.js +119 -0
  307. package/clis/cursor/ask.js +22 -0
  308. package/clis/cursor/composer.js +12 -0
  309. package/clis/cursor/dump.js +1 -0
  310. package/clis/cursor/export.js +23 -0
  311. package/clis/cursor/extract-code.js +18 -0
  312. package/clis/cursor/history.js +26 -0
  313. package/clis/cursor/model.js +18 -0
  314. package/clis/cursor/new.js +1 -0
  315. package/clis/cursor/read.js +27 -0
  316. package/clis/cursor/screenshot.js +1 -0
  317. package/clis/cursor/send.js +12 -0
  318. package/clis/cursor/status.js +1 -0
  319. package/clis/dblp/author.js +1 -0
  320. package/clis/dblp/paper.js +1 -0
  321. package/clis/dblp/search.js +1 -0
  322. package/clis/dblp/utils.js +1 -0
  323. package/clis/dblp/venue.js +1 -0
  324. package/clis/deepseek/ask.js +1 -0
  325. package/clis/deepseek/auth.js +22 -0
  326. package/clis/deepseek/detail.js +1 -0
  327. package/clis/deepseek/history.js +1 -0
  328. package/clis/deepseek/new.js +1 -0
  329. package/clis/deepseek/read.js +1 -0
  330. package/clis/deepseek/send.js +50 -0
  331. package/clis/deepseek/status.js +1 -0
  332. package/clis/deepseek/utils.js +202 -0
  333. package/clis/defillama/protocol.js +1 -0
  334. package/clis/defillama/protocols.js +1 -0
  335. package/clis/defillama/utils.js +1 -0
  336. package/clis/devto/auth.js +9 -0
  337. package/clis/devto/latest.js +1 -0
  338. package/clis/devto/publish.js +17 -0
  339. package/clis/devto/read.js +3 -0
  340. package/clis/devto/stats.js +27 -0
  341. package/clis/devto/tag.js +1 -0
  342. package/clis/devto/top.js +1 -0
  343. package/clis/devto/user.js +1 -0
  344. package/clis/dianping/__fixtures__/search.html +168 -0
  345. package/clis/dianping/__fixtures__/shop.html +6 -0
  346. package/clis/dianping/auth.js +10 -0
  347. package/clis/dianping/cityResolver.js +4 -0
  348. package/clis/dianping/search.js +1 -0
  349. package/clis/dianping/shop.js +1 -0
  350. package/clis/dianping/utils.js +1 -0
  351. package/clis/dictionary/examples.js +1 -0
  352. package/clis/dictionary/search.js +1 -0
  353. package/clis/dictionary/synonyms.js +1 -0
  354. package/clis/discord-app/channels.js +1 -0
  355. package/clis/discord-app/delete.js +66 -0
  356. package/clis/discord-app/goto.js +1 -0
  357. package/clis/discord-app/members.js +21 -0
  358. package/clis/discord-app/read.js +1 -0
  359. package/clis/discord-app/search.js +29 -0
  360. package/clis/discord-app/send.js +10 -0
  361. package/clis/discord-app/servers.js +1 -0
  362. package/clis/discord-app/status.js +1 -0
  363. package/clis/discord-app/thread-read.js +1 -0
  364. package/clis/discord-app/threads.js +1 -0
  365. package/clis/discord-app/utils.js +226 -0
  366. package/clis/discord-web/auth.js +10 -0
  367. package/clis/discord-web/send.js +13 -0
  368. package/clis/dockerhub/image.js +1 -0
  369. package/clis/dockerhub/search.js +1 -0
  370. package/clis/dockerhub/utils.js +1 -0
  371. package/clis/dongchedi/__fixtures__/search.json +60 -0
  372. package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
  373. package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
  374. package/clis/dongchedi/koubei.js +1 -0
  375. package/clis/dongchedi/models.js +1 -0
  376. package/clis/dongchedi/score.js +1 -0
  377. package/clis/dongchedi/search.js +1 -0
  378. package/clis/dongchedi/series.js +1 -0
  379. package/clis/dongchedi/specs.js +1 -0
  380. package/clis/dongchedi/utils.js +1 -0
  381. package/clis/douban/article.js +53 -0
  382. package/clis/douban/auth.js +21 -0
  383. package/clis/douban/book-hot.js +1 -0
  384. package/clis/douban/download.js +1 -0
  385. package/clis/douban/marks.js +59 -0
  386. package/clis/douban/movie-hot.js +1 -0
  387. package/clis/douban/photos.js +1 -0
  388. package/clis/douban/reviews.js +53 -0
  389. package/clis/douban/search.js +1 -0
  390. package/clis/douban/subject.js +1 -0
  391. package/clis/douban/top250.js +50 -0
  392. package/clis/douban/utils.js +344 -0
  393. package/clis/doubao/ask.js +1 -0
  394. package/clis/doubao/auth.js +28 -0
  395. package/clis/doubao/detail.js +1 -0
  396. package/clis/doubao/history.js +1 -0
  397. package/clis/doubao/meeting-summary.js +1 -0
  398. package/clis/doubao/meeting-transcript.js +1 -0
  399. package/clis/doubao/new.js +1 -0
  400. package/clis/doubao/read.js +1 -0
  401. package/clis/doubao/send.js +1 -0
  402. package/clis/doubao/status.js +1 -0
  403. package/clis/doubao/utils.js +704 -0
  404. package/clis/doubao-app/ask.js +1 -0
  405. package/clis/doubao-app/dump.js +1 -0
  406. package/clis/doubao-app/new.js +1 -0
  407. package/clis/doubao-app/read.js +1 -0
  408. package/clis/doubao-app/screenshot.js +1 -0
  409. package/clis/doubao-app/send.js +1 -0
  410. package/clis/doubao-app/status.js +1 -0
  411. package/clis/doubao-app/utils.js +64 -0
  412. package/clis/douyin/_shared/browser-fetch.js +28 -0
  413. package/clis/douyin/_shared/creation-id.js +1 -0
  414. package/clis/douyin/_shared/evaluate-result.js +1 -0
  415. package/clis/douyin/_shared/imagex-upload.js +1 -0
  416. package/clis/douyin/_shared/public-api.js +1 -0
  417. package/clis/douyin/_shared/sts2.js +1 -0
  418. package/clis/douyin/_shared/text-extra.js +1 -0
  419. package/clis/douyin/_shared/timing.js +1 -0
  420. package/clis/douyin/_shared/tos-upload.js +5 -0
  421. package/clis/douyin/_shared/transcode.js +1 -0
  422. package/clis/douyin/_shared/types.js +1 -0
  423. package/clis/douyin/_shared/vod-upload.js +5 -0
  424. package/clis/douyin/activities.js +1 -0
  425. package/clis/douyin/auth.js +1 -0
  426. package/clis/douyin/collections.js +1 -0
  427. package/clis/douyin/delete.js +76 -0
  428. package/clis/douyin/draft.js +166 -0
  429. package/clis/douyin/drafts.js +1 -0
  430. package/clis/douyin/hashtag.js +1 -0
  431. package/clis/douyin/location.js +1 -0
  432. package/clis/douyin/profile.js +1 -0
  433. package/clis/douyin/publish-image.js +64 -0
  434. package/clis/douyin/publish.js +14 -0
  435. package/clis/douyin/search.js +51 -0
  436. package/clis/douyin/stats.js +1 -0
  437. package/clis/douyin/update.js +1 -0
  438. package/clis/douyin/user-videos.js +1 -0
  439. package/clis/douyin/videos.js +1 -0
  440. package/clis/duckduckgo/search.js +1 -0
  441. package/clis/duckduckgo/suggest.js +1 -0
  442. package/clis/eastmoney/_secid.js +1 -0
  443. package/clis/eastmoney/announcement.js +1 -0
  444. package/clis/eastmoney/article.js +1 -0
  445. package/clis/eastmoney/convertible.js +1 -0
  446. package/clis/eastmoney/etf.js +1 -0
  447. package/clis/eastmoney/holders.js +1 -0
  448. package/clis/eastmoney/hot-rank.js +30 -0
  449. package/clis/eastmoney/index-board.js +1 -0
  450. package/clis/eastmoney/kline.js +1 -0
  451. package/clis/eastmoney/kuaixun.js +1 -0
  452. package/clis/eastmoney/longhu.js +1 -0
  453. package/clis/eastmoney/money-flow.js +1 -0
  454. package/clis/eastmoney/northbound.js +1 -0
  455. package/clis/eastmoney/quote.js +1 -0
  456. package/clis/eastmoney/rank.js +1 -0
  457. package/clis/eastmoney/sectors.js +1 -0
  458. package/clis/eastmoney/whoami.js +1 -0
  459. package/clis/endoflife/product.js +1 -0
  460. package/clis/endoflife/utils.js +1 -0
  461. package/clis/facebook/__fixtures__/notifications-page.html +13 -0
  462. package/clis/facebook/add-friend.js +24 -0
  463. package/clis/facebook/auth.js +1 -0
  464. package/clis/facebook/comment.js +18 -0
  465. package/clis/facebook/events.js +26 -0
  466. package/clis/facebook/feed.js +209 -0
  467. package/clis/facebook/friends.js +24 -0
  468. package/clis/facebook/groups.js +32 -0
  469. package/clis/facebook/join-group.js +25 -0
  470. package/clis/facebook/like.js +29 -0
  471. package/clis/facebook/marketplace-inbox.js +34 -0
  472. package/clis/facebook/marketplace-listings.js +33 -0
  473. package/clis/facebook/memories.js +21 -0
  474. package/clis/facebook/notifications.js +31 -0
  475. package/clis/facebook/post.js +88 -0
  476. package/clis/facebook/profile.js +18 -0
  477. package/clis/facebook/search.js +22 -0
  478. package/clis/flathub/app.js +1 -0
  479. package/clis/flathub/search.js +1 -0
  480. package/clis/flathub/utils.js +1 -0
  481. package/clis/flomo/auth.js +22 -0
  482. package/clis/flomo/memos.js +13 -0
  483. package/clis/gemini/ask.js +1 -0
  484. package/clis/gemini/auth.js +14 -0
  485. package/clis/gemini/deep-research-result.js +4 -0
  486. package/clis/gemini/deep-research.js +1 -0
  487. package/clis/gemini/detail.js +1 -0
  488. package/clis/gemini/history.js +1 -0
  489. package/clis/gemini/image.js +3 -0
  490. package/clis/gemini/new.js +1 -0
  491. package/clis/gemini/read.js +1 -0
  492. package/clis/gemini/status.js +1 -0
  493. package/clis/gemini/utils.js +1234 -0
  494. package/clis/geogebra/add-circle.js +1 -0
  495. package/clis/geogebra/add-line.js +1 -0
  496. package/clis/geogebra/add-point.js +1 -0
  497. package/clis/geogebra/add-polygon.js +1 -0
  498. package/clis/geogebra/eval.js +1 -0
  499. package/clis/geogebra/hexagon.js +1 -0
  500. package/clis/geogebra/info.js +13 -0
  501. package/clis/geogebra/list.js +1 -0
  502. package/clis/geogebra/triangle.js +1 -0
  503. package/clis/geogebra/utils.js +99 -0
  504. package/clis/ghost/publish.js +1 -0
  505. package/clis/ghost/shared.js +1 -0
  506. package/clis/ghost/whoami.js +1 -0
  507. package/clis/gitee/auth.js +12 -0
  508. package/clis/gitee/index.js +1 -0
  509. package/clis/gitee/search.js +1 -0
  510. package/clis/gitee/trending.js +240 -0
  511. package/clis/gitee/user.js +71 -0
  512. package/clis/github/auth.js +7 -0
  513. package/clis/github-trending/repos.js +1 -0
  514. package/clis/google/news.js +1 -0
  515. package/clis/google/search.js +90 -0
  516. package/clis/google/suggest.js +1 -0
  517. package/clis/google/trends.js +1 -0
  518. package/clis/google/utils.js +1 -0
  519. package/clis/google-scholar/cite.js +20 -0
  520. package/clis/google-scholar/profile.js +36 -0
  521. package/clis/google-scholar/search.js +35 -0
  522. package/clis/goproxy/module.js +1 -0
  523. package/clis/goproxy/utils.js +1 -0
  524. package/clis/goproxy/versions.js +1 -0
  525. package/clis/gov-law/recent.js +1 -0
  526. package/clis/gov-law/search.js +14 -0
  527. package/clis/gov-law/shared.js +29 -0
  528. package/clis/gov-policy/__fixtures__/recent.html +16 -0
  529. package/clis/gov-policy/__fixtures__/search.html +41 -0
  530. package/clis/gov-policy/recent.js +8 -0
  531. package/clis/gov-policy/search.js +8 -0
  532. package/clis/gov-policy/utils.js +1 -0
  533. package/clis/grok/ask.js +1 -0
  534. package/clis/grok/auth.js +17 -0
  535. package/clis/grok/delete.js +1 -0
  536. package/clis/grok/detail.js +1 -0
  537. package/clis/grok/export-all.js +170 -0
  538. package/clis/grok/export-utils.js +1 -0
  539. package/clis/grok/export.js +106 -0
  540. package/clis/grok/history.js +1 -0
  541. package/clis/grok/image.js +119 -0
  542. package/clis/grok/image.test.ts +127 -0
  543. package/clis/grok/new.js +1 -0
  544. package/clis/grok/pin.js +1 -0
  545. package/clis/grok/read.js +1 -0
  546. package/clis/grok/send.js +1 -0
  547. package/clis/grok/status.js +1 -0
  548. package/clis/grok/utils.js +337 -0
  549. package/clis/guazi/__fixtures__/detail.html +7 -0
  550. package/clis/guazi/__fixtures__/list.html +5 -0
  551. package/clis/guazi/browse.js +1 -0
  552. package/clis/guazi/car.js +1 -0
  553. package/clis/guazi/utils.js +1 -0
  554. package/clis/hackernews/ask.js +1 -0
  555. package/clis/hackernews/auth.js +9 -0
  556. package/clis/hackernews/best.js +1 -0
  557. package/clis/hackernews/comment.js +61 -0
  558. package/clis/hackernews/jobs.js +1 -0
  559. package/clis/hackernews/new.js +1 -0
  560. package/clis/hackernews/read.js +11 -0
  561. package/clis/hackernews/search.js +1 -0
  562. package/clis/hackernews/show.js +1 -0
  563. package/clis/hackernews/submit.js +65 -0
  564. package/clis/hackernews/top.js +1 -0
  565. package/clis/hackernews/user.js +1 -0
  566. package/clis/hashnode/auth.js +11 -0
  567. package/clis/hashnode/publish.js +92 -0
  568. package/clis/hf/auth.js +12 -0
  569. package/clis/hf/datasets.js +1 -0
  570. package/clis/hf/models.js +1 -0
  571. package/clis/hf/paper.js +1 -0
  572. package/clis/hf/spaces.js +1 -0
  573. package/clis/hf/top.js +1 -0
  574. package/clis/homebrew/cask.js +1 -0
  575. package/clis/homebrew/formula.js +1 -0
  576. package/clis/homebrew/popular.js +1 -0
  577. package/clis/homebrew/utils.js +1 -0
  578. package/clis/huodongxing/events.js +1 -0
  579. package/clis/hupu/__fixtures__/hot-home.html +64 -0
  580. package/clis/hupu/auth.js +14 -0
  581. package/clis/hupu/detail.js +7 -0
  582. package/clis/hupu/hot.js +14 -0
  583. package/clis/hupu/like.js +1 -0
  584. package/clis/hupu/mentions.js +91 -0
  585. package/clis/hupu/reply.js +1 -0
  586. package/clis/hupu/search.js +1 -0
  587. package/clis/hupu/unlike.js +1 -0
  588. package/clis/hupu/utils.js +243 -0
  589. package/clis/imdb/person.js +140 -0
  590. package/clis/imdb/reviews.js +40 -0
  591. package/clis/imdb/search.js +113 -0
  592. package/clis/imdb/title.js +1 -0
  593. package/clis/imdb/top.js +1 -0
  594. package/clis/imdb/trending.js +1 -0
  595. package/clis/imdb/utils.js +162 -0
  596. package/clis/imooc/article.js +59 -0
  597. package/clis/imooc/login.js +1 -0
  598. package/clis/imooc/whoami.js +1 -0
  599. package/clis/indeed/job.js +20 -0
  600. package/clis/indeed/search.js +37 -0
  601. package/clis/indeed/utils.js +1 -0
  602. package/clis/infoq/article.js +19 -0
  603. package/clis/infoq/login.js +1 -0
  604. package/clis/infoq/whoami.js +1 -0
  605. package/clis/instagram/_shared/private-publish.js +75 -0
  606. package/clis/instagram/_shared/protocol-capture.js +180 -0
  607. package/clis/instagram/_shared/runtime-info.js +33 -0
  608. package/clis/instagram/auth.js +22 -0
  609. package/clis/instagram/collection-create.js +38 -0
  610. package/clis/instagram/collection-delete.js +72 -0
  611. package/clis/instagram/comment.js +26 -0
  612. package/clis/instagram/detail.js +2 -0
  613. package/clis/instagram/download.js +83 -0
  614. package/clis/instagram/explore.js +27 -0
  615. package/clis/instagram/follow.js +24 -0
  616. package/clis/instagram/followers.js +30 -0
  617. package/clis/instagram/following.js +74 -0
  618. package/clis/instagram/like.js +25 -0
  619. package/clis/instagram/note.js +162 -0
  620. package/clis/instagram/post.js +718 -0
  621. package/clis/instagram/profile.js +25 -0
  622. package/clis/instagram/reel.js +452 -0
  623. package/clis/instagram/save.js +25 -0
  624. package/clis/instagram/saved.js +37 -0
  625. package/clis/instagram/search.js +23 -0
  626. package/clis/instagram/story.js +21 -0
  627. package/clis/instagram/unfollow.js +21 -0
  628. package/clis/instagram/unlike.js +25 -0
  629. package/clis/instagram/unsave.js +25 -0
  630. package/clis/instagram/user.js +1 -0
  631. package/clis/jd/add-cart.js +22 -0
  632. package/clis/jd/auth.js +12 -0
  633. package/clis/jd/cart.js +59 -0
  634. package/clis/jd/detail.js +42 -0
  635. package/clis/jd/item.js +98 -0
  636. package/clis/jd/item.test.ts +517 -0
  637. package/clis/jd/reviews.js +31 -0
  638. package/clis/jd/search.js +42 -0
  639. package/clis/jianshu/article.js +1 -0
  640. package/clis/jianshu/login.js +1 -0
  641. package/clis/jianshu/notebooks.js +1 -0
  642. package/clis/jianshu/whoami.js +1 -0
  643. package/clis/jianyu/auth.js +28 -0
  644. package/clis/jianyu/detail.js +1 -0
  645. package/clis/jianyu/search.js +73 -0
  646. package/clis/jianyu/shared/china-bid-search.js +86 -0
  647. package/clis/jianyu/shared/procurement-contract.js +1 -0
  648. package/clis/jianyu/shared/procurement-detail.js +18 -0
  649. package/clis/jike/auth.js +19 -0
  650. package/clis/jike/comment.js +82 -0
  651. package/clis/jike/create.js +83 -0
  652. package/clis/jike/feed.js +32 -0
  653. package/clis/jike/like.js +38 -0
  654. package/clis/jike/notifications.js +115 -0
  655. package/clis/jike/post.js +33 -0
  656. package/clis/jike/repost.js +67 -0
  657. package/clis/jike/search.js +29 -0
  658. package/clis/jike/topic.js +20 -0
  659. package/clis/jike/user.js +19 -0
  660. package/clis/jike/utils.js +15 -0
  661. package/clis/jimeng/auth.js +13 -0
  662. package/clis/jimeng/generate.js +60 -0
  663. package/clis/jimeng/history.js +32 -0
  664. package/clis/jimeng/new.js +26 -0
  665. package/clis/jimeng/workspaces.js +22 -0
  666. package/clis/jira/attachments.js +1 -0
  667. package/clis/jira/comments.js +1 -0
  668. package/clis/jira/issue.js +1 -0
  669. package/clis/jira/links.js +1 -0
  670. package/clis/jira/search.js +1 -0
  671. package/clis/jira/shared.js +1 -0
  672. package/clis/juejin/article.js +5 -0
  673. package/clis/juejin/categories.js +1 -0
  674. package/clis/juejin/hot.js +1 -0
  675. package/clis/juejin/login.js +1 -0
  676. package/clis/juejin/recommend.js +1 -0
  677. package/clis/juejin/stats.js +53 -0
  678. package/clis/juejin/tags.js +1 -0
  679. package/clis/juejin/utils.js +1 -0
  680. package/clis/juejin/whoami.js +1 -0
  681. package/clis/ke/auth.js +14 -0
  682. package/clis/ke/chengjiao.js +45 -0
  683. package/clis/ke/ershoufang.js +50 -0
  684. package/clis/ke/utils.js +21 -0
  685. package/clis/ke/xiaoqu.js +45 -0
  686. package/clis/ke/zufang.js +50 -0
  687. package/clis/kimi/_utils.js +38 -0
  688. package/clis/kimi/audit-extras.js +64 -0
  689. package/clis/kimi/auth.js +17 -0
  690. package/clis/kimi/chat.js +77 -0
  691. package/clis/kimi/storage.js +14 -0
  692. package/clis/kimi/ui.js +89 -0
  693. package/clis/kimi/usage.js +51 -0
  694. package/clis/kuaishou/auth.js +1 -0
  695. package/clis/kuaishou/publish.js +53 -0
  696. package/clis/lesswrong/_helpers.js +9 -0
  697. package/clis/lesswrong/comments.js +9 -0
  698. package/clis/lesswrong/curated.js +5 -0
  699. package/clis/lesswrong/frontpage.js +5 -0
  700. package/clis/lesswrong/new.js +5 -0
  701. package/clis/lesswrong/read.js +5 -0
  702. package/clis/lesswrong/sequences.js +5 -0
  703. package/clis/lesswrong/shortform.js +5 -0
  704. package/clis/lesswrong/tag.js +5 -0
  705. package/clis/lesswrong/tags.js +5 -0
  706. package/clis/lesswrong/top-month.js +5 -0
  707. package/clis/lesswrong/top-week.js +5 -0
  708. package/clis/lesswrong/top-year.js +5 -0
  709. package/clis/lesswrong/top.js +5 -0
  710. package/clis/lesswrong/user-posts.js +5 -0
  711. package/clis/lesswrong/user.js +5 -0
  712. package/clis/lichess/top.js +1 -0
  713. package/clis/lichess/user.js +1 -0
  714. package/clis/lichess/utils.js +1 -0
  715. package/clis/linkedin/auth.js +27 -0
  716. package/clis/linkedin/comment.js +1 -0
  717. package/clis/linkedin/connect.js +244 -0
  718. package/clis/linkedin/create.js +113 -0
  719. package/clis/linkedin/follow.js +1 -0
  720. package/clis/linkedin/inbox.js +1 -0
  721. package/clis/linkedin/job-detail.js +40 -0
  722. package/clis/linkedin/jobs-preferences.js +34 -0
  723. package/clis/linkedin/like.js +1 -0
  724. package/clis/linkedin/notifications.js +1 -0
  725. package/clis/linkedin/people-search.js +1 -0
  726. package/clis/linkedin/post-analytics.js +1 -0
  727. package/clis/linkedin/post-comments.js +1 -0
  728. package/clis/linkedin/post-detail.js +1 -0
  729. package/clis/linkedin/posts-core.js +138 -0
  730. package/clis/linkedin/posts.js +1 -0
  731. package/clis/linkedin/profile-analytics.js +1 -0
  732. package/clis/linkedin/profile-api.js +218 -0
  733. package/clis/linkedin/profile-experience.js +1 -0
  734. package/clis/linkedin/profile-projects.js +1 -0
  735. package/clis/linkedin/profile-read.js +3 -0
  736. package/clis/linkedin/reply.js +1 -0
  737. package/clis/linkedin/repost.js +1 -0
  738. package/clis/linkedin/safe-send.js +155 -0
  739. package/clis/linkedin/salesnav-inbox.js +21 -0
  740. package/clis/linkedin/salesnav-message.js +33 -0
  741. package/clis/linkedin/salesnav-search.js +15 -0
  742. package/clis/linkedin/salesnav-thread.js +1 -0
  743. package/clis/linkedin/search-api.js +42 -0
  744. package/clis/linkedin/search.js +50 -0
  745. package/clis/linkedin/sent-invitations.js +46 -0
  746. package/clis/linkedin/services-read.js +57 -0
  747. package/clis/linkedin/shared.js +10 -0
  748. package/clis/linkedin/social-api.js +260 -0
  749. package/clis/linkedin/thread-snapshot.js +81 -0
  750. package/clis/linkedin/timeline.js +37 -0
  751. package/clis/linkedin-learning/auth.js +27 -0
  752. package/clis/linkedin-learning/course.js +17 -0
  753. package/clis/linkedin-learning/search.js +17 -0
  754. package/clis/linkedin-learning/trending.js +17 -0
  755. package/clis/linux-do/auth.js +20 -0
  756. package/clis/linux-do/categories.js +1 -0
  757. package/clis/linux-do/feed.js +19 -0
  758. package/clis/linux-do/search.js +1 -0
  759. package/clis/linux-do/tags.js +1 -0
  760. package/clis/linux-do/topic-content.js +28 -0
  761. package/clis/linux-do/topic.js +1 -0
  762. package/clis/linux-do/user-posts.js +1 -0
  763. package/clis/linux-do/user-topics.js +1 -0
  764. package/clis/lobsters/active.js +1 -0
  765. package/clis/lobsters/domain.js +1 -0
  766. package/clis/lobsters/hot.js +1 -0
  767. package/clis/lobsters/newest.js +1 -0
  768. package/clis/lobsters/read.js +11 -0
  769. package/clis/lobsters/tag.js +1 -0
  770. package/clis/maimai/auth.js +19 -0
  771. package/clis/maimai/search-talents.js +37 -0
  772. package/clis/manus/_utils.js +28 -0
  773. package/clis/manus/auth.js +20 -0
  774. package/clis/manus/connectors.js +4 -0
  775. package/clis/manus/credits.js +4 -0
  776. package/clis/manus/list.js +7 -0
  777. package/clis/manus/read.js +7 -0
  778. package/clis/manus/skills.js +4 -0
  779. package/clis/manus/status.js +8 -0
  780. package/clis/mastodon/post.js +1 -0
  781. package/clis/mastodon/shared.js +48 -0
  782. package/clis/mastodon/whoami.js +1 -0
  783. package/clis/maven/artifact.js +1 -0
  784. package/clis/maven/search.js +1 -0
  785. package/clis/maven/utils.js +1 -0
  786. package/clis/mdn/search.js +1 -0
  787. package/clis/medium/article.js +12 -0
  788. package/clis/medium/feed.js +1 -0
  789. package/clis/medium/login.js +1 -0
  790. package/clis/medium/search.js +1 -0
  791. package/clis/medium/stats.js +56 -0
  792. package/clis/medium/tag.js +1 -0
  793. package/clis/medium/user.js +1 -0
  794. package/clis/medium/utils.js +62 -0
  795. package/clis/medium/whoami.js +1 -0
  796. package/clis/mubu/doc.js +1 -0
  797. package/clis/mubu/docs.js +1 -0
  798. package/clis/mubu/notes.js +1 -0
  799. package/clis/mubu/recent.js +1 -0
  800. package/clis/mubu/search.js +1 -0
  801. package/clis/mubu/utils.js +31 -0
  802. package/clis/note/auth.js +12 -0
  803. package/clis/note/note-utils.js +2 -0
  804. package/clis/note/publish.js +17 -0
  805. package/clis/notebooklm/add-source.js +46 -0
  806. package/clis/notebooklm/auth.js +21 -0
  807. package/clis/notebooklm/create.js +1 -0
  808. package/clis/notebooklm/current.js +1 -0
  809. package/clis/notebooklm/generate-audio.js +1 -0
  810. package/clis/notebooklm/generate-slides.js +1 -0
  811. package/clis/notebooklm/get.js +1 -0
  812. package/clis/notebooklm/history.js +1 -0
  813. package/clis/notebooklm/list.js +1 -0
  814. package/clis/notebooklm/note-list.js +1 -0
  815. package/clis/notebooklm/notes-get.js +1 -0
  816. package/clis/notebooklm/open.js +1 -0
  817. package/clis/notebooklm/rpc.js +36 -0
  818. package/clis/notebooklm/shared.js +1 -0
  819. package/clis/notebooklm/source-fulltext.js +1 -0
  820. package/clis/notebooklm/source-get.js +1 -0
  821. package/clis/notebooklm/source-guide.js +1 -0
  822. package/clis/notebooklm/source-list.js +1 -0
  823. package/clis/notebooklm/status.js +1 -0
  824. package/clis/notebooklm/summary.js +1 -0
  825. package/clis/notebooklm/utils.js +172 -0
  826. package/clis/notebooklm/write-note.js +1 -0
  827. package/clis/nowcoder/auth.js +24 -0
  828. package/clis/nowcoder/comment.js +1 -0
  829. package/clis/nowcoder/comments.js +1 -0
  830. package/clis/nowcoder/companies.js +1 -0
  831. package/clis/nowcoder/creators.js +1 -0
  832. package/clis/nowcoder/delete.js +1 -0
  833. package/clis/nowcoder/detail.js +46 -0
  834. package/clis/nowcoder/dm-list.js +1 -0
  835. package/clis/nowcoder/dm-read.js +1 -0
  836. package/clis/nowcoder/dm-send.js +1 -0
  837. package/clis/nowcoder/drafts.js +1 -0
  838. package/clis/nowcoder/experience.js +20 -0
  839. package/clis/nowcoder/hot.js +1 -0
  840. package/clis/nowcoder/inbox.js +1 -0
  841. package/clis/nowcoder/jobs.js +1 -0
  842. package/clis/nowcoder/like.js +1 -0
  843. package/clis/nowcoder/my.js +1 -0
  844. package/clis/nowcoder/notifications.js +16 -0
  845. package/clis/nowcoder/papers.js +22 -0
  846. package/clis/nowcoder/post.js +1 -0
  847. package/clis/nowcoder/practice.js +21 -0
  848. package/clis/nowcoder/recommend.js +1 -0
  849. package/clis/nowcoder/referral.js +21 -0
  850. package/clis/nowcoder/salary.js +22 -0
  851. package/clis/nowcoder/search.js +31 -0
  852. package/clis/nowcoder/suggest.js +17 -0
  853. package/clis/nowcoder/topics.js +1 -0
  854. package/clis/nowcoder/trending.js +1 -0
  855. package/clis/nowcoder/utils.js +68 -0
  856. package/clis/npm/downloads.js +1 -0
  857. package/clis/npm/package.js +1 -0
  858. package/clis/npm/search.js +1 -0
  859. package/clis/npm/utils.js +1 -0
  860. package/clis/nuget/package.js +1 -0
  861. package/clis/nuget/search.js +1 -0
  862. package/clis/nuget/utils.js +1 -0
  863. package/clis/nvd/cve.js +1 -0
  864. package/clis/oeis/search.js +1 -0
  865. package/clis/oeis/sequence.js +1 -0
  866. package/clis/oeis/utils.js +1 -0
  867. package/clis/ones/common.js +23 -0
  868. package/clis/ones/enrich-tasks.js +1 -0
  869. package/clis/ones/login.js +2 -0
  870. package/clis/ones/logout.js +1 -0
  871. package/clis/ones/me.js +1 -0
  872. package/clis/ones/my-tasks.js +1 -0
  873. package/clis/ones/resolve-labels.js +1 -0
  874. package/clis/ones/task-helpers.js +1 -0
  875. package/clis/ones/task.js +1 -0
  876. package/clis/ones/tasks.js +1 -0
  877. package/clis/ones/token-info.js +1 -0
  878. package/clis/ones/worklog.js +14 -0
  879. package/clis/openalex/search.js +1 -0
  880. package/clis/openalex/utils.js +1 -0
  881. package/clis/openalex/work.js +1 -0
  882. package/clis/openfda/drug-label.js +1 -0
  883. package/clis/openfda/food-recall.js +1 -0
  884. package/clis/openfda/utils.js +1 -0
  885. package/clis/openreview/author.js +1 -0
  886. package/clis/openreview/paper.js +1 -0
  887. package/clis/openreview/reviews.js +4 -0
  888. package/clis/openreview/search.js +1 -0
  889. package/clis/openreview/utils.js +1 -0
  890. package/clis/openreview/venue.js +1 -0
  891. package/clis/oschina/article.js +1 -0
  892. package/clis/oschina/catalogs.js +1 -0
  893. package/clis/oschina/login.js +1 -0
  894. package/clis/oschina/stats.js +54 -0
  895. package/clis/oschina/whoami.js +1 -0
  896. package/clis/osv/query.js +1 -0
  897. package/clis/osv/utils.js +1 -0
  898. package/clis/osv/vulnerability.js +1 -0
  899. package/clis/packagist/package.js +1 -0
  900. package/clis/packagist/search.js +1 -0
  901. package/clis/packagist/utils.js +1 -0
  902. package/clis/paperreview/feedback.js +1 -0
  903. package/clis/paperreview/review.js +1 -0
  904. package/clis/paperreview/submit.js +1 -0
  905. package/clis/paperreview/utils.js +1 -0
  906. package/clis/pinterest/api.js +1 -0
  907. package/clis/pinterest/auth.js +1 -0
  908. package/clis/pinterest/boards.js +1 -0
  909. package/clis/pinterest/client.js +20 -0
  910. package/clis/pinterest/publish.js +13 -0
  911. package/clis/pixiv/auth.js +17 -0
  912. package/clis/pixiv/detail.js +1 -0
  913. package/clis/pixiv/download.js +1 -0
  914. package/clis/pixiv/illusts.js +1 -0
  915. package/clis/pixiv/ranking.js +26 -0
  916. package/clis/pixiv/search.js +1 -0
  917. package/clis/pixiv/user.js +1 -0
  918. package/clis/pixiv/utils.js +18 -0
  919. package/clis/powerchina/auth.js +17 -0
  920. package/clis/powerchina/search.js +1 -0
  921. package/clis/producthunt/browse.js +54 -0
  922. package/clis/producthunt/hot.js +64 -0
  923. package/clis/producthunt/posts.js +1 -0
  924. package/clis/producthunt/today.js +1 -0
  925. package/clis/producthunt/utils.js +1 -0
  926. package/clis/pubmed/article.js +1 -0
  927. package/clis/pubmed/author.js +1 -0
  928. package/clis/pubmed/citations.js +1 -0
  929. package/clis/pubmed/clinical-trial.js +1 -0
  930. package/clis/pubmed/journal.js +1 -0
  931. package/clis/pubmed/mesh.js +1 -0
  932. package/clis/pubmed/related.js +1 -0
  933. package/clis/pubmed/review.js +1 -0
  934. package/clis/pubmed/search.js +1 -0
  935. package/clis/pubmed/utils.js +1 -0
  936. package/clis/pypi/downloads.js +1 -0
  937. package/clis/pypi/package.js +1 -0
  938. package/clis/pypi/utils.js +1 -0
  939. package/clis/qiita/auth.js +1 -0
  940. package/clis/qiita/gql.js +32 -0
  941. package/clis/qiita/publish.js +7 -0
  942. package/clis/qiita/stats.js +37 -0
  943. package/clis/qoder/_utils.js +113 -0
  944. package/clis/qoder/composer.js +1 -0
  945. package/clis/qoder/history.js +25 -0
  946. package/clis/qoder/quest.js +1 -0
  947. package/clis/qoder/read.js +1 -0
  948. package/clis/qoder/status.js +1 -0
  949. package/clis/qoder/ui.js +59 -0
  950. package/clis/quark/auth.js +16 -0
  951. package/clis/quark/ls.js +1 -0
  952. package/clis/quark/mkdir.js +1 -0
  953. package/clis/quark/mv.js +1 -0
  954. package/clis/quark/rename.js +1 -0
  955. package/clis/quark/rm.js +1 -0
  956. package/clis/quark/save.js +1 -0
  957. package/clis/quark/share-tree.js +1 -0
  958. package/clis/quark/utils.js +13 -0
  959. package/clis/quora/create-answer.js +22 -0
  960. package/clis/quora/create-question.js +24 -0
  961. package/clis/quora/shared.js +43 -0
  962. package/clis/quora/whoami.js +1 -0
  963. package/clis/qwen/ask.js +1 -0
  964. package/clis/qwen/auth.js +17 -0
  965. package/clis/qwen/detail.js +1 -0
  966. package/clis/qwen/history.js +1 -0
  967. package/clis/qwen/image.js +31 -0
  968. package/clis/qwen/new.js +1 -0
  969. package/clis/qwen/read.js +1 -0
  970. package/clis/qwen/send.js +1 -0
  971. package/clis/qwen/status.js +1 -0
  972. package/clis/qwen/utils.js +185 -0
  973. package/clis/reddit/auth.js +17 -0
  974. package/clis/reddit/comment.js +36 -0
  975. package/clis/reddit/frontpage.js +40 -0
  976. package/clis/reddit/home.js +32 -0
  977. package/clis/reddit/hot.js +46 -0
  978. package/clis/reddit/popular.js +46 -0
  979. package/clis/reddit/read.js +398 -0
  980. package/clis/reddit/reply.js +56 -0
  981. package/clis/reddit/save.js +30 -0
  982. package/clis/reddit/saved.js +24 -0
  983. package/clis/reddit/search.js +51 -0
  984. package/clis/reddit/submit.js +42 -0
  985. package/clis/reddit/subreddit-info.js +29 -0
  986. package/clis/reddit/subreddit.js +52 -0
  987. package/clis/reddit/subscribe.js +29 -0
  988. package/clis/reddit/subscribed.js +68 -0
  989. package/clis/reddit/upvote.js +43 -0
  990. package/clis/reddit/upvoted.js +24 -0
  991. package/clis/reddit/user-comments.js +20 -0
  992. package/clis/reddit/user-posts.js +17 -0
  993. package/clis/reddit/user.js +20 -0
  994. package/clis/reddit/whoami.js +19 -0
  995. package/clis/rednote/auth.js +19 -0
  996. package/clis/rednote/comments.js +1 -0
  997. package/clis/rednote/download.js +1 -0
  998. package/clis/rednote/feed.js +1 -0
  999. package/clis/rednote/note.js +1 -0
  1000. package/clis/rednote/notifications.js +67 -0
  1001. package/clis/rednote/search.js +32 -0
  1002. package/clis/rednote/user.js +1 -0
  1003. package/clis/rest-countries/country.js +1 -0
  1004. package/clis/rest-countries/region.js +1 -0
  1005. package/clis/rest-countries/utils.js +1 -0
  1006. package/clis/reuters/article-detail.js +1 -0
  1007. package/clis/reuters/auth.js +39 -0
  1008. package/clis/reuters/search.js +1 -0
  1009. package/clis/reuters/utils.js +50 -0
  1010. package/clis/rfc/rfc.js +1 -0
  1011. package/clis/rfc/utils.js +1 -0
  1012. package/clis/rubygems/gem.js +1 -0
  1013. package/clis/rubygems/search.js +1 -0
  1014. package/clis/rubygems/utils.js +1 -0
  1015. package/clis/segmentfault/_signed-request.js +43 -0
  1016. package/clis/segmentfault/article.js +3 -0
  1017. package/clis/segmentfault/channels.js +1 -0
  1018. package/clis/segmentfault/login.js +1 -0
  1019. package/clis/segmentfault/stats.js +82 -0
  1020. package/clis/segmentfault/tags.js +1 -0
  1021. package/clis/segmentfault/whoami.js +1 -0
  1022. package/clis/semanticscholar/citations.js +1 -0
  1023. package/clis/semanticscholar/paper.js +1 -0
  1024. package/clis/semanticscholar/recommendations.js +1 -0
  1025. package/clis/semanticscholar/search.js +1 -0
  1026. package/clis/semanticscholar/utils.js +1 -0
  1027. package/clis/sinablog/article.js +1 -0
  1028. package/clis/sinablog/hot.js +1 -0
  1029. package/clis/sinablog/search.js +1 -0
  1030. package/clis/sinablog/user.js +1 -0
  1031. package/clis/sinablog/utils.js +153 -0
  1032. package/clis/sinafinance/news.js +1 -0
  1033. package/clis/sinafinance/rolling-news.js +20 -0
  1034. package/clis/sinafinance/stock-rank.js +41 -0
  1035. package/clis/sinafinance/stock.js +1 -0
  1036. package/clis/slock/attachment-download.js +1 -0
  1037. package/clis/slock/attachment-upload.js +34 -0
  1038. package/clis/slock/attachment-url.js +1 -0
  1039. package/clis/slock/auth-verify.js +1 -0
  1040. package/clis/slock/bookmark-add.js +11 -0
  1041. package/clis/slock/bookmark-list.js +10 -0
  1042. package/clis/slock/bookmark-remove.js +7 -0
  1043. package/clis/slock/channel-action.js +1 -0
  1044. package/clis/slock/channel-archive.js +1 -0
  1045. package/clis/slock/channel-create.js +1 -0
  1046. package/clis/slock/channel-files.js +1 -0
  1047. package/clis/slock/channel-info.js +1 -0
  1048. package/clis/slock/channel-join.js +1 -0
  1049. package/clis/slock/channel-leave.js +1 -0
  1050. package/clis/slock/channel-list.js +1 -0
  1051. package/clis/slock/channel-mark.js +1 -0
  1052. package/clis/slock/channel-members.js +1 -0
  1053. package/clis/slock/channel-unarchive.js +1 -0
  1054. package/clis/slock/dm-list.js +1 -0
  1055. package/clis/slock/errors.js +1 -0
  1056. package/clis/slock/in-page.js +113 -0
  1057. package/clis/slock/inbox-done.js +9 -0
  1058. package/clis/slock/inbox-read-all.js +1 -0
  1059. package/clis/slock/inbox.js +1 -0
  1060. package/clis/slock/login.js +1 -0
  1061. package/clis/slock/message-read.js +61 -0
  1062. package/clis/slock/message-search.js +24 -0
  1063. package/clis/slock/message-send.js +55 -0
  1064. package/clis/slock/reaction-add.js +1 -0
  1065. package/clis/slock/reaction-remove.js +1 -0
  1066. package/clis/slock/resolve.js +1 -0
  1067. package/clis/slock/server-list.js +9 -0
  1068. package/clis/slock/server-use.js +18 -0
  1069. package/clis/slock/shared.js +1 -0
  1070. package/clis/slock/task-claim.js +14 -0
  1071. package/clis/slock/task-convert.js +35 -0
  1072. package/clis/slock/task-create.js +24 -0
  1073. package/clis/slock/task-delete.js +9 -0
  1074. package/clis/slock/task-get.js +11 -0
  1075. package/clis/slock/task-list-server.js +12 -0
  1076. package/clis/slock/task-list.js +14 -0
  1077. package/clis/slock/task-status.js +19 -0
  1078. package/clis/slock/task-unclaim.js +13 -0
  1079. package/clis/slock/thread-done.js +1 -0
  1080. package/clis/slock/thread-follow.js +1 -0
  1081. package/clis/slock/thread-list.js +1 -0
  1082. package/clis/slock/thread-state.js +1 -0
  1083. package/clis/slock/thread-undone.js +1 -0
  1084. package/clis/slock/thread-unfollow.js +1 -0
  1085. package/clis/slock/unread-summary.js +18 -0
  1086. package/clis/slock/whoami.js +1 -0
  1087. package/clis/smzdm/search.js +71 -0
  1088. package/clis/sohu/article.js +1 -0
  1089. package/clis/sohu/attributes.js +1 -0
  1090. package/clis/sohu/categories.js +1 -0
  1091. package/clis/sohu/channels.js +1 -0
  1092. package/clis/sohu/columns.js +1 -0
  1093. package/clis/sohu/login.js +1 -0
  1094. package/clis/sohu/mpbp.js +1 -0
  1095. package/clis/sohu/stats.js +95 -0
  1096. package/clis/sohu/topics.js +1 -0
  1097. package/clis/sohu/whoami.js +1 -0
  1098. package/clis/spotify/spotify.js +1 -0
  1099. package/clis/spotify/utils.js +8 -0
  1100. package/clis/stackoverflow/bounties.js +1 -0
  1101. package/clis/stackoverflow/hot.js +1 -0
  1102. package/clis/stackoverflow/read.js +13 -0
  1103. package/clis/stackoverflow/related.js +1 -0
  1104. package/clis/stackoverflow/search.js +1 -0
  1105. package/clis/stackoverflow/tag.js +1 -0
  1106. package/clis/stackoverflow/unanswered.js +1 -0
  1107. package/clis/stackoverflow/user.js +1 -0
  1108. package/clis/stackoverflow/utils.js +1 -0
  1109. package/clis/steam/app.js +1 -0
  1110. package/clis/steam/search.js +1 -0
  1111. package/clis/steam/top-sellers.js +1 -0
  1112. package/clis/steam/utils.js +1 -0
  1113. package/clis/substack/auth.js +11 -0
  1114. package/clis/substack/feed.js +1 -0
  1115. package/clis/substack/post-utils.js +2 -0
  1116. package/clis/substack/publication.js +1 -0
  1117. package/clis/substack/publish.js +10 -0
  1118. package/clis/substack/search.js +1 -0
  1119. package/clis/substack/utils.js +108 -0
  1120. package/clis/suno/auth.js +21 -0
  1121. package/clis/suno/download.js +17 -0
  1122. package/clis/suno/generate.js +4 -0
  1123. package/clis/suno/list.js +14 -0
  1124. package/clis/suno/status.js +1 -0
  1125. package/clis/suno/utils.js +102 -0
  1126. package/clis/taobao/add-cart.js +93 -0
  1127. package/clis/taobao/auth.js +8 -0
  1128. package/clis/taobao/cart.js +68 -0
  1129. package/clis/taobao/detail.js +48 -0
  1130. package/clis/taobao/reviews.js +52 -0
  1131. package/clis/taobao/search.js +64 -0
  1132. package/clis/tdx/hot-rank.js +25 -0
  1133. package/clis/telegram/send.js +18 -0
  1134. package/clis/telegram/shared.js +21 -0
  1135. package/clis/telegram/whoami.js +1 -0
  1136. package/clis/test-utils.js +1 -0
  1137. package/clis/threads/post.js +152 -0
  1138. package/clis/threads/shared.js +27 -0
  1139. package/clis/threads/whoami.js +1 -0
  1140. package/clis/ths/hot-rank.js +27 -0
  1141. package/clis/tieba/hot.js +16 -0
  1142. package/clis/tieba/posts.js +1 -0
  1143. package/clis/tieba/read.js +84 -0
  1144. package/clis/tieba/search.js +54 -0
  1145. package/clis/tieba/utils.js +1 -0
  1146. package/clis/tiktok/auth.js +30 -0
  1147. package/clis/tiktok/comment.js +69 -0
  1148. package/clis/tiktok/creator-videos.js +45 -0
  1149. package/clis/tiktok/explore.js +76 -0
  1150. package/clis/tiktok/follow.js +49 -0
  1151. package/clis/tiktok/following.js +103 -0
  1152. package/clis/tiktok/friends.js +79 -0
  1153. package/clis/tiktok/like.js +19 -0
  1154. package/clis/tiktok/live.js +79 -0
  1155. package/clis/tiktok/notifications.js +77 -0
  1156. package/clis/tiktok/profile.js +26 -0
  1157. package/clis/tiktok/publish.js +82 -0
  1158. package/clis/tiktok/save.js +15 -0
  1159. package/clis/tiktok/search.js +24 -0
  1160. package/clis/tiktok/unfollow.js +59 -0
  1161. package/clis/tiktok/unlike.js +19 -0
  1162. package/clis/tiktok/unsave.js +17 -0
  1163. package/clis/tiktok/user.js +143 -0
  1164. package/clis/tiktok/utils.js +272 -0
  1165. package/clis/toutiao/article.js +1 -0
  1166. package/clis/toutiao/articles.js +6 -0
  1167. package/clis/toutiao/auth.js +50 -0
  1168. package/clis/toutiao/hot.js +1 -0
  1169. package/clis/toutiao/utils.js +2 -0
  1170. package/clis/trae-cn/activity.js +1 -0
  1171. package/clis/trae-cn/approve.js +1 -0
  1172. package/clis/trae-cn/ask.js +1 -0
  1173. package/clis/trae-cn/dump.js +1 -0
  1174. package/clis/trae-cn/export.js +3 -0
  1175. package/clis/trae-cn/model.js +1 -0
  1176. package/clis/trae-cn/new.js +1 -0
  1177. package/clis/trae-cn/read.js +1 -0
  1178. package/clis/trae-cn/screenshot.js +1 -0
  1179. package/clis/trae-cn/select-model.js +1 -0
  1180. package/clis/trae-cn/send.js +1 -0
  1181. package/clis/trae-cn/setup.js +1 -0
  1182. package/clis/trae-cn/status.js +1 -0
  1183. package/clis/trae-cn/targets.js +1 -0
  1184. package/clis/trae-cn/utils.js +456 -0
  1185. package/clis/trae-cn/watch.js +3 -0
  1186. package/clis/trae-solo/_actions.js +41 -0
  1187. package/clis/trae-solo/_fs.js +6 -0
  1188. package/clis/trae-solo/_state.js +2 -0
  1189. package/clis/trae-solo/automation.js +43 -0
  1190. package/clis/trae-solo/history.js +15 -0
  1191. package/clis/trae-solo/mode.js +31 -0
  1192. package/clis/trae-solo/model.js +50 -0
  1193. package/clis/trae-solo/renderer-storage.js +11 -0
  1194. package/clis/trae-solo/settings.js +1 -0
  1195. package/clis/trae-solo/skill-fs.js +1 -0
  1196. package/clis/trae-solo/skill.js +81 -0
  1197. package/clis/trae-solo/state-fs.js +2 -0
  1198. package/clis/trae-solo/status.js +1 -0
  1199. package/clis/trae-solo/task-fs.js +5 -0
  1200. package/clis/trae-solo/user-rules.js +1 -0
  1201. package/clis/trae-solo/workspaces-fs.js +1 -0
  1202. package/clis/tumblr/auth.js +24 -0
  1203. package/clis/tumblr/publish.js +14 -0
  1204. package/clis/tvmaze/search.js +1 -0
  1205. package/clis/tvmaze/show.js +1 -0
  1206. package/clis/tvmaze/utils.js +1 -0
  1207. package/clis/twitter/accept.js +116 -0
  1208. package/clis/twitter/article.js +116 -0
  1209. package/clis/twitter/auth.js +4 -0
  1210. package/clis/twitter/block.js +62 -0
  1211. package/clis/twitter/bookmark-folder.js +4 -0
  1212. package/clis/twitter/bookmark-folders.js +4 -0
  1213. package/clis/twitter/bookmark.js +44 -0
  1214. package/clis/twitter/bookmarks.js +27 -0
  1215. package/clis/twitter/delete.js +36 -0
  1216. package/clis/twitter/device-follow.js +13 -0
  1217. package/clis/twitter/dm-list.js +1 -0
  1218. package/clis/twitter/dm-read.js +1 -0
  1219. package/clis/twitter/dm-send.js +13 -0
  1220. package/clis/twitter/dm-shared.js +6 -0
  1221. package/clis/twitter/download.js +38 -0
  1222. package/clis/twitter/follow-batch.js +43 -0
  1223. package/clis/twitter/follow.js +39 -0
  1224. package/clis/twitter/followers.js +59 -0
  1225. package/clis/twitter/following.js +4 -0
  1226. package/clis/twitter/hide-reply.js +57 -0
  1227. package/clis/twitter/like.js +48 -0
  1228. package/clis/twitter/likes.js +14 -0
  1229. package/clis/twitter/list-add-batch.js +1 -0
  1230. package/clis/twitter/list-add-core.js +35 -0
  1231. package/clis/twitter/list-add.js +1 -0
  1232. package/clis/twitter/list-batch-utils.js +1 -0
  1233. package/clis/twitter/list-create.js +12 -0
  1234. package/clis/twitter/list-delete.js +36 -0
  1235. package/clis/twitter/list-remove-batch.js +1 -0
  1236. package/clis/twitter/list-remove-core.js +127 -0
  1237. package/clis/twitter/list-remove.js +1 -0
  1238. package/clis/twitter/list-tweets.js +27 -0
  1239. package/clis/twitter/lists.js +27 -0
  1240. package/clis/twitter/notifications.js +4 -0
  1241. package/clis/twitter/post.js +158 -0
  1242. package/clis/twitter/profile.js +66 -0
  1243. package/clis/twitter/quote.js +123 -0
  1244. package/clis/twitter/reply-dm.js +112 -0
  1245. package/clis/twitter/reply.js +97 -0
  1246. package/clis/twitter/retweet.js +62 -0
  1247. package/clis/twitter/schedule.js +96 -0
  1248. package/clis/twitter/scheduled-delete.js +60 -0
  1249. package/clis/twitter/scheduled-list.js +15 -0
  1250. package/clis/twitter/scheduled-utils.js +18 -0
  1251. package/clis/twitter/search.js +12 -0
  1252. package/clis/twitter/shared.js +76 -0
  1253. package/clis/twitter/thread.js +4 -0
  1254. package/clis/twitter/timeline.js +4 -0
  1255. package/clis/twitter/trending.js +18 -0
  1256. package/clis/twitter/tweets.js +12 -0
  1257. package/clis/twitter/unblock.js +45 -0
  1258. package/clis/twitter/unbookmark.js +41 -0
  1259. package/clis/twitter/unfollow.js +45 -0
  1260. package/clis/twitter/unlike.js +48 -0
  1261. package/clis/twitter/unretweet.js +62 -0
  1262. package/clis/twitter/utils.js +55 -0
  1263. package/clis/uisdc/news.js +25 -0
  1264. package/clis/uiverse/_shared.js +257 -0
  1265. package/clis/uiverse/code.js +1 -0
  1266. package/clis/uiverse/preview.js +1 -0
  1267. package/clis/upwork/auth.js +19 -0
  1268. package/clis/upwork/detail.js +22 -0
  1269. package/clis/upwork/feed.js +21 -0
  1270. package/clis/upwork/search.js +21 -0
  1271. package/clis/upwork/utils.js +1 -0
  1272. package/clis/v2ex/auth.js +10 -0
  1273. package/clis/v2ex/daily.js +41 -0
  1274. package/clis/v2ex/hot.js +1 -0
  1275. package/clis/v2ex/latest.js +1 -0
  1276. package/clis/v2ex/me.js +58 -0
  1277. package/clis/v2ex/member.js +1 -0
  1278. package/clis/v2ex/node.js +1 -0
  1279. package/clis/v2ex/nodes.js +1 -0
  1280. package/clis/v2ex/notifications.js +40 -0
  1281. package/clis/v2ex/replies.js +1 -0
  1282. package/clis/v2ex/topic.js +1 -0
  1283. package/clis/v2ex/user.js +1 -0
  1284. package/clis/vk/post.js +1 -0
  1285. package/clis/vk/shared.js +8 -0
  1286. package/clis/vk/whoami.js +1 -0
  1287. package/clis/wanfang/search.js +42 -0
  1288. package/clis/web/read.js +260 -0
  1289. package/clis/wechat-channels/auth.js +31 -0
  1290. package/clis/wechat-channels/publish.js +298 -0
  1291. package/clis/weibo/article.js +1 -0
  1292. package/clis/weibo/auth.js +17 -0
  1293. package/clis/weibo/comments.js +28 -0
  1294. package/clis/weibo/delete.js +84 -0
  1295. package/clis/weibo/favorites.js +27 -0
  1296. package/clis/weibo/feed.js +33 -0
  1297. package/clis/weibo/hot.js +17 -0
  1298. package/clis/weibo/me.js +51 -0
  1299. package/clis/weibo/post.js +46 -0
  1300. package/clis/weibo/publish.js +98 -0
  1301. package/clis/weibo/search.js +47 -0
  1302. package/clis/weibo/user-posts.js +92 -0
  1303. package/clis/weibo/user.js +37 -0
  1304. package/clis/weibo/utils.js +16 -0
  1305. package/clis/weixin/article.js +1 -0
  1306. package/clis/weixin/create-draft.js +152 -0
  1307. package/clis/weixin/download.js +100 -0
  1308. package/clis/weixin/drafts.js +27 -0
  1309. package/clis/weixin/login.js +1 -0
  1310. package/clis/weixin/search.js +44 -0
  1311. package/clis/weixin/stats.js +43 -0
  1312. package/clis/weixin/whoami.js +1 -0
  1313. package/clis/weread/ai-outline.js +2 -0
  1314. package/clis/weread/auth.js +24 -0
  1315. package/clis/weread/book-search.js +2 -0
  1316. package/clis/weread/book.js +3 -0
  1317. package/clis/weread/highlights.js +1 -0
  1318. package/clis/weread/notebooks.js +1 -0
  1319. package/clis/weread/notes.js +1 -0
  1320. package/clis/weread/ranking.js +1 -0
  1321. package/clis/weread/search.js +1 -0
  1322. package/clis/weread/shelf.js +1 -0
  1323. package/clis/weread/utils.js +67 -0
  1324. package/clis/weread-official/book.js +1 -0
  1325. package/clis/weread-official/discover.js +1 -0
  1326. package/clis/weread-official/list-apis.js +1 -0
  1327. package/clis/weread-official/notes.js +1 -0
  1328. package/clis/weread-official/readdata.js +1 -0
  1329. package/clis/weread-official/review.js +1 -0
  1330. package/clis/weread-official/search.js +1 -0
  1331. package/clis/weread-official/shelf.js +1 -0
  1332. package/clis/weread-official/utils.js +1 -0
  1333. package/clis/wikidata/entity.js +1 -0
  1334. package/clis/wikidata/search.js +1 -0
  1335. package/clis/wikidata/utils.js +1 -0
  1336. package/clis/wikipedia/page.js +3 -0
  1337. package/clis/wikipedia/random.js +1 -0
  1338. package/clis/wikipedia/search.js +1 -0
  1339. package/clis/wikipedia/summary.js +1 -0
  1340. package/clis/wikipedia/trending.js +1 -0
  1341. package/clis/wikipedia/utils.js +1 -0
  1342. package/clis/wordpress/login.js +1 -0
  1343. package/clis/wordpress/publish.js +1 -0
  1344. package/clis/wordpress/shared.js +54 -0
  1345. package/clis/wordpress/whoami.js +1 -0
  1346. package/clis/woshipm/article.js +1 -0
  1347. package/clis/woshipm/login.js +1 -0
  1348. package/clis/woshipm/stats.js +52 -0
  1349. package/clis/woshipm/whoami.js +1 -0
  1350. package/clis/wttr/current.js +1 -0
  1351. package/clis/wttr/forecast.js +1 -0
  1352. package/clis/wttr/utils.js +1 -0
  1353. package/clis/xianyu/auth.js +11 -0
  1354. package/clis/xianyu/chat.js +1 -0
  1355. package/clis/xianyu/im.js +240 -0
  1356. package/clis/xianyu/inbox.js +1 -0
  1357. package/clis/xianyu/item.js +97 -0
  1358. package/clis/xianyu/messages.js +1 -0
  1359. package/clis/xianyu/publish.js +245 -0
  1360. package/clis/xianyu/reply.js +1 -0
  1361. package/clis/xianyu/search.js +141 -0
  1362. package/clis/xianyu/utils.js +1 -0
  1363. package/clis/xiaoe/auth.js +10 -0
  1364. package/clis/xiaoe/catalog.js +134 -0
  1365. package/clis/xiaoe/content.js +16 -0
  1366. package/clis/xiaoe/courses.js +43 -0
  1367. package/clis/xiaoe/detail.js +19 -0
  1368. package/clis/xiaoe/play-url.js +97 -0
  1369. package/clis/xiaohongshu/ask.js +130 -0
  1370. package/clis/xiaohongshu/auth.js +13 -0
  1371. package/clis/xiaohongshu/collection-helpers.js +64 -0
  1372. package/clis/xiaohongshu/comments.js +89 -0
  1373. package/clis/xiaohongshu/creator-note-detail.js +80 -0
  1374. package/clis/xiaohongshu/creator-notes-summary.js +1 -0
  1375. package/clis/xiaohongshu/creator-notes.js +107 -0
  1376. package/clis/xiaohongshu/creator-profile.js +13 -0
  1377. package/clis/xiaohongshu/creator-stats.js +13 -0
  1378. package/clis/xiaohongshu/delete-note.js +69 -0
  1379. package/clis/xiaohongshu/download.js +200 -0
  1380. package/clis/xiaohongshu/draft-clear.js +44 -0
  1381. package/clis/xiaohongshu/draft-delete.js +37 -0
  1382. package/clis/xiaohongshu/draft-open.js +1 -0
  1383. package/clis/xiaohongshu/draft-utils.js +36 -0
  1384. package/clis/xiaohongshu/drafts.js +1 -0
  1385. package/clis/xiaohongshu/feed.js +38 -0
  1386. package/clis/xiaohongshu/follow.js +75 -0
  1387. package/clis/xiaohongshu/liked.js +1 -0
  1388. package/clis/xiaohongshu/note-helpers.js +1 -0
  1389. package/clis/xiaohongshu/note.js +32 -0
  1390. package/clis/xiaohongshu/notifications.js +1 -0
  1391. package/clis/xiaohongshu/publish-video.js +87 -0
  1392. package/clis/xiaohongshu/publish.js +637 -0
  1393. package/clis/xiaohongshu/saved.js +1 -0
  1394. package/clis/xiaohongshu/search.js +194 -0
  1395. package/clis/xiaohongshu/unfollow.js +98 -0
  1396. package/clis/xiaohongshu/user-helpers.js +1 -0
  1397. package/clis/xiaohongshu/user.js +30 -0
  1398. package/clis/xiaoyuzhou/auth.js +3 -0
  1399. package/clis/xiaoyuzhou/download.js +1 -0
  1400. package/clis/xiaoyuzhou/episode.js +1 -0
  1401. package/clis/xiaoyuzhou/podcast-episodes.js +1 -0
  1402. package/clis/xiaoyuzhou/podcast.js +1 -0
  1403. package/clis/xiaoyuzhou/transcript.js +1 -0
  1404. package/clis/xiaoyuzhou/utils.js +1 -0
  1405. package/clis/xueqiu/article.js +4 -0
  1406. package/clis/xueqiu/auth.js +27 -0
  1407. package/clis/xueqiu/comments.js +38 -0
  1408. package/clis/xueqiu/danjuan-utils.js +84 -0
  1409. package/clis/xueqiu/earnings-date.js +1 -0
  1410. package/clis/xueqiu/events.js +17 -0
  1411. package/clis/xueqiu/feed.js +1 -0
  1412. package/clis/xueqiu/fund-holdings.js +1 -0
  1413. package/clis/xueqiu/fund-snapshot.js +1 -0
  1414. package/clis/xueqiu/groups.js +1 -0
  1415. package/clis/xueqiu/hashtags.js +26 -0
  1416. package/clis/xueqiu/hot-stock.js +1 -0
  1417. package/clis/xueqiu/hot.js +1 -0
  1418. package/clis/xueqiu/kline.js +1 -0
  1419. package/clis/xueqiu/search.js +1 -0
  1420. package/clis/xueqiu/stock.js +1 -0
  1421. package/clis/xueqiu/stocks.js +13 -0
  1422. package/clis/xueqiu/users.js +12 -0
  1423. package/clis/xueqiu/utils.js +9 -0
  1424. package/clis/xueqiu/watchlist.js +1 -0
  1425. package/clis/yahoo/search.js +21 -0
  1426. package/clis/yahoo-finance/quote.js +50 -0
  1427. package/clis/yollomi/background.js +1 -0
  1428. package/clis/yollomi/edit.js +1 -0
  1429. package/clis/yollomi/face-swap.js +1 -0
  1430. package/clis/yollomi/generate.js +1 -0
  1431. package/clis/yollomi/models.js +1 -0
  1432. package/clis/yollomi/object-remover.js +1 -0
  1433. package/clis/yollomi/remove-bg.js +1 -0
  1434. package/clis/yollomi/restore.js +1 -0
  1435. package/clis/yollomi/try-on.js +1 -0
  1436. package/clis/yollomi/upload.js +17 -0
  1437. package/clis/yollomi/upscale.js +1 -0
  1438. package/clis/yollomi/utils.js +16 -0
  1439. package/clis/yollomi/video.js +1 -0
  1440. package/clis/youdao/note.js +113 -0
  1441. package/clis/youtube/auth.js +20 -0
  1442. package/clis/youtube/channel.js +118 -0
  1443. package/clis/youtube/comments.js +64 -0
  1444. package/clis/youtube/feed.js +89 -0
  1445. package/clis/youtube/history.js +87 -0
  1446. package/clis/youtube/like.js +33 -0
  1447. package/clis/youtube/playlist.js +47 -0
  1448. package/clis/youtube/publish.js +56 -0
  1449. package/clis/youtube/search.js +39 -0
  1450. package/clis/youtube/subscribe.js +42 -0
  1451. package/clis/youtube/subscriptions.js +26 -0
  1452. package/clis/youtube/transcript-group.js +2 -0
  1453. package/clis/youtube/transcript.js +417 -0
  1454. package/clis/youtube/unlike.js +33 -0
  1455. package/clis/youtube/unsubscribe.js +42 -0
  1456. package/clis/youtube/utils.js +34 -0
  1457. package/clis/youtube/video.js +96 -0
  1458. package/clis/youtube/watch-later.js +41 -0
  1459. package/clis/yuanbao/ask.js +145 -0
  1460. package/clis/yuanbao/auth.js +23 -0
  1461. package/clis/yuanbao/detail.js +1 -0
  1462. package/clis/yuanbao/history.js +1 -0
  1463. package/clis/yuanbao/new.js +16 -0
  1464. package/clis/yuanbao/read.js +1 -0
  1465. package/clis/yuanbao/send.js +1 -0
  1466. package/clis/yuanbao/shared.js +127 -0
  1467. package/clis/yuanbao/status.js +1 -0
  1468. package/clis/yuque/article.js +1 -0
  1469. package/clis/yuque/whoami.js +1 -0
  1470. package/clis/zhihu/answer-comments.js +11 -0
  1471. package/clis/zhihu/answer-detail.js +11 -0
  1472. package/clis/zhihu/answer.js +15 -0
  1473. package/clis/zhihu/article-transform.js +1 -0
  1474. package/clis/zhihu/article.js +7 -0
  1475. package/clis/zhihu/auth.js +11 -0
  1476. package/clis/zhihu/collection.js +7 -0
  1477. package/clis/zhihu/collections.js +7 -0
  1478. package/clis/zhihu/comment.js +17 -0
  1479. package/clis/zhihu/download.js +39 -0
  1480. package/clis/zhihu/favorite.js +39 -0
  1481. package/clis/zhihu/follow.js +19 -0
  1482. package/clis/zhihu/followers.js +1 -0
  1483. package/clis/zhihu/following.js +1 -0
  1484. package/clis/zhihu/hot.js +21 -0
  1485. package/clis/zhihu/like.js +16 -0
  1486. package/clis/zhihu/paginate.js +11 -0
  1487. package/clis/zhihu/pin.js +24 -0
  1488. package/clis/zhihu/pins.js +1 -0
  1489. package/clis/zhihu/question.js +7 -0
  1490. package/clis/zhihu/recommend.js +7 -0
  1491. package/clis/zhihu/search.js +11 -0
  1492. package/clis/zhihu/stats.js +41 -0
  1493. package/clis/zhihu/target.js +1 -0
  1494. package/clis/zhihu/text.js +6 -0
  1495. package/clis/zhihu/user-answers.js +1 -0
  1496. package/clis/zhihu/user-arg.js +1 -0
  1497. package/clis/zhihu/user-articles.js +1 -0
  1498. package/clis/zhihu/user.js +11 -0
  1499. package/clis/zhihu/write-shared.js +71 -0
  1500. package/clis/zlibrary/info.js +1 -0
  1501. package/clis/zlibrary/search.js +1 -0
  1502. package/clis/zlibrary/utils.js +48 -0
  1503. package/clis/zsxq/auth.js +33 -0
  1504. package/clis/zsxq/dynamics.js +1 -0
  1505. package/clis/zsxq/groups.js +1 -0
  1506. package/clis/zsxq/search.js +1 -0
  1507. package/clis/zsxq/topic.js +1 -0
  1508. package/clis/zsxq/topics.js +1 -0
  1509. package/clis/zsxq/utils.js +72 -0
  1510. package/dist/src/adapter-shadow.d.ts +11 -0
  1511. package/dist/src/adapter-shadow.js +2 -0
  1512. package/dist/src/adapter-shadow.test.d.ts +1 -0
  1513. package/dist/src/adapter-source.d.ts +11 -0
  1514. package/dist/src/adapter-source.js +1 -0
  1515. package/dist/src/adapter-source.test.d.ts +1 -0
  1516. package/dist/src/browser/analyze.d.ts +118 -0
  1517. package/dist/src/browser/analyze.js +1 -0
  1518. package/dist/src/browser/analyze.test.d.ts +1 -0
  1519. package/dist/src/browser/article-extract.d.ts +57 -0
  1520. package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
  1521. package/dist/src/browser/article-extract.js +2 -0
  1522. package/dist/src/browser/article-extract.test.d.ts +1 -0
  1523. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  1524. package/dist/src/browser/ax-snapshot.js +2 -0
  1525. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  1526. package/dist/src/browser/base-page.d.ts +151 -0
  1527. package/dist/src/browser/base-page.js +225 -0
  1528. package/dist/src/browser/base-page.test.d.ts +1 -0
  1529. package/dist/src/browser/bridge-readiness.d.ts +14 -0
  1530. package/dist/src/browser/bridge-readiness.js +1 -0
  1531. package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
  1532. package/dist/src/browser/bridge.d.ts +26 -0
  1533. package/dist/src/browser/bridge.js +1 -0
  1534. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  1535. package/dist/src/browser/cdp.d.ts +51 -0
  1536. package/dist/src/browser/cdp.js +1 -0
  1537. package/dist/src/browser/cdp.test.d.ts +1 -0
  1538. package/dist/src/browser/compound.d.ts +59 -0
  1539. package/dist/src/browser/compound.js +82 -0
  1540. package/dist/src/browser/compound.test.d.ts +1 -0
  1541. package/dist/src/browser/config.d.ts +2 -0
  1542. package/dist/src/browser/config.js +1 -0
  1543. package/dist/src/browser/daemon-client.d.ts +79 -0
  1544. package/dist/src/browser/daemon-client.js +1 -0
  1545. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  1546. package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
  1547. package/dist/src/browser/daemon-lifecycle.js +12 -0
  1548. package/dist/src/browser/daemon-transport.d.ts +55 -0
  1549. package/dist/src/browser/daemon-transport.js +1 -0
  1550. package/dist/src/browser/daemon-version.d.ts +4 -0
  1551. package/dist/src/browser/daemon-version.js +2 -0
  1552. package/dist/src/browser/dom-helpers.d.ts +41 -0
  1553. package/dist/src/browser/dom-helpers.js +166 -0
  1554. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  1555. package/dist/src/browser/dom-snapshot.d.ts +93 -0
  1556. package/dist/src/browser/dom-snapshot.js +809 -0
  1557. package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
  1558. package/dist/src/browser/errors.d.ts +38 -0
  1559. package/dist/src/browser/errors.js +5 -0
  1560. package/dist/src/browser/errors.test.d.ts +1 -0
  1561. package/dist/src/browser/extract.d.ts +69 -0
  1562. package/dist/src/browser/extract.js +42 -0
  1563. package/dist/src/browser/extract.test.d.ts +1 -0
  1564. package/dist/src/browser/find.d.ts +84 -0
  1565. package/dist/src/browser/find.js +328 -0
  1566. package/dist/src/browser/find.test.d.ts +1 -0
  1567. package/dist/src/browser/fingerprint.d.ts +44 -0
  1568. package/dist/src/browser/fingerprint.js +82 -0
  1569. package/dist/src/browser/html-tree.d.ts +75 -0
  1570. package/dist/src/browser/html-tree.js +61 -0
  1571. package/dist/src/browser/html-tree.test.d.ts +1 -0
  1572. package/dist/src/browser/index.d.ts +14 -0
  1573. package/dist/src/browser/index.js +1 -0
  1574. package/dist/src/browser/managed-chrome.d.ts +89 -0
  1575. package/dist/src/browser/managed-chrome.js +1 -0
  1576. package/dist/src/browser/network-cache.d.ts +49 -0
  1577. package/dist/src/browser/network-cache.js +1 -0
  1578. package/dist/src/browser/network-cache.test.d.ts +1 -0
  1579. package/dist/src/browser/network-key.d.ts +22 -0
  1580. package/dist/src/browser/network-key.js +1 -0
  1581. package/dist/src/browser/network-key.test.d.ts +1 -0
  1582. package/dist/src/browser/page.d.ts +83 -0
  1583. package/dist/src/browser/page.js +15 -0
  1584. package/dist/src/browser/page.test.d.ts +1 -0
  1585. package/dist/src/browser/profile.d.ts +96 -0
  1586. package/dist/src/browser/profile.js +2 -0
  1587. package/dist/src/browser/proxy-test.d.ts +28 -0
  1588. package/dist/src/browser/proxy-test.js +12 -0
  1589. package/dist/src/browser/shape-filter.d.ts +52 -0
  1590. package/dist/src/browser/shape-filter.js +1 -0
  1591. package/dist/src/browser/shape-filter.test.d.ts +1 -0
  1592. package/dist/src/browser/shape.d.ts +23 -0
  1593. package/dist/src/browser/shape.js +1 -0
  1594. package/dist/src/browser/shape.test.d.ts +1 -0
  1595. package/dist/src/browser/stealth.d.ts +18 -0
  1596. package/dist/src/browser/stealth.js +391 -0
  1597. package/dist/src/browser/stealth.test.d.ts +1 -0
  1598. package/dist/src/browser/tabs.d.ts +13 -0
  1599. package/dist/src/browser/tabs.js +2 -0
  1600. package/dist/src/browser/target-errors.d.ts +39 -0
  1601. package/dist/src/browser/target-errors.js +1 -0
  1602. package/dist/src/browser/target-errors.test.d.ts +1 -0
  1603. package/dist/src/browser/target-resolver.d.ts +158 -0
  1604. package/dist/src/browser/target-resolver.js +423 -0
  1605. package/dist/src/browser/target-resolver.test.d.ts +1 -0
  1606. package/dist/src/browser/trace.d.ts +21 -0
  1607. package/dist/src/browser/trace.js +2 -0
  1608. package/dist/src/browser/utils.d.ts +20 -0
  1609. package/dist/src/browser/utils.js +1 -0
  1610. package/dist/src/browser/utils.test.d.ts +1 -0
  1611. package/dist/src/browser/verify-fixture.d.ts +65 -0
  1612. package/dist/src/browser/verify-fixture.js +2 -0
  1613. package/dist/src/browser/verify-fixture.test.d.ts +1 -0
  1614. package/dist/src/browser/visual-refs.d.ts +11 -0
  1615. package/dist/src/browser/visual-refs.js +94 -0
  1616. package/dist/src/browser-session-lock.d.ts +13 -0
  1617. package/dist/src/browser-session-lock.js +1 -0
  1618. package/dist/src/browser-session-lock.test.d.ts +1 -0
  1619. package/dist/src/browser.test.d.ts +1 -0
  1620. package/dist/src/build-manifest.d.ts +103 -0
  1621. package/dist/src/build-manifest.js +16 -0
  1622. package/dist/src/build-manifest.test.d.ts +1 -0
  1623. package/dist/src/capabilityRouting.d.ts +19 -0
  1624. package/dist/src/capabilityRouting.js +1 -0
  1625. package/dist/src/capabilityRouting.test.d.ts +1 -0
  1626. package/dist/src/cli-argv-preprocess.d.ts +63 -0
  1627. package/dist/src/cli-argv-preprocess.js +1 -0
  1628. package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
  1629. package/dist/src/cli.d.ts +79 -0
  1630. package/dist/src/cli.js +132 -0
  1631. package/dist/src/cli.test.d.ts +1 -0
  1632. package/dist/src/commanderAdapter.d.ts +21 -0
  1633. package/dist/src/commanderAdapter.js +3 -0
  1634. package/dist/src/commanderAdapter.test.d.ts +1 -0
  1635. package/dist/src/commands/auth.d.ts +40 -0
  1636. package/dist/src/commands/auth.js +2 -0
  1637. package/dist/src/commands/auth.test.d.ts +1 -0
  1638. package/dist/src/commands/daemon.d.ts +25 -0
  1639. package/dist/src/commands/daemon.js +1 -0
  1640. package/dist/src/commands/daemon.test.d.ts +1 -0
  1641. package/dist/src/completion-fast.d.ts +22 -0
  1642. package/dist/src/completion-fast.js +1 -0
  1643. package/dist/src/completion-shared.d.ts +13 -0
  1644. package/dist/src/completion-shared.js +30 -0
  1645. package/dist/src/completion.d.ts +21 -0
  1646. package/dist/src/completion.js +1 -0
  1647. package/dist/src/completion.test.d.ts +1 -0
  1648. package/dist/src/constants.d.ts +22 -0
  1649. package/dist/src/constants.js +1 -0
  1650. package/dist/src/convention-audit.d.ts +50 -0
  1651. package/dist/src/convention-audit.js +2 -0
  1652. package/dist/src/convention-audit.test.d.ts +1 -0
  1653. package/dist/src/daemon-utils.d.ts +18 -0
  1654. package/dist/src/daemon-utils.js +1 -0
  1655. package/dist/src/daemon.d.ts +22 -0
  1656. package/dist/src/daemon.js +1 -0
  1657. package/dist/src/daemon.test.d.ts +1 -0
  1658. package/dist/src/discovery.d.ts +43 -0
  1659. package/dist/src/discovery.js +2 -0
  1660. package/dist/src/doctor.d.ts +38 -0
  1661. package/dist/src/doctor.js +13 -0
  1662. package/dist/src/doctor.test.d.ts +1 -0
  1663. package/dist/src/download/article-download.d.ts +72 -0
  1664. package/dist/src/download/article-download.js +21 -0
  1665. package/dist/src/download/article-download.test.d.ts +1 -0
  1666. package/dist/src/download/index.d.ts +71 -0
  1667. package/dist/src/download/index.js +7 -0
  1668. package/dist/src/download/index.test.d.ts +1 -0
  1669. package/dist/src/download/media-download.d.ts +49 -0
  1670. package/dist/src/download/media-download.js +1 -0
  1671. package/dist/src/download/media-download.test.d.ts +1 -0
  1672. package/dist/src/download/progress.d.ts +36 -0
  1673. package/dist/src/download/progress.js +5 -0
  1674. package/dist/src/download/progress.test.d.ts +1 -0
  1675. package/dist/src/electron-apps.d.ts +31 -0
  1676. package/dist/src/electron-apps.js +1 -0
  1677. package/dist/src/electron-apps.test.d.ts +1 -0
  1678. package/dist/src/engine.test.d.ts +1 -0
  1679. package/dist/src/errors.d.ts +117 -0
  1680. package/dist/src/errors.js +2 -0
  1681. package/dist/src/errors.test.d.ts +1 -0
  1682. package/dist/src/execution.d.ts +24 -0
  1683. package/dist/src/execution.js +2 -0
  1684. package/dist/src/execution.test.d.ts +1 -0
  1685. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  1686. package/dist/src/external-clis.yaml +109 -0
  1687. package/dist/src/external.d.ts +49 -0
  1688. package/dist/src/external.js +1 -0
  1689. package/dist/src/external.test.d.ts +1 -0
  1690. package/dist/src/help.d.ts +88 -0
  1691. package/dist/src/help.js +8 -0
  1692. package/dist/src/help.test.d.ts +1 -0
  1693. package/dist/src/hooks.d.ts +46 -0
  1694. package/dist/src/hooks.js +1 -0
  1695. package/dist/src/hooks.test.d.ts +4 -0
  1696. package/dist/src/interceptor.d.ts +44 -0
  1697. package/dist/src/interceptor.js +123 -0
  1698. package/dist/src/interceptor.test.d.ts +4 -0
  1699. package/dist/src/launcher.d.ts +41 -0
  1700. package/dist/src/launcher.js +7 -0
  1701. package/dist/src/launcher.test.d.ts +1 -0
  1702. package/dist/src/logger.d.ts +26 -0
  1703. package/dist/src/logger.js +9 -0
  1704. package/dist/src/main.d.ts +5 -0
  1705. package/dist/src/main.js +10 -0
  1706. package/dist/src/manifest-types.d.ts +43 -0
  1707. package/dist/src/manifest-types.js +1 -0
  1708. package/dist/src/node-network.d.ts +10 -0
  1709. package/dist/src/node-network.js +1 -0
  1710. package/dist/src/node-network.test.d.ts +1 -0
  1711. package/dist/src/observation/artifact.d.ts +16 -0
  1712. package/dist/src/observation/artifact.js +8 -0
  1713. package/dist/src/observation/artifact.test.d.ts +1 -0
  1714. package/dist/src/observation/events.d.ts +89 -0
  1715. package/dist/src/observation/events.js +1 -0
  1716. package/dist/src/observation/index.d.ts +7 -0
  1717. package/dist/src/observation/index.js +1 -0
  1718. package/dist/src/observation/manager.d.ts +9 -0
  1719. package/dist/src/observation/manager.js +1 -0
  1720. package/dist/src/observation/manager.test.d.ts +1 -0
  1721. package/dist/src/observation/redaction.d.ts +11 -0
  1722. package/dist/src/observation/redaction.js +2 -0
  1723. package/dist/src/observation/redaction.test.d.ts +1 -0
  1724. package/dist/src/observation/retention.d.ts +32 -0
  1725. package/dist/src/observation/retention.js +1 -0
  1726. package/dist/src/observation/retention.test.d.ts +1 -0
  1727. package/dist/src/observation/ring-buffer.d.ts +22 -0
  1728. package/dist/src/observation/ring-buffer.js +1 -0
  1729. package/dist/src/observation/ring-buffer.test.d.ts +1 -0
  1730. package/dist/src/observation/session.d.ts +25 -0
  1731. package/dist/src/observation/session.js +1 -0
  1732. package/dist/src/output.d.ts +14 -0
  1733. package/dist/src/output.js +2 -0
  1734. package/dist/src/output.test.d.ts +1 -0
  1735. package/dist/src/package-exports.test.d.ts +1 -0
  1736. package/dist/src/package-paths.d.ts +8 -0
  1737. package/dist/src/package-paths.js +1 -0
  1738. package/dist/src/pipeline/executor.d.ts +11 -0
  1739. package/dist/src/pipeline/executor.js +1 -0
  1740. package/dist/src/pipeline/executor.test.d.ts +4 -0
  1741. package/dist/src/pipeline/index.d.ts +5 -0
  1742. package/dist/src/pipeline/index.js +1 -0
  1743. package/dist/src/pipeline/registry.d.ts +28 -0
  1744. package/dist/src/pipeline/registry.js +1 -0
  1745. package/dist/src/pipeline/steps/browser.d.ts +13 -0
  1746. package/dist/src/pipeline/steps/browser.js +1 -0
  1747. package/dist/src/pipeline/steps/download.d.ts +18 -0
  1748. package/dist/src/pipeline/steps/download.js +1 -0
  1749. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  1750. package/dist/src/pipeline/steps/fetch.d.ts +5 -0
  1751. package/dist/src/pipeline/steps/fetch.js +31 -0
  1752. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  1753. package/dist/src/pipeline/steps/intercept.d.ts +5 -0
  1754. package/dist/src/pipeline/steps/intercept.js +1 -0
  1755. package/dist/src/pipeline/steps/tap.d.ts +12 -0
  1756. package/dist/src/pipeline/steps/tap.js +53 -0
  1757. package/dist/src/pipeline/steps/transform.d.ts +9 -0
  1758. package/dist/src/pipeline/steps/transform.js +1 -0
  1759. package/dist/src/pipeline/template.d.ts +17 -0
  1760. package/dist/src/pipeline/template.js +1 -0
  1761. package/dist/src/pipeline/template.test.d.ts +4 -0
  1762. package/dist/src/pipeline/transform.test.d.ts +4 -0
  1763. package/dist/src/plugin-manifest.d.ts +70 -0
  1764. package/dist/src/plugin-manifest.js +1 -0
  1765. package/dist/src/plugin-manifest.test.d.ts +4 -0
  1766. package/dist/src/plugin-scaffold.d.ts +28 -0
  1767. package/dist/src/plugin-scaffold.js +75 -0
  1768. package/dist/src/plugin-scaffold.test.d.ts +4 -0
  1769. package/dist/src/plugin.d.ts +145 -0
  1770. package/dist/src/plugin.js +20 -0
  1771. package/dist/src/plugin.test.d.ts +4 -0
  1772. package/dist/src/rate-limit.d.ts +15 -0
  1773. package/dist/src/rate-limit.js +2 -0
  1774. package/dist/src/rate-limit.test.d.ts +1 -0
  1775. package/dist/src/registry-api.d.ts +13 -0
  1776. package/dist/src/registry-api.js +1 -0
  1777. package/dist/src/registry.d.ts +130 -0
  1778. package/dist/src/registry.js +1 -0
  1779. package/dist/src/registry.test.d.ts +4 -0
  1780. package/dist/src/runtime-detect.d.ts +31 -0
  1781. package/dist/src/runtime-detect.js +1 -0
  1782. package/dist/src/runtime-detect.test.d.ts +1 -0
  1783. package/dist/src/runtime.d.ts +57 -0
  1784. package/dist/src/runtime.js +1 -0
  1785. package/dist/src/scripts/framework.d.ts +7 -0
  1786. package/dist/src/scripts/framework.js +1 -0
  1787. package/dist/src/scripts/interact.d.ts +4 -0
  1788. package/dist/src/scripts/interact.js +1 -0
  1789. package/dist/src/scripts/store.d.ts +13 -0
  1790. package/dist/src/scripts/store.js +1 -0
  1791. package/dist/src/serialization.d.ts +42 -0
  1792. package/dist/src/serialization.js +4 -0
  1793. package/dist/src/serialization.test.d.ts +1 -0
  1794. package/dist/src/skills.d.ts +14 -0
  1795. package/dist/src/skills.js +6 -0
  1796. package/dist/src/skills.test.d.ts +1 -0
  1797. package/dist/src/snapshotFormatter.d.ts +11 -0
  1798. package/dist/src/snapshotFormatter.js +3 -0
  1799. package/dist/src/snapshotFormatter.test.d.ts +7 -0
  1800. package/dist/src/tui.d.ts +28 -0
  1801. package/dist/src/tui.js +16 -0
  1802. package/dist/src/tui.test.d.ts +1 -0
  1803. package/dist/src/types.d.ts +236 -0
  1804. package/dist/src/types.js +1 -0
  1805. package/dist/src/utils.d.ts +57 -0
  1806. package/dist/src/utils.js +38 -0
  1807. package/dist/src/utils.test.d.ts +1 -0
  1808. package/dist/src/validate.d.ts +21 -0
  1809. package/dist/src/validate.js +3 -0
  1810. package/dist/src/validate.test.d.ts +9 -0
  1811. package/dist/src/verify.d.ts +27 -0
  1812. package/dist/src/verify.js +2 -0
  1813. package/dist/src/verify.test.d.ts +8 -0
  1814. package/dist/src/version.d.ts +4 -0
  1815. package/dist/src/version.js +1 -0
  1816. package/dist/src/weixin-download.test.d.ts +1 -0
  1817. package/docs/guide/browser-bridge.md +94 -0
  1818. package/docs/guide/electron-app-cli.md +199 -0
  1819. package/docs/guide/exit-codes.md +24 -0
  1820. package/docs/guide/extending-opencli.md +134 -0
  1821. package/docs/guide/getting-started.md +81 -0
  1822. package/docs/guide/installation.md +52 -0
  1823. package/docs/guide/plugins.md +226 -0
  1824. package/docs/guide/remote-orchestration.md +116 -0
  1825. package/docs/guide/troubleshooting.md +69 -0
  1826. package/package.json +116 -0
  1827. package/scripts/check-doc-coverage.sh +81 -0
  1828. package/scripts/check-listing-id-pairing.mjs +193 -0
  1829. package/scripts/check-silent-column-drop.mjs +105 -0
  1830. package/scripts/check-typed-error-lint.mjs +118 -0
  1831. package/scripts/clean-dist.cjs +13 -0
  1832. package/scripts/copy-yaml.cjs +12 -0
  1833. package/scripts/fetch-adapters.js +293 -0
  1834. package/scripts/minify-release.mjs +115 -0
  1835. package/scripts/postinstall.js +174 -0
  1836. package/scripts/silent-column-drop-baseline.json +910 -0
  1837. package/scripts/typed-error-lint-baseline.json +1098 -0
  1838. package/skills/opencli-adapter-author/SKILL.md +256 -0
  1839. package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
  1840. package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
  1841. package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
  1842. package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
  1843. package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
  1844. package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
  1845. package/skills/opencli-adapter-author/references/output-design.md +149 -0
  1846. package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
  1847. package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
  1848. package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
  1849. package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
  1850. package/skills/opencli-adapter-author/references/site-memory.md +231 -0
  1851. package/skills/opencli-adapter-author/references/site-recon.md +134 -0
  1852. package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
  1853. package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
  1854. package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
  1855. package/skills/opencli-autofix/SKILL.md +297 -0
  1856. package/skills/opencli-browser/SKILL.md +468 -0
  1857. package/skills/opencli-browser-sitemap/SKILL.md +96 -0
  1858. package/skills/opencli-sitemap-author/SKILL.md +161 -0
  1859. package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
  1860. package/skills/opencli-usage/SKILL.md +168 -0
@@ -0,0 +1,1092 @@
1
+ import{htmlToMarkdown as i}from"@jackwener/opencli/utils";import{ArgumentError as k,AuthRequiredError as _,CommandExecutionError as F,TimeoutError as O}from"@jackwener/opencli/errors";export const CHATGPT_DOMAIN="chatgpt.com",CHATGPT_URL="https://chatgpt.com";const I={instant:{label:"Instant",labels:["Instant","即时","极速"],optionLabels:["Instant","极速","即时"],testIds:["model-switcher-gpt-5-5"],intelligenceOrder:0},medium:{label:"Medium",labels:["Medium","均衡"],optionLabels:["Medium","均衡"],testIds:[],intelligenceOrder:1},high:{label:"High",labels:["High","高级","Thinking","思考"],optionLabels:["High","高级","Thinking","思考"],testIds:["model-switcher-gpt-5-5-thinking"],intelligenceOrder:2},"extra-high":{label:"Extra High",labels:["Extra High","超高"],optionLabels:["Extra High","超高"],testIds:[],intelligenceOrder:3},pro:{label:"Pro",labels:["Pro","进阶专业","专业"],optionLabels:["专业","Pro","进阶专业"],testIds:["model-switcher-gpt-5-5-pro"],intelligenceOrder:4}},w={thinking:"high"};export const CHATGPT_MODEL_CHOICES=[...Object.keys(I),...Object.keys(w)];const G={"deep-research":{label:"Deep Research",labels:["深度研究","Deep Research"]},"web-search":{label:"Web Search",labels:["网页搜索","搜索","Web Search","Search"]}};export const CHATGPT_TOOL_CHOICES=Object.keys(G);const x=['[contenteditable="true"][role="textbox"]','#prompt-textarea[contenteditable="true"]','[aria-label="Chat with ChatGPT"]','[aria-label="与 ChatGPT 聊天"]','[placeholder="Ask anything"]','[placeholder="有问题,尽管问"]',"#prompt-textarea",'[data-testid="prompt-textarea"]'],U='button[data-testid="send-button"]:not([disabled])',L=["#composer-submit-button:not([disabled])"],y=["Send prompt","Send message","Send","发送","发送消息","发送提示"],A=["Close sidebar","关闭边栏"];function N(Q,X){if(!Q||!X)return!1;return Q===X||Q.startsWith(`${X}?`)||Q.startsWith(`${X}#`)}function v(){return`
2
+ const isVisible = (el) => {
3
+ if (!(el instanceof HTMLElement)) return false;
4
+ const style = window.getComputedStyle(el);
5
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
6
+ const rect = el.getBoundingClientRect();
7
+ return rect.width > 0 && rect.height > 0;
8
+ };
9
+
10
+ const markerAttr = ${JSON.stringify("data-opencli-chatgpt-composer")};
11
+ const clearMarkers = (active) => {
12
+ document.querySelectorAll('[' + markerAttr + ']').forEach(node => {
13
+ if (node !== active) node.removeAttribute(markerAttr);
14
+ });
15
+ };
16
+
17
+ const findComposer = () => {
18
+ for (const selector of ${JSON.stringify(x)}) {
19
+ const candidates = Array.from(document.querySelectorAll(selector)).filter(c => c instanceof HTMLElement && isVisible(c));
20
+ const node = candidates.find(c => c.isContentEditable) || candidates[0];
21
+ if (node instanceof HTMLElement) {
22
+ clearMarkers(node);
23
+ node.setAttribute(markerAttr, '1');
24
+ return node;
25
+ }
26
+ }
27
+ return null;
28
+ };
29
+
30
+ findComposer.toString = () => 'findComposer';
31
+ `}export function normalizeBooleanFlag(Q,X=!1){if(typeof Q==="boolean")return Q;if(Q==null||Q==="")return X;const Y=String(Q).trim().toLowerCase();return Y==="true"||Y==="1"||Y==="yes"||Y==="on"}export function requireNonEmptyPrompt(Q,X){const Y=String(Q??"").trim();if(!Y)throw new k(`${X} prompt cannot be empty`,`Example: opencli ${X} "hello"`);return Y}export function requirePositiveInt(Q,X,Y){if(!Number.isInteger(Q)||Q<1)throw new k(`${X} must be a positive integer`,Y);return Q}export function requireNonNegativeInt(Q,X,Y){if(!Number.isInteger(Q)||Q<0)throw new k(`${X} must be a non-negative integer`,Y);return Q}export function unwrapEvaluateResult(Q){if(Q&&!Array.isArray(Q)&&typeof Q==="object"&&"session"in Q&&"data"in Q)return Q.data;return Q}export function requireArrayEvaluateResult(Q,X){if(!Array.isArray(Q)){if(Q&&typeof Q==="object"&&"error"in Q)throw new F(`${X}: ${String(Q.error)}`);throw new F(`${X} returned malformed extraction payload`)}return Q}export function requireObjectEvaluateResult(Q,X){if(!Q||Array.isArray(Q)||typeof Q!=="object")throw new F(`${X} returned malformed extraction payload`);return Q}export function requireBooleanEvaluateResult(Q,X){if(typeof Q!=="boolean")throw new F(`${X} returned malformed extraction payload`);return Q}function u(Q){return Q===CHATGPT_DOMAIN||Q.endsWith(`.${CHATGPT_DOMAIN}`)}function n(Q){const X=String(Q||"").match(/^\/g\/g-p-([a-f0-9]{8,})(?:[-/]|$)/i);return X?X[1].toLowerCase():""}function S(Q){try{const X=new URL(String(Q||""),CHATGPT_URL);if(X.protocol!=="https:"||!u(X.hostname))return"";return n(X.pathname)}catch{return""}}export function parseChatGPTConversationId(Q){const X=String(Q??"").trim();if(/^https?:\/\//i.test(X)){try{const Z=new URL(X);if(Z.protocol!=="https:"||Z.hostname!==CHATGPT_DOMAIN&&!Z.hostname.endsWith(`.${CHATGPT_DOMAIN}`))throw Error("off-domain");const $=Z.pathname.match(/^\/(?:g\/g-p-[^/]+\/)?c\/([A-Za-z0-9_-]{8,})$/);if($)return $[1]}catch{}throw new k("chatgpt detail requires a conversation id or chatgpt.com /c/<id> URL","Example: opencli chatgpt detail https://chatgpt.com/c/123e4567-e89b-12d3-a456-426614174000")}const Y=X.match(/^\/(?:g\/g-p-[^/]+\/)?c\/([A-Za-z0-9_-]{8,})(?:[?#].*)?$/);if(Y)return Y[1];if(/^[A-Za-z0-9_-]{8,}$/.test(X))return X;throw new k("chatgpt detail requires a conversation id or chatgpt.com /c/<id> URL","Example: opencli chatgpt detail 123e4567-e89b-12d3-a456-426614174000")}export async function currentChatGPTUrl(Q){const X=unwrapEvaluateResult(await Q.evaluate("window.location.href").catch(()=>""));return typeof X==="string"?X:""}export async function isOnChatGPT(Q){const X=await currentChatGPTUrl(Q);if(!X)return!1;try{const Y=new URL(X).hostname;return Y===CHATGPT_DOMAIN||Y.endsWith(`.${CHATGPT_DOMAIN}`)}catch{return!1}}const f='#prompt-textarea, [data-testid="prompt-textarea"]',R='a[href*="/c/"]',c='a[href*="/g/g-p-"]';export const CONVERSATION_MESSAGE_SELECTOR='[data-message-author-role], article[data-testid*="conversation-turn"]';export async function ensureOnChatGPT(Q){if(await isOnChatGPT(Q))return!1;await Q.goto(CHATGPT_URL,{settleMs:2000});try{await Q.wait({selector:f,timeout:8})}catch{}return!0}export async function startNewChat(Q){await Q.goto(`${CHATGPT_URL}/new`,{settleMs:2000});try{await Q.wait({selector:f,timeout:8})}catch{}}export async function openChatGPTConversation(Q,X){const Y=parseChatGPTConversationId(X);await Q.goto(`${CHATGPT_URL}/c/${Y}`,{settleMs:2000});try{await Q.wait({selector:f,timeout:8})}catch{}return Y}export async function getPageState(Q){return requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
32
+ const isVisible = (el) => {
33
+ if (!(el instanceof HTMLElement)) return false;
34
+ const style = window.getComputedStyle(el);
35
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
36
+ const rect = el.getBoundingClientRect();
37
+ return rect.width > 0 && rect.height > 0;
38
+ };
39
+ const composerSelectors = ${JSON.stringify(x)};
40
+ const hasComposer = composerSelectors.some((selector) =>
41
+ Array.from(document.querySelectorAll(selector)).some((node) => isVisible(node))
42
+ );
43
+ const text = (document.body?.innerText || '').replace(/\\s+/g, ' ').trim();
44
+ const loginLink = Array.from(document.querySelectorAll('a, button')).find((node) => {
45
+ const label = ((node.innerText || node.textContent || '') + ' ' + (node.getAttribute('aria-label') || '')).trim().toLowerCase();
46
+ return isVisible(node) && /^(log in|login|sign up|sign in)$/.test(label);
47
+ });
48
+ const userMenu = document.querySelector('[data-testid="profile-button"], [aria-label*="Profile"], [aria-label*="Account"], button[id*="headlessui-menu-button"]');
49
+ const hasLoginGate = !!loginLink || /log in to chatgpt|sign up to chatgpt|welcome to chatgpt/i.test(text);
50
+ return {
51
+ url: window.location.href,
52
+ title: document.title,
53
+ hasComposer,
54
+ isLoggedIn: hasComposer || !!userMenu || !hasLoginGate,
55
+ hasLoginGate,
56
+ };
57
+ })()`)),"chatgpt page state")}export async function ensureChatGPTLogin(Q,X="ChatGPT requires a logged-in browser session."){const Y=await getPageState(Q);if(!Y.isLoggedIn||Y.hasLoginGate)throw new _(CHATGPT_DOMAIN,X);return Y}export async function ensureChatGPTComposer(Q,X="ChatGPT composer is not available on the current page."){const Y=await ensureChatGPTLogin(Q,X);if(!Y.hasComposer)throw new F(X);return Y}function o(Q){const X=String(Q??"").trim().toLowerCase(),Y=w[X]||X,Z=I[Y];if(!Z)throw new k(`Unknown ChatGPT model "${Q}"`,`Choose one of: ${CHATGPT_MODEL_CHOICES.join(", ")}`);return{key:Y,alias:X!==Y?X:null,...Z}}function g(Q){const X=String(Q??"").trim().toLowerCase(),Y=G[X];if(!Y)throw new k(`Unknown ChatGPT tool "${Q}"`,`Choose one of: ${CHATGPT_TOOL_CHOICES.join(", ")}`);return{key:X,...Y}}export async function getCurrentChatGPTModel(Q){return requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
58
+ const isVisible = (el) => {
59
+ if (!(el instanceof HTMLElement)) return false;
60
+ const style = window.getComputedStyle(el);
61
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
62
+ const rect = el.getBoundingClientRect();
63
+ return rect.width > 0 && rect.height > 0;
64
+ };
65
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
66
+ const escapeRegExp = (value) => String(value).replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');
67
+ const textMatchesLabel = (text, label) => {
68
+ const normalizedText = normalize(text);
69
+ const normalizedLabel = normalize(label);
70
+ if (!normalizedText || !normalizedLabel) return false;
71
+ if (normalizedText === normalizedLabel) return true;
72
+ if (/^[\\x00-\\x7F]+$/.test(normalizedLabel)) {
73
+ return new RegExp('(^|\\\\b)' + escapeRegExp(normalizedLabel) + '(\\\\b|$)', 'i').test(normalizedText);
74
+ }
75
+ return normalizedText.replace(/\\s+/g, '').includes(normalizedLabel.replace(/\\s+/g, ''));
76
+ };
77
+ const labels = ${JSON.stringify(I)};
78
+ const findEntryForText = (text) => {
79
+ const matches = [];
80
+ for (const [key, value] of Object.entries(labels)) {
81
+ for (const item of value.labels || []) {
82
+ if (textMatchesLabel(text, item)) {
83
+ matches.push({ key, value, length: normalize(item).length });
84
+ }
85
+ }
86
+ }
87
+ matches.sort((a, b) => b.length - a.length);
88
+ return matches[0] || null;
89
+ };
90
+ const form = Array.from(document.querySelectorAll('form')).find((node) => node instanceof HTMLElement && isVisible(node));
91
+ const testIdNode = form
92
+ ? Array.from(form.querySelectorAll('[data-testid]')).find((node) => {
93
+ if (!(node instanceof HTMLElement) || !isVisible(node)) return false;
94
+ const testId = node.getAttribute('data-testid');
95
+ return Object.values(labels).some((entry) => (entry.testIds || []).includes(testId));
96
+ })
97
+ : null;
98
+ const testId = testIdNode?.getAttribute('data-testid') || '';
99
+ const testIdEntry = Object.entries(labels).find(([, value]) => (value.testIds || []).includes(testId));
100
+ if (testIdEntry) {
101
+ return {
102
+ model: testIdEntry[0],
103
+ label: testIdEntry[1].label,
104
+ };
105
+ }
106
+ const button = Array.from((form || document).querySelectorAll('button')).find((node) => {
107
+ if (!isVisible(node)) return false;
108
+ const text = normalize(node.textContent);
109
+ return Object.values(labels).some((entry) => entry.labels.some((label) => textMatchesLabel(text, label)));
110
+ });
111
+ const label = normalize(button?.textContent || '');
112
+ const entry = findEntryForText(label);
113
+ return {
114
+ model: entry?.key ?? null,
115
+ label: entry?.value?.label ?? null,
116
+ };
117
+ })()`)),"chatgpt current model")}export async function selectChatGPTModel(Q,X){const Y=o(X);if(typeof Q.nativeClick!=="function")throw new F("ChatGPT model selection requires native browser click support.");await ensureOnChatGPT(Q);await ensureChatGPTComposer(Q,"ChatGPT model selection requires a logged-in ChatGPT session with a visible composer.");if((await getCurrentChatGPTModel(Q)).model===Y.key)return{Status:"Already selected",Model:Y.label};const $=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
118
+ const isVisible = (el) => {
119
+ if (!(el instanceof HTMLElement)) return false;
120
+ const style = window.getComputedStyle(el);
121
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
122
+ const rect = el.getBoundingClientRect();
123
+ return rect.width > 0 && rect.height > 0;
124
+ };
125
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
126
+ const escapeRegExp = (value) => String(value).replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');
127
+ const textMatchesLabel = (text, label) => {
128
+ const normalizedText = normalize(text);
129
+ const normalizedLabel = normalize(label);
130
+ if (!normalizedText || !normalizedLabel) return false;
131
+ if (normalizedText === normalizedLabel) return true;
132
+ if (/^[\\x00-\\x7F]+$/.test(normalizedLabel)) {
133
+ return new RegExp('(^|\\\\b)' + escapeRegExp(normalizedLabel) + '(\\\\b|$)', 'i').test(normalizedText);
134
+ }
135
+ return normalizedText.replace(/\\s+/g, '').includes(normalizedLabel.replace(/\\s+/g, ''));
136
+ };
137
+ const labels = ${JSON.stringify(Object.values(I).flatMap((z)=>z.labels))};
138
+ const menuButtonSelectors = [
139
+ 'button[data-testid="model-switcher-dropdown-button"]',
140
+ 'button[aria-label*="model" i]',
141
+ 'button[aria-label*="模型"]',
142
+ 'button[aria-label*="智能"]',
143
+ ];
144
+ let button = Array.from(document.querySelectorAll('form button')).find((node) =>
145
+ isVisible(node) && labels.some((label) => textMatchesLabel(node.textContent, label))
146
+ );
147
+ if (!button) {
148
+ button = menuButtonSelectors
149
+ .map((selector) => document.querySelector(selector))
150
+ .find((node) => node instanceof HTMLElement && isVisible(node));
151
+ }
152
+ if (!button) return { found: false };
153
+ button.scrollIntoView({ block: 'center', inline: 'center' });
154
+ const rect = button.getBoundingClientRect();
155
+ return {
156
+ found: true,
157
+ x: Math.round(rect.left + rect.width / 2),
158
+ y: Math.round(rect.top + rect.height / 2),
159
+ };
160
+ })()`)),"chatgpt model menu button");if(!$.found)throw new F("Could not find the ChatGPT model selector in the composer.");await Q.nativeClick(Number($.x),Number($.y));await Q.wait(0.5);let W=null;for(let z=0;z<10;z+=1){W=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
161
+ const isVisible = (el) => {
162
+ if (!(el instanceof HTMLElement)) return false;
163
+ const style = window.getComputedStyle(el);
164
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
165
+ const rect = el.getBoundingClientRect();
166
+ return rect.width > 0 && rect.height > 0;
167
+ };
168
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
169
+ const escapeRegExp = (value) => String(value).replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');
170
+ const textMatchesLabel = (text, label) => {
171
+ const normalizedText = normalize(text);
172
+ const normalizedLabel = normalize(label);
173
+ if (!normalizedText || !normalizedLabel) return false;
174
+ if (normalizedText === normalizedLabel) return true;
175
+ if (/^[\\x00-\\x7F]+$/.test(normalizedLabel)) {
176
+ return new RegExp('(^|\\\\b)' + escapeRegExp(normalizedLabel) + '(\\\\b|$)', 'i').test(normalizedText);
177
+ }
178
+ return normalizedText.replace(/\\s+/g, '').includes(normalizedLabel.replace(/\\s+/g, ''));
179
+ };
180
+ const target = ${JSON.stringify(Y)};
181
+ const clickableSelector = '[role="menuitemradio"], [role="menuitem"], [role="option"], button, [data-testid^="model-switcher"]';
182
+ const intelligenceContent = document.querySelector('[data-testid="composer-intelligence-picker-content"]');
183
+ const intelligenceOptions = intelligenceContent
184
+ ? Array.from(intelligenceContent.querySelectorAll('[role="menuitemradio"]')).filter(isVisible)
185
+ : [];
186
+ let option = null;
187
+ for (const testId of target.testIds || []) {
188
+ option = Array.from(document.querySelectorAll('[data-testid]')).find((candidate) =>
189
+ candidate instanceof HTMLElement && candidate.getAttribute('data-testid') === testId
190
+ ) || null;
191
+ if (option instanceof HTMLElement && isVisible(option)) break;
192
+ option = null;
193
+ }
194
+ const clickables = intelligenceOptions.length ? intelligenceOptions : Array.from(document.querySelectorAll(clickableSelector));
195
+ for (const label of target.optionLabels || target.labels || []) {
196
+ option = clickables.find((candidate) =>
197
+ candidate instanceof HTMLElement
198
+ && isVisible(candidate)
199
+ && textMatchesLabel(candidate.textContent, label)
200
+ ) || null;
201
+ if (option) break;
202
+
203
+ const labelRoot = intelligenceContent || document;
204
+ const labelNode = Array.from(labelRoot.querySelectorAll('span, div, p')).find((candidate) =>
205
+ candidate instanceof HTMLElement
206
+ && isVisible(candidate)
207
+ && textMatchesLabel(candidate.textContent, label)
208
+ );
209
+ option = labelNode?.closest(clickableSelector) || null;
210
+ if (option instanceof HTMLElement && isVisible(option)) break;
211
+ option = null;
212
+ }
213
+ if (!option && Number.isInteger(target.intelligenceOrder)) {
214
+ if (intelligenceOptions.length === 5) {
215
+ option = intelligenceOptions[target.intelligenceOrder] || null;
216
+ }
217
+ }
218
+ if (!(option instanceof HTMLElement) || !isVisible(option)) return { found: false };
219
+ option.scrollIntoView({ block: 'center', inline: 'center' });
220
+ const rect = option.getBoundingClientRect();
221
+ return {
222
+ found: true,
223
+ x: Math.round(rect.left + rect.width / 2),
224
+ y: Math.round(rect.top + rect.height / 2),
225
+ };
226
+ })()`)),"chatgpt model option click");if(W.found)break;await Q.wait(0.5)}if(!W?.found)throw new F(`Could not click the ChatGPT ${Y.label} model option.`);await Q.nativeClick(Number(W.x),Number(W.y));await Q.wait(0.5);if((await getCurrentChatGPTModel(Q)).model!==Y.key){await Q.nativeClick(Number($.x),Number($.y));await Q.wait(0.5);const z=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
227
+ const isVisible = (el) => {
228
+ if (!(el instanceof HTMLElement)) return false;
229
+ const style = window.getComputedStyle(el);
230
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
231
+ const rect = el.getBoundingClientRect();
232
+ return rect.width > 0 && rect.height > 0;
233
+ };
234
+ const target = ${JSON.stringify(Y)};
235
+ const intelligenceContent = document.querySelector('[data-testid="composer-intelligence-picker-content"]');
236
+ const options = intelligenceContent
237
+ ? Array.from(intelligenceContent.querySelectorAll('[role="menuitemradio"]')).filter(isVisible)
238
+ : [];
239
+ const checkedIndex = options.findIndex((node) => node.getAttribute('aria-checked') === 'true');
240
+ return {
241
+ recognized: options.length === 5 && Number.isInteger(target.intelligenceOrder),
242
+ checkedIndex,
243
+ };
244
+ })()`)),"chatgpt model checked intelligence option");if(z.recognized&&z.checkedIndex===Y.intelligenceOrder){await Q.nativeClick(Number($.x),Number($.y));return{Status:"Success",Model:Y.label}}await Q.nativeClick(Number($.x),Number($.y));throw new F(`ChatGPT model did not switch to ${Y.label}.`)}return{Status:"Success",Model:Y.label}}export async function getCurrentChatGPTTool(Q){return requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
245
+ const isVisible = (el) => {
246
+ if (!(el instanceof HTMLElement)) return false;
247
+ const style = window.getComputedStyle(el);
248
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
249
+ const rect = el.getBoundingClientRect();
250
+ return rect.width > 0 && rect.height > 0;
251
+ };
252
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
253
+ const labels = ${JSON.stringify(G)};
254
+ const form = Array.from(document.querySelectorAll('form')).find((node) => node instanceof HTMLElement && isVisible(node));
255
+ const root = form || document.body;
256
+ const nodes = Array.from(root.querySelectorAll('button, [role="button"], [role="menuitemradio"], span, div'));
257
+ const node = nodes.find((candidate) => {
258
+ if (!isVisible(candidate)) return false;
259
+ const text = normalize(candidate.textContent);
260
+ return Object.values(labels).some((entry) => entry.labels.includes(text));
261
+ });
262
+ const label = normalize(node?.textContent || '');
263
+ const entry = Object.entries(labels).find(([, value]) => value.labels.includes(label));
264
+ return {
265
+ tool: entry?.[0] ?? null,
266
+ label: entry?.[1]?.label ?? null,
267
+ };
268
+ })()`)),"chatgpt current tool")}export async function selectChatGPTTool(Q,X){const Y=g(X);if(typeof Q.nativeClick!=="function")throw new F("ChatGPT tool selection requires native browser click support.");await ensureOnChatGPT(Q);await ensureChatGPTComposer(Q,"ChatGPT tool selection requires a logged-in ChatGPT session with a visible composer.");if((await getCurrentChatGPTTool(Q)).tool===Y.key)return{Status:"Already selected",Tool:Y.label};const $=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
269
+ const isVisible = (el) => {
270
+ if (!(el instanceof HTMLElement)) return false;
271
+ const style = window.getComputedStyle(el);
272
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
273
+ const rect = el.getBoundingClientRect();
274
+ return rect.width > 0 && rect.height > 0;
275
+ };
276
+ const button = document.querySelector('button[data-testid="composer-plus-btn"]');
277
+ if (!(button instanceof HTMLElement) || !isVisible(button)) return { found: false };
278
+ button.scrollIntoView({ block: 'center', inline: 'center' });
279
+ const rect = button.getBoundingClientRect();
280
+ return {
281
+ found: true,
282
+ x: Math.round(rect.left + rect.width / 2),
283
+ y: Math.round(rect.top + rect.height / 2),
284
+ };
285
+ })()`)),"chatgpt tools menu button");if(!$.found)throw new F("Could not find the ChatGPT tools menu button in the composer.");await Q.nativeClick(Number($.x),Number($.y));await Q.wait(0.5);let W=null;for(let z=0;z<10;z+=1){W=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
286
+ const isVisible = (el) => {
287
+ if (!(el instanceof HTMLElement)) return false;
288
+ const style = window.getComputedStyle(el);
289
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
290
+ const rect = el.getBoundingClientRect();
291
+ return rect.width > 0 && rect.height > 0;
292
+ };
293
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
294
+ const labels = ${JSON.stringify(Y.labels)};
295
+ const options = Array.from(document.querySelectorAll('[role="menuitemradio"]'));
296
+ const option = options.find((node) => node instanceof HTMLElement && isVisible(node) && labels.includes(normalize(node.textContent)));
297
+ if (!(option instanceof HTMLElement)) return { found: false };
298
+ const checked = option.getAttribute('aria-checked') === 'true';
299
+ option.scrollIntoView({ block: 'center', inline: 'center' });
300
+ const rect = option.getBoundingClientRect();
301
+ return {
302
+ found: true,
303
+ checked,
304
+ x: Math.round(rect.left + rect.width / 2),
305
+ y: Math.round(rect.top + rect.height / 2),
306
+ };
307
+ })()`)),"chatgpt tool option click");if(W.found)break;await Q.wait(0.5)}if(!W?.found)throw new F(`Could not find the ChatGPT ${Y.label} tool option.`);if(!W.checked)await Q.nativeClick(Number(W.x),Number(W.y));await Q.wait(0.5);if((await getCurrentChatGPTTool(Q)).tool!==Y.key)throw new F(`ChatGPT tool did not switch to ${Y.label}.`);return{Status:W.checked?"Already selected":"Success",Tool:Y.label}}export async function clearChatGPTDraft(Q){await Q.evaluate(`
308
+ (() => {
309
+ const removeLabels = [/^remove file/i, /^移除文件/];
310
+ for (let pass = 0; pass < 10; pass += 1) {
311
+ const button = Array.from(document.querySelectorAll('button')).find((node) => {
312
+ const label = node.getAttribute('aria-label') || '';
313
+ return removeLabels.some((pattern) => pattern.test(label));
314
+ });
315
+ if (!button) break;
316
+ button.click();
317
+ }
318
+
319
+ const selectors = ${JSON.stringify(x)};
320
+ for (const selector of selectors) {
321
+ for (const node of document.querySelectorAll(selector)) {
322
+ if (!(node instanceof HTMLElement)) continue;
323
+ if (node instanceof HTMLTextAreaElement || node instanceof HTMLInputElement) {
324
+ node.value = '';
325
+ } else if (node.isContentEditable) {
326
+ node.textContent = '';
327
+ node.innerHTML = '<p><br></p>';
328
+ } else {
329
+ node.textContent = '';
330
+ }
331
+ node.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward', data: null }));
332
+ node.dispatchEvent(new Event('change', { bubbles: true }));
333
+ }
334
+ }
335
+ })()
336
+ `);await Q.wait(0.5)}export function parseChatGPTProjectId(Q){const X=String(Q??"").trim();if(/^https?:\/\//i.test(X)||X.startsWith("/")){const Z=S(X);if(Z)return Z;throw new k("chatgpt project commands require a chatgpt.com project id or /g/g-p-<id> URL","Example: opencli chatgpt project-file-add report.pdf --id 12345678")}const Y=X.match(/^g-p-([a-f0-9]{8,})/i);if(Y)return Y[1].toLowerCase();if(/^[a-f0-9]{8,}$/i.test(X))return X.toLowerCase();throw new k("chatgpt project commands require a project id or /g/g-p-<id> URL","Example: opencli chatgpt project-file-add report.pdf --id 12345678")}export async function sendChatGPTMessage(Q,X){await Q.evaluate(`
337
+ (() => {
338
+ const labels = ${JSON.stringify(A)};
339
+ const closeBtn = Array.from(document.querySelectorAll('button')).find(b => labels.includes(b.getAttribute('aria-label') || ''));
340
+ if (closeBtn) closeBtn.click();
341
+ })()
342
+ `);const Y=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
343
+ (() => {
344
+ ${v()}
345
+ const composer = findComposer();
346
+ if (!composer) return { ready: false };
347
+ composer.focus();
348
+ if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
349
+ composer.value = '';
350
+ } else if (composer.isContentEditable) {
351
+ composer.textContent = '';
352
+ composer.innerHTML = '<p><br></p>';
353
+ } else {
354
+ composer.textContent = '';
355
+ }
356
+ composer.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward', data: null }));
357
+ composer.dispatchEvent(new Event('change', { bubbles: true }));
358
+ composer.scrollIntoView({ block: 'center', inline: 'center' });
359
+ const rect = composer.getBoundingClientRect();
360
+ return {
361
+ ready: true,
362
+ x: Math.round(rect.left + Math.max(8, Math.min(rect.width / 2, rect.width - 8))),
363
+ y: Math.round(rect.top + Math.max(8, Math.min(rect.height / 2, rect.height - 8))),
364
+ };
365
+ })()
366
+ `)),"chatgpt composer readiness");if(!Y.ready)return!1;try{if(Q.nativeType){if(typeof Q.nativeClick==="function"){await Q.nativeClick(Number(Y.x),Number(Y.y));await Q.wait(0.2)}await Q.nativeType(X)}else throw Error("nativeType unavailable")}catch($){await Q.evaluate(`
367
+ (() => {
368
+ var composer = null;
369
+ var sels = ${JSON.stringify(x)};
370
+ for (var si = 0; si < sels.length; si++) { composer = document.querySelector(sels[si]); if (composer) break; }
371
+ if (!composer) return;
372
+ composer.focus();
373
+ document.execCommand('insertText', false, ${JSON.stringify(X)});
374
+ })()
375
+ `)}let Z=null;for(let $=0;$<20;$+=1){await Q.wait(0.5);Z=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
376
+ (() => {
377
+ const isVisible = (el) => {
378
+ if (!(el instanceof HTMLElement)) return false;
379
+ const style = window.getComputedStyle(el);
380
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
381
+ const rect = el.getBoundingClientRect();
382
+ return rect.width > 0 && rect.height > 0;
383
+ };
384
+ const isUsable = (button) => button
385
+ && isVisible(button)
386
+ && !button.disabled
387
+ && button.getAttribute('aria-disabled') !== 'true';
388
+ const form = Array.from(document.querySelectorAll('form')).find((node) => node instanceof HTMLElement && isVisible(node));
389
+ const root = form || document.body;
390
+ const primary = root.querySelector(${JSON.stringify(U)})
391
+ || ${JSON.stringify(L)}.map(selector => root.querySelector(selector)).find(Boolean);
392
+ const btns = Array.from(root.querySelectorAll('button'));
393
+ const labels = ${JSON.stringify(y)};
394
+ const looksLikeSend = (button) => {
395
+ const label = button.getAttribute('aria-label') || '';
396
+ const text = (button.innerText || button.textContent || '').replace(/\\s+/g, ' ').trim();
397
+ return labels.includes(label) || labels.includes(text) || /send|发送/i.test(label) || /send|发送/i.test(text);
398
+ };
399
+ const sendBtn = isUsable(primary)
400
+ ? primary
401
+ : btns.find(b => looksLikeSend(b) && isUsable(b));
402
+ return { sendBtnFound: !!sendBtn };
403
+ })()
404
+ `)),"chatgpt send button readiness");if(Z?.sendBtnFound)break}if(!Z?.sendBtnFound)return!1;await Q.evaluate(`
405
+ (() => {
406
+ const isVisible = (el) => {
407
+ if (!(el instanceof HTMLElement)) return false;
408
+ const style = window.getComputedStyle(el);
409
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
410
+ const rect = el.getBoundingClientRect();
411
+ return rect.width > 0 && rect.height > 0;
412
+ };
413
+ const isUsable = (button) => button
414
+ && isVisible(button)
415
+ && !button.disabled
416
+ && button.getAttribute('aria-disabled') !== 'true';
417
+ const form = Array.from(document.querySelectorAll('form')).find((node) => node instanceof HTMLElement && isVisible(node));
418
+ const root = form || document.body;
419
+ const primary = root.querySelector(${JSON.stringify(U)})
420
+ || ${JSON.stringify(L)}.map(selector => root.querySelector(selector)).find(Boolean);
421
+ const labels = ${JSON.stringify(y)};
422
+ const looksLikeSend = (button) => {
423
+ const label = button.getAttribute('aria-label') || '';
424
+ const text = (button.innerText || button.textContent || '').replace(/\\s+/g, ' ').trim();
425
+ return labels.includes(label) || labels.includes(text) || /send|发送/i.test(label) || /send|发送/i.test(text);
426
+ };
427
+ const sendBtn = isUsable(primary)
428
+ ? primary
429
+ : Array.from(root.querySelectorAll('button')).find(b => looksLikeSend(b) && isUsable(b));
430
+ if (sendBtn) sendBtn.click();
431
+ })()
432
+ `);return!0}export async function getVisibleMessages(Q){return requireArrayEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
433
+ const isVisible = (el) => {
434
+ if (!(el instanceof HTMLElement)) return false;
435
+ const style = window.getComputedStyle(el);
436
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
437
+ const rect = el.getBoundingClientRect();
438
+ return rect.width > 0 && rect.height > 0;
439
+ };
440
+ const normalize = (value) => String(value || '').replace(/\\u00a0/g, ' ').replace(/[ \\t]+\\n/g, '\\n').replace(/\\n{3,}/g, '\\n\\n').trim();
441
+ const roleOf = (node) => {
442
+ const attr = node.getAttribute('data-message-author-role') || node.getAttribute('data-author') || '';
443
+ if (/assistant/i.test(attr)) return 'Assistant';
444
+ if (/user/i.test(attr)) return 'User';
445
+ const testid = node.getAttribute('data-testid') || '';
446
+ if (/assistant/i.test(testid)) return 'Assistant';
447
+ if (/user/i.test(testid)) return 'User';
448
+ const label = node.getAttribute('aria-label') || '';
449
+ if (/assistant|chatgpt/i.test(label)) return 'Assistant';
450
+ if (/you|user/i.test(label)) return 'User';
451
+ return '';
452
+ };
453
+
454
+ let nodes = Array.from(document.querySelectorAll('[data-message-author-role], article[data-testid*="conversation-turn"]'));
455
+ nodes = nodes.filter((node) => node instanceof HTMLElement && isVisible(node));
456
+
457
+ const rows = [];
458
+ const seen = new Set();
459
+ for (const node of nodes) {
460
+ let role = roleOf(node);
461
+ const roleNode = node.querySelector('[data-message-author-role], [data-author]');
462
+ if (!role && roleNode) role = roleOf(roleNode);
463
+ if (!role) continue;
464
+
465
+ const contentNode = node.querySelector('[data-message-author-role] .markdown')
466
+ || node.querySelector('.markdown')
467
+ || node.querySelector('[data-message-author-role]')
468
+ || node;
469
+ const html = contentNode instanceof HTMLElement ? (contentNode.innerHTML || '') : '';
470
+ const text = normalize(contentNode instanceof HTMLElement ? (contentNode.innerText || contentNode.textContent || '') : '');
471
+ if (!text) continue;
472
+ const key = role + '\\n' + text;
473
+ if (seen.has(key)) continue;
474
+ seen.add(key);
475
+ rows.push({ role, text, html });
476
+ }
477
+ return rows;
478
+ })()`)),"chatgpt visible messages").map((Y,Z)=>({Index:Z+1,Role:Y?.role==="Assistant"?"Assistant":"User",Text:String(Y?.text||"").trim(),Html:String(Y?.html||"")})).filter((Y)=>Y.Text)}function h(Q,{wantMarkdown:X,generating:Y,stableSeconds:Z}){return Q.map(($)=>({Index:$.Index,Role:$.Role,Text:X&&$.Role==="Assistant"&&$.Html?messageHtmlToMarkdown($.Html)||$.Text:$.Text,Generating:Y,StableSeconds:Z}))}export async function getChatGPTDetailRows(Q,{wantMarkdown:X=!1,stableSeconds:Y=0}={}){const Z=await isGenerating(Q),$=await getVisibleMessages(Q);return{messages:$,rows:h($,{wantMarkdown:X,generating:Z,stableSeconds:Y}),generating:Z}}export async function waitForChatGPTDetailRows(Q,{wantMarkdown:X=!1,timeoutSeconds:Y=120,stableSeconds:Z=6}={}){const $=Date.now();let W="",V=0;while(Date.now()-$<Y*1000){const z=await isGenerating(Q),q=await getVisibleMessages(Q),j=JSON.stringify(q.map((J)=>[J.Role,J.Text]));if(!z&&q.length&&q[q.length-1]?.Role==="Assistant")if(j===W){if(!V)V=Date.now();const J=Math.floor((Date.now()-V)/1000);if(J>=Z)return{messages:q,rows:h(q,{wantMarkdown:X,generating:!1,stableSeconds:J}),generating:!1}}else{W=j;V=Date.now()}else{W=j;V=0}await Q.wait(3)}throw new O("chatgpt detail",Y,"Conversation did not finish or stabilize before timeout. Re-run with a higher --timeout if it is still generating.")}export function messageHtmlToMarkdown(Q){try{return i(Q).trim()}catch{return String(Q||"").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim()}}export async function getBubbleCount(Q){return(await getVisibleMessages(Q)).length}function M(Q){return String(Q||"").replace(/\s+/g," ").trim()}function E(Q,X){return JSON.stringify([M(Q?.Text),String(X?.Text||"").trim()])}export function getChatGPTResponsePairKeys(Q,X){const Y=M(X);if(!Y)return[];const Z=[];for(let $=0;$<Q.length;$+=1){const W=Q[$];if(W?.Role!=="User"||M(W.Text)!==Y)continue;const V=Q.slice($+1).find((z)=>z?.Role==="Assistant");if(!V||!String(V.Text||"").trim())continue;Z.push(E(W,V))}return Z}export function getChatGPTResponsePairCounts(Q,X){const Y=new Map;for(const Z of getChatGPTResponsePairKeys(Q,X))Y.set(Z,(Y.get(Z)||0)+1);return Y}function l(Q){if(Q.baselinePairCounts instanceof Map)return Q.baselinePairCounts;return new Map(Array.from(Q.baselinePairKeys||[]).map((X)=>[X,1]))}function r(Q,X,Y){const Z=M(X);if(!Z)return"";const $=getChatGPTResponsePairCounts(Q,X);for(let W=Q.length-1;W>=0;W-=1){const V=Q[W];if(V?.Role!=="User"||M(V.Text)!==Z)continue;const z=Q.findIndex((J,K)=>K>W&&J?.Role==="Assistant"&&String(J.Text||"").trim());if(z<0)continue;const q=Q[z],j=E(V,q);if(($.get(j)||0)<=(Y.get(j)||0))continue;return String(q.Text||"").trim()}return""}export async function waitForChatGPTResponse(Q,X,Y,Z,$={}){const W=Date.now();let V="",z=0;const q=l($);while(Date.now()-W<Z*1000){await Q.wait(3);if($.conversationUrl){const K=await currentChatGPTUrl(Q);if(K&&!N(K,$.conversationUrl))throw new F(`ChatGPT navigated away from the target conversation (${$.conversationUrl}); current URL is ${K}`)}if(await isGenerating(Q)){z=0;continue}const j=await getVisibleMessages(Q),J=r(j,Y,q);if(!J||J===String(Y||"").trim())continue;if(J===V){z+=1;if(z>=2)return J}else{V=J;z=0}}throw new O("chatgpt ask",Z,"No ChatGPT response appeared before timeout. Re-run with a higher --timeout if it is still generating.")}export async function getConversationList(Q){await ensureOnChatGPT(Q);if(requireBooleanEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
479
+ const button = Array.from(document.querySelectorAll('button'))
480
+ .find((node) => /open sidebar/i.test(node.getAttribute('aria-label') || ''));
481
+ if (button instanceof HTMLElement) {
482
+ button.click();
483
+ return true;
484
+ }
485
+ return false;
486
+ })()`)),"chatgpt sidebar open state"))try{await Q.wait({selector:R,timeout:3})}catch{}let Y=await C(Q);if(!Y.length){await Q.goto(CHATGPT_URL,{settleMs:2000});try{await Q.wait({selector:R,timeout:8})}catch{}Y=await C(Q)}return Y}async function C(Q){return requireArrayEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
487
+ const isVisible = (el) => {
488
+ if (!(el instanceof HTMLElement)) return false;
489
+ const style = window.getComputedStyle(el);
490
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
491
+ const rect = el.getBoundingClientRect();
492
+ return rect.width > 0 && rect.height > 0;
493
+ };
494
+ const links = Array.from(document.querySelectorAll('a[href*="/c/"]'))
495
+ .filter((link) => link instanceof HTMLAnchorElement && isVisible(link));
496
+ const seen = new Set();
497
+ const rows = [];
498
+ for (const link of links) {
499
+ const href = link.getAttribute('href') || '';
500
+ const match = href.match(/\\/c\\/([^/?#]+)/);
501
+ if (!match || seen.has(match[1])) continue;
502
+ seen.add(match[1]);
503
+ const title = (link.innerText || link.textContent || '').replace(/\\s+/g, ' ').trim() || '(untitled)';
504
+ rows.push({
505
+ Id: match[1],
506
+ Title: title,
507
+ Url: href.startsWith('http') ? href : ('${CHATGPT_URL}' + href),
508
+ });
509
+ }
510
+ return rows;
511
+ })()`)),"chatgpt conversation link extraction").map((Y,Z)=>({Index:Z+1,Id:String(Y?.Id||""),Title:String(Y?.Title||"(untitled)").trim()||"(untitled)",Url:String(Y?.Url||"")})).filter((Y)=>Y.Id)}function P(Q){const X=String(Q||"").toLowerCase();if(X.endsWith(".png"))return"image/png";if(X.endsWith(".webp"))return"image/webp";if(X.endsWith(".gif"))return"image/gif";if(X.endsWith(".heic"))return"image/heic";if(X.endsWith(".heif"))return"image/heif";return"image/jpeg"}export async function prepareChatGPTImagePaths(Q){const X=await import("node:fs"),Y=await import("node:path"),Z=Q.map((W)=>Y.default.resolve(W)),$=new Set([".jpg",".jpeg",".png",".webp",".gif",".heic",".heif"]);for(const W of Z){if(!X.default.existsSync(W))return{ok:!1,reason:`Image not found: ${W}`};const V=X.default.statSync(W);if(!V.isFile())return{ok:!1,reason:`Not a file: ${W}`};if(V.size>26214400)return{ok:!1,reason:`Image too large (${(V.size/1024/1024).toFixed(1)} MB). Max: 25 MB`};const z=Y.default.extname(W).toLowerCase();if(!$.has(z))return{ok:!1,reason:`Unsupported image type: ${W}`}}return{ok:!0,paths:Z}}async function p(Q,X){const Y=JSON.stringify(X);for(let Z=0;Z<10;Z+=1){await Q.wait(1);if(requireBooleanEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
512
+ (() => {
513
+ const names = ${Y};
514
+ const text = document.body ? (document.body.innerText || '') : '';
515
+ const matchedNames = names.filter(name => text.includes(name)).length;
516
+ if (matchedNames >= names.length) return true;
517
+
518
+ const composer = document.querySelector('[aria-label="Chat with ChatGPT"], [placeholder="Ask anything"], #prompt-textarea');
519
+ let root = composer;
520
+ for (let i = 0; i < 6 && root && root.parentElement; i += 1) root = root.parentElement;
521
+ const scope = root || document.body;
522
+ if (!scope) return false;
523
+
524
+ const isVisibleMedia = (node) => {
525
+ if (!(node instanceof HTMLElement)) return false;
526
+ const style = window.getComputedStyle(node);
527
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
528
+ const rect = node.getBoundingClientRect();
529
+ const width = node.naturalWidth || node.videoWidth || rect.width || 0;
530
+ const height = node.naturalHeight || node.videoHeight || rect.height || 0;
531
+ if (width > 32 && height > 32) return true;
532
+ const backgroundImage = style.backgroundImage || '';
533
+ return /url\\(/.test(backgroundImage) && rect.width > 32 && rect.height > 32;
534
+ };
535
+ const previewNodes = Array.from(scope.querySelectorAll('img[src], canvas, video, [style*="background-image"]')).filter(isVisibleMedia);
536
+ return previewNodes.length >= names.length;
537
+ })()
538
+ `)),"chatgpt upload preview detection"))return!0}return!1}export async function uploadChatGPTImages(Q,X){const Y=await import("node:fs"),Z=await import("node:path"),$=await prepareChatGPTImagePaths(X);if(!$.ok)return $;const W=$.paths,V=W.map((j)=>Z.default.basename(j));let z=!1;if(Q.setFileInput)try{await Q.setFileInput(W,'input[type="file"]');z=!0}catch(j){const J=String(j?.message||j);if(!J.includes("Unknown action")&&!J.includes("not supported")&&!J.includes("Not allowed")&&!J.includes("No element found"))throw j}if(!z){const j=W.map((K)=>({name:Z.default.basename(K),mime:P(K),base64:Y.default.readFileSync(K).toString("base64")})),J=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
539
+ (() => {
540
+ const files = ${JSON.stringify(j)};
541
+ const input = document.querySelector('input[type="file"]');
542
+ if (!(input instanceof HTMLInputElement)) {
543
+ return { ok: false, reason: 'file input not found' };
544
+ }
545
+
546
+ const dt = new DataTransfer();
547
+ for (const item of files) {
548
+ const binary = atob(item.base64);
549
+ const bytes = new Uint8Array(binary.length);
550
+ for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
551
+ dt.items.add(new File([bytes], item.name, { type: item.mime }));
552
+ }
553
+ input.files = dt.files;
554
+
555
+ const propsKey = Object.keys(input).find(key => key.startsWith('__reactProps$'));
556
+ if (propsKey && input[propsKey] && typeof input[propsKey].onChange === 'function') {
557
+ const nativeEvent = new Event('change', { bubbles: true });
558
+ input[propsKey].onChange({
559
+ target: input,
560
+ currentTarget: input,
561
+ nativeEvent,
562
+ preventDefault() {},
563
+ stopPropagation() {},
564
+ isDefaultPrevented() { return false; },
565
+ isPropagationStopped() { return false; },
566
+ persist() {},
567
+ });
568
+ } else {
569
+ input.dispatchEvent(new Event('input', { bubbles: true }));
570
+ input.dispatchEvent(new Event('change', { bubbles: true }));
571
+ }
572
+ return { ok: true };
573
+ })()
574
+ `)),"chatgpt image upload fallback");if(J&&!J.ok)return J}if(!await p(Q,V))return{ok:!1,reason:"image upload preview did not appear"};return{ok:!0,files:W}}export async function isGenerating(Q){return requireBooleanEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
575
+ (() => {
576
+ const text = (document.body?.innerText || '').replace(/\\s+/g, ' ');
577
+ if (/正在思考|停止生成|Thinking/.test(text)) return true;
578
+ return Array.from(document.querySelectorAll('button')).some(b => {
579
+ const label = b.getAttribute('aria-label') || '';
580
+ return label === 'Stop generating'
581
+ || label.includes('Thinking')
582
+ || label.includes('停止生成')
583
+ || label.includes('正在思考');
584
+ });
585
+ })()
586
+ `)),"chatgpt generation state")}export async function getChatGPTVisibleImageUrls(Q){return requireArrayEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
587
+ (() => {
588
+ const isVisible = (el) => {
589
+ if (!(el instanceof HTMLElement)) return false;
590
+ const style = window.getComputedStyle(el);
591
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
592
+ const rect = el.getBoundingClientRect();
593
+ return rect.width > 32 && rect.height > 32;
594
+ };
595
+
596
+ const urls = [];
597
+ const seen = new Set();
598
+ const normalizeUrl = (value) => {
599
+ const raw = String(value || '').trim();
600
+ if (!raw || raw === 'none') return '';
601
+ if (/^(?:https?:|blob:|data:)/i.test(raw)) return raw;
602
+ try {
603
+ return new URL(raw, window.location.href).href;
604
+ } catch {
605
+ return raw;
606
+ }
607
+ };
608
+ const addUrl = (value) => {
609
+ const src = normalizeUrl(value);
610
+ if (!src || seen.has(src)) return;
611
+ seen.add(src);
612
+ urls.push(src);
613
+ };
614
+ const isDecorative = (el, src = '') => {
615
+ const alt = (el.getAttribute('alt') || '').toLowerCase();
616
+ const cls = String(el.className || '').toLowerCase();
617
+ const testId = (el.getAttribute('data-testid') || '').toLowerCase();
618
+ const label = (el.getAttribute('aria-label') || '').toLowerCase();
619
+ const text = [alt, cls, testId, label, src.toLowerCase()].join(' ');
620
+ return /avatar|profile|logo|icon/.test(text);
621
+ };
622
+ const isUserUploadPreview = (img) => {
623
+ const alt = (img.getAttribute('alt') || '').toLowerCase();
624
+ const turn = img.closest('section[data-testid^="conversation-turn"]');
625
+ const heading = (turn?.querySelector('h4')?.innerText || '').toLowerCase();
626
+ if (/you said|你说/.test(heading)) return true;
627
+ if (/chatgpt|assistant|助手/.test(heading)) return false;
628
+ const openButtonLabel = (img.closest('button[aria-label^="Open image:"]')?.getAttribute('aria-label') || '').toLowerCase();
629
+ const previewText = [alt, openButtonLabel].join(' ');
630
+ return /.(png|jpe?g|webp|gif|heic|heif)(?:\b|$)/i.test(previewText)
631
+ || /ref-|reference|参考|upload|uploaded|attachment/.test(previewText);
632
+ };
633
+
634
+ const imgs = Array.from(document.querySelectorAll('img')).filter(img =>
635
+ img instanceof HTMLImageElement && isVisible(img)
636
+ );
637
+
638
+ for (const img of imgs) {
639
+ const src = img.currentSrc || img.src || '';
640
+ const width = img.naturalWidth || img.width || 0;
641
+ const height = img.naturalHeight || img.height || 0;
642
+
643
+ if (!src) continue;
644
+ if (isDecorative(img, src)) continue;
645
+ if (isUserUploadPreview(img)) continue;
646
+ if (width < 128 && height < 128) continue;
647
+ addUrl(src);
648
+ }
649
+
650
+ // ChatGPT occasionally renders generated images as CSS background
651
+ // thumbnails instead of plain <img> nodes. Treat visible, large
652
+ // background images as generated-image candidates too.
653
+ for (const el of Array.from(document.querySelectorAll('[style*="background-image"], [style*="background"]'))) {
654
+ if (!(el instanceof HTMLElement) || !isVisible(el) || isDecorative(el)) continue;
655
+ const rect = el.getBoundingClientRect();
656
+ if (rect.width < 128 && rect.height < 128) continue;
657
+ const backgroundImage = window.getComputedStyle(el).backgroundImage || '';
658
+ for (const match of backgroundImage.matchAll(/url\\((['"]?)(.*?)\\1\\)/g)) {
659
+ const src = match[2];
660
+ if (!src || isDecorative(el, src)) continue;
661
+ addUrl(src);
662
+ }
663
+ }
664
+
665
+ // Some ChatGPT image surfaces mount large transparent canvases as
666
+ // placeholders/overlays before the real backend image is ready. If
667
+ // those data URLs are accepted as generated assets, the adapter can
668
+ // save a blank transparent PNG while reporting success. Prefer real
669
+ // <img>/background URLs; only keep a canvas if it contains at least
670
+ // one non-transparent/non-white sampled pixel.
671
+ for (const canvas of Array.from(document.querySelectorAll('canvas'))) {
672
+ if (!(canvas instanceof HTMLCanvasElement) || !isVisible(canvas) || isDecorative(canvas)) continue;
673
+ const width = canvas.width || canvas.getBoundingClientRect().width || 0;
674
+ const height = canvas.height || canvas.getBoundingClientRect().height || 0;
675
+ if (width < 128 && height < 128) continue;
676
+ try {
677
+ const ctx = canvas.getContext('2d', { willReadFrequently: true });
678
+ if (!ctx) continue;
679
+ const sourceWidth = Math.max(1, Math.floor(canvas.width || width));
680
+ const sourceHeight = Math.max(1, Math.floor(canvas.height || height));
681
+ const xCount = Math.min(sourceWidth, 16);
682
+ const yCount = Math.min(sourceHeight, 16);
683
+ let hasContent = false;
684
+ for (let yi = 0; yi < yCount && !hasContent; yi += 1) {
685
+ const y = Math.min(sourceHeight - 1, Math.floor((yi + 0.5) * sourceHeight / yCount));
686
+ for (let xi = 0; xi < xCount && !hasContent; xi += 1) {
687
+ const x = Math.min(sourceWidth - 1, Math.floor((xi + 0.5) * sourceWidth / xCount));
688
+ const pixel = ctx.getImageData(x, y, 1, 1).data;
689
+ const r = pixel[0];
690
+ const g = pixel[1];
691
+ const b = pixel[2];
692
+ const a = pixel[3];
693
+ if (a > 0 && !(r > 248 && g > 248 && b > 248)) {
694
+ hasContent = true;
695
+ break;
696
+ }
697
+ }
698
+ }
699
+ if (hasContent) addUrl(canvas.toDataURL('image/png'));
700
+ } catch { }
701
+ }
702
+ return urls;
703
+ })()
704
+ `)),"chatgpt visible image url extraction")}export async function waitForChatGPTImages(Q,X,Y,Z){const $=new Set(X),W=3,V=Math.max(1,Math.ceil(Y/W));let z=[],q=0;for(let j=0;j<V;j++){await Q.wait(j===0?3:W);let J="";if(Z&&Z.includes("/c/")){J=unwrapEvaluateResult(await Q.evaluate("window.location.href").catch(()=>""));if(J&&!N(J,Z)){await Q.goto(Z);await Q.wait(3)}}if(await isGenerating(Q))continue;if(Z&&Z.includes("/c/")&&j>0&&j%5===0){if(!J||N(J,Z)){await Q.goto(Z);await Q.wait(3)}}const B=(await getChatGPTVisibleImageUrls(Q)).filter((b)=>!$.has(b));if(B.length===0)continue;const H=B.join(`
705
+ `),D=z.join(`
706
+ `);if(H===D)q+=1;else{z=B;q=1}if(q>=2||j===V-1)return z}return z}export async function getProjectList(Q){await ensureOnChatGPT(Q);if(requireBooleanEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
707
+ const button = Array.from(document.querySelectorAll('button'))
708
+ .find((node) => /open sidebar/i.test(node.getAttribute('aria-label') || ''));
709
+ if (button instanceof HTMLElement) {
710
+ button.click();
711
+ return true;
712
+ }
713
+ return false;
714
+ })()`)),"chatgpt sidebar open state"))await Q.wait(0.5);await Q.evaluate(`(() => {
715
+ var btn = Array.from(document.querySelectorAll('button')).find(function(b) {
716
+ var text = (b.innerText || '').trim();
717
+ return text === 'Show more' || text === '显示更多' || text === '查看更多';
718
+ });
719
+ if (btn instanceof HTMLElement) {
720
+ btn.click();
721
+ }
722
+ })()`);await Q.wait(0.5);let Y=await T(Q);if(!Y.length){await Q.goto(CHATGPT_URL,{settleMs:2000});await Q.wait(1);await Q.evaluate(`(() => {
723
+ var btn = Array.from(document.querySelectorAll('button')).find(function(b) {
724
+ var text = (b.innerText || '').trim();
725
+ return text === 'Show more' || text === '显示更多' || text === '查看更多';
726
+ });
727
+ if (btn instanceof HTMLElement) {
728
+ btn.click();
729
+ }
730
+ })()`);await Q.wait(0.5);Y=await T(Q)}return Y}async function T(Q){return requireArrayEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`(() => {
731
+ const projectLinkSelector = ${JSON.stringify(c)};
732
+ const isVisible = (el) => {
733
+ if (!(el instanceof HTMLElement)) return false;
734
+ const style = window.getComputedStyle(el);
735
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
736
+ const rect = el.getBoundingClientRect();
737
+ return rect.width > 0 && rect.height > 0;
738
+ };
739
+ const cleanText = (value) => String(value || '').replace(new RegExp('\\\\s+', 'g'), ' ').trim();
740
+ const trustedHost = (hostname) => hostname === '${CHATGPT_DOMAIN}' || hostname.endsWith('.${CHATGPT_DOMAIN}');
741
+ const projectIdFromPathname = (pathname) => {
742
+ const match = String(pathname || '').match(new RegExp('^/g/g-p-([a-f0-9]{8,})(?:[-/]|$)', 'i'));
743
+ return match ? match[1].toLowerCase() : '';
744
+ };
745
+ const parseProjectId = (value) => {
746
+ const raw = String(value || '').trim();
747
+ if (new RegExp('^https?://', 'i').test(raw) || raw.startsWith('/')) {
748
+ try {
749
+ const url = new URL(raw, '${CHATGPT_URL}');
750
+ if (url.protocol !== 'https:' || !trustedHost(url.hostname)) return '';
751
+ return projectIdFromPathname(url.pathname);
752
+ } catch {
753
+ return '';
754
+ }
755
+ }
756
+ const slugMatch = raw.match(new RegExp('^g-p-([a-f0-9]{8,})', 'i'));
757
+ if (slugMatch) return slugMatch[1].toLowerCase();
758
+ if (new RegExp('^[a-f0-9]{8,}$', 'i').test(raw)) return raw.toLowerCase();
759
+ return '';
760
+ };
761
+ const normalizeProjectUrl = (href, projectId) => {
762
+ try {
763
+ const url = new URL(href, '${CHATGPT_URL}');
764
+ if (url.protocol !== 'https:' || !trustedHost(url.hostname)) return '';
765
+ if (projectIdFromPathname(url.pathname) !== projectId) return '';
766
+ url.search = '';
767
+ url.hash = '';
768
+ return url.href.endsWith('/') ? url.href.slice(0, -1) : url.href;
769
+ } catch {
770
+ return '${CHATGPT_URL}' + '/g/g-p-' + projectId;
771
+ }
772
+ };
773
+
774
+ var seen = new Set();
775
+ var rows = [];
776
+ const addRow = (projectId, title, url) => {
777
+ if (!projectId || seen.has(projectId)) return;
778
+ seen.add(projectId);
779
+ rows.push({
780
+ Id: projectId,
781
+ Title: cleanText(title) || '(untitled project)',
782
+ Url: url || ('${CHATGPT_URL}' + '/g/g-p-' + projectId),
783
+ });
784
+ };
785
+
786
+ // Prefer explicit project anchors when the sidebar exposes them. This is
787
+ // stable across React internals and matches the URL shape documented by
788
+ // PROJECT_LINK_SELECTOR.
789
+ for (const link of Array.from(document.querySelectorAll(projectLinkSelector))) {
790
+ if (!isVisible(link)) continue;
791
+ const href = link.getAttribute('href') || link.href || '';
792
+ const projectId = parseProjectId(href);
793
+ if (!projectId) continue;
794
+ const container = link.closest('[data-sidebar-item="true"]') || link;
795
+ addRow(projectId, cleanText(container.innerText || container.textContent || link.textContent), normalizeProjectUrl(href, projectId));
796
+ }
797
+
798
+ // Fallback for ChatGPT sidebar builds that render project rows without
799
+ // anchors but keep gizmo data on React Fiber props.
800
+ const projectEls = Array.from(document.querySelectorAll('[data-sidebar-item="true"]'))
801
+ .filter(function(el) {
802
+ if (!isVisible(el)) return false;
803
+ var icon = el.querySelector('[data-testid="project-folder-icon"]');
804
+ if (!icon) return false;
805
+ var text = cleanText(el.innerText || el.textContent);
806
+ if (!text) return false;
807
+ if (el.getAttribute('data-testid') === 'accounts-profile-button') return false;
808
+ return true;
809
+ });
810
+
811
+ for (var i = 0; i < projectEls.length; i++) {
812
+ var el = projectEls[i];
813
+ var title = cleanText(el.innerText || el.textContent);
814
+ var projectId = '';
815
+ var shortUrl = '';
816
+ var fiberKey = Object.keys(el).find(function(k) { return k.startsWith('__reactFiber$'); });
817
+ if (fiberKey) {
818
+ var f = el[fiberKey];
819
+ for (var d = 0; f && d < 15; d++) {
820
+ var props = f.memoizedProps || f.pendingProps;
821
+ if (props && props.gizmo) {
822
+ var g = props.gizmo;
823
+ var gId = g.gizmo && g.gizmo.id ? g.gizmo.id : g.id;
824
+ var gIdMatch = String(gId || '').match(new RegExp('^g-p-([a-f0-9]{8,})(?:-|$)', 'i'));
825
+ if (gIdMatch) {
826
+ projectId = gIdMatch[1].toLowerCase();
827
+ shortUrl = String(g.short_url || g.gizmo && g.gizmo.short_url || '');
828
+ break;
829
+ }
830
+ }
831
+ f = f.return;
832
+ }
833
+ }
834
+ if (!projectId) continue;
835
+ var url = shortUrl ? '${CHATGPT_URL}' + '/g/' + shortUrl : '${CHATGPT_URL}' + '/g/g-p-' + projectId;
836
+ addRow(projectId, title, url);
837
+ }
838
+
839
+ return rows;
840
+ })()`)),"chatgpt project link extraction").map(function(Y,Z){return{Index:Z+1,Id:String(Y?.Id||""),Title:String(Y?.Title||"(untitled project)").trim()||"(untitled project)",Url:String(Y?.Url||"")}}).filter(function(Y){return Y.Id})}const s=["Add files","Add sources","添加文件","Project files","项目文件"],d=['[role="tabpanel"][data-state="active"] [data-project-home-sources-surface="true"] input[type="file"]:not([accept])','[data-project-home-sources-surface="true"] input[type="file"]:not([accept])','[role="dialog"] input[type="file"]','[data-testid*="project-files"] input[type="file"]','[data-testid*="project"] input[type="file"]'];export async function navigateToProject(Q,X){const Y=parseChatGPTProjectId(X);await Q.goto(`${CHATGPT_URL}/g/g-p-${Y}`,{settleMs:2000});try{await Q.wait({selector:f,timeout:10})}catch{}const Z=await getPageState(Q);if(S(Z.url)===Y)return Y;if(Z.hasLoginGate||!Z.isLoggedIn)throw new _(CHATGPT_DOMAIN,"ChatGPT project requires a logged-in ChatGPT session.");throw new F(`ChatGPT did not open the requested project ${Y}.`,`Current URL: ${Z.url||"(unknown)"}`)}export async function openProjectKnowledgeDialog(Q){const X=unwrapEvaluateResult(await Q.evaluate(`
841
+ (() => {
842
+ const labels = ${JSON.stringify(s)};
843
+ const isVisible = (el) => {
844
+ if (!(el instanceof HTMLElement)) return false;
845
+ const style = window.getComputedStyle(el);
846
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
847
+ const rect = el.getBoundingClientRect();
848
+ return rect.width > 0 && rect.height > 0;
849
+ };
850
+
851
+ // Current ChatGPT project pages expose project knowledge under a
852
+ // Sources tab. Prefer that surface when present; it contains the
853
+ // project-source file input and avoids the chat composer's plus menu.
854
+ const sourceInput = document.querySelector('[data-project-home-sources-surface="true"] input[type="file"]:not([accept])');
855
+ if (sourceInput instanceof HTMLInputElement) return { ok: true };
856
+
857
+ const sourcesTab = Array.from(document.querySelectorAll('[role="tab"], button')).find(el => {
858
+ const text = (el.innerText || el.textContent || '').trim();
859
+ const id = el.id || '';
860
+ return text === 'Sources' || text === '资料' || id.includes('-sources');
861
+ });
862
+ if (sourcesTab instanceof HTMLElement) {
863
+ if (sourcesTab.getAttribute('aria-selected') === 'true') return { ok: true };
864
+ const rect = sourcesTab.getBoundingClientRect();
865
+ const centerX = rect.left + rect.width / 2;
866
+ const centerY = rect.top + rect.height / 2;
867
+ const nativeClick = rect.width > 0 && rect.height > 0 && Number.isFinite(centerX) && Number.isFinite(centerY) ? {
868
+ x: centerX,
869
+ y: centerY,
870
+ } : null;
871
+
872
+ // Radix-powered tabs on the live ChatGPT project page do not
873
+ // respond reliably to HTMLElement.click(); they activate after
874
+ // the same pointer/mouse sequence a real browser click emits.
875
+ const eventInit = {
876
+ bubbles: true,
877
+ cancelable: true,
878
+ composed: true,
879
+ view: window,
880
+ clientX: nativeClick ? nativeClick.x : 0,
881
+ clientY: nativeClick ? nativeClick.y : 0,
882
+ button: 0,
883
+ buttons: 1,
884
+ };
885
+ for (const type of ['pointerover', 'pointerenter', 'mouseover', 'mouseenter', 'pointermove', 'mousemove', 'pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click']) {
886
+ const Ctor = type.startsWith('pointer') && typeof PointerEvent !== 'undefined' ? PointerEvent : MouseEvent;
887
+ sourcesTab.dispatchEvent(new Ctor(type, eventInit));
888
+ }
889
+ return { ok: true, nativeClick };
890
+ }
891
+
892
+ // Older project pages opened a dedicated project files dialog.
893
+ // Strategy 1: aria-label or data-testid
894
+ const byAttr = Array.from(document.querySelectorAll('button, a, [role="button"]')).find(el => {
895
+ if (!isVisible(el)) return false;
896
+ if (el.closest('[role="textbox"], #prompt-textarea, [data-testid="composer"], form[data-type="unified-composer"]')) return false;
897
+ const aria = (el.getAttribute('aria-label') || '').toLowerCase();
898
+ const testid = (el.getAttribute('data-testid') || '').toLowerCase();
899
+ const text = (el.innerText || el.textContent || '').trim();
900
+ if (aria.includes('add sources') || aria.includes('project files')) return true;
901
+ if (aria === 'add files') return true;
902
+ if (testid.includes('add-files') || testid.includes('project-files')) return true;
903
+ if (labels.some(l => text === l)) return true;
904
+ return false;
905
+ });
906
+ if (byAttr instanceof HTMLElement) { byAttr.click(); return { ok: true }; }
907
+
908
+ // Strategy 2: look for buttons that contain "Add files"/"Add sources"
909
+ // text, but exclude the composer plus button (which has a different role).
910
+ const allButtons = Array.from(document.querySelectorAll('button'));
911
+ for (const btn of allButtons) {
912
+ if (!isVisible(btn)) continue;
913
+ const text = (btn.innerText || btn.textContent || '').trim();
914
+ if (labels.some(l => text === l) && !btn.closest('[role="textbox"], #prompt-textarea, [data-testid="composer"]')) {
915
+ btn.click();
916
+ return { ok: true };
917
+ }
918
+ }
919
+
920
+ return { ok: false };
921
+ })()
922
+ `)),Y=typeof X==="boolean"?{ok:X}:requireObjectEvaluateResult(X,"chatgpt project knowledge dialog open");if(Y.ok){if(Y.nativeClick&&typeof Q.nativeClick==="function")try{await Q.nativeClick(Y.nativeClick.x,Y.nativeClick.y)}catch{}if(Y.nativeClick&&typeof Q.click==="function")try{await Q.click('[role="tab"][id$="-sources"]')}catch{}await Q.wait(1);try{await Q.wait({selector:'[role="dialog"], [data-project-home-sources-surface="true"] input[type="file"]',timeout:5})}catch{}return!0}return!1}export async function uploadChatGPTProjectFiles(Q,X,Y){const Z=parseChatGPTProjectId(X),$=await import("node:fs"),W=await import("node:path"),V=await prepareChatGPTFilePaths(Y);if(!V.ok)return{...V,inputError:!0};const z=V.paths;await navigateToProject(Q,Z);await ensureChatGPTLogin(Q,"ChatGPT project file upload requires a logged-in ChatGPT session.");if(!await openProjectKnowledgeDialog(Q))return{ok:!1,reason:'could not find or click the project "Add files" button'};const j=z.map((B)=>W.default.basename(B));let J=!1;if(Q.setFileInput)for(const B of d)try{await Q.setFileInput(z,B);J=!0;break}catch(H){const D=String(H?.message||H);if(!D.includes("Unknown action")&&!D.includes("not supported")&&!D.includes("Not allowed")&&!D.includes("No element found"))throw H}if(!J){const B=z.map((D)=>({name:W.default.basename(D),mime:m(D),base64:$.default.readFileSync(D).toString("base64")})),H=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
923
+ (() => {
924
+ const files = ${JSON.stringify(B)};
925
+
926
+ // Look for file input inside a dialog or the project area
927
+ const selectors = ${JSON.stringify(d)};
928
+ let input = null;
929
+ for (const sel of selectors) {
930
+ input = document.querySelector(sel);
931
+ if (input instanceof HTMLInputElement) break;
932
+ }
933
+ // Last resort: stay scoped to project knowledge containers. Do
934
+ // not fall back to arbitrary page inputs, because the composer
935
+ // attachment input can also accept files but uploads them to
936
+ // the conversation instead of project knowledge.
937
+ if (!(input instanceof HTMLInputElement)) {
938
+ const allFileInputs = document.querySelectorAll('[data-project-home-sources-surface="true"] input[type="file"], [role="dialog"] input[type="file"], [data-testid*="project"] input[type="file"]');
939
+ for (const fi of allFileInputs) {
940
+ input = fi;
941
+ break;
942
+ }
943
+ }
944
+ if (!(input instanceof HTMLInputElement)) {
945
+ return { ok: false, reason: 'project file input not found' };
946
+ }
947
+
948
+ const dt = new DataTransfer();
949
+ for (const item of files) {
950
+ const binary = atob(item.base64);
951
+ const bytes = new Uint8Array(binary.length);
952
+ for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
953
+ dt.items.add(new File([bytes], item.name, { type: item.mime }));
954
+ }
955
+ input.files = dt.files;
956
+
957
+ const propsKey = Object.keys(input).find(key => key.startsWith('__reactProps$'));
958
+ if (propsKey && input[propsKey] && typeof input[propsKey].onChange === 'function') {
959
+ const nativeEvent = new Event('change', { bubbles: true });
960
+ input[propsKey].onChange({
961
+ target: input,
962
+ currentTarget: input,
963
+ nativeEvent,
964
+ preventDefault() {},
965
+ stopPropagation() {},
966
+ isDefaultPrevented() { return false; },
967
+ isPropagationStopped() { return false; },
968
+ persist() {},
969
+ });
970
+ } else {
971
+ input.dispatchEvent(new Event('input', { bubbles: true }));
972
+ input.dispatchEvent(new Event('change', { bubbles: true }));
973
+ }
974
+ return { ok: true };
975
+ })()
976
+ `)),"chatgpt project file upload fallback");if(H&&!H.ok)return H}const K=await t(Q,j);if(!K.ok)return K;return{ok:!0,files:z}}async function t(Q,X){const Y=X.map(($)=>String($||"").trim()).filter(Boolean);if(!Y.length)return{ok:!0};let Z="uploaded file did not appear in project knowledge";for(let $=0;$<10;$+=1){const W=requireObjectEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
977
+ (() => {
978
+ const expectedFileNames = ${JSON.stringify(Y)};
979
+ const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
980
+ const root = document.querySelector('[role="dialog"]')
981
+ || document.querySelector('[data-project-home-sources-surface="true"]')
982
+ || document.querySelector('[role="tabpanel"][data-state="active"]');
983
+ if (!root) {
984
+ return { ok: false, pending: true, reason: 'project knowledge surface was not visible after upload' };
985
+ }
986
+ const text = normalize(root?.innerText || root?.textContent || '');
987
+ const errorNode = Array.from((root || document).querySelectorAll('[role="alert"], [data-testid*="error"], [class*="error"]')).find((node) => {
988
+ const label = normalize(node.innerText || node.textContent || node.getAttribute('aria-label') || '');
989
+ return /failed|error|unable|could not|too large|unsupported/i.test(label);
990
+ });
991
+ if (errorNode) {
992
+ return { ok: false, reason: normalize(errorNode.innerText || errorNode.textContent || errorNode.getAttribute('aria-label') || 'project upload failed') };
993
+ }
994
+ const missing = expectedFileNames.filter((name) => !text.includes(name));
995
+ if (!missing.length) return { ok: true };
996
+ return { ok: false, pending: true, reason: 'uploaded file did not appear in project knowledge: ' + missing.join(', ') };
997
+ })()
998
+ `)),"chatgpt project upload confirmation");if(W.ok===!0)return{ok:!0};Z=String(W.reason||Z);if(!W.pending)return{ok:!1,reason:Z};await Q.wait(0.5)}return{ok:!1,reason:Z}}export async function prepareChatGPTFilePaths(Q){const X=await import("node:fs"),Y=await import("node:path"),Z=Q.map(($)=>Y.default.resolve($));for(const $ of Z){if(!X.default.existsSync($))return{ok:!1,reason:`File not found: ${$}`};const W=X.default.statSync($);if(!W.isFile())return{ok:!1,reason:`Not a file: ${$}`};if(W.size>536870912)return{ok:!1,reason:`File too large (${(W.size/1024/1024).toFixed(1)} MB). Max: 512 MB`}}return{ok:!0,paths:Z}}function m(Q){const X=String(Q||"").toLowerCase();if(X.endsWith(".pdf"))return"application/pdf";if(X.endsWith(".doc"))return"application/msword";if(X.endsWith(".docx"))return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";if(X.endsWith(".xls"))return"application/vnd.ms-excel";if(X.endsWith(".xlsx"))return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";if(X.endsWith(".ppt"))return"application/vnd.ms-powerpoint";if(X.endsWith(".pptx"))return"application/vnd.openxmlformats-officedocument.presentationml.presentation";if(X.endsWith(".csv"))return"text/csv";if(X.endsWith(".txt"))return"text/plain";if(X.endsWith(".json"))return"application/json";if(X.endsWith(".xml"))return"application/xml";if(X.endsWith(".html")||X.endsWith(".htm"))return"text/html";if(X.endsWith(".md"))return"text/markdown";if(X.endsWith(".py"))return"text/x-python";if(X.endsWith(".js"))return"text/javascript";if(X.endsWith(".ts"))return"application/typescript";if(X.endsWith(".jsx"))return"text/jsx";if(X.endsWith(".tsx"))return"text/tsx";if(X.endsWith(".png"))return"image/png";if(X.endsWith(".jpg")||X.endsWith(".jpeg"))return"image/jpeg";if(X.endsWith(".gif"))return"image/gif";if(X.endsWith(".webp"))return"image/webp";if(X.endsWith(".svg"))return"image/svg+xml";return"application/octet-stream"}export const __test__={COMPOSER_SELECTORS:x,SEND_BUTTON_SELECTOR:U,SEND_BUTTON_FALLBACK_SELECTORS:L,SEND_BUTTON_LABELS:y,CLOSE_SIDEBAR_LABELS:A,buildComposerLocatorScript:v,isSameChatGPTConversation:N,parseChatGPTConversationId,parseChatGPTProjectId,imageMimeFromPath:P,mimeFromFilePath:m,PROJECT_LINK_SELECTOR:c};export async function getChatGPTImageAssets(Q,X){const Y=JSON.stringify(X);return requireArrayEvaluateResult(unwrapEvaluateResult(await Q.evaluate(`
999
+ (async (targetUrls) => {
1000
+ const blobToDataUrl = (blob) => new Promise((resolve, reject) => {
1001
+ const reader = new FileReader();
1002
+ reader.onloadend = () => resolve(String(reader.result || ''));
1003
+ reader.onerror = () => reject(new Error('Failed to read blob'));
1004
+ reader.readAsDataURL(blob);
1005
+ });
1006
+
1007
+ const inferMime = (value, fallbackUrl) => {
1008
+ if (value) return value;
1009
+ const lower = String(fallbackUrl || '').toLowerCase();
1010
+ if (lower.includes('.png')) return 'image/png';
1011
+ if (lower.includes('.webp')) return 'image/webp';
1012
+ if (lower.includes('.gif')) return 'image/gif';
1013
+ return 'image/jpeg';
1014
+ };
1015
+
1016
+ const results = [];
1017
+
1018
+ for (const targetUrl of targetUrls) {
1019
+ let dataUrl = '';
1020
+ let mimeType = 'image/jpeg';
1021
+ let width = 0;
1022
+ let height = 0;
1023
+
1024
+ // Try to find the img element for size info
1025
+ const img = Array.from(document.querySelectorAll('img')).find(el =>
1026
+ (el.currentSrc || el.src || '') === targetUrl
1027
+ );
1028
+ if (img) {
1029
+ width = img.naturalWidth || img.width || 0;
1030
+ height = img.naturalHeight || img.height || 0;
1031
+ } else {
1032
+ const backgroundEl = Array.from(document.querySelectorAll('[style*="background-image"], [style*="background"]')).find(el => {
1033
+ if (!(el instanceof HTMLElement)) return false;
1034
+ const backgroundImage = window.getComputedStyle(el).backgroundImage || '';
1035
+ return Array.from(backgroundImage.matchAll(/url\\((['"]?)(.*?)\\1\\)/g)).some(match => {
1036
+ const raw = String(match[2] || '').trim();
1037
+ if (!raw) return false;
1038
+ if (raw === targetUrl) return true;
1039
+ try {
1040
+ return new URL(raw, window.location.href).href === targetUrl;
1041
+ } catch {
1042
+ return false;
1043
+ }
1044
+ });
1045
+ });
1046
+ if (backgroundEl) {
1047
+ const rect = backgroundEl.getBoundingClientRect();
1048
+ width = Math.round(rect.width || 0);
1049
+ height = Math.round(rect.height || 0);
1050
+ }
1051
+ }
1052
+
1053
+ try {
1054
+ if (String(targetUrl).startsWith('data:')) {
1055
+ dataUrl = String(targetUrl);
1056
+ mimeType = (String(targetUrl).match(/^data:([^;]+);/i) || [])[1] || 'image/png';
1057
+ } else {
1058
+ // Try to fetch via CORS from the page's origin
1059
+ const res = await fetch(targetUrl, { credentials: 'include' });
1060
+ if (res.ok) {
1061
+ const blob = await res.blob();
1062
+ mimeType = inferMime(blob.type, targetUrl);
1063
+ dataUrl = await blobToDataUrl(blob);
1064
+ }
1065
+ }
1066
+ } catch (e) {
1067
+ // If fetch fails (CORS), try canvas approach via img element
1068
+ }
1069
+
1070
+ // Fallback: draw img to canvas
1071
+ if (!dataUrl && img && img instanceof HTMLImageElement) {
1072
+ try {
1073
+ const canvas = document.createElement('canvas');
1074
+ canvas.width = img.naturalWidth || img.width || 512;
1075
+ canvas.height = img.naturalHeight || img.height || 512;
1076
+ const ctx = canvas.getContext('2d');
1077
+ if (ctx) {
1078
+ ctx.drawImage(img, 0, 0);
1079
+ dataUrl = canvas.toDataURL('image/png');
1080
+ mimeType = 'image/png';
1081
+ }
1082
+ } catch (e) { }
1083
+ }
1084
+
1085
+ if (dataUrl) {
1086
+ results.push({ url: String(targetUrl), dataUrl, mimeType, width, height });
1087
+ }
1088
+ }
1089
+
1090
+ return results;
1091
+ })(${Y})
1092
+ `)),"chatgpt image asset export")}