@agentrhq/webcmd 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/README.md +183 -218
  2. package/cli-manifest.json +16247 -34913
  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/followers.js +1 -1
  94. package/clis/twitter/list-remove-core.js +2 -2
  95. package/clis/twitter/list-tweets.test.js +3 -3
  96. package/clis/twitter/lists.js +6 -6
  97. package/clis/twitter/lists.test.js +2 -2
  98. package/clis/twitter/reply-dm.js +1 -1
  99. package/clis/twitter/shared.test.js +4 -5
  100. package/clis/twitter/trending.js +1 -1
  101. package/clis/twitter/utils.js +1 -1
  102. package/clis/web/read.js +1 -1
  103. package/clis/web/read.test.js +2 -2
  104. package/clis/yahoo-finance/quote.js +1 -1
  105. package/clis/youtube/history.js +4 -4
  106. package/clis/youtube/transcript-group.js +1 -1
  107. package/clis/youtube/transcript-group.test.js +5 -5
  108. package/clis/youtube/transcript.js +5 -5
  109. package/clis/youtube/video.js +4 -4
  110. package/clis/youtube/video.test.js +6 -6
  111. package/dist/src/browser/analyze.test.js +13 -13
  112. package/dist/src/browser/bridge-readiness.d.ts +1 -1
  113. package/dist/src/browser/daemon-client.d.ts +1 -0
  114. package/dist/src/browser/daemon-client.js +102 -50
  115. package/dist/src/browser/daemon-client.test.js +104 -19
  116. package/dist/src/browser/errors.js +11 -0
  117. package/dist/src/browser/protocol.d.ts +2 -0
  118. package/dist/src/browser.test.js +2 -2
  119. package/dist/src/cli-argv-preprocess.d.ts +2 -2
  120. package/dist/src/cli-argv-preprocess.js +2 -2
  121. package/dist/src/cli-argv-preprocess.test.js +35 -35
  122. package/dist/src/cli.js +2 -2
  123. package/dist/src/cli.test.js +57 -57
  124. package/dist/src/commanderAdapter.test.js +19 -19
  125. package/dist/src/convention-audit.js +1 -1
  126. package/dist/src/daemon/server.js +28 -23
  127. package/dist/src/daemon/server.test.js +52 -0
  128. package/dist/src/daemon-utils.d.ts +1 -0
  129. package/dist/src/daemon-utils.js +9 -0
  130. package/dist/src/daemon.test.js +10 -1
  131. package/dist/src/doctor.js +7 -1
  132. package/dist/src/doctor.test.js +8 -1
  133. package/dist/src/download/article-download.d.ts +3 -3
  134. package/dist/src/download/article-download.js +7 -7
  135. package/dist/src/download/article-download.test.js +6 -6
  136. package/dist/src/download/index.js +1 -1
  137. package/dist/src/download/index.test.js +1 -2
  138. package/dist/src/download/media-download.d.ts +1 -1
  139. package/dist/src/download/media-download.js +1 -1
  140. package/dist/src/electron-apps.js +0 -8
  141. package/dist/src/electron-apps.test.js +2 -11
  142. package/dist/src/errors.test.js +9 -9
  143. package/dist/src/execution.js +2 -0
  144. package/dist/src/execution.test.js +12 -0
  145. package/dist/src/external-clis.yaml +0 -37
  146. package/dist/src/external.d.ts +1 -1
  147. package/dist/src/external.test.js +2 -17
  148. package/dist/src/generate-release-notes-cli.test.js +140 -0
  149. package/dist/src/help.d.ts +3 -3
  150. package/dist/src/help.test.js +8 -8
  151. package/dist/src/main.js +1 -1
  152. package/dist/src/manifest-types.d.ts +1 -1
  153. package/dist/src/node-network.test.js +2 -2
  154. package/dist/src/output.js +1 -1
  155. package/dist/src/pipeline/steps/download.test.js +3 -3
  156. package/dist/src/registry.test.js +2 -2
  157. package/dist/src/release-notes.d.ts +38 -0
  158. package/dist/src/release-notes.js +99 -0
  159. package/dist/src/release-notes.test.js +61 -0
  160. package/dist/src/serialization.test.js +7 -7
  161. package/dist/src/snapshotFormatter.js +3 -5
  162. package/dist/src/snapshotFormatter.test.d.ts +1 -1
  163. package/dist/src/snapshotFormatter.test.js +50 -50
  164. package/dist/src/tui.js +1 -1
  165. package/package.json +4 -1
  166. package/scripts/generate-release-notes.ts +234 -0
  167. package/scripts/postinstall.js +1 -1
  168. package/scripts/silent-column-drop-baseline.json +0 -498
  169. package/scripts/typed-error-lint-baseline.json +0 -464
  170. package/skills/webcmd-adapter-author/SKILL.md +216 -213
  171. package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
  172. package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
  173. package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
  174. package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
  175. package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
  176. package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
  177. package/skills/webcmd-adapter-author/references/output-design.md +47 -125
  178. package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
  179. package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
  180. package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
  181. package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
  182. package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
  183. package/skills/webcmd-autofix/SKILL.md +136 -143
  184. package/skills/webcmd-sitemap-author/SKILL.md +58 -67
  185. package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
  186. package/skills/webcmd-usage/SKILL.md +106 -97
  187. package/clis/12306/auth.js +0 -59
  188. package/clis/12306/me.js +0 -73
  189. package/clis/12306/orders.js +0 -96
  190. package/clis/12306/passengers.js +0 -90
  191. package/clis/12306/price.js +0 -166
  192. package/clis/12306/stations.js +0 -66
  193. package/clis/12306/train.js +0 -91
  194. package/clis/12306/trains.js +0 -166
  195. package/clis/12306/utils.js +0 -272
  196. package/clis/12306/utils.test.js +0 -424
  197. package/clis/1688/assets.js +0 -205
  198. package/clis/1688/assets.test.js +0 -39
  199. package/clis/1688/auth.js +0 -46
  200. package/clis/1688/download.js +0 -77
  201. package/clis/1688/download.test.js +0 -31
  202. package/clis/1688/item.js +0 -188
  203. package/clis/1688/item.test.js +0 -67
  204. package/clis/1688/search.js +0 -310
  205. package/clis/1688/search.test.js +0 -75
  206. package/clis/1688/shared.js +0 -557
  207. package/clis/1688/shared.test.js +0 -57
  208. package/clis/1688/store.js +0 -227
  209. package/clis/1688/store.test.js +0 -62
  210. package/clis/1point3acres/auth.js +0 -52
  211. package/clis/1point3acres/digest.js +0 -35
  212. package/clis/1point3acres/forum.js +0 -51
  213. package/clis/1point3acres/forums.js +0 -44
  214. package/clis/1point3acres/hot.js +0 -35
  215. package/clis/1point3acres/latest.js +0 -35
  216. package/clis/1point3acres/notifications.js +0 -64
  217. package/clis/1point3acres/search.js +0 -71
  218. package/clis/1point3acres/thread.js +0 -117
  219. package/clis/1point3acres/user.js +0 -77
  220. package/clis/1point3acres/utils.js +0 -247
  221. package/clis/36kr/article.js +0 -66
  222. package/clis/36kr/article.test.js +0 -46
  223. package/clis/36kr/hot.js +0 -87
  224. package/clis/36kr/hot.test.js +0 -15
  225. package/clis/36kr/news.js +0 -52
  226. package/clis/36kr/news.test.js +0 -85
  227. package/clis/36kr/search.js +0 -79
  228. package/clis/51job/company.js +0 -126
  229. package/clis/51job/detail.js +0 -109
  230. package/clis/51job/hot.js +0 -56
  231. package/clis/51job/search.js +0 -80
  232. package/clis/51job/utils.js +0 -302
  233. package/clis/51job/utils.test.js +0 -69
  234. package/clis/aibase/news.js +0 -110
  235. package/clis/aibase/news.test.js +0 -59
  236. package/clis/autohome/__fixtures__/catalog.html +0 -11
  237. package/clis/autohome/__fixtures__/koubei.json +0 -116
  238. package/clis/autohome/autohome.test.js +0 -115
  239. package/clis/autohome/brand.js +0 -108
  240. package/clis/autohome/score.js +0 -103
  241. package/clis/autohome/utils.js +0 -157
  242. package/clis/baidu-scholar/search.js +0 -87
  243. package/clis/baidu-scholar/search.test.js +0 -23
  244. package/clis/bilibili/auth.js +0 -36
  245. package/clis/bilibili/comment.js +0 -107
  246. package/clis/bilibili/comment.test.js +0 -153
  247. package/clis/bilibili/comments.js +0 -136
  248. package/clis/bilibili/comments.test.js +0 -142
  249. package/clis/bilibili/download.js +0 -178
  250. package/clis/bilibili/download.test.js +0 -173
  251. package/clis/bilibili/dynamic.js +0 -34
  252. package/clis/bilibili/dynamic.test.js +0 -68
  253. package/clis/bilibili/favorite.js +0 -47
  254. package/clis/bilibili/feed.js +0 -220
  255. package/clis/bilibili/follow.js +0 -140
  256. package/clis/bilibili/follow.test.js +0 -203
  257. package/clis/bilibili/following.js +0 -44
  258. package/clis/bilibili/history.js +0 -45
  259. package/clis/bilibili/hot.js +0 -40
  260. package/clis/bilibili/hot.test.js +0 -17
  261. package/clis/bilibili/me.js +0 -13
  262. package/clis/bilibili/ranking.js +0 -25
  263. package/clis/bilibili/search.js +0 -24
  264. package/clis/bilibili/subtitle.js +0 -141
  265. package/clis/bilibili/subtitle.test.js +0 -240
  266. package/clis/bilibili/summary.js +0 -167
  267. package/clis/bilibili/summary.test.js +0 -210
  268. package/clis/bilibili/unfollow.js +0 -121
  269. package/clis/bilibili/user-videos.js +0 -39
  270. package/clis/bilibili/utils.js +0 -273
  271. package/clis/bilibili/utils.test.js +0 -97
  272. package/clis/bilibili/video.js +0 -155
  273. package/clis/bilibili/video.test.js +0 -308
  274. package/clis/boss/auth.js +0 -47
  275. package/clis/boss/batchgreet.js +0 -61
  276. package/clis/boss/chatlist.js +0 -116
  277. package/clis/boss/chatlist.test.js +0 -211
  278. package/clis/boss/chatmsg.js +0 -117
  279. package/clis/boss/chatmsg.test.js +0 -230
  280. package/clis/boss/detail.js +0 -63
  281. package/clis/boss/exchange.js +0 -46
  282. package/clis/boss/greet.js +0 -49
  283. package/clis/boss/invite.js +0 -64
  284. package/clis/boss/joblist.js +0 -31
  285. package/clis/boss/mark.js +0 -70
  286. package/clis/boss/recommend.js +0 -45
  287. package/clis/boss/resume.js +0 -150
  288. package/clis/boss/search.js +0 -197
  289. package/clis/boss/search.test.js +0 -78
  290. package/clis/boss/send.js +0 -44
  291. package/clis/boss/stats.js +0 -66
  292. package/clis/boss/utils.js +0 -468
  293. package/clis/boss/utils.test.js +0 -34
  294. package/clis/chaoxing/assignments.js +0 -76
  295. package/clis/chaoxing/auth.js +0 -54
  296. package/clis/chaoxing/exams.js +0 -75
  297. package/clis/chaoxing/utils.js +0 -223
  298. package/clis/chaoxing/utils.test.js +0 -45
  299. package/clis/cnki/search.js +0 -61
  300. package/clis/cnki/search.test.js +0 -18
  301. package/clis/ctrip/auth.js +0 -50
  302. package/clis/ctrip/ctrip.test.js +0 -719
  303. package/clis/ctrip/flight.js +0 -136
  304. package/clis/ctrip/hotel-search.js +0 -132
  305. package/clis/ctrip/hotel-suggest.js +0 -45
  306. package/clis/ctrip/search.js +0 -41
  307. package/clis/ctrip/utils.js +0 -473
  308. package/clis/deepseek/ask.js +0 -158
  309. package/clis/deepseek/ask.test.js +0 -399
  310. package/clis/deepseek/auth.js +0 -54
  311. package/clis/deepseek/detail.js +0 -46
  312. package/clis/deepseek/detail.test.js +0 -81
  313. package/clis/deepseek/history.js +0 -27
  314. package/clis/deepseek/new.js +0 -33
  315. package/clis/deepseek/read.js +0 -25
  316. package/clis/deepseek/send.js +0 -140
  317. package/clis/deepseek/send.test.js +0 -107
  318. package/clis/deepseek/status.js +0 -26
  319. package/clis/deepseek/utils.js +0 -487
  320. package/clis/deepseek/utils.test.js +0 -370
  321. package/clis/dianping/__fixtures__/search.html +0 -168
  322. package/clis/dianping/__fixtures__/shop.html +0 -6
  323. package/clis/dianping/auth.js +0 -49
  324. package/clis/dianping/cityResolver.js +0 -185
  325. package/clis/dianping/dianping.test.js +0 -578
  326. package/clis/dianping/search.js +0 -157
  327. package/clis/dianping/shop.js +0 -173
  328. package/clis/dianping/utils.js +0 -157
  329. package/clis/dongchedi/__fixtures__/search.json +0 -60
  330. package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
  331. package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
  332. package/clis/dongchedi/dongchedi.test.js +0 -191
  333. package/clis/dongchedi/koubei.js +0 -85
  334. package/clis/dongchedi/models.js +0 -91
  335. package/clis/dongchedi/score.js +0 -83
  336. package/clis/dongchedi/search.js +0 -83
  337. package/clis/dongchedi/series.js +0 -87
  338. package/clis/dongchedi/specs.js +0 -115
  339. package/clis/dongchedi/utils.js +0 -180
  340. package/clis/douban/auth.js +0 -50
  341. package/clis/douban/book-hot.js +0 -15
  342. package/clis/douban/download.js +0 -68
  343. package/clis/douban/download.test.js +0 -170
  344. package/clis/douban/marks.js +0 -116
  345. package/clis/douban/movie-hot.js +0 -15
  346. package/clis/douban/movie-hot.test.js +0 -14
  347. package/clis/douban/photos.js +0 -35
  348. package/clis/douban/reviews.js +0 -107
  349. package/clis/douban/search.js +0 -18
  350. package/clis/douban/search.test.js +0 -11
  351. package/clis/douban/subject.js +0 -46
  352. package/clis/douban/subject.test.js +0 -11
  353. package/clis/douban/top250.js +0 -68
  354. package/clis/douban/utils.js +0 -657
  355. package/clis/douban/utils.test.js +0 -488
  356. package/clis/doubao/ask.js +0 -40
  357. package/clis/doubao/auth.js +0 -66
  358. package/clis/doubao/detail.js +0 -35
  359. package/clis/doubao/detail.test.js +0 -42
  360. package/clis/doubao/history.js +0 -30
  361. package/clis/doubao/history.test.js +0 -37
  362. package/clis/doubao/meeting-summary.js +0 -41
  363. package/clis/doubao/meeting-transcript.js +0 -38
  364. package/clis/doubao/new.js +0 -22
  365. package/clis/doubao/read.js +0 -21
  366. package/clis/doubao/send.js +0 -24
  367. package/clis/doubao/status.js +0 -26
  368. package/clis/doubao/utils.js +0 -1156
  369. package/clis/doubao/utils.test.js +0 -396
  370. package/clis/doubao-app/ask.js +0 -54
  371. package/clis/doubao-app/dump.js +0 -25
  372. package/clis/doubao-app/new.js +0 -21
  373. package/clis/doubao-app/read.js +0 -19
  374. package/clis/doubao-app/screenshot.js +0 -19
  375. package/clis/doubao-app/send.js +0 -28
  376. package/clis/doubao-app/status.js +0 -17
  377. package/clis/doubao-app/utils.js +0 -110
  378. package/clis/douyin/_shared/browser-fetch.js +0 -66
  379. package/clis/douyin/_shared/browser-fetch.test.js +0 -64
  380. package/clis/douyin/_shared/creation-id.js +0 -5
  381. package/clis/douyin/_shared/creation-id.test.js +0 -22
  382. package/clis/douyin/_shared/evaluate-result.js +0 -16
  383. package/clis/douyin/_shared/imagex-upload.js +0 -53
  384. package/clis/douyin/_shared/imagex-upload.test.js +0 -87
  385. package/clis/douyin/_shared/public-api.js +0 -29
  386. package/clis/douyin/_shared/sts2.js +0 -21
  387. package/clis/douyin/_shared/sts2.test.js +0 -27
  388. package/clis/douyin/_shared/text-extra.js +0 -15
  389. package/clis/douyin/_shared/text-extra.test.js +0 -37
  390. package/clis/douyin/_shared/timing.js +0 -22
  391. package/clis/douyin/_shared/timing.test.js +0 -28
  392. package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
  393. package/clis/douyin/_shared/tos-upload.js +0 -331
  394. package/clis/douyin/_shared/tos-upload.test.js +0 -229
  395. package/clis/douyin/_shared/transcode.js +0 -45
  396. package/clis/douyin/_shared/transcode.test.js +0 -91
  397. package/clis/douyin/_shared/vod-upload.js +0 -212
  398. package/clis/douyin/_shared/vod-upload.test.js +0 -38
  399. package/clis/douyin/activities.js +0 -23
  400. package/clis/douyin/activities.test.js +0 -55
  401. package/clis/douyin/auth.js +0 -39
  402. package/clis/douyin/collections.js +0 -23
  403. package/clis/douyin/collections.test.js +0 -45
  404. package/clis/douyin/delete.js +0 -152
  405. package/clis/douyin/delete.test.js +0 -100
  406. package/clis/douyin/draft.js +0 -355
  407. package/clis/douyin/draft.test.js +0 -335
  408. package/clis/douyin/drafts.js +0 -24
  409. package/clis/douyin/drafts.test.js +0 -11
  410. package/clis/douyin/hashtag.js +0 -114
  411. package/clis/douyin/hashtag.test.js +0 -171
  412. package/clis/douyin/location.js +0 -25
  413. package/clis/douyin/location.test.js +0 -23
  414. package/clis/douyin/profile.js +0 -29
  415. package/clis/douyin/profile.test.js +0 -46
  416. package/clis/douyin/publish-upload-id.test.js +0 -206
  417. package/clis/douyin/publish.js +0 -341
  418. package/clis/douyin/publish.test.js +0 -38
  419. package/clis/douyin/search.js +0 -308
  420. package/clis/douyin/search.test.js +0 -307
  421. package/clis/douyin/stats.js +0 -28
  422. package/clis/douyin/stats.test.js +0 -22
  423. package/clis/douyin/update.js +0 -32
  424. package/clis/douyin/update.test.js +0 -11
  425. package/clis/douyin/user-videos.js +0 -82
  426. package/clis/douyin/user-videos.test.js +0 -151
  427. package/clis/douyin/videos.js +0 -52
  428. package/clis/douyin/videos.test.js +0 -54
  429. package/clis/eastmoney/_secid.js +0 -78
  430. package/clis/eastmoney/announcement.js +0 -53
  431. package/clis/eastmoney/convertible.js +0 -74
  432. package/clis/eastmoney/etf.js +0 -66
  433. package/clis/eastmoney/holders.js +0 -79
  434. package/clis/eastmoney/hot-rank.js +0 -51
  435. package/clis/eastmoney/hot-rank.test.js +0 -59
  436. package/clis/eastmoney/index-board.js +0 -97
  437. package/clis/eastmoney/kline.js +0 -88
  438. package/clis/eastmoney/kuaixun.js +0 -55
  439. package/clis/eastmoney/longhu.js +0 -68
  440. package/clis/eastmoney/money-flow.js +0 -79
  441. package/clis/eastmoney/northbound.js +0 -58
  442. package/clis/eastmoney/quote.js +0 -108
  443. package/clis/eastmoney/rank.js +0 -95
  444. package/clis/eastmoney/sectors.js +0 -77
  445. package/clis/flomo/auth.js +0 -55
  446. package/clis/flomo/memos.js +0 -228
  447. package/clis/flomo/memos.test.js +0 -144
  448. package/clis/gitee/auth.js +0 -41
  449. package/clis/gitee/index.js +0 -3
  450. package/clis/gitee/search.js +0 -137
  451. package/clis/gitee/search.test.js +0 -65
  452. package/clis/gitee/trending.js +0 -568
  453. package/clis/gitee/user.js +0 -200
  454. package/clis/gitee/user.test.js +0 -63
  455. package/clis/gov-law/commands.test.js +0 -39
  456. package/clis/gov-law/recent.js +0 -22
  457. package/clis/gov-law/search.js +0 -41
  458. package/clis/gov-law/shared.js +0 -51
  459. package/clis/gov-policy/__fixtures__/recent.html +0 -16
  460. package/clis/gov-policy/__fixtures__/search.html +0 -41
  461. package/clis/gov-policy/gov-policy.test.js +0 -224
  462. package/clis/gov-policy/recent.js +0 -90
  463. package/clis/gov-policy/search.js +0 -91
  464. package/clis/gov-policy/utils.js +0 -54
  465. package/clis/guazi/__fixtures__/detail.html +0 -7
  466. package/clis/guazi/__fixtures__/list.html +0 -5
  467. package/clis/guazi/browse.js +0 -95
  468. package/clis/guazi/car.js +0 -110
  469. package/clis/guazi/guazi.test.js +0 -126
  470. package/clis/guazi/utils.js +0 -133
  471. package/clis/huodongxing/events.js +0 -322
  472. package/clis/huodongxing/events.test.js +0 -296
  473. package/clis/hupu/__fixtures__/hot-home.html +0 -64
  474. package/clis/hupu/auth.js +0 -47
  475. package/clis/hupu/detail.js +0 -72
  476. package/clis/hupu/hot.js +0 -163
  477. package/clis/hupu/hot.test.js +0 -224
  478. package/clis/hupu/like.js +0 -76
  479. package/clis/hupu/mentions.js +0 -160
  480. package/clis/hupu/reply.js +0 -72
  481. package/clis/hupu/search.js +0 -60
  482. package/clis/hupu/unlike.js +0 -76
  483. package/clis/hupu/utils.js +0 -319
  484. package/clis/jd/add-cart.js +0 -72
  485. package/clis/jd/auth.js +0 -46
  486. package/clis/jd/cart.js +0 -80
  487. package/clis/jd/commands.test.js +0 -41
  488. package/clis/jd/detail.js +0 -63
  489. package/clis/jd/item.js +0 -730
  490. package/clis/jd/item.test.js +0 -354
  491. package/clis/jd/item.test.ts +0 -517
  492. package/clis/jd/reviews.js +0 -55
  493. package/clis/jd/search.js +0 -66
  494. package/clis/jianyu/auth.js +0 -62
  495. package/clis/jianyu/detail.js +0 -21
  496. package/clis/jianyu/search.js +0 -634
  497. package/clis/jianyu/search.test.js +0 -153
  498. package/clis/jianyu/shared/china-bid-search.js +0 -165
  499. package/clis/jianyu/shared/procurement-contract.js +0 -324
  500. package/clis/jianyu/shared/procurement-contract.test.js +0 -72
  501. package/clis/jianyu/shared/procurement-detail.js +0 -107
  502. package/clis/jianyu/shared/procurement-detail.test.js +0 -84
  503. package/clis/jike/auth.js +0 -48
  504. package/clis/jike/comment.js +0 -107
  505. package/clis/jike/create.js +0 -106
  506. package/clis/jike/feed.js +0 -68
  507. package/clis/jike/like.js +0 -61
  508. package/clis/jike/notifications.js +0 -169
  509. package/clis/jike/post.js +0 -72
  510. package/clis/jike/read.test.js +0 -86
  511. package/clis/jike/repost.js +0 -103
  512. package/clis/jike/search.js +0 -68
  513. package/clis/jike/topic.js +0 -65
  514. package/clis/jike/user.js +0 -65
  515. package/clis/jike/utils.js +0 -25
  516. package/clis/jimeng/auth.js +0 -46
  517. package/clis/jimeng/generate.js +0 -84
  518. package/clis/jimeng/history.js +0 -48
  519. package/clis/jimeng/new.js +0 -44
  520. package/clis/jimeng/workspaces.js +0 -42
  521. package/clis/juejin/hot.js +0 -37
  522. package/clis/juejin/juejin.test.js +0 -241
  523. package/clis/juejin/recommend.js +0 -61
  524. package/clis/juejin/utils.js +0 -199
  525. package/clis/ke/auth.js +0 -46
  526. package/clis/ke/chengjiao.js +0 -78
  527. package/clis/ke/ershoufang.js +0 -101
  528. package/clis/ke/utils.js +0 -104
  529. package/clis/ke/xiaoqu.js +0 -78
  530. package/clis/ke/zufang.js +0 -95
  531. package/clis/kimi/_utils.js +0 -110
  532. package/clis/kimi/audit-extras.js +0 -268
  533. package/clis/kimi/auth.js +0 -57
  534. package/clis/kimi/chat.js +0 -470
  535. package/clis/kimi/kimi.test.js +0 -187
  536. package/clis/kimi/storage.js +0 -169
  537. package/clis/kimi/ui.js +0 -314
  538. package/clis/kimi/usage.js +0 -144
  539. package/clis/linux-do/auth.js +0 -55
  540. package/clis/linux-do/categories.js +0 -50
  541. package/clis/linux-do/feed.js +0 -395
  542. package/clis/linux-do/feed.test.js +0 -153
  543. package/clis/linux-do/search.js +0 -29
  544. package/clis/linux-do/tags.js +0 -28
  545. package/clis/linux-do/topic-content.js +0 -155
  546. package/clis/linux-do/topic-content.test.js +0 -59
  547. package/clis/linux-do/topic.js +0 -53
  548. package/clis/linux-do/user-posts.js +0 -57
  549. package/clis/linux-do/user-topics.js +0 -37
  550. package/clis/maimai/auth.js +0 -47
  551. package/clis/maimai/search-talents.js +0 -192
  552. package/clis/maimai/search-talents.test.js +0 -29
  553. package/clis/mubu/doc.js +0 -41
  554. package/clis/mubu/docs.js +0 -44
  555. package/clis/mubu/notes.js +0 -245
  556. package/clis/mubu/recent.js +0 -28
  557. package/clis/mubu/search.js +0 -63
  558. package/clis/mubu/utils.js +0 -304
  559. package/clis/nowcoder/auth.js +0 -65
  560. package/clis/nowcoder/companies.js +0 -24
  561. package/clis/nowcoder/creators.js +0 -28
  562. package/clis/nowcoder/detail.js +0 -62
  563. package/clis/nowcoder/experience.js +0 -37
  564. package/clis/nowcoder/hot.js +0 -25
  565. package/clis/nowcoder/jobs.js +0 -22
  566. package/clis/nowcoder/notifications.js +0 -30
  567. package/clis/nowcoder/papers.js +0 -41
  568. package/clis/nowcoder/practice.js +0 -38
  569. package/clis/nowcoder/recommend.js +0 -31
  570. package/clis/nowcoder/referral.js +0 -40
  571. package/clis/nowcoder/salary.js +0 -41
  572. package/clis/nowcoder/search.js +0 -50
  573. package/clis/nowcoder/suggest.js +0 -34
  574. package/clis/nowcoder/topics.js +0 -28
  575. package/clis/nowcoder/trending.js +0 -26
  576. package/clis/ones/common.js +0 -144
  577. package/clis/ones/enrich-tasks.js +0 -37
  578. package/clis/ones/login.js +0 -81
  579. package/clis/ones/logout.js +0 -18
  580. package/clis/ones/me.js +0 -31
  581. package/clis/ones/my-tasks.js +0 -121
  582. package/clis/ones/resolve-labels.js +0 -64
  583. package/clis/ones/task-helpers.js +0 -212
  584. package/clis/ones/task-helpers.test.js +0 -12
  585. package/clis/ones/task.js +0 -67
  586. package/clis/ones/tasks.js +0 -80
  587. package/clis/ones/token-info.js +0 -43
  588. package/clis/ones/worklog.js +0 -268
  589. package/clis/ones/worklog.test.js +0 -20
  590. package/clis/powerchina/auth.js +0 -52
  591. package/clis/powerchina/search.js +0 -251
  592. package/clis/powerchina/search.test.js +0 -93
  593. package/clis/quark/auth.js +0 -47
  594. package/clis/quark/ls.js +0 -64
  595. package/clis/quark/mkdir.js +0 -37
  596. package/clis/quark/mv.js +0 -54
  597. package/clis/quark/rename.js +0 -27
  598. package/clis/quark/rm.js +0 -25
  599. package/clis/quark/save.js +0 -81
  600. package/clis/quark/share-tree.js +0 -46
  601. package/clis/quark/utils.js +0 -146
  602. package/clis/quark/utils.test.js +0 -58
  603. package/clis/qwen/ask.js +0 -104
  604. package/clis/qwen/ask.test.js +0 -36
  605. package/clis/qwen/auth.js +0 -56
  606. package/clis/qwen/detail.js +0 -62
  607. package/clis/qwen/history.js +0 -61
  608. package/clis/qwen/image.js +0 -179
  609. package/clis/qwen/new.js +0 -23
  610. package/clis/qwen/read.js +0 -41
  611. package/clis/qwen/send.js +0 -55
  612. package/clis/qwen/status.js +0 -37
  613. package/clis/qwen/utils.js +0 -461
  614. package/clis/qwen/utils.test.js +0 -128
  615. package/clis/rednote/auth.js +0 -52
  616. package/clis/rednote/comments.js +0 -85
  617. package/clis/rednote/download.js +0 -59
  618. package/clis/rednote/feed.js +0 -27
  619. package/clis/rednote/navigation.test.js +0 -26
  620. package/clis/rednote/note.js +0 -68
  621. package/clis/rednote/notifications.js +0 -139
  622. package/clis/rednote/rednote.test.js +0 -240
  623. package/clis/rednote/search.js +0 -107
  624. package/clis/rednote/user.js +0 -55
  625. package/clis/sinablog/article.js +0 -15
  626. package/clis/sinablog/hot.js +0 -15
  627. package/clis/sinablog/search.js +0 -52
  628. package/clis/sinablog/user.js +0 -16
  629. package/clis/sinablog/utils.js +0 -186
  630. package/clis/sinafinance/news.js +0 -62
  631. package/clis/sinafinance/rolling-news.js +0 -41
  632. package/clis/sinafinance/stock-rank.js +0 -66
  633. package/clis/sinafinance/stock.js +0 -121
  634. package/clis/sinafinance/stock.test.js +0 -59
  635. package/clis/smzdm/search.js +0 -149
  636. package/clis/smzdm/search.test.js +0 -114
  637. package/clis/taobao/add-cart.js +0 -150
  638. package/clis/taobao/auth.js +0 -58
  639. package/clis/taobao/cart.js +0 -96
  640. package/clis/taobao/commands.test.js +0 -41
  641. package/clis/taobao/detail.js +0 -71
  642. package/clis/taobao/reviews.js +0 -77
  643. package/clis/taobao/search.js +0 -97
  644. package/clis/tdx/hot-rank.js +0 -48
  645. package/clis/tdx/hot-rank.test.js +0 -59
  646. package/clis/ths/hot-rank.js +0 -50
  647. package/clis/ths/hot-rank.test.js +0 -64
  648. package/clis/tieba/commands.test.js +0 -79
  649. package/clis/tieba/hot.js +0 -48
  650. package/clis/tieba/posts.js +0 -86
  651. package/clis/tieba/read.js +0 -141
  652. package/clis/tieba/search.js +0 -109
  653. package/clis/tieba/utils.js +0 -240
  654. package/clis/tieba/utils.test.js +0 -290
  655. package/clis/toutiao/articles.js +0 -55
  656. package/clis/toutiao/auth.js +0 -70
  657. package/clis/toutiao/hot.js +0 -63
  658. package/clis/toutiao/toutiao.test.js +0 -378
  659. package/clis/toutiao/utils.js +0 -161
  660. package/clis/trae-cn/activity.js +0 -22
  661. package/clis/trae-cn/approve.js +0 -52
  662. package/clis/trae-cn/ask.js +0 -99
  663. package/clis/trae-cn/dump.js +0 -5
  664. package/clis/trae-cn/export.js +0 -40
  665. package/clis/trae-cn/model.js +0 -22
  666. package/clis/trae-cn/new.js +0 -63
  667. package/clis/trae-cn/read.js +0 -23
  668. package/clis/trae-cn/screenshot.js +0 -5
  669. package/clis/trae-cn/select-model.js +0 -25
  670. package/clis/trae-cn/send.js +0 -23
  671. package/clis/trae-cn/setup.js +0 -75
  672. package/clis/trae-cn/status.js +0 -27
  673. package/clis/trae-cn/targets.js +0 -96
  674. package/clis/trae-cn/trae-cn.test.js +0 -412
  675. package/clis/trae-cn/utils.js +0 -750
  676. package/clis/trae-cn/watch.js +0 -119
  677. package/clis/uisdc/news.js +0 -105
  678. package/clis/uisdc/news.test.js +0 -66
  679. package/clis/v2ex/auth.js +0 -44
  680. package/clis/v2ex/daily.js +0 -99
  681. package/clis/v2ex/hot.js +0 -26
  682. package/clis/v2ex/latest.js +0 -26
  683. package/clis/v2ex/me.js +0 -100
  684. package/clis/v2ex/member.js +0 -28
  685. package/clis/v2ex/node.js +0 -39
  686. package/clis/v2ex/nodes.js +0 -26
  687. package/clis/v2ex/notifications.js +0 -72
  688. package/clis/v2ex/replies.js +0 -27
  689. package/clis/v2ex/topic.js +0 -31
  690. package/clis/v2ex/user.js +0 -34
  691. package/clis/wanfang/search.js +0 -66
  692. package/clis/wanfang/search.test.js +0 -23
  693. package/clis/wechat-channels/auth.js +0 -62
  694. package/clis/wechat-channels/publish.js +0 -732
  695. package/clis/wechat-channels/publish.test.js +0 -144
  696. package/clis/weibo/auth.js +0 -53
  697. package/clis/weibo/comments.js +0 -53
  698. package/clis/weibo/delete.js +0 -172
  699. package/clis/weibo/delete.test.js +0 -94
  700. package/clis/weibo/envelope.test.js +0 -85
  701. package/clis/weibo/favorites.js +0 -170
  702. package/clis/weibo/favorites.test.js +0 -114
  703. package/clis/weibo/feed.js +0 -69
  704. package/clis/weibo/hot.js +0 -39
  705. package/clis/weibo/me.js +0 -75
  706. package/clis/weibo/post.js +0 -75
  707. package/clis/weibo/publish.js +0 -306
  708. package/clis/weibo/publish.test.js +0 -192
  709. package/clis/weibo/search.js +0 -80
  710. package/clis/weibo/user-posts.js +0 -234
  711. package/clis/weibo/user-posts.test.js +0 -92
  712. package/clis/weibo/user.js +0 -63
  713. package/clis/weibo/utils.js +0 -59
  714. package/clis/weibo/utils.test.js +0 -36
  715. package/clis/weixin/create-draft.js +0 -226
  716. package/clis/weixin/download.js +0 -371
  717. package/clis/weixin/download.test.js +0 -106
  718. package/clis/weixin/drafts.js +0 -66
  719. package/clis/weixin/drafts.test.js +0 -69
  720. package/clis/weixin/search.js +0 -157
  721. package/clis/weixin/search.test.js +0 -227
  722. package/clis/weread/ai-outline.js +0 -171
  723. package/clis/weread/ai-outline.test.js +0 -83
  724. package/clis/weread/auth.js +0 -59
  725. package/clis/weread/book-search.js +0 -438
  726. package/clis/weread/book-search.test.js +0 -242
  727. package/clis/weread/book.js +0 -233
  728. package/clis/weread/commands.test.js +0 -398
  729. package/clis/weread/highlights.js +0 -24
  730. package/clis/weread/notebooks.js +0 -22
  731. package/clis/weread/notes.js +0 -30
  732. package/clis/weread/private-api-regression.test.js +0 -369
  733. package/clis/weread/ranking.js +0 -29
  734. package/clis/weread/search-regression.test.js +0 -494
  735. package/clis/weread/search.js +0 -186
  736. package/clis/weread/shelf.js +0 -66
  737. package/clis/weread/utils.js +0 -321
  738. package/clis/weread/utils.test.js +0 -128
  739. package/clis/weread-official/book.js +0 -135
  740. package/clis/weread-official/commands.test.js +0 -385
  741. package/clis/weread-official/discover.js +0 -107
  742. package/clis/weread-official/list-apis.js +0 -95
  743. package/clis/weread-official/notes.js +0 -171
  744. package/clis/weread-official/readdata.js +0 -158
  745. package/clis/weread-official/review.js +0 -93
  746. package/clis/weread-official/search.js +0 -106
  747. package/clis/weread-official/shelf.js +0 -97
  748. package/clis/weread-official/utils.js +0 -293
  749. package/clis/weread-official/utils.test.js +0 -242
  750. package/clis/xianyu/auth.js +0 -68
  751. package/clis/xianyu/chat.js +0 -74
  752. package/clis/xianyu/chat.test.js +0 -84
  753. package/clis/xianyu/im.js +0 -322
  754. package/clis/xianyu/im.test.js +0 -253
  755. package/clis/xianyu/inbox.js +0 -96
  756. package/clis/xianyu/item.js +0 -153
  757. package/clis/xianyu/item.test.js +0 -56
  758. package/clis/xianyu/messages.js +0 -91
  759. package/clis/xianyu/publish.js +0 -485
  760. package/clis/xianyu/publish.test.js +0 -220
  761. package/clis/xianyu/reply.js +0 -82
  762. package/clis/xianyu/search.js +0 -262
  763. package/clis/xianyu/search.test.js +0 -104
  764. package/clis/xianyu/utils.js +0 -8
  765. package/clis/xiaoe/auth.js +0 -55
  766. package/clis/xiaoe/catalog.js +0 -227
  767. package/clis/xiaoe/content.js +0 -175
  768. package/clis/xiaoe/courses.js +0 -127
  769. package/clis/xiaoe/detail.js +0 -36
  770. package/clis/xiaoe/play-url.js +0 -121
  771. package/clis/xiaoe/xiaoe.test.js +0 -486
  772. package/clis/xiaohongshu/ask.js +0 -426
  773. package/clis/xiaohongshu/ask.test.js +0 -271
  774. package/clis/xiaohongshu/auth.js +0 -53
  775. package/clis/xiaohongshu/collection-helpers.js +0 -283
  776. package/clis/xiaohongshu/collection-helpers.test.js +0 -125
  777. package/clis/xiaohongshu/comments.js +0 -228
  778. package/clis/xiaohongshu/comments.test.js +0 -320
  779. package/clis/xiaohongshu/creator-note-detail.js +0 -482
  780. package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
  781. package/clis/xiaohongshu/creator-notes-summary.js +0 -98
  782. package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
  783. package/clis/xiaohongshu/creator-notes.js +0 -479
  784. package/clis/xiaohongshu/creator-notes.test.js +0 -281
  785. package/clis/xiaohongshu/creator-profile.js +0 -55
  786. package/clis/xiaohongshu/creator-stats.js +0 -76
  787. package/clis/xiaohongshu/creator-stats.test.js +0 -24
  788. package/clis/xiaohongshu/delete-note.js +0 -260
  789. package/clis/xiaohongshu/delete-note.test.js +0 -172
  790. package/clis/xiaohongshu/download.js +0 -249
  791. package/clis/xiaohongshu/download.test.js +0 -339
  792. package/clis/xiaohongshu/draft-clear.js +0 -91
  793. package/clis/xiaohongshu/draft-delete.js +0 -103
  794. package/clis/xiaohongshu/draft-open.js +0 -43
  795. package/clis/xiaohongshu/draft-utils.js +0 -142
  796. package/clis/xiaohongshu/drafts.js +0 -28
  797. package/clis/xiaohongshu/drafts.test.js +0 -172
  798. package/clis/xiaohongshu/feed.js +0 -163
  799. package/clis/xiaohongshu/feed.test.js +0 -126
  800. package/clis/xiaohongshu/follow.js +0 -226
  801. package/clis/xiaohongshu/follow.test.js +0 -211
  802. package/clis/xiaohongshu/liked.js +0 -29
  803. package/clis/xiaohongshu/liked.test.js +0 -82
  804. package/clis/xiaohongshu/navigation.test.js +0 -38
  805. package/clis/xiaohongshu/note-helpers.js +0 -69
  806. package/clis/xiaohongshu/note.js +0 -104
  807. package/clis/xiaohongshu/note.test.js +0 -249
  808. package/clis/xiaohongshu/notifications.js +0 -46
  809. package/clis/xiaohongshu/publish.js +0 -1423
  810. package/clis/xiaohongshu/publish.test.js +0 -1141
  811. package/clis/xiaohongshu/saved.js +0 -29
  812. package/clis/xiaohongshu/saved.test.js +0 -143
  813. package/clis/xiaohongshu/search.js +0 -330
  814. package/clis/xiaohongshu/search.test.js +0 -325
  815. package/clis/xiaohongshu/unfollow.js +0 -285
  816. package/clis/xiaohongshu/user-helpers.js +0 -78
  817. package/clis/xiaohongshu/user-helpers.test.js +0 -160
  818. package/clis/xiaohongshu/user.js +0 -140
  819. package/clis/xiaohongshu/user.test.js +0 -141
  820. package/clis/xiaoyuzhou/auth.js +0 -303
  821. package/clis/xiaoyuzhou/auth.test.js +0 -124
  822. package/clis/xiaoyuzhou/download.js +0 -54
  823. package/clis/xiaoyuzhou/download.test.js +0 -135
  824. package/clis/xiaoyuzhou/episode.js +0 -34
  825. package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
  826. package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
  827. package/clis/xiaoyuzhou/podcast.js +0 -33
  828. package/clis/xiaoyuzhou/transcript.js +0 -77
  829. package/clis/xiaoyuzhou/transcript.test.js +0 -195
  830. package/clis/xiaoyuzhou/utils.js +0 -15
  831. package/clis/xiaoyuzhou/utils.test.js +0 -39
  832. package/clis/xueqiu/auth.js +0 -63
  833. package/clis/xueqiu/comments.js +0 -355
  834. package/clis/xueqiu/comments.test.js +0 -696
  835. package/clis/xueqiu/danjuan-utils.js +0 -126
  836. package/clis/xueqiu/danjuan-utils.test.js +0 -41
  837. package/clis/xueqiu/earnings-date.js +0 -45
  838. package/clis/xueqiu/feed.js +0 -39
  839. package/clis/xueqiu/fund-holdings.js +0 -29
  840. package/clis/xueqiu/fund-snapshot.js +0 -26
  841. package/clis/xueqiu/groups.js +0 -23
  842. package/clis/xueqiu/hot-stock.js +0 -32
  843. package/clis/xueqiu/hot.js +0 -37
  844. package/clis/xueqiu/kline.js +0 -44
  845. package/clis/xueqiu/search.js +0 -37
  846. package/clis/xueqiu/stock.js +0 -65
  847. package/clis/xueqiu/utils.js +0 -48
  848. package/clis/xueqiu/utils.test.js +0 -26
  849. package/clis/xueqiu/watchlist.js +0 -37
  850. package/clis/youdao/note.js +0 -258
  851. package/clis/youdao/note.test.js +0 -99
  852. package/clis/yuanbao/ask.js +0 -362
  853. package/clis/yuanbao/ask.test.js +0 -124
  854. package/clis/yuanbao/auth.js +0 -59
  855. package/clis/yuanbao/detail.js +0 -65
  856. package/clis/yuanbao/history.js +0 -51
  857. package/clis/yuanbao/new.js +0 -72
  858. package/clis/yuanbao/new.test.js +0 -30
  859. package/clis/yuanbao/read.js +0 -38
  860. package/clis/yuanbao/send.js +0 -57
  861. package/clis/yuanbao/shared.js +0 -341
  862. package/clis/yuanbao/shared.test.js +0 -80
  863. package/clis/yuanbao/status.js +0 -44
  864. package/clis/zhihu/answer-comments.js +0 -280
  865. package/clis/zhihu/answer-comments.test.js +0 -287
  866. package/clis/zhihu/answer-detail.js +0 -216
  867. package/clis/zhihu/answer-detail.test.js +0 -338
  868. package/clis/zhihu/answer.js +0 -54
  869. package/clis/zhihu/answer.test.js +0 -54
  870. package/clis/zhihu/auth.js +0 -59
  871. package/clis/zhihu/collection.js +0 -199
  872. package/clis/zhihu/collection.test.js +0 -337
  873. package/clis/zhihu/collections.js +0 -128
  874. package/clis/zhihu/collections.test.js +0 -182
  875. package/clis/zhihu/comment.js +0 -55
  876. package/clis/zhihu/comment.test.js +0 -50
  877. package/clis/zhihu/download.js +0 -80
  878. package/clis/zhihu/download.test.js +0 -12
  879. package/clis/zhihu/favorite.js +0 -87
  880. package/clis/zhihu/favorite.test.js +0 -59
  881. package/clis/zhihu/follow.js +0 -50
  882. package/clis/zhihu/follow.test.js +0 -42
  883. package/clis/zhihu/followers.js +0 -40
  884. package/clis/zhihu/followers.test.js +0 -42
  885. package/clis/zhihu/following.js +0 -40
  886. package/clis/zhihu/following.test.js +0 -44
  887. package/clis/zhihu/hot.js +0 -44
  888. package/clis/zhihu/like.js +0 -47
  889. package/clis/zhihu/like.test.js +0 -41
  890. package/clis/zhihu/paginate.js +0 -128
  891. package/clis/zhihu/pins.js +0 -41
  892. package/clis/zhihu/pins.test.js +0 -44
  893. package/clis/zhihu/question.js +0 -113
  894. package/clis/zhihu/question.test.js +0 -251
  895. package/clis/zhihu/recommend.js +0 -103
  896. package/clis/zhihu/recommend.test.js +0 -143
  897. package/clis/zhihu/search.js +0 -206
  898. package/clis/zhihu/search.test.js +0 -198
  899. package/clis/zhihu/target.js +0 -91
  900. package/clis/zhihu/target.test.js +0 -77
  901. package/clis/zhihu/text.js +0 -29
  902. package/clis/zhihu/text.test.js +0 -24
  903. package/clis/zhihu/user-answers.js +0 -41
  904. package/clis/zhihu/user-answers.test.js +0 -69
  905. package/clis/zhihu/user-arg.js +0 -34
  906. package/clis/zhihu/user-articles.js +0 -40
  907. package/clis/zhihu/user-articles.test.js +0 -44
  908. package/clis/zhihu/user.js +0 -59
  909. package/clis/zhihu/user.test.js +0 -73
  910. package/clis/zhihu/write-shared.js +0 -228
  911. package/clis/zhihu/write-shared.test.js +0 -176
  912. package/clis/zsxq/auth.js +0 -68
  913. package/clis/zsxq/dynamics.js +0 -48
  914. package/clis/zsxq/groups.js +0 -33
  915. package/clis/zsxq/search.js +0 -44
  916. package/clis/zsxq/search.test.js +0 -24
  917. package/clis/zsxq/topic.js +0 -50
  918. package/clis/zsxq/topic.test.js +0 -30
  919. package/clis/zsxq/topics.js +0 -26
  920. package/clis/zsxq/topics.test.js +0 -24
  921. package/clis/zsxq/utils.js +0 -233
  922. package/clis/zsxq/utils.test.js +0 -31
  923. package/dist/src/weixin-download.test.js +0 -45
  924. package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
  925. package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
  926. package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
  927. package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
  928. /package/{clis/douyin/_shared/types.js → dist/src/generate-release-notes-cli.test.d.ts} +0 -0
  929. /package/dist/src/{weixin-download.test.d.ts → release-notes.test.d.ts} +0 -0
