publishport-opencli 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1042) hide show
  1. package/cli-manifest.json +35 -0
  2. package/clis/12306/me.js +2 -2
  3. package/clis/12306/orders.js +3 -3
  4. package/clis/12306/passengers.js +3 -3
  5. package/clis/12306/price.js +1 -1
  6. package/clis/12306/stations.js +1 -1
  7. package/clis/12306/train.js +1 -1
  8. package/clis/12306/trains.js +1 -1
  9. package/clis/12306/utils.js +1 -1
  10. package/clis/1688/download.js +1 -1
  11. package/clis/1688/item.js +4 -4
  12. package/clis/1688/search.js +4 -4
  13. package/clis/1688/store.js +4 -4
  14. package/clis/1point3acres/forum.js +1 -1
  15. package/clis/1point3acres/forums.js +1 -1
  16. package/clis/1point3acres/notifications.js +1 -1
  17. package/clis/1point3acres/search.js +1 -1
  18. package/clis/1point3acres/thread.js +2 -2
  19. package/clis/1point3acres/user.js +1 -1
  20. package/clis/1point3acres/utils.js +2 -2
  21. package/clis/36kr/article.js +2 -2
  22. package/clis/36kr/hot.js +2 -2
  23. package/clis/36kr/news.js +1 -1
  24. package/clis/36kr/search.js +2 -2
  25. package/clis/51job/company.js +2 -2
  26. package/clis/51job/detail.js +2 -2
  27. package/clis/51job/hot.js +1 -1
  28. package/clis/51job/search.js +1 -1
  29. package/clis/51job/utils.js +7 -7
  30. package/clis/_atlassian/shared.js +9 -9
  31. package/clis/_shared/article/auth.js +4 -4
  32. package/clis/_shared/article/douban-md2draft.js +4 -4
  33. package/clis/_shared/article/format.js +1 -1
  34. package/clis/_shared/article/images.js +7 -7
  35. package/clis/_shared/article/login.js +1 -1
  36. package/clis/_shared/article/publish.js +11 -11
  37. package/clis/_shared/common.js +1 -1
  38. package/clis/_shared/content-guard.js +1 -1
  39. package/clis/_shared/desktop-commands.js +1 -1
  40. package/clis/_shared/file-inject.js +12 -12
  41. package/clis/_shared/self-hosted-sites.js +2 -2
  42. package/clis/_shared/site-auth.js +1 -1
  43. package/clis/_shared/token-auth.js +2 -2
  44. package/clis/_shared/video-publish.js +9 -9
  45. package/clis/amazon/offer.js +3 -3
  46. package/clis/amazon/product.js +5 -5
  47. package/clis/amazon/shared.js +6 -6
  48. package/clis/antigravity/_actions.js +13 -13
  49. package/clis/antigravity/audit-extras.js +10 -10
  50. package/clis/antigravity/delete.js +1 -1
  51. package/clis/antigravity/model.js +6 -6
  52. package/clis/antigravity/new.js +2 -2
  53. package/clis/antigravity/read.js +2 -2
  54. package/clis/antigravity/rename.js +1 -1
  55. package/clis/antigravity/send.js +3 -3
  56. package/clis/antigravity/serve.js +17 -17
  57. package/clis/antigravity/storage.js +6 -6
  58. package/clis/antigravity/watch.js +2 -2
  59. package/clis/apple-podcasts/episodes.js +1 -1
  60. package/clis/apple-podcasts/top.js +1 -1
  61. package/clis/apple-podcasts/utils.js +1 -1
  62. package/clis/archive/item.js +1 -1
  63. package/clis/archive/search.js +1 -1
  64. package/clis/archive/snapshots.js +1 -1
  65. package/clis/archive/wayback.js +1 -1
  66. package/clis/arxiv/author.js +1 -1
  67. package/clis/arxiv/utils.js +1 -1
  68. package/clis/autohome/brand.js +1 -1
  69. package/clis/autohome/score.js +1 -1
  70. package/clis/autohome/utils.js +1 -1
  71. package/clis/baijiahao/article.js +1 -1
  72. package/clis/baijiahao/lists.js +1 -1
  73. package/clis/baijiahao/login.js +1 -1
  74. package/clis/baijiahao/publish.js +9 -9
  75. package/clis/baijiahao/stats.js +1 -1
  76. package/clis/baijiahao/whoami.js +1 -1
  77. package/clis/band/bands.js +2 -2
  78. package/clis/band/mentions.js +2 -2
  79. package/clis/band/post.js +4 -4
  80. package/clis/band/posts.js +3 -3
  81. package/clis/barchart/flow.js +3 -3
  82. package/clis/barchart/greeks.js +2 -2
  83. package/clis/barchart/quote.js +3 -3
  84. package/clis/bbc/news.js +1 -1
  85. package/clis/bbc/topic.js +1 -1
  86. package/clis/bbc/utils.js +1 -1
  87. package/clis/bilibili/article.js +1 -1
  88. package/clis/bilibili/categories.js +1 -1
  89. package/clis/bilibili/coin.js +1 -1
  90. package/clis/bilibili/comment-del.js +1 -1
  91. package/clis/bilibili/comment-like.js +1 -1
  92. package/clis/bilibili/comment.js +1 -1
  93. package/clis/bilibili/comments.js +1 -1
  94. package/clis/bilibili/dm-list.js +1 -1
  95. package/clis/bilibili/dm-read.js +1 -1
  96. package/clis/bilibili/dm-send.js +1 -1
  97. package/clis/bilibili/download.js +2 -2
  98. package/clis/bilibili/drafts.js +1 -1
  99. package/clis/bilibili/dynamic-post.js +3 -3
  100. package/clis/bilibili/favorite-add.js +1 -1
  101. package/clis/bilibili/favorite.js +1 -1
  102. package/clis/bilibili/feed.js +2 -2
  103. package/clis/bilibili/follow.js +1 -1
  104. package/clis/bilibili/following.js +1 -1
  105. package/clis/bilibili/like.js +1 -1
  106. package/clis/bilibili/partitions.js +1 -1
  107. package/clis/bilibili/stats.js +1 -1
  108. package/clis/bilibili/subtitle.js +3 -3
  109. package/clis/bilibili/summary.js +1 -1
  110. package/clis/bilibili/topics.js +1 -1
  111. package/clis/bilibili/unfollow.js +1 -1
  112. package/clis/bilibili/upload.js +1 -1
  113. package/clis/bilibili/utils.js +10 -10
  114. package/clis/bilibili/video-drafts.js +1 -1
  115. package/clis/bilibili/video.js +1 -1
  116. package/clis/bloomberg/businessweek.js +4 -4
  117. package/clis/bloomberg/news.js +2 -2
  118. package/clis/bloomberg/utils.js +13 -13
  119. package/clis/bluesky/post.js +1 -1
  120. package/clis/bluesky/shared.js +11 -11
  121. package/clis/bluesky/whoami.js +1 -1
  122. package/clis/booking/search.js +2 -2
  123. package/clis/boss/accept.js +1 -1
  124. package/clis/boss/applied.js +1 -1
  125. package/clis/boss/auth.js +1 -1
  126. package/clis/boss/batchgreet.js +1 -1
  127. package/clis/boss/bossinfo.js +1 -1
  128. package/clis/boss/chatlist.js +1 -1
  129. package/clis/boss/chatmsg.js +1 -1
  130. package/clis/boss/cities.js +1 -1
  131. package/clis/boss/detail.js +1 -1
  132. package/clis/boss/exchange.js +1 -1
  133. package/clis/boss/greet.js +1 -1
  134. package/clis/boss/interviews.js +1 -1
  135. package/clis/boss/invite.js +1 -1
  136. package/clis/boss/joblist.js +1 -1
  137. package/clis/boss/mark.js +1 -1
  138. package/clis/boss/me.js +2 -2
  139. package/clis/boss/recommend.js +1 -1
  140. package/clis/boss/resumedelete.js +1 -1
  141. package/clis/boss/resumelist.js +1 -1
  142. package/clis/boss/resumeupload.js +11 -11
  143. package/clis/boss/search.js +1 -1
  144. package/clis/boss/send.js +1 -1
  145. package/clis/boss/sendresume.js +1 -1
  146. package/clis/boss/stats.js +1 -1
  147. package/clis/boss/unread.js +1 -1
  148. package/clis/boss/utils.js +13 -13
  149. package/clis/chaoxing/assignments.js +1 -1
  150. package/clis/chaoxing/exams.js +1 -1
  151. package/clis/chaoxing/utils.js +9 -9
  152. package/clis/chatgpt/ask.js +1 -1
  153. package/clis/chatgpt/auth.js +2 -2
  154. package/clis/chatgpt/detail.js +1 -1
  155. package/clis/chatgpt/image.js +1 -1
  156. package/clis/chatgpt/read.js +1 -1
  157. package/clis/chatgpt/send.js +1 -1
  158. package/clis/chatgpt/utils.js +59 -59
  159. package/clis/chatgpt-app/ask.js +1 -1
  160. package/clis/chatgpt-app/send.js +1 -1
  161. package/clis/chatwise/model.js +6 -6
  162. package/clis/chess/analyze.js +1 -1
  163. package/clis/chess/game.js +1 -1
  164. package/clis/chess/games.js +1 -1
  165. package/clis/chess/stats.js +1 -1
  166. package/clis/chess/utils.js +1 -1
  167. package/clis/claude/ask.js +2 -2
  168. package/clis/claude/detail.js +1 -1
  169. package/clis/claude/new.js +1 -1
  170. package/clis/claude/read.js +1 -1
  171. package/clis/claude/send.js +1 -1
  172. package/clis/claude/utils.js +23 -23
  173. package/clis/cnblogs/article.js +1 -1
  174. package/clis/cnblogs/login.js +1 -1
  175. package/clis/cnblogs/stats.js +7 -7
  176. package/clis/cnblogs/whoami.js +1 -1
  177. package/clis/codex/_actions.js +3 -3
  178. package/clis/codex/archive.js +1 -1
  179. package/clis/codex/ask.js +6 -6
  180. package/clis/codex/model.js +8 -8
  181. package/clis/codex/pin.js +1 -1
  182. package/clis/codex/rename.js +4 -4
  183. package/clis/codex/send.js +3 -3
  184. package/clis/codex/sidebar.js +1 -1
  185. package/clis/coingecko/categories.js +1 -1
  186. package/clis/coingecko/coin.js +1 -1
  187. package/clis/coingecko/derivatives.js +1 -1
  188. package/clis/coingecko/exchanges.js +1 -1
  189. package/clis/coingecko/global.js +1 -1
  190. package/clis/coingecko/trending.js +1 -1
  191. package/clis/confluence/search.js +1 -1
  192. package/clis/coupang/product.js +3 -3
  193. package/clis/coupang/utils.js +1 -1
  194. package/clis/crates/crate.js +1 -1
  195. package/clis/crates/search.js +1 -1
  196. package/clis/crates/utils.js +1 -1
  197. package/clis/csdn/article.js +13 -13
  198. package/clis/csdn/columns.js +1 -1
  199. package/clis/csdn/login.js +1 -1
  200. package/clis/csdn/stats.js +4 -4
  201. package/clis/csdn/whoami.js +1 -1
  202. package/clis/cto51/article.js +1 -1
  203. package/clis/cto51/whoami.js +1 -1
  204. package/clis/ctrip/flight.js +2 -2
  205. package/clis/ctrip/hotel-search.js +3 -3
  206. package/clis/ctrip/hotel-suggest.js +1 -1
  207. package/clis/ctrip/search.js +1 -1
  208. package/clis/ctrip/utils.js +6 -6
  209. package/clis/cursor/ask.js +5 -5
  210. package/clis/cursor/composer.js +2 -2
  211. package/clis/cursor/model.js +4 -4
  212. package/clis/cursor/send.js +2 -2
  213. package/clis/dblp/author.js +1 -1
  214. package/clis/dblp/paper.js +1 -1
  215. package/clis/dblp/search.js +1 -1
  216. package/clis/dblp/utils.js +1 -1
  217. package/clis/dblp/venue.js +1 -1
  218. package/clis/deepseek/ask.js +1 -1
  219. package/clis/deepseek/auth.js +2 -2
  220. package/clis/deepseek/detail.js +1 -1
  221. package/clis/deepseek/new.js +1 -1
  222. package/clis/deepseek/read.js +1 -1
  223. package/clis/deepseek/send.js +7 -7
  224. package/clis/deepseek/utils.js +25 -25
  225. package/clis/defillama/protocol.js +1 -1
  226. package/clis/defillama/protocols.js +1 -1
  227. package/clis/defillama/utils.js +1 -1
  228. package/clis/devto/auth.js +2 -2
  229. package/clis/devto/latest.js +1 -1
  230. package/clis/devto/publish.js +5 -5
  231. package/clis/devto/read.js +2 -2
  232. package/clis/devto/stats.js +3 -3
  233. package/clis/dianping/auth.js +2 -2
  234. package/clis/dianping/cityResolver.js +2 -2
  235. package/clis/dianping/search.js +1 -1
  236. package/clis/dianping/shop.js +1 -1
  237. package/clis/dianping/utils.js +1 -1
  238. package/clis/discord-app/delete.js +3 -3
  239. package/clis/discord-app/read.js +1 -1
  240. package/clis/discord-app/thread-read.js +1 -1
  241. package/clis/discord-web/auth.js +2 -2
  242. package/clis/discord-web/send.js +5 -5
  243. package/clis/dockerhub/image.js +1 -1
  244. package/clis/dockerhub/search.js +1 -1
  245. package/clis/dockerhub/utils.js +1 -1
  246. package/clis/dongchedi/koubei.js +1 -1
  247. package/clis/dongchedi/models.js +1 -1
  248. package/clis/dongchedi/score.js +1 -1
  249. package/clis/dongchedi/search.js +1 -1
  250. package/clis/dongchedi/series.js +1 -1
  251. package/clis/dongchedi/specs.js +1 -1
  252. package/clis/dongchedi/utils.js +1 -1
  253. package/clis/douban/article.js +3 -3
  254. package/clis/douban/auth.js +2 -2
  255. package/clis/douban/download.js +1 -1
  256. package/clis/douban/utils.js +23 -23
  257. package/clis/doubao/auth.js +3 -3
  258. package/clis/doubao/utils.js +39 -39
  259. package/clis/doubao-app/ask.js +1 -1
  260. package/clis/doubao-app/utils.js +4 -4
  261. package/clis/douyin/_shared/browser-fetch.js +7 -7
  262. package/clis/douyin/_shared/draft-cache.js +1 -1
  263. package/clis/douyin/_shared/imagex-upload.js +1 -1
  264. package/clis/douyin/_shared/sts2.js +1 -1
  265. package/clis/douyin/_shared/text-extra.js +1 -1
  266. package/clis/douyin/_shared/tos-upload.js +4 -4
  267. package/clis/douyin/_shared/transcode.js +1 -1
  268. package/clis/douyin/_shared/vod-upload.js +4 -4
  269. package/clis/douyin/draft.js +18 -18
  270. package/clis/douyin/drafts.js +1 -1
  271. package/clis/douyin/publish-image.js +12 -12
  272. package/clis/douyin/publish.js +9 -9
  273. package/clis/douyin/search.js +3 -3
  274. package/clis/douyin/videos.js +1 -1
  275. package/clis/eastmoney/_secid.js +1 -1
  276. package/clis/eastmoney/announcement.js +1 -1
  277. package/clis/eastmoney/article.js +1 -1
  278. package/clis/eastmoney/convertible.js +1 -1
  279. package/clis/eastmoney/etf.js +1 -1
  280. package/clis/eastmoney/holders.js +1 -1
  281. package/clis/eastmoney/index-board.js +1 -1
  282. package/clis/eastmoney/kline.js +1 -1
  283. package/clis/eastmoney/kuaixun.js +1 -1
  284. package/clis/eastmoney/longhu.js +1 -1
  285. package/clis/eastmoney/money-flow.js +1 -1
  286. package/clis/eastmoney/northbound.js +1 -1
  287. package/clis/eastmoney/quote.js +1 -1
  288. package/clis/eastmoney/rank.js +1 -1
  289. package/clis/eastmoney/sectors.js +1 -1
  290. package/clis/endoflife/product.js +1 -1
  291. package/clis/endoflife/utils.js +1 -1
  292. package/clis/facebook/comment.js +8 -8
  293. package/clis/facebook/feed.js +4 -4
  294. package/clis/facebook/like.js +5 -5
  295. package/clis/facebook/notifications.js +3 -3
  296. package/clis/facebook/post.js +11 -11
  297. package/clis/facebook/search.js +3 -3
  298. package/clis/flathub/app.js +1 -1
  299. package/clis/flathub/search.js +1 -1
  300. package/clis/flathub/utils.js +1 -1
  301. package/clis/flomo/memos.js +1 -1
  302. package/clis/gemini/deep-research-result.js +4 -4
  303. package/clis/gemini/deep-research.js +1 -1
  304. package/clis/gemini/detail.js +1 -1
  305. package/clis/gemini/history.js +1 -1
  306. package/clis/gemini/image.js +2 -2
  307. package/clis/gemini/status.js +1 -1
  308. package/clis/gemini/utils.js +43 -43
  309. package/clis/geogebra/hexagon.js +1 -1
  310. package/clis/geogebra/info.js +3 -3
  311. package/clis/geogebra/triangle.js +1 -1
  312. package/clis/geogebra/utils.js +11 -11
  313. package/clis/ghost/login.js +1 -1
  314. package/clis/ghost/shared.js +2 -2
  315. package/clis/gitee/auth.js +2 -2
  316. package/clis/github-trending/repos.js +1 -1
  317. package/clis/google/news.js +1 -1
  318. package/clis/google/search.js +2 -2
  319. package/clis/google/suggest.js +1 -1
  320. package/clis/google/trends.js +1 -1
  321. package/clis/google/utils.js +1 -1
  322. package/clis/goproxy/module.js +1 -1
  323. package/clis/goproxy/utils.js +1 -1
  324. package/clis/goproxy/versions.js +1 -1
  325. package/clis/gov-policy/recent.js +2 -2
  326. package/clis/gov-policy/search.js +2 -2
  327. package/clis/grok/ask.js +1 -1
  328. package/clis/grok/detail.js +1 -1
  329. package/clis/grok/image.js +8 -8
  330. package/clis/grok/pin.js +1 -1
  331. package/clis/grok/send.js +1 -1
  332. package/clis/grok/status.js +1 -1
  333. package/clis/grok/utils.js +21 -21
  334. package/clis/guazi/browse.js +1 -1
  335. package/clis/guazi/car.js +1 -1
  336. package/clis/guazi/utils.js +1 -1
  337. package/clis/hackernews/auth.js +2 -2
  338. package/clis/hackernews/comment.js +8 -8
  339. package/clis/hackernews/read.js +7 -7
  340. package/clis/hackernews/submit.js +7 -7
  341. package/clis/hashnode/auth.js +3 -3
  342. package/clis/hashnode/publish.js +14 -14
  343. package/clis/hf/auth.js +2 -2
  344. package/clis/hf/models.js +1 -1
  345. package/clis/hf/paper.js +1 -1
  346. package/clis/hf/spaces.js +1 -1
  347. package/clis/hf/top.js +1 -1
  348. package/clis/homebrew/cask.js +1 -1
  349. package/clis/homebrew/formula.js +1 -1
  350. package/clis/homebrew/popular.js +1 -1
  351. package/clis/homebrew/utils.js +1 -1
  352. package/clis/huodongxing/events.js +1 -1
  353. package/clis/hupu/detail.js +4 -4
  354. package/clis/hupu/hot.js +3 -3
  355. package/clis/hupu/reply.js +1 -1
  356. package/clis/hupu/search.js +1 -1
  357. package/clis/hupu/unlike.js +1 -1
  358. package/clis/hupu/utils.js +10 -10
  359. package/clis/imdb/person.js +2 -2
  360. package/clis/imdb/reviews.js +3 -3
  361. package/clis/imdb/search.js +2 -2
  362. package/clis/imdb/title.js +1 -1
  363. package/clis/imdb/top.js +1 -1
  364. package/clis/imdb/trending.js +1 -1
  365. package/clis/imdb/utils.js +13 -13
  366. package/clis/imooc/article.js +6 -6
  367. package/clis/imooc/login.js +1 -1
  368. package/clis/imooc/whoami.js +1 -1
  369. package/clis/indeed/job.js +2 -2
  370. package/clis/indeed/search.js +2 -2
  371. package/clis/indeed/utils.js +1 -1
  372. package/clis/infoq/article.js +2 -2
  373. package/clis/infoq/login.js +1 -1
  374. package/clis/infoq/whoami.js +1 -1
  375. package/clis/instagram/_shared/private-publish.js +4 -4
  376. package/clis/instagram/_shared/protocol-capture.js +9 -9
  377. package/clis/instagram/detail.js +3 -3
  378. package/clis/instagram/post.js +25 -25
  379. package/clis/instagram/reel.js +18 -18
  380. package/clis/instagram/story.js +4 -4
  381. package/clis/instagram/user.js +2 -2
  382. package/clis/jd/item.js +65 -65
  383. package/clis/jianshu/article.js +1 -1
  384. package/clis/jianshu/login.js +1 -1
  385. package/clis/jianshu/notebooks.js +1 -1
  386. package/clis/jianshu/whoami.js +1 -1
  387. package/clis/jianyu/search.js +6 -6
  388. package/clis/jianyu/shared/procurement-contract.js +1 -1
  389. package/clis/jike/api.js +6 -6
  390. package/clis/jike/auth.js +3 -3
  391. package/clis/jike/comment.js +1 -1
  392. package/clis/jike/create.js +6 -6
  393. package/clis/jike/feed.js +3 -3
  394. package/clis/jike/like.js +1 -1
  395. package/clis/jike/notifications.js +3 -3
  396. package/clis/jike/repost.js +13 -13
  397. package/clis/jike/search.js +3 -3
  398. package/clis/jimeng/auth.js +2 -2
  399. package/clis/jimeng/generate.js +10 -10
  400. package/clis/jira/shared.js +1 -1
  401. package/clis/juejin/article.js +4 -4
  402. package/clis/juejin/categories.js +1 -1
  403. package/clis/juejin/hot.js +1 -1
  404. package/clis/juejin/login.js +1 -1
  405. package/clis/juejin/recommend.js +1 -1
  406. package/clis/juejin/stats.js +3 -3
  407. package/clis/juejin/tags.js +1 -1
  408. package/clis/juejin/utils.js +1 -1
  409. package/clis/juejin/whoami.js +1 -1
  410. package/clis/ke/utils.js +4 -4
  411. package/clis/kimi/_utils.js +7 -7
  412. package/clis/kimi/audit-extras.js +14 -14
  413. package/clis/kimi/auth.js +3 -3
  414. package/clis/kimi/chat.js +15 -15
  415. package/clis/kimi/storage.js +5 -5
  416. package/clis/kimi/ui.js +13 -13
  417. package/clis/kimi/usage.js +3 -3
  418. package/clis/kuaishou/auth.js +1 -1
  419. package/clis/kuaishou/publish.js +6 -6
  420. package/clis/lesswrong/_helpers.js +5 -5
  421. package/clis/lesswrong/comments.js +5 -5
  422. package/clis/lichess/top.js +1 -1
  423. package/clis/lichess/user.js +1 -1
  424. package/clis/lichess/utils.js +1 -1
  425. package/clis/linkedin/comment.js +1 -1
  426. package/clis/linkedin/connect.js +11 -11
  427. package/clis/linkedin/create.js +5 -5
  428. package/clis/linkedin/follow.js +1 -1
  429. package/clis/linkedin/inbox.js +1 -1
  430. package/clis/linkedin/job-detail.js +3 -3
  431. package/clis/linkedin/like.js +1 -1
  432. package/clis/linkedin/notifications.js +1 -1
  433. package/clis/linkedin/people-search.js +1 -1
  434. package/clis/linkedin/post-comments.js +1 -1
  435. package/clis/linkedin/post-detail.js +1 -1
  436. package/clis/linkedin/profile-analytics.js +1 -1
  437. package/clis/linkedin/profile-api.js +13 -13
  438. package/clis/linkedin/profile-experience.js +1 -1
  439. package/clis/linkedin/profile-projects.js +1 -1
  440. package/clis/linkedin/profile-read.js +3 -3
  441. package/clis/linkedin/reply.js +1 -1
  442. package/clis/linkedin/repost.js +1 -1
  443. package/clis/linkedin/safe-send.js +8 -8
  444. package/clis/linkedin/salesnav-inbox.js +5 -5
  445. package/clis/linkedin/salesnav-message.js +3 -3
  446. package/clis/linkedin/salesnav-search.js +4 -4
  447. package/clis/linkedin/salesnav-thread.js +1 -1
  448. package/clis/linkedin/search-api.js +3 -3
  449. package/clis/linkedin/search.js +8 -8
  450. package/clis/linkedin/social-api.js +31 -31
  451. package/clis/linkedin/timeline.js +3 -3
  452. package/clis/linkedin-learning/search.js +2 -2
  453. package/clis/linkedin-learning/trending.js +2 -2
  454. package/clis/linux-do/feed.js +4 -4
  455. package/clis/linux-do/topic-content.js +8 -8
  456. package/clis/lobsters/domain.js +1 -1
  457. package/clis/lobsters/read.js +7 -7
  458. package/clis/maimai/auth.js +2 -2
  459. package/clis/maimai/search-talents.js +4 -4
  460. package/clis/manus/_utils.js +1 -1
  461. package/clis/mastodon/login.js +1 -1
  462. package/clis/mastodon/post.js +1 -1
  463. package/clis/mastodon/shared.js +12 -12
  464. package/clis/mastodon/whoami.js +1 -1
  465. package/clis/maven/artifact.js +1 -1
  466. package/clis/maven/search.js +1 -1
  467. package/clis/maven/utils.js +1 -1
  468. package/clis/mdn/search.js +1 -1
  469. package/clis/medium/article.js +5 -5
  470. package/clis/medium/login.js +1 -1
  471. package/clis/medium/stats.js +3 -3
  472. package/clis/medium/tag.js +1 -1
  473. package/clis/medium/whoami.js +1 -1
  474. package/clis/mubu/notes.js +1 -1
  475. package/clis/mubu/utils.js +15 -15
  476. package/clis/note/auth.js +2 -2
  477. package/clis/note/note-utils.js +2 -2
  478. package/clis/note/publish.js +8 -8
  479. package/clis/notebooklm/add-source.js +8 -8
  480. package/clis/notebooklm/create.js +1 -1
  481. package/clis/notebooklm/generate-slides.js +1 -1
  482. package/clis/notebooklm/notes-get.js +1 -1
  483. package/clis/notebooklm/rpc.js +8 -8
  484. package/clis/notebooklm/source-fulltext.js +1 -1
  485. package/clis/notebooklm/utils.js +10 -10
  486. package/clis/nowcoder/auth.js +2 -2
  487. package/clis/nowcoder/comment.js +1 -1
  488. package/clis/nowcoder/comments.js +1 -1
  489. package/clis/nowcoder/dm-list.js +1 -1
  490. package/clis/nowcoder/dm-read.js +1 -1
  491. package/clis/nowcoder/dm-send.js +1 -1
  492. package/clis/nowcoder/drafts.js +1 -1
  493. package/clis/nowcoder/inbox.js +1 -1
  494. package/clis/nowcoder/like.js +1 -1
  495. package/clis/nowcoder/my.js +1 -1
  496. package/clis/nowcoder/post.js +1 -1
  497. package/clis/nowcoder/utils.js +13 -13
  498. package/clis/npm/downloads.js +1 -1
  499. package/clis/npm/package.js +1 -1
  500. package/clis/npm/search.js +1 -1
  501. package/clis/npm/utils.js +1 -1
  502. package/clis/nuget/package.js +1 -1
  503. package/clis/nuget/search.js +1 -1
  504. package/clis/nuget/utils.js +1 -1
  505. package/clis/nvd/cve.js +1 -1
  506. package/clis/oeis/search.js +1 -1
  507. package/clis/oeis/sequence.js +1 -1
  508. package/clis/oeis/utils.js +1 -1
  509. package/clis/ones/common.js +6 -6
  510. package/clis/ones/enrich-tasks.js +1 -1
  511. package/clis/ones/my-tasks.js +1 -1
  512. package/clis/ones/resolve-labels.js +1 -1
  513. package/clis/ones/task-helpers.js +1 -1
  514. package/clis/ones/task.js +1 -1
  515. package/clis/ones/worklog.js +7 -7
  516. package/clis/openalex/search.js +1 -1
  517. package/clis/openalex/utils.js +1 -1
  518. package/clis/openalex/work.js +1 -1
  519. package/clis/openfda/drug-label.js +1 -1
  520. package/clis/openfda/food-recall.js +1 -1
  521. package/clis/openfda/utils.js +1 -1
  522. package/clis/openreview/author.js +1 -1
  523. package/clis/openreview/paper.js +1 -1
  524. package/clis/openreview/reviews.js +3 -3
  525. package/clis/openreview/search.js +1 -1
  526. package/clis/openreview/utils.js +1 -1
  527. package/clis/openreview/venue.js +1 -1
  528. package/clis/oschina/article.js +1 -1
  529. package/clis/oschina/catalogs.js +1 -1
  530. package/clis/oschina/login.js +1 -1
  531. package/clis/oschina/stats.js +6 -6
  532. package/clis/oschina/whoami.js +1 -1
  533. package/clis/osv/query.js +1 -1
  534. package/clis/osv/utils.js +1 -1
  535. package/clis/osv/vulnerability.js +1 -1
  536. package/clis/packagist/package.js +1 -1
  537. package/clis/packagist/search.js +1 -1
  538. package/clis/packagist/utils.js +1 -1
  539. package/clis/pinterest/api.js +1 -1
  540. package/clis/pinterest/auth.js +1 -1
  541. package/clis/pinterest/boards.js +1 -1
  542. package/clis/pinterest/client.js +6 -6
  543. package/clis/pinterest/publish.js +5 -5
  544. package/clis/pixiv/auth.js +2 -2
  545. package/clis/pixiv/download.js +1 -1
  546. package/clis/pixiv/illusts.js +1 -1
  547. package/clis/pixiv/search.js +1 -1
  548. package/clis/pixiv/utils.js +3 -3
  549. package/clis/powerchina/auth.js +2 -2
  550. package/clis/powerchina/search.js +1 -1
  551. package/clis/producthunt/browse.js +2 -2
  552. package/clis/producthunt/hot.js +2 -2
  553. package/clis/producthunt/posts.js +1 -1
  554. package/clis/producthunt/today.js +1 -1
  555. package/clis/producthunt/utils.js +1 -1
  556. package/clis/pypi/downloads.js +1 -1
  557. package/clis/pypi/package.js +1 -1
  558. package/clis/pypi/utils.js +1 -1
  559. package/clis/qiita/auth.js +1 -1
  560. package/clis/qiita/gql.js +6 -6
  561. package/clis/qiita/publish.js +4 -4
  562. package/clis/qiita/stats.js +4 -4
  563. package/clis/qoder/_utils.js +16 -16
  564. package/clis/qoder/composer.js +1 -1
  565. package/clis/qoder/quest.js +1 -1
  566. package/clis/qoder/ui.js +14 -14
  567. package/clis/quark/auth.js +2 -2
  568. package/clis/quark/utils.js +2 -2
  569. package/clis/quora/answer-comments.js +3 -3
  570. package/clis/quora/create-answer.js +4 -4
  571. package/clis/quora/create-question.js +3 -3
  572. package/clis/quora/shared.js +17 -17
  573. package/clis/quora/whoami.js +1 -1
  574. package/clis/qwen/ask.js +1 -1
  575. package/clis/qwen/auth.js +3 -3
  576. package/clis/qwen/detail.js +1 -1
  577. package/clis/qwen/image.js +5 -5
  578. package/clis/qwen/status.js +1 -1
  579. package/clis/qwen/utils.js +16 -16
  580. package/clis/reddit/home.js +3 -3
  581. package/clis/reddit/read.js +10 -10
  582. package/clis/reddit/reply.js +4 -4
  583. package/clis/reddit/submit.js +11 -11
  584. package/clis/reddit/subreddit-info.js +3 -3
  585. package/clis/reddit/subscribed.js +4 -4
  586. package/clis/reddit/whoami.js +2 -2
  587. package/clis/rednote/comments.js +1 -1
  588. package/clis/rednote/download.js +1 -1
  589. package/clis/rednote/feed.js +1 -1
  590. package/clis/rednote/note.js +1 -1
  591. package/clis/rednote/notifications.js +2 -2
  592. package/clis/rednote/search.js +2 -2
  593. package/clis/rest-countries/country.js +1 -1
  594. package/clis/rest-countries/region.js +1 -1
  595. package/clis/rest-countries/utils.js +1 -1
  596. package/clis/reuters/article-detail.js +1 -1
  597. package/clis/reuters/auth.js +3 -3
  598. package/clis/reuters/search.js +1 -1
  599. package/clis/reuters/utils.js +4 -4
  600. package/clis/rfc/rfc.js +1 -1
  601. package/clis/rfc/utils.js +1 -1
  602. package/clis/rubygems/gem.js +1 -1
  603. package/clis/rubygems/search.js +1 -1
  604. package/clis/rubygems/utils.js +1 -1
  605. package/clis/segmentfault/article.js +3 -3
  606. package/clis/segmentfault/channels.js +1 -1
  607. package/clis/segmentfault/login.js +1 -1
  608. package/clis/segmentfault/stats.js +4 -4
  609. package/clis/segmentfault/tags.js +1 -1
  610. package/clis/segmentfault/whoami.js +1 -1
  611. package/clis/semanticscholar/citations.js +1 -1
  612. package/clis/semanticscholar/paper.js +1 -1
  613. package/clis/semanticscholar/recommendations.js +1 -1
  614. package/clis/semanticscholar/search.js +1 -1
  615. package/clis/semanticscholar/utils.js +1 -1
  616. package/clis/sinafinance/news.js +1 -1
  617. package/clis/sinafinance/stock-rank.js +1 -1
  618. package/clis/sinafinance/stock.js +1 -1
  619. package/clis/slock/attachment-download.js +1 -1
  620. package/clis/slock/attachment-upload.js +7 -7
  621. package/clis/slock/attachment-url.js +1 -1
  622. package/clis/slock/auth-verify.js +1 -1
  623. package/clis/slock/bookmark-add.js +1 -1
  624. package/clis/slock/bookmark-remove.js +1 -1
  625. package/clis/slock/channel-action.js +1 -1
  626. package/clis/slock/channel-create.js +1 -1
  627. package/clis/slock/channel-files.js +1 -1
  628. package/clis/slock/channel-list.js +1 -1
  629. package/clis/slock/channel-mark.js +1 -1
  630. package/clis/slock/channel-members.js +1 -1
  631. package/clis/slock/channel-unarchive.js +1 -1
  632. package/clis/slock/dm-list.js +1 -1
  633. package/clis/slock/errors.js +1 -1
  634. package/clis/slock/in-page.js +28 -28
  635. package/clis/slock/inbox-done.js +5 -5
  636. package/clis/slock/inbox.js +1 -1
  637. package/clis/slock/message-read.js +22 -22
  638. package/clis/slock/message-search.js +10 -10
  639. package/clis/slock/message-send.js +25 -25
  640. package/clis/slock/reaction-add.js +1 -1
  641. package/clis/slock/reaction-remove.js +1 -1
  642. package/clis/slock/resolve.js +1 -1
  643. package/clis/slock/server-list.js +2 -2
  644. package/clis/slock/task-claim.js +4 -4
  645. package/clis/slock/task-convert.js +13 -13
  646. package/clis/slock/task-create.js +1 -1
  647. package/clis/slock/task-delete.js +5 -5
  648. package/clis/slock/task-get.js +5 -5
  649. package/clis/slock/task-list-server.js +4 -4
  650. package/clis/slock/task-list.js +5 -5
  651. package/clis/slock/task-status.js +3 -3
  652. package/clis/slock/task-unclaim.js +3 -3
  653. package/clis/slock/thread-follow.js +1 -1
  654. package/clis/slock/thread-state.js +1 -1
  655. package/clis/slock/unread-summary.js +5 -5
  656. package/clis/slock/whoami.js +1 -1
  657. package/clis/smzdm/search.js +3 -3
  658. package/clis/sohu/article.js +1 -1
  659. package/clis/sohu/attributes.js +1 -1
  660. package/clis/sohu/categories.js +1 -1
  661. package/clis/sohu/channels.js +1 -1
  662. package/clis/sohu/columns.js +1 -1
  663. package/clis/sohu/login.js +1 -1
  664. package/clis/sohu/stats.js +3 -3
  665. package/clis/sohu/topics.js +1 -1
  666. package/clis/sohu/whoami.js +1 -1
  667. package/clis/spotify/spotify.js +1 -1
  668. package/clis/stackoverflow/read.js +6 -6
  669. package/clis/stackoverflow/related.js +1 -1
  670. package/clis/stackoverflow/tag.js +1 -1
  671. package/clis/stackoverflow/user.js +1 -1
  672. package/clis/stackoverflow/utils.js +1 -1
  673. package/clis/steam/app.js +1 -1
  674. package/clis/steam/search.js +1 -1
  675. package/clis/steam/utils.js +1 -1
  676. package/clis/substack/auth.js +2 -2
  677. package/clis/substack/post-utils.js +2 -2
  678. package/clis/substack/publish.js +5 -5
  679. package/clis/suno/auth.js +2 -2
  680. package/clis/suno/download.js +5 -5
  681. package/clis/suno/generate.js +3 -3
  682. package/clis/suno/list.js +1 -1
  683. package/clis/suno/status.js +1 -1
  684. package/clis/suno/utils.js +29 -29
  685. package/clis/telegram/send.js +7 -7
  686. package/clis/telegram/shared.js +2 -2
  687. package/clis/telegram/whoami.js +1 -1
  688. package/clis/test-utils.js +1 -1
  689. package/clis/threads/post.js +23 -23
  690. package/clis/threads/shared.js +3 -3
  691. package/clis/threads/whoami.js +1 -1
  692. package/clis/tieba/hot.js +3 -3
  693. package/clis/tieba/posts.js +1 -1
  694. package/clis/tieba/read.js +2 -2
  695. package/clis/tieba/search.js +3 -3
  696. package/clis/tieba/utils.js +1 -1
  697. package/clis/tiktok/comment.js +2 -2
  698. package/clis/tiktok/creator-videos.js +3 -3
  699. package/clis/tiktok/explore.js +3 -3
  700. package/clis/tiktok/follow.js +8 -8
  701. package/clis/tiktok/following.js +4 -4
  702. package/clis/tiktok/friends.js +7 -7
  703. package/clis/tiktok/live.js +3 -3
  704. package/clis/tiktok/notifications.js +6 -6
  705. package/clis/tiktok/publish.js +16 -16
  706. package/clis/tiktok/unfollow.js +4 -4
  707. package/clis/tiktok/user.js +2 -2
  708. package/clis/tiktok/utils.js +1 -1
  709. package/clis/toutiao/article.js +1 -1
  710. package/clis/toutiao/articles.js +2 -2
  711. package/clis/toutiao/auth.js +2 -2
  712. package/clis/toutiao/hot.js +1 -1
  713. package/clis/toutiao/recommend.js +1 -1
  714. package/clis/toutiao/utils.js +2 -2
  715. package/clis/trae-solo/_actions.js +4 -4
  716. package/clis/trae-solo/_fs.js +5 -5
  717. package/clis/trae-solo/_state.js +2 -2
  718. package/clis/trae-solo/automation.js +4 -4
  719. package/clis/trae-solo/mode.js +4 -4
  720. package/clis/trae-solo/model.js +4 -4
  721. package/clis/trae-solo/renderer-storage.js +4 -4
  722. package/clis/trae-solo/settings.js +1 -1
  723. package/clis/trae-solo/skill-fs.js +1 -1
  724. package/clis/trae-solo/skill.js +12 -12
  725. package/clis/trae-solo/state-fs.js +2 -2
  726. package/clis/trae-solo/task-fs.js +5 -5
  727. package/clis/trae-solo/workspaces-fs.js +1 -1
  728. package/clis/tumblr/auth.js +2 -2
  729. package/clis/tumblr/publish.js +3 -3
  730. package/clis/tvmaze/search.js +1 -1
  731. package/clis/tvmaze/show.js +1 -1
  732. package/clis/tvmaze/utils.js +1 -1
  733. package/clis/twitter/accept.js +7 -7
  734. package/clis/twitter/article.js +7 -7
  735. package/clis/twitter/bookmark-folder.js +3 -3
  736. package/clis/twitter/bookmark-folders.js +3 -3
  737. package/clis/twitter/bookmarks.js +4 -4
  738. package/clis/twitter/delete.js +5 -5
  739. package/clis/twitter/device-follow.js +3 -3
  740. package/clis/twitter/dm-list.js +1 -1
  741. package/clis/twitter/dm-read.js +1 -1
  742. package/clis/twitter/dm-send.js +5 -5
  743. package/clis/twitter/dm-shared.js +3 -3
  744. package/clis/twitter/download.js +6 -6
  745. package/clis/twitter/followers.js +5 -5
  746. package/clis/twitter/following.js +2 -2
  747. package/clis/twitter/like.js +3 -3
  748. package/clis/twitter/likes.js +8 -8
  749. package/clis/twitter/list-add-core.js +9 -9
  750. package/clis/twitter/list-create.js +5 -5
  751. package/clis/twitter/list-remove-core.js +9 -9
  752. package/clis/twitter/list-tweets.js +7 -7
  753. package/clis/twitter/lists.js +6 -6
  754. package/clis/twitter/notifications.js +2 -2
  755. package/clis/twitter/post.js +24 -24
  756. package/clis/twitter/profile.js +7 -7
  757. package/clis/twitter/quote.js +7 -7
  758. package/clis/twitter/reply-dm.js +7 -7
  759. package/clis/twitter/reply.js +12 -12
  760. package/clis/twitter/retweet.js +3 -3
  761. package/clis/twitter/scheduled-delete.js +3 -3
  762. package/clis/twitter/scheduled-list.js +2 -2
  763. package/clis/twitter/scheduled-utils.js +3 -3
  764. package/clis/twitter/search.js +5 -5
  765. package/clis/twitter/shared.js +6 -6
  766. package/clis/twitter/thread.js +4 -4
  767. package/clis/twitter/timeline.js +3 -3
  768. package/clis/twitter/trending.js +2 -2
  769. package/clis/twitter/tweets.js +11 -11
  770. package/clis/twitter/unlike.js +3 -3
  771. package/clis/twitter/unretweet.js +3 -3
  772. package/clis/twitter/utils.js +6 -6
  773. package/clis/upwork/detail.js +2 -2
  774. package/clis/upwork/feed.js +2 -2
  775. package/clis/upwork/search.js +2 -2
  776. package/clis/upwork/utils.js +1 -1
  777. package/clis/v2ex/auth.js +2 -2
  778. package/clis/v2ex/daily.js +3 -3
  779. package/clis/v2ex/me.js +2 -2
  780. package/clis/v2ex/notifications.js +2 -2
  781. package/clis/vk/post.js +1 -1
  782. package/clis/vk/shared.js +2 -2
  783. package/clis/vk/whoami.js +1 -1
  784. package/clis/web/read.js +8 -8
  785. package/clis/wechat-channels/auth.js +2 -2
  786. package/clis/wechat-channels/publish.js +30 -30
  787. package/clis/weibo/article.js +1 -1
  788. package/clis/weibo/auth.js +3 -3
  789. package/clis/weibo/comments.js +1 -1
  790. package/clis/weibo/delete.js +2 -2
  791. package/clis/weibo/feed.js +3 -3
  792. package/clis/weibo/hot.js +1 -1
  793. package/clis/weibo/publish.js +10 -10
  794. package/clis/weibo/search.js +2 -2
  795. package/clis/weibo/user-posts.js +3 -3
  796. package/clis/weibo/user.js +2 -2
  797. package/clis/weibo/utils.js +3 -3
  798. package/clis/weixin/article.js +1 -1
  799. package/clis/weixin/create-draft.js +26 -26
  800. package/clis/weixin/download.js +2 -2
  801. package/clis/weixin/login.js +1 -1
  802. package/clis/weixin/search.js +2 -2
  803. package/clis/weixin/stats.js +3 -3
  804. package/clis/weixin/whoami.js +1 -1
  805. package/clis/weread/ai-outline.js +2 -2
  806. package/clis/weread/book-search.js +2 -2
  807. package/clis/weread/book.js +2 -2
  808. package/clis/weread/notebooks.js +1 -1
  809. package/clis/weread/search.js +1 -1
  810. package/clis/weread/shelf.js +1 -1
  811. package/clis/weread/utils.js +6 -6
  812. package/clis/weread-official/book.js +1 -1
  813. package/clis/weread-official/discover.js +1 -1
  814. package/clis/weread-official/list-apis.js +1 -1
  815. package/clis/weread-official/notes.js +1 -1
  816. package/clis/weread-official/readdata.js +1 -1
  817. package/clis/weread-official/review.js +1 -1
  818. package/clis/weread-official/search.js +1 -1
  819. package/clis/weread-official/shelf.js +1 -1
  820. package/clis/weread-official/utils.js +1 -1
  821. package/clis/wikidata/entity.js +1 -1
  822. package/clis/wikidata/search.js +1 -1
  823. package/clis/wikidata/utils.js +1 -1
  824. package/clis/wikipedia/page.js +1 -1
  825. package/clis/wikipedia/trending.js +1 -1
  826. package/clis/wikipedia/utils.js +1 -1
  827. package/clis/wordpress/login.js +1 -1
  828. package/clis/wordpress/publish.js +1 -1
  829. package/clis/wordpress/shared.js +3 -3
  830. package/clis/wordpress/whoami.js +1 -1
  831. package/clis/woshipm/article.js +1 -1
  832. package/clis/woshipm/login.js +1 -1
  833. package/clis/woshipm/stats.js +4 -4
  834. package/clis/woshipm/whoami.js +1 -1
  835. package/clis/wttr/current.js +1 -1
  836. package/clis/wttr/forecast.js +1 -1
  837. package/clis/wttr/utils.js +1 -1
  838. package/clis/xianyu/collect.js +1 -1
  839. package/clis/xianyu/inbox.js +1 -1
  840. package/clis/xianyu/item-stats.js +2 -2
  841. package/clis/xianyu/location.js +1 -1
  842. package/clis/xianyu/manage.js +1 -1
  843. package/clis/xianyu/messages.js +1 -1
  844. package/clis/xianyu/mtop.js +5 -5
  845. package/clis/xianyu/order.js +1 -1
  846. package/clis/xianyu/promote-stats.js +2 -2
  847. package/clis/xianyu/publish.js +17 -17
  848. package/clis/xianyu/rate.js +1 -1
  849. package/clis/xianyu/reply.js +1 -1
  850. package/clis/xianyu/search.js +8 -8
  851. package/clis/xianyu/seller-data.js +1 -1
  852. package/clis/xianyu/seller-list.js +1 -1
  853. package/clis/xianyu/user.js +1 -1
  854. package/clis/xiaoe/catalog.js +2 -2
  855. package/clis/xiaoe/content.js +2 -2
  856. package/clis/xiaoe/courses.js +2 -2
  857. package/clis/xiaohongshu/ask.js +6 -6
  858. package/clis/xiaohongshu/comments.js +6 -6
  859. package/clis/xiaohongshu/creator-note-detail.js +7 -7
  860. package/clis/xiaohongshu/creator-notes-summary.js +1 -1
  861. package/clis/xiaohongshu/creator-notes.js +13 -13
  862. package/clis/xiaohongshu/creator-profile.js +2 -2
  863. package/clis/xiaohongshu/creator-stats.js +2 -2
  864. package/clis/xiaohongshu/delete-note.js +7 -7
  865. package/clis/xiaohongshu/download.js +4 -4
  866. package/clis/xiaohongshu/feed.js +2 -2
  867. package/clis/xiaohongshu/follow.js +3 -3
  868. package/clis/xiaohongshu/human.js +3 -3
  869. package/clis/xiaohongshu/note-helpers.js +1 -1
  870. package/clis/xiaohongshu/note.js +2 -2
  871. package/clis/xiaohongshu/notifications.js +1 -1
  872. package/clis/xiaohongshu/publish-video.js +8 -8
  873. package/clis/xiaohongshu/publish.js +59 -59
  874. package/clis/xiaohongshu/search.js +8 -8
  875. package/clis/xiaohongshu/unfollow.js +4 -4
  876. package/clis/xiaohongshu/user-helpers.js +1 -1
  877. package/clis/xiaohongshu/user.js +2 -2
  878. package/clis/xiaoyuzhou/auth.js +3 -3
  879. package/clis/xiaoyuzhou/download.js +1 -1
  880. package/clis/xiaoyuzhou/utils.js +1 -1
  881. package/clis/xueqiu/article.js +4 -4
  882. package/clis/xueqiu/comments.js +4 -4
  883. package/clis/xueqiu/danjuan-utils.js +4 -4
  884. package/clis/xueqiu/earnings-date.js +1 -1
  885. package/clis/xueqiu/events.js +3 -3
  886. package/clis/xueqiu/hashtags.js +3 -3
  887. package/clis/xueqiu/stocks.js +3 -3
  888. package/clis/xueqiu/users.js +3 -3
  889. package/clis/xueqiu/utils.js +3 -3
  890. package/clis/yahoo-finance/quote.js +1 -1
  891. package/clis/yollomi/background.js +1 -1
  892. package/clis/yollomi/edit.js +1 -1
  893. package/clis/yollomi/face-swap.js +1 -1
  894. package/clis/yollomi/generate.js +1 -1
  895. package/clis/yollomi/object-remover.js +1 -1
  896. package/clis/yollomi/remove-bg.js +1 -1
  897. package/clis/yollomi/restore.js +1 -1
  898. package/clis/yollomi/try-on.js +1 -1
  899. package/clis/yollomi/upload.js +4 -4
  900. package/clis/yollomi/upscale.js +1 -1
  901. package/clis/yollomi/utils.js +4 -4
  902. package/clis/yollomi/video.js +1 -1
  903. package/clis/youtube/channel.js +4 -4
  904. package/clis/youtube/feed.js +2 -2
  905. package/clis/youtube/like.js +5 -5
  906. package/clis/youtube/playlist.js +7 -7
  907. package/clis/youtube/publish.js +11 -11
  908. package/clis/youtube/search.js +3 -3
  909. package/clis/youtube/subscribe.js +7 -7
  910. package/clis/youtube/subscriptions.js +1 -1
  911. package/clis/youtube/transcript-group.js +2 -2
  912. package/clis/youtube/transcript.js +13 -13
  913. package/clis/youtube/unlike.js +5 -5
  914. package/clis/youtube/unsubscribe.js +7 -7
  915. package/clis/youtube/utils.js +3 -3
  916. package/clis/youtube/video.js +4 -4
  917. package/clis/youtube/watch-later.js +2 -2
  918. package/clis/yuanbao/ask.js +18 -18
  919. package/clis/yuanbao/detail.js +1 -1
  920. package/clis/yuanbao/read.js +1 -1
  921. package/clis/yuanbao/shared.js +9 -9
  922. package/clis/yuanbao/status.js +1 -1
  923. package/clis/yuque/article.js +1 -1
  924. package/clis/yuque/whoami.js +1 -1
  925. package/clis/zhihu/answer-comments.js +2 -2
  926. package/clis/zhihu/answer-detail.js +3 -3
  927. package/clis/zhihu/answer.js +1 -1
  928. package/clis/zhihu/article-transform.js +1 -1
  929. package/clis/zhihu/article.js +1 -1
  930. package/clis/zhihu/auth.js +2 -2
  931. package/clis/zhihu/collection.js +3 -3
  932. package/clis/zhihu/collections.js +3 -3
  933. package/clis/zhihu/download.js +2 -2
  934. package/clis/zhihu/image-profile.js +6 -6
  935. package/clis/zhihu/paginate.js +3 -3
  936. package/clis/zhihu/pin.js +4 -4
  937. package/clis/zhihu/question.js +3 -3
  938. package/clis/zhihu/recommend.js +3 -3
  939. package/clis/zhihu/search.js +3 -3
  940. package/clis/zhihu/stats.js +3 -3
  941. package/clis/zhihu/user-arg.js +1 -1
  942. package/clis/zhihu/write-shared.js +7 -7
  943. package/clis/zlibrary/utils.js +6 -6
  944. package/clis/zsxq/auth.js +3 -3
  945. package/clis/zsxq/search.js +1 -1
  946. package/clis/zsxq/topic.js +1 -1
  947. package/clis/zsxq/utils.js +5 -5
  948. package/dist/src/adapter-source.js +1 -1
  949. package/dist/src/browser/analyze.js +1 -1
  950. package/dist/src/browser/article-extract.js +2 -2
  951. package/dist/src/browser/ax-snapshot.js +2 -2
  952. package/dist/src/browser/base-page.js +25 -25
  953. package/dist/src/browser/bridge.js +1 -1
  954. package/dist/src/browser/cdp.js +1 -1
  955. package/dist/src/browser/daemon-client.js +1 -1
  956. package/dist/src/browser/daemon-lifecycle.js +7 -7
  957. package/dist/src/browser/dom-helpers.js +35 -35
  958. package/dist/src/browser/dom-snapshot.js +19 -19
  959. package/dist/src/browser/errors.js +3 -3
  960. package/dist/src/browser/extract.js +5 -5
  961. package/dist/src/browser/find.js +13 -13
  962. package/dist/src/browser/fingerprint.js +2 -2
  963. package/dist/src/browser/html-tree.js +6 -6
  964. package/dist/src/browser/managed-chrome.js +1 -1
  965. package/dist/src/browser/network-cache.js +1 -1
  966. package/dist/src/browser/network-key.js +1 -1
  967. package/dist/src/browser/page.js +7 -7
  968. package/dist/src/browser/profile.js +2 -2
  969. package/dist/src/browser/proxy-test.js +8 -8
  970. package/dist/src/browser/shape-filter.js +1 -1
  971. package/dist/src/browser/shape.js +1 -1
  972. package/dist/src/browser/stealth.js +3 -3
  973. package/dist/src/browser/tabs.js +2 -2
  974. package/dist/src/browser/target-errors.js +1 -1
  975. package/dist/src/browser/target-resolver.js +23 -23
  976. package/dist/src/browser/trace.js +2 -2
  977. package/dist/src/browser/utils.js +1 -1
  978. package/dist/src/browser/verify-fixture.js +2 -2
  979. package/dist/src/browser-session-lock.js +1 -1
  980. package/dist/src/build-manifest.js +11 -11
  981. package/dist/src/capabilityRouting.js +1 -1
  982. package/dist/src/cli-argv-preprocess.js +1 -1
  983. package/dist/src/cli.js +32 -32
  984. package/dist/src/commanderAdapter.js +3 -3
  985. package/dist/src/commands/auth.js +3 -3
  986. package/dist/src/commands/daemon.js +1 -1
  987. package/dist/src/completion-fast.js +1 -1
  988. package/dist/src/completion.js +1 -1
  989. package/dist/src/constants.js +1 -1
  990. package/dist/src/convention-audit.js +2 -2
  991. package/dist/src/daemon-utils.js +1 -1
  992. package/dist/src/daemon.js +1 -1
  993. package/dist/src/discovery.js +2 -2
  994. package/dist/src/doctor.js +9 -9
  995. package/dist/src/download/article-download.js +15 -15
  996. package/dist/src/download/index.js +4 -4
  997. package/dist/src/download/media-download.js +1 -1
  998. package/dist/src/download/progress.js +3 -3
  999. package/dist/src/electron-apps.js +1 -1
  1000. package/dist/src/errors.js +2 -2
  1001. package/dist/src/execution.js +2 -2
  1002. package/dist/src/external.js +1 -1
  1003. package/dist/src/help.js +8 -8
  1004. package/dist/src/hooks.js +1 -1
  1005. package/dist/src/interceptor.js +21 -21
  1006. package/dist/src/launcher.js +7 -7
  1007. package/dist/src/logger.js +8 -8
  1008. package/dist/src/main.js +7 -7
  1009. package/dist/src/observation/artifact.js +5 -5
  1010. package/dist/src/observation/retention.js +1 -1
  1011. package/dist/src/output.js +2 -2
  1012. package/dist/src/package-paths.js +1 -1
  1013. package/dist/src/pipeline/executor.js +1 -1
  1014. package/dist/src/pipeline/registry.js +1 -1
  1015. package/dist/src/pipeline/steps/browser.js +1 -1
  1016. package/dist/src/pipeline/steps/download.js +1 -1
  1017. package/dist/src/pipeline/steps/fetch.js +6 -6
  1018. package/dist/src/pipeline/steps/intercept.js +1 -1
  1019. package/dist/src/pipeline/steps/tap.js +17 -17
  1020. package/dist/src/pipeline/steps/transform.js +1 -1
  1021. package/dist/src/pipeline/template.js +1 -1
  1022. package/dist/src/plugin-manifest.js +1 -1
  1023. package/dist/src/plugin-scaffold.js +19 -19
  1024. package/dist/src/plugin.js +12 -12
  1025. package/dist/src/rate-limit.js +1 -1
  1026. package/dist/src/registry.js +1 -1
  1027. package/dist/src/runtime-detect.js +1 -1
  1028. package/dist/src/runtime.js +1 -1
  1029. package/dist/src/scripts/framework.js +1 -1
  1030. package/dist/src/scripts/interact.js +1 -1
  1031. package/dist/src/scripts/store.js +1 -1
  1032. package/dist/src/serialization.js +2 -2
  1033. package/dist/src/session-lease.js +1 -1
  1034. package/dist/src/snapshotFormatter.js +2 -2
  1035. package/dist/src/tui.js +12 -12
  1036. package/dist/src/user-runtime.js +1 -1
  1037. package/dist/src/utils.d.ts +12 -0
  1038. package/dist/src/utils.js +4 -4
  1039. package/dist/src/validate.js +2 -2
  1040. package/dist/src/verify.js +2 -2
  1041. package/dist/src/version.js +1 -1
  1042. package/package.json +1 -1
