@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
@@ -134,7 +134,7 @@ export function buildListChannelsScript() {
134
134
 
135
135
  function cleanChannelLabel(label) {
136
136
  var cleaned = String(label || '').trim();
137
- var commaIdx = cleaned.search(/[,,]/);
137
+ var commaIdx = cleaned.search(/[,,]/);
138
138
  if (commaIdx !== -1) cleaned = cleaned.slice(commaIdx + 1).trimStart();
139
139
  return cleaned;
140
140
  }
@@ -151,12 +151,12 @@ export function buildListChannelsScript() {
151
151
 
152
152
  function channelName(label, el) {
153
153
  var cleaned = cleanChannelLabel(label);
154
- var m = cleaned.match(/^(.+?)\\s*[(](.+?)[)]\\s*$/);
154
+ var m = cleaned.match(/^(.+?)\\s*[((](.+?)[))]\\s*$/);
155
155
  if (m) return m[1].trim();
156
156
  var ariaName = el.getAttribute('aria-label') || '';
157
- if (ariaName && ariaName !== label) return cleanChannelLabel(ariaName).replace(/\\s*[(].*?[)]\\s*$/, '').trim();
157
+ if (ariaName && ariaName !== label) return cleanChannelLabel(ariaName).replace(/\\s*[((].*?[))]\\s*$/, '').trim();
158
158
  var text = (el.textContent || '').replace(/\\s+/g, ' ').trim();
159
- return text.replace(/\\s*[(].*?[)]\\s*$/, '').trim();
159
+ return text.replace(/\\s*[((].*?[))]\\s*$/, '').trim();
160
160
  }
161
161
 
162
162
  var links = Array.from(document.querySelectorAll('a[href*="/channels/"]'));
@@ -171,7 +171,7 @@ export function buildListChannelsScript() {
171
171
 
172
172
  var label = el.getAttribute('aria-label') || el.getAttribute('title') || '';
173
173
  var cleaned = cleanChannelLabel(label);
174
- if (/[(]\\s*category\\s*[)]/i.test(cleaned)) return;
174
+ if (/[((]\\s*category\\s*[))]/i.test(cleaned)) return;
175
175
 
176
176
  var name = channelName(cleaned, el);
177
177
  if (!name) return;
@@ -355,7 +355,7 @@ export function buildRouteStateScript() {
355
355
  route: parseRoute(window.location.href),
356
356
  has_messages: !!document.querySelector('[id^="chat-messages-"], [class*="messageListItem"]'),
357
357
  has_threads: !!document.querySelector('a[href*="/channels/"][href*="/"]'),
358
- has_header: !!document.querySelector('[class*="title"], [aria-label*="Channel"], [aria-label*="频道"]')
358
+ has_header: !!document.querySelector('[class*="title"], [aria-label*="Channel"], [aria-label*="Channel"]')
359
359
  };
360
360
  })()
361
361
  `;
@@ -1,13 +1,13 @@
1
1
  <!doctype html>
2
2
  <html lang="zh">
3
- <head><meta charset="utf-8"><title>通知 | Facebook</title></head>
3
+ <head><meta charset="utf-8"><title>notifications | Facebook</title></head>
4
4
  <body>
5
5
  <div role="main">
6
- <div class="x1rdy4ex" role="listitem"><div><div><div><div><div><div><span dir="auto"><div><div><h2><span><span>新通知</span></span></h2></div><div><div><div>&nbsp;</div><div><div></div></div></div></div></div></span></div></div></div></div></div></div></div>
7
- <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/photo/?fbid=104250644186433&amp;set=a.104250310853133&amp;notif_id=1777926497886652&amp;notif_t=onthisday&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>未读</div>回顾你在 2019年6月的那段过往.</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="2天前"><span>2天</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="标记为已读,回顾你在 2019年6月的那段过往." role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_1o_" aria-expanded="false" aria-haspopup="dialog" aria-label="管理Jake Win通知设置" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
8
- <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/jake.win.39/posts/pfbid0JYwqY2r7MnMtowrMXbB2xuho8CMjPbS9fJgQYppcrk6JgNcNhDVUMQQX3SMeUwnDl?story_gqlid=UzpfSTEwMDAzODA0NDkzMjEzNToxMDQyNDkzNjQxODY1NjE6MTA0MjQ5MzY0MTg2NTYx&amp;notif_id=1777926497887116&amp;notif_t=onthisday&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>未读</div>看看你在 2019年6月发布的帖子,瞬间回到过去的美好时光.</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="2天前"><span>2天</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="标记为已读,看看你在 2019年6月发布的帖子,瞬间回到过去的美好时光." role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_1s_" aria-expanded="false" aria-haspopup="dialog" aria-label="管理Jake Win通知设置" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
9
- <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/afad/?approval_id=1202094468666719&amp;notif_id=1773680546395691&amp;notif_t=approve_from_another_device&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>未读</div>有人尝试登录,但我们已阻止。</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="7周前"><span>7周</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="标记为已读,有人尝试登录,但我们已阻止。" role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_20_" aria-expanded="false" aria-haspopup="dialog" aria-label="管理Jake Win通知设置" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
10
- <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/groups/discover/?source=recommendation_notif&amp;hoisted_group_id=720850587716560&amp;notif_id=1777892286665396&amp;notif_t=group_recommendation&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>未读</div>你可能会喜欢 <b>ETYCAL VIBEZ fan's page</b> 。</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="2天前"><span>2天</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="标记为已读,你可能会喜欢 ETYCAL VIBEZ fan's page " role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_24_" aria-expanded="false" aria-haspopup="dialog" aria-label="管理Jake Win通知设置" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
6
+ <div class="x1rdy4ex" role="listitem"><div><div><div><div><div><div><span dir="auto"><div><div><h2><span><span>New notifications</span></span></h2></div><div><div><div>&nbsp;</div><div><div></div></div></div></div></div></span></div></div></div></div></div></div></div>
7
+ <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/photo/?fbid=104250644186433&amp;set=a.104250310853133&amp;notif_id=1777926497886652&amp;notif_t=onthisday&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>Unread</div>Review your 2019year6memory from that month.</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="2days ago"><span>2days</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="Mark as read,Review your 2019year6memory from that month." role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_1o_" aria-expanded="false" aria-haspopup="dialog" aria-label="ManageJake Winnotification settings" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
8
+ <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/jake.win.39/posts/pfbid0JYwqY2r7MnMtowrMXbB2xuho8CMjPbS9fJgQYppcrk6JgNcNhDVUMQQX3SMeUwnDl?story_gqlid=UzpfSTEwMDAzODA0NDkzMjEzNToxMDQyNDkzNjQxODY1NjE6MTA0MjQ5MzY0MTg2NTYx&amp;notif_id=1777926497887116&amp;notif_t=onthisday&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>Unread</div>Look back at your 2019year6post from June,memory from the past.</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="2days ago"><span>2days</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="Mark as read,Look back at your 2019year6post from June,memory from the past." role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_1s_" aria-expanded="false" aria-haspopup="dialog" aria-label="ManageJake Winnotification settings" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
9
+ <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/afad/?approval_id=1202094468666719&amp;notif_id=1773680546395691&amp;notif_t=approve_from_another_device&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>Unread</div>Someone tried to log in,but we blocked it.</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="7weeks ago"><span>7weeks</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="Mark as read,Someone tried to log in,but we blocked it." role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_20_" aria-expanded="false" aria-haspopup="dialog" aria-label="ManageJake Winnotification settings" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
10
+ <div class="x1n2onr6" role="listitem"><div data-visualcompletion="ignore-dynamic" role="none"><a href="https://www.facebook.com/groups/discover/?source=recommendation_notif&amp;hoisted_group_id=720850587716560&amp;notif_id=1777892286665396&amp;notif_t=group_recommendation&amp;ref=notif" role="link" tabindex="0"><div><div><div><div data-visualcompletion="ignore"><div><div aria-hidden="true"></div><div role="none" data-visualcompletion="ignore"></div></div></div></div></div><div><div><div><div><div><span dir="auto"><span><div>Unread</div>You might like <b>ETYCAL VIBEZ fan's page</b> .</span></span></div><div><span dir="auto"><span><span><span><abbr aria-label="2days ago"><span>2days</span></abbr></span></span></span></span></div></div></div><div><div></div></div></div><div><div><div><div aria-label="Mark as read,You might like ETYCAL VIBEZ fan's page ." role="button" tabindex="0"><span data-visualcompletion="ignore"></span></div></div></div></div></div></div><div role="none" data-visualcompletion="ignore"></div></a></div><div><div><div><div aria-controls="_r_24_" aria-expanded="false" aria-haspopup="dialog" aria-label="ManageJake Winnotification settings" role="button" tabindex="0"><div role="none" data-visualcompletion="ignore"></div></div></div></div></div></div>
11
11
  </div>
12
12
  </body>
13
13
  </html>
@@ -22,14 +22,14 @@ cli({
22
22
  const buttons = Array.from(document.querySelectorAll('[role="button"]'));
23
23
  const addBtn = buttons.find(b => {
24
24
  const text = b.textContent.trim();
25
- return text === '加好友' || text === 'Add Friend' || text === 'Add friend';
25
+ return text === 'Add friend' || text === 'Add Friend' || text === 'Add friend';
26
26
  });
27
27
 
28
28
  if (!addBtn) {
29
29
  // Check if already friends
30
30
  const isFriend = buttons.some(b => {
31
31
  const t = b.textContent.trim();
32
- return t === '好友' || t === 'Friends' || t.includes('已发送') || t.includes('Pending');
32
+ return t === 'Friends' || t === 'Friends' || t.includes('Pending') || t.includes('Pending');
33
33
  });
34
34
  if (isFriend) return [{ status: 'Already friends or request pending', username }];
35
35
  return [{ status: 'Add Friend button not found', username }];
@@ -39,36 +39,36 @@ function buildFeedExtractScript(limit) {
39
39
  const path = window.location && window.location.pathname ? window.location.pathname : '';
40
40
  const body = textOf(document.body);
41
41
  return /^\\/(login|checkpoint)(\\/|$|\\.php)/.test(path)
42
- || /^(Log in to Facebook|Facebook登录|登录 Facebook)/i.test(body)
42
+ || /^(Log in to Facebook|FacebookLog in|Log in Facebook)/i.test(body)
43
43
  || /You must log in to continue/i.test(body);
44
44
  }
45
45
 
46
46
  function isExplicitEmptyFeed() {
47
47
  const body = textOf(document.body);
48
- return /No posts available|Nothing to show|暂无动态|没有更多动态|还没有帖子/i.test(body);
48
+ return /No posts available|Nothing to show|No posts available|No more posts|No posts yet/i.test(body);
49
49
  }
50
50
 
51
51
  function isSuggestionOrChrome(text) {
52
- return /^(People you may know|People You May Know|可能认识的人?|你可能认识的人?)/i.test(text)
53
- || /^(Suggested for you|Suggested Groups|推荐小组|推荐内容)/i.test(text);
52
+ return /^(People you may know|People You May Know|People you may know?|People you may know?)/i.test(text)
53
+ || /^(Suggested for you|Suggested Groups|Suggested groups|Suggested content)/i.test(text);
54
54
  }
55
55
 
56
56
  function isSponsored(text) {
57
- return /(^|\\s)(Sponsored|赞助|广告)(\\s|$)/i.test(text);
57
+ return /(^|\\s)(Sponsored|Sponsored|Advertisement)(\\s|$)/i.test(text);
58
58
  }
59
59
 
60
60
  function isActionText(text) {
61
- return /^(Like|Comment|Share|Send|Follow|赞|评论|分享|发送|关注)$/i.test(text);
61
+ return /^(Like|Comment|Share|Send|Follow|Like|Comment|Share|Send|Follow)$/i.test(text);
62
62
  }
63
63
 
64
64
  function isMetricText(text) {
65
- return /^(All:|所有心情:)/i.test(text)
65
+ return /^(All:|All reactions:)/i.test(text)
66
66
  || /\\b(likes?|reactions?|comments?|shares?)\\b/i.test(text)
67
- || /(条评论|次分享)$/.test(text);
67
+ || /(comments|shares)$/.test(text);
68
68
  }
69
69
 
70
70
  function isTimestampText(text) {
71
- return /^(\\d+\\s*(s|m|h|d|w|mo|yr|min|sec|second|minute|hour|day|week|month|year)s?|Just now|Yesterday|刚刚|昨天|\\d+小时|\\d+天)(\\s*[·•.])?$/i.test(text);
71
+ return /^(\\d+\\s*(s|m|h|d|w|mo|yr|min|sec|second|minute|hour|day|week|month|year)s?|Just now|Yesterday|just now|yesterday|\\d+hours|\\d+days)(\\s*[\u00b7•.])?$/i.test(text);
72
72
  }
73
73
 
74
74
  function postUrlFrom(root) {
@@ -86,9 +86,9 @@ function buildFeedExtractScript(limit) {
86
86
  const kinds = new Set();
87
87
  for (const el of root.querySelectorAll('[aria-label]')) {
88
88
  const label = labelOf(el);
89
- if (/^(Like|赞)$/i.test(label)) kinds.add('like');
90
- if (/^(Comment|评论)$/i.test(label)) kinds.add('comment');
91
- if (/^(Share|分享)$/i.test(label)) kinds.add('share');
89
+ if (/^(Like|Like)$/i.test(label)) kinds.add('like');
90
+ if (/^(Comment|Comment)$/i.test(label)) kinds.add('comment');
91
+ if (/^(Share|Share)$/i.test(label)) kinds.add('share');
92
92
  }
93
93
  return kinds;
94
94
  }
@@ -129,7 +129,7 @@ function buildFeedExtractScript(limit) {
129
129
  if (text.length <= 10) return false;
130
130
  if (isSuggestionOrChrome(text) || isSponsored(text)) return false;
131
131
  if (isActionText(text) || isMetricText(text) || isTimestampText(text)) return false;
132
- if (/^(See more|查看更多|更多)$/i.test(text)) return false;
132
+ if (/^(See more|See more|More)$/i.test(text)) return false;
133
133
  return true;
134
134
  });
135
135
  }
@@ -147,12 +147,12 @@ function buildFeedExtractScript(limit) {
147
147
  if (!author && !content) return null;
148
148
  if (!content && !postUrl && kinds.size < 2) return null;
149
149
 
150
- const likesMatch = fullText.match(/所有心情:\\s*(\\d[\\d,.\\s万亿KMk]*)/)
150
+ const likesMatch = fullText.match(/All reactions:\\s*(\\d[\\d,.\\slocalized textKMk]*)/)
151
151
  || fullText.match(/All:\\s*(\\d[\\d,.KMk]*)/)
152
152
  || fullText.match(/(\\d[\\d,.KMk]*)\\s*(?:likes?|reactions?)/i);
153
- const commentsMatch = fullText.match(/([\\d,.]+\\s*[万亿]?)\\s*条评论/)
153
+ const commentsMatch = fullText.match(/([\\d,.]+\\s*[localized text]?)\\s*comments/)
154
154
  || fullText.match(/(\\d[\\d,.KMk]*)\\s*comments?/i);
155
- const sharesMatch = fullText.match(/([\\d,.]+\\s*[万亿]?)\\s*次分享/)
155
+ const sharesMatch = fullText.match(/([\\d,.]+\\s*[localized text]?)\\s*shares/)
156
156
  || fullText.match(/(\\d[\\d,.KMk]*)\\s*shares?/i);
157
157
 
158
158
  return {
@@ -173,7 +173,7 @@ function buildFeedExtractScript(limit) {
173
173
  function fallbackContainers() {
174
174
  const main = document.querySelector('[role="main"]');
175
175
  if (!main) return [];
176
- const buttons = Array.from(main.querySelectorAll('[aria-label="Like"], [aria-label=""], [aria-label="Comment"], [aria-label="评论"], [aria-label="Share"], [aria-label="分享"]'));
176
+ const buttons = Array.from(main.querySelectorAll('[aria-label="Like"], [aria-label="Like"], [aria-label="Comment"], [aria-label="Comment"], [aria-label="Share"], [aria-label="Share"]'));
177
177
  const seen = new WeakSet();
178
178
  const containers = [];
179
179
  for (const button of buttons) {
@@ -224,7 +224,7 @@ function buildFeedExtractScript(limit) {
224
224
  diagnostics: {
225
225
  articleCount: document.querySelectorAll('[role="article"]').length,
226
226
  primaryCount: primary.length,
227
- fallbackActionCount: document.querySelectorAll('[role="main"] [aria-label="Like"], [role="main"] [aria-label=""], [role="main"] [aria-label="Comment"], [role="main"] [aria-label="评论"]').length,
227
+ fallbackActionCount: document.querySelectorAll('[role="main"] [aria-label="Like"], [role="main"] [aria-label="Like"], [role="main"] [aria-label="Comment"], [role="main"] [aria-label="Comment"]').length,
228
228
  mainTextLength: textOf(document.querySelector('[role="main"]')).length,
229
229
  },
230
230
  };
@@ -19,12 +19,12 @@ cli({
19
19
  .map((el, i) => {
20
20
  const text = el.textContent.trim().replace(/\\s+/g, ' ');
21
21
  // Extract mutual info if present (before name extraction to avoid pollution)
22
- const mutualMatch = text.match(/([\\d,]+)\\s*位.*(?:关注|共同|mutual)/);
22
+ const mutualMatch = text.match(/([\\d,]+)\\s*people.*(?:Follow|mutual|mutual)/);
23
23
  // Extract name: remove mutual info, action buttons, etc.
24
24
  let name = text
25
- .replace(/[\\d,]+\\s*位.*(?:关注了|共同好友|mutual friends?)/, '')
26
- .replace(/加好友.*/, '').replace(/Add [Ff]riend.*/, '')
27
- .replace(/移除$/, '').replace(/Remove$/, '')
25
+ .replace(/[\\d,]+\\s*people.*(?:followed|mutual friends|mutual friends?)/, '')
26
+ .replace(/Add friend.*/, '').replace(/Add [Ff]riend.*/, '')
27
+ .replace(/Remove$/, '').replace(/Remove$/, '')
28
28
  .trim();
29
29
  return {
30
30
  index: i + 1,
@@ -32,11 +32,11 @@ cli({
32
32
  if (seen.has(href)) continue;
33
33
  seen.add(href);
34
34
  const raw = a.textContent.trim().replace(/\\s+/g, ' ');
35
- // Split name from "上次发帖" info
36
- const parts = raw.split(/上次发帖|Last post/);
35
+ // Split name from "Last post" info
36
+ const parts = raw.split(/Last post|Last post/);
37
37
  groups.push({
38
38
  name: (parts[0] || '').trim().substring(0, 60),
39
- last_post: parts[1] ? parts[1].replace(/^[::]/, '').trim() : '-',
39
+ last_post: parts[1] ? parts[1].replace(/^[::]/, '').trim() : '-',
40
40
  url: href,
41
41
  });
42
42
  }
@@ -24,13 +24,13 @@ cli({
24
24
  const buttons = Array.from(document.querySelectorAll('[role="button"]'));
25
25
  const joinBtn = buttons.find(b => {
26
26
  const text = b.textContent.trim();
27
- return text === '加入小组' || text === 'Join group' || text === 'Join Group';
27
+ return text === 'Join group' || text === 'Join group' || text === 'Join Group';
28
28
  });
29
29
 
30
30
  if (!joinBtn) {
31
31
  const isMember = buttons.some(b => {
32
32
  const t = b.textContent.trim();
33
- return t === '已加入' || t === 'Joined' || t === '成员' || t === 'Member';
33
+ return t === 'Joined' || t === 'Joined' || t === 'Member' || t === 'Member';
34
34
  });
35
35
  if (isMember) return [{ status: 'Already a member', group: groupName }];
36
36
  return [{ status: 'Join button not found', group: groupName }];
@@ -28,7 +28,7 @@ cli({
28
28
 
29
29
  const result = await page.evaluate(String.raw`(() => {
30
30
  const clean = (s) => String(s || '').replace(/[\u00a0\u202f]/g, ' ').replace(/\s+/g, ' ').trim();
31
- const timeRe = /^(?:\d{1,2}:\d{2}\s?(?:AM|PM|am|pm|上午|下午)?|Mon|Tue|Wed|Thu|Fri|Sat|Sun|Today|Yesterday|\d+[mhdw]|\d+\s*(?:min|h|d|w))$/;
31
+ const timeRe = /^(?:\d{1,2}:\d{2}\s?(?:AM|PM|am|pm|AM|PM)?|Mon|Tue|Wed|Thu|Fri|Sat|Sun|Today|Yesterday|\d+[mhdw]|\d+\s*(?:min|h|d|w))$/;
32
32
  const text = document.body?.innerText || '';
33
33
  if (/log in|sign in/i.test(text) && !/Marketplace/i.test(text)) {
34
34
  return { authRequired: true, rows: [] };
@@ -41,8 +41,8 @@ cli({
41
41
  for (let i = 0; i < lines.length - 2; i += 1) {
42
42
  const buyer = lines[i];
43
43
  const meta = lines[i + 1];
44
- if (skipBuyer.test(buyer) || !/^·\s+/.test(meta)) continue;
45
- const listing = meta.replace(/^·\s*/, '');
44
+ if (skipBuyer.test(buyer) || !/^\u00b7\s+/.test(meta)) continue;
45
+ const listing = meta.replace(/^\u00b7\s*/, '');
46
46
  if (!listing || /^Within\b/i.test(listing)) continue;
47
47
  const snippet = lines[i + 2] || '';
48
48
  const time = timeRe.test(lines[i + 3] || '') ? lines[i + 3] : '';
@@ -44,7 +44,7 @@ cli({
44
44
  seen.add(title);
45
45
  const windowLines = lines.slice(i, i + 12);
46
46
  const status = windowLines.find((line) => /^(Active|Sold|Pending|Draft)$/i.test(line)) || '';
47
- const listed = windowLines.find((line) => /Listed on\b/i.test(line))?.replace(/^·\s*/, '') || '';
47
+ const listed = windowLines.find((line) => /Listed on\b/i.test(line))?.replace(/^\u00b7\s*/, '') || '';
48
48
  const clickLine = windowLines.find((line) => /clicks? on listing/i.test(line)) || '';
49
49
  const clickMatch = clickLine.match(/([\d,.]+)\s+clicks? on listing/i);
50
50
  const actions = windowLines.filter((line) => /^(Mark as sold|Mark as available|Relist this item|Share|Boost listing)$/i.test(line));
@@ -8,7 +8,7 @@
8
8
  // 2. silent-bad-shape — the old time field used a dash sentinel for
9
9
  // unknown values; typed unknown should be `null` so an agent caller
10
10
  // does not have to learn in-band sentinel strings.
11
- // 3. silent-column-drop — the IIFE saw the `<div>未读</div>` /
11
+ // 3. silent-column-drop — the IIFE saw the `<div>Unread</div>` /
12
12
  // `<div>Unread</div>` badge child and the anchor's `<a href>` URL
13
13
  // but kept neither, so callers got a bare text blob with no way
14
14
  // to follow up on a notification.
@@ -22,8 +22,7 @@
22
22
  // silent clamp; `ArgumentError` on bad input.
23
23
  // - Pure extractor `extractNotificationRowsFromDoc` is a Node-side
24
24
  // export — JSDOM-against-frozen-fixture tests call it directly while
25
- // the live IIFE embeds it via `${fn.toString()}` (mirrors hupu
26
- // #1387 / xiaoe #1388 / dianping #1313 pattern). Helpers
25
+ // the live IIFE embeds it via `${fn.toString()}`. Helpers
27
26
  // `stripMarkAsReadPrefix`, `stripAnchorChrome`, `parseNotifQuery`
28
27
  // are also pure exports for the same reason.
29
28
  // - Seven columns instead of three:
@@ -50,24 +49,24 @@ export const NOTIFICATIONS_LIMIT_MAX = 100;
50
49
 
51
50
  // Locale-specific "Mark as read" button prefixes Facebook attaches to
52
51
  // the per-row mark-as-read action. We use this to recover the bare
53
- // notification body text without the leading "未读" / "Unread" badge or
52
+ // notification body text without the leading "Unread" / "Unread" badge or
54
53
  // the trailing time-ago suffix that the anchor's textContent contains.
55
54
  //
56
55
  // Each entry must be a complete, deterministic prefix — no regex — so a
57
56
  // rare false-positive substring match elsewhere on the page does not
58
57
  // silently truncate body text.
59
58
  export const MARK_AS_READ_PREFIXES = [
60
- '标记为已读,',
59
+ 'Mark as read,',
61
60
  'Mark as read, ',
62
61
  'Mark as Read, ',
63
62
  'Marquer comme lu, ',
64
63
  'Marcar como leído, ',
65
- '既読にする, ',
64
+ 'Readにする, ',
66
65
  ];
67
66
 
68
67
  // Localised "unread" badge labels that appear inside a `<div>` inside
69
68
  // the notification listitem. Used to set the typed `unread` boolean.
70
- export const UNREAD_BADGE_LABELS = ['未读', 'Unread', 'No leído', '未読'];
69
+ export const UNREAD_BADGE_LABELS = ['Unread', 'Unread', 'No leído', 'Unread'];
71
70
 
72
71
  export function normalizeNotificationsLimit(raw) {
73
72
  if (raw === undefined || raw === null || raw === '') {
@@ -102,14 +101,14 @@ export function stripMarkAsReadPrefix(label, prefixes) {
102
101
  return null;
103
102
  }
104
103
 
105
- // Pure: strip the leading "未读" / "Unread" badge prefix and the trailing
106
- // time-ago suffix (e.g. "2天" / "5 hrs") from the rendered text of a
104
+ // Pure: strip the leading "Unread" / "Unread" badge prefix and the trailing
105
+ // time-ago suffix (e.g. "2days" / "5 hrs") from the rendered text of a
107
106
  // notification anchor. Used as a fallback when the mark-as-read
108
107
  // aria-label is not present (already-read rows).
109
108
  //
110
109
  // `badges` is the localized unread-badge labels list; `timeStr` is the
111
110
  // trailing time string previously extracted from `<abbr>` (or `null`).
112
- // Trailing `.` / `。` that Facebook inserts between body and time are
111
+ // Trailing `.` / `.` that Facebook inserts between body and time are
113
112
  // also stripped — but only at the very end, never mid-text.
114
113
  export function stripAnchorChrome(rawText, timeStr, badges) {
115
114
  if (!rawText) return '';
@@ -127,7 +126,7 @@ export function stripAnchorChrome(rawText, timeStr, badges) {
127
126
  text = text.slice(0, text.length - t.length).trim();
128
127
  }
129
128
  }
130
- text = text.replace(/[.。]+$/, '').trim();
129
+ text = text.replace(/[..]+$/, '').trim();
131
130
  return text;
132
131
  }
133
132
 
@@ -156,7 +155,7 @@ export function isFacebookAuthRedirectPath(pathname) {
156
155
 
157
156
  // Pure extractor: walks `[role="listitem"]` containers in `doc` and
158
157
  // returns at most `limit` notification rows. Header listitems (those
159
- // without an `<a href>` child — e.g. the "新通知" / "Earlier" section
158
+ // without an `<a href>` child — e.g. the "New notifications" / "Earlier" section
160
159
  // heading FB inserts at the top of the feed) are skipped.
161
160
  //
162
161
  // `helpers` carries the four pure helpers as positional refs so the
@@ -177,7 +176,7 @@ export function extractNotificationRowsFromDoc(doc, limit, helpers) {
177
176
  const abbr = item.querySelector('abbr');
178
177
  const time = abbr ? ((abbr.textContent || '').trim() || null) : null;
179
178
 
180
- // Unread badge: prefer the explicit `<div>未读</div>` /
179
+ // Unread badge: prefer the explicit `<div>Unread</div>` /
181
180
  // `<div>Unread</div>` child; fall back to anchor text prefix.
182
181
  let unread = false;
183
182
  const allDivs = item.querySelectorAll('div');
@@ -208,7 +207,7 @@ export function extractNotificationRowsFromDoc(doc, limit, helpers) {
208
207
  const label = labelHosts[k].getAttribute('aria-label');
209
208
  const stripped = helpers.stripMark(label, helpers.markPrefixes);
210
209
  if (stripped !== null) {
211
- const cleaned = stripped.replace(/[.。]+$/, '').trim();
210
+ const cleaned = stripped.replace(/[..]+$/, '').trim();
212
211
  text = cleaned || null;
213
212
  break;
214
213
  }
@@ -311,7 +310,7 @@ export const notificationsCommand = cli({
311
310
  site: 'facebook',
312
311
  name: 'notifications',
313
312
  access: 'read',
314
- description: 'Get recent Facebook notifications ( unread / time / url / notif_id / notif_type )',
313
+ description: 'Get recent Facebook notifications (includes unread / time / url / notif_id / notif_type columns)',
315
314
  domain: 'www.facebook.com',
316
315
  strategy: Strategy.COOKIE,
317
316
  browser: true,
@@ -5,17 +5,16 @@
5
5
  // snapshot of `www.facebook.com/notifications` captured live from a
6
6
  // logged-in session. Class names are stripped; SVG / `<i>` icon nodes
7
7
  // are removed. The structure preserves what the extractor needs:
8
- // - 5 `[role="listitem"]` rows: 1 header ("新通知" — no anchor) +
8
+ // - 5 `[role="listitem"]` rows: 1 header ("New notifications" — no anchor) +
9
9
  // 4 real notifications across 3 distinct `notif_t` types
10
10
  // (`onthisday`, `approve_from_another_device`,
11
11
  // `group_recommendation`).
12
12
  // - Each data row has `<a href>` with `notif_id` + `notif_t` query
13
- // params, `<div>未读</div>` unread badge, `<abbr aria-label="N天前">
14
- // <span>N天</span></abbr>` for time, and a `<div role="button"
15
- // aria-label="标记为已读,<body>">` for the bare body text.
13
+ // params, `<div>Unread</div>` unread badge, `<abbr aria-label="Ndays ago">
14
+ // <span>Ndays</span></abbr>` for time, and a `<div role="button"
15
+ // aria-label="Mark as read,<body>">` for the bare body text.
16
16
  //
17
- // Per dianping #1313 / hupu #1387 / xiaoe #1388 pattern: the live IIFE
18
- // embeds the same `extractNotificationRowsFromDoc` function via
17
+ // The live IIFE embeds the same `extractNotificationRowsFromDoc` function via
19
18
  // `${fn.toString()}` so the extractor seen by these JSDOM tests is the
20
19
  // exact same code that runs in the browser.
21
20
 
@@ -135,8 +134,8 @@ describe('normalizeNotificationsLimit', () => {
135
134
 
136
135
  describe('stripMarkAsReadPrefix', () => {
137
136
  it('strips known locale prefixes', () => {
138
- expect(stripMarkAsReadPrefix('标记为已读,回顾你在 2019年6月的那段过往.', MARK_AS_READ_PREFIXES))
139
- .toBe('回顾你在 2019年6月的那段过往.');
137
+ expect(stripMarkAsReadPrefix('Mark as read,Review your 2019year6memory from that month.', MARK_AS_READ_PREFIXES))
138
+ .toBe('Review your 2019year6memory from that month.');
140
139
  expect(stripMarkAsReadPrefix('Mark as read, John liked your photo', MARK_AS_READ_PREFIXES))
141
140
  .toBe('John liked your photo');
142
141
  expect(stripMarkAsReadPrefix('Mark as Read, John liked your photo', MARK_AS_READ_PREFIXES))
@@ -144,7 +143,7 @@ describe('stripMarkAsReadPrefix', () => {
144
143
  });
145
144
 
146
145
  it('returns null when prefix is missing — never silent default', () => {
147
- expect(stripMarkAsReadPrefix('管理Jake Win通知设置', MARK_AS_READ_PREFIXES)).toBeNull();
146
+ expect(stripMarkAsReadPrefix('ManageJake Winnotification settings', MARK_AS_READ_PREFIXES)).toBeNull();
148
147
  expect(stripMarkAsReadPrefix('arbitrary aria-label without prefix', MARK_AS_READ_PREFIXES))
149
148
  .toBeNull();
150
149
  });
@@ -158,18 +157,18 @@ describe('stripMarkAsReadPrefix', () => {
158
157
  });
159
158
 
160
159
  describe('stripAnchorChrome', () => {
161
- it('strips leading 未读 / Unread badge', () => {
162
- expect(stripAnchorChrome('未读John liked your photo', null, UNREAD_BADGE_LABELS))
160
+ it('strips leading Unread / Unread badge', () => {
161
+ expect(stripAnchorChrome('UnreadJohn liked your photo', null, UNREAD_BADGE_LABELS))
163
162
  .toBe('John liked your photo');
164
163
  expect(stripAnchorChrome('UnreadJohn liked your photo', null, UNREAD_BADGE_LABELS))
165
164
  .toBe('John liked your photo');
166
165
  });
167
166
 
168
167
  it('strips trailing time-ago suffix when timeStr is provided', () => {
169
- expect(stripAnchorChrome('未读回顾你在 2019年6月的那段过往.2', '2', UNREAD_BADGE_LABELS))
170
- .toBe('回顾你在 2019年6月的那段过往');
171
- expect(stripAnchorChrome('未读有人尝试登录,但我们已阻止。7', '7', UNREAD_BADGE_LABELS))
172
- .toBe('有人尝试登录,但我们已阻止');
168
+ expect(stripAnchorChrome('UnreadReview your June 2019 memory.2 days', '2 days', UNREAD_BADGE_LABELS))
169
+ .toBe('Review your June 2019 memory');
170
+ expect(stripAnchorChrome('UnreadSomeone tried to log in, but we blocked it.7 weeks', '7 weeks', UNREAD_BADGE_LABELS))
171
+ .toBe('Someone tried to log in, but we blocked it');
173
172
  });
174
173
 
175
174
  it('keeps text intact when there is no badge / no time', () => {
@@ -237,8 +236,8 @@ describe('extractNotificationRowsFromDoc — JSDOM against frozen fixture', () =
237
236
  expect(rows[0]).toEqual({
238
237
  index: 1,
239
238
  unread: true,
240
- text: '回顾你在 2019年6月的那段过往',
241
- time: '2天',
239
+ text: 'Review your 2019year6memory from that month',
240
+ time: '2days',
242
241
  url: 'https://www.facebook.com/photo/?fbid=104250644186433&set=a.104250310853133&notif_id=1777926497886652&notif_t=onthisday&ref=notif',
243
242
  notif_id: '1777926497886652',
244
243
  notif_type: 'onthisday',
@@ -246,16 +245,16 @@ describe('extractNotificationRowsFromDoc — JSDOM against frozen fixture', () =
246
245
  expect(rows[2]).toMatchObject({
247
246
  index: 3,
248
247
  unread: true,
249
- text: '有人尝试登录,但我们已阻止',
250
- time: '7周',
248
+ text: 'Someone tried to log in,but we blocked it',
249
+ time: '7weeks',
251
250
  notif_type: 'approve_from_another_device',
252
251
  notif_id: '1773680546395691',
253
252
  });
254
253
  expect(rows[3]).toMatchObject({
255
254
  index: 4,
256
255
  unread: true,
257
- text: '你可能会喜欢 ETYCAL VIBEZ fan\'s page',
258
- time: '2天',
256
+ text: 'You might like ETYCAL VIBEZ fan\'s page',
257
+ time: '2days',
259
258
  notif_type: 'group_recommendation',
260
259
  });
261
260
  });
@@ -275,7 +274,7 @@ describe('extractNotificationRowsFromDoc — JSDOM against frozen fixture', () =
275
274
  expect(rows.length).toBe(4); // header skipped
276
275
  // None of the returned rows match the header text.
277
276
  for (const row of rows) {
278
- expect(row.text).not.toBe('新通知');
277
+ expect(row.text).not.toBe('New notifications');
279
278
  }
280
279
  });
281
280
 
@@ -286,8 +285,8 @@ describe('extractNotificationRowsFromDoc — JSDOM against frozen fixture', () =
286
285
  // have happily returned anything <= 150. The point of this test
287
286
  // is to assert nothing is silently sliced — full body text round-
288
287
  // trips through the extractor.
289
- expect(rows[0].text).toBe('回顾你在 2019年6月的那段过往');
290
- expect(rows[1].text).toBe('看看你在 2019年6月发布的帖子,瞬间回到过去的美好时光');
288
+ expect(rows[0].text).toBe('Review your 2019year6memory from that month');
289
+ expect(rows[1].text).toBe('Look back at your 2019year6post from June,memory from the past');
291
290
  // No row has a value that ends with our legacy truncation point.
292
291
  for (const row of rows) {
293
292
  expect(row.text).not.toMatch(/\u2026$/); // U+2026 ellipsis as a defensive check
@@ -299,7 +298,7 @@ describe('extractNotificationRowsFromDoc — JSDOM against frozen fixture', () =
299
298
  const html = `<!doctype html><html><body><div role="main">
300
299
  <div role="listitem">
301
300
  <a href="https://www.facebook.com/page?notif_id=999&notif_t=test_event">
302
- <span><div>未读</div>Body text without time</span>
301
+ <span><div>Unread</div>Body text without time</span>
303
302
  </a>
304
303
  </div>
305
304
  </body></html>`;
@@ -347,7 +346,7 @@ describe('extractNotificationRowsFromDoc — JSDOM against frozen fixture', () =
347
346
  const html = `<!doctype html><html><body><div role="main">
348
347
  <div role="listitem">
349
348
  <a href="https://www.facebook.com/x?notif_id=1&notif_t=blank">
350
- <span><div>未读</div></span>
349
+ <span><div>Unread</div></span>
351
350
  <abbr aria-label="3 hr"><span>3 hr</span></abbr>
352
351
  </a>
353
352
  </div>
@@ -382,8 +381,8 @@ describe('buildNotificationsScript — IIFE invariants', () => {
382
381
 
383
382
  it('inlines locale prefix and badge tables so the IIFE has them at runtime', () => {
384
383
  const script = buildNotificationsScript(15);
385
- expect(script).toContain('"标记为已读,"');
386
- expect(script).toContain('"未读"');
384
+ expect(script).toContain('"Mark as read,"');
385
+ expect(script).toContain('"Unread"');
387
386
  expect(script).toContain('"Unread"');
388
387
  });
389
388
 
@@ -430,7 +429,7 @@ describe('facebook/notifications — func typed boundaries', () => {
430
429
  index: 1,
431
430
  unread: true,
432
431
  text: 'hello',
433
- time: '2天',
432
+ time: '2days',
434
433
  url: 'https://www.facebook.com/notifications/?notif_id=1&notif_t=test',
435
434
  notif_id: '1',
436
435
  notif_type: 'test',