@@ -100,10 +100,10 @@ describe('createProgram root help descriptions', () => {
100
100
  registry.clear();
101
101
  try {
102
102
  cli({
103
- site: 'bilibili',
103
+ site: 'reddit',
104
104
  name: 'hot',
105
105
  access: 'read',
106
- description: 'Bilibili hot videos',
106
+ description: 'Reddit hot posts',
107
107
  strategy: Strategy.PUBLIC,
108
108
  browser: false,
109
109
  });
@@ -118,9 +118,9 @@ describe('createProgram root help descriptions', () => {
118
118
  const program = createProgram('', '');
119
119
  const help = program.helpInformation();
120
120
  expect(help).toContain('Site adapters (2):');
121
- expect(help).toContain('bilibili, youtube');
121
+ expect(help).toContain('reddit, youtube');
122
122
  expect(help).toContain("webcmd <site> --help -f yaml");
123
- expect(help).not.toMatch(/\n bilibili\s+hot/);
123
+ expect(help).not.toMatch(/\n reddit\s+hot/);
124
124
  expect(help).not.toMatch(/\n youtube\s+search/);
125
125
  }
126
126
  finally {
@@ -135,11 +135,11 @@ describe('createProgram root help descriptions', () => {
135
135
  registry.clear();
136
136
  try {
137
137
  cli({
138
- site: 'bilibili',
139
- name: 'hot',
138
+ site: 'youtube',
139
+ name: 'search',
140
140
  access: 'read',
141
- description: 'Bilibili hot videos',
142
- domain: 'www.bilibili.com',
141
+ description: 'Search YouTube',
142
+ domain: 'www.youtube.com',
143
143
  strategy: Strategy.PUBLIC,
144
144
  browser: false,
145
145
  });
@@ -158,7 +158,7 @@ describe('createProgram root help descriptions', () => {
158
158
  expect(help).toContain('App adapters (1):');
159
159
  expect(help).toMatch(/App adapters \(1\):\n {2}chatwise/);
160
160
  expect(help).toContain('Site adapters (1):');
161
- expect(help).toMatch(/Site adapters \(1\):\n {2}bilibili/);
161
+ expect(help).toMatch(/Site adapters \(1\):\n {2}youtube/);
162
162
  // App adapters appear before Site adapters (External CLIs are absent here)
163
163
  expect(help.indexOf('App adapters')).toBeLessThan(help.indexOf('Site adapters'));
164
164
  }
@@ -172,7 +172,7 @@ describe('createProgram root help descriptions', () => {
172
172
  expect(classifyAdapter('localhost')).toBe('app');
173
173
  expect(classifyAdapter('127.0.0.1')).toBe('app');
174
174
  expect(classifyAdapter('::1')).toBe('app');
175
- expect(classifyAdapter('www.bilibili.com')).toBe('site');
175
+ expect(classifyAdapter('www.youtube.com')).toBe('site');
176
176
  });
177
177
  it('splits list table output into App and Site sections without changing per-site rows', async () => {
178
178
  const registry = getRegistry();
@@ -200,11 +200,11 @@ describe('createProgram root help descriptions', () => {
200
200
  browser: true,
201
201
  });
202
202
  cli({
203
- site: 'bilibili',
204
- name: 'hot',
203
+ site: 'youtube',
204
+ name: 'search',
205
205
  access: 'read',
206
- description: 'Bilibili hot videos',
207
- domain: 'www.bilibili.com',
206
+ description: 'Search YouTube',
207
+ domain: 'www.youtube.com',
208
208
  strategy: Strategy.PUBLIC,
209
209
  browser: false,
210
210
  });
@@ -216,7 +216,7 @@ describe('createProgram root help descriptions', () => {
216
216
  expect(output.indexOf('App adapters')).toBeLessThan(output.indexOf('Site adapters'));
217
217
  expect(output).toMatch(/App adapters[\s\S]*antigravity[\s\S]*history \[ui\] — Read Antigravity history/);
218
218
  expect(output).toMatch(/App adapters[\s\S]*chatwise[\s\S]*ask \[ui\] — Ask Chatwise desktop app/);
219
- expect(output).toMatch(/Site adapters[\s\S]*bilibili[\s\S]*hot \[public\] — Bilibili hot videos/);
219
+ expect(output).toMatch(/Site adapters[\s\S]*youtube[\s\S]*search \[public\] — Search YouTube/);
220
220
  expect(output).toContain('3 built-in commands across 2 apps + 1 sites,');
221
221
  }
222
222
  finally {
@@ -235,11 +235,11 @@ describe('createProgram root help descriptions', () => {
235
235
  registry.clear();
236
236
  try {
237
237
  cli({
238
- site: 'bilibili',
239
- name: 'hot',
238
+ site: 'youtube',
239
+ name: 'search',
240
240
  access: 'read',
241
- description: 'Bilibili hot videos',
242
- domain: 'www.bilibili.com',
241
+ description: 'Search YouTube',
242
+ domain: 'www.youtube.com',
243
243
  strategy: Strategy.PUBLIC,
244
244
  browser: false,
245
245
  columns: ['title', 'url'],
@@ -257,9 +257,9 @@ describe('createProgram root help descriptions', () => {
257
257
  const rows = JSON.parse(jsonOutput);
258
258
  expect(rows).toMatchObject([
259
259
  {
260
- site: 'bilibili',
261
- name: 'hot',
262
- domain: 'www.bilibili.com',
260
+ site: 'youtube',
261
+ name: 'search',
262
+ domain: 'www.youtube.com',
263
263
  columns: ['title', 'url'],
264
264
  },
265
265
  ]);
@@ -281,11 +281,11 @@ describe('createProgram root help descriptions', () => {
281
281
  registry.clear();
282
282
  try {
283
283
  cli({
284
- site: 'bilibili',
285
- name: 'hot',
284
+ site: 'youtube',
285
+ name: 'search',
286
286
  access: 'read',
287
- description: 'Bilibili hot videos',
288
- domain: 'www.bilibili.com',
287
+ description: 'Search YouTube',
288
+ domain: 'www.youtube.com',
289
289
  strategy: Strategy.PUBLIC,
290
290
  browser: false,
291
291
  });
@@ -304,13 +304,13 @@ describe('createProgram root help descriptions', () => {
304
304
  expect(data.app_adapters.count).toBe(1);
305
305
  expect(data.app_adapters.apps).toEqual(['chatwise']);
306
306
  expect(data.site_adapters.count).toBe(1);
307
- expect(data.site_adapters.sites).toEqual(['bilibili']);
307
+ expect(data.site_adapters.sites).toEqual(['youtube']);
308
308
  expect(data.external_clis.count).toBeGreaterThanOrEqual(0);
309
309
  expect(Array.isArray(data.external_clis.clis)).toBe(true);
310
310
  expect(Array.isArray(data.external_clis.display)).toBe(true);
311
311
  // Adapters must NOT leak into the core commands list
312
312
  const commandNames = data.commands.map((cmd) => cmd.name);
313
- expect(commandNames).not.toContain('bilibili');
313
+ expect(commandNames).not.toContain('youtube');
314
314
  expect(commandNames).not.toContain('chatwise');
315
315
  }
316
316
  finally {
@@ -327,10 +327,10 @@ describe('createProgram root help descriptions', () => {
327
327
  registry.clear();
328
328
  try {
329
329
  cli({
330
- site: 'bilibili',
331
- name: 'hot',
330
+ site: 'youtube',
331
+ name: 'search',
332
332
  access: 'read',
333
- description: 'Bilibili hot videos',
333
+ description: 'Search YouTube',
334
334
  strategy: Strategy.PUBLIC,
335
335
  browser: false,
336
336
  });
@@ -338,9 +338,9 @@ describe('createProgram root help descriptions', () => {
338
338
  process.argv = ['node', 'webcmd', '--help', '-f', 'yaml'];
339
339
  const data = yaml.load(program.helpInformation());
340
340
  expect(data.site_adapters.count).toBe(1);
341
- expect(data.site_adapters.sites).toEqual(['bilibili']);
341
+ expect(data.site_adapters.sites).toEqual(['youtube']);
342
342
  expect(data.commands.map((cmd) => cmd.name)).toContain('list');
343
- expect(data.commands.map((cmd) => cmd.name)).not.toContain('bilibili');
343
+ expect(data.commands.map((cmd) => cmd.name)).not.toContain('youtube');
344
344
  }
345
345
  finally {
346
346
  process.argv = argv;
@@ -356,28 +356,28 @@ describe('createProgram root help descriptions', () => {
356
356
  registry.clear();
357
357
  try {
358
358
  cli({
359
- site: 'bilibili',
360
- name: 'hot',
359
+ site: 'youtube',
360
+ name: 'search',
361
361
  access: 'read',
362
- description: 'Bilibili hot videos',
362
+ description: 'Search YouTube',
363
363
  strategy: Strategy.PUBLIC,
364
364
  browser: false,
365
365
  args: [{ name: 'limit', type: 'int', default: 20, help: 'Number of videos' }],
366
366
  columns: ['title', 'url'],
367
367
  });
368
368
  const program = createProgram('', '');
369
- const site = program.commands.find(cmd => cmd.name() === 'bilibili');
369
+ const site = program.commands.find(cmd => cmd.name() === 'youtube');
370
370
  expect(site).toBeTruthy();
371
- process.argv = ['node', 'webcmd', 'bilibili', '--help', '-f', 'yaml'];
371
+ process.argv = ['node', 'webcmd', 'youtube', '--help', '-f', 'yaml'];
372
372
  const data = yaml.load(site.helpInformation());
373
- expect(data.site).toBe('bilibili');
373
+ expect(data.site).toBe('youtube');
374
374
  expect(data.commands).toMatchObject([
375
375
  {
376
- name: 'hot',
376
+ name: 'search',
377
377
  access: 'read',
378
- description: 'Bilibili hot videos',
378
+ description: 'Search YouTube',
379
379
  browser: false,
380
- example: 'webcmd bilibili hot -f yaml',
380
+ example: 'webcmd youtube search -f yaml',
381
381
  command_options: [{ name: 'limit', type: 'int', default: 20 }],
382
382
  columns: ['title', 'url'],
383
383
  },
@@ -397,31 +397,31 @@ describe('createProgram root help descriptions', () => {
397
397
  registry.clear();
398
398
  try {
399
399
  cli({
400
- site: 'bilibili',
401
- name: 'hot',
400
+ site: 'youtube',
401
+ name: 'search',
402
402
  access: 'read',
403
- description: 'Bilibili hot videos',
403
+ description: 'Search YouTube',
404
404
  strategy: Strategy.PUBLIC,
405
405
  browser: false,
406
406
  args: [{ name: 'limit', type: 'int', default: 20, help: 'Number of videos' }],
407
407
  });
408
408
  cli({
409
- site: 'bilibili',
409
+ site: 'youtube',
410
410
  name: 'video',
411
411
  access: 'read',
412
412
  description: 'Read one video',
413
- domain: 'www.bilibili.com',
413
+ domain: 'www.youtube.com',
414
414
  strategy: Strategy.PUBLIC,
415
415
  browser: true,
416
416
  args: [{ name: 'bvid', positional: true, required: true, help: 'Video id' }],
417
417
  });
418
418
  const program = createProgram('', '');
419
- const site = program.commands.find(cmd => cmd.name() === 'bilibili');
419
+ const site = program.commands.find(cmd => cmd.name() === 'youtube');
420
420
  expect(site).toBeTruthy();
421
421
  const help = site.helpInformation();
422
- expect(help).toContain('hot [options] [read] Bilibili hot videos');
423
- expect(help).toContain('video <bvid> [read] Read one video');
424
- expect(help).toContain('hot [options]');
422
+ expect(help).toContain('search [options] [read] Search YouTube');
423
+ expect(help).toContain('video <bvid> [read] Read one video');
424
+ expect(help).toContain('search [options]');
425
425
  expect(help).not.toContain('video <bvid> [options]');
426
426
  expect(help).not.toContain('\nOptions:');
427
427
  expect(help).toContain('Common options:');
@@ -442,12 +442,12 @@ describe('createProgram root help descriptions', () => {
442
442
  registry.clear();
443
443
  try {
444
444
  cli({
445
- site: 'bilibili',
445
+ site: 'youtube',
446
446
  name: 'video',
447
447
  access: 'read',
448
448
  description: 'Read one video',
449
449
  strategy: Strategy.PUBLIC,
450
- domain: 'www.bilibili.com',
450
+ domain: 'www.youtube.com',
451
451
  browser: true,
452
452
  args: [
453
453
  { name: 'bvid', positional: true, required: true, help: 'Video id' },
@@ -456,14 +456,14 @@ describe('createProgram root help descriptions', () => {
456
456
  columns: ['title', 'url'],
457
457
  });
458
458
  const program = createProgram('', '');
459
- const site = program.commands.find(cmd => cmd.name() === 'bilibili');
459
+ const site = program.commands.find(cmd => cmd.name() === 'youtube');
460
460
  const command = site.commands.find(cmd => cmd.name() === 'video');
461
461
  expect(command).toBeTruthy();
462
- process.argv = ['node', 'webcmd', 'bilibili', 'video', '--help', '-f', 'yaml'];
462
+ process.argv = ['node', 'webcmd', 'youtube', 'video', '--help', '-f', 'yaml'];
463
463
  const data = yaml.load(command.helpInformation());
464
- expect(data.usage).toBe('webcmd bilibili video <bvid> [options]');
464
+ expect(data.usage).toBe('webcmd youtube video <bvid> [options]');
465
465
  expect(data.browser).toBe(true);
466
- expect(data.domain).toBe('www.bilibili.com');
466
+ expect(data.domain).toBe('www.youtube.com');
467
467
  expect(data.positionals).toMatchObject([{ name: 'bvid', positional: true, required: true }]);
468
468
  expect(data.command_options).toMatchObject([{ name: 'with-comments', default: false }]);
469
469
  expect(data.common_options.map((option) => option.name)).toEqual(['format', 'trace', 'verbose', 'help']);
@@ -251,12 +251,12 @@ describe('commanderAdapter default formats', () => {
251
251
  });
252
252
  describe('commanderAdapter error envelope output', () => {
253
253
  const cmd = {
254
- site: 'xiaohongshu',
255
- name: 'note', access: 'read',
256
- description: 'Read one note',
254
+ site: 'github',
255
+ name: 'issue', access: 'read',
256
+ description: 'Read one issue',
257
257
  browser: false,
258
258
  args: [
259
- { name: 'note-id', positional: true, required: true, help: 'Note ID' },
259
+ { name: 'issue-id', positional: true, required: true, help: 'Issue ID' },
260
260
  ],
261
261
  func: vi.fn(),
262
262
  };
@@ -268,26 +268,26 @@ describe('commanderAdapter error envelope output', () => {
268
268
  });
269
269
  it('outputs YAML error envelope with adapter hint to stderr', async () => {
270
270
  const program = new Command();
271
- const siteCmd = program.command('xiaohongshu');
271
+ const siteCmd = program.command('github');
272
272
  registerCommandToProgram(siteCmd, cmd);
273
273
  const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
274
- mockExecuteCommand.mockRejectedValueOnce(new EmptyResultError('xiaohongshu/note', 'Pass the full search_result URL with xsec_token instead of a bare note ID.'));
275
- await program.parseAsync(['node', 'webcmd', 'xiaohongshu', 'note', '69ca3927000000001a020fd5']);
274
+ mockExecuteCommand.mockRejectedValueOnce(new EmptyResultError('github/issue', 'Pass the full issue URL instead of a bare issue number.'));
275
+ await program.parseAsync(['node', 'webcmd', 'github', 'issue', '12345']);
276
276
  const output = stderrSpy.mock.calls.map(c => String(c[0])).join('');
277
277
  expect(output).toContain('ok: false');
278
278
  expect(output).toContain('code: EMPTY_RESULT');
279
- expect(output).toContain('xsec_token');
279
+ expect(output).toContain('full issue URL');
280
280
  expect(output).toContain('--trace=retain-on-failure');
281
- expect(output).toContain('webcmd xiaohongshu note --trace retain-on-failure');
281
+ expect(output).toContain('webcmd github issue --trace retain-on-failure');
282
282
  stderrSpy.mockRestore();
283
283
  });
284
284
  it('outputs YAML error envelope for selector errors', async () => {
285
285
  const program = new Command();
286
- const siteCmd = program.command('xiaohongshu');
286
+ const siteCmd = program.command('github');
287
287
  registerCommandToProgram(siteCmd, cmd);
288
288
  const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
289
289
  mockExecuteCommand.mockRejectedValueOnce(selectorError('.note-title', 'The note title selector no longer matches the current page.'));
290
- await program.parseAsync(['node', 'webcmd', 'xiaohongshu', 'note', '69ca3927000000001a020fd5']);
290
+ await program.parseAsync(['node', 'webcmd', 'github', 'issue', '12345']);
291
291
  const output = stderrSpy.mock.calls.map(c => String(c[0])).join('');
292
292
  expect(output).toContain('ok: false');
293
293
  expect(output).toContain('code: SELECTOR');
@@ -297,16 +297,16 @@ describe('commanderAdapter error envelope output', () => {
297
297
  });
298
298
  it('does not add an AutoFix rerun hint when trace is already enabled', async () => {
299
299
  const program = new Command();
300
- const siteCmd = program.command('xiaohongshu');
300
+ const siteCmd = program.command('github');
301
301
  registerCommandToProgram(siteCmd, cmd);
302
302
  const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
303
303
  mockExecuteCommand.mockRejectedValueOnce(selectorError('.note-title'));
304
304
  await program.parseAsync([
305
305
  'node',
306
306
  'webcmd',
307
- 'xiaohongshu',
308
- 'note',
309
- '69ca3927000000001a020fd5',
307
+ 'github',
308
+ 'issue',
309
+ '12345',
310
310
  '--trace',
311
311
  'retain-on-failure',
312
312
  ]);
@@ -317,7 +317,7 @@ describe('commanderAdapter error envelope output', () => {
317
317
  });
318
318
  it('includes trace metadata from the error envelope when execution attached it', async () => {
319
319
  const program = new Command();
320
- const siteCmd = program.command('xiaohongshu');
320
+ const siteCmd = program.command('github');
321
321
  registerCommandToProgram(siteCmd, cmd);
322
322
  const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
323
323
  const err = selectorError('.note-title');
@@ -336,9 +336,9 @@ describe('commanderAdapter error envelope output', () => {
336
336
  await program.parseAsync([
337
337
  'node',
338
338
  'webcmd',
339
- 'xiaohongshu',
340
- 'note',
341
- '69ca3927000000001a020fd5',
339
+ 'github',
340
+ 'issue',
341
+ '12345',
342
342
  '--trace',
343
343
  'retain-on-failure',
344
344
  ]);
@@ -244,7 +244,7 @@ function auditTypedErrorPatterns(command, source, sourcePath, projectRoot) {
244
244
  details: { text: line.trim() },
245
245
  });
246
246
  }
247
- const sentinel = /(?:\?\?|\|\|)\s*(['"])(unknown|Unknown|UNKNOWN|N\/A|n\/a|NA|未知|-)\1/.exec(line);
247
+ const sentinel = /(?:\?\?|\|\|)\s*(['"])(unknown|Unknown|UNKNOWN|N\/A|n\/a|NA|-)\1/.exec(line);
248
248
  if (sentinel) {
249
249
  if (!isThrowMessageLine(line)) {
250
250
  violations.push({
@@ -1,6 +1,6 @@
1
1
  import { createServer } from 'node:http';
2
2
  import { DAEMON_HEADER_NAME, DEFAULT_DAEMON_PORT } from '../constants.js';
3
- import { getResponseCorsHeaders } from '../daemon-utils.js';
3
+ import { buildCommandTimeoutFailure, getResponseCorsHeaders } from '../daemon-utils.js';
4
4
  const MAX_BODY = 1024 * 1024;
5
5
  const LOG_BUFFER_SIZE = 200;
6
6
  function readBody(req) {
@@ -36,7 +36,7 @@ export function createDaemonServer(provider, opts) {
36
36
  const port = opts.port ?? DEFAULT_DAEMON_PORT;
37
37
  const host = opts.host ?? '127.0.0.1';
38
38
  const logBuffer = [];
39
- const pending = new Set();
39
+ const pending = new Map();
40
40
  let shutdownStarted = false;
41
41
  function pushLog(level, msg) {
42
42
  logBuffer.push({ level, msg, ts: Date.now() });
@@ -115,35 +115,40 @@ export function createDaemonServer(provider, opts) {
115
115
  jsonResponse(res, 400, { ok: false, error: 'Missing command id' });
116
116
  return;
117
117
  }
118
- if (pending.has(body.id)) {
119
- jsonResponse(res, 409, { id: body.id, ok: false, error: 'Duplicate command id already pending; retry' });
118
+ const existing = pending.get(body.id);
119
+ if (existing) {
120
+ const result = await existing;
121
+ jsonResponse(res, result.ok ? 200 : result.errorCode === 'command_result_unknown' ? 408 : 400, result);
120
122
  return;
121
123
  }
122
- pending.add(body.id);
123
- const timeoutMs = typeof body.timeout === 'number' && body.timeout > 0 ? body.timeout * 1000 : 120_000;
124
+ const timeoutMs = typeof body.deadlineAt === 'number' && body.deadlineAt > 0
125
+ ? Math.max(1000, body.deadlineAt - Date.now())
126
+ : (typeof body.timeout === 'number' && body.timeout > 0 ? body.timeout * 1000 : 120_000);
124
127
  let timeoutId;
125
- try {
126
- const result = await Promise.race([
127
- provider.dispatch(body),
128
- new Promise((resolve) => {
129
- timeoutId = setTimeout(() => resolve({
128
+ const commandPromise = Promise.race([
129
+ provider.dispatch(body),
130
+ new Promise((resolve) => {
131
+ timeoutId = setTimeout(() => {
132
+ const failure = buildCommandTimeoutFailure(body.action, timeoutMs);
133
+ resolve({
130
134
  id: body.id,
131
135
  ok: false,
132
- errorCode: 'command_result_unknown',
133
- error: `Command timeout (${timeoutMs / 1000}s)`,
134
- errorHint: 'Inspect the browser state before retrying non-idempotent commands.',
135
- }), timeoutMs);
136
- }),
137
- ]);
138
- if (!result.ok)
139
- pushLog('warn', `Command ${body.id} failed: ${result.error ?? result.errorCode ?? 'unknown error'}`);
140
- jsonResponse(res, result.ok ? 200 : result.errorCode === 'command_result_unknown' ? 408 : 400, result);
141
- }
142
- finally {
136
+ errorCode: failure.errorCode,
137
+ error: failure.message,
138
+ errorHint: failure.errorHint,
139
+ });
140
+ }, timeoutMs);
141
+ }),
142
+ ]).finally(() => {
143
143
  if (timeoutId)
144
144
  clearTimeout(timeoutId);
145
145
  pending.delete(body.id);
146
- }
146
+ });
147
+ pending.set(body.id, commandPromise);
148
+ const result = await commandPromise;
149
+ if (!result.ok)
150
+ pushLog('warn', `Command ${body.id} failed: ${result.error ?? result.errorCode ?? 'unknown error'}`);
151
+ jsonResponse(res, result.ok ? 200 : result.errorCode === 'command_result_unknown' ? 408 : 400, result);
147
152
  }
148
153
  catch (err) {
149
154
  jsonResponse(res, 400, { ok: false, error: err instanceof Error ? err.message : 'Invalid request' });
@@ -93,6 +93,58 @@ describe('createDaemonServer', () => {
93
93
  clearTimeoutSpy.mockRestore();
94
94
  }
95
95
  });
96
+ it('uses deadlineAt as the command timeout budget when present', async () => {
97
+ const now = 1_763_000_000_000;
98
+ const dateSpy = vi.spyOn(Date, 'now').mockReturnValue(now);
99
+ const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout');
100
+ try {
101
+ const { baseUrl } = await start();
102
+ const res = await fetch(`${baseUrl}/command`, {
103
+ method: 'POST',
104
+ headers: { [DAEMON_HEADER_NAME]: '1', 'Content-Type': 'application/json' },
105
+ body: JSON.stringify({
106
+ id: 'deadline-command',
107
+ action: 'exec',
108
+ session: 'work',
109
+ timeout: 120,
110
+ deadlineAt: now + 12_345,
111
+ }),
112
+ });
113
+ expect(res.status).toBe(200);
114
+ await expect(res.json()).resolves.toMatchObject({
115
+ id: 'deadline-command',
116
+ ok: true,
117
+ });
118
+ expect(setTimeoutSpy.mock.calls.some(([, delay]) => delay === 12_345)).toBe(true);
119
+ }
120
+ finally {
121
+ setTimeoutSpy.mockRestore();
122
+ dateSpy.mockRestore();
123
+ }
124
+ });
125
+ it('attaches duplicate command ids to the in-flight dispatch instead of re-dispatching', async () => {
126
+ const provider = new FakeProvider();
127
+ provider.delayMs = 50;
128
+ const { baseUrl } = await start(provider);
129
+ const body = JSON.stringify({ id: 'same-id', action: 'exec', session: 'work', code: '1' });
130
+ const [first, second] = await Promise.all([
131
+ fetch(`${baseUrl}/command`, {
132
+ method: 'POST',
133
+ headers: { [DAEMON_HEADER_NAME]: '1', 'Content-Type': 'application/json' },
134
+ body,
135
+ }),
136
+ fetch(`${baseUrl}/command`, {
137
+ method: 'POST',
138
+ headers: { [DAEMON_HEADER_NAME]: '1', 'Content-Type': 'application/json' },
139
+ body,
140
+ }),
141
+ ]);
142
+ expect(first.status).toBe(200);
143
+ expect(second.status).toBe(200);
144
+ await expect(first.json()).resolves.toMatchObject({ id: 'same-id', ok: true });
145
+ await expect(second.json()).resolves.toMatchObject({ id: 'same-id', ok: true });
146
+ expect(provider.commands).toHaveLength(1);
147
+ });
96
148
  it('requires X-Webcmd on non-ping endpoints', async () => {
97
149
  const { baseUrl } = await start();
98
150
  const res = await fetch(`${baseUrl}/status`);
@@ -14,5 +14,6 @@ export declare function buildExtensionDisconnectFailure(input: {
14
14
  action: string;
15
15
  dispatched: boolean;
16
16
  }): DaemonFailureContract;
17
+ export declare function buildCommandTimeoutFailure(action: string, timeoutMs: number): DaemonFailureContract;
17
18
  export declare function buildCommandDispatchFailure(contextId: string): DaemonFailureContract;
18
19
  export declare function getResponseCorsHeaders(pathname: string, origin?: string): Record<string, string> | undefined;
@@ -16,6 +16,15 @@ export function buildExtensionDisconnectFailure(input) {
16
16
  }
17
17
  return buildCommandDispatchFailure(input.contextId);
18
18
  }
19
+ export function buildCommandTimeoutFailure(action, timeoutMs) {
20
+ return {
21
+ message: `Browser ${action} command timed out after ${Math.round(timeoutMs / 1000)}s; it may still complete in the browser.`,
22
+ errorCode: COMMAND_RESULT_UNKNOWN_CODE,
23
+ errorHint: COMMAND_RESULT_UNKNOWN_HINT,
24
+ status: 408,
25
+ countAsCommandResultUnknown: true,
26
+ };
27
+ }
19
28
  export function buildCommandDispatchFailure(contextId) {
20
29
  return {
21
30
  message: `Browser profile "${contextId}" disconnected before command dispatch`,
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { COMMAND_RESULT_UNKNOWN_CODE, COMMAND_RESULT_UNKNOWN_HINT, buildCommandDispatchFailure, buildExtensionDisconnectFailure, commandResultUnknownMessage, getResponseCorsHeaders, } from './daemon-utils.js';
2
+ import { COMMAND_RESULT_UNKNOWN_CODE, COMMAND_RESULT_UNKNOWN_HINT, buildCommandDispatchFailure, buildCommandTimeoutFailure, buildExtensionDisconnectFailure, commandResultUnknownMessage, getResponseCorsHeaders, } from './daemon-utils.js';
3
3
  describe('getResponseCorsHeaders', () => {
4
4
  it('allows the packaged runtime origin to read /ping', () => {
5
5
  expect(getResponseCorsHeaders('/ping', 'chrome-extension://abc123')).toEqual({
@@ -57,4 +57,13 @@ describe('daemon command dispatch', () => {
57
57
  countAsCommandResultUnknown: false,
58
58
  });
59
59
  });
60
+ it('classifies command timeouts as command_result_unknown', () => {
61
+ expect(buildCommandTimeoutFailure('exec', 12_345)).toEqual({
62
+ message: 'Browser exec command timed out after 12s; it may still complete in the browser.',
63
+ errorCode: 'command_result_unknown',
64
+ errorHint: COMMAND_RESULT_UNKNOWN_HINT,
65
+ status: 408,
66
+ countAsCommandResultUnknown: true,
67
+ });
68
+ });
60
69
  });
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { DEFAULT_DAEMON_PORT } from './constants.js';
7
7
  import { BrowserBridge } from './browser/index.js';
8
+ import { setDaemonCommandTimeoutSeconds } from './browser/daemon-client.js';
8
9
  import { getDaemonHealth } from './browser/daemon-transport.js';
9
10
  import { getErrorMessage } from './errors.js';
10
11
  import { getRuntimeLabel } from './runtime-detect.js';
@@ -18,10 +19,12 @@ const DOCTOR_SESSION = '__doctor__';
18
19
  */
19
20
  export async function checkConnectivity(opts) {
20
21
  const start = Date.now();
22
+ const timeoutSeconds = opts?.timeout ?? DOCTOR_LIVE_TIMEOUT_SECONDS;
23
+ setDaemonCommandTimeoutSeconds(timeoutSeconds);
21
24
  try {
22
25
  const bridge = new BrowserBridge();
23
26
  const page = await bridge.connect({
24
- timeout: opts?.timeout ?? DOCTOR_LIVE_TIMEOUT_SECONDS,
27
+ timeout: timeoutSeconds,
25
28
  session: DOCTOR_SESSION,
26
29
  surface: 'browser',
27
30
  });
@@ -38,6 +41,9 @@ export async function checkConnectivity(opts) {
38
41
  catch (err) {
39
42
  return { ok: false, error: getErrorMessage(err), durationMs: Date.now() - start };
40
43
  }
44
+ finally {
45
+ setDaemonCommandTimeoutSeconds(null);
46
+ }
41
47
  }
42
48
  export async function runBrowserDoctor(opts = {}) {
43
49
  // Live connectivity check is the core of doctor — it doubles as auto-start
@@ -1,9 +1,10 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- const { mockGetDaemonHealth, mockConnect, mockClose, mockFindShadowedUserAdapters } = vi.hoisted(() => ({
2
+ const { mockGetDaemonHealth, mockConnect, mockClose, mockFindShadowedUserAdapters, mockSetDaemonCommandTimeoutSeconds, } = vi.hoisted(() => ({
3
3
  mockGetDaemonHealth: vi.fn(),
4
4
  mockConnect: vi.fn(),
5
5
  mockClose: vi.fn(),
6
6
  mockFindShadowedUserAdapters: vi.fn(),
7
+ mockSetDaemonCommandTimeoutSeconds: vi.fn(),
7
8
  }));
8
9
  vi.mock('./browser/daemon-transport.js', () => ({
9
10
  getDaemonHealth: mockGetDaemonHealth,
@@ -14,6 +15,9 @@ vi.mock('./browser/index.js', () => ({
14
15
  close = mockClose;
15
16
  },
16
17
  }));
18
+ vi.mock('./browser/daemon-client.js', () => ({
19
+ setDaemonCommandTimeoutSeconds: mockSetDaemonCommandTimeoutSeconds,
20
+ }));
17
21
  vi.mock('./adapter-shadow.js', async () => {
18
22
  const actual = await vi.importActual('./adapter-shadow.js');
19
23
  return {
@@ -27,6 +31,7 @@ describe('doctor report rendering', () => {
27
31
  beforeEach(() => {
28
32
  vi.clearAllMocks();
29
33
  mockFindShadowedUserAdapters.mockReturnValue([]);
34
+ mockSetDaemonCommandTimeoutSeconds.mockClear();
30
35
  // Doctor always runs live connectivity. Tests that want connect to fail override.
31
36
  mockConnect.mockResolvedValue({
32
37
  evaluate: vi.fn().mockResolvedValue(2),
@@ -202,6 +207,8 @@ describe('doctor report rendering', () => {
202
207
  await runBrowserDoctor();
203
208
  expect(timeoutSeen).toBe(8);
204
209
  expect(closeWindow).toHaveBeenCalledTimes(1);
210
+ expect(mockSetDaemonCommandTimeoutSeconds).toHaveBeenNthCalledWith(1, 8);
211
+ expect(mockSetDaemonCommandTimeoutSeconds).toHaveBeenLastCalledWith(null);
205
212
  });
206
213
  it('does not report an issue when the connected Cloak runtime does not report a version', async () => {
207
214
  const status = {