@agentrhq/webcmd 0.1.2 → 0.2.1

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 (956) hide show
  1. package/README.md +196 -219
  2. package/cli-manifest.json +16205 -34869
  3. package/clis/_atlassian/shared.js +1 -1
  4. package/clis/booking/search.js +4 -4
  5. package/clis/chatgpt/ask.js +2 -2
  6. package/clis/chatgpt/utils.js +41 -42
  7. package/clis/chatgpt/utils.test.js +23 -23
  8. package/clis/chatgpt-app/ax.js +5 -5
  9. package/clis/chatgpt-app/ax.test.js +8 -8
  10. package/clis/chatgpt-app/new.js +2 -2
  11. package/clis/codex/sidebar.js +1 -1
  12. package/clis/codex/sidebar.test.js +12 -12
  13. package/clis/coingecko/top.js +3 -3
  14. package/clis/dblp/dblp.test.js +1 -1
  15. package/clis/discord-app/search.js +1 -1
  16. package/clis/discord-app/utils.js +6 -6
  17. package/clis/facebook/__fixtures__/notifications-page.html +6 -6
  18. package/clis/facebook/add-friend.js +2 -2
  19. package/clis/facebook/feed.js +18 -18
  20. package/clis/facebook/friends.js +4 -4
  21. package/clis/facebook/groups.js +3 -3
  22. package/clis/facebook/join-group.js +2 -2
  23. package/clis/facebook/marketplace-inbox.js +3 -3
  24. package/clis/facebook/marketplace-listings.js +1 -1
  25. package/clis/facebook/notifications.js +14 -15
  26. package/clis/facebook/notifications.test.js +28 -29
  27. package/clis/gemini/ask.test.js +12 -12
  28. package/clis/gemini/deep-research-result.js +2 -2
  29. package/clis/gemini/deep-research-result.test.js +2 -2
  30. package/clis/gemini/deep-research.js +2 -2
  31. package/clis/gemini/deep-research.test.js +1 -1
  32. package/clis/gemini/models.js +11 -11
  33. package/clis/gemini/models.test.js +1 -1
  34. package/clis/gemini/reply-state.test.js +89 -89
  35. package/clis/gemini/utils.js +41 -41
  36. package/clis/gemini/utils.test.js +30 -30
  37. package/clis/geogebra/utils.js +1 -1
  38. package/clis/google-scholar/search.js +3 -3
  39. package/clis/grok/delete.js +1 -1
  40. package/clis/grok/export-all.js +2 -2
  41. package/clis/grok/export.js +2 -2
  42. package/clis/grok/pin.js +3 -3
  43. package/clis/grok/utils.js +12 -12
  44. package/clis/grok/utils.test.js +2 -2
  45. package/clis/indeed/indeed.test.js +3 -3
  46. package/clis/indeed/utils.js +1 -1
  47. package/clis/instagram/post.js +19 -19
  48. package/clis/instagram/post.test.js +2 -2
  49. package/clis/instagram/reel.js +6 -6
  50. package/clis/linkedin/connect.js +3 -3
  51. package/clis/linkedin/people-search.js +4 -4
  52. package/clis/linkedin/profile-experience.js +6 -6
  53. package/clis/linkedin/profile-experience.test.js +10 -10
  54. package/clis/linkedin/profile-read.js +1 -1
  55. package/clis/linkedin/safe-send.js +1 -1
  56. package/clis/linkedin/search.js +1 -1
  57. package/clis/linkedin/shared.js +2 -2
  58. package/clis/linkedin/timeline.js +5 -5
  59. package/clis/manus/manus.test.js +2 -2
  60. package/clis/medium/feed.js +3 -3
  61. package/clis/medium/search.js +3 -3
  62. package/clis/medium/user.js +3 -3
  63. package/clis/notebooklm/auth.js +2 -2
  64. package/clis/notebooklm/note-list.test.js +4 -4
  65. package/clis/notebooklm/notes-get.test.js +8 -8
  66. package/clis/notebooklm/source-fulltext.test.js +11 -11
  67. package/clis/notebooklm/utils.js +28 -28
  68. package/clis/notebooklm/utils.test.js +10 -10
  69. package/clis/pixiv/search.test.js +3 -3
  70. package/clis/qoder/quest.js +2 -2
  71. package/clis/reddit/home.js +2 -2
  72. package/clis/reddit/hot.js +1 -1
  73. package/clis/reddit/read.js +2 -2
  74. package/clis/reddit/read.test.js +1 -1
  75. package/clis/reddit/reply.js +2 -2
  76. package/clis/reddit/whoami.js +2 -2
  77. package/clis/reuters/article-detail.js +1 -1
  78. package/clis/reuters/search.js +1 -1
  79. package/clis/slock/attachment-upload.test.js +1 -1
  80. package/clis/slock/task-convert.js +1 -1
  81. package/clis/substack/feed.js +3 -3
  82. package/clis/substack/publication.js +3 -3
  83. package/clis/substack/search.js +4 -4
  84. package/clis/tiktok/comment.js +2 -2
  85. package/clis/tiktok/follow.js +4 -4
  86. package/clis/tiktok/like.js +1 -1
  87. package/clis/tiktok/save.js +1 -1
  88. package/clis/tiktok/unfollow.js +4 -4
  89. package/clis/tiktok/unlike.js +1 -1
  90. package/clis/tiktok/unsave.js +2 -2
  91. package/clis/tiktok/write-refactor.test.js +5 -5
  92. package/clis/twitter/accept.js +3 -3
  93. package/clis/twitter/delete.js +14 -6
  94. package/clis/twitter/delete.test.js +74 -1
  95. package/clis/twitter/followers.js +1 -1
  96. package/clis/twitter/list-remove-core.js +2 -2
  97. package/clis/twitter/list-tweets.test.js +3 -3
  98. package/clis/twitter/lists.js +6 -6
  99. package/clis/twitter/lists.test.js +2 -2
  100. package/clis/twitter/reply-dm.js +1 -1
  101. package/clis/twitter/shared.test.js +4 -5
  102. package/clis/twitter/timeline.js +3 -1
  103. package/clis/twitter/timeline.test.js +4 -0
  104. package/clis/twitter/trending.js +1 -1
  105. package/clis/twitter/utils.js +1 -1
  106. package/clis/web/read.js +1 -1
  107. package/clis/web/read.test.js +2 -2
  108. package/clis/yahoo-finance/quote.js +1 -1
  109. package/clis/youtube/history.js +4 -4
  110. package/clis/youtube/transcript-group.js +1 -1
  111. package/clis/youtube/transcript-group.test.js +5 -5
  112. package/clis/youtube/transcript.js +5 -5
  113. package/clis/youtube/video.js +4 -4
  114. package/clis/youtube/video.test.js +6 -6
  115. package/dist/src/browser/analyze.test.js +13 -13
  116. package/dist/src/browser/bridge-readiness.d.ts +1 -1
  117. package/dist/src/browser/bridge-readiness.test.js +1 -1
  118. package/dist/src/browser/bridge.d.ts +1 -0
  119. package/dist/src/browser/bridge.js +6 -4
  120. package/dist/src/browser/cdp.d.ts +1 -0
  121. package/dist/src/browser/daemon-client.d.ts +2 -0
  122. package/dist/src/browser/daemon-client.js +108 -51
  123. package/dist/src/browser/daemon-client.test.js +135 -47
  124. package/dist/src/browser/daemon-transport.js +3 -19
  125. package/dist/src/browser/errors.js +11 -0
  126. package/dist/src/browser/page.d.ts +2 -1
  127. package/dist/src/browser/page.js +5 -1
  128. package/dist/src/browser/profile.d.ts +9 -0
  129. package/dist/src/browser/profile.js +18 -7
  130. package/dist/src/browser/profile.test.js +44 -0
  131. package/dist/src/browser/protocol.d.ts +3 -0
  132. package/dist/src/browser/runtime/local-cloak/actions.js +24 -10
  133. package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +1 -0
  134. package/dist/src/browser/runtime/local-cloak/session-manager.js +3 -0
  135. package/dist/src/browser/runtime/local-cloak/session-manager.test.js +87 -0
  136. package/dist/src/browser.test.js +2 -2
  137. package/dist/src/cli-argv-preprocess.d.ts +2 -2
  138. package/dist/src/cli-argv-preprocess.js +2 -2
  139. package/dist/src/cli-argv-preprocess.test.js +35 -35
  140. package/dist/src/cli.js +24 -19
  141. package/dist/src/cli.test.js +59 -59
  142. package/dist/src/commanderAdapter.test.js +19 -19
  143. package/dist/src/commands/daemon.test.js +13 -13
  144. package/dist/src/constants.d.ts +2 -3
  145. package/dist/src/constants.js +3 -10
  146. package/dist/src/convention-audit.js +1 -1
  147. package/dist/src/daemon/server.js +28 -23
  148. package/dist/src/daemon/server.test.js +52 -0
  149. package/dist/src/daemon-utils.d.ts +1 -0
  150. package/dist/src/daemon-utils.js +9 -0
  151. package/dist/src/daemon.js +1 -5
  152. package/dist/src/daemon.test.js +10 -1
  153. package/dist/src/doctor.js +19 -1
  154. package/dist/src/doctor.test.js +38 -4
  155. package/dist/src/download/article-download.d.ts +3 -3
  156. package/dist/src/download/article-download.js +7 -7
  157. package/dist/src/download/article-download.test.js +6 -6
  158. package/dist/src/download/index.js +1 -1
  159. package/dist/src/download/index.test.js +1 -2
  160. package/dist/src/download/media-download.d.ts +1 -1
  161. package/dist/src/download/media-download.js +1 -1
  162. package/dist/src/electron-apps.js +0 -8
  163. package/dist/src/electron-apps.test.js +2 -11
  164. package/dist/src/errors.test.js +9 -9
  165. package/dist/src/execution.js +7 -3
  166. package/dist/src/execution.test.js +12 -0
  167. package/dist/src/external-clis.yaml +0 -37
  168. package/dist/src/external.d.ts +1 -1
  169. package/dist/src/external.js +19 -1
  170. package/dist/src/external.test.js +39 -18
  171. package/dist/src/generate-release-notes-cli.test.js +140 -0
  172. package/dist/src/help.d.ts +3 -3
  173. package/dist/src/help.test.js +8 -8
  174. package/dist/src/main.js +1 -6
  175. package/dist/src/manifest-types.d.ts +1 -1
  176. package/dist/src/node-network.test.js +5 -5
  177. package/dist/src/output.js +1 -1
  178. package/dist/src/pipeline/steps/download.test.js +3 -3
  179. package/dist/src/registry.test.js +2 -2
  180. package/dist/src/release-notes.d.ts +38 -0
  181. package/dist/src/release-notes.js +99 -0
  182. package/dist/src/release-notes.test.d.ts +1 -0
  183. package/dist/src/release-notes.test.js +61 -0
  184. package/dist/src/runtime-identity.test.js +0 -8
  185. package/dist/src/runtime.d.ts +2 -0
  186. package/dist/src/runtime.js +1 -0
  187. package/dist/src/serialization.test.js +7 -7
  188. package/dist/src/snapshotFormatter.js +3 -5
  189. package/dist/src/snapshotFormatter.test.d.ts +1 -1
  190. package/dist/src/snapshotFormatter.test.js +50 -50
  191. package/dist/src/tui.js +1 -1
  192. package/package.json +5 -2
  193. package/scripts/generate-release-notes.ts +234 -0
  194. package/scripts/postinstall.js +1 -1
  195. package/scripts/silent-column-drop-baseline.json +0 -498
  196. package/scripts/typed-error-lint-baseline.json +0 -464
  197. package/skills/webcmd-adapter-author/SKILL.md +216 -213
  198. package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
  199. package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
  200. package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
  201. package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
  202. package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
  203. package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
  204. package/skills/webcmd-adapter-author/references/output-design.md +47 -125
  205. package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
  206. package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
  207. package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
  208. package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
  209. package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
  210. package/skills/webcmd-autofix/SKILL.md +136 -143
  211. package/skills/webcmd-sitemap-author/SKILL.md +58 -67
  212. package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
  213. package/skills/webcmd-usage/SKILL.md +106 -97
  214. package/clis/12306/auth.js +0 -59
  215. package/clis/12306/me.js +0 -73
  216. package/clis/12306/orders.js +0 -96
  217. package/clis/12306/passengers.js +0 -90
  218. package/clis/12306/price.js +0 -166
  219. package/clis/12306/stations.js +0 -66
  220. package/clis/12306/train.js +0 -91
  221. package/clis/12306/trains.js +0 -166
  222. package/clis/12306/utils.js +0 -272
  223. package/clis/12306/utils.test.js +0 -424
  224. package/clis/1688/assets.js +0 -205
  225. package/clis/1688/assets.test.js +0 -39
  226. package/clis/1688/auth.js +0 -46
  227. package/clis/1688/download.js +0 -77
  228. package/clis/1688/download.test.js +0 -31
  229. package/clis/1688/item.js +0 -188
  230. package/clis/1688/item.test.js +0 -67
  231. package/clis/1688/search.js +0 -310
  232. package/clis/1688/search.test.js +0 -75
  233. package/clis/1688/shared.js +0 -557
  234. package/clis/1688/shared.test.js +0 -57
  235. package/clis/1688/store.js +0 -227
  236. package/clis/1688/store.test.js +0 -62
  237. package/clis/1point3acres/auth.js +0 -52
  238. package/clis/1point3acres/digest.js +0 -35
  239. package/clis/1point3acres/forum.js +0 -51
  240. package/clis/1point3acres/forums.js +0 -44
  241. package/clis/1point3acres/hot.js +0 -35
  242. package/clis/1point3acres/latest.js +0 -35
  243. package/clis/1point3acres/notifications.js +0 -64
  244. package/clis/1point3acres/search.js +0 -71
  245. package/clis/1point3acres/thread.js +0 -117
  246. package/clis/1point3acres/user.js +0 -77
  247. package/clis/1point3acres/utils.js +0 -247
  248. package/clis/36kr/article.js +0 -66
  249. package/clis/36kr/article.test.js +0 -46
  250. package/clis/36kr/hot.js +0 -87
  251. package/clis/36kr/hot.test.js +0 -15
  252. package/clis/36kr/news.js +0 -52
  253. package/clis/36kr/news.test.js +0 -85
  254. package/clis/36kr/search.js +0 -79
  255. package/clis/51job/company.js +0 -126
  256. package/clis/51job/detail.js +0 -109
  257. package/clis/51job/hot.js +0 -56
  258. package/clis/51job/search.js +0 -80
  259. package/clis/51job/utils.js +0 -302
  260. package/clis/51job/utils.test.js +0 -69
  261. package/clis/aibase/news.js +0 -110
  262. package/clis/aibase/news.test.js +0 -59
  263. package/clis/autohome/__fixtures__/catalog.html +0 -11
  264. package/clis/autohome/__fixtures__/koubei.json +0 -116
  265. package/clis/autohome/autohome.test.js +0 -115
  266. package/clis/autohome/brand.js +0 -108
  267. package/clis/autohome/score.js +0 -103
  268. package/clis/autohome/utils.js +0 -157
  269. package/clis/baidu-scholar/search.js +0 -87
  270. package/clis/baidu-scholar/search.test.js +0 -23
  271. package/clis/bilibili/auth.js +0 -36
  272. package/clis/bilibili/comment.js +0 -107
  273. package/clis/bilibili/comment.test.js +0 -153
  274. package/clis/bilibili/comments.js +0 -136
  275. package/clis/bilibili/comments.test.js +0 -142
  276. package/clis/bilibili/download.js +0 -178
  277. package/clis/bilibili/download.test.js +0 -173
  278. package/clis/bilibili/dynamic.js +0 -34
  279. package/clis/bilibili/dynamic.test.js +0 -68
  280. package/clis/bilibili/favorite.js +0 -47
  281. package/clis/bilibili/feed.js +0 -220
  282. package/clis/bilibili/follow.js +0 -140
  283. package/clis/bilibili/follow.test.js +0 -203
  284. package/clis/bilibili/following.js +0 -44
  285. package/clis/bilibili/history.js +0 -45
  286. package/clis/bilibili/hot.js +0 -40
  287. package/clis/bilibili/hot.test.js +0 -17
  288. package/clis/bilibili/me.js +0 -13
  289. package/clis/bilibili/ranking.js +0 -25
  290. package/clis/bilibili/search.js +0 -24
  291. package/clis/bilibili/subtitle.js +0 -141
  292. package/clis/bilibili/subtitle.test.js +0 -240
  293. package/clis/bilibili/summary.js +0 -167
  294. package/clis/bilibili/summary.test.js +0 -210
  295. package/clis/bilibili/unfollow.js +0 -121
  296. package/clis/bilibili/user-videos.js +0 -39
  297. package/clis/bilibili/utils.js +0 -273
  298. package/clis/bilibili/utils.test.js +0 -97
  299. package/clis/bilibili/video.js +0 -155
  300. package/clis/bilibili/video.test.js +0 -308
  301. package/clis/boss/auth.js +0 -47
  302. package/clis/boss/batchgreet.js +0 -61
  303. package/clis/boss/chatlist.js +0 -116
  304. package/clis/boss/chatlist.test.js +0 -211
  305. package/clis/boss/chatmsg.js +0 -117
  306. package/clis/boss/chatmsg.test.js +0 -230
  307. package/clis/boss/detail.js +0 -63
  308. package/clis/boss/exchange.js +0 -46
  309. package/clis/boss/greet.js +0 -49
  310. package/clis/boss/invite.js +0 -64
  311. package/clis/boss/joblist.js +0 -31
  312. package/clis/boss/mark.js +0 -70
  313. package/clis/boss/recommend.js +0 -45
  314. package/clis/boss/resume.js +0 -150
  315. package/clis/boss/search.js +0 -197
  316. package/clis/boss/search.test.js +0 -78
  317. package/clis/boss/send.js +0 -44
  318. package/clis/boss/stats.js +0 -66
  319. package/clis/boss/utils.js +0 -468
  320. package/clis/boss/utils.test.js +0 -34
  321. package/clis/chaoxing/assignments.js +0 -76
  322. package/clis/chaoxing/auth.js +0 -54
  323. package/clis/chaoxing/exams.js +0 -75
  324. package/clis/chaoxing/utils.js +0 -223
  325. package/clis/chaoxing/utils.test.js +0 -45
  326. package/clis/cnki/search.js +0 -61
  327. package/clis/cnki/search.test.js +0 -18
  328. package/clis/ctrip/auth.js +0 -50
  329. package/clis/ctrip/ctrip.test.js +0 -719
  330. package/clis/ctrip/flight.js +0 -136
  331. package/clis/ctrip/hotel-search.js +0 -132
  332. package/clis/ctrip/hotel-suggest.js +0 -45
  333. package/clis/ctrip/search.js +0 -41
  334. package/clis/ctrip/utils.js +0 -473
  335. package/clis/deepseek/ask.js +0 -158
  336. package/clis/deepseek/ask.test.js +0 -399
  337. package/clis/deepseek/auth.js +0 -54
  338. package/clis/deepseek/detail.js +0 -46
  339. package/clis/deepseek/detail.test.js +0 -81
  340. package/clis/deepseek/history.js +0 -27
  341. package/clis/deepseek/new.js +0 -33
  342. package/clis/deepseek/read.js +0 -25
  343. package/clis/deepseek/send.js +0 -140
  344. package/clis/deepseek/send.test.js +0 -107
  345. package/clis/deepseek/status.js +0 -26
  346. package/clis/deepseek/utils.js +0 -487
  347. package/clis/deepseek/utils.test.js +0 -370
  348. package/clis/dianping/__fixtures__/search.html +0 -168
  349. package/clis/dianping/__fixtures__/shop.html +0 -6
  350. package/clis/dianping/auth.js +0 -49
  351. package/clis/dianping/cityResolver.js +0 -185
  352. package/clis/dianping/dianping.test.js +0 -578
  353. package/clis/dianping/search.js +0 -157
  354. package/clis/dianping/shop.js +0 -173
  355. package/clis/dianping/utils.js +0 -157
  356. package/clis/dongchedi/__fixtures__/search.json +0 -60
  357. package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
  358. package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
  359. package/clis/dongchedi/dongchedi.test.js +0 -191
  360. package/clis/dongchedi/koubei.js +0 -85
  361. package/clis/dongchedi/models.js +0 -91
  362. package/clis/dongchedi/score.js +0 -83
  363. package/clis/dongchedi/search.js +0 -83
  364. package/clis/dongchedi/series.js +0 -87
  365. package/clis/dongchedi/specs.js +0 -115
  366. package/clis/dongchedi/utils.js +0 -180
  367. package/clis/douban/auth.js +0 -50
  368. package/clis/douban/book-hot.js +0 -15
  369. package/clis/douban/download.js +0 -68
  370. package/clis/douban/download.test.js +0 -170
  371. package/clis/douban/marks.js +0 -116
  372. package/clis/douban/movie-hot.js +0 -15
  373. package/clis/douban/movie-hot.test.js +0 -14
  374. package/clis/douban/photos.js +0 -35
  375. package/clis/douban/reviews.js +0 -107
  376. package/clis/douban/search.js +0 -18
  377. package/clis/douban/search.test.js +0 -11
  378. package/clis/douban/subject.js +0 -46
  379. package/clis/douban/subject.test.js +0 -11
  380. package/clis/douban/top250.js +0 -68
  381. package/clis/douban/utils.js +0 -657
  382. package/clis/douban/utils.test.js +0 -488
  383. package/clis/doubao/ask.js +0 -40
  384. package/clis/doubao/auth.js +0 -66
  385. package/clis/doubao/detail.js +0 -35
  386. package/clis/doubao/detail.test.js +0 -42
  387. package/clis/doubao/history.js +0 -30
  388. package/clis/doubao/history.test.js +0 -37
  389. package/clis/doubao/meeting-summary.js +0 -41
  390. package/clis/doubao/meeting-transcript.js +0 -38
  391. package/clis/doubao/new.js +0 -22
  392. package/clis/doubao/read.js +0 -21
  393. package/clis/doubao/send.js +0 -24
  394. package/clis/doubao/status.js +0 -26
  395. package/clis/doubao/utils.js +0 -1156
  396. package/clis/doubao/utils.test.js +0 -396
  397. package/clis/doubao-app/ask.js +0 -54
  398. package/clis/doubao-app/dump.js +0 -25
  399. package/clis/doubao-app/new.js +0 -21
  400. package/clis/doubao-app/read.js +0 -19
  401. package/clis/doubao-app/screenshot.js +0 -19
  402. package/clis/doubao-app/send.js +0 -28
  403. package/clis/doubao-app/status.js +0 -17
  404. package/clis/doubao-app/utils.js +0 -110
  405. package/clis/douyin/_shared/browser-fetch.js +0 -66
  406. package/clis/douyin/_shared/browser-fetch.test.js +0 -64
  407. package/clis/douyin/_shared/creation-id.js +0 -5
  408. package/clis/douyin/_shared/creation-id.test.js +0 -22
  409. package/clis/douyin/_shared/evaluate-result.js +0 -16
  410. package/clis/douyin/_shared/imagex-upload.js +0 -53
  411. package/clis/douyin/_shared/imagex-upload.test.js +0 -87
  412. package/clis/douyin/_shared/public-api.js +0 -29
  413. package/clis/douyin/_shared/sts2.js +0 -21
  414. package/clis/douyin/_shared/sts2.test.js +0 -27
  415. package/clis/douyin/_shared/text-extra.js +0 -15
  416. package/clis/douyin/_shared/text-extra.test.js +0 -37
  417. package/clis/douyin/_shared/timing.js +0 -22
  418. package/clis/douyin/_shared/timing.test.js +0 -28
  419. package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
  420. package/clis/douyin/_shared/tos-upload.js +0 -331
  421. package/clis/douyin/_shared/tos-upload.test.js +0 -229
  422. package/clis/douyin/_shared/transcode.js +0 -45
  423. package/clis/douyin/_shared/transcode.test.js +0 -91
  424. package/clis/douyin/_shared/vod-upload.js +0 -212
  425. package/clis/douyin/_shared/vod-upload.test.js +0 -38
  426. package/clis/douyin/activities.js +0 -23
  427. package/clis/douyin/activities.test.js +0 -55
  428. package/clis/douyin/auth.js +0 -39
  429. package/clis/douyin/collections.js +0 -23
  430. package/clis/douyin/collections.test.js +0 -45
  431. package/clis/douyin/delete.js +0 -152
  432. package/clis/douyin/delete.test.js +0 -100
  433. package/clis/douyin/draft.js +0 -355
  434. package/clis/douyin/draft.test.js +0 -335
  435. package/clis/douyin/drafts.js +0 -24
  436. package/clis/douyin/drafts.test.js +0 -11
  437. package/clis/douyin/hashtag.js +0 -114
  438. package/clis/douyin/hashtag.test.js +0 -171
  439. package/clis/douyin/location.js +0 -25
  440. package/clis/douyin/location.test.js +0 -23
  441. package/clis/douyin/profile.js +0 -29
  442. package/clis/douyin/profile.test.js +0 -46
  443. package/clis/douyin/publish-upload-id.test.js +0 -206
  444. package/clis/douyin/publish.js +0 -341
  445. package/clis/douyin/publish.test.js +0 -38
  446. package/clis/douyin/search.js +0 -308
  447. package/clis/douyin/search.test.js +0 -307
  448. package/clis/douyin/stats.js +0 -28
  449. package/clis/douyin/stats.test.js +0 -22
  450. package/clis/douyin/update.js +0 -32
  451. package/clis/douyin/update.test.js +0 -11
  452. package/clis/douyin/user-videos.js +0 -82
  453. package/clis/douyin/user-videos.test.js +0 -151
  454. package/clis/douyin/videos.js +0 -52
  455. package/clis/douyin/videos.test.js +0 -54
  456. package/clis/eastmoney/_secid.js +0 -78
  457. package/clis/eastmoney/announcement.js +0 -53
  458. package/clis/eastmoney/convertible.js +0 -74
  459. package/clis/eastmoney/etf.js +0 -66
  460. package/clis/eastmoney/holders.js +0 -79
  461. package/clis/eastmoney/hot-rank.js +0 -51
  462. package/clis/eastmoney/hot-rank.test.js +0 -59
  463. package/clis/eastmoney/index-board.js +0 -97
  464. package/clis/eastmoney/kline.js +0 -88
  465. package/clis/eastmoney/kuaixun.js +0 -55
  466. package/clis/eastmoney/longhu.js +0 -68
  467. package/clis/eastmoney/money-flow.js +0 -79
  468. package/clis/eastmoney/northbound.js +0 -58
  469. package/clis/eastmoney/quote.js +0 -108
  470. package/clis/eastmoney/rank.js +0 -95
  471. package/clis/eastmoney/sectors.js +0 -77
  472. package/clis/flomo/auth.js +0 -55
  473. package/clis/flomo/memos.js +0 -228
  474. package/clis/flomo/memos.test.js +0 -144
  475. package/clis/gitee/auth.js +0 -41
  476. package/clis/gitee/index.js +0 -3
  477. package/clis/gitee/search.js +0 -137
  478. package/clis/gitee/search.test.js +0 -65
  479. package/clis/gitee/trending.js +0 -568
  480. package/clis/gitee/user.js +0 -200
  481. package/clis/gitee/user.test.js +0 -63
  482. package/clis/gov-law/commands.test.js +0 -39
  483. package/clis/gov-law/recent.js +0 -22
  484. package/clis/gov-law/search.js +0 -41
  485. package/clis/gov-law/shared.js +0 -51
  486. package/clis/gov-policy/__fixtures__/recent.html +0 -16
  487. package/clis/gov-policy/__fixtures__/search.html +0 -41
  488. package/clis/gov-policy/gov-policy.test.js +0 -224
  489. package/clis/gov-policy/recent.js +0 -90
  490. package/clis/gov-policy/search.js +0 -91
  491. package/clis/gov-policy/utils.js +0 -54
  492. package/clis/guazi/__fixtures__/detail.html +0 -7
  493. package/clis/guazi/__fixtures__/list.html +0 -5
  494. package/clis/guazi/browse.js +0 -95
  495. package/clis/guazi/car.js +0 -110
  496. package/clis/guazi/guazi.test.js +0 -126
  497. package/clis/guazi/utils.js +0 -133
  498. package/clis/huodongxing/events.js +0 -322
  499. package/clis/huodongxing/events.test.js +0 -296
  500. package/clis/hupu/__fixtures__/hot-home.html +0 -64
  501. package/clis/hupu/auth.js +0 -47
  502. package/clis/hupu/detail.js +0 -72
  503. package/clis/hupu/hot.js +0 -163
  504. package/clis/hupu/hot.test.js +0 -224
  505. package/clis/hupu/like.js +0 -76
  506. package/clis/hupu/mentions.js +0 -160
  507. package/clis/hupu/reply.js +0 -72
  508. package/clis/hupu/search.js +0 -60
  509. package/clis/hupu/unlike.js +0 -76
  510. package/clis/hupu/utils.js +0 -319
  511. package/clis/jd/add-cart.js +0 -72
  512. package/clis/jd/auth.js +0 -46
  513. package/clis/jd/cart.js +0 -80
  514. package/clis/jd/commands.test.js +0 -41
  515. package/clis/jd/detail.js +0 -63
  516. package/clis/jd/item.js +0 -730
  517. package/clis/jd/item.test.js +0 -354
  518. package/clis/jd/item.test.ts +0 -517
  519. package/clis/jd/reviews.js +0 -55
  520. package/clis/jd/search.js +0 -66
  521. package/clis/jianyu/auth.js +0 -62
  522. package/clis/jianyu/detail.js +0 -21
  523. package/clis/jianyu/search.js +0 -634
  524. package/clis/jianyu/search.test.js +0 -153
  525. package/clis/jianyu/shared/china-bid-search.js +0 -165
  526. package/clis/jianyu/shared/procurement-contract.js +0 -324
  527. package/clis/jianyu/shared/procurement-contract.test.js +0 -72
  528. package/clis/jianyu/shared/procurement-detail.js +0 -107
  529. package/clis/jianyu/shared/procurement-detail.test.js +0 -84
  530. package/clis/jike/auth.js +0 -48
  531. package/clis/jike/comment.js +0 -107
  532. package/clis/jike/create.js +0 -106
  533. package/clis/jike/feed.js +0 -68
  534. package/clis/jike/like.js +0 -61
  535. package/clis/jike/notifications.js +0 -169
  536. package/clis/jike/post.js +0 -72
  537. package/clis/jike/read.test.js +0 -86
  538. package/clis/jike/repost.js +0 -103
  539. package/clis/jike/search.js +0 -68
  540. package/clis/jike/topic.js +0 -65
  541. package/clis/jike/user.js +0 -65
  542. package/clis/jike/utils.js +0 -25
  543. package/clis/jimeng/auth.js +0 -46
  544. package/clis/jimeng/generate.js +0 -84
  545. package/clis/jimeng/history.js +0 -48
  546. package/clis/jimeng/new.js +0 -44
  547. package/clis/jimeng/workspaces.js +0 -42
  548. package/clis/juejin/hot.js +0 -37
  549. package/clis/juejin/juejin.test.js +0 -241
  550. package/clis/juejin/recommend.js +0 -61
  551. package/clis/juejin/utils.js +0 -199
  552. package/clis/ke/auth.js +0 -46
  553. package/clis/ke/chengjiao.js +0 -78
  554. package/clis/ke/ershoufang.js +0 -101
  555. package/clis/ke/utils.js +0 -104
  556. package/clis/ke/xiaoqu.js +0 -78
  557. package/clis/ke/zufang.js +0 -95
  558. package/clis/kimi/_utils.js +0 -110
  559. package/clis/kimi/audit-extras.js +0 -268
  560. package/clis/kimi/auth.js +0 -57
  561. package/clis/kimi/chat.js +0 -470
  562. package/clis/kimi/kimi.test.js +0 -187
  563. package/clis/kimi/storage.js +0 -169
  564. package/clis/kimi/ui.js +0 -314
  565. package/clis/kimi/usage.js +0 -144
  566. package/clis/linux-do/auth.js +0 -55
  567. package/clis/linux-do/categories.js +0 -50
  568. package/clis/linux-do/feed.js +0 -395
  569. package/clis/linux-do/feed.test.js +0 -153
  570. package/clis/linux-do/search.js +0 -29
  571. package/clis/linux-do/tags.js +0 -28
  572. package/clis/linux-do/topic-content.js +0 -155
  573. package/clis/linux-do/topic-content.test.js +0 -59
  574. package/clis/linux-do/topic.js +0 -53
  575. package/clis/linux-do/user-posts.js +0 -57
  576. package/clis/linux-do/user-topics.js +0 -37
  577. package/clis/maimai/auth.js +0 -47
  578. package/clis/maimai/search-talents.js +0 -192
  579. package/clis/maimai/search-talents.test.js +0 -29
  580. package/clis/mubu/doc.js +0 -41
  581. package/clis/mubu/docs.js +0 -44
  582. package/clis/mubu/notes.js +0 -245
  583. package/clis/mubu/recent.js +0 -28
  584. package/clis/mubu/search.js +0 -63
  585. package/clis/mubu/utils.js +0 -304
  586. package/clis/nowcoder/auth.js +0 -65
  587. package/clis/nowcoder/companies.js +0 -24
  588. package/clis/nowcoder/creators.js +0 -28
  589. package/clis/nowcoder/detail.js +0 -62
  590. package/clis/nowcoder/experience.js +0 -37
  591. package/clis/nowcoder/hot.js +0 -25
  592. package/clis/nowcoder/jobs.js +0 -22
  593. package/clis/nowcoder/notifications.js +0 -30
  594. package/clis/nowcoder/papers.js +0 -41
  595. package/clis/nowcoder/practice.js +0 -38
  596. package/clis/nowcoder/recommend.js +0 -31
  597. package/clis/nowcoder/referral.js +0 -40
  598. package/clis/nowcoder/salary.js +0 -41
  599. package/clis/nowcoder/search.js +0 -50
  600. package/clis/nowcoder/suggest.js +0 -34
  601. package/clis/nowcoder/topics.js +0 -28
  602. package/clis/nowcoder/trending.js +0 -26
  603. package/clis/ones/common.js +0 -144
  604. package/clis/ones/enrich-tasks.js +0 -37
  605. package/clis/ones/login.js +0 -81
  606. package/clis/ones/logout.js +0 -18
  607. package/clis/ones/me.js +0 -31
  608. package/clis/ones/my-tasks.js +0 -121
  609. package/clis/ones/resolve-labels.js +0 -64
  610. package/clis/ones/task-helpers.js +0 -212
  611. package/clis/ones/task-helpers.test.js +0 -12
  612. package/clis/ones/task.js +0 -67
  613. package/clis/ones/tasks.js +0 -80
  614. package/clis/ones/token-info.js +0 -43
  615. package/clis/ones/worklog.js +0 -268
  616. package/clis/ones/worklog.test.js +0 -20
  617. package/clis/powerchina/auth.js +0 -52
  618. package/clis/powerchina/search.js +0 -251
  619. package/clis/powerchina/search.test.js +0 -93
  620. package/clis/quark/auth.js +0 -47
  621. package/clis/quark/ls.js +0 -64
  622. package/clis/quark/mkdir.js +0 -37
  623. package/clis/quark/mv.js +0 -54
  624. package/clis/quark/rename.js +0 -27
  625. package/clis/quark/rm.js +0 -25
  626. package/clis/quark/save.js +0 -81
  627. package/clis/quark/share-tree.js +0 -46
  628. package/clis/quark/utils.js +0 -146
  629. package/clis/quark/utils.test.js +0 -58
  630. package/clis/qwen/ask.js +0 -104
  631. package/clis/qwen/ask.test.js +0 -36
  632. package/clis/qwen/auth.js +0 -56
  633. package/clis/qwen/detail.js +0 -62
  634. package/clis/qwen/history.js +0 -61
  635. package/clis/qwen/image.js +0 -179
  636. package/clis/qwen/new.js +0 -23
  637. package/clis/qwen/read.js +0 -41
  638. package/clis/qwen/send.js +0 -55
  639. package/clis/qwen/status.js +0 -37
  640. package/clis/qwen/utils.js +0 -461
  641. package/clis/qwen/utils.test.js +0 -128
  642. package/clis/rednote/auth.js +0 -52
  643. package/clis/rednote/comments.js +0 -85
  644. package/clis/rednote/download.js +0 -59
  645. package/clis/rednote/feed.js +0 -27
  646. package/clis/rednote/navigation.test.js +0 -26
  647. package/clis/rednote/note.js +0 -68
  648. package/clis/rednote/notifications.js +0 -139
  649. package/clis/rednote/rednote.test.js +0 -240
  650. package/clis/rednote/search.js +0 -107
  651. package/clis/rednote/user.js +0 -55
  652. package/clis/sinablog/article.js +0 -15
  653. package/clis/sinablog/hot.js +0 -15
  654. package/clis/sinablog/search.js +0 -52
  655. package/clis/sinablog/user.js +0 -16
  656. package/clis/sinablog/utils.js +0 -186
  657. package/clis/sinafinance/news.js +0 -62
  658. package/clis/sinafinance/rolling-news.js +0 -41
  659. package/clis/sinafinance/stock-rank.js +0 -66
  660. package/clis/sinafinance/stock.js +0 -121
  661. package/clis/sinafinance/stock.test.js +0 -59
  662. package/clis/smzdm/search.js +0 -149
  663. package/clis/smzdm/search.test.js +0 -114
  664. package/clis/taobao/add-cart.js +0 -150
  665. package/clis/taobao/auth.js +0 -58
  666. package/clis/taobao/cart.js +0 -96
  667. package/clis/taobao/commands.test.js +0 -41
  668. package/clis/taobao/detail.js +0 -71
  669. package/clis/taobao/reviews.js +0 -77
  670. package/clis/taobao/search.js +0 -97
  671. package/clis/tdx/hot-rank.js +0 -48
  672. package/clis/tdx/hot-rank.test.js +0 -59
  673. package/clis/ths/hot-rank.js +0 -50
  674. package/clis/ths/hot-rank.test.js +0 -64
  675. package/clis/tieba/commands.test.js +0 -79
  676. package/clis/tieba/hot.js +0 -48
  677. package/clis/tieba/posts.js +0 -86
  678. package/clis/tieba/read.js +0 -141
  679. package/clis/tieba/search.js +0 -109
  680. package/clis/tieba/utils.js +0 -240
  681. package/clis/tieba/utils.test.js +0 -290
  682. package/clis/toutiao/articles.js +0 -55
  683. package/clis/toutiao/auth.js +0 -70
  684. package/clis/toutiao/hot.js +0 -63
  685. package/clis/toutiao/toutiao.test.js +0 -378
  686. package/clis/toutiao/utils.js +0 -161
  687. package/clis/trae-cn/activity.js +0 -22
  688. package/clis/trae-cn/approve.js +0 -52
  689. package/clis/trae-cn/ask.js +0 -99
  690. package/clis/trae-cn/dump.js +0 -5
  691. package/clis/trae-cn/export.js +0 -40
  692. package/clis/trae-cn/model.js +0 -22
  693. package/clis/trae-cn/new.js +0 -63
  694. package/clis/trae-cn/read.js +0 -23
  695. package/clis/trae-cn/screenshot.js +0 -5
  696. package/clis/trae-cn/select-model.js +0 -25
  697. package/clis/trae-cn/send.js +0 -23
  698. package/clis/trae-cn/setup.js +0 -75
  699. package/clis/trae-cn/status.js +0 -27
  700. package/clis/trae-cn/targets.js +0 -96
  701. package/clis/trae-cn/trae-cn.test.js +0 -412
  702. package/clis/trae-cn/utils.js +0 -750
  703. package/clis/trae-cn/watch.js +0 -119
  704. package/clis/uisdc/news.js +0 -105
  705. package/clis/uisdc/news.test.js +0 -66
  706. package/clis/v2ex/auth.js +0 -44
  707. package/clis/v2ex/daily.js +0 -99
  708. package/clis/v2ex/hot.js +0 -26
  709. package/clis/v2ex/latest.js +0 -26
  710. package/clis/v2ex/me.js +0 -100
  711. package/clis/v2ex/member.js +0 -28
  712. package/clis/v2ex/node.js +0 -39
  713. package/clis/v2ex/nodes.js +0 -26
  714. package/clis/v2ex/notifications.js +0 -72
  715. package/clis/v2ex/replies.js +0 -27
  716. package/clis/v2ex/topic.js +0 -31
  717. package/clis/v2ex/user.js +0 -34
  718. package/clis/wanfang/search.js +0 -66
  719. package/clis/wanfang/search.test.js +0 -23
  720. package/clis/wechat-channels/auth.js +0 -62
  721. package/clis/wechat-channels/publish.js +0 -732
  722. package/clis/wechat-channels/publish.test.js +0 -144
  723. package/clis/weibo/auth.js +0 -53
  724. package/clis/weibo/comments.js +0 -53
  725. package/clis/weibo/delete.js +0 -172
  726. package/clis/weibo/delete.test.js +0 -94
  727. package/clis/weibo/envelope.test.js +0 -85
  728. package/clis/weibo/favorites.js +0 -170
  729. package/clis/weibo/favorites.test.js +0 -114
  730. package/clis/weibo/feed.js +0 -69
  731. package/clis/weibo/hot.js +0 -39
  732. package/clis/weibo/me.js +0 -75
  733. package/clis/weibo/post.js +0 -75
  734. package/clis/weibo/publish.js +0 -306
  735. package/clis/weibo/publish.test.js +0 -192
  736. package/clis/weibo/search.js +0 -80
  737. package/clis/weibo/user-posts.js +0 -234
  738. package/clis/weibo/user-posts.test.js +0 -92
  739. package/clis/weibo/user.js +0 -63
  740. package/clis/weibo/utils.js +0 -59
  741. package/clis/weibo/utils.test.js +0 -36
  742. package/clis/weixin/create-draft.js +0 -226
  743. package/clis/weixin/download.js +0 -371
  744. package/clis/weixin/download.test.js +0 -106
  745. package/clis/weixin/drafts.js +0 -66
  746. package/clis/weixin/drafts.test.js +0 -69
  747. package/clis/weixin/search.js +0 -157
  748. package/clis/weixin/search.test.js +0 -227
  749. package/clis/weread/ai-outline.js +0 -171
  750. package/clis/weread/ai-outline.test.js +0 -83
  751. package/clis/weread/auth.js +0 -59
  752. package/clis/weread/book-search.js +0 -438
  753. package/clis/weread/book-search.test.js +0 -242
  754. package/clis/weread/book.js +0 -233
  755. package/clis/weread/commands.test.js +0 -398
  756. package/clis/weread/highlights.js +0 -24
  757. package/clis/weread/notebooks.js +0 -22
  758. package/clis/weread/notes.js +0 -30
  759. package/clis/weread/private-api-regression.test.js +0 -369
  760. package/clis/weread/ranking.js +0 -29
  761. package/clis/weread/search-regression.test.js +0 -494
  762. package/clis/weread/search.js +0 -186
  763. package/clis/weread/shelf.js +0 -66
  764. package/clis/weread/utils.js +0 -321
  765. package/clis/weread/utils.test.js +0 -128
  766. package/clis/weread-official/book.js +0 -135
  767. package/clis/weread-official/commands.test.js +0 -385
  768. package/clis/weread-official/discover.js +0 -107
  769. package/clis/weread-official/list-apis.js +0 -95
  770. package/clis/weread-official/notes.js +0 -171
  771. package/clis/weread-official/readdata.js +0 -158
  772. package/clis/weread-official/review.js +0 -93
  773. package/clis/weread-official/search.js +0 -106
  774. package/clis/weread-official/shelf.js +0 -97
  775. package/clis/weread-official/utils.js +0 -293
  776. package/clis/weread-official/utils.test.js +0 -242
  777. package/clis/xianyu/auth.js +0 -68
  778. package/clis/xianyu/chat.js +0 -74
  779. package/clis/xianyu/chat.test.js +0 -84
  780. package/clis/xianyu/im.js +0 -322
  781. package/clis/xianyu/im.test.js +0 -253
  782. package/clis/xianyu/inbox.js +0 -96
  783. package/clis/xianyu/item.js +0 -153
  784. package/clis/xianyu/item.test.js +0 -56
  785. package/clis/xianyu/messages.js +0 -91
  786. package/clis/xianyu/publish.js +0 -485
  787. package/clis/xianyu/publish.test.js +0 -220
  788. package/clis/xianyu/reply.js +0 -82
  789. package/clis/xianyu/search.js +0 -262
  790. package/clis/xianyu/search.test.js +0 -104
  791. package/clis/xianyu/utils.js +0 -8
  792. package/clis/xiaoe/auth.js +0 -55
  793. package/clis/xiaoe/catalog.js +0 -227
  794. package/clis/xiaoe/content.js +0 -175
  795. package/clis/xiaoe/courses.js +0 -127
  796. package/clis/xiaoe/detail.js +0 -36
  797. package/clis/xiaoe/play-url.js +0 -121
  798. package/clis/xiaoe/xiaoe.test.js +0 -486
  799. package/clis/xiaohongshu/ask.js +0 -426
  800. package/clis/xiaohongshu/ask.test.js +0 -271
  801. package/clis/xiaohongshu/auth.js +0 -53
  802. package/clis/xiaohongshu/collection-helpers.js +0 -283
  803. package/clis/xiaohongshu/collection-helpers.test.js +0 -125
  804. package/clis/xiaohongshu/comments.js +0 -228
  805. package/clis/xiaohongshu/comments.test.js +0 -320
  806. package/clis/xiaohongshu/creator-note-detail.js +0 -482
  807. package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
  808. package/clis/xiaohongshu/creator-notes-summary.js +0 -98
  809. package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
  810. package/clis/xiaohongshu/creator-notes.js +0 -479
  811. package/clis/xiaohongshu/creator-notes.test.js +0 -281
  812. package/clis/xiaohongshu/creator-profile.js +0 -55
  813. package/clis/xiaohongshu/creator-stats.js +0 -76
  814. package/clis/xiaohongshu/creator-stats.test.js +0 -24
  815. package/clis/xiaohongshu/delete-note.js +0 -260
  816. package/clis/xiaohongshu/delete-note.test.js +0 -172
  817. package/clis/xiaohongshu/download.js +0 -249
  818. package/clis/xiaohongshu/download.test.js +0 -339
  819. package/clis/xiaohongshu/draft-clear.js +0 -91
  820. package/clis/xiaohongshu/draft-delete.js +0 -103
  821. package/clis/xiaohongshu/draft-open.js +0 -43
  822. package/clis/xiaohongshu/draft-utils.js +0 -142
  823. package/clis/xiaohongshu/drafts.js +0 -28
  824. package/clis/xiaohongshu/drafts.test.js +0 -172
  825. package/clis/xiaohongshu/feed.js +0 -163
  826. package/clis/xiaohongshu/feed.test.js +0 -126
  827. package/clis/xiaohongshu/follow.js +0 -226
  828. package/clis/xiaohongshu/follow.test.js +0 -211
  829. package/clis/xiaohongshu/liked.js +0 -29
  830. package/clis/xiaohongshu/liked.test.js +0 -82
  831. package/clis/xiaohongshu/navigation.test.js +0 -38
  832. package/clis/xiaohongshu/note-helpers.js +0 -69
  833. package/clis/xiaohongshu/note.js +0 -104
  834. package/clis/xiaohongshu/note.test.js +0 -249
  835. package/clis/xiaohongshu/notifications.js +0 -46
  836. package/clis/xiaohongshu/publish.js +0 -1423
  837. package/clis/xiaohongshu/publish.test.js +0 -1141
  838. package/clis/xiaohongshu/saved.js +0 -29
  839. package/clis/xiaohongshu/saved.test.js +0 -143
  840. package/clis/xiaohongshu/search.js +0 -330
  841. package/clis/xiaohongshu/search.test.js +0 -325
  842. package/clis/xiaohongshu/unfollow.js +0 -285
  843. package/clis/xiaohongshu/user-helpers.js +0 -78
  844. package/clis/xiaohongshu/user-helpers.test.js +0 -160
  845. package/clis/xiaohongshu/user.js +0 -140
  846. package/clis/xiaohongshu/user.test.js +0 -141
  847. package/clis/xiaoyuzhou/auth.js +0 -303
  848. package/clis/xiaoyuzhou/auth.test.js +0 -124
  849. package/clis/xiaoyuzhou/download.js +0 -54
  850. package/clis/xiaoyuzhou/download.test.js +0 -135
  851. package/clis/xiaoyuzhou/episode.js +0 -34
  852. package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
  853. package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
  854. package/clis/xiaoyuzhou/podcast.js +0 -33
  855. package/clis/xiaoyuzhou/transcript.js +0 -77
  856. package/clis/xiaoyuzhou/transcript.test.js +0 -195
  857. package/clis/xiaoyuzhou/utils.js +0 -15
  858. package/clis/xiaoyuzhou/utils.test.js +0 -39
  859. package/clis/xueqiu/auth.js +0 -63
  860. package/clis/xueqiu/comments.js +0 -355
  861. package/clis/xueqiu/comments.test.js +0 -696
  862. package/clis/xueqiu/danjuan-utils.js +0 -126
  863. package/clis/xueqiu/danjuan-utils.test.js +0 -41
  864. package/clis/xueqiu/earnings-date.js +0 -45
  865. package/clis/xueqiu/feed.js +0 -39
  866. package/clis/xueqiu/fund-holdings.js +0 -29
  867. package/clis/xueqiu/fund-snapshot.js +0 -26
  868. package/clis/xueqiu/groups.js +0 -23
  869. package/clis/xueqiu/hot-stock.js +0 -32
  870. package/clis/xueqiu/hot.js +0 -37
  871. package/clis/xueqiu/kline.js +0 -44
  872. package/clis/xueqiu/search.js +0 -37
  873. package/clis/xueqiu/stock.js +0 -65
  874. package/clis/xueqiu/utils.js +0 -48
  875. package/clis/xueqiu/utils.test.js +0 -26
  876. package/clis/xueqiu/watchlist.js +0 -37
  877. package/clis/youdao/note.js +0 -258
  878. package/clis/youdao/note.test.js +0 -99
  879. package/clis/yuanbao/ask.js +0 -362
  880. package/clis/yuanbao/ask.test.js +0 -124
  881. package/clis/yuanbao/auth.js +0 -59
  882. package/clis/yuanbao/detail.js +0 -65
  883. package/clis/yuanbao/history.js +0 -51
  884. package/clis/yuanbao/new.js +0 -72
  885. package/clis/yuanbao/new.test.js +0 -30
  886. package/clis/yuanbao/read.js +0 -38
  887. package/clis/yuanbao/send.js +0 -57
  888. package/clis/yuanbao/shared.js +0 -341
  889. package/clis/yuanbao/shared.test.js +0 -80
  890. package/clis/yuanbao/status.js +0 -44
  891. package/clis/zhihu/answer-comments.js +0 -280
  892. package/clis/zhihu/answer-comments.test.js +0 -287
  893. package/clis/zhihu/answer-detail.js +0 -216
  894. package/clis/zhihu/answer-detail.test.js +0 -338
  895. package/clis/zhihu/answer.js +0 -54
  896. package/clis/zhihu/answer.test.js +0 -54
  897. package/clis/zhihu/auth.js +0 -59
  898. package/clis/zhihu/collection.js +0 -199
  899. package/clis/zhihu/collection.test.js +0 -337
  900. package/clis/zhihu/collections.js +0 -128
  901. package/clis/zhihu/collections.test.js +0 -182
  902. package/clis/zhihu/comment.js +0 -55
  903. package/clis/zhihu/comment.test.js +0 -50
  904. package/clis/zhihu/download.js +0 -80
  905. package/clis/zhihu/download.test.js +0 -12
  906. package/clis/zhihu/favorite.js +0 -87
  907. package/clis/zhihu/favorite.test.js +0 -59
  908. package/clis/zhihu/follow.js +0 -50
  909. package/clis/zhihu/follow.test.js +0 -42
  910. package/clis/zhihu/followers.js +0 -40
  911. package/clis/zhihu/followers.test.js +0 -42
  912. package/clis/zhihu/following.js +0 -40
  913. package/clis/zhihu/following.test.js +0 -44
  914. package/clis/zhihu/hot.js +0 -44
  915. package/clis/zhihu/like.js +0 -47
  916. package/clis/zhihu/like.test.js +0 -41
  917. package/clis/zhihu/paginate.js +0 -128
  918. package/clis/zhihu/pins.js +0 -41
  919. package/clis/zhihu/pins.test.js +0 -44
  920. package/clis/zhihu/question.js +0 -113
  921. package/clis/zhihu/question.test.js +0 -251
  922. package/clis/zhihu/recommend.js +0 -103
  923. package/clis/zhihu/recommend.test.js +0 -143
  924. package/clis/zhihu/search.js +0 -206
  925. package/clis/zhihu/search.test.js +0 -198
  926. package/clis/zhihu/target.js +0 -91
  927. package/clis/zhihu/target.test.js +0 -77
  928. package/clis/zhihu/text.js +0 -29
  929. package/clis/zhihu/text.test.js +0 -24
  930. package/clis/zhihu/user-answers.js +0 -41
  931. package/clis/zhihu/user-answers.test.js +0 -69
  932. package/clis/zhihu/user-arg.js +0 -34
  933. package/clis/zhihu/user-articles.js +0 -40
  934. package/clis/zhihu/user-articles.test.js +0 -44
  935. package/clis/zhihu/user.js +0 -59
  936. package/clis/zhihu/user.test.js +0 -73
  937. package/clis/zhihu/write-shared.js +0 -228
  938. package/clis/zhihu/write-shared.test.js +0 -176
  939. package/clis/zsxq/auth.js +0 -68
  940. package/clis/zsxq/dynamics.js +0 -48
  941. package/clis/zsxq/groups.js +0 -33
  942. package/clis/zsxq/search.js +0 -44
  943. package/clis/zsxq/search.test.js +0 -24
  944. package/clis/zsxq/topic.js +0 -50
  945. package/clis/zsxq/topic.test.js +0 -30
  946. package/clis/zsxq/topics.js +0 -26
  947. package/clis/zsxq/topics.test.js +0 -24
  948. package/clis/zsxq/utils.js +0 -233
  949. package/clis/zsxq/utils.test.js +0 -31
  950. package/dist/src/weixin-download.test.js +0 -45
  951. package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
  952. package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
  953. package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
  954. package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
  955. /package/{clis/douyin/_shared/types.js → dist/src/browser/profile.test.d.ts} +0 -0
  956. /package/dist/src/{weixin-download.test.d.ts → generate-release-notes-cli.test.d.ts} +0 -0