@@ -1 +1 @@
1
- import{cli as X,Strategy as Y}from"@jackwener/opencli/registry";import{ArgumentError as Z,EmptyResultError as W}from"@jackwener/opencli/errors";import{GEMINI_APP_URL as $,GEMINI_DOMAIN as b,ensureGeminiPage as D,getGeminiConversationList as F,getGeminiVisibleTurns as O,resolveGeminiConversationForQuery as P}from"./utils.js";import{extractGeminiId as Q}from"./history.js";async function S(j,H){const f=String(H||"").trim();if(!f)throw new Z("id","must be a conversation id, /app/<id> URL, or sidebar title");const z=Q(f),B=f.startsWith("http")||f.startsWith("/app/")||/^[a-f0-9]{16,}$/i.test(f);if(z&&B)return`${$}/${z}`;const J=await F(j),K=P(J,f,"contains");if(!K||!K.Url)throw new W("gemini detail",`No sidebar conversation matched "${f}". Try the exact id from \`ppcli gemini history\` instead.`);return K.Url}export const detailCommand=X({site:"gemini",name:"detail",access:"read",description:"Open a Gemini web conversation by id, URL, or sidebar title and read its turns",domain:b,strategy:Y.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"id",positional:!0,required:!0,help:"Conversation id, /app/<id> URL, or sidebar title"}],columns:["Index","Role","Text"],func:async(j,H)=>{await D(j);const f=await S(j,H?.id);await j.goto(f,{waitUntil:"load",settleMs:2500});const z=await O(j);if(!Array.isArray(z)||z.length===0)throw new W("gemini detail",`No turns were visible after navigating to ${f}.`);return z.map((B,J)=>({Index:J+1,Role:B.Role||"System",Text:B.Text||""}))}});
1
+ import{cli as d,Strategy as m}from"@jackwener/opencli/registry";import{ArgumentError as l,EmptyResultError as s}from"@jackwener/opencli/errors";import{GEMINI_APP_URL as c,GEMINI_DOMAIN as u,ensureGeminiPage as p,getGeminiConversationList as g,getGeminiVisibleTurns as w,resolveGeminiConversationForQuery as f}from"./utils.js";import{extractGeminiId as h}from"./history.js";async function v(e,n){const t=String(n||"").trim();if(!t)throw new l("id","must be a conversation id, /app/<id> URL, or sidebar title");const i=h(t),r=t.startsWith("http")||t.startsWith("/app/")||/^[a-f0-9]{16,}$/i.test(t);if(i&&r)return`${c}/${i}`;const o=await g(e),a=f(o,t,"contains");if(!a||!a.Url)throw new s("gemini detail",`No sidebar conversation matched "${t}". Try the exact id from \`ppcli gemini history\` instead.`);return a.Url}export const detailCommand=d({site:"gemini",name:"detail",access:"read",description:"Open a Gemini web conversation by id, URL, or sidebar title and read its turns",domain:u,strategy:m.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"id",positional:!0,required:!0,help:"Conversation id, /app/<id> URL, or sidebar title"}],columns:["Index","Role","Text"],func:async(e,n)=>{await p(e);const t=await v(e,n?.id);await e.goto(t,{waitUntil:"load",settleMs:2500});const i=await w(e);if(!Array.isArray(i)||i.length===0)throw new s("gemini detail",`No turns were visible after navigating to ${t}.`);return i.map((r,o)=>({Index:o+1,Role:r.Role||"System",Text:r.Text||""}))}});
@@ -1 +1 @@
1
- import{cli as H,Strategy as J}from"@jackwener/opencli/registry";import{ArgumentError as K,EmptyResultError as Q}from"@jackwener/opencli/errors";import{GEMINI_DOMAIN as T,ensureGeminiPage as U,getGeminiConversationList as V}from"./utils.js";function extractGeminiId(q){const h=String(q||"").trim();if(!h)return"";try{const B=new URL(h,"https://gemini.google.com").pathname.match(/^\/app\/([A-Za-z0-9_-]+)/);if(B)return B[1]}catch{}const f=h.replace(/^.*\/app\//,"").replace(/\/.*$/,"");return/^[A-Za-z0-9_-]+$/.test(f)?f:""}export const historyCommand=H({site:"gemini",name:"history",access:"read",description:"List visible Gemini web conversation history from the sidebar",domain:T,strategy:J.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"limit",type:"int",default:20,help:"Max conversations to show"}],columns:["Index","Id","Title","Url"],func:async(q,h)=>{const f=Number(h?.limit??20);if(!Number.isInteger(f)||f<1||f>200)throw new K("limit","must be a positive integer ≤ 200");await U(q);const z=await V(q);if(!z.length)throw new Q("gemini history","No Gemini conversation links were visible in the sidebar. Open the sidebar and confirm at least one chat is listed under Recents.");return z.map((b)=>({id:extractGeminiId(b.Url),title:b.Title||"",url:b.Url||""})).filter((b)=>b.id).slice(0,f).map((b,F)=>({Index:F+1,Id:b.id,Title:b.title,Url:b.url}))}});export{extractGeminiId};
1
+ import{cli as a,Strategy as m}from"@jackwener/opencli/registry";import{ArgumentError as c,EmptyResultError as l}from"@jackwener/opencli/errors";import{GEMINI_DOMAIN as p,ensureGeminiPage as d,getGeminiConversationList as u}from"./utils.js";function extractGeminiId(r){const i=String(r||"").trim();if(!i)return"";try{const s=new URL(i,"https://gemini.google.com").pathname.match(/^\/app\/([A-Za-z0-9_-]+)/);if(s)return s[1]}catch{}const t=i.replace(/^.*\/app\//,"").replace(/\/.*$/,"");return/^[A-Za-z0-9_-]+$/.test(t)?t:""}export const historyCommand=a({site:"gemini",name:"history",access:"read",description:"List visible Gemini web conversation history from the sidebar",domain:p,strategy:m.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"limit",type:"int",default:20,help:"Max conversations to show"}],columns:["Index","Id","Title","Url"],func:async(r,i)=>{const t=Number(i?.limit??20);if(!Number.isInteger(t)||t<1||t>200)throw new c("limit","must be a positive integer ≤ 200");await d(r);const n=await u(r);if(!n.length)throw new l("gemini history","No Gemini conversation links were visible in the sidebar. Open the sidebar and confirm at least one chat is listed under Recents.");return n.map((e)=>({id:extractGeminiId(e.Url),title:e.Title||"",url:e.Url||""})).filter((e)=>e.id).slice(0,t).map((e,o)=>({Index:o+1,Id:e.id,Title:e.title,Url:e.url}))}});export{extractGeminiId};
@@ -1,3 +1,3 @@
1
- import*as f from"node:os";import*as p from"node:path";import{cli as S,Strategy as F}from"@jackwener/opencli/registry";import{saveBase64ToFile as k}from"@jackwener/opencli/utils";import{ArgumentError as v}from"@jackwener/opencli/errors";import{GEMINI_DOMAIN as D,exportGeminiImages as M,getGeminiVisibleImageUrls as j,sendGeminiMessage as z,startNewGeminiChat as C,waitForGeminiImages as N}from"./utils.js";function O(e){if(e.includes("png"))return".png";if(e.includes("webp"))return".webp";if(e.includes("gif"))return".gif";return".jpg"}function q(e){if(typeof e==="boolean")return e;const t=String(e??"").trim().toLowerCase();return t==="true"||t==="1"||t==="yes"||t==="on"}function B(e){const t=f.homedir();return e.startsWith(t)?`~${e.slice(t.length)}`:e}function E(e,t){const i=[];if(t.ratio)i.push(`aspect ratio ${t.ratio}`);if(t.style)i.push(`style ${t.style}`);if(i.length===0)return e;return`${e}
1
+ import*as f from"node:os";import*as p from"node:path";import{cli as F,Strategy as k}from"@jackwener/opencli/registry";import{saveBase64ToFile as v}from"@jackwener/opencli/utils";import{ArgumentError as D}from"@jackwener/opencli/errors";import{GEMINI_DOMAIN as M,exportGeminiImages as j,getGeminiVisibleImageUrls as z,sendGeminiMessage as C,startNewGeminiChat as N,waitForGeminiImages as O}from"./utils.js";function q(e){if(e.includes("png"))return".png";if(e.includes("webp"))return".webp";if(e.includes("gif"))return".gif";return".jpg"}function B(e){if(typeof e==="boolean")return e;const t=String(e??"").trim().toLowerCase();return t==="true"||t==="1"||t==="yes"||t==="on"}function E(e){const t=f.homedir();return e.startsWith(t)?`~${e.slice(t.length)}`:e}function R(e,t){const i=[];if(t.ratio)i.push(`aspect ratio ${t.ratio}`);if(t.style)i.push(`style ${t.style}`);if(i.length===0)return e;return`${e}
2
2
 
3
- Image requirements: ${i.join(", ")}.`}function R(e){const t=e.trim();return new Set(["1:1","16:9","9:16","4:3","3:4","3:2","2:3"]).has(t)?t:"1:1"}async function U(e){const t=await e.evaluate("window.location.href").catch(()=>"");return typeof t==="string"&&t?t:"https://gemini.google.com/app"}export const imageCommand=S({site:"gemini",name:"image",access:"write",description:"Generate images with Gemini web and save them locally",domain:D,strategy:F.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,defaultFormat:"plain",args:[{name:"prompt",fromFile:!0,positional:!0,required:!0,help:"Image prompt to send to Gemini"},{name:"rt",default:"1:1",help:"Ratio shorthand for aspect ratio (1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3)"},{name:"st",default:"",help:"Style shorthand, e.g. anime, icon, watercolor"},{name:"op",default:"~/tmp/gemini-images",help:"Output directory shorthand"},{name:"sd",type:"boolean",default:!1,help:"Skip download shorthand; only show Gemini page link"},{name:"timeout",type:"int",required:!1,default:240,help:"Max seconds for the overall command (default: 240)"}],columns:["status","file","link"],func:async(e,t)=>{const i=t.prompt,d=R(String(t.rt??"1:1")),h=String(t.st??"").trim(),g=t.op||p.join(f.homedir(),"tmp","gemini-images"),s=t.timeout;if(!Number.isInteger(s)||s<1)throw new v("--timeout must be a positive integer (seconds)");const w=!0,a=t.sd,y=a===""||a===!0||q(a),$=E(i,{ratio:d,style:h||void 0});if(w)await C(e);const b=await j(e);await z(e,$);const l=await N(e,b,s),n=await U(e);if(!l.length)return[{status:"⚠️ no-images",file:"\uD83D\uDCC1 -",link:`\uD83D\uDD17 ${n}`}];if(y)return[{status:"\uD83C\uDFA8 generated",file:"\uD83D\uDCC1 -",link:`\uD83D\uDD17 ${n}`}];const o=await M(e,l);if(!o.length)return[{status:"⚠️ export-failed",file:"\uD83D\uDCC1 -",link:`\uD83D\uDD17 ${n}`}];const G=Date.now(),m=[];for(let r=0;r<o.length;r+=1){const u=o[r],I=u.dataUrl.replace(/^data:[^;]+;base64,/,""),x=o.length>1?`_${r+1}`:"",c=p.join(g,`gemini_${G}${x}${O(u.mimeType)}`);await k(I,c);m.push({status:"✅ saved",file:`\uD83D\uDCC1 ${B(c)}`,link:`\uD83D\uDD17 ${n}`})}return m}});
3
+ Image requirements: ${i.join(", ")}.`}function U(e){const t=e.trim();return new Set(["1:1","16:9","9:16","4:3","3:4","3:2","2:3"]).has(t)?t:"1:1"}async function _(e){const t=await e.evaluate("window.location.href").catch(()=>"");return typeof t==="string"&&t?t:"https://gemini.google.com/app"}export const imageCommand=F({site:"gemini",name:"image",access:"write",description:"Generate images with Gemini web and save them locally",domain:M,strategy:k.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,defaultFormat:"plain",args:[{name:"prompt",fromFile:!0,positional:!0,required:!0,help:"Image prompt to send to Gemini"},{name:"rt",default:"1:1",help:"Ratio shorthand for aspect ratio (1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3)"},{name:"st",default:"",help:"Style shorthand, e.g. anime, icon, watercolor"},{name:"op",default:"~/tmp/gemini-images",help:"Output directory shorthand"},{name:"sd",type:"boolean",default:!1,help:"Skip download shorthand; only show Gemini page link"},{name:"timeout",type:"int",required:!1,default:240,help:"Max seconds for the overall command (default: 240)"}],columns:["status","file","link"],func:async(e,t)=>{const i=t.prompt,d=U(String(t.rt??"1:1")),h=String(t.st??"").trim(),g=t.op||p.join(f.homedir(),"tmp","gemini-images"),s=t.timeout;if(!Number.isInteger(s)||s<1)throw new D("--timeout must be a positive integer (seconds)");const w=!0,a=t.sd,y=a===""||a===!0||B(a),b=R(i,{ratio:d,style:h||void 0});if(w)await N(e);const G=await z(e);await C(e,b);const l=await O(e,G,s),n=await _(e);if(!l.length)return[{status:"⚠️ no-images",file:"\uD83D\uDCC1 -",link:`\uD83D\uDD17 ${n}`}];if(y)return[{status:"\uD83C\uDFA8 generated",file:"\uD83D\uDCC1 -",link:`\uD83D\uDD17 ${n}`}];const o=await j(e,l);if(!o.length)return[{status:"⚠️ export-failed",file:"\uD83D\uDCC1 -",link:`\uD83D\uDD17 ${n}`}];const I=Date.now(),m=[];for(let r=0;r<o.length;r+=1){const u=o[r],x=u.dataUrl.replace(/^data:[^;]+;base64,/,""),S=o.length>1?`_${r+1}`:"",c=p.join(g,`gemini_${I}${S}${q(u.mimeType)}`);await v(x,c);m.push({status:"✅ saved",file:`\uD83D\uDCC1 ${E(c)}`,link:`\uD83D\uDD17 ${n}`})}return m}});
@@ -1 +1 @@
1
- import{cli as B,Strategy as F}from"@jackwener/opencli/registry";import{GEMINI_DOMAIN as H,ensureGeminiPage as J,getGeminiPageState as K}from"./utils.js";export const statusCommand=B({site:"gemini",name:"status",access:"read",description:"Check Gemini web page availability and login state",domain:H,strategy:F.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status","Login","Url"],func:async(q)=>{await J(q);const h=await K(q),z=h.isSignedIn===!1?"No":"Yes";return[{Status:h.canSend?"Connected":"Page not ready",Login:z,Url:h.url||""}]}});
1
+ import{cli as n,Strategy as s}from"@jackwener/opencli/registry";import{GEMINI_DOMAIN as i,ensureGeminiPage as o,getGeminiPageState as r}from"./utils.js";export const statusCommand=n({site:"gemini",name:"status",access:"read",description:"Check Gemini web page availability and login state",domain:i,strategy:s.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status","Login","Url"],func:async(t)=>{await o(t);const e=await r(t),a=e.isSignedIn===!1?"No":"Yes";return[{Status:e.canSend?"Connected":"Page not ready",Login:a,Url:e.url||""}]}});
@@ -1,4 +1,4 @@
1
- import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const GEMINI_DOMAIN="gemini.google.com",GEMINI_APP_URL="https://gemini.google.com/app",GEMINI_DEEP_RESEARCH_DEFAULT_TOOL_LABELS=["Deep Research","Deep research","深度研究"],GEMINI_DEEP_RESEARCH_DEFAULT_CONFIRM_LABELS=["Start research","Start Research","Start deep research","Start Deep Research","Generate research plan","Generate Research Plan","Generate deep research plan","Generate Deep Research Plan","开始研究","开始深度研究","开始调研","生成研究计划","生成调研计划"];const s=[/Gemini can make mistakes\.?/gi,/Google Terms/gi,/Google Privacy Policy/gi,/Opens in a new window/gi],i=["gemini","我的内容","对话","google terms","google privacy policy"],Y=['.ql-editor[contenteditable="true"]','.ql-editor[role="textbox"]','.ql-editor[aria-label*="Gemini"]','[contenteditable="true"][aria-label*="Gemini"]','[aria-label="Enter a prompt for Gemini"]','[aria-label*="prompt for Gemini"]'],Z="data-opencli-gemini-composer",_=4,u=1;function S(f){return!!f&&typeof f==="object"&&!Array.isArray(f)}function U(f,g){if(S(f)&&Object.prototype.hasOwnProperty.call(f,"session")){if(Object.prototype.hasOwnProperty.call(f,"data"))return f.data;throw new P(`${g} returned a malformed Browser Bridge envelope`)}return f}function V(f,g){const j=U(f,g);if(!Array.isArray(j))throw new P(`${g} returned a malformed result`);return j}function $(f,g){const j=U(f,g);if(!S(j))throw new P(`${g} returned a malformed result`);return j}function Q(){const f=JSON.stringify(Y);return`
1
+ import{CommandExecutionError as g}from"@jackwener/opencli/errors";export const GEMINI_DOMAIN="gemini.google.com",GEMINI_APP_URL="https://gemini.google.com/app",GEMINI_DEEP_RESEARCH_DEFAULT_TOOL_LABELS=["Deep Research","Deep research","深度研究"],GEMINI_DEEP_RESEARCH_DEFAULT_CONFIRM_LABELS=["Start research","Start Research","Start deep research","Start Deep Research","Generate research plan","Generate Research Plan","Generate deep research plan","Generate Deep Research Plan","开始研究","开始深度研究","开始调研","生成研究计划","生成调研计划"];const F=[/Gemini can make mistakes\.?/gi,/Google Terms/gi,/Google Privacy Policy/gi,/Opens in a new window/gi],W=["gemini","我的内容","对话","google terms","google privacy policy"],v=['.ql-editor[contenteditable="true"]','.ql-editor[role="textbox"]','.ql-editor[aria-label*="Gemini"]','[contenteditable="true"][aria-label*="Gemini"]','[aria-label="Enter a prompt for Gemini"]','[aria-label*="prompt for Gemini"]'],C="data-opencli-gemini-composer",L=4,j=1;function y(e){return!!e&&typeof e==="object"&&!Array.isArray(e)}function x(e,t){if(y(e)&&Object.prototype.hasOwnProperty.call(e,"session")){if(Object.prototype.hasOwnProperty.call(e,"data"))return e.data;throw new g(`${t} returned a malformed Browser Bridge envelope`)}return e}function T(e,t){const n=x(e,t);if(!Array.isArray(n))throw new g(`${t} returned a malformed result`);return n}function E(e,t){const n=x(e,t);if(!y(n))throw new g(`${t} returned a malformed result`);return n}function w(){const e=JSON.stringify(v);return`
2
2
  const isVisible = (el) => {
3
3
  if (!(el instanceof HTMLElement)) return false;
4
4
  const style = window.getComputedStyle(el);
@@ -7,7 +7,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
7
7
  return rect.width > 0 && rect.height > 0;
8
8
  };
9
9
 
10
- const markerAttr = ${JSON.stringify(Z)};
10
+ const markerAttr = ${JSON.stringify(C)};
11
11
  const clearComposerMarkers = (active) => {
12
12
  document.querySelectorAll('[' + markerAttr + ']').forEach((node) => {
13
13
  if (node !== active) node.removeAttribute(markerAttr);
@@ -25,23 +25,23 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
25
25
  const marked = document.querySelector('[' + markerAttr + '="1"]');
26
26
  if (marked instanceof HTMLElement && isVisible(marked)) return marked;
27
27
 
28
- const selectors = ${f};
28
+ const selectors = ${e};
29
29
  for (const selector of selectors) {
30
30
  const node = Array.from(document.querySelectorAll(selector)).find((candidate) => candidate instanceof HTMLElement && isVisible(candidate));
31
31
  if (node instanceof HTMLElement) return markComposer(node);
32
32
  }
33
33
  return null;
34
34
  };
35
- `}export function resolveGeminiLabels(f,g){const j=String(f??"").trim();return j?[j]:g}export function parseGeminiTitleMatchMode(f,g="contains"){const j=String(f??g).trim().toLowerCase();if(j==="contains"||j==="exact")return j;return null}export function parseGeminiConversationUrl(f){const g=String(f??"").trim();if(!g)return null;try{const j=new URL(g);if(j.hostname!==GEMINI_DOMAIN&&!j.hostname.endsWith(`.${GEMINI_DOMAIN}`))return null;if(!j.pathname.startsWith("/app/"))return null;return j.href}catch{return null}}export function normalizeGeminiTitle(f){return f.replace(/\s+/g," ").trim().toLowerCase()}export function pickGeminiConversationByTitle(f,g,j="contains"){const q=normalizeGeminiTitle(g);if(!q)return null;for(const w of f){const v=normalizeGeminiTitle(w.Title);if(!v)continue;if(j==="exact"){if(v===q)return w;continue}if(v.includes(q))return w}return null}export function resolveGeminiConversationForQuery(f,g,j){const q=String(g??"").trim();if(!q)return f[0]??null;const w=pickGeminiConversationByTitle(f,q,"exact");if(w)return w;if(j==="contains")return pickGeminiConversationByTitle(f,q,"contains");return null}export function sanitizeGeminiResponseText(f,g){let j=f;for(const w of s)j=j.replace(w,"");j=j.trim();const q=g.trim();if(!q)return j;if(j===q)return"";for(const w of[`
35
+ `}export function resolveGeminiLabels(e,t){const n=String(e??"").trim();return n?[n]:t}export function parseGeminiTitleMatchMode(e,t="contains"){const n=String(e??t).trim().toLowerCase();if(n==="contains"||n==="exact")return n;return null}export function parseGeminiConversationUrl(e){const t=String(e??"").trim();if(!t)return null;try{const n=new URL(t);if(n.hostname!==GEMINI_DOMAIN&&!n.hostname.endsWith(`.${GEMINI_DOMAIN}`))return null;if(!n.pathname.startsWith("/app/"))return null;return n.href}catch{return null}}export function normalizeGeminiTitle(e){return e.replace(/\s+/g," ").trim().toLowerCase()}export function pickGeminiConversationByTitle(e,t,n="contains"){const r=normalizeGeminiTitle(t);if(!r)return null;for(const i of e){const o=normalizeGeminiTitle(i.Title);if(!o)continue;if(n==="exact"){if(o===r)return i;continue}if(o.includes(r))return i}return null}export function resolveGeminiConversationForQuery(e,t,n){const r=String(t??"").trim();if(!r)return e[0]??null;const i=pickGeminiConversationByTitle(e,r,"exact");if(i)return i;if(n==="contains")return pickGeminiConversationByTitle(e,r,"contains");return null}export function sanitizeGeminiResponseText(e,t){let n=e;for(const i of F)n=n.replace(i,"");n=n.trim();const r=t.trim();if(!r)return n;if(n===r)return"";for(const i of[`
36
36
 
37
37
  `,`
38
38
  `,`\r
39
39
  \r
40
40
  `,`\r
41
- `]){const v=`${q}${w}`;if(j.startsWith(v))return j.slice(v.length).trim()}return j}export function collectGeminiTranscriptAdditions(f,g,j){const q=new Set(f);return g.filter((v)=>!q.has(v)).map((v)=>F(v,j)).filter((v)=>v&&v!==j).join(`
42
- `).trim()}export function collapseAdjacentGeminiTurns(f){const g=[];for(const j of f){if(!j||typeof j.Role!=="string"||typeof j.Text!=="string")continue;const q=g.at(-1);if(q?.Role===j.Role&&q.Text===j.Text)continue;g.push(j)}return g}function W(f,g){if(f.length>g.length)return!1;return f.every((j,q)=>j.Role===g[q]?.Role&&j.Text===g[q]?.Text)}function c(f,g){if(!g)return null;for(let j=f.length-1;j>=0;j-=1){const q=f[j];if(q?.Role===g.Role&&q.Text===g.Text)return j}return null}function b(f,g){if(!f.structuredTurnsTrusted||!g.structuredTurnsTrusted)return{appendedTurns:[],hasTrustedAppend:!1,hasNewUserTurn:!1,hasNewAssistantTurn:!1};if(!W(f.turns,g.turns))return{appendedTurns:[],hasTrustedAppend:!1,hasNewUserTurn:!1,hasNewAssistantTurn:!1};const j=g.turns.slice(f.turns.length);return{appendedTurns:j,hasTrustedAppend:j.length>0,hasNewUserTurn:j.some((q)=>q.Role==="User"),hasNewAssistantTurn:j.some((q)=>q.Role==="Assistant")}}function y(f,g){const j=new Set(f.transcriptLines);return g.transcriptLines.filter((q)=>!j.has(q))}function d(f){const g=f.toLowerCase();return i.filter((q)=>g.includes(q)).length>=2}function F(f,g){const j=f.trim();if(!j)return"";const q=g.trim(),w=sanitizeGeminiResponseText(j,g);if(!q)return w;if(!j.includes(q))return w;if(w&&w!==q&&w!==j)return w;if(d(j))return"";if(j.startsWith(q)){const v=j.slice(q.length).replace(/^[\s::,,-]+/,"").trim();return v?sanitizeGeminiResponseText(v,""):""}return w}function a(){return`
41
+ `]){const o=`${r}${i}`;if(n.startsWith(o))return n.slice(o.length).trim()}return n}export function collectGeminiTranscriptAdditions(e,t,n){const r=new Set(e);return t.filter((o)=>!r.has(o)).map((o)=>M(o,n)).filter((o)=>o&&o!==n).join(`
42
+ `).trim()}export function collapseAdjacentGeminiTurns(e){const t=[];for(const n of e){if(!n||typeof n.Role!=="string"||typeof n.Text!=="string")continue;const r=t.at(-1);if(r?.Role===n.Role&&r.Text===n.Text)continue;t.push(n)}return t}function A(e,t){if(e.length>t.length)return!1;return e.every((n,r)=>n.Role===t[r]?.Role&&n.Text===t[r]?.Text)}function K(e,t){if(!t)return null;for(let n=e.length-1;n>=0;n-=1){const r=e[n];if(r?.Role===t.Role&&r.Text===t.Text)return n}return null}function R(e,t){if(!e.structuredTurnsTrusted||!t.structuredTurnsTrusted)return{appendedTurns:[],hasTrustedAppend:!1,hasNewUserTurn:!1,hasNewAssistantTurn:!1};if(!A(e.turns,t.turns))return{appendedTurns:[],hasTrustedAppend:!1,hasNewUserTurn:!1,hasNewAssistantTurn:!1};const n=t.turns.slice(e.turns.length);return{appendedTurns:n,hasTrustedAppend:n.length>0,hasNewUserTurn:n.some((r)=>r.Role==="User"),hasNewAssistantTurn:n.some((r)=>r.Role==="Assistant")}}function k(e,t){const n=new Set(e.transcriptLines);return t.transcriptLines.filter((r)=>!n.has(r))}function J(e){const t=e.toLowerCase();return W.filter((r)=>t.includes(r)).length>=2}function M(e,t){const n=e.trim();if(!n)return"";const r=t.trim(),i=sanitizeGeminiResponseText(n,t);if(!r)return i;if(!n.includes(r))return i;if(i&&i!==r&&i!==n)return i;if(J(n))return"";if(n.startsWith(r)){const o=n.slice(r.length).replace(/^[\s::,,-]+/,"").trim();return o?sanitizeGeminiResponseText(o,""):""}return i}function Q(){return`
43
43
  (() => {
44
- ${Q()}
44
+ ${w()}
45
45
 
46
46
  const signInNode = Array.from(document.querySelectorAll('a, button')).find((node) => {
47
47
  const text = (node.textContent || '').trim().toLowerCase();
@@ -66,7 +66,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
66
66
  })()
67
67
  `}function G(){return`
68
68
  (() => {
69
- ${Q()}
69
+ ${w()}
70
70
  const composer = findComposer();
71
71
  const composerText = composer?.textContent?.replace(/\\u00a0/g, ' ').trim() || '';
72
72
  const isGenerating = !!Array.from(document.querySelectorAll('button, [role="button"]')).find((node) => {
@@ -77,8 +77,8 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
77
77
  || text === '停止回答'
78
78
  || aria === '停止回答';
79
79
  });
80
- const turns = ${k().trim()};
81
- const transcriptLines = ${h().trim()};
80
+ const turns = ${I().trim()};
81
+ const transcriptLines = ${D().trim()};
82
82
 
83
83
  return {
84
84
  url: window.location.href,
@@ -89,7 +89,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
89
89
  structuredTurnsTrusted: turns.length > 0 || transcriptLines.length === 0,
90
90
  };
91
91
  })()
92
- `}function R(f){try{const g=new URL(f);if(g.hostname!==GEMINI_DOMAIN&&!g.hostname.endsWith(`.${GEMINI_DOMAIN}`))return!1;const j=g.pathname.replace(/\/+$/,"");return j.startsWith("/app/")&&j!=="/app"}catch{return!1}}function h(){return`
92
+ `}function U(e){try{const t=new URL(e);if(t.hostname!==GEMINI_DOMAIN&&!t.hostname.endsWith(`.${GEMINI_DOMAIN}`))return!1;const n=t.pathname.replace(/\/+$/,"");return n.startsWith("/app/")&&n!=="/app"}catch{return!1}}function D(){return`
93
93
  (() => {
94
94
  const clean = (value) => (value || '')
95
95
  .replace(/\\u00a0/g, ' ')
@@ -161,7 +161,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
161
161
  && !stopLines.has(line)
162
162
  && !noisyPatterns.some((pattern) => pattern.test(line)));
163
163
  })()
164
- `}function k(){return`
164
+ `}function I(){return`
165
165
  (() => {
166
166
  const clean = (value) => (value || '')
167
167
  .replace(/\\u00a0/g, ' ')
@@ -217,9 +217,9 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
217
217
 
218
218
  return turns;
219
219
  })()
220
- `}function e(){return`
220
+ `}function X(){return`
221
221
  (() => {
222
- ${Q()}
222
+ ${w()}
223
223
  const composer = findComposer();
224
224
 
225
225
  if (!(composer instanceof HTMLElement)) {
@@ -248,18 +248,18 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
248
248
  label: composer.getAttribute('aria-label') || '',
249
249
  };
250
250
  })()
251
- `}function n(){return`
251
+ `}function Z(){return`
252
252
  (() => {
253
- ${Q()}
253
+ ${w()}
254
254
  const composer = findComposer();
255
255
 
256
256
  return {
257
257
  hasText: !!(composer && ((composer.textContent || '').trim() || (composer.innerText || '').trim())),
258
258
  };
259
259
  })()
260
- `}function I(f){return`
260
+ `}function H(e){return`
261
261
  ((inputText) => {
262
- ${Q()}
262
+ ${w()}
263
263
  const composer = findComposer();
264
264
 
265
265
  if (!(composer instanceof HTMLElement)) {
@@ -296,10 +296,10 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
296
296
  return {
297
297
  hasText: !!((composer.textContent || '').trim() || (composer.innerText || '').trim()),
298
298
  };
299
- })(${JSON.stringify(f)})
300
- `}function m(){return`
299
+ })(${JSON.stringify(e)})
300
+ `}function q(){return`
301
301
  (() => {
302
- ${Q()}
302
+ ${w()}
303
303
  const composer = findComposer();
304
304
 
305
305
  if (!(composer instanceof HTMLElement)) {
@@ -364,9 +364,9 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
364
364
 
365
365
  return 'enter';
366
366
  })()
367
- `}function A(){return`
367
+ `}function N(){return`
368
368
  (() => {
369
- ${Q()}
369
+ ${w()}
370
370
  const composer = findComposer();
371
371
 
372
372
  if (!(composer instanceof HTMLElement)) {
@@ -378,7 +378,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
378
378
  composer.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true }));
379
379
  return 'enter';
380
380
  })()
381
- `}function o(){return`
381
+ `}function z(){return`
382
382
  (() => {
383
383
  const isVisible = (el) => {
384
384
  if (!(el instanceof HTMLElement)) return false;
@@ -408,7 +408,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
408
408
  }
409
409
  return 'navigate';
410
410
  })()
411
- `}function t(){return`
411
+ `}function Y(){return`
412
412
  (() => {
413
413
  const labels = ['tools', 'tool', 'mode', '研究', 'deep research', 'deep-research', '工具'];
414
414
  const normalize = (value) => (value || '').replace(/\\s+/g, ' ').trim().toLowerCase();
@@ -500,7 +500,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
500
500
  }
501
501
  return false;
502
502
  })()
503
- `}function r(f){return`
503
+ `}function ee(e){return`
504
504
  ((targetLabels) => {
505
505
  const isDisabled = (el) => {
506
506
  if (!(el instanceof HTMLElement)) return true;
@@ -564,8 +564,8 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
564
564
  }
565
565
 
566
566
  return '';
567
- })(${JSON.stringify(f)})
568
- `}function ff(f){return`
567
+ })(${JSON.stringify(e)})
568
+ `}function te(e){return`
569
569
  ((targetLabels) => {
570
570
  const isDisabled = (el) => {
571
571
  if (!(el instanceof HTMLElement)) return true;
@@ -626,8 +626,8 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
626
626
  }
627
627
 
628
628
  return '';
629
- })(${JSON.stringify(f)})
630
- `}function gf(){return`
629
+ })(${JSON.stringify(e)})
630
+ `}function ne(){return`
631
631
  (() => {
632
632
  const normalizeText = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
633
633
  const clampText = (value, maxLength) => {
@@ -685,7 +685,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
685
685
 
686
686
  return results;
687
687
  })()
688
- `}function x(){return`
688
+ `}function P(){return`
689
689
  (() => {
690
690
  const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
691
691
  const isVisible = (el) => {
@@ -731,7 +731,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
731
731
 
732
732
  return changed;
733
733
  })()
734
- `}function jf(f){const g=normalizeGeminiTitle(f);return`
734
+ `}function re(e){const t=normalizeGeminiTitle(e);return`
735
735
  ((targetQuery) => {
736
736
  const normalizeText = (value) => String(value || '').replace(/\\s+/g, ' ').trim().toLowerCase();
737
737
  const isDisabled = (el) => {
@@ -766,9 +766,9 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
766
766
  return true;
767
767
  }
768
768
  return false;
769
- })(${JSON.stringify(g)})
770
- `}function C(){return"window.location.href"}export async function isOnGemini(f){const g=await f.evaluate(C()).catch(()=>"");if(typeof g!=="string"||!g)return!1;try{const j=new URL(g).hostname;return j===GEMINI_DOMAIN||j.endsWith(`.${GEMINI_DOMAIN}`)}catch{return!1}}export async function ensureGeminiPage(f){if(!await isOnGemini(f)){await f.goto(GEMINI_APP_URL,{waitUntil:"load",settleMs:2500});await f.wait(1)}}export async function getCurrentGeminiUrl(f){await ensureGeminiPage(f);const g=await f.evaluate(C()).catch(()=>"");if(typeof g==="string"&&g.trim())return g;return GEMINI_APP_URL}export async function openGeminiToolsMenu(f){await ensureGeminiPage(f);if(await f.evaluate(t())){await f.wait(0.5);return!0}return!1}export async function selectGeminiTool(f,g){await ensureGeminiPage(f);await openGeminiToolsMenu(f);const j=await f.evaluate(r(g));return typeof j==="string"?j:""}export async function waitForGeminiConfirmButton(f,g,j){await ensureGeminiPage(f);const q=1,w=Math.max(1,Math.ceil(j/q));for(let v=0;v<w;v+=1){await f.wait(v===0?0.5:q);const z=await f.evaluate(ff(g));if(typeof z==="string"&&z)return z}return""}export async function getGeminiPageState(f){await ensureGeminiPage(f);return $(await f.evaluate(a()),"Gemini status")}export async function startNewGeminiChat(f){await ensureGeminiPage(f);const g=await f.evaluate(o());if(g==="navigate")await f.goto(GEMINI_APP_URL,{waitUntil:"load",settleMs:2500});await f.wait(1);return g}export async function getGeminiConversationList(f){await ensureGeminiPage(f);let g=[];for(let j=0;j<3;j+=1){g=V(await f.evaluate(gf()),"Gemini conversation list").flatMap((z)=>{if(!S(z)||typeof z.title!=="string"||typeof z.url!=="string")throw new P("Gemini conversation list returned a malformed row");if(!R(z.url))return[];return{Title:z.title,Url:z.url}});if(g.length>0)break;const v=U(await f.evaluate(x()),"Gemini sidebar expand")===!0;await f.wait(j===0?1.2:0.6);if(!v&&j>0)break}return g}export async function clickGeminiConversationByTitle(f,g){await ensureGeminiPage(f);const j=normalizeGeminiTitle(g);if(!j)return!1;const q=await f.evaluate(jf(j));if(q)await f.wait(1);return!!q}export async function getGeminiVisibleTurns(f){const g=await qf(f);if(Array.isArray(g)&&g.length>0)return g;return(await getGeminiTranscriptLines(f)).map((q)=>({Role:"System",Text:q}))}async function qf(f){await ensureGeminiPage(f);const g=V(await f.evaluate(k()),"Gemini visible turns");for(const q of g)if(!S(q)||typeof q.Role!=="string"||typeof q.Text!=="string")throw new P("Gemini visible turns returned a malformed row");const j=collapseAdjacentGeminiTurns(g);return Array.isArray(j)?j:[]}export async function getGeminiTranscriptLines(f){await ensureGeminiPage(f);const g=V(await f.evaluate(h()),"Gemini transcript lines");if(!g.every((j)=>typeof j==="string"))throw new P("Gemini transcript lines returned a malformed row");return g}export async function waitForGeminiTranscript(f,g=5){let j=[];for(let q=0;q<g;q+=1){j=await getGeminiTranscriptLines(f);if(j.length>0)return j;if(q<g-1)await f.wait(1)}return j}export async function getLatestGeminiAssistantResponse(f){await ensureGeminiPage(f);const j=[...await getGeminiVisibleTurns(f)].reverse().find((w)=>w.Role==="Assistant");if(j?.Text)return sanitizeGeminiResponseText(j.Text,"");return(await getGeminiTranscriptLines(f)).join(`
771
- `).trim()}export async function readGeminiSnapshot(f){await ensureGeminiPage(f);const g=$(await f.evaluate(G()),"Gemini page snapshot");if(!Array.isArray(g.turns)||!Array.isArray(g.transcriptLines)||typeof g.composerHasText!=="boolean"||typeof g.isGenerating!=="boolean"||typeof g.structuredTurnsTrusted!=="boolean")throw new P("Gemini page snapshot returned a malformed result");return g}function vf(f){for(let g=f.length-1;g>=0;g-=1)if(f[g]?.Role==="User")return g;return null}function X(f){const g=vf(f);return g===null?null:f[g]??null}export async function waitForGeminiSubmission(f,g,j){const q=g.turns.filter((v)=>v.Role==="Assistant").length,w=Math.max(1,Math.ceil(j));for(let v=0;v<w;v+=1){await f.wait(v===0?0.5:1);const z=await readGeminiSnapshot(f),H=b(g,z),D=y(g,z);if(H.hasTrustedAppend&&H.hasNewUserTurn)return{snapshot:z,preSendAssistantCount:q,userAnchorTurn:X(z.turns),reason:"user_turn"};if(!z.composerHasText&&z.isGenerating)return{snapshot:z,preSendAssistantCount:q,userAnchorTurn:X(z.turns),reason:"composer_generating"};const J=!z.url||R(String(z.url));if(!z.composerHasText&&D.length>0&&J)return{snapshot:z,preSendAssistantCount:q,userAnchorTurn:X(z.turns),reason:"composer_transcript"}}return null}export async function sendGeminiMessage(f,g){await ensureGeminiPage(f);let j;for(let v=0;v<_;v+=1){j=await f.evaluate(e());if(j?.ok)break;if(v<_-1)await f.wait(u)}if(!j?.ok)throw new P(j?.reason||"Could not find Gemini composer");let q=!1;if(f.nativeType)try{await f.nativeType(g);await f.wait(0.2);q=!!(await f.evaluate(n()))?.hasText}catch{}if(!q)q=!!(await f.evaluate(I(g)))?.hasText;if(!q)throw new P("Failed to insert text into Gemini composer");if(await f.evaluate(m())==="button"){await f.wait(1);return"button"}if(f.nativeKeyPress)try{await f.nativeKeyPress("Enter")}catch{await f.evaluate(A())}else await f.evaluate(A());await f.wait(1);return"enter"}function wf(f){if(!Array.isArray(f))return[];const g=new Set,j=[];for(const q of f){const w=String(q??"").trim();if(!w||g.has(w))continue;g.add(w);j.push(w)}return j}export function pickGeminiDeepResearchExportUrl(f,g){let j=-1/0,q="",w="none";const v={fetch:50,xhr:45,"fetch-body":72,"xhr-body":72,"fetch-body-docs-id":95,"xhr-body-docs-id":95,open:55,anchor:55,performance:35};for(const z of f){const H=z.match(/^([a-z-]+)::(.+)$/i),D=(H?.[1]??"performance").toLowerCase(),J=(H?.[2]??z).trim();if(!J)continue;let B=J,N=!1;if(J.startsWith("blob:"))N=!0;else try{B=new URL(J,g).href}catch{continue}if(!N)try{const p=new URL(B);if(!["http:","https:"].includes(p.protocol))continue}catch{continue}const E=/\.md(?:$|[?#])/i.test(B)||/markdown/i.test(B),K=/export|download|attachment|file|save-report/i.test(B),L=/docs\.google\.com\/document\//i.test(B),O=/docs\.google\.com\/spreadsheets\//i.test(B),l=/cspreport|allowlist|gen_204|telemetry|metrics|analytics|doubleclick|logging|collect|favicon/i.test(B);let M=v[D]??20;if(E)M+=45;if(K)M+=25;if(L)M+=100;if(O)M-=160;if(/gemini\.google\.com\/app\//i.test(B))M-=60;if(/googleapis\.com|gstatic\.com|doubleclick\.net|google-analytics/i.test(B))M-=40;if(!E&&!K&&!N)M-=40;if(l)M-=120;if(B===g)M-=80;if(N)M+=25;if(M>j){j=M;q=B;if(N)w="blob";else if(D==="open")w="window-open";else if(D==="anchor")w="anchor";else if(D==="performance")w="performance";else w="network"}}if(!q||j<60)return{url:"",source:"none"};return{url:q,source:w}}function zf(f){return`
769
+ })(${JSON.stringify(t)})
770
+ `}function O(){return"window.location.href"}export async function isOnGemini(e){const t=await e.evaluate(O()).catch(()=>"");if(typeof t!=="string"||!t)return!1;try{const n=new URL(t).hostname;return n===GEMINI_DOMAIN||n.endsWith(`.${GEMINI_DOMAIN}`)}catch{return!1}}export async function ensureGeminiPage(e){if(!await isOnGemini(e)){await e.goto(GEMINI_APP_URL,{waitUntil:"load",settleMs:2500});await e.wait(1)}}export async function getCurrentGeminiUrl(e){await ensureGeminiPage(e);const t=await e.evaluate(O()).catch(()=>"");if(typeof t==="string"&&t.trim())return t;return GEMINI_APP_URL}export async function openGeminiToolsMenu(e){await ensureGeminiPage(e);if(await e.evaluate(Y())){await e.wait(0.5);return!0}return!1}export async function selectGeminiTool(e,t){await ensureGeminiPage(e);await openGeminiToolsMenu(e);const n=await e.evaluate(ee(t));return typeof n==="string"?n:""}export async function waitForGeminiConfirmButton(e,t,n){await ensureGeminiPage(e);const r=1,i=Math.max(1,Math.ceil(n/r));for(let o=0;o<i;o+=1){await e.wait(o===0?0.5:r);const s=await e.evaluate(te(t));if(typeof s==="string"&&s)return s}return""}export async function getGeminiPageState(e){await ensureGeminiPage(e);return E(await e.evaluate(Q()),"Gemini status")}export async function startNewGeminiChat(e){await ensureGeminiPage(e);const t=await e.evaluate(z());if(t==="navigate")await e.goto(GEMINI_APP_URL,{waitUntil:"load",settleMs:2500});await e.wait(1);return t}export async function getGeminiConversationList(e){await ensureGeminiPage(e);let t=[];for(let n=0;n<3;n+=1){t=T(await e.evaluate(ne()),"Gemini conversation list").flatMap((s)=>{if(!y(s)||typeof s.title!=="string"||typeof s.url!=="string")throw new g("Gemini conversation list returned a malformed row");if(!U(s.url))return[];return{Title:s.title,Url:s.url}});if(t.length>0)break;const o=x(await e.evaluate(P()),"Gemini sidebar expand")===!0;await e.wait(n===0?1.2:0.6);if(!o&&n>0)break}return t}export async function clickGeminiConversationByTitle(e,t){await ensureGeminiPage(e);const n=normalizeGeminiTitle(t);if(!n)return!1;const r=await e.evaluate(re(n));if(r)await e.wait(1);return!!r}export async function getGeminiVisibleTurns(e){const t=await oe(e);if(Array.isArray(t)&&t.length>0)return t;return(await getGeminiTranscriptLines(e)).map((r)=>({Role:"System",Text:r}))}async function oe(e){await ensureGeminiPage(e);const t=T(await e.evaluate(I()),"Gemini visible turns");for(const r of t)if(!y(r)||typeof r.Role!=="string"||typeof r.Text!=="string")throw new g("Gemini visible turns returned a malformed row");const n=collapseAdjacentGeminiTurns(t);return Array.isArray(n)?n:[]}export async function getGeminiTranscriptLines(e){await ensureGeminiPage(e);const t=T(await e.evaluate(D()),"Gemini transcript lines");if(!t.every((n)=>typeof n==="string"))throw new g("Gemini transcript lines returned a malformed row");return t}export async function waitForGeminiTranscript(e,t=5){let n=[];for(let r=0;r<t;r+=1){n=await getGeminiTranscriptLines(e);if(n.length>0)return n;if(r<t-1)await e.wait(1)}return n}export async function getLatestGeminiAssistantResponse(e){await ensureGeminiPage(e);const n=[...await getGeminiVisibleTurns(e)].reverse().find((i)=>i.Role==="Assistant");if(n?.Text)return sanitizeGeminiResponseText(n.Text,"");return(await getGeminiTranscriptLines(e)).join(`
771
+ `).trim()}export async function readGeminiSnapshot(e){await ensureGeminiPage(e);const t=E(await e.evaluate(G()),"Gemini page snapshot");if(!Array.isArray(t.turns)||!Array.isArray(t.transcriptLines)||typeof t.composerHasText!=="boolean"||typeof t.isGenerating!=="boolean"||typeof t.structuredTurnsTrusted!=="boolean")throw new g("Gemini page snapshot returned a malformed result");return t}function ie(e){for(let t=e.length-1;t>=0;t-=1)if(e[t]?.Role==="User")return t;return null}function S(e){const t=ie(e);return t===null?null:e[t]??null}export async function waitForGeminiSubmission(e,t,n){const r=t.turns.filter((o)=>o.Role==="Assistant").length,i=Math.max(1,Math.ceil(n));for(let o=0;o<i;o+=1){await e.wait(o===0?0.5:1);const s=await readGeminiSnapshot(e),u=R(t,s),l=k(t,s);if(u.hasTrustedAppend&&u.hasNewUserTurn)return{snapshot:s,preSendAssistantCount:r,userAnchorTurn:S(s.turns),reason:"user_turn"};if(!s.composerHasText&&s.isGenerating)return{snapshot:s,preSendAssistantCount:r,userAnchorTurn:S(s.turns),reason:"composer_generating"};const d=!s.url||U(String(s.url));if(!s.composerHasText&&l.length>0&&d)return{snapshot:s,preSendAssistantCount:r,userAnchorTurn:S(s.turns),reason:"composer_transcript"}}return null}export async function sendGeminiMessage(e,t){await ensureGeminiPage(e);let n;for(let o=0;o<L;o+=1){n=await e.evaluate(X());if(n?.ok)break;if(o<L-1)await e.wait(j)}if(!n?.ok)throw new g(n?.reason||"Could not find Gemini composer");let r=!1;if(e.nativeType)try{await e.nativeType(t);await e.wait(0.2);r=!!(await e.evaluate(Z()))?.hasText}catch{}if(!r)r=!!(await e.evaluate(H(t)))?.hasText;if(!r)throw new g("Failed to insert text into Gemini composer");if(await e.evaluate(q())==="button"){await e.wait(1);return"button"}if(e.nativeKeyPress)try{await e.nativeKeyPress("Enter")}catch{await e.evaluate(N())}else await e.evaluate(N());await e.wait(1);return"enter"}function se(e){if(!Array.isArray(e))return[];const t=new Set,n=[];for(const r of e){const i=String(r??"").trim();if(!i||t.has(i))continue;t.add(i);n.push(i)}return n}export function pickGeminiDeepResearchExportUrl(e,t){let n=-1/0,r="",i="none";const o={fetch:50,xhr:45,"fetch-body":72,"xhr-body":72,"fetch-body-docs-id":95,"xhr-body-docs-id":95,open:55,anchor:55,performance:35};for(const s of e){const u=s.match(/^([a-z-]+)::(.+)$/i),l=(u?.[1]??"performance").toLowerCase(),d=(u?.[2]??s).trim();if(!d)continue;let a=d,h=!1;if(d.startsWith("blob:"))h=!0;else try{a=new URL(d,t).href}catch{continue}if(!h)try{const V=new URL(a);if(!["http:","https:"].includes(V.protocol))continue}catch{continue}const c=/\.md(?:$|[?#])/i.test(a)||/markdown/i.test(a),f=/export|download|attachment|file|save-report/i.test(a),m=/docs\.google\.com\/document\//i.test(a),b=/docs\.google\.com\/spreadsheets\//i.test(a),_=/cspreport|allowlist|gen_204|telemetry|metrics|analytics|doubleclick|logging|collect|favicon/i.test(a);let p=o[l]??20;if(c)p+=45;if(f)p+=25;if(m)p+=100;if(b)p-=160;if(/gemini\.google\.com\/app\//i.test(a))p-=60;if(/googleapis\.com|gstatic\.com|doubleclick\.net|google-analytics/i.test(a))p-=40;if(!c&&!f&&!h)p-=40;if(_)p-=120;if(a===t)p-=80;if(h)p+=25;if(p>n){n=p;r=a;if(h)i="blob";else if(l==="open")i="window-open";else if(l==="anchor")i="anchor";else if(l==="performance")i="performance";else i="network"}}if(!r||n<60)return{url:"",source:"none"};return{url:r,source:i}}function ae(e){return`
772
772
  (async () => {
773
773
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
774
774
  const labels = {
@@ -1120,7 +1120,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
1120
1120
  return { ok: false, step: 'export-docs', currentUrl: window.location.href, share, trace, urls: collectUrls() };
1121
1121
  }
1122
1122
 
1123
- const deadline = Date.now() + ${Math.max(5000,Math.min(f,180000))};
1123
+ const deadline = Date.now() + ${Math.max(5000,Math.min(e,180000))};
1124
1124
  while (Date.now() < deadline) {
1125
1125
  const urls = collectUrls();
1126
1126
  const hasDocsSignal = urls.some((value) => /docs\\.google\\.com\\/document\\//i.test(String(value || '')));
@@ -1137,7 +1137,7 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
1137
1137
 
1138
1138
  return { ok: true, step: 'timeout', currentUrl: window.location.href, share, exportDocs: exportDocsBtn, trace, urls: collectUrls() };
1139
1139
  })()
1140
- `}function T(f){if(!Array.isArray(f))return"";for(const g of f){if(!g||typeof g!=="object")continue;const j=String(g.url??"").trim();if(/^https:\/\/docs\.google\.com\/document\//i.test(j))return j}return""}export async function exportGeminiDeepResearchReport(f,g=120){await ensureGeminiPage(f);const j=Math.max(1,g)*1000,q=await f.tabs().catch(()=>[]),w=zf(j),v=await f.evaluate(w).catch(()=>null),z=await f.tabs().catch(()=>[]),H=T(z)||T(q);if(H)return{url:H,source:"tab"};const D=typeof v?.currentUrl==="string"&&/^https:\/\/docs\.google\.com\/document\//i.test(v.currentUrl)?v.currentUrl:"";if(D)return{url:D,source:"window-open"};const J=wf(v?.urls),B=typeof v?.currentUrl==="string"&&v.currentUrl?v.currentUrl:await getCurrentGeminiUrl(f);return pickGeminiDeepResearchExportUrl(J,B)}export const __test__={GEMINI_COMPOSER_SELECTORS:Y,GEMINI_COMPOSER_MARKER_ATTR:Z,collapseAdjacentGeminiTurns,clickNewChatScript:o,diffTranscriptLines:y,diffTrustedStructuredTurns:b,hasGeminiTurnPrefix:W,readGeminiSnapshot,readGeminiSnapshotScript:G,expandGeminiRecentScript:x,submitComposerScript:m,insertComposerTextFallbackScript:I};export async function getGeminiVisibleImageUrls(f){await ensureGeminiPage(f);return await f.evaluate(`
1140
+ `}function B(e){if(!Array.isArray(e))return"";for(const t of e){if(!t||typeof t!=="object")continue;const n=String(t.url??"").trim();if(/^https:\/\/docs\.google\.com\/document\//i.test(n))return n}return""}export async function exportGeminiDeepResearchReport(e,t=120){await ensureGeminiPage(e);const n=Math.max(1,t)*1000,r=await e.tabs().catch(()=>[]),i=ae(n),o=await e.evaluate(i).catch(()=>null),s=await e.tabs().catch(()=>[]),u=B(s)||B(r);if(u)return{url:u,source:"tab"};const l=typeof o?.currentUrl==="string"&&/^https:\/\/docs\.google\.com\/document\//i.test(o.currentUrl)?o.currentUrl:"";if(l)return{url:l,source:"window-open"};const d=se(o?.urls),a=typeof o?.currentUrl==="string"&&o.currentUrl?o.currentUrl:await getCurrentGeminiUrl(e);return pickGeminiDeepResearchExportUrl(d,a)}export const __test__={GEMINI_COMPOSER_SELECTORS:v,GEMINI_COMPOSER_MARKER_ATTR:C,collapseAdjacentGeminiTurns,clickNewChatScript:z,diffTranscriptLines:k,diffTrustedStructuredTurns:R,hasGeminiTurnPrefix:A,readGeminiSnapshot,readGeminiSnapshotScript:G,expandGeminiRecentScript:P,submitComposerScript:q,insertComposerTextFallbackScript:H};export async function getGeminiVisibleImageUrls(e){await ensureGeminiPage(e);return await e.evaluate(`
1141
1141
  (() => {
1142
1142
  const isVisible = (el) => {
1143
1143
  if (!(el instanceof HTMLElement)) return false;
@@ -1165,9 +1165,9 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
1165
1165
  }
1166
1166
  return urls;
1167
1167
  })()
1168
- `)}export async function waitForGeminiImages(f,g,j){const q=new Set(g),w=3,v=Math.max(1,Math.ceil(j/w));let z=[],H=0;for(let D=0;D<v;D+=1){await f.wait(D===0?2:w);const J=(await getGeminiVisibleImageUrls(f)).filter((E)=>!q.has(E));if(J.length===0)continue;const B=J.join(`
1169
- `),N=z.join(`
1170
- `);if(B==N)H+=1;else{z=J;H=1}if(H>=2||D===v-1)return z}return z}export async function exportGeminiImages(f,g){await ensureGeminiPage(f);const j=JSON.stringify(g);return await f.evaluate(`
1168
+ `)}export async function waitForGeminiImages(e,t,n){const r=new Set(t),i=3,o=Math.max(1,Math.ceil(n/i));let s=[],u=0;for(let l=0;l<o;l+=1){await e.wait(l===0?2:i);const d=(await getGeminiVisibleImageUrls(e)).filter((c)=>!r.has(c));if(d.length===0)continue;const a=d.join(`
1169
+ `),h=s.join(`
1170
+ `);if(a==h)u+=1;else{s=d;u=1}if(u>=2||l===o-1)return s}return s}export async function exportGeminiImages(e,t){await ensureGeminiPage(e);const n=JSON.stringify(t);return await e.evaluate(`
1171
1171
  (async (targetUrls) => {
1172
1172
  const blobToDataUrl = (blob) => new Promise((resolve, reject) => {
1173
1173
  const reader = new FileReader();
@@ -1229,6 +1229,6 @@ import{CommandExecutionError as P}from"@jackwener/opencli/errors";export const G
1229
1229
  }
1230
1230
 
1231
1231
  return results;
1232
- })(${j})
1233
- `)}export async function waitForGeminiResponse(f,g,j,q){if(q<=0)return"";const w=(E)=>{if(!E.structuredTurnsTrusted)return"";const K=c(E.turns,g.userAnchorTurn);if(K!==null){const L=E.turns.slice(K+1).filter((O)=>O.Role==="Assistant").at(-1);return L?sanitizeGeminiResponseText(L.Text,j):""}if(W(g.snapshot.turns,E.turns)){const L=E.turns.slice(g.snapshot.turns.length).filter((O)=>O.Role==="Assistant").at(-1);if(L)return sanitizeGeminiResponseText(L.Text,j)}return""},v=(E)=>E.transcriptLines.filter((K)=>!g.snapshot.transcriptLines.includes(K)).map((K)=>F(K,j)).filter(Boolean).join(`
1234
- `).trim(),z=Math.max(1,Math.ceil(q/2));let H="",D=0,J="",B=0,N=0;for(let E=0;E<z;E+=1){await f.wait(E===0?1:2);const K=await readGeminiSnapshot(f),L=w(K);if(L){if(L===H)D+=1;else{H=L;D=1}if(!K.isGenerating&&D>=2)return L;continue}N+=1;if(N<2)continue;const O=v(K);if(!O)continue;if(O===J)B+=1;else{J=O;B=1}if(!K.isGenerating&&B>=2)return O}return""}
1232
+ })(${n})
1233
+ `)}export async function waitForGeminiResponse(e,t,n,r){if(r<=0)return"";const i=(c)=>{if(!c.structuredTurnsTrusted)return"";const f=K(c.turns,t.userAnchorTurn);if(f!==null){const m=c.turns.slice(f+1).filter((b)=>b.Role==="Assistant").at(-1);return m?sanitizeGeminiResponseText(m.Text,n):""}if(A(t.snapshot.turns,c.turns)){const m=c.turns.slice(t.snapshot.turns.length).filter((b)=>b.Role==="Assistant").at(-1);if(m)return sanitizeGeminiResponseText(m.Text,n)}return""},o=(c)=>c.transcriptLines.filter((f)=>!t.snapshot.transcriptLines.includes(f)).map((f)=>M(f,n)).filter(Boolean).join(`
1234
+ `).trim(),s=Math.max(1,Math.ceil(r/2));let u="",l=0,d="",a=0,h=0;for(let c=0;c<s;c+=1){await e.wait(c===0?1:2);const f=await readGeminiSnapshot(e),m=i(f);if(m){if(m===u)l+=1;else{u=m;l=1}if(!f.isGenerating&&l>=2)return m;continue}h+=1;if(h<2)continue;const b=o(f);if(!b)continue;if(b===d)a+=1;else{d=b;a=1}if(!f.isGenerating&&a>=2)return b}return""}
@@ -1 +1 @@
1
- import{cli as Z,Strategy as _}from"@jackwener/opencli/registry";import{CommandExecutionError as $}from"@jackwener/opencli/errors";import A from"node:os";import D from"node:path";import{ensureApplet as F,ggbEval as Q,ggbListObjects as L,ggbWaitForObjectCount as N,normalizeNumber as W,requireGgbSuccess as R}from"./utils.js";Z({site:"geogebra",name:"hexagon",access:"write",description:"Draw a regular hexagon centered at the origin",domain:"www.geogebra.org",strategy:_.PUBLIC,browser:!0,navigateBefore:!1,example:"ppcli geogebra hexagon --size 3",args:[{name:"size",required:!1,default:"2",help:"Radius of the hexagon (default: 2)"}],columns:["step","result"],func:async(H,T)=>{const f=W(T.size,"size",{defaultValue:2,positive:!0});await F(H);const I=[],U=[["V1",`(${f},0)`],["V2",`(${f}*cos(pi/3),${f}*sin(pi/3))`],["V3",`(${f}*cos(2*pi/3),${f}*sin(2*pi/3))`],["V4",`(-${f},0)`],["V5",`(${f}*cos(4*pi/3),${f}*sin(4*pi/3))`],["V6",`(${f}*cos(5*pi/3),${f}*sin(5*pi/3))`]];for(const[B,M]of U){const Y=R(await Q(H,`${B}=${M}`),`Failed to create point ${B}`);I.push({step:`${B}=${M}`,result:`ok (${Y.label||B})`})}const V=R(await Q(H,"Hexagon=Polygon(V1,V2,V3,V4,V5,V6)"),"Failed to create hexagon polygon");I.push({step:"Hexagon=Polygon(V1,V2,V3,V4,V5,V6)",result:`ok (${V.label||"hexagon created"})`});const X=await N(H,7),J=await L(H),K=D.join(A.tmpdir(),"opencli-geogebra-hexagon.png");try{await H.screenshot({path:K})}catch(B){throw new $(`Failed to capture GeoGebra screenshot: ${B?.message||B}`)}if(Array.isArray(J)&&J.length>0)I.push({step:`canvas has ${X} objects`,result:J.map((B)=>`${B.name}(${B.type})`).join(", ")});I.push({step:"screenshot",result:K});return I}});
1
+ import{cli as m,Strategy as V}from"@jackwener/opencli/registry";import{CommandExecutionError as b}from"@jackwener/opencli/errors";import f from"node:os";import d from"node:path";import{ensureApplet as w,ggbEval as n,ggbListObjects as x,ggbWaitForObjectCount as y,normalizeNumber as j,requireGgbSuccess as c}from"./utils.js";m({site:"geogebra",name:"hexagon",access:"write",description:"Draw a regular hexagon centered at the origin",domain:"www.geogebra.org",strategy:V.PUBLIC,browser:!0,navigateBefore:!1,example:"ppcli geogebra hexagon --size 3",args:[{name:"size",required:!1,default:"2",help:"Radius of the hexagon (default: 2)"}],columns:["step","result"],func:async(o,p)=>{const e=j(p.size,"size",{defaultValue:2,positive:!0});await w(o);const s=[],l=[["V1",`(${e},0)`],["V2",`(${e}*cos(pi/3),${e}*sin(pi/3))`],["V3",`(${e}*cos(2*pi/3),${e}*sin(2*pi/3))`],["V4",`(-${e},0)`],["V5",`(${e}*cos(4*pi/3),${e}*sin(4*pi/3))`],["V6",`(${e}*cos(5*pi/3),${e}*sin(5*pi/3))`]];for(const[t,i]of l){const h=c(await n(o,`${t}=${i}`),`Failed to create point ${t}`);s.push({step:`${t}=${i}`,result:`ok (${h.label||t})`})}const g=c(await n(o,"Hexagon=Polygon(V1,V2,V3,V4,V5,V6)"),"Failed to create hexagon polygon");s.push({step:"Hexagon=Polygon(V1,V2,V3,V4,V5,V6)",result:`ok (${g.label||"hexagon created"})`});const u=await y(o,7),r=await x(o),a=d.join(f.tmpdir(),"opencli-geogebra-hexagon.png");try{await o.screenshot({path:a})}catch(t){throw new b(`Failed to capture GeoGebra screenshot: ${t?.message||t}`)}if(Array.isArray(r)&&r.length>0)s.push({step:`canvas has ${u} objects`,result:r.map((t)=>`${t.name}(${t.type})`).join(", ")});s.push({step:"screenshot",result:a});return s}});
@@ -1,4 +1,4 @@
1
- import{cli as Q,Strategy as T}from"@jackwener/opencli/registry";import{CommandExecutionError as I,EmptyResultError as U}from"@jackwener/opencli/errors";import{ensureApplet as V,ggbGetProperty as J,normalizeLabel as W,unwrapBridgeEnvelope as X}from"./utils.js";Q({site:"geogebra",name:"info",access:"read",description:"Get detailed properties of a GeoGebra object",domain:"www.geogebra.org",strategy:T.PUBLIC,browser:!0,navigateBefore:!1,example:"ppcli geogebra info --name A",args:[{name:"name",required:!0,help:"Object label (e.g. A, c1, poly1)"}],columns:["property","value"],func:async(D,M)=>{const h=W(M.name,"name");await V(D);let f;try{f=X(await D.evaluate(`
1
+ import{cli as l,Strategy as b}from"@jackwener/opencli/registry";import{CommandExecutionError as n,EmptyResultError as u}from"@jackwener/opencli/errors";import{ensureApplet as f,ggbGetProperty as i,normalizeLabel as m,unwrapBridgeEnvelope as g}from"./utils.js";l({site:"geogebra",name:"info",access:"read",description:"Get detailed properties of a GeoGebra object",domain:"www.geogebra.org",strategy:b.PUBLIC,browser:!0,navigateBefore:!1,example:"ppcli geogebra info --name A",args:[{name:"name",required:!0,help:"Object label (e.g. A, c1, poly1)"}],columns:["property","value"],func:async(o,s)=>{const r=m(s.name,"name");await f(o);let e;try{e=g(await o.evaluate(`
2
2
  (name => {
3
3
  try {
4
4
  if (typeof ggbApplet === 'undefined' || typeof ggbApplet.getObjectType !== 'function') {
@@ -9,5 +9,5 @@ import{cli as Q,Strategy as T}from"@jackwener/opencli/registry";import{CommandEx
9
9
  return { error: err?.message || String(err) };
10
10
  }
11
11
  })
12
- (${JSON.stringify(h)})
13
- `))}catch(q){throw new I(`Failed to inspect GeoGebra object: ${q?.message||q}`)}if(!f||typeof f!=="object"||Array.isArray(f))throw new I("GeoGebra object existence probe returned malformed result");if(f.error)throw new I(`Failed to inspect GeoGebra object: ${f.error}`);if(f.ok!==!0||typeof f.exists!=="boolean")throw new I("GeoGebra object existence probe returned malformed result");if(f.exists===!1)throw new U(`geogebra info ${h}`,`Object "${h}" not found on the canvas.`);const O=["type","value","definition","command","caption","visible","color"],H=[];for(const q of O){const K=await J(D,h,q);H.push({property:q,value:String(K??"")})}if(await J(D,h,"type")==="point"){const q=await J(D,h,"xcoord"),K=await J(D,h,"ycoord");H.push({property:"x",value:String(q??"")});H.push({property:"y",value:String(K??"")})}return H}});
12
+ (${JSON.stringify(r)})
13
+ `))}catch(t){throw new n(`Failed to inspect GeoGebra object: ${t?.message||t}`)}if(!e||typeof e!=="object"||Array.isArray(e))throw new n("GeoGebra object existence probe returned malformed result");if(e.error)throw new n(`Failed to inspect GeoGebra object: ${e.error}`);if(e.ok!==!0||typeof e.exists!=="boolean")throw new n("GeoGebra object existence probe returned malformed result");if(e.exists===!1)throw new u(`geogebra info ${r}`,`Object "${r}" not found on the canvas.`);const c=["type","value","definition","command","caption","visible","color"],a=[];for(const t of c){const p=await i(o,r,t);a.push({property:t,value:String(p??"")})}if(await i(o,r,"type")==="point"){const t=await i(o,r,"xcoord"),p=await i(o,r,"ycoord");a.push({property:"x",value:String(t??"")});a.push({property:"y",value:String(p??"")})}return a}});
@@ -1 +1 @@
1
- import{cli as h,Strategy as w}from"@jackwener/opencli/registry";import{CommandExecutionError as f}from"@jackwener/opencli/errors";import C from"node:os";import B from"node:path";import{ensureApplet as $,ggbEval as r,ggbListObjects as A,ggbWaitForObjectCount as y,normalizeNumber as F,requireGgbSuccess as a}from"./utils.js";h({site:"geogebra",name:"triangle",access:"write",description:"Draw an equilateral triangle from a horizontal base segment",domain:"www.geogebra.org",strategy:w.PUBLIC,browser:!0,navigateBefore:!1,example:"ppcli geogebra triangle --size 4",args:[{name:"size",required:!1,default:"2",help:"Side length of the triangle (default: 2)"}],columns:["step","result"],func:async(e,l)=>{const o=F(l.size,"size",{defaultValue:2,positive:!0});await $(e);const t=[],c=a(await r(e,"A=(0,0)"),"Failed to create point A");t.push({step:"base point A=(0,0)",result:`ok (${c.label||"A"})`});const n=a(await r(e,`B=(${o},0)`),"Failed to create point B");t.push({step:`base point B=(${o},0)`,result:`ok (${n.label||"B"})`});const u=a(await r(e,"c=Circle(A,B)"),"Failed to create circle c");t.push({step:"c=Circle(A,B)",result:`ok (${u.label||"c"})`});const p=a(await r(e,"d=Circle(B,A)"),"Failed to create circle d");t.push({step:"d=Circle(B,A)",result:`ok (${p.label||"d"})`});const g=a(await r(e,"C=Intersect(c,d,1)"),"Failed to create point C");t.push({step:"C=Intersect(c,d,1)",result:`ok (${g.label||"C"})`});const m=a(await r(e,"Polygon(A,B,C)"),"Failed to create triangle polygon");t.push({step:"Polygon(A,B,C)",result:`ok (${m.label||"triangle created"})`});const b=await y(e,5),d=await A(e),i=B.join(C.tmpdir(),"opencli-geogebra-triangle.png");try{await e.screenshot({path:i})}catch(s){throw new f(`Failed to capture GeoGebra screenshot: ${s?.message||s}`)}t.push({step:`canvas has ${b} objects`,result:d.map((s)=>`${s.name}(${s.type})`).join(", ")});t.push({step:"screenshot",result:i});return t}});
1
+ import{cli as h,Strategy as w}from"@jackwener/opencli/registry";import{CommandExecutionError as f}from"@jackwener/opencli/errors";import C from"node:os";import B from"node:path";import{ensureApplet as A,ggbEval as r,ggbListObjects as y,ggbWaitForObjectCount as F,normalizeNumber as z,requireGgbSuccess as a}from"./utils.js";h({site:"geogebra",name:"triangle",access:"write",description:"Draw an equilateral triangle from a horizontal base segment",domain:"www.geogebra.org",strategy:w.PUBLIC,browser:!0,navigateBefore:!1,example:"ppcli geogebra triangle --size 4",args:[{name:"size",required:!1,default:"2",help:"Side length of the triangle (default: 2)"}],columns:["step","result"],func:async(e,l)=>{const o=z(l.size,"size",{defaultValue:2,positive:!0});await A(e);const t=[],c=a(await r(e,"A=(0,0)"),"Failed to create point A");t.push({step:"base point A=(0,0)",result:`ok (${c.label||"A"})`});const n=a(await r(e,`B=(${o},0)`),"Failed to create point B");t.push({step:`base point B=(${o},0)`,result:`ok (${n.label||"B"})`});const u=a(await r(e,"c=Circle(A,B)"),"Failed to create circle c");t.push({step:"c=Circle(A,B)",result:`ok (${u.label||"c"})`});const p=a(await r(e,"d=Circle(B,A)"),"Failed to create circle d");t.push({step:"d=Circle(B,A)",result:`ok (${p.label||"d"})`});const g=a(await r(e,"C=Intersect(c,d,1)"),"Failed to create point C");t.push({step:"C=Intersect(c,d,1)",result:`ok (${g.label||"C"})`});const m=a(await r(e,"Polygon(A,B,C)"),"Failed to create triangle polygon");t.push({step:"Polygon(A,B,C)",result:`ok (${m.label||"triangle created"})`});const b=await F(e,5),d=await y(e),i=B.join(C.tmpdir(),"opencli-geogebra-triangle.png");try{await e.screenshot({path:i})}catch(s){throw new f(`Failed to capture GeoGebra screenshot: ${s?.message||s}`)}t.push({step:`canvas has ${b} objects`,result:d.map((s)=>`${s.name}(${s.type})`).join(", ")});t.push({step:"screenshot",result:i});return t}});
@@ -1,6 +1,6 @@
1
- import{ArgumentError as Y,CommandExecutionError as J}from"@jackwener/opencli/errors";const $="https://www.geogebra.org/geometry",k=15000;export function unwrapBridgeEnvelope(h){if(h&&typeof h==="object"&&"data"in h&&"session"in h)return h.data;return h}function Z(h){return h&&typeof h==="object"&&!Array.isArray(h)}export function normalizeLabel(h,H="label"){const D=String(h??"").trim();if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(D))throw new Y(`${H} must be an ASCII GeoGebra label like A, B1, or poly_1`);return D}export function normalizeLabelList(h,H,D,q=1/0){const K=String(h??"").split(",").map((Q)=>Q.trim()).filter(Boolean);if(K.length<D||K.length>q)throw new Y(`${H} must contain ${D===q?D:`${D}-${q}`} comma-separated labels`);return K.map((Q,X)=>normalizeLabel(Q,`${H}[${X+1}]`))}export function normalizeNumber(h,H,{defaultValue:D,positive:q=!1}={}){const K=h==null||h===""?D:h,Q=Number(K);if(!Number.isFinite(Q)||q&&Q<=0)throw new Y(`${H} must be a ${q?"positive ":""}finite number`);return Q}export function normalizeCoords(h){const H=String(h??"").split(",").map((D)=>D.trim());if(H.length!==2)throw new Y('coords must be in "x,y" format (e.g. "1,2")');return H.map((D,q)=>normalizeNumber(D,q===0?"x":"y"))}export function requireGgbSuccess(h,H){if(!Z(h))throw new J(`${H}: malformed GeoGebra result`);if(!h.ok)throw new J(h.error||H);return h}export async function ensureApplet(h){let H="";try{H=await h.getCurrentUrl()}catch{H=""}if(H?.includes("geogebra.org/geometry"))try{if(unwrapBridgeEnvelope(await h.evaluate("typeof ggbApplet !== 'undefined' && typeof ggbApplet.evalCommand === 'function'")))return}catch(q){throw new J(`Failed to detect GeoGebra applet: ${q?.message||q}`)}try{await h.goto($)}catch(q){throw new J(`Failed to load GeoGebra Geometry: ${q?.message||q}`)}let D;try{D=unwrapBridgeEnvelope(await h.evaluate(`
1
+ import{ArgumentError as l,CommandExecutionError as n}from"@jackwener/opencli/errors";const c="https://www.geogebra.org/geometry",p=15000;export function unwrapBridgeEnvelope(e){if(e&&typeof e==="object"&&"data"in e&&"session"in e)return e.data;return e}function m(e){return e&&typeof e==="object"&&!Array.isArray(e)}export function normalizeLabel(e,o="label"){const r=String(e??"").trim();if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(r))throw new l(`${o} must be an ASCII GeoGebra label like A, B1, or poly_1`);return r}export function normalizeLabelList(e,o,r,t=1/0){const a=String(e??"").split(",").map((i)=>i.trim()).filter(Boolean);if(a.length<r||a.length>t)throw new l(`${o} must contain ${r===t?r:`${r}-${t}`} comma-separated labels`);return a.map((i,s)=>normalizeLabel(i,`${o}[${s+1}]`))}export function normalizeNumber(e,o,{defaultValue:r,positive:t=!1}={}){const a=e==null||e===""?r:e,i=Number(a);if(!Number.isFinite(i)||t&&i<=0)throw new l(`${o} must be a ${t?"positive ":""}finite number`);return i}export function normalizeCoords(e){const o=String(e??"").split(",").map((r)=>r.trim());if(o.length!==2)throw new l('coords must be in "x,y" format (e.g. "1,2")');return o.map((r,t)=>normalizeNumber(r,t===0?"x":"y"))}export function requireGgbSuccess(e,o){if(!m(e))throw new n(`${o}: malformed GeoGebra result`);if(!e.ok)throw new n(e.error||o);return e}export async function ensureApplet(e){let o="";try{o=await e.getCurrentUrl()}catch{o=""}if(o?.includes("geogebra.org/geometry"))try{if(unwrapBridgeEnvelope(await e.evaluate("typeof ggbApplet !== 'undefined' && typeof ggbApplet.evalCommand === 'function'")))return}catch(t){throw new n(`Failed to detect GeoGebra applet: ${t?.message||t}`)}try{await e.goto(c)}catch(t){throw new n(`Failed to load GeoGebra Geometry: ${t?.message||t}`)}let r;try{r=unwrapBridgeEnvelope(await e.evaluate(`
2
2
  (async () => {
3
- const deadline = Date.now() + ${k};
3
+ const deadline = Date.now() + ${p};
4
4
  while (Date.now() < deadline) {
5
5
  if (typeof ggbApplet !== 'undefined' && typeof ggbApplet.evalCommand === 'function') {
6
6
  return true;
@@ -9,7 +9,7 @@ import{ArgumentError as Y,CommandExecutionError as J}from"@jackwener/opencli/err
9
9
  }
10
10
  return false;
11
11
  })()
12
- `))}catch(q){throw new J(`Failed to detect GeoGebra applet: ${q?.message||q}`)}if(D!==!0)throw new J("ggbApplet not available after waiting. Make sure the GeoGebra Geometry page is fully loaded.")}export async function ggbEval(h,H){let D;try{D=unwrapBridgeEnvelope(await h.evaluate(`
12
+ `))}catch(t){throw new n(`Failed to detect GeoGebra applet: ${t?.message||t}`)}if(r!==!0)throw new n("ggbApplet not available after waiting. Make sure the GeoGebra Geometry page is fully loaded.")}export async function ggbEval(e,o){let r;try{r=unwrapBridgeEnvelope(await e.evaluate(`
13
13
  (cmd => {
14
14
  if (typeof ggbApplet === 'undefined' || typeof ggbApplet.evalCommandGetLabels !== 'function') {
15
15
  return { ok: false, label: '', beforeCount: 0, afterCount: 0, error: 'ggbApplet is not ready' };
@@ -34,8 +34,8 @@ import{ArgumentError as Y,CommandExecutionError as J}from"@jackwener/opencli/err
34
34
  afterCount,
35
35
  error: dialogText || null,
36
36
  };
37
- })(${JSON.stringify(H)})
38
- `))}catch(q){throw new J(`Failed to execute GeoGebra command: ${q?.message||q}`)}if(!Z(D)||typeof D.ok!=="boolean")throw new J("GeoGebra command returned malformed result");return D}export async function ggbListObjects(h,H){const D=H?String(H).toLowerCase():"";let q;try{q=unwrapBridgeEnvelope(await h.evaluate(`
37
+ })(${JSON.stringify(o)})
38
+ `))}catch(t){throw new n(`Failed to execute GeoGebra command: ${t?.message||t}`)}if(!m(r)||typeof r.ok!=="boolean")throw new n("GeoGebra command returned malformed result");return r}export async function ggbListObjects(e,o){const r=o?String(o).toLowerCase():"";let t;try{t=unwrapBridgeEnvelope(await e.evaluate(`
39
39
  (filterType => {
40
40
  const api = ggbApplet;
41
41
  let names = api.getAllObjectNames();
@@ -60,16 +60,16 @@ import{ArgumentError as Y,CommandExecutionError as J}from"@jackwener/opencli/err
60
60
  }
61
61
  }
62
62
  return result;
63
- })(${JSON.stringify(D)})
64
- `))}catch(K){throw new J(`Failed to list GeoGebra objects: ${K?.message||K}`)}if(q&&typeof q==="object"&&!Array.isArray(q)&&q.error){const K=q.name?` for ${q.name}`:"";throw new J(`Failed to list GeoGebra objects${K}: ${q.error}`)}if(!Array.isArray(q))throw new J("GeoGebra object list returned malformed result");return q}export async function ggbWaitForObjectCount(h,H,D=4000){const q=normalizeNumber(H,"minCount",{positive:!0}),K=normalizeNumber(D,"timeoutMs",{positive:!0});let Q;try{Q=unwrapBridgeEnvelope(await h.evaluate(`
63
+ })(${JSON.stringify(r)})
64
+ `))}catch(a){throw new n(`Failed to list GeoGebra objects: ${a?.message||a}`)}if(t&&typeof t==="object"&&!Array.isArray(t)&&t.error){const a=t.name?` for ${t.name}`:"";throw new n(`Failed to list GeoGebra objects${a}: ${t.error}`)}if(!Array.isArray(t))throw new n("GeoGebra object list returned malformed result");return t}export async function ggbWaitForObjectCount(e,o,r=4000){const t=normalizeNumber(o,"minCount",{positive:!0}),a=normalizeNumber(r,"timeoutMs",{positive:!0});let i;try{i=unwrapBridgeEnvelope(await e.evaluate(`
65
65
  (async () => {
66
- const deadline = Date.now() + ${K};
66
+ const deadline = Date.now() + ${a};
67
67
  while (Date.now() < deadline) {
68
68
  let names = ggbApplet.getAllObjectNames();
69
69
  if (typeof names === 'string') {
70
70
  names = names.split(',').map(s => s.trim()).filter(Boolean);
71
71
  }
72
- if (Array.isArray(names) && names.length >= ${q}) {
72
+ if (Array.isArray(names) && names.length >= ${t}) {
73
73
  return names.length;
74
74
  }
75
75
  await new Promise(resolve => setTimeout(resolve, 200));
@@ -80,7 +80,7 @@ import{ArgumentError as Y,CommandExecutionError as J}from"@jackwener/opencli/err
80
80
  }
81
81
  return Array.isArray(names) ? names.length : 0;
82
82
  })()
83
- `))}catch(X){throw new J(`Failed waiting for GeoGebra object count: ${X?.message||X}`)}if(!Number.isFinite(Number(Q)))throw new J("GeoGebra object count returned malformed result");return Number(Q)}export async function ggbGetProperty(h,H,D){try{return unwrapBridgeEnvelope(await h.evaluate(`
83
+ `))}catch(s){throw new n(`Failed waiting for GeoGebra object count: ${s?.message||s}`)}if(!Number.isFinite(Number(i)))throw new n("GeoGebra object count returned malformed result");return Number(i)}export async function ggbGetProperty(e,o,r){try{return unwrapBridgeEnvelope(await e.evaluate(`
84
84
  (objName, property) => {
85
85
  const api = ggbApplet;
86
86
  switch (property) {
@@ -96,4 +96,4 @@ import{ArgumentError as Y,CommandExecutionError as J}from"@jackwener/opencli/err
96
96
  default: return null;
97
97
  }
98
98
  }
99
- `,H,D))}catch(q){throw new J(`Failed to read GeoGebra object property: ${q?.message||q}`)}}
99
+ `,o,r))}catch(t){throw new n(`Failed to read GeoGebra object property: ${t?.message||t}`)}}
@@ -1 +1 @@
1
- import{cli as Q,Strategy as R}from"@jackwener/opencli/registry";import{TimeoutError as V}from"@jackwener/opencli/errors";import{gotoGhostAdmin as X,probeGhostSite as J,resolveGhostSite as Y}from"./shared.js";const K=300;async function z(q){if(typeof q?.closeWindow!=="function")return;try{await q.closeWindow()}catch{}}Q({site:"ghost",name:"login",access:"write",description:"打开指定 Ghost 自部署站点的后台登录页并等待登录完成。用 --site 选择连接名称或站点网址。",domain:"ghost.org",strategy:R.COOKIE,browser:!0,navigateBefore:!1,defaultWindowMode:"foreground",siteSession:"persistent",args:[{name:"site",help:"连接名称或站点网址;省略时使用默认站点"},{name:"site-url",help:"兼容旧版:Ghost 站点网址(推荐改用 --site)"},{name:"timeout",type:"int",default:K,help:"等待用户完成登录的最长秒数"}],columns:["status","logged_in","site","title","connection"],func:async(q,B)=>{const x=Y(B);try{const f=await J(q,x);await z(q);return[{status:"already_logged_in",logged_in:!0,site:f.url??x.baseUrl,title:f.title,connection:x.name}]}catch(f){if(f?.code!=="AUTH_REQUIRED")throw f}await X(q,x.baseUrl);const H=Number(B.timeout??K),P=Date.now()+H*1000;while(Date.now()<P){await q.wait(2);try{const f=await J(q,x,{navigate:!1});await z(q);return[{status:"login_complete",logged_in:!0,site:f.url??x.baseUrl,title:f.title,connection:x.name}]}catch(f){if(f?.code!=="AUTH_REQUIRED")throw f}}await z(q);throw new V("ghost login",H,`请在打开的窗口里完成 ${x.baseUrl}/ghost/ 的登录后重试。`)}});
1
+ import{cli as l,Strategy as u}from"@jackwener/opencli/registry";import{TimeoutError as w}from"@jackwener/opencli/errors";import{gotoGhostAdmin as d,probeGhostSite as r,resolveGhostSite as m}from"./shared.js";const a=300;async function i(e){if(typeof e?.closeWindow!=="function")return;try{await e.closeWindow()}catch{}}l({site:"ghost",name:"login",access:"write",description:"打开指定 Ghost 自部署站点的后台登录页并等待登录完成。用 --site 选择连接名称或站点网址。",domain:"ghost.org",strategy:u.COOKIE,browser:!0,navigateBefore:!1,defaultWindowMode:"foreground",siteSession:"persistent",args:[{name:"site",help:"连接名称或站点网址;省略时使用默认站点"},{name:"site-url",help:"兼容旧版:Ghost 站点网址(推荐改用 --site)"},{name:"timeout",type:"int",default:a,help:"等待用户完成登录的最长秒数"}],columns:["status","logged_in","site","title","connection"],func:async(e,n)=>{const o=m(n);try{const t=await r(e,o);await i(e);return[{status:"already_logged_in",logged_in:!0,site:t.url??o.baseUrl,title:t.title,connection:o.name}]}catch(t){if(t?.code!=="AUTH_REQUIRED")throw t}await d(e,o.baseUrl);const s=Number(n.timeout??a),c=Date.now()+s*1000;while(Date.now()<c){await e.wait(2);try{const t=await r(e,o,{navigate:!1});await i(e);return[{status:"login_complete",logged_in:!0,site:t.url??o.baseUrl,title:t.title,connection:o.name}]}catch(t){if(t?.code!=="AUTH_REQUIRED")throw t}}await i(e);throw new w("ghost login",s,`请在打开的窗口里完成 ${o.baseUrl}/ghost/ 的登录后重试。`)}});
@@ -2,7 +2,7 @@ import{AuthRequiredError as f,CommandExecutionError as c}from"@jackwener/opencli
2
2
  href: location.href,
3
3
  onSignin: /\\/ghost\\/#\\/(?:signin|setup)/i.test(location.href)
4
4
  || !!document.querySelector('form[action*="signin"], input[type="email"]'),
5
- }))()`)}export async function ghostPageRequest(t,e,s,o={}){const r=s.startsWith("/")?s:`/${s}`,u=`${e}/ghost/api/admin${r}`,a=o.method??"GET",n=await t.evaluate(`(async () => {
5
+ }))()`)}export async function ghostPageRequest(t,e,s,o={}){const n=s.startsWith("/")?s:`/${s}`,u=`${e}/ghost/api/admin${n}`,a=o.method??"GET",r=await t.evaluate(`(async () => {
6
6
  try {
7
7
  const response = await fetch(${JSON.stringify(u)}, {
8
8
  method: ${JSON.stringify(a)},
@@ -21,4 +21,4 @@ import{AuthRequiredError as f,CommandExecutionError as c}from"@jackwener/opencli
21
21
  } catch (error) {
22
22
  return { status: 0, ok: false, json: null, text: String(error && error.message || error) };
23
23
  }
24
- })()`),i=Number(n?.status??0);if(i===401||i===403)throw new f(e,`Ghost 登录态已失效(HTTP ${i});请重新登录该站点。`);if(!n?.ok){const l=(Array.isArray(n?.json?.errors)?n.json.errors[0]?.message:"")||n?.text?.slice(0,300)||"unknown error";throw new c(`Ghost ${a} ${r} 失败(HTTP ${i}):${l}`)}return n.json}export async function probeGhostSite(t,e,{navigate:s=!0}={}){if(s)await gotoGhostAdmin(t,e.baseUrl);const r=(await ghostPageRequest(t,e.baseUrl,"/site/"))?.site;if(!r?.title)throw new c("Ghost /site/ 响应缺少站点信息");return r}
24
+ })()`),i=Number(r?.status??0);if(i===401||i===403)throw new f(e,`Ghost 登录态已失效(HTTP ${i});请重新登录该站点。`);if(!r?.ok){const l=(Array.isArray(r?.json?.errors)?r.json.errors[0]?.message:"")||r?.text?.slice(0,300)||"unknown error";throw new c(`Ghost ${a} ${n} 失败(HTTP ${i}):${l}`)}return r.json}export async function probeGhostSite(t,e,{navigate:s=!0}={}){if(s)await gotoGhostAdmin(t,e.baseUrl);const n=(await ghostPageRequest(t,e.baseUrl,"/site/"))?.site;if(!n?.title)throw new c("Ghost /site/ 响应缺少站点信息");return n}