@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.
- package/README.md +183 -218
- package/cli-manifest.json +16247 -34913
- package/clis/_atlassian/shared.js +1 -1
- package/clis/booking/search.js +4 -4
- package/clis/chatgpt/ask.js +2 -2
- package/clis/chatgpt/utils.js +41 -42
- package/clis/chatgpt/utils.test.js +23 -23
- package/clis/chatgpt-app/ax.js +5 -5
- package/clis/chatgpt-app/ax.test.js +8 -8
- package/clis/chatgpt-app/new.js +2 -2
- package/clis/codex/sidebar.js +1 -1
- package/clis/codex/sidebar.test.js +12 -12
- package/clis/coingecko/top.js +3 -3
- package/clis/dblp/dblp.test.js +1 -1
- package/clis/discord-app/search.js +1 -1
- package/clis/discord-app/utils.js +6 -6
- package/clis/facebook/__fixtures__/notifications-page.html +6 -6
- package/clis/facebook/add-friend.js +2 -2
- package/clis/facebook/feed.js +18 -18
- package/clis/facebook/friends.js +4 -4
- package/clis/facebook/groups.js +3 -3
- package/clis/facebook/join-group.js +2 -2
- package/clis/facebook/marketplace-inbox.js +3 -3
- package/clis/facebook/marketplace-listings.js +1 -1
- package/clis/facebook/notifications.js +14 -15
- package/clis/facebook/notifications.test.js +28 -29
- package/clis/gemini/ask.test.js +12 -12
- package/clis/gemini/deep-research-result.js +2 -2
- package/clis/gemini/deep-research-result.test.js +2 -2
- package/clis/gemini/deep-research.js +2 -2
- package/clis/gemini/deep-research.test.js +1 -1
- package/clis/gemini/models.js +11 -11
- package/clis/gemini/models.test.js +1 -1
- package/clis/gemini/reply-state.test.js +89 -89
- package/clis/gemini/utils.js +41 -41
- package/clis/gemini/utils.test.js +30 -30
- package/clis/geogebra/utils.js +1 -1
- package/clis/google-scholar/search.js +3 -3
- package/clis/grok/delete.js +1 -1
- package/clis/grok/export-all.js +2 -2
- package/clis/grok/export.js +2 -2
- package/clis/grok/pin.js +3 -3
- package/clis/grok/utils.js +12 -12
- package/clis/grok/utils.test.js +2 -2
- package/clis/indeed/indeed.test.js +3 -3
- package/clis/indeed/utils.js +1 -1
- package/clis/instagram/post.js +19 -19
- package/clis/instagram/post.test.js +2 -2
- package/clis/instagram/reel.js +6 -6
- package/clis/linkedin/connect.js +3 -3
- package/clis/linkedin/people-search.js +4 -4
- package/clis/linkedin/profile-experience.js +6 -6
- package/clis/linkedin/profile-experience.test.js +10 -10
- package/clis/linkedin/profile-read.js +1 -1
- package/clis/linkedin/safe-send.js +1 -1
- package/clis/linkedin/search.js +1 -1
- package/clis/linkedin/shared.js +2 -2
- package/clis/linkedin/timeline.js +5 -5
- package/clis/manus/manus.test.js +2 -2
- package/clis/medium/feed.js +3 -3
- package/clis/medium/search.js +3 -3
- package/clis/medium/user.js +3 -3
- package/clis/notebooklm/auth.js +2 -2
- package/clis/notebooklm/note-list.test.js +4 -4
- package/clis/notebooklm/notes-get.test.js +8 -8
- package/clis/notebooklm/source-fulltext.test.js +11 -11
- package/clis/notebooklm/utils.js +28 -28
- package/clis/notebooklm/utils.test.js +10 -10
- package/clis/pixiv/search.test.js +3 -3
- package/clis/qoder/quest.js +2 -2
- package/clis/reddit/home.js +2 -2
- package/clis/reddit/hot.js +1 -1
- package/clis/reddit/read.js +2 -2
- package/clis/reddit/read.test.js +1 -1
- package/clis/reddit/reply.js +2 -2
- package/clis/reddit/whoami.js +2 -2
- package/clis/reuters/article-detail.js +1 -1
- package/clis/reuters/search.js +1 -1
- package/clis/slock/attachment-upload.test.js +1 -1
- package/clis/slock/task-convert.js +1 -1
- package/clis/substack/feed.js +3 -3
- package/clis/substack/publication.js +3 -3
- package/clis/substack/search.js +4 -4
- package/clis/tiktok/comment.js +2 -2
- package/clis/tiktok/follow.js +4 -4
- package/clis/tiktok/like.js +1 -1
- package/clis/tiktok/save.js +1 -1
- package/clis/tiktok/unfollow.js +4 -4
- package/clis/tiktok/unlike.js +1 -1
- package/clis/tiktok/unsave.js +2 -2
- package/clis/tiktok/write-refactor.test.js +5 -5
- package/clis/twitter/accept.js +3 -3
- package/clis/twitter/followers.js +1 -1
- package/clis/twitter/list-remove-core.js +2 -2
- package/clis/twitter/list-tweets.test.js +3 -3
- package/clis/twitter/lists.js +6 -6
- package/clis/twitter/lists.test.js +2 -2
- package/clis/twitter/reply-dm.js +1 -1
- package/clis/twitter/shared.test.js +4 -5
- package/clis/twitter/trending.js +1 -1
- package/clis/twitter/utils.js +1 -1
- package/clis/web/read.js +1 -1
- package/clis/web/read.test.js +2 -2
- package/clis/yahoo-finance/quote.js +1 -1
- package/clis/youtube/history.js +4 -4
- package/clis/youtube/transcript-group.js +1 -1
- package/clis/youtube/transcript-group.test.js +5 -5
- package/clis/youtube/transcript.js +5 -5
- package/clis/youtube/video.js +4 -4
- package/clis/youtube/video.test.js +6 -6
- package/dist/src/browser/analyze.test.js +13 -13
- package/dist/src/browser/bridge-readiness.d.ts +1 -1
- package/dist/src/browser/daemon-client.d.ts +1 -0
- package/dist/src/browser/daemon-client.js +102 -50
- package/dist/src/browser/daemon-client.test.js +104 -19
- package/dist/src/browser/errors.js +11 -0
- package/dist/src/browser/protocol.d.ts +2 -0
- package/dist/src/browser.test.js +2 -2
- package/dist/src/cli-argv-preprocess.d.ts +2 -2
- package/dist/src/cli-argv-preprocess.js +2 -2
- package/dist/src/cli-argv-preprocess.test.js +35 -35
- package/dist/src/cli.js +2 -2
- package/dist/src/cli.test.js +57 -57
- package/dist/src/commanderAdapter.test.js +19 -19
- package/dist/src/convention-audit.js +1 -1
- package/dist/src/daemon/server.js +28 -23
- package/dist/src/daemon/server.test.js +52 -0
- package/dist/src/daemon-utils.d.ts +1 -0
- package/dist/src/daemon-utils.js +9 -0
- package/dist/src/daemon.test.js +10 -1
- package/dist/src/doctor.js +7 -1
- package/dist/src/doctor.test.js +8 -1
- package/dist/src/download/article-download.d.ts +3 -3
- package/dist/src/download/article-download.js +7 -7
- package/dist/src/download/article-download.test.js +6 -6
- package/dist/src/download/index.js +1 -1
- package/dist/src/download/index.test.js +1 -2
- package/dist/src/download/media-download.d.ts +1 -1
- package/dist/src/download/media-download.js +1 -1
- package/dist/src/electron-apps.js +0 -8
- package/dist/src/electron-apps.test.js +2 -11
- package/dist/src/errors.test.js +9 -9
- package/dist/src/execution.js +2 -0
- package/dist/src/execution.test.js +12 -0
- package/dist/src/external-clis.yaml +0 -37
- package/dist/src/external.d.ts +1 -1
- package/dist/src/external.test.js +2 -17
- package/dist/src/generate-release-notes-cli.test.js +140 -0
- package/dist/src/help.d.ts +3 -3
- package/dist/src/help.test.js +8 -8
- package/dist/src/main.js +1 -1
- package/dist/src/manifest-types.d.ts +1 -1
- package/dist/src/node-network.test.js +2 -2
- package/dist/src/output.js +1 -1
- package/dist/src/pipeline/steps/download.test.js +3 -3
- package/dist/src/registry.test.js +2 -2
- package/dist/src/release-notes.d.ts +38 -0
- package/dist/src/release-notes.js +99 -0
- package/dist/src/release-notes.test.js +61 -0
- package/dist/src/serialization.test.js +7 -7
- package/dist/src/snapshotFormatter.js +3 -5
- package/dist/src/snapshotFormatter.test.d.ts +1 -1
- package/dist/src/snapshotFormatter.test.js +50 -50
- package/dist/src/tui.js +1 -1
- package/package.json +4 -1
- package/scripts/generate-release-notes.ts +234 -0
- package/scripts/postinstall.js +1 -1
- package/scripts/silent-column-drop-baseline.json +0 -498
- package/scripts/typed-error-lint-baseline.json +0 -464
- package/skills/webcmd-adapter-author/SKILL.md +216 -213
- package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
- package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
- package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
- package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
- package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
- package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
- package/skills/webcmd-adapter-author/references/output-design.md +47 -125
- package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
- package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
- package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
- package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
- package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
- package/skills/webcmd-autofix/SKILL.md +136 -143
- package/skills/webcmd-sitemap-author/SKILL.md +58 -67
- package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
- package/skills/webcmd-usage/SKILL.md +106 -97
- package/clis/12306/auth.js +0 -59
- package/clis/12306/me.js +0 -73
- package/clis/12306/orders.js +0 -96
- package/clis/12306/passengers.js +0 -90
- package/clis/12306/price.js +0 -166
- package/clis/12306/stations.js +0 -66
- package/clis/12306/train.js +0 -91
- package/clis/12306/trains.js +0 -166
- package/clis/12306/utils.js +0 -272
- package/clis/12306/utils.test.js +0 -424
- package/clis/1688/assets.js +0 -205
- package/clis/1688/assets.test.js +0 -39
- package/clis/1688/auth.js +0 -46
- package/clis/1688/download.js +0 -77
- package/clis/1688/download.test.js +0 -31
- package/clis/1688/item.js +0 -188
- package/clis/1688/item.test.js +0 -67
- package/clis/1688/search.js +0 -310
- package/clis/1688/search.test.js +0 -75
- package/clis/1688/shared.js +0 -557
- package/clis/1688/shared.test.js +0 -57
- package/clis/1688/store.js +0 -227
- package/clis/1688/store.test.js +0 -62
- package/clis/1point3acres/auth.js +0 -52
- package/clis/1point3acres/digest.js +0 -35
- package/clis/1point3acres/forum.js +0 -51
- package/clis/1point3acres/forums.js +0 -44
- package/clis/1point3acres/hot.js +0 -35
- package/clis/1point3acres/latest.js +0 -35
- package/clis/1point3acres/notifications.js +0 -64
- package/clis/1point3acres/search.js +0 -71
- package/clis/1point3acres/thread.js +0 -117
- package/clis/1point3acres/user.js +0 -77
- package/clis/1point3acres/utils.js +0 -247
- package/clis/36kr/article.js +0 -66
- package/clis/36kr/article.test.js +0 -46
- package/clis/36kr/hot.js +0 -87
- package/clis/36kr/hot.test.js +0 -15
- package/clis/36kr/news.js +0 -52
- package/clis/36kr/news.test.js +0 -85
- package/clis/36kr/search.js +0 -79
- package/clis/51job/company.js +0 -126
- package/clis/51job/detail.js +0 -109
- package/clis/51job/hot.js +0 -56
- package/clis/51job/search.js +0 -80
- package/clis/51job/utils.js +0 -302
- package/clis/51job/utils.test.js +0 -69
- package/clis/aibase/news.js +0 -110
- package/clis/aibase/news.test.js +0 -59
- package/clis/autohome/__fixtures__/catalog.html +0 -11
- package/clis/autohome/__fixtures__/koubei.json +0 -116
- package/clis/autohome/autohome.test.js +0 -115
- package/clis/autohome/brand.js +0 -108
- package/clis/autohome/score.js +0 -103
- package/clis/autohome/utils.js +0 -157
- package/clis/baidu-scholar/search.js +0 -87
- package/clis/baidu-scholar/search.test.js +0 -23
- package/clis/bilibili/auth.js +0 -36
- package/clis/bilibili/comment.js +0 -107
- package/clis/bilibili/comment.test.js +0 -153
- package/clis/bilibili/comments.js +0 -136
- package/clis/bilibili/comments.test.js +0 -142
- package/clis/bilibili/download.js +0 -178
- package/clis/bilibili/download.test.js +0 -173
- package/clis/bilibili/dynamic.js +0 -34
- package/clis/bilibili/dynamic.test.js +0 -68
- package/clis/bilibili/favorite.js +0 -47
- package/clis/bilibili/feed.js +0 -220
- package/clis/bilibili/follow.js +0 -140
- package/clis/bilibili/follow.test.js +0 -203
- package/clis/bilibili/following.js +0 -44
- package/clis/bilibili/history.js +0 -45
- package/clis/bilibili/hot.js +0 -40
- package/clis/bilibili/hot.test.js +0 -17
- package/clis/bilibili/me.js +0 -13
- package/clis/bilibili/ranking.js +0 -25
- package/clis/bilibili/search.js +0 -24
- package/clis/bilibili/subtitle.js +0 -141
- package/clis/bilibili/subtitle.test.js +0 -240
- package/clis/bilibili/summary.js +0 -167
- package/clis/bilibili/summary.test.js +0 -210
- package/clis/bilibili/unfollow.js +0 -121
- package/clis/bilibili/user-videos.js +0 -39
- package/clis/bilibili/utils.js +0 -273
- package/clis/bilibili/utils.test.js +0 -97
- package/clis/bilibili/video.js +0 -155
- package/clis/bilibili/video.test.js +0 -308
- package/clis/boss/auth.js +0 -47
- package/clis/boss/batchgreet.js +0 -61
- package/clis/boss/chatlist.js +0 -116
- package/clis/boss/chatlist.test.js +0 -211
- package/clis/boss/chatmsg.js +0 -117
- package/clis/boss/chatmsg.test.js +0 -230
- package/clis/boss/detail.js +0 -63
- package/clis/boss/exchange.js +0 -46
- package/clis/boss/greet.js +0 -49
- package/clis/boss/invite.js +0 -64
- package/clis/boss/joblist.js +0 -31
- package/clis/boss/mark.js +0 -70
- package/clis/boss/recommend.js +0 -45
- package/clis/boss/resume.js +0 -150
- package/clis/boss/search.js +0 -197
- package/clis/boss/search.test.js +0 -78
- package/clis/boss/send.js +0 -44
- package/clis/boss/stats.js +0 -66
- package/clis/boss/utils.js +0 -468
- package/clis/boss/utils.test.js +0 -34
- package/clis/chaoxing/assignments.js +0 -76
- package/clis/chaoxing/auth.js +0 -54
- package/clis/chaoxing/exams.js +0 -75
- package/clis/chaoxing/utils.js +0 -223
- package/clis/chaoxing/utils.test.js +0 -45
- package/clis/cnki/search.js +0 -61
- package/clis/cnki/search.test.js +0 -18
- package/clis/ctrip/auth.js +0 -50
- package/clis/ctrip/ctrip.test.js +0 -719
- package/clis/ctrip/flight.js +0 -136
- package/clis/ctrip/hotel-search.js +0 -132
- package/clis/ctrip/hotel-suggest.js +0 -45
- package/clis/ctrip/search.js +0 -41
- package/clis/ctrip/utils.js +0 -473
- package/clis/deepseek/ask.js +0 -158
- package/clis/deepseek/ask.test.js +0 -399
- package/clis/deepseek/auth.js +0 -54
- package/clis/deepseek/detail.js +0 -46
- package/clis/deepseek/detail.test.js +0 -81
- package/clis/deepseek/history.js +0 -27
- package/clis/deepseek/new.js +0 -33
- package/clis/deepseek/read.js +0 -25
- package/clis/deepseek/send.js +0 -140
- package/clis/deepseek/send.test.js +0 -107
- package/clis/deepseek/status.js +0 -26
- package/clis/deepseek/utils.js +0 -487
- package/clis/deepseek/utils.test.js +0 -370
- package/clis/dianping/__fixtures__/search.html +0 -168
- package/clis/dianping/__fixtures__/shop.html +0 -6
- package/clis/dianping/auth.js +0 -49
- package/clis/dianping/cityResolver.js +0 -185
- package/clis/dianping/dianping.test.js +0 -578
- package/clis/dianping/search.js +0 -157
- package/clis/dianping/shop.js +0 -173
- package/clis/dianping/utils.js +0 -157
- package/clis/dongchedi/__fixtures__/search.json +0 -60
- package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
- package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
- package/clis/dongchedi/dongchedi.test.js +0 -191
- package/clis/dongchedi/koubei.js +0 -85
- package/clis/dongchedi/models.js +0 -91
- package/clis/dongchedi/score.js +0 -83
- package/clis/dongchedi/search.js +0 -83
- package/clis/dongchedi/series.js +0 -87
- package/clis/dongchedi/specs.js +0 -115
- package/clis/dongchedi/utils.js +0 -180
- package/clis/douban/auth.js +0 -50
- package/clis/douban/book-hot.js +0 -15
- package/clis/douban/download.js +0 -68
- package/clis/douban/download.test.js +0 -170
- package/clis/douban/marks.js +0 -116
- package/clis/douban/movie-hot.js +0 -15
- package/clis/douban/movie-hot.test.js +0 -14
- package/clis/douban/photos.js +0 -35
- package/clis/douban/reviews.js +0 -107
- package/clis/douban/search.js +0 -18
- package/clis/douban/search.test.js +0 -11
- package/clis/douban/subject.js +0 -46
- package/clis/douban/subject.test.js +0 -11
- package/clis/douban/top250.js +0 -68
- package/clis/douban/utils.js +0 -657
- package/clis/douban/utils.test.js +0 -488
- package/clis/doubao/ask.js +0 -40
- package/clis/doubao/auth.js +0 -66
- package/clis/doubao/detail.js +0 -35
- package/clis/doubao/detail.test.js +0 -42
- package/clis/doubao/history.js +0 -30
- package/clis/doubao/history.test.js +0 -37
- package/clis/doubao/meeting-summary.js +0 -41
- package/clis/doubao/meeting-transcript.js +0 -38
- package/clis/doubao/new.js +0 -22
- package/clis/doubao/read.js +0 -21
- package/clis/doubao/send.js +0 -24
- package/clis/doubao/status.js +0 -26
- package/clis/doubao/utils.js +0 -1156
- package/clis/doubao/utils.test.js +0 -396
- package/clis/doubao-app/ask.js +0 -54
- package/clis/doubao-app/dump.js +0 -25
- package/clis/doubao-app/new.js +0 -21
- package/clis/doubao-app/read.js +0 -19
- package/clis/doubao-app/screenshot.js +0 -19
- package/clis/doubao-app/send.js +0 -28
- package/clis/doubao-app/status.js +0 -17
- package/clis/doubao-app/utils.js +0 -110
- package/clis/douyin/_shared/browser-fetch.js +0 -66
- package/clis/douyin/_shared/browser-fetch.test.js +0 -64
- package/clis/douyin/_shared/creation-id.js +0 -5
- package/clis/douyin/_shared/creation-id.test.js +0 -22
- package/clis/douyin/_shared/evaluate-result.js +0 -16
- package/clis/douyin/_shared/imagex-upload.js +0 -53
- package/clis/douyin/_shared/imagex-upload.test.js +0 -87
- package/clis/douyin/_shared/public-api.js +0 -29
- package/clis/douyin/_shared/sts2.js +0 -21
- package/clis/douyin/_shared/sts2.test.js +0 -27
- package/clis/douyin/_shared/text-extra.js +0 -15
- package/clis/douyin/_shared/text-extra.test.js +0 -37
- package/clis/douyin/_shared/timing.js +0 -22
- package/clis/douyin/_shared/timing.test.js +0 -28
- package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
- package/clis/douyin/_shared/tos-upload.js +0 -331
- package/clis/douyin/_shared/tos-upload.test.js +0 -229
- package/clis/douyin/_shared/transcode.js +0 -45
- package/clis/douyin/_shared/transcode.test.js +0 -91
- package/clis/douyin/_shared/vod-upload.js +0 -212
- package/clis/douyin/_shared/vod-upload.test.js +0 -38
- package/clis/douyin/activities.js +0 -23
- package/clis/douyin/activities.test.js +0 -55
- package/clis/douyin/auth.js +0 -39
- package/clis/douyin/collections.js +0 -23
- package/clis/douyin/collections.test.js +0 -45
- package/clis/douyin/delete.js +0 -152
- package/clis/douyin/delete.test.js +0 -100
- package/clis/douyin/draft.js +0 -355
- package/clis/douyin/draft.test.js +0 -335
- package/clis/douyin/drafts.js +0 -24
- package/clis/douyin/drafts.test.js +0 -11
- package/clis/douyin/hashtag.js +0 -114
- package/clis/douyin/hashtag.test.js +0 -171
- package/clis/douyin/location.js +0 -25
- package/clis/douyin/location.test.js +0 -23
- package/clis/douyin/profile.js +0 -29
- package/clis/douyin/profile.test.js +0 -46
- package/clis/douyin/publish-upload-id.test.js +0 -206
- package/clis/douyin/publish.js +0 -341
- package/clis/douyin/publish.test.js +0 -38
- package/clis/douyin/search.js +0 -308
- package/clis/douyin/search.test.js +0 -307
- package/clis/douyin/stats.js +0 -28
- package/clis/douyin/stats.test.js +0 -22
- package/clis/douyin/update.js +0 -32
- package/clis/douyin/update.test.js +0 -11
- package/clis/douyin/user-videos.js +0 -82
- package/clis/douyin/user-videos.test.js +0 -151
- package/clis/douyin/videos.js +0 -52
- package/clis/douyin/videos.test.js +0 -54
- package/clis/eastmoney/_secid.js +0 -78
- package/clis/eastmoney/announcement.js +0 -53
- package/clis/eastmoney/convertible.js +0 -74
- package/clis/eastmoney/etf.js +0 -66
- package/clis/eastmoney/holders.js +0 -79
- package/clis/eastmoney/hot-rank.js +0 -51
- package/clis/eastmoney/hot-rank.test.js +0 -59
- package/clis/eastmoney/index-board.js +0 -97
- package/clis/eastmoney/kline.js +0 -88
- package/clis/eastmoney/kuaixun.js +0 -55
- package/clis/eastmoney/longhu.js +0 -68
- package/clis/eastmoney/money-flow.js +0 -79
- package/clis/eastmoney/northbound.js +0 -58
- package/clis/eastmoney/quote.js +0 -108
- package/clis/eastmoney/rank.js +0 -95
- package/clis/eastmoney/sectors.js +0 -77
- package/clis/flomo/auth.js +0 -55
- package/clis/flomo/memos.js +0 -228
- package/clis/flomo/memos.test.js +0 -144
- package/clis/gitee/auth.js +0 -41
- package/clis/gitee/index.js +0 -3
- package/clis/gitee/search.js +0 -137
- package/clis/gitee/search.test.js +0 -65
- package/clis/gitee/trending.js +0 -568
- package/clis/gitee/user.js +0 -200
- package/clis/gitee/user.test.js +0 -63
- package/clis/gov-law/commands.test.js +0 -39
- package/clis/gov-law/recent.js +0 -22
- package/clis/gov-law/search.js +0 -41
- package/clis/gov-law/shared.js +0 -51
- package/clis/gov-policy/__fixtures__/recent.html +0 -16
- package/clis/gov-policy/__fixtures__/search.html +0 -41
- package/clis/gov-policy/gov-policy.test.js +0 -224
- package/clis/gov-policy/recent.js +0 -90
- package/clis/gov-policy/search.js +0 -91
- package/clis/gov-policy/utils.js +0 -54
- package/clis/guazi/__fixtures__/detail.html +0 -7
- package/clis/guazi/__fixtures__/list.html +0 -5
- package/clis/guazi/browse.js +0 -95
- package/clis/guazi/car.js +0 -110
- package/clis/guazi/guazi.test.js +0 -126
- package/clis/guazi/utils.js +0 -133
- package/clis/huodongxing/events.js +0 -322
- package/clis/huodongxing/events.test.js +0 -296
- package/clis/hupu/__fixtures__/hot-home.html +0 -64
- package/clis/hupu/auth.js +0 -47
- package/clis/hupu/detail.js +0 -72
- package/clis/hupu/hot.js +0 -163
- package/clis/hupu/hot.test.js +0 -224
- package/clis/hupu/like.js +0 -76
- package/clis/hupu/mentions.js +0 -160
- package/clis/hupu/reply.js +0 -72
- package/clis/hupu/search.js +0 -60
- package/clis/hupu/unlike.js +0 -76
- package/clis/hupu/utils.js +0 -319
- package/clis/jd/add-cart.js +0 -72
- package/clis/jd/auth.js +0 -46
- package/clis/jd/cart.js +0 -80
- package/clis/jd/commands.test.js +0 -41
- package/clis/jd/detail.js +0 -63
- package/clis/jd/item.js +0 -730
- package/clis/jd/item.test.js +0 -354
- package/clis/jd/item.test.ts +0 -517
- package/clis/jd/reviews.js +0 -55
- package/clis/jd/search.js +0 -66
- package/clis/jianyu/auth.js +0 -62
- package/clis/jianyu/detail.js +0 -21
- package/clis/jianyu/search.js +0 -634
- package/clis/jianyu/search.test.js +0 -153
- package/clis/jianyu/shared/china-bid-search.js +0 -165
- package/clis/jianyu/shared/procurement-contract.js +0 -324
- package/clis/jianyu/shared/procurement-contract.test.js +0 -72
- package/clis/jianyu/shared/procurement-detail.js +0 -107
- package/clis/jianyu/shared/procurement-detail.test.js +0 -84
- package/clis/jike/auth.js +0 -48
- package/clis/jike/comment.js +0 -107
- package/clis/jike/create.js +0 -106
- package/clis/jike/feed.js +0 -68
- package/clis/jike/like.js +0 -61
- package/clis/jike/notifications.js +0 -169
- package/clis/jike/post.js +0 -72
- package/clis/jike/read.test.js +0 -86
- package/clis/jike/repost.js +0 -103
- package/clis/jike/search.js +0 -68
- package/clis/jike/topic.js +0 -65
- package/clis/jike/user.js +0 -65
- package/clis/jike/utils.js +0 -25
- package/clis/jimeng/auth.js +0 -46
- package/clis/jimeng/generate.js +0 -84
- package/clis/jimeng/history.js +0 -48
- package/clis/jimeng/new.js +0 -44
- package/clis/jimeng/workspaces.js +0 -42
- package/clis/juejin/hot.js +0 -37
- package/clis/juejin/juejin.test.js +0 -241
- package/clis/juejin/recommend.js +0 -61
- package/clis/juejin/utils.js +0 -199
- package/clis/ke/auth.js +0 -46
- package/clis/ke/chengjiao.js +0 -78
- package/clis/ke/ershoufang.js +0 -101
- package/clis/ke/utils.js +0 -104
- package/clis/ke/xiaoqu.js +0 -78
- package/clis/ke/zufang.js +0 -95
- package/clis/kimi/_utils.js +0 -110
- package/clis/kimi/audit-extras.js +0 -268
- package/clis/kimi/auth.js +0 -57
- package/clis/kimi/chat.js +0 -470
- package/clis/kimi/kimi.test.js +0 -187
- package/clis/kimi/storage.js +0 -169
- package/clis/kimi/ui.js +0 -314
- package/clis/kimi/usage.js +0 -144
- package/clis/linux-do/auth.js +0 -55
- package/clis/linux-do/categories.js +0 -50
- package/clis/linux-do/feed.js +0 -395
- package/clis/linux-do/feed.test.js +0 -153
- package/clis/linux-do/search.js +0 -29
- package/clis/linux-do/tags.js +0 -28
- package/clis/linux-do/topic-content.js +0 -155
- package/clis/linux-do/topic-content.test.js +0 -59
- package/clis/linux-do/topic.js +0 -53
- package/clis/linux-do/user-posts.js +0 -57
- package/clis/linux-do/user-topics.js +0 -37
- package/clis/maimai/auth.js +0 -47
- package/clis/maimai/search-talents.js +0 -192
- package/clis/maimai/search-talents.test.js +0 -29
- package/clis/mubu/doc.js +0 -41
- package/clis/mubu/docs.js +0 -44
- package/clis/mubu/notes.js +0 -245
- package/clis/mubu/recent.js +0 -28
- package/clis/mubu/search.js +0 -63
- package/clis/mubu/utils.js +0 -304
- package/clis/nowcoder/auth.js +0 -65
- package/clis/nowcoder/companies.js +0 -24
- package/clis/nowcoder/creators.js +0 -28
- package/clis/nowcoder/detail.js +0 -62
- package/clis/nowcoder/experience.js +0 -37
- package/clis/nowcoder/hot.js +0 -25
- package/clis/nowcoder/jobs.js +0 -22
- package/clis/nowcoder/notifications.js +0 -30
- package/clis/nowcoder/papers.js +0 -41
- package/clis/nowcoder/practice.js +0 -38
- package/clis/nowcoder/recommend.js +0 -31
- package/clis/nowcoder/referral.js +0 -40
- package/clis/nowcoder/salary.js +0 -41
- package/clis/nowcoder/search.js +0 -50
- package/clis/nowcoder/suggest.js +0 -34
- package/clis/nowcoder/topics.js +0 -28
- package/clis/nowcoder/trending.js +0 -26
- package/clis/ones/common.js +0 -144
- package/clis/ones/enrich-tasks.js +0 -37
- package/clis/ones/login.js +0 -81
- package/clis/ones/logout.js +0 -18
- package/clis/ones/me.js +0 -31
- package/clis/ones/my-tasks.js +0 -121
- package/clis/ones/resolve-labels.js +0 -64
- package/clis/ones/task-helpers.js +0 -212
- package/clis/ones/task-helpers.test.js +0 -12
- package/clis/ones/task.js +0 -67
- package/clis/ones/tasks.js +0 -80
- package/clis/ones/token-info.js +0 -43
- package/clis/ones/worklog.js +0 -268
- package/clis/ones/worklog.test.js +0 -20
- package/clis/powerchina/auth.js +0 -52
- package/clis/powerchina/search.js +0 -251
- package/clis/powerchina/search.test.js +0 -93
- package/clis/quark/auth.js +0 -47
- package/clis/quark/ls.js +0 -64
- package/clis/quark/mkdir.js +0 -37
- package/clis/quark/mv.js +0 -54
- package/clis/quark/rename.js +0 -27
- package/clis/quark/rm.js +0 -25
- package/clis/quark/save.js +0 -81
- package/clis/quark/share-tree.js +0 -46
- package/clis/quark/utils.js +0 -146
- package/clis/quark/utils.test.js +0 -58
- package/clis/qwen/ask.js +0 -104
- package/clis/qwen/ask.test.js +0 -36
- package/clis/qwen/auth.js +0 -56
- package/clis/qwen/detail.js +0 -62
- package/clis/qwen/history.js +0 -61
- package/clis/qwen/image.js +0 -179
- package/clis/qwen/new.js +0 -23
- package/clis/qwen/read.js +0 -41
- package/clis/qwen/send.js +0 -55
- package/clis/qwen/status.js +0 -37
- package/clis/qwen/utils.js +0 -461
- package/clis/qwen/utils.test.js +0 -128
- package/clis/rednote/auth.js +0 -52
- package/clis/rednote/comments.js +0 -85
- package/clis/rednote/download.js +0 -59
- package/clis/rednote/feed.js +0 -27
- package/clis/rednote/navigation.test.js +0 -26
- package/clis/rednote/note.js +0 -68
- package/clis/rednote/notifications.js +0 -139
- package/clis/rednote/rednote.test.js +0 -240
- package/clis/rednote/search.js +0 -107
- package/clis/rednote/user.js +0 -55
- package/clis/sinablog/article.js +0 -15
- package/clis/sinablog/hot.js +0 -15
- package/clis/sinablog/search.js +0 -52
- package/clis/sinablog/user.js +0 -16
- package/clis/sinablog/utils.js +0 -186
- package/clis/sinafinance/news.js +0 -62
- package/clis/sinafinance/rolling-news.js +0 -41
- package/clis/sinafinance/stock-rank.js +0 -66
- package/clis/sinafinance/stock.js +0 -121
- package/clis/sinafinance/stock.test.js +0 -59
- package/clis/smzdm/search.js +0 -149
- package/clis/smzdm/search.test.js +0 -114
- package/clis/taobao/add-cart.js +0 -150
- package/clis/taobao/auth.js +0 -58
- package/clis/taobao/cart.js +0 -96
- package/clis/taobao/commands.test.js +0 -41
- package/clis/taobao/detail.js +0 -71
- package/clis/taobao/reviews.js +0 -77
- package/clis/taobao/search.js +0 -97
- package/clis/tdx/hot-rank.js +0 -48
- package/clis/tdx/hot-rank.test.js +0 -59
- package/clis/ths/hot-rank.js +0 -50
- package/clis/ths/hot-rank.test.js +0 -64
- package/clis/tieba/commands.test.js +0 -79
- package/clis/tieba/hot.js +0 -48
- package/clis/tieba/posts.js +0 -86
- package/clis/tieba/read.js +0 -141
- package/clis/tieba/search.js +0 -109
- package/clis/tieba/utils.js +0 -240
- package/clis/tieba/utils.test.js +0 -290
- package/clis/toutiao/articles.js +0 -55
- package/clis/toutiao/auth.js +0 -70
- package/clis/toutiao/hot.js +0 -63
- package/clis/toutiao/toutiao.test.js +0 -378
- package/clis/toutiao/utils.js +0 -161
- package/clis/trae-cn/activity.js +0 -22
- package/clis/trae-cn/approve.js +0 -52
- package/clis/trae-cn/ask.js +0 -99
- package/clis/trae-cn/dump.js +0 -5
- package/clis/trae-cn/export.js +0 -40
- package/clis/trae-cn/model.js +0 -22
- package/clis/trae-cn/new.js +0 -63
- package/clis/trae-cn/read.js +0 -23
- package/clis/trae-cn/screenshot.js +0 -5
- package/clis/trae-cn/select-model.js +0 -25
- package/clis/trae-cn/send.js +0 -23
- package/clis/trae-cn/setup.js +0 -75
- package/clis/trae-cn/status.js +0 -27
- package/clis/trae-cn/targets.js +0 -96
- package/clis/trae-cn/trae-cn.test.js +0 -412
- package/clis/trae-cn/utils.js +0 -750
- package/clis/trae-cn/watch.js +0 -119
- package/clis/uisdc/news.js +0 -105
- package/clis/uisdc/news.test.js +0 -66
- package/clis/v2ex/auth.js +0 -44
- package/clis/v2ex/daily.js +0 -99
- package/clis/v2ex/hot.js +0 -26
- package/clis/v2ex/latest.js +0 -26
- package/clis/v2ex/me.js +0 -100
- package/clis/v2ex/member.js +0 -28
- package/clis/v2ex/node.js +0 -39
- package/clis/v2ex/nodes.js +0 -26
- package/clis/v2ex/notifications.js +0 -72
- package/clis/v2ex/replies.js +0 -27
- package/clis/v2ex/topic.js +0 -31
- package/clis/v2ex/user.js +0 -34
- package/clis/wanfang/search.js +0 -66
- package/clis/wanfang/search.test.js +0 -23
- package/clis/wechat-channels/auth.js +0 -62
- package/clis/wechat-channels/publish.js +0 -732
- package/clis/wechat-channels/publish.test.js +0 -144
- package/clis/weibo/auth.js +0 -53
- package/clis/weibo/comments.js +0 -53
- package/clis/weibo/delete.js +0 -172
- package/clis/weibo/delete.test.js +0 -94
- package/clis/weibo/envelope.test.js +0 -85
- package/clis/weibo/favorites.js +0 -170
- package/clis/weibo/favorites.test.js +0 -114
- package/clis/weibo/feed.js +0 -69
- package/clis/weibo/hot.js +0 -39
- package/clis/weibo/me.js +0 -75
- package/clis/weibo/post.js +0 -75
- package/clis/weibo/publish.js +0 -306
- package/clis/weibo/publish.test.js +0 -192
- package/clis/weibo/search.js +0 -80
- package/clis/weibo/user-posts.js +0 -234
- package/clis/weibo/user-posts.test.js +0 -92
- package/clis/weibo/user.js +0 -63
- package/clis/weibo/utils.js +0 -59
- package/clis/weibo/utils.test.js +0 -36
- package/clis/weixin/create-draft.js +0 -226
- package/clis/weixin/download.js +0 -371
- package/clis/weixin/download.test.js +0 -106
- package/clis/weixin/drafts.js +0 -66
- package/clis/weixin/drafts.test.js +0 -69
- package/clis/weixin/search.js +0 -157
- package/clis/weixin/search.test.js +0 -227
- package/clis/weread/ai-outline.js +0 -171
- package/clis/weread/ai-outline.test.js +0 -83
- package/clis/weread/auth.js +0 -59
- package/clis/weread/book-search.js +0 -438
- package/clis/weread/book-search.test.js +0 -242
- package/clis/weread/book.js +0 -233
- package/clis/weread/commands.test.js +0 -398
- package/clis/weread/highlights.js +0 -24
- package/clis/weread/notebooks.js +0 -22
- package/clis/weread/notes.js +0 -30
- package/clis/weread/private-api-regression.test.js +0 -369
- package/clis/weread/ranking.js +0 -29
- package/clis/weread/search-regression.test.js +0 -494
- package/clis/weread/search.js +0 -186
- package/clis/weread/shelf.js +0 -66
- package/clis/weread/utils.js +0 -321
- package/clis/weread/utils.test.js +0 -128
- package/clis/weread-official/book.js +0 -135
- package/clis/weread-official/commands.test.js +0 -385
- package/clis/weread-official/discover.js +0 -107
- package/clis/weread-official/list-apis.js +0 -95
- package/clis/weread-official/notes.js +0 -171
- package/clis/weread-official/readdata.js +0 -158
- package/clis/weread-official/review.js +0 -93
- package/clis/weread-official/search.js +0 -106
- package/clis/weread-official/shelf.js +0 -97
- package/clis/weread-official/utils.js +0 -293
- package/clis/weread-official/utils.test.js +0 -242
- package/clis/xianyu/auth.js +0 -68
- package/clis/xianyu/chat.js +0 -74
- package/clis/xianyu/chat.test.js +0 -84
- package/clis/xianyu/im.js +0 -322
- package/clis/xianyu/im.test.js +0 -253
- package/clis/xianyu/inbox.js +0 -96
- package/clis/xianyu/item.js +0 -153
- package/clis/xianyu/item.test.js +0 -56
- package/clis/xianyu/messages.js +0 -91
- package/clis/xianyu/publish.js +0 -485
- package/clis/xianyu/publish.test.js +0 -220
- package/clis/xianyu/reply.js +0 -82
- package/clis/xianyu/search.js +0 -262
- package/clis/xianyu/search.test.js +0 -104
- package/clis/xianyu/utils.js +0 -8
- package/clis/xiaoe/auth.js +0 -55
- package/clis/xiaoe/catalog.js +0 -227
- package/clis/xiaoe/content.js +0 -175
- package/clis/xiaoe/courses.js +0 -127
- package/clis/xiaoe/detail.js +0 -36
- package/clis/xiaoe/play-url.js +0 -121
- package/clis/xiaoe/xiaoe.test.js +0 -486
- package/clis/xiaohongshu/ask.js +0 -426
- package/clis/xiaohongshu/ask.test.js +0 -271
- package/clis/xiaohongshu/auth.js +0 -53
- package/clis/xiaohongshu/collection-helpers.js +0 -283
- package/clis/xiaohongshu/collection-helpers.test.js +0 -125
- package/clis/xiaohongshu/comments.js +0 -228
- package/clis/xiaohongshu/comments.test.js +0 -320
- package/clis/xiaohongshu/creator-note-detail.js +0 -482
- package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
- package/clis/xiaohongshu/creator-notes-summary.js +0 -98
- package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
- package/clis/xiaohongshu/creator-notes.js +0 -479
- package/clis/xiaohongshu/creator-notes.test.js +0 -281
- package/clis/xiaohongshu/creator-profile.js +0 -55
- package/clis/xiaohongshu/creator-stats.js +0 -76
- package/clis/xiaohongshu/creator-stats.test.js +0 -24
- package/clis/xiaohongshu/delete-note.js +0 -260
- package/clis/xiaohongshu/delete-note.test.js +0 -172
- package/clis/xiaohongshu/download.js +0 -249
- package/clis/xiaohongshu/download.test.js +0 -339
- package/clis/xiaohongshu/draft-clear.js +0 -91
- package/clis/xiaohongshu/draft-delete.js +0 -103
- package/clis/xiaohongshu/draft-open.js +0 -43
- package/clis/xiaohongshu/draft-utils.js +0 -142
- package/clis/xiaohongshu/drafts.js +0 -28
- package/clis/xiaohongshu/drafts.test.js +0 -172
- package/clis/xiaohongshu/feed.js +0 -163
- package/clis/xiaohongshu/feed.test.js +0 -126
- package/clis/xiaohongshu/follow.js +0 -226
- package/clis/xiaohongshu/follow.test.js +0 -211
- package/clis/xiaohongshu/liked.js +0 -29
- package/clis/xiaohongshu/liked.test.js +0 -82
- package/clis/xiaohongshu/navigation.test.js +0 -38
- package/clis/xiaohongshu/note-helpers.js +0 -69
- package/clis/xiaohongshu/note.js +0 -104
- package/clis/xiaohongshu/note.test.js +0 -249
- package/clis/xiaohongshu/notifications.js +0 -46
- package/clis/xiaohongshu/publish.js +0 -1423
- package/clis/xiaohongshu/publish.test.js +0 -1141
- package/clis/xiaohongshu/saved.js +0 -29
- package/clis/xiaohongshu/saved.test.js +0 -143
- package/clis/xiaohongshu/search.js +0 -330
- package/clis/xiaohongshu/search.test.js +0 -325
- package/clis/xiaohongshu/unfollow.js +0 -285
- package/clis/xiaohongshu/user-helpers.js +0 -78
- package/clis/xiaohongshu/user-helpers.test.js +0 -160
- package/clis/xiaohongshu/user.js +0 -140
- package/clis/xiaohongshu/user.test.js +0 -141
- package/clis/xiaoyuzhou/auth.js +0 -303
- package/clis/xiaoyuzhou/auth.test.js +0 -124
- package/clis/xiaoyuzhou/download.js +0 -54
- package/clis/xiaoyuzhou/download.test.js +0 -135
- package/clis/xiaoyuzhou/episode.js +0 -34
- package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
- package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
- package/clis/xiaoyuzhou/podcast.js +0 -33
- package/clis/xiaoyuzhou/transcript.js +0 -77
- package/clis/xiaoyuzhou/transcript.test.js +0 -195
- package/clis/xiaoyuzhou/utils.js +0 -15
- package/clis/xiaoyuzhou/utils.test.js +0 -39
- package/clis/xueqiu/auth.js +0 -63
- package/clis/xueqiu/comments.js +0 -355
- package/clis/xueqiu/comments.test.js +0 -696
- package/clis/xueqiu/danjuan-utils.js +0 -126
- package/clis/xueqiu/danjuan-utils.test.js +0 -41
- package/clis/xueqiu/earnings-date.js +0 -45
- package/clis/xueqiu/feed.js +0 -39
- package/clis/xueqiu/fund-holdings.js +0 -29
- package/clis/xueqiu/fund-snapshot.js +0 -26
- package/clis/xueqiu/groups.js +0 -23
- package/clis/xueqiu/hot-stock.js +0 -32
- package/clis/xueqiu/hot.js +0 -37
- package/clis/xueqiu/kline.js +0 -44
- package/clis/xueqiu/search.js +0 -37
- package/clis/xueqiu/stock.js +0 -65
- package/clis/xueqiu/utils.js +0 -48
- package/clis/xueqiu/utils.test.js +0 -26
- package/clis/xueqiu/watchlist.js +0 -37
- package/clis/youdao/note.js +0 -258
- package/clis/youdao/note.test.js +0 -99
- package/clis/yuanbao/ask.js +0 -362
- package/clis/yuanbao/ask.test.js +0 -124
- package/clis/yuanbao/auth.js +0 -59
- package/clis/yuanbao/detail.js +0 -65
- package/clis/yuanbao/history.js +0 -51
- package/clis/yuanbao/new.js +0 -72
- package/clis/yuanbao/new.test.js +0 -30
- package/clis/yuanbao/read.js +0 -38
- package/clis/yuanbao/send.js +0 -57
- package/clis/yuanbao/shared.js +0 -341
- package/clis/yuanbao/shared.test.js +0 -80
- package/clis/yuanbao/status.js +0 -44
- package/clis/zhihu/answer-comments.js +0 -280
- package/clis/zhihu/answer-comments.test.js +0 -287
- package/clis/zhihu/answer-detail.js +0 -216
- package/clis/zhihu/answer-detail.test.js +0 -338
- package/clis/zhihu/answer.js +0 -54
- package/clis/zhihu/answer.test.js +0 -54
- package/clis/zhihu/auth.js +0 -59
- package/clis/zhihu/collection.js +0 -199
- package/clis/zhihu/collection.test.js +0 -337
- package/clis/zhihu/collections.js +0 -128
- package/clis/zhihu/collections.test.js +0 -182
- package/clis/zhihu/comment.js +0 -55
- package/clis/zhihu/comment.test.js +0 -50
- package/clis/zhihu/download.js +0 -80
- package/clis/zhihu/download.test.js +0 -12
- package/clis/zhihu/favorite.js +0 -87
- package/clis/zhihu/favorite.test.js +0 -59
- package/clis/zhihu/follow.js +0 -50
- package/clis/zhihu/follow.test.js +0 -42
- package/clis/zhihu/followers.js +0 -40
- package/clis/zhihu/followers.test.js +0 -42
- package/clis/zhihu/following.js +0 -40
- package/clis/zhihu/following.test.js +0 -44
- package/clis/zhihu/hot.js +0 -44
- package/clis/zhihu/like.js +0 -47
- package/clis/zhihu/like.test.js +0 -41
- package/clis/zhihu/paginate.js +0 -128
- package/clis/zhihu/pins.js +0 -41
- package/clis/zhihu/pins.test.js +0 -44
- package/clis/zhihu/question.js +0 -113
- package/clis/zhihu/question.test.js +0 -251
- package/clis/zhihu/recommend.js +0 -103
- package/clis/zhihu/recommend.test.js +0 -143
- package/clis/zhihu/search.js +0 -206
- package/clis/zhihu/search.test.js +0 -198
- package/clis/zhihu/target.js +0 -91
- package/clis/zhihu/target.test.js +0 -77
- package/clis/zhihu/text.js +0 -29
- package/clis/zhihu/text.test.js +0 -24
- package/clis/zhihu/user-answers.js +0 -41
- package/clis/zhihu/user-answers.test.js +0 -69
- package/clis/zhihu/user-arg.js +0 -34
- package/clis/zhihu/user-articles.js +0 -40
- package/clis/zhihu/user-articles.test.js +0 -44
- package/clis/zhihu/user.js +0 -59
- package/clis/zhihu/user.test.js +0 -73
- package/clis/zhihu/write-shared.js +0 -228
- package/clis/zhihu/write-shared.test.js +0 -176
- package/clis/zsxq/auth.js +0 -68
- package/clis/zsxq/dynamics.js +0 -48
- package/clis/zsxq/groups.js +0 -33
- package/clis/zsxq/search.js +0 -44
- package/clis/zsxq/search.test.js +0 -24
- package/clis/zsxq/topic.js +0 -50
- package/clis/zsxq/topic.test.js +0 -30
- package/clis/zsxq/topics.js +0 -26
- package/clis/zsxq/topics.test.js +0 -24
- package/clis/zsxq/utils.js +0 -233
- package/clis/zsxq/utils.test.js +0 -31
- package/dist/src/weixin-download.test.js +0 -45
- package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
- package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
- package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
- package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
- /package/{clis/douyin/_shared/types.js → dist/src/generate-release-notes-cli.test.d.ts} +0 -0
- /package/dist/src/{weixin-download.test.d.ts → release-notes.test.d.ts} +0 -0
package/clis/quark/save.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { ArgumentError, CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
3
|
-
import { SHARE_API, extractPwdId, apiPost, getToken, pollTask, findFolder, } from './utils.js';
|
|
4
|
-
async function saveShare(page, pwdId, stoken, fidList, targetFid, saveAll) {
|
|
5
|
-
const data = await apiPost(page, `${SHARE_API}/save?pr=ucpro&fr=pc`, {
|
|
6
|
-
pwd_id: pwdId,
|
|
7
|
-
stoken,
|
|
8
|
-
pdir_fid: '0',
|
|
9
|
-
to_pdir_fid: targetFid,
|
|
10
|
-
fid_list: fidList,
|
|
11
|
-
pdir_save_all: saveAll,
|
|
12
|
-
scene: 'link',
|
|
13
|
-
});
|
|
14
|
-
return data.task_id;
|
|
15
|
-
}
|
|
16
|
-
cli({
|
|
17
|
-
site: 'quark',
|
|
18
|
-
name: 'save',
|
|
19
|
-
access: 'write',
|
|
20
|
-
description: 'Save shared files to your Quark Drive',
|
|
21
|
-
domain: 'pan.quark.cn',
|
|
22
|
-
strategy: Strategy.COOKIE,
|
|
23
|
-
defaultFormat: 'json',
|
|
24
|
-
args: [
|
|
25
|
-
{ name: 'url', required: true, positional: true, help: 'Quark share URL or pwd_id' },
|
|
26
|
-
{ name: 'to', default: '', help: 'Destination folder path' },
|
|
27
|
-
{ name: 'to-fid', default: '', help: 'Destination folder ID (overrides --to)' },
|
|
28
|
-
{ name: 'fids', default: '', help: 'File IDs to save (comma-separated, from share-tree). Omit to save all.' },
|
|
29
|
-
{ name: 'stoken', default: '', help: 'Share token (from share-tree output, required with --fids)' },
|
|
30
|
-
{ name: 'passcode', default: '', help: 'Share passcode (if required)' },
|
|
31
|
-
{ name: 'timeout', type: 'int', required: false, default: 120, help: 'Max seconds for the overall command (default: 120)' },
|
|
32
|
-
],
|
|
33
|
-
func: async (page, kwargs) => {
|
|
34
|
-
const url = kwargs.url;
|
|
35
|
-
const to = kwargs.to;
|
|
36
|
-
const toFid = kwargs['to-fid'];
|
|
37
|
-
const fids = kwargs.fids;
|
|
38
|
-
const stokenArg = kwargs.stoken;
|
|
39
|
-
const passcode = kwargs.passcode;
|
|
40
|
-
if (!to && !toFid)
|
|
41
|
-
throw new ArgumentError('Either --to or --to-fid is required');
|
|
42
|
-
if (to && toFid)
|
|
43
|
-
throw new ArgumentError('Cannot use both --to and --to-fid');
|
|
44
|
-
const pwdId = extractPwdId(url);
|
|
45
|
-
const saveAll = !fids;
|
|
46
|
-
let stoken;
|
|
47
|
-
let fidList;
|
|
48
|
-
if (saveAll) {
|
|
49
|
-
stoken = stokenArg || await getToken(page, pwdId, passcode);
|
|
50
|
-
fidList = [];
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
if (!stokenArg)
|
|
54
|
-
throw new ArgumentError('--stoken is required when using --fids');
|
|
55
|
-
stoken = stokenArg;
|
|
56
|
-
fidList = [...new Set(fids.split(',').map(id => id.trim()).filter(Boolean))];
|
|
57
|
-
}
|
|
58
|
-
const targetFid = toFid || await findFolder(page, to);
|
|
59
|
-
const taskId = await saveShare(page, pwdId, stoken, fidList, targetFid, saveAll);
|
|
60
|
-
const result = {
|
|
61
|
-
success: false,
|
|
62
|
-
task_id: taskId,
|
|
63
|
-
saved_to: to || toFid,
|
|
64
|
-
target_fid: targetFid,
|
|
65
|
-
...(saveAll ? {} : { fids: fidList }),
|
|
66
|
-
};
|
|
67
|
-
if (taskId) {
|
|
68
|
-
const completed = await pollTask(page, taskId, (task) => {
|
|
69
|
-
result.save_count = task.save_as?.save_as_sum_num;
|
|
70
|
-
});
|
|
71
|
-
result.completed = completed;
|
|
72
|
-
result.success = completed;
|
|
73
|
-
if (!completed)
|
|
74
|
-
throw new CommandExecutionError('quark: Save task timed out');
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
result.success = true;
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
},
|
|
81
|
-
});
|
package/clis/quark/share-tree.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import { extractPwdId, formatDate, getShareList, getToken, } from './utils.js';
|
|
3
|
-
async function buildTree(page, pwdId, stoken, pdirFid, depth, maxDepth) {
|
|
4
|
-
if (depth > maxDepth)
|
|
5
|
-
return [];
|
|
6
|
-
const files = await getShareList(page, pwdId, stoken, pdirFid, { sort: 'file_type:asc,file_name:asc' });
|
|
7
|
-
const nodes = [];
|
|
8
|
-
for (const file of files) {
|
|
9
|
-
const node = {
|
|
10
|
-
fid: file.fid,
|
|
11
|
-
name: file.file_name,
|
|
12
|
-
size: file.size,
|
|
13
|
-
is_dir: file.dir,
|
|
14
|
-
created_at: formatDate(file.created_at),
|
|
15
|
-
updated_at: formatDate(file.updated_at),
|
|
16
|
-
};
|
|
17
|
-
if (file.dir && depth < maxDepth) {
|
|
18
|
-
node.children = await buildTree(page, pwdId, stoken, file.fid, depth + 1, maxDepth);
|
|
19
|
-
}
|
|
20
|
-
nodes.push(node);
|
|
21
|
-
}
|
|
22
|
-
return nodes;
|
|
23
|
-
}
|
|
24
|
-
cli({
|
|
25
|
-
site: 'quark',
|
|
26
|
-
name: 'share-tree',
|
|
27
|
-
access: 'read',
|
|
28
|
-
description: 'Get directory tree from Quark Drive share link as nested JSON',
|
|
29
|
-
domain: 'pan.quark.cn',
|
|
30
|
-
strategy: Strategy.COOKIE,
|
|
31
|
-
defaultFormat: 'json',
|
|
32
|
-
args: [
|
|
33
|
-
{ name: 'url', required: true, positional: true, help: 'Quark share URL or pwd_id' },
|
|
34
|
-
{ name: 'passcode', default: '', help: 'Share passcode (if required)' },
|
|
35
|
-
{ name: 'depth', type: 'int', default: 10, help: 'Max directory depth' },
|
|
36
|
-
],
|
|
37
|
-
func: async (page, kwargs) => {
|
|
38
|
-
const url = kwargs.url;
|
|
39
|
-
const passcode = kwargs.passcode || '';
|
|
40
|
-
const depth = kwargs.depth ?? 10;
|
|
41
|
-
const pwdId = extractPwdId(url);
|
|
42
|
-
const stoken = await getToken(page, pwdId, passcode);
|
|
43
|
-
const tree = await buildTree(page, pwdId, stoken, '0', 0, depth);
|
|
44
|
-
return { pwd_id: pwdId, stoken, tree };
|
|
45
|
-
},
|
|
46
|
-
});
|
package/clis/quark/utils.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { ArgumentError, AuthRequiredError, CommandExecutionError, getErrorMessage } from '@agentrhq/webcmd/errors';
|
|
2
|
-
export const SHARE_API = 'https://drive-h.quark.cn/1/clouddrive/share/sharepage';
|
|
3
|
-
export const DRIVE_API = 'https://drive-pc.quark.cn/1/clouddrive/file';
|
|
4
|
-
export const TASK_API = 'https://drive-pc.quark.cn/1/clouddrive/task';
|
|
5
|
-
const QUARK_DOMAIN = 'pan.quark.cn';
|
|
6
|
-
const AUTH_HINT = 'Quark Drive requires a logged-in browser session';
|
|
7
|
-
function isAuthFailure(message, status) {
|
|
8
|
-
if (status === 401 || status === 403)
|
|
9
|
-
return true;
|
|
10
|
-
return /not logged in|login required|please log in|authentication required|unauthorized|forbidden|未登录|请先登录|需要登录|登录/.test(message.toLowerCase());
|
|
11
|
-
}
|
|
12
|
-
function getErrorStatus(error) {
|
|
13
|
-
if (!error || typeof error !== 'object' || !('status' in error))
|
|
14
|
-
return undefined;
|
|
15
|
-
const status = error.status;
|
|
16
|
-
return typeof status === 'number' ? status : undefined;
|
|
17
|
-
}
|
|
18
|
-
function unwrapApiData(resp, action) {
|
|
19
|
-
if (resp.status === 200)
|
|
20
|
-
return resp.data;
|
|
21
|
-
if (isAuthFailure(resp.message, resp.status)) {
|
|
22
|
-
throw new AuthRequiredError(QUARK_DOMAIN, AUTH_HINT);
|
|
23
|
-
}
|
|
24
|
-
throw new CommandExecutionError(`quark: ${action}: ${resp.message}`);
|
|
25
|
-
}
|
|
26
|
-
export function extractPwdId(url) {
|
|
27
|
-
const m = url.match(/\/s\/([a-zA-Z0-9]+)/);
|
|
28
|
-
if (m)
|
|
29
|
-
return m[1];
|
|
30
|
-
if (/^[a-zA-Z0-9]+$/.test(url))
|
|
31
|
-
return url;
|
|
32
|
-
throw new ArgumentError(`Invalid Quark share URL: ${url}`);
|
|
33
|
-
}
|
|
34
|
-
export async function fetchJson(page, url, options) {
|
|
35
|
-
const method = options?.method || 'GET';
|
|
36
|
-
const body = options?.body ? JSON.stringify(options.body) : undefined;
|
|
37
|
-
const js = `fetch(${JSON.stringify(url)}, {
|
|
38
|
-
method: ${JSON.stringify(method)},
|
|
39
|
-
headers: { 'Content-Type': 'application/json' },
|
|
40
|
-
credentials: 'include',
|
|
41
|
-
${body ? `body: ${JSON.stringify(body)},` : ''}
|
|
42
|
-
}).then(async r => {
|
|
43
|
-
const ct = r.headers.get('content-type') || '';
|
|
44
|
-
if (!ct.includes('json')) {
|
|
45
|
-
const text = await r.text().catch(() => '');
|
|
46
|
-
throw Object.assign(new Error('Non-JSON response: ' + text.slice(0, 200)), { status: r.status });
|
|
47
|
-
}
|
|
48
|
-
return r.json();
|
|
49
|
-
})`;
|
|
50
|
-
try {
|
|
51
|
-
return await page.evaluate(js);
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
if (isAuthFailure(getErrorMessage(error), getErrorStatus(error))) {
|
|
55
|
-
throw new AuthRequiredError(QUARK_DOMAIN, AUTH_HINT);
|
|
56
|
-
}
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
export async function apiGet(page, url) {
|
|
61
|
-
const resp = await fetchJson(page, url);
|
|
62
|
-
return unwrapApiData(resp, 'API error');
|
|
63
|
-
}
|
|
64
|
-
export async function apiPost(page, url, body) {
|
|
65
|
-
const resp = await fetchJson(page, url, { method: 'POST', body });
|
|
66
|
-
return unwrapApiData(resp, 'API error');
|
|
67
|
-
}
|
|
68
|
-
export async function getToken(page, pwdId, passcode = '') {
|
|
69
|
-
const data = await fetchJson(page, `${SHARE_API}/token?pr=ucpro&fr=pc`, {
|
|
70
|
-
method: 'POST',
|
|
71
|
-
body: { pwd_id: pwdId, passcode, support_visit_limit_private_share: true },
|
|
72
|
-
});
|
|
73
|
-
return unwrapApiData(data, 'Failed to get token').stoken;
|
|
74
|
-
}
|
|
75
|
-
export async function getShareList(page, pwdId, stoken, pdirFid = '0', options) {
|
|
76
|
-
const allFiles = [];
|
|
77
|
-
let pageNum = 1;
|
|
78
|
-
let total = 0;
|
|
79
|
-
do {
|
|
80
|
-
const sortParam = options?.sort ? `&_sort=${options.sort}` : '';
|
|
81
|
-
const url = `${SHARE_API}/detail?pr=ucpro&fr=pc&ver=2&pwd_id=${pwdId}&stoken=${encodeURIComponent(stoken)}&pdir_fid=${pdirFid}&force=0&_page=${pageNum}&_size=200&_fetch_total=1${sortParam}`;
|
|
82
|
-
const data = await fetchJson(page, url);
|
|
83
|
-
const files = unwrapApiData(data, 'Failed to get share list')?.list || [];
|
|
84
|
-
allFiles.push(...files);
|
|
85
|
-
total = data.metadata?._total || 0;
|
|
86
|
-
pageNum++;
|
|
87
|
-
} while (allFiles.length < total);
|
|
88
|
-
return allFiles;
|
|
89
|
-
}
|
|
90
|
-
export async function listMyDrive(page, pdirFid) {
|
|
91
|
-
const allFiles = [];
|
|
92
|
-
let pageNum = 1;
|
|
93
|
-
let total = 0;
|
|
94
|
-
do {
|
|
95
|
-
const url = `${DRIVE_API}/sort?pr=ucpro&fr=pc&pdir_fid=${pdirFid}&_page=${pageNum}&_size=200&_fetch_total=1&_sort=file_type:asc,file_name:asc`;
|
|
96
|
-
const data = await fetchJson(page, url);
|
|
97
|
-
const files = unwrapApiData(data, 'Failed to list drive')?.list || [];
|
|
98
|
-
allFiles.push(...files);
|
|
99
|
-
total = data.metadata?._total || 0;
|
|
100
|
-
pageNum++;
|
|
101
|
-
} while (allFiles.length < total);
|
|
102
|
-
return allFiles;
|
|
103
|
-
}
|
|
104
|
-
export async function findFolder(page, path) {
|
|
105
|
-
const parts = path.split('/').filter(Boolean);
|
|
106
|
-
let currentFid = '0';
|
|
107
|
-
for (const part of parts) {
|
|
108
|
-
const files = await listMyDrive(page, currentFid);
|
|
109
|
-
const existing = files.find(f => f.dir && f.file_name === part);
|
|
110
|
-
if (existing) {
|
|
111
|
-
currentFid = existing.fid;
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
throw new CommandExecutionError(`quark: Folder "${part}" not found in "${path}"`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return currentFid;
|
|
118
|
-
}
|
|
119
|
-
export function formatDate(ts) {
|
|
120
|
-
if (!ts)
|
|
121
|
-
return '';
|
|
122
|
-
const d = new Date(ts);
|
|
123
|
-
return d.toISOString().replace('T', ' ').slice(0, 19);
|
|
124
|
-
}
|
|
125
|
-
export function formatSize(bytes) {
|
|
126
|
-
if (bytes <= 0)
|
|
127
|
-
return '0 B';
|
|
128
|
-
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
129
|
-
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
130
|
-
return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${units[i]}`;
|
|
131
|
-
}
|
|
132
|
-
export async function getTaskStatus(page, taskId) {
|
|
133
|
-
const url = `${TASK_API}?pr=ucpro&fr=pc&task_id=${taskId}&retry_index=0`;
|
|
134
|
-
return apiGet(page, url);
|
|
135
|
-
}
|
|
136
|
-
export async function pollTask(page, taskId, onDone, maxAttempts = 30, intervalMs = 500) {
|
|
137
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
138
|
-
await new Promise(r => setTimeout(r, intervalMs));
|
|
139
|
-
const task = await getTaskStatus(page, taskId);
|
|
140
|
-
if (task?.status === 2) {
|
|
141
|
-
onDone?.(task);
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return false;
|
|
146
|
-
}
|
package/clis/quark/utils.test.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { AuthRequiredError, CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import { apiGet, apiPost, extractPwdId, getShareList, getToken } from './utils.js';
|
|
4
|
-
function makePage(evaluateImpl) {
|
|
5
|
-
return {
|
|
6
|
-
evaluate: vi.fn(evaluateImpl),
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
describe('quark utils', () => {
|
|
10
|
-
it('extractPwdId accepts share URLs and raw ids', () => {
|
|
11
|
-
expect(extractPwdId('https://pan.quark.cn/s/abc123')).toBe('abc123');
|
|
12
|
-
expect(extractPwdId('abc123')).toBe('abc123');
|
|
13
|
-
});
|
|
14
|
-
it('maps JSON auth failures to AuthRequiredError', async () => {
|
|
15
|
-
const page = makePage(async () => ({
|
|
16
|
-
status: 401,
|
|
17
|
-
code: 401,
|
|
18
|
-
message: '未登录',
|
|
19
|
-
data: null,
|
|
20
|
-
}));
|
|
21
|
-
await expect(apiGet(page, 'https://drive-pc.quark.cn/test')).rejects.toBeInstanceOf(AuthRequiredError);
|
|
22
|
-
});
|
|
23
|
-
it('maps non-JSON auth pages to AuthRequiredError', async () => {
|
|
24
|
-
const page = makePage(async () => {
|
|
25
|
-
const error = Object.assign(new Error('Non-JSON response: <html><title>登录</title></html>'), { status: 401 });
|
|
26
|
-
throw error;
|
|
27
|
-
});
|
|
28
|
-
await expect(apiPost(page, 'https://drive-pc.quark.cn/test', {})).rejects.toBeInstanceOf(AuthRequiredError);
|
|
29
|
-
});
|
|
30
|
-
it('keeps generic API failures as CommandExecutionError', async () => {
|
|
31
|
-
const page = makePage(async () => ({
|
|
32
|
-
status: 500,
|
|
33
|
-
code: 500,
|
|
34
|
-
message: 'server busy',
|
|
35
|
-
data: null,
|
|
36
|
-
}));
|
|
37
|
-
await expect(apiGet(page, 'https://drive-pc.quark.cn/test')).rejects.toBeInstanceOf(CommandExecutionError);
|
|
38
|
-
});
|
|
39
|
-
it('unwraps successful token responses', async () => {
|
|
40
|
-
const page = makePage(async () => ({
|
|
41
|
-
status: 200,
|
|
42
|
-
code: 0,
|
|
43
|
-
message: 'ok',
|
|
44
|
-
data: { stoken: 'token123' },
|
|
45
|
-
}));
|
|
46
|
-
await expect(getToken(page, 'abc123')).resolves.toBe('token123');
|
|
47
|
-
});
|
|
48
|
-
it('maps share-tree detail auth failures to AuthRequiredError', async () => {
|
|
49
|
-
const page = makePage(async () => ({
|
|
50
|
-
status: 401,
|
|
51
|
-
code: 401,
|
|
52
|
-
message: '请先登录',
|
|
53
|
-
data: null,
|
|
54
|
-
metadata: { _total: 0 },
|
|
55
|
-
}));
|
|
56
|
-
await expect(getShareList(page, 'abc123', 'token123')).rejects.toBeInstanceOf(AuthRequiredError);
|
|
57
|
-
});
|
|
58
|
-
});
|
package/clis/qwen/ask.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import { ArgumentError, CommandExecutionError, TimeoutError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import {
|
|
4
|
-
QIANWEN_DOMAIN,
|
|
5
|
-
QIANWEN_URL,
|
|
6
|
-
authRequired,
|
|
7
|
-
bubbleHtmlToMarkdown,
|
|
8
|
-
dismissLoginModal,
|
|
9
|
-
ensureOnQianwen,
|
|
10
|
-
getMessageBubbles,
|
|
11
|
-
hasLoginGate,
|
|
12
|
-
normalizeBooleanFlag,
|
|
13
|
-
sendMessage,
|
|
14
|
-
setFeatureToggle,
|
|
15
|
-
startNewChat,
|
|
16
|
-
waitForAnswer,
|
|
17
|
-
} from './utils.js';
|
|
18
|
-
|
|
19
|
-
cli({
|
|
20
|
-
site: 'qwen',
|
|
21
|
-
name: 'ask',
|
|
22
|
-
access: 'write',
|
|
23
|
-
description: 'Send a prompt to Qianwen and return the assistant reply',
|
|
24
|
-
domain: QIANWEN_DOMAIN,
|
|
25
|
-
strategy: Strategy.COOKIE,
|
|
26
|
-
browser: true,
|
|
27
|
-
siteSession: 'persistent',
|
|
28
|
-
navigateBefore: false,
|
|
29
|
-
defaultFormat: 'plain',
|
|
30
|
-
args: [
|
|
31
|
-
{ name: 'prompt', required: true, positional: true, help: 'Prompt to send to Qianwen' },
|
|
32
|
-
{ name: 'timeout', type: 'int', default: 120, help: 'Max seconds to wait for the response' },
|
|
33
|
-
{ name: 'new', type: 'boolean', default: false, help: 'Start a new chat before sending' },
|
|
34
|
-
{ name: 'think', type: 'boolean', default: false, help: 'Enable 深度思考 (DeepThink)' },
|
|
35
|
-
{ name: 'research', type: 'boolean', default: false, help: 'Enable 深度研究 (DeepResearch)' },
|
|
36
|
-
{ name: 'markdown', type: 'boolean', default: false, help: 'Emit assistant reply as markdown' },
|
|
37
|
-
],
|
|
38
|
-
columns: ['Role', 'Text'],
|
|
39
|
-
func: async (page, kwargs) => {
|
|
40
|
-
const prompt = String(kwargs.prompt || '').trim();
|
|
41
|
-
if (!prompt) throw new ArgumentError('prompt is required');
|
|
42
|
-
const timeout = Number(kwargs.timeout ?? 120);
|
|
43
|
-
if (!Number.isInteger(timeout) || timeout <= 0) {
|
|
44
|
-
throw new ArgumentError('timeout must be a positive integer');
|
|
45
|
-
}
|
|
46
|
-
const startFresh = normalizeBooleanFlag(kwargs.new, false);
|
|
47
|
-
const useThink = normalizeBooleanFlag(kwargs.think, false);
|
|
48
|
-
const useResearch = normalizeBooleanFlag(kwargs.research, false);
|
|
49
|
-
const wantMarkdown = normalizeBooleanFlag(kwargs.markdown, false);
|
|
50
|
-
|
|
51
|
-
await ensureOnQianwen(page);
|
|
52
|
-
await dismissLoginModal(page);
|
|
53
|
-
|
|
54
|
-
if (startFresh) {
|
|
55
|
-
await startNewChat(page);
|
|
56
|
-
await dismissLoginModal(page);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (useThink) await setFeatureToggle(page, 'think', true);
|
|
60
|
-
if (useResearch) await setFeatureToggle(page, 'research', true);
|
|
61
|
-
|
|
62
|
-
// Anchor on the visible transcript BEFORE sending so waitForAnswer can
|
|
63
|
-
// bind the reply to the newly sent prompt instead of an older answer.
|
|
64
|
-
const baselineAnchor = await getBaselineChatAnchor(page);
|
|
65
|
-
|
|
66
|
-
const send = await sendMessage(page, prompt);
|
|
67
|
-
if (!send?.ok) {
|
|
68
|
-
if (await hasLoginGate(page)) throw authRequired();
|
|
69
|
-
throw new CommandExecutionError(send?.reason || 'Failed to send Qianwen prompt');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const result = await waitForAnswer(page, prompt, timeout, baselineAnchor);
|
|
73
|
-
if (result.status === 'auth_required') throw authRequired();
|
|
74
|
-
if (result.status === 'timeout') {
|
|
75
|
-
throw new TimeoutError('qianwen ask', timeout, 'No Qianwen reply observed before timeout. Retry with --timeout increased.');
|
|
76
|
-
}
|
|
77
|
-
const assistant = result.assistant;
|
|
78
|
-
if (!assistant) {
|
|
79
|
-
throw new CommandExecutionError('No assistant reply found in Qianwen chat.');
|
|
80
|
-
}
|
|
81
|
-
const answer = wantMarkdown && assistant.html
|
|
82
|
-
? (bubbleHtmlToMarkdown(assistant.html) || assistant.text)
|
|
83
|
-
: assistant.text;
|
|
84
|
-
return [
|
|
85
|
-
{ Role: 'User', Text: prompt },
|
|
86
|
-
{ Role: 'Assistant', Text: answer },
|
|
87
|
-
];
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
async function getBaselineChatAnchor(page) {
|
|
92
|
-
const bubbles = await getMessageBubbles(page);
|
|
93
|
-
const lastBubbleId = bubbles.length ? bubbles[bubbles.length - 1].id : '';
|
|
94
|
-
let lastAssistantId = '';
|
|
95
|
-
for (let i = bubbles.length - 1; i >= 0; i -= 1) {
|
|
96
|
-
if (bubbles[i].role === 'Assistant') {
|
|
97
|
-
lastAssistantId = bubbles[i].id;
|
|
98
|
-
break;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return { lastBubbleId, lastAssistantId };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export const __test__ = { getBaselineChatAnchor };
|
package/clis/qwen/ask.test.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { __test__ } from './ask.js';
|
|
3
|
-
|
|
4
|
-
describe('qwen ask helpers', () => {
|
|
5
|
-
describe('getBaselineChatAnchor', () => {
|
|
6
|
-
// getMessageBubbles drives a page.evaluate that returns the raw bubble
|
|
7
|
-
// array; in tests we route page.evaluate straight to an in-memory array.
|
|
8
|
-
const fakePage = (bubbles) => ({ evaluate: () => Promise.resolve(bubbles) });
|
|
9
|
-
|
|
10
|
-
it('returns the last visible bubble and most recent Assistant bubble', async () => {
|
|
11
|
-
const bubbles = [
|
|
12
|
-
{ id: 'a1', role: 'Assistant', text: 'first answer', html: '' },
|
|
13
|
-
{ id: 'u1', role: 'User', text: 'follow-up', html: '' },
|
|
14
|
-
{ id: 'a2', role: 'Assistant', text: 'second answer', html: '' },
|
|
15
|
-
{ id: 'u2', role: 'User', text: 'newest user turn', html: '' },
|
|
16
|
-
];
|
|
17
|
-
expect(await __test__.getBaselineChatAnchor(fakePage(bubbles))).toEqual({
|
|
18
|
-
lastBubbleId: 'u2',
|
|
19
|
-
lastAssistantId: 'a2',
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('returns empty assistant id when no Assistant bubble exists yet (fresh chat)', async () => {
|
|
24
|
-
expect(await __test__.getBaselineChatAnchor(fakePage([]))).toEqual({
|
|
25
|
-
lastBubbleId: '',
|
|
26
|
-
lastAssistantId: '',
|
|
27
|
-
});
|
|
28
|
-
expect(await __test__.getBaselineChatAnchor(fakePage([
|
|
29
|
-
{ id: 'u1', role: 'User', text: 'hello', html: '' },
|
|
30
|
-
]))).toEqual({
|
|
31
|
-
lastBubbleId: 'u1',
|
|
32
|
-
lastAssistantId: '',
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
});
|
package/clis/qwen/auth.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
import { registerSiteAuthCommands } from '../_shared/site-auth.js';
|
|
3
|
-
|
|
4
|
-
async function hasQwenSessionCookie(page) {
|
|
5
|
-
const cookies = await page.getCookies({ url: 'https://chat.qwen.ai' });
|
|
6
|
-
return cookies.some(c => c.name === 'token' && c.value);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
async function verifyQwenIdentity(page) {
|
|
10
|
-
// Source the token via CDP getCookies (works even if `token` is httpOnly,
|
|
11
|
-
// which document.cookie cannot read).
|
|
12
|
-
const cookies = await page.getCookies({ url: 'https://chat.qwen.ai' });
|
|
13
|
-
const token = cookies.find(c => c.name === 'token')?.value || '';
|
|
14
|
-
if (!token) {
|
|
15
|
-
throw new AuthRequiredError('qwen.ai', 'Qwen token cookie missing');
|
|
16
|
-
}
|
|
17
|
-
await page.goto('https://chat.qwen.ai/');
|
|
18
|
-
await page.wait(2);
|
|
19
|
-
const result = await page.evaluate(`(async () => {
|
|
20
|
-
try {
|
|
21
|
-
const token = ${JSON.stringify(token)};
|
|
22
|
-
const res = await fetch('/api/v1/auths/', { credentials: 'include', headers: { 'Authorization': 'Bearer ' + token, 'Accept': 'application/json' } });
|
|
23
|
-
if (res.status === 401 || res.status === 403) {
|
|
24
|
-
return { kind: 'auth', detail: 'Qwen /api/v1/auths/ HTTP ' + res.status };
|
|
25
|
-
}
|
|
26
|
-
if (!res.ok) return { kind: 'http', httpStatus: res.status };
|
|
27
|
-
const d = await res.json();
|
|
28
|
-
if (!d || !d.id) {
|
|
29
|
-
return { kind: 'auth', detail: 'Qwen /api/v1/auths/ returned no user id' };
|
|
30
|
-
}
|
|
31
|
-
return { ok: true, user_id: String(d.id), name: String(d.name || '') };
|
|
32
|
-
} catch (e) {
|
|
33
|
-
return { kind: 'exception', detail: String(e && e.message || e) };
|
|
34
|
-
}
|
|
35
|
-
})()`);
|
|
36
|
-
if (result?.kind === 'auth') throw new AuthRequiredError('qwen.ai', result.detail);
|
|
37
|
-
if (result?.kind === 'http') throw new CommandExecutionError(`HTTP ${result.httpStatus} from /api/v1/auths/`);
|
|
38
|
-
if (result?.kind === 'exception') throw new CommandExecutionError(`Qwen whoami failed: ${result.detail}`);
|
|
39
|
-
if (!result?.ok) throw new CommandExecutionError(`Unexpected Qwen probe: ${JSON.stringify(result)}`);
|
|
40
|
-
return { user_id: result.user_id, name: result.name };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
registerSiteAuthCommands({
|
|
44
|
-
site: 'qwen',
|
|
45
|
-
domain: 'qwen.ai',
|
|
46
|
-
loginUrl: 'https://chat.qwen.ai/auth?action=login',
|
|
47
|
-
columns: ['user_id', 'name'],
|
|
48
|
-
quickCheck: hasQwenSessionCookie,
|
|
49
|
-
verify: verifyQwenIdentity,
|
|
50
|
-
poll: async (page) => {
|
|
51
|
-
if (!await hasQwenSessionCookie(page)) {
|
|
52
|
-
throw new AuthRequiredError('qwen.ai', 'Waiting for Qwen token cookie');
|
|
53
|
-
}
|
|
54
|
-
return verifyQwenIdentity(page);
|
|
55
|
-
},
|
|
56
|
-
});
|
package/clis/qwen/detail.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import { EmptyResultError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import {
|
|
4
|
-
QIANWEN_DOMAIN,
|
|
5
|
-
bubbleHtmlToMarkdown,
|
|
6
|
-
dismissLoginModal,
|
|
7
|
-
getMessageBubbles,
|
|
8
|
-
normalizeBooleanFlag,
|
|
9
|
-
parseQianwenSessionId,
|
|
10
|
-
} from './utils.js';
|
|
11
|
-
|
|
12
|
-
cli({
|
|
13
|
-
site: 'qwen',
|
|
14
|
-
name: 'detail',
|
|
15
|
-
access: 'read',
|
|
16
|
-
description: 'Open a Qianwen conversation by ID and read its messages',
|
|
17
|
-
domain: QIANWEN_DOMAIN,
|
|
18
|
-
strategy: Strategy.COOKIE,
|
|
19
|
-
browser: true,
|
|
20
|
-
navigateBefore: false,
|
|
21
|
-
siteSession: 'persistent',
|
|
22
|
-
args: [
|
|
23
|
-
{ name: 'id', positional: true, required: true, help: 'Session ID (32-char hex) or full https://www.qianwen.com/chat/<id> URL' },
|
|
24
|
-
{ name: 'markdown', type: 'boolean', default: false, help: 'Emit assistant replies as markdown' },
|
|
25
|
-
],
|
|
26
|
-
columns: ['Role', 'Text'],
|
|
27
|
-
func: async (page, kwargs) => {
|
|
28
|
-
const sessionId = parseQianwenSessionId(kwargs.id);
|
|
29
|
-
const wantMarkdown = normalizeBooleanFlag(kwargs.markdown, false);
|
|
30
|
-
|
|
31
|
-
await page.goto(`https://www.qianwen.com/chat/${sessionId}`);
|
|
32
|
-
await page.wait(2);
|
|
33
|
-
await dismissLoginModal(page);
|
|
34
|
-
|
|
35
|
-
// Poll for the conversation transcript to load. Qianwen renders the chat
|
|
36
|
-
// page shell before fetching message history, so a fixed wait can race the
|
|
37
|
-
// initial empty render. Cap at ~20s to surface real "no data" cases without
|
|
38
|
-
// hanging on broken IDs.
|
|
39
|
-
let bubbles = [];
|
|
40
|
-
const POLL_DEADLINE_MS = 20_000;
|
|
41
|
-
const POLL_INTERVAL_S = 1;
|
|
42
|
-
const startedAt = Date.now();
|
|
43
|
-
while (Date.now() - startedAt < POLL_DEADLINE_MS) {
|
|
44
|
-
bubbles = await getMessageBubbles(page);
|
|
45
|
-
if (bubbles.length > 0) break;
|
|
46
|
-
await page.wait(POLL_INTERVAL_S);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (!bubbles.length) {
|
|
50
|
-
throw new EmptyResultError(
|
|
51
|
-
'qwen detail',
|
|
52
|
-
`No visible messages found for conversation ${sessionId}. Verify the ID is correct and that the session belongs to the current device's b-user-id (or that you are logged in for cross-device sync).`,
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
return bubbles.map((b) => ({
|
|
56
|
-
Role: b.role,
|
|
57
|
-
Text: wantMarkdown && b.role === 'Assistant' && b.html
|
|
58
|
-
? (bubbleHtmlToMarkdown(b.html) || b.text)
|
|
59
|
-
: b.text,
|
|
60
|
-
}));
|
|
61
|
-
},
|
|
62
|
-
});
|
package/clis/qwen/history.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import { ArgumentError, CommandExecutionError, EmptyResultError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import {
|
|
4
|
-
QIANWEN_DOMAIN,
|
|
5
|
-
authRequired,
|
|
6
|
-
dismissLoginModal,
|
|
7
|
-
ensureOnQianwen,
|
|
8
|
-
getSessionListFromApi,
|
|
9
|
-
} from './utils.js';
|
|
10
|
-
|
|
11
|
-
function formatDate(ms) {
|
|
12
|
-
if (!ms) return '';
|
|
13
|
-
const d = new Date(ms);
|
|
14
|
-
if (Number.isNaN(d.getTime())) return '';
|
|
15
|
-
const pad = (n) => String(n).padStart(2, '0');
|
|
16
|
-
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
cli({
|
|
20
|
-
site: 'qwen',
|
|
21
|
-
name: 'history',
|
|
22
|
-
access: 'read',
|
|
23
|
-
description: 'List recent Qianwen conversations (requires login)',
|
|
24
|
-
domain: QIANWEN_DOMAIN,
|
|
25
|
-
strategy: Strategy.COOKIE,
|
|
26
|
-
browser: true,
|
|
27
|
-
siteSession: 'persistent',
|
|
28
|
-
navigateBefore: false,
|
|
29
|
-
args: [
|
|
30
|
-
{ name: 'limit', type: 'int', default: 20, help: 'Max conversations to show (default 20, max 100)' },
|
|
31
|
-
],
|
|
32
|
-
columns: ['Index', 'Title', 'Updated', 'Url'],
|
|
33
|
-
func: async (page, kwargs) => {
|
|
34
|
-
const limit = Number(kwargs.limit ?? 20);
|
|
35
|
-
if (!Number.isInteger(limit) || limit <= 0) {
|
|
36
|
-
throw new ArgumentError('limit must be a positive integer');
|
|
37
|
-
}
|
|
38
|
-
if (limit > 100) {
|
|
39
|
-
throw new ArgumentError('limit must be <= 100');
|
|
40
|
-
}
|
|
41
|
-
await ensureOnQianwen(page);
|
|
42
|
-
await dismissLoginModal(page);
|
|
43
|
-
await page.wait(1);
|
|
44
|
-
const result = await getSessionListFromApi(page, limit);
|
|
45
|
-
if (!result.ok) {
|
|
46
|
-
if (result.status === 401 || result.status === 403) throw authRequired();
|
|
47
|
-
if (!result.sessions.length) {
|
|
48
|
-
throw new CommandExecutionError(`Qianwen history API failed (status=${result.status}) ${result.error || ''}`.trim());
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (!result.sessions.length) {
|
|
52
|
-
throw new EmptyResultError('qwen history', 'No Qianwen conversations found.');
|
|
53
|
-
}
|
|
54
|
-
return result.sessions.slice(0, limit).map((s, i) => ({
|
|
55
|
-
Index: i + 1,
|
|
56
|
-
Title: s.title || '(untitled)',
|
|
57
|
-
Updated: formatDate(s.updated_at),
|
|
58
|
-
Url: `https://www.qianwen.com/chat/${s.id}`,
|
|
59
|
-
}));
|
|
60
|
-
},
|
|
61
|
-
});
|