@@ -1,28 +1,36 @@
1
1
  import { cli, Strategy } from '@agentrhq/webcmd/registry';
2
2
  import { CommandExecutionError } from '@agentrhq/webcmd/errors';
3
- import { parseTweetUrl, buildTwitterArticleScopeSource } from './shared.js';
3
+ import { parseTweetUrl, buildTwitterArticleScopeSource, unwrapBrowserResult } from './shared.js';
4
4
 
5
5
  function buildDeleteScript(tweetId) {
6
6
  return `(async () => {
7
7
  try {
8
8
  const visible = (el) => !!el && (el.offsetParent !== null || el.getClientRects().length > 0);
9
9
  ${buildTwitterArticleScopeSource(tweetId)}
10
- const targetArticle = findTargetArticle();
10
+ let targetArticle = findTargetArticle();
11
+ for (let i = 0; i < 20 && !targetArticle; i++) {
12
+ await new Promise(r => setTimeout(r, 250));
13
+ targetArticle = findTargetArticle();
14
+ }
11
15
 
12
16
  if (!targetArticle) {
13
17
  return { ok: false, message: 'Could not find the tweet card matching the requested URL.' };
14
18
  }
15
19
 
16
- const buttons = Array.from(targetArticle.querySelectorAll('button,[role="button"]'));
17
- const moreMenu = buttons.find((el) => visible(el) && (el.getAttribute('aria-label') || '').trim() === 'More');
20
+ const belongsToTargetArticle = (el) => el.closest('article') === targetArticle;
21
+ const buttons = Array.from(targetArticle.querySelectorAll('button,[role="button"]')).filter(belongsToTargetArticle);
22
+ const moreMenu = Array.from(targetArticle.querySelectorAll('[data-testid="caret"]')).filter(belongsToTargetArticle).find(visible)
23
+ || buttons.find((el) => visible(el) && /^More/.test((el.getAttribute('aria-label') || '').trim()));
18
24
  if (!moreMenu) {
19
25
  return { ok: false, message: 'Could not find the "More" context menu on the matched tweet. Are you sure you are logged in and looking at a valid tweet?' };
20
26
  }
21
27
 
28
+ const beforeMenuItems = new Set(document.querySelectorAll('[role="menuitem"]'));
22
29
  moreMenu.click();
23
30
  await new Promise(r => setTimeout(r, 1000));
24
31
 
25
- const items = Array.from(document.querySelectorAll('[role="menuitem"]'));
32
+ const items = Array.from(document.querySelectorAll('[role="menuitem"]'))
33
+ .filter((item) => visible(item) && !beforeMenuItems.has(item));
26
34
  const deleteBtn = items.find((item) => {
27
35
  const text = (item.textContent || '').trim();
28
36
  return text.includes('Delete') && !text.includes('List');
@@ -69,7 +77,7 @@ cli({
69
77
  const target = parseTweetUrl(kwargs.url);
70
78
  await page.goto(target.url);
71
79
  await page.wait({ selector: '[data-testid="primaryColumn"]' }); // Wait for tweet to load completely
72
- const result = await page.evaluate(buildDeleteScript(target.id));
80
+ const result = unwrapBrowserResult(await page.evaluate(buildDeleteScript(target.id)));
73
81
  if (result.ok) {
74
82
  // Wait for the deletion request to be processed
75
83
  await page.wait(2);
@@ -1,7 +1,8 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
+ import { JSDOM } from 'jsdom';
2
3
  import { ArgumentError, CommandExecutionError } from '@agentrhq/webcmd/errors';
3
4
  import { getRegistry } from '@agentrhq/webcmd/registry';
4
- import './delete.js';
5
+ import { __test__ } from './delete.js';
5
6
  describe('twitter delete command', () => {
6
7
  it('targets the matched tweet article instead of the first More button on the page', async () => {
7
8
  const cmd = getRegistry().get('twitter/delete');
@@ -27,6 +28,12 @@ describe('twitter delete command', () => {
27
28
  expect(script).toContain('__twGetStatusIdFromHref');
28
29
  expect(script).toContain("document.querySelectorAll('article')");
29
30
  expect(script).toContain("targetArticle.querySelectorAll('button,[role=\"button\"]')");
31
+ expect(script).toContain("closest('article') === targetArticle");
32
+ expect(script).toContain(".filter(belongsToTargetArticle)");
33
+ expect(script).toContain('[data-testid="caret"]');
34
+ expect(script).toContain('/^More/');
35
+ expect(script).toContain('i < 20');
36
+ expect(script).toContain('beforeMenuItems');
30
37
  // Substring match must NOT appear — exact-id match only.
31
38
  expect(script).not.toContain("'/status/' + tweetId");
32
39
  expect(result).toEqual([
@@ -58,6 +65,72 @@ describe('twitter delete command', () => {
58
65
  ]);
59
66
  expect(page.wait).toHaveBeenCalledTimes(1);
60
67
  });
68
+ it('unwraps browser runtime evaluate envelopes before checking delete success', async () => {
69
+ const cmd = getRegistry().get('twitter/delete');
70
+ expect(cmd?.func).toBeTypeOf('function');
71
+ const page = {
72
+ goto: vi.fn().mockResolvedValue(undefined),
73
+ wait: vi.fn().mockResolvedValue(undefined),
74
+ evaluate: vi.fn().mockResolvedValue({
75
+ session: 'twitter',
76
+ data: { ok: true, message: 'Tweet successfully deleted.' },
77
+ }),
78
+ };
79
+ const result = await cmd.func(page, {
80
+ url: 'https://x.com/alice/status/2040254679301718161',
81
+ });
82
+ expect(result).toEqual([
83
+ {
84
+ status: 'success',
85
+ message: 'Tweet successfully deleted.',
86
+ },
87
+ ]);
88
+ expect(page.wait).toHaveBeenNthCalledWith(2, 2);
89
+ });
90
+ it('ignores stale non-target delete menu items that existed before opening the matched tweet menu', async () => {
91
+ const dom = new JSDOM(`
92
+ <body>
93
+ <div role="menuitem" data-stale-delete>Delete</div>
94
+ <article>
95
+ <a href="https://x.com/bob/status/999">wrong tweet</a>
96
+ <button data-testid="caret" aria-label="More"></button>
97
+ </article>
98
+ <article>
99
+ <a href="https://x.com/alice/status/2040254679301718161">target tweet</a>
100
+ <button data-testid="caret" aria-label="More" data-target-caret></button>
101
+ </article>
102
+ </body>
103
+ `, { runScripts: 'outside-only', url: 'https://x.com/alice/status/2040254679301718161' });
104
+ dom.window.setTimeout = (handler) => {
105
+ if (typeof handler === 'function') handler();
106
+ return 0;
107
+ };
108
+ Object.defineProperty(dom.window.HTMLElement.prototype, 'getClientRects', {
109
+ configurable: true,
110
+ value() {
111
+ return [{ bottom: 1, height: 1, left: 0, right: 1, top: 0, width: 1 }];
112
+ },
113
+ });
114
+ let staleDeleteClicked = false;
115
+ let targetCaretClicked = false;
116
+ dom.window.document.querySelector('[data-stale-delete]')?.addEventListener('click', () => {
117
+ staleDeleteClicked = true;
118
+ });
119
+ dom.window.document.querySelector('[data-target-caret]')?.addEventListener('click', () => {
120
+ targetCaretClicked = true;
121
+ const item = dom.window.document.createElement('div');
122
+ item.setAttribute('role', 'menuitem');
123
+ item.textContent = 'Pin to your profile';
124
+ dom.window.document.body.appendChild(item);
125
+ });
126
+ const result = await dom.window.eval(__test__.buildDeleteScript('2040254679301718161'));
127
+ expect(targetCaretClicked).toBe(true);
128
+ expect(staleDeleteClicked).toBe(false);
129
+ expect(result).toEqual({
130
+ ok: false,
131
+ message: 'The matched tweet menu did not contain Delete. This tweet may not belong to you.',
132
+ });
133
+ });
61
134
  it('rejects malformed or off-domain URLs with ArgumentError before navigation', async () => {
62
135
  const cmd = getRegistry().get('twitter/delete');
63
136
  expect(cmd?.func).toBeTypeOf('function');
@@ -17,7 +17,7 @@ import { normalizeTwitterScreenName, unwrapBrowserResult } from './shared.js';
17
17
  * Strategy: subtract the i18n-variable button / badge texts from the lines of
18
18
  * `cell.innerText`, treat the first remaining `@…` line as the handle, the
19
19
  * first non-handle line as display name, and the rest as bio. We avoid
20
- * locale-coupled string matching (`"Follow"` / `"关注"` / `"Folgen"`).
20
+ * locale-coupled string matching (`"Follow"` / `"Follow"` / `"Folgen"`).
21
21
  *
22
22
  * Note: Twitter does NOT render follower COUNTS in the list view, so the
23
23
  * `followers` column is omitted from the output schema. Use
@@ -158,7 +158,7 @@ export async function listRemoveUser(page, kwargs) {
158
158
  caret.click();
159
159
  await sleep(600);
160
160
  const menuItems = Array.from(document.querySelectorAll('[role="menuitem"]'));
161
- const addToListItem = menuItems.find(el => /add\\/remove|从列表|列表|add to list|add or remove/i.test(el.innerText));
161
+ const addToListItem = menuItems.find(el => /add\\/remove|localized text|localized text|add to list|add or remove/i.test(el.innerText));
162
162
  if (!addToListItem) return { ok: false, message: 'Could not find "Add/remove from Lists" menu item' };
163
163
  addToListItem.click();
164
164
  await sleep(1200);
@@ -221,7 +221,7 @@ export async function listRemoveUser(page, kwargs) {
221
221
  const rowRect = listCell.getBoundingClientRect();
222
222
  const saveButton = Array.from(dialog.querySelectorAll('[role="button"], button')).find(b => {
223
223
  const txt = (b.innerText || '').trim();
224
- return /^(Save|Done|保存|完成|儲存)$/i.test(txt);
224
+ return /^(Save|Done|localized text|localized text|localized text)$/i.test(txt);
225
225
  });
226
226
  const saveRect = saveButton ? saveButton.getBoundingClientRect() : null;
227
227
  return {
@@ -45,7 +45,7 @@ describe('twitter list-tweets parser', () => {
45
45
  const tweet = extractTimelineTweet({
46
46
  rest_id: '500',
47
47
  legacy: {
48
- full_text: '总的来说,还是有个好爹',
48
+ full_text: 'Overall,family background still matters',
49
49
  is_quote_status: true,
50
50
  quoted_status_id_str: '499',
51
51
  },
@@ -54,7 +54,7 @@ describe('twitter list-tweets parser', () => {
54
54
  result: {
55
55
  rest_id: '499',
56
56
  legacy: {
57
- full_text: '罗某官二代背景考',
57
+ full_text: 'official family background review',
58
58
  created_at: 'Wed May 13 22:00:00 +0000 2026',
59
59
  extended_entities: {
60
60
  media: [{ type: 'photo', media_url_https: 'https://pbs.twimg.com/media/x.jpg' }],
@@ -68,7 +68,7 @@ describe('twitter list-tweets parser', () => {
68
68
  id: '499',
69
69
  author: 'alice',
70
70
  name: 'Alice',
71
- text: '罗某官二代背景考',
71
+ text: 'official family background review',
72
72
  created_at: 'Wed May 13 22:00:00 +0000 2026',
73
73
  url: 'https://x.com/alice/status/499',
74
74
  has_media: true,
@@ -63,12 +63,12 @@ export function extractListEntry(entry, seen) {
63
63
  };
64
64
  }
65
65
 
66
- // X ListsManagementPageTimeline /<user>/lists 整个页面的所有 section
67
- // 都塞在同一个 TimelineAddEntries instruction 里,靠 entry.entryId 前缀区分:
68
- // - `owned-subscribed-list-module-*` → 用户的 owned + subscribed list(要保留)
69
- // - `list-to-follow-module-*` → "Discover new Lists" 算法推荐(要剔除)
70
- // - `cursor-*` → 分页游标(无 list 数据)
71
- // 旧版 parser 忽略 entryId 一律下钻,导致推荐 list 被当成自建/订阅泄漏出来。
66
+ // X localized text ListsManagementPageTimeline put /<user>/lists all page section
67
+ // into one TimelineAddEntries instruction localized text,by entry.entryId prefix distinction:
68
+ // - `owned-subscribed-list-module-*` → user owned + subscribed list(should keep)
69
+ // - `list-to-follow-module-*` → "Discover new Lists" algorithmic recommendations(should remove)
70
+ // - `cursor-*` → pagination cursor(none list data)
71
+ // legacy parser ignore entryId always drill down,caused recommendations list treated as user-created/subscriptions leaked.
72
72
  const OWNED_SUBSCRIBED_ENTRY_PREFIX = 'owned-subscribed-list-module-';
73
73
 
74
74
  export function isOwnedSubscribedEntry(entry) {
@@ -109,8 +109,8 @@ describe('twitter lists parser', () => {
109
109
  });
110
110
 
111
111
  it('skips "Discover new Lists" recommendations (list-to-follow-module-*)', () => {
112
- // 真实 X.com /<user>/lists 响应:Discover 推荐 + Your Lists instruction
113
- // 区别只在 entry.entryId 前缀。Parser 必须按前缀剔除推荐。
112
+ // real X.com /<user>/lists response:Discover recommendation + Your Lists same instruction,
113
+ // differs only by entry.entryId prefix.Parser must filter recommendations by prefix.
114
114
  const payload = {
115
115
  data: {
116
116
  viewer: {
@@ -9,7 +9,7 @@ cli({
9
9
  strategy: Strategy.UI,
10
10
  browser: true,
11
11
  args: [
12
- { name: 'text', type: 'string', required: true, positional: true, help: 'Message text to send (e.g. "我的微信 wxkabi")' },
12
+ { name: 'text', type: 'string', required: true, positional: true, help: 'Message text to send (e.g. "my messaging handle wxkabi")' },
13
13
  { name: 'max', type: 'int', required: false, default: 20, help: 'Maximum number of conversations to reply to (default: 20)' },
14
14
  { name: 'skip-replied', type: 'boolean', required: false, default: true, help: 'Skip conversations where you already sent the same text (default: true)' },
15
15
  { name: 'timeout', type: 'int', required: false, default: 600, help: 'Max seconds for the overall command (default: 600 — batch op)' },
@@ -275,8 +275,7 @@ describe('twitter parseTweetUrl', () => {
275
275
  describe('twitter buildTwitterArticleScopeSource', () => {
276
276
  // JSDOM-based tests prove the returned source actually works on real DOM —
277
277
  // mocked `evaluate` tests in adapter specs only verify the script string
278
- // contains expected tokens, but cannot catch silent matching bugs (cf.
279
- // dianping #1312: mocked-evaluate single tests miss in-browser logic bugs).
278
+ // contains expected tokens, but cannot catch silent in-browser matching bugs.
280
279
  function loadHelpers(tweetId, dom) {
281
280
  const source = buildTwitterArticleScopeSource(tweetId);
282
281
  const probe = new Function(
@@ -742,7 +741,7 @@ describe('twitter extractQuotedTweet', () => {
742
741
  result: {
743
742
  rest_id: '2040254679301718161',
744
743
  legacy: {
745
- full_text: '罗某官二代背景考',
744
+ full_text: 'official family background review',
746
745
  created_at: 'Wed May 13 22:00:00 +0000 2026',
747
746
  },
748
747
  core: {
@@ -757,7 +756,7 @@ describe('twitter extractQuotedTweet', () => {
757
756
  id: '2040254679301718161',
758
757
  author: 'alice',
759
758
  name: 'Alice',
760
- text: '罗某官二代背景考',
759
+ text: 'official family background review',
761
760
  created_at: 'Wed May 13 22:00:00 +0000 2026',
762
761
  url: 'https://x.com/alice/status/2040254679301718161',
763
762
  has_media: false,
@@ -773,7 +772,7 @@ describe('twitter extractQuotedTweet', () => {
773
772
  result: {
774
773
  rest_id: '99',
775
774
  legacy: {
776
- full_text: '日本电车实录',
775
+ full_text: 'Japanese train record',
777
776
  extended_entities: {
778
777
  media: [
779
778
  { type: 'photo', media_url_https: 'https://pbs.twimg.com/media/a.jpg' },
@@ -85,6 +85,8 @@ function extractTweet(result, seen) {
85
85
  likes: l.favorite_count || 0,
86
86
  retweets: l.retweet_count || 0,
87
87
  replies: l.reply_count || 0,
88
+ quotes: l.quote_count || 0,
89
+ bookmarks: l.bookmark_count || 0,
88
90
  views,
89
91
  created_at: l.created_at || '',
90
92
  url: `https://x.com/${screenName}/status/${tw.rest_id}`,
@@ -156,7 +158,7 @@ cli({
156
158
  { name: 'limit', type: 'int', default: 20, help: 'Maximum number of tweets to return (default 20).' },
157
159
  { name: 'top-by-engagement', type: 'int', default: 0, help: 'When set to N>0, re-rank the timeline by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps X\'s native ordering.' },
158
160
  ],
159
- columns: ['id', 'author', 'bio', 'text', 'likes', 'retweets', 'replies', 'views', 'created_at', 'url', 'has_media', 'media_urls', 'media_posters', 'card', 'quoted_tweet'],
161
+ columns: ['id', 'author', 'bio', 'text', 'likes', 'retweets', 'replies', 'quotes', 'bookmarks', 'views', 'created_at', 'url', 'has_media', 'media_urls', 'media_posters', 'card', 'quoted_tweet'],
160
162
  func: async (page, kwargs) => {
161
163
  const limit = kwargs.limit || 20;
162
164
  const timelineType = kwargs.type === 'following' ? 'following' : 'for-you';
@@ -50,6 +50,8 @@ describe('twitter timeline helpers', () => {
50
50
  favorite_count: 3,
51
51
  retweet_count: 2,
52
52
  reply_count: 1,
53
+ quote_count: 4,
54
+ bookmark_count: 5,
53
55
  created_at: 'now',
54
56
  },
55
57
  core: {
@@ -96,6 +98,8 @@ describe('twitter timeline helpers', () => {
96
98
  likes: 3,
97
99
  retweets: 2,
98
100
  replies: 1,
101
+ quotes: 4,
102
+ bookmarks: 5,
99
103
  views: 9,
100
104
  created_at: 'now',
101
105
  url: 'https://x.com/alice/status/1',
@@ -4,7 +4,7 @@ import { AuthRequiredError, EmptyResultError } from '@agentrhq/webcmd/errors';
4
4
  //
5
5
  // X (Twitter) removed the post-count caption from each trend cell on the
6
6
  // /explore/tabs/trending page in 2024-2025. The DOM now only carries:
7
- // divs[0] = rank + category (e.g. "1 · Trending in United States")
7
+ // divs[0] = rank + category (e.g. "1 \u00b7 Trending in United States")
8
8
  // divs[1] = topic
9
9
  // divs[2..] = caret menu button (no post-count text)
10
10
  // We previously surfaced a `tweets` column whose value was permanently
@@ -216,7 +216,7 @@ export async function waitForComposerMediaReady(page, expectedCount = 1) {
216
216
  ).length;
217
217
  const blobCount = document.querySelectorAll('img[src^="blob:"], video[src^="blob:"]').length;
218
218
  const removeButtonCount = Array.from(document.querySelectorAll('button,[role="button"]')).filter((el) =>
219
- /remove media|remove image|remove|编辑/i.test((el.getAttribute('aria-label') || '') + ' ' + (el.textContent || ''))
219
+ /remove media|remove image|remove|localized text/i.test((el.getAttribute('aria-label') || '') + ' ' + (el.textContent || ''))
220
220
  ).length;
221
221
  const explicitPreviewCount = Math.max(
222
222
  previewCount,
package/clis/web/read.js CHANGED
@@ -223,7 +223,7 @@ function buildRenderAwareExtractorJs(options) {
223
223
  const section = document.createElement('section');
224
224
  section.setAttribute('data-webcmd-iframe-source', desc.src);
225
225
  const heading = document.createElement('h2');
226
- heading.textContent = '来自 iframe: ' + (desc.src || fallbackLabel);
226
+ heading.textContent = 'localized text iframe: ' + (desc.src || fallbackLabel);
227
227
  section.appendChild(heading);
228
228
  Array.from(frameBody.childNodes).forEach(node => section.appendChild(node));
229
229
  return section;
@@ -236,7 +236,7 @@ describe('web/read render-aware helpers', () => {
236
236
 
237
237
  expect(result.diagnostics.includedFrameCount).toBe(1);
238
238
  expect(result.contentHtml).toContain('data-webcmd-iframe-source="https://example.com/frame.html"');
239
- expect(result.contentHtml).toContain('来自 iframe: https://example.com/frame.html');
239
+ expect(result.contentHtml).toContain('localized text iframe: https://example.com/frame.html');
240
240
  expect(result.contentHtml).toContain('Station A 42');
241
241
  expect(result.diagnostics.emptyContainers).toEqual(expect.arrayContaining([
242
242
  expect.objectContaining({ scope: 'iframe', id: 'gridDatas', url: 'https://example.com/frame.html' }),
@@ -277,7 +277,7 @@ describe('web/read render-aware helpers', () => {
277
277
  `, { url: 'https://example.com/main.html', runScripts: 'outside-only' });
278
278
  const frame = dom.window.document.querySelector('iframe');
279
279
  frame.contentDocument.open();
280
- frame.contentDocument.write('<body><table id="gridHd"><tr><th>水位</th></tr><tr><td>42</td></tr></table><ul id="gridDatas"></ul></body>');
280
+ frame.contentDocument.write('<body><table id="gridHd"><tr><th>water level</th></tr><tr><td>42</td></tr></table><ul id="gridDatas"></ul></body>');
281
281
  frame.contentDocument.close();
282
282
 
283
283
  const result = dom.window.eval(__test__.buildRenderAwareExtractorJs({ frames: 'same-origin' }));
@@ -7,7 +7,7 @@ cli({
7
7
  site: 'yahoo-finance',
8
8
  name: 'quote',
9
9
  access: 'read',
10
- description: 'Yahoo Finance 股票行情',
10
+ description: 'Yahoo Finance stock quote',
11
11
  domain: 'finance.yahoo.com',
12
12
  strategy: Strategy.COOKIE,
13
13
  args: [
@@ -55,7 +55,7 @@ cli({
55
55
  || text(link);
56
56
  const channel =
57
57
  text(renderer.querySelector('#channel-name a'))
58
- || text(renderer.querySelector('[aria-label^="前往频道:"]'))
58
+ || text(renderer.querySelector('[aria-label^="Go to channel:"]'))
59
59
  || text(renderer.querySelector('[aria-label^="Go to channel:"]'))
60
60
  || text(renderer.querySelector('ytd-channel-name'))
61
61
  || text(renderer.querySelector('#metadata #byline-container'))
@@ -68,8 +68,8 @@ cli({
68
68
  .filter(Boolean);
69
69
  const combinedMetadata = (metadata.length ? metadata : lockupMetadata)
70
70
  .filter(value => value && value !== title && value !== '•');
71
- const inferredChannel = channel || combinedMetadata.find(value => !/观看|views|前|前に|ago|次观看|次查看|stream/i.test(value)) || '';
72
- const inferredViews = combinedMetadata.find(value => /观看|views/i.test(value)) || '';
71
+ const inferredChannel = channel || combinedMetadata.find(value => !/views|views|ago|agoに|ago|views|views|stream/i.test(value)) || '';
72
+ const inferredViews = combinedMetadata.find(value => /views|views/i.test(value)) || '';
73
73
  const inferredPublished = combinedMetadata.find(value => value !== inferredChannel && value !== inferredViews) || '';
74
74
  const duration =
75
75
  text(renderer.querySelector('ytd-thumbnail-overlay-time-status-renderer'))
@@ -96,7 +96,7 @@ cli({
96
96
  push({
97
97
  title,
98
98
  channel: 'Shorts',
99
- views: stats.find(value => /观看|views/i.test(value)) || '',
99
+ views: stats.find(value => /views|views/i.test(value)) || '',
100
100
  duration: 'SHORT',
101
101
  published: '',
102
102
  url: href.startsWith('http') ? href : 'https://www.youtube.com' + href,
@@ -7,7 +7,7 @@
7
7
  * - Speaker turns: detect ">>" markers from YouTube auto-captions
8
8
  * - Chapters: optional chapter headings inserted at appropriate timestamps
9
9
  */
10
- // Include CJK sentence-ending punctuation: 。!? (fullwidth: .!?)
10
+ // Include CJK sentence-ending punctuation: .!? (fullwidth: .!?)
11
11
  const SENTENCE_END = /[.!?\u3002\uFF01\uFF1F\uFF0E]["'\u2019\u201D)]*\s*$/;
12
12
  const QUESTION_END = /[?\uFF1F]["'\u2019\u201D)]*\s*$/;
13
13
  const TRANSCRIPT_GROUP_GAP_SECONDS = 20;
@@ -52,14 +52,14 @@ describe('groupTranscriptSegments', () => {
52
52
  });
53
53
  it('recognizes CJK sentence-ending punctuation', () => {
54
54
  const segments = [
55
- { start: 0, text: '你好世界。' },
56
- { start: 2, text: '这是测试' },
57
- { start: 4, text: '内容。' },
55
+ { start: 0, text: 'Hello world.' },
56
+ { start: 2, text: 'This is a test' },
57
+ { start: 4, text: 'content.' },
58
58
  ];
59
59
  const result = groupTranscriptSegments(segments);
60
60
  expect(result).toHaveLength(2);
61
- expect(result[0].text).toBe('你好世界。');
62
- expect(result[1].text).toBe('这是测试 内容。');
61
+ expect(result[0].text).toBe('Hello world.');
62
+ expect(result[1].text).toBe('This is a test content.');
63
63
  });
64
64
  it('returns empty array for empty input', () => {
65
65
  expect(groupTranscriptSegments([])).toEqual([]);
@@ -444,11 +444,11 @@ cli({
444
444
  }
445
445
  if (captionData?.error) {
446
446
  const msg = `${captionData.error}${captionData.available ? ' (available: ' + captionData.available.join(', ') + ')' : ''}`;
447
- // "No captions available" 是合法 empty 数据条件(作者没开字幕 + YT 没自动生成),
448
- // bilibili subtitle EmptyResultError 同模式。下游应按 code EMPTY_RESULT 跳过
449
- // 重试和 softFail 计数。其它 errorHTTP / parse / 短暂空响应)仍按 fetch 失败抛。
447
+ // "No captions available" is a valid empty data condition(creator disabled captions + YT no auto captions),
448
+ // Localized "no captions" text follows the same empty-result pattern; downstream should treat code EMPTY_RESULT as skip.
449
+ // retry and softFail count.other error(HTTP / parse / temporary empty response)still treat as fetch failure.
450
450
  if (captionData.error === 'No captions available for this video') {
451
- throw new EmptyResultError('youtube transcript', '该视频没有字幕(作者未开启 + 无自动字幕)。');
451
+ throw new EmptyResultError('youtube transcript', 'This video has no captions(creator disabled captions + no automatic captions).');
452
452
  }
453
453
  throw new CommandExecutionError(msg);
454
454
  }
@@ -640,7 +640,7 @@ cli({
640
640
  }
641
641
  // Step 4: Format output based on mode
642
642
  if (mode === 'raw') {
643
- // Precise timestamps in seconds with decimals, matching bilibili/subtitle format
643
+ // Precise timestamps in seconds with decimals, matching the subtitle segment format.
644
644
  return segments.map((seg, i) => ({
645
645
  index: i + 1,
646
646
  start: Number(seg.start).toFixed(2) + 's',
@@ -114,10 +114,10 @@ cli({
114
114
  }
115
115
  } catch {}
116
116
 
117
- // 播放门禁信号:会员专享(channel membership)/ 付费点播等视频 metadata 照常
118
- // 可见,但视频流拿不到——playabilityStatus.status != 'OK'reason 文本是本地化
119
- // 的(中文 cookie 下是中文),所以 membersOnly watch HTML locale 无关的
120
- // BADGE_STYLE_TYPE_MEMBERS_ONLY 徽标枚举判定,下游不要去 parse reason
117
+ // playability gate signal:members-only(channel membership)/ paid video metadata as usual
118
+ // visible,but the video stream is unavailable——playabilityStatus.status != 'OK'.reason text is localized
119
+ // localized text(Chinese cookie is Chinese under this locale),so membersOnly localized text watch HTML localized text locale locale-independent
120
+ // BADGE_STYLE_TYPE_MEMBERS_ONLY badge enum detection,downstream should not parse reason.
121
121
  const ps = player.playabilityStatus || {};
122
122
  const membersOnly = html.indexOf('BADGE_STYLE_TYPE_MEMBERS_ONLY') !== -1;
123
123
 
@@ -21,8 +21,8 @@ const videoSource = readFileSync(resolve(__dirname, 'video.js'), 'utf8');
21
21
 
22
22
  describe('youtube video source contract', () => {
23
23
  it('extracts playability gate signals inside the watch bootstrap evaluate', () => {
24
- // 会员专享视频 metadata 照常可见但流不可播——playabilityStatus 是判断依据;
25
- // reason 文本本地化,membersOnly 必须用 locale 无关的徽标枚举判定。
24
+ // members-only video metadata localized text——playabilityStatus is the decision source;
25
+ // reason localized text,membersOnly must use locale locale-independent badge enum detection.
26
26
  expect(videoSource).toContain('player.playabilityStatus');
27
27
  expect(videoSource).toContain('BADGE_STYLE_TYPE_MEMBERS_ONLY');
28
28
  });
@@ -39,8 +39,8 @@ describe('youtube video row mapping', () => {
39
39
 
40
40
  it('surfaces playabilityStatus / playabilityReason / membersOnly as rows', async () => {
41
41
  page.evaluate.mockResolvedValueOnce({
42
- title: 'Koji杨远骋:高手如何用AI?',
43
- channel: '课代表立正',
42
+ title: 'KojiKoji Yang:How experts useAI?',
43
+ channel: 'Class Notes',
44
44
  videoId: 'jgeqHyFzfIM',
45
45
  playabilityStatus: 'UNPLAYABLE',
46
46
  playabilityReason: "This video is available to this channel's members",
@@ -53,8 +53,8 @@ describe('youtube video row mapping', () => {
53
53
  expect(byField.playabilityStatus).toBe('UNPLAYABLE');
54
54
  expect(byField.membersOnly).toBe('true');
55
55
  expect(byField.playabilityReason).toContain('members');
56
- // metadata 行照常返回(会员视频标题等仍可见)
57
- expect(byField.title).toBe('Koji杨远骋:高手如何用AI?');
56
+ // metadata metadata rows still return(member video metadata remains visible)
57
+ expect(byField.title).toBe('KojiKoji Yang:How experts useAI?');
58
58
  });
59
59
 
60
60
  it('reports OK playability for a normal video', async () => {
@@ -146,24 +146,24 @@ describe('scoreEndpointEvidence', () => {
146
146
  describe('findNearestAdapter', () => {
147
147
  it('matches by domain suffix', () => {
148
148
  const reg = new Map([
149
- ['51job search', mkCmd('51job', 'search', '51job.com')],
150
- ['51job detail', mkCmd('51job', 'detail', '51job.com')],
151
- ['xueqiu search', mkCmd('xueqiu', 'search', 'xueqiu.com')],
149
+ ['github search', mkCmd('github', 'search', 'github.com')],
150
+ ['github auth', mkCmd('github', 'auth', 'github.com')],
151
+ ['linkedin search', mkCmd('linkedin', 'search', 'linkedin.com')],
152
152
  ]);
153
- const v = findNearestAdapter('https://jobs.51job.com/', reg);
154
- expect(v?.site).toBe('51job');
155
- expect(v?.example_commands).toContain('51job search');
153
+ const v = findNearestAdapter('https://docs.github.com/', reg);
154
+ expect(v?.site).toBe('github');
155
+ expect(v?.example_commands).toContain('github search');
156
156
  });
157
157
  it('falls back to site-name containment when no domain is registered', () => {
158
158
  const reg = new Map([
159
- ['51job search', mkCmd('51job', 'search')],
159
+ ['github search', mkCmd('github', 'search')],
160
160
  ]);
161
- const v = findNearestAdapter('https://we.51job.com/', reg);
162
- expect(v?.site).toBe('51job');
161
+ const v = findNearestAdapter('https://gist.github.com/', reg);
162
+ expect(v?.site).toBe('github');
163
163
  });
164
164
  it('returns null when no adapter matches', () => {
165
165
  const reg = new Map([
166
- ['xueqiu search', mkCmd('xueqiu', 'search', 'xueqiu.com')],
166
+ ['github search', mkCmd('github', 'search', 'github.com')],
167
167
  ]);
168
168
  const v = findNearestAdapter('https://random-site.io/', reg);
169
169
  expect(v).toBeNull();
@@ -201,9 +201,9 @@ describe('analyzeSite', () => {
201
201
  });
202
202
  it('includes nearest_adapter when the registry has a match', () => {
203
203
  const reg = new Map([
204
- ['51job search', mkCmd('51job', 'search', '51job.com')],
204
+ ['github search', mkCmd('github', 'search', 'github.com')],
205
205
  ]);
206
- const report = analyzeSite(mkSignals({ finalUrl: 'https://we.51job.com/' }), reg);
207
- expect(report.nearest_adapter?.site).toBe('51job');
206
+ const report = analyzeSite(mkSignals({ finalUrl: 'https://github.com/features/actions' }), reg);
207
+ expect(report.nearest_adapter?.site).toBe('github');
208
208
  });
209
209
  });
@@ -9,6 +9,6 @@ export declare function waitForBridgeReady(fetchHealth: HealthFetcher, opts: {
9
9
  contextId?: string;
10
10
  intervalMs?: number;
11
11
  }): Promise<DaemonHealth>;
12
- export declare const PRE_DISPATCH_ERROR_CODES: Set<"extension_not_connected" | "profile_disconnected">;
12
+ export declare const PRE_DISPATCH_ERROR_CODES: Set<"profile_disconnected" | "extension_not_connected">;
13
13
  export type PreDispatchErrorCode = typeof PRE_DISPATCH_ERROR_CODES extends Set<infer T> ? T : never;
14
14
  export declare function isPreDispatchError(errorCode: string | undefined): boolean;
@@ -9,7 +9,7 @@ function status(runtimeConnected) {
9
9
  runtimeName: 'fake',
10
10
  pending: 0,
11
11
  memoryMB: 0,
12
- port: 19825,
12
+ port: 9777,
13
13
  };
14
14
  }
15
15
  function readyHealth() {
@@ -17,6 +17,7 @@ export declare class BrowserBridge implements IBrowserFactory {
17
17
  session?: string;
18
18
  idleTimeout?: number;
19
19
  contextId?: string;
20
+ preferredContextId?: string;
20
21
  windowMode?: 'foreground' | 'background';
21
22
  surface?: 'browser' | 'adapter';
22
23
  siteSession?: 'ephemeral' | 'persistent';