@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/yuanbao/new.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import { YUANBAO_DOMAIN, YUANBAO_URL, IS_VISIBLE_JS, authRequired, ensureYuanbaoPage, hasLoginGate } from './shared.js';
|
|
3
|
-
async function getCurrentUrl(page) {
|
|
4
|
-
const result = await page.evaluate('window.location.href').catch(() => '');
|
|
5
|
-
return typeof result === 'string' ? result : '';
|
|
6
|
-
}
|
|
7
|
-
async function getComposerText(page) {
|
|
8
|
-
const result = await page.evaluate(`(() => {
|
|
9
|
-
const composer = document.querySelector('.ql-editor, [contenteditable="true"]');
|
|
10
|
-
return composer ? (composer.textContent || '').trim() : '';
|
|
11
|
-
})()`);
|
|
12
|
-
return typeof result === 'string' ? result.trim() : '';
|
|
13
|
-
}
|
|
14
|
-
async function startNewYuanbaoChat(page) {
|
|
15
|
-
await ensureYuanbaoPage(page);
|
|
16
|
-
if (await hasLoginGate(page))
|
|
17
|
-
return 'blocked';
|
|
18
|
-
const beforeUrl = await getCurrentUrl(page);
|
|
19
|
-
const action = await page.evaluate(`(() => {
|
|
20
|
-
${IS_VISIBLE_JS}
|
|
21
|
-
|
|
22
|
-
const trigger = Array.from(document.querySelectorAll('.yb-common-nav__trigger[data-desc="new-chat"]'))
|
|
23
|
-
.find((node) => isVisible(node));
|
|
24
|
-
|
|
25
|
-
if (trigger instanceof HTMLElement) {
|
|
26
|
-
trigger.click();
|
|
27
|
-
return 'clicked';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return 'navigate';
|
|
31
|
-
})()`);
|
|
32
|
-
if (action === 'navigate') {
|
|
33
|
-
await page.goto(YUANBAO_URL, { waitUntil: 'load', settleMs: 2500 });
|
|
34
|
-
await page.wait(1);
|
|
35
|
-
if (await hasLoginGate(page))
|
|
36
|
-
return 'blocked';
|
|
37
|
-
return 'navigate';
|
|
38
|
-
}
|
|
39
|
-
await page.wait(1);
|
|
40
|
-
if (await hasLoginGate(page))
|
|
41
|
-
return 'blocked';
|
|
42
|
-
const afterUrl = await getCurrentUrl(page);
|
|
43
|
-
const composerText = await getComposerText(page);
|
|
44
|
-
if (afterUrl !== beforeUrl || !composerText)
|
|
45
|
-
return 'clicked';
|
|
46
|
-
await page.goto(YUANBAO_URL, { waitUntil: 'load', settleMs: 2500 });
|
|
47
|
-
await page.wait(1);
|
|
48
|
-
return 'navigate';
|
|
49
|
-
}
|
|
50
|
-
export const newCommand = cli({
|
|
51
|
-
site: 'yuanbao',
|
|
52
|
-
name: 'new',
|
|
53
|
-
access: 'read',
|
|
54
|
-
description: 'Start a new conversation in Yuanbao web chat',
|
|
55
|
-
domain: YUANBAO_DOMAIN,
|
|
56
|
-
strategy: Strategy.COOKIE,
|
|
57
|
-
browser: true,
|
|
58
|
-
siteSession: 'persistent',
|
|
59
|
-
navigateBefore: false,
|
|
60
|
-
args: [],
|
|
61
|
-
columns: ['Status', 'Action'],
|
|
62
|
-
func: async (page) => {
|
|
63
|
-
const action = await startNewYuanbaoChat(page);
|
|
64
|
-
if (action === 'blocked') {
|
|
65
|
-
throw authRequired('Yuanbao opened a login gate instead of starting a new chat.');
|
|
66
|
-
}
|
|
67
|
-
return [{
|
|
68
|
-
Status: 'Success',
|
|
69
|
-
Action: action === 'navigate' ? 'Reloaded Yuanbao homepage as fallback' : 'Clicked New chat',
|
|
70
|
-
}];
|
|
71
|
-
},
|
|
72
|
-
});
|
package/clis/yuanbao/new.test.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { AuthRequiredError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import { newCommand } from './new.js';
|
|
4
|
-
function createNewPageMock(overrides = {}) {
|
|
5
|
-
const currentUrl = overrides.currentUrl ?? 'https://yuanbao.tencent.com/';
|
|
6
|
-
const triggerAction = overrides.triggerAction ?? 'clicked';
|
|
7
|
-
const hasLoginGate = overrides.hasLoginGate ?? false;
|
|
8
|
-
const composerText = overrides.composerText ?? '';
|
|
9
|
-
return {
|
|
10
|
-
goto: vi.fn().mockResolvedValue(undefined),
|
|
11
|
-
wait: vi.fn().mockResolvedValue(undefined),
|
|
12
|
-
evaluate: vi.fn().mockImplementation(async (script) => {
|
|
13
|
-
if (script === 'window.location.href')
|
|
14
|
-
return currentUrl;
|
|
15
|
-
if (script.includes('微信扫码登录'))
|
|
16
|
-
return hasLoginGate;
|
|
17
|
-
if (script.includes('.ql-editor, [contenteditable="true"]'))
|
|
18
|
-
return composerText;
|
|
19
|
-
if (script.includes('const trigger = Array.from(document.querySelectorAll'))
|
|
20
|
-
return triggerAction;
|
|
21
|
-
throw new Error(`Unexpected evaluate script in test: ${script.slice(0, 80)}`);
|
|
22
|
-
}),
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
describe('yuanbao new command', () => {
|
|
26
|
-
it('throws AuthRequiredError when Yuanbao shows a login gate', async () => {
|
|
27
|
-
const page = createNewPageMock({ hasLoginGate: true });
|
|
28
|
-
await expect(newCommand.func(page, {})).rejects.toBeInstanceOf(AuthRequiredError);
|
|
29
|
-
});
|
|
30
|
-
});
|
package/clis/yuanbao/read.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import {
|
|
3
|
-
YUANBAO_DOMAIN,
|
|
4
|
-
ensureYuanbaoPage,
|
|
5
|
-
getYuanbaoMessageBubbles,
|
|
6
|
-
} from './shared.js';
|
|
7
|
-
import { convertYuanbaoHtmlToMarkdown } from './ask.js';
|
|
8
|
-
|
|
9
|
-
cli({
|
|
10
|
-
site: 'yuanbao',
|
|
11
|
-
name: 'read',
|
|
12
|
-
access: 'read',
|
|
13
|
-
description: 'Read messages in the current Yuanbao conversation',
|
|
14
|
-
domain: YUANBAO_DOMAIN,
|
|
15
|
-
strategy: Strategy.COOKIE,
|
|
16
|
-
browser: true,
|
|
17
|
-
siteSession: 'persistent',
|
|
18
|
-
navigateBefore: false,
|
|
19
|
-
args: [],
|
|
20
|
-
columns: ['Role', 'Text'],
|
|
21
|
-
func: async (page) => {
|
|
22
|
-
await ensureYuanbaoPage(page);
|
|
23
|
-
await page.wait(1.5);
|
|
24
|
-
const bubbles = await getYuanbaoMessageBubbles(page);
|
|
25
|
-
if (!bubbles.length) {
|
|
26
|
-
return [{ Role: 'system', Text: 'No visible messages in the current Yuanbao conversation.' }];
|
|
27
|
-
}
|
|
28
|
-
return bubbles.map((b) => ({
|
|
29
|
-
Role: b.role,
|
|
30
|
-
// Assistant turns render markdown HTML; convert to markdown so the
|
|
31
|
-
// text column carries usable structure (lists, code, tables) rather
|
|
32
|
-
// than collapsed innerText.
|
|
33
|
-
Text: b.role === 'Assistant' && b.html
|
|
34
|
-
? (convertYuanbaoHtmlToMarkdown(b.html).trim() || b.text)
|
|
35
|
-
: b.text,
|
|
36
|
-
}));
|
|
37
|
-
},
|
|
38
|
-
});
|
package/clis/yuanbao/send.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import { ArgumentError, CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import {
|
|
4
|
-
YUANBAO_DOMAIN,
|
|
5
|
-
authRequired,
|
|
6
|
-
ensureYuanbaoPage,
|
|
7
|
-
hasLoginGate,
|
|
8
|
-
normalizeBooleanFlag,
|
|
9
|
-
sendYuanbaoMessage,
|
|
10
|
-
startNewYuanbaoChat,
|
|
11
|
-
} from './shared.js';
|
|
12
|
-
|
|
13
|
-
cli({
|
|
14
|
-
site: 'yuanbao',
|
|
15
|
-
name: 'send',
|
|
16
|
-
access: 'write',
|
|
17
|
-
description: 'Fire-and-forget: send a prompt to Yuanbao without waiting for the reply',
|
|
18
|
-
domain: YUANBAO_DOMAIN,
|
|
19
|
-
strategy: Strategy.COOKIE,
|
|
20
|
-
browser: true,
|
|
21
|
-
siteSession: 'persistent',
|
|
22
|
-
navigateBefore: false,
|
|
23
|
-
args: [
|
|
24
|
-
{ name: 'prompt', positional: true, required: true, help: 'Prompt to send to Yuanbao' },
|
|
25
|
-
{ name: 'new', type: 'boolean', default: false, help: 'Start a new chat before sending' },
|
|
26
|
-
],
|
|
27
|
-
columns: ['Status', 'Prompt'],
|
|
28
|
-
func: async (page, kwargs) => {
|
|
29
|
-
const prompt = String(kwargs.prompt || '').trim();
|
|
30
|
-
if (!prompt) throw new ArgumentError('prompt', 'is required');
|
|
31
|
-
const startFresh = normalizeBooleanFlag(kwargs.new, false);
|
|
32
|
-
|
|
33
|
-
await ensureYuanbaoPage(page);
|
|
34
|
-
if (await hasLoginGate(page)) {
|
|
35
|
-
throw authRequired('Yuanbao opened a login gate before sending the prompt.');
|
|
36
|
-
}
|
|
37
|
-
if (startFresh) {
|
|
38
|
-
const action = await startNewYuanbaoChat(page);
|
|
39
|
-
if (action === 'blocked') {
|
|
40
|
-
throw authRequired('Yuanbao opened a login gate while starting a new chat.');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const send = await sendYuanbaoMessage(page, prompt);
|
|
44
|
-
if (!send?.ok) {
|
|
45
|
-
if (await hasLoginGate(page)) {
|
|
46
|
-
throw authRequired('Yuanbao opened a login gate instead of accepting the prompt.');
|
|
47
|
-
}
|
|
48
|
-
throw new CommandExecutionError(
|
|
49
|
-
send?.reason || 'Failed to send Yuanbao prompt',
|
|
50
|
-
send?.detail
|
|
51
|
-
? `Detail: ${send.detail}`
|
|
52
|
-
: 'Make sure the Yuanbao chat composer is visible and not in a disabled state.',
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
return [{ Status: 'sent', Prompt: prompt }];
|
|
56
|
-
},
|
|
57
|
-
});
|
package/clis/yuanbao/shared.js
DELETED
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import { ArgumentError, AuthRequiredError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
|
|
3
|
-
export const YUANBAO_DOMAIN = 'yuanbao.tencent.com';
|
|
4
|
-
export const YUANBAO_URL = 'https://yuanbao.tencent.com/';
|
|
5
|
-
const SESSION_HINT = 'Likely login/auth/challenge/session issue in the existing yuanbao.tencent.com browser session.';
|
|
6
|
-
|
|
7
|
-
const AGENT_ID_RE = /^[A-Za-z0-9_-]{4,40}$/;
|
|
8
|
-
const CONV_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Reusable visibility check for injected browser scripts.
|
|
12
|
-
* Embed in page.evaluate strings via `${IS_VISIBLE_JS}`.
|
|
13
|
-
*/
|
|
14
|
-
export const IS_VISIBLE_JS = `const isVisible = (node) => {
|
|
15
|
-
if (!(node instanceof HTMLElement)) return false;
|
|
16
|
-
const rect = node.getBoundingClientRect();
|
|
17
|
-
const style = window.getComputedStyle(node);
|
|
18
|
-
return rect.width > 0
|
|
19
|
-
&& rect.height > 0
|
|
20
|
-
&& style.display !== 'none'
|
|
21
|
-
&& style.visibility !== 'hidden';
|
|
22
|
-
};`;
|
|
23
|
-
|
|
24
|
-
export function authRequired(message) {
|
|
25
|
-
return new AuthRequiredError(YUANBAO_DOMAIN, `${message} ${SESSION_HINT}`);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function normalizeBooleanFlag(value, fallback = false) {
|
|
29
|
-
if (typeof value === 'boolean') return value;
|
|
30
|
-
if (value == null || value === '') return fallback;
|
|
31
|
-
const normalized = String(value).trim().toLowerCase();
|
|
32
|
-
return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function isOnYuanbao(page) {
|
|
36
|
-
const url = await page.evaluate('window.location.href').catch(() => '');
|
|
37
|
-
if (typeof url !== 'string' || !url) return false;
|
|
38
|
-
try {
|
|
39
|
-
const hostname = new URL(url).hostname;
|
|
40
|
-
return hostname === YUANBAO_DOMAIN || hostname.endsWith(`.${YUANBAO_DOMAIN}`);
|
|
41
|
-
} catch {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function ensureYuanbaoPage(page) {
|
|
47
|
-
if (!(await isOnYuanbao(page))) {
|
|
48
|
-
await page.goto(YUANBAO_URL, { waitUntil: 'load', settleMs: 2500 });
|
|
49
|
-
await page.wait(1);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export async function hasLoginGate(page) {
|
|
54
|
-
const result = await page.evaluate(`(() => {
|
|
55
|
-
const bodyText = document.body.innerText || '';
|
|
56
|
-
const hasWechatLoginText = bodyText.includes('微信扫码登录');
|
|
57
|
-
const hasWechatIframe = Array.from(document.querySelectorAll('iframe'))
|
|
58
|
-
.some((frame) => (frame.getAttribute('src') || '').includes('open.weixin.qq.com/connect/qrconnect'));
|
|
59
|
-
|
|
60
|
-
return hasWechatLoginText || hasWechatIframe;
|
|
61
|
-
})()`);
|
|
62
|
-
return Boolean(result);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export async function isLoggedIn(page) {
|
|
66
|
-
return !(await hasLoginGate(page));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Extract Yuanbao session identity from a raw input.
|
|
71
|
-
*
|
|
72
|
-
* Yuanbao chat URLs are `/chat/<agentId>/<convId>`. Both parts are required
|
|
73
|
-
* to navigate — there is no stable default agentId we can fall back to. So we
|
|
74
|
-
* only accept inputs that resolve a complete `{agentId, convId}` pair:
|
|
75
|
-
* - full `https://yuanbao.tencent.com/chat/<agentId>/<convId>` URL
|
|
76
|
-
* - bare slash form `<agentId>/<convId>`
|
|
77
|
-
*
|
|
78
|
-
* A bare convId UUID is rejected with an actionable message — opening the
|
|
79
|
-
* wrong agent silently is a much worse failure mode than throwing.
|
|
80
|
-
*
|
|
81
|
-
* The trailing `(?:[/?#]|$)` boundary in the URL regex prevents over-long
|
|
82
|
-
* suffixes (e.g. `<id>extra`) from silently truncating to a valid-looking ID.
|
|
83
|
-
*/
|
|
84
|
-
export function parseYuanbaoSessionId(input) {
|
|
85
|
-
const raw = String(input ?? '').trim();
|
|
86
|
-
if (!raw) {
|
|
87
|
-
throw new ArgumentError(
|
|
88
|
-
'id',
|
|
89
|
-
'must be a non-empty Yuanbao chat URL or "<agentId>/<convId>" pair',
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
const urlMatch = raw.match(/yuanbao\.tencent\.com\/chat\/([A-Za-z0-9_-]+)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[/?#]|$)/i);
|
|
93
|
-
if (urlMatch) {
|
|
94
|
-
const [, agentId, convId] = urlMatch;
|
|
95
|
-
if (!AGENT_ID_RE.test(agentId) || !CONV_ID_RE.test(convId)) {
|
|
96
|
-
throw new ArgumentError(
|
|
97
|
-
'id',
|
|
98
|
-
`not a valid Yuanbao chat URL (got "${input}"); expected https://yuanbao.tencent.com/chat/<agentId>/<convId>`,
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
return { agentId, convId: convId.toLowerCase() };
|
|
102
|
-
}
|
|
103
|
-
const slashMatch = raw.match(/^([A-Za-z0-9_-]+)\/([0-9a-f-]{36})$/i);
|
|
104
|
-
if (slashMatch) {
|
|
105
|
-
const [, agentId, convId] = slashMatch;
|
|
106
|
-
if (!AGENT_ID_RE.test(agentId) || !CONV_ID_RE.test(convId)) {
|
|
107
|
-
throw new ArgumentError(
|
|
108
|
-
'id',
|
|
109
|
-
`not a valid Yuanbao "<agentId>/<convId>" pair (got "${input}"); agentId must be 4-40 word chars, convId must be a UUID`,
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
return { agentId, convId: convId.toLowerCase() };
|
|
113
|
-
}
|
|
114
|
-
throw new ArgumentError(
|
|
115
|
-
'id',
|
|
116
|
-
`not a valid Yuanbao session reference (got "${input}"); pass either a full https://yuanbao.tencent.com/chat/<agentId>/<convId> URL or a bare "<agentId>/<convId>" pair. A UUID alone is not enough — Yuanbao requires the agentId.`,
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export async function getCurrentYuanbaoSessionId(page) {
|
|
121
|
-
const url = await page.evaluate('window.location.href').catch(() => '');
|
|
122
|
-
if (typeof url !== 'string') return null;
|
|
123
|
-
const match = url.match(/yuanbao\.tencent\.com\/chat\/([A-Za-z0-9_-]+)\/([0-9a-f-]{36})(?:[/?#]|$)/i);
|
|
124
|
-
if (!match) return null;
|
|
125
|
-
const [, agentId, convId] = match;
|
|
126
|
-
if (!AGENT_ID_RE.test(agentId) || !CONV_ID_RE.test(convId)) return null;
|
|
127
|
-
return { agentId, convId: convId.toLowerCase() };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export async function getYuanbaoModelLabel(page) {
|
|
131
|
-
const result = await page.evaluate(`(() => {
|
|
132
|
-
const btn = document.querySelector('[dt-button-id="model_switch"]');
|
|
133
|
-
if (!(btn instanceof HTMLElement)) return null;
|
|
134
|
-
const label = (btn.querySelector('.t-button__text')?.textContent || btn.textContent || '').trim();
|
|
135
|
-
const modelId = btn.getAttribute('dt-model-id') || '';
|
|
136
|
-
return { label, modelId };
|
|
137
|
-
})()`);
|
|
138
|
-
if (!result || typeof result !== 'object') return { label: null, modelId: null };
|
|
139
|
-
return {
|
|
140
|
-
label: typeof result.label === 'string' && result.label ? result.label : null,
|
|
141
|
-
modelId: typeof result.modelId === 'string' && result.modelId ? result.modelId : null,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Read the current conversation transcript as `{id, role, text, html}` rows.
|
|
147
|
-
*
|
|
148
|
-
* Each `.agent-chat__list__item` carries `data-conv-id` (`<convId>_<idx>`),
|
|
149
|
-
* `data-conv-speaker` (`human`/`ai`), and `data-conv-idx`. We use those as the
|
|
150
|
-
* stable per-turn identity so polling/dedup logic in `ask` stays correct after
|
|
151
|
-
* future re-renders.
|
|
152
|
-
*
|
|
153
|
-
* Image-only assistant turns may have empty visible text; we keep them when
|
|
154
|
-
* `html` is non-empty so callers can render images downstream.
|
|
155
|
-
*/
|
|
156
|
-
export async function getYuanbaoMessageBubbles(page) {
|
|
157
|
-
const result = await page.evaluate(`(() => {
|
|
158
|
-
${IS_VISIBLE_JS}
|
|
159
|
-
const items = Array.from(document.querySelectorAll('.agent-chat__list__item--human, .agent-chat__list__item--ai'))
|
|
160
|
-
.filter((node) => isVisible(node));
|
|
161
|
-
return items.map((node, positional) => {
|
|
162
|
-
const isAi = node.classList.contains('agent-chat__list__item--ai');
|
|
163
|
-
const role = isAi ? 'Assistant' : 'User';
|
|
164
|
-
const id = node.getAttribute('data-conv-id') || ('pos-' + positional + (isAi ? '-ai' : '-human'));
|
|
165
|
-
const idx = Number(node.getAttribute('data-conv-idx') || positional + 1);
|
|
166
|
-
const contentNode = isAi
|
|
167
|
-
? (node.querySelector('.hyc-content-md-done')
|
|
168
|
-
|| node.querySelector('.hyc-content-md')
|
|
169
|
-
|| node.querySelector('.agent-chat__speech-text')
|
|
170
|
-
|| node.querySelector('.agent-chat__bubble__content'))
|
|
171
|
-
: (node.querySelector('.hyc-component-text .hyc-content-text')
|
|
172
|
-
|| node.querySelector('.hyc-content-text')
|
|
173
|
-
|| node.querySelector('.agent-chat__bubble__content'));
|
|
174
|
-
const html = contentNode instanceof HTMLElement ? (contentNode.innerHTML || '') : '';
|
|
175
|
-
const rawText = contentNode instanceof HTMLElement
|
|
176
|
-
? (contentNode.innerText || contentNode.textContent || '')
|
|
177
|
-
: ((node.innerText || node.textContent) || '');
|
|
178
|
-
return {
|
|
179
|
-
id,
|
|
180
|
-
idx,
|
|
181
|
-
role,
|
|
182
|
-
text: String(rawText || '').replace(/\\u00a0/g, ' ').trim(),
|
|
183
|
-
html,
|
|
184
|
-
};
|
|
185
|
-
});
|
|
186
|
-
})()`);
|
|
187
|
-
if (!Array.isArray(result)) return [];
|
|
188
|
-
return result
|
|
189
|
-
.map((item) => ({
|
|
190
|
-
id: String(item?.id || ''),
|
|
191
|
-
idx: Number.isInteger(item?.idx) ? item.idx : 0,
|
|
192
|
-
role: item?.role === 'Assistant' ? 'Assistant' : 'User',
|
|
193
|
-
text: String(item?.text || '').trim(),
|
|
194
|
-
html: String(item?.html || ''),
|
|
195
|
-
}))
|
|
196
|
-
.filter((item) => item.id && (item.text || item.html));
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Enumerate sidebar conversation entries.
|
|
201
|
-
*
|
|
202
|
-
* Each `.yb-recent-conv-list__item` exposes:
|
|
203
|
-
* - `dt-cid` — conversation UUID
|
|
204
|
-
* - `dt-agent-id`— agent slug
|
|
205
|
-
* - `[data-item-name]` — display title
|
|
206
|
-
*
|
|
207
|
-
* We do NOT trigger sidebar virtual scroll here — Yuanbao loads the visible
|
|
208
|
-
* window only, so callers requesting a higher `limit` than the rendered count
|
|
209
|
-
* get whatever is currently rendered. That matches Yuanbao's own UX.
|
|
210
|
-
*/
|
|
211
|
-
export async function getYuanbaoSessionList(page, limit) {
|
|
212
|
-
const cap = Number(limit ?? 20);
|
|
213
|
-
if (!Number.isInteger(cap) || cap <= 0) {
|
|
214
|
-
throw new ArgumentError('limit', 'must be a positive integer');
|
|
215
|
-
}
|
|
216
|
-
const result = await page.evaluate(`(() => {
|
|
217
|
-
${IS_VISIBLE_JS}
|
|
218
|
-
const nodes = Array.from(document.querySelectorAll('.yb-recent-conv-list__item'))
|
|
219
|
-
.filter((node) => isVisible(node));
|
|
220
|
-
return nodes.map((node) => {
|
|
221
|
-
const cid = node.getAttribute('dt-cid') || '';
|
|
222
|
-
const agentId = node.getAttribute('dt-agent-id') || '';
|
|
223
|
-
const titleEl = node.querySelector('[data-item-name]');
|
|
224
|
-
const title = (titleEl?.getAttribute('data-item-name') || titleEl?.textContent || '').trim();
|
|
225
|
-
return { cid, agentId, title };
|
|
226
|
-
});
|
|
227
|
-
})()`);
|
|
228
|
-
if (!Array.isArray(result)) return [];
|
|
229
|
-
return result
|
|
230
|
-
.map((item) => ({
|
|
231
|
-
cid: String(item?.cid || '').toLowerCase(),
|
|
232
|
-
agentId: String(item?.agentId || ''),
|
|
233
|
-
title: String(item?.title || '').trim(),
|
|
234
|
-
}))
|
|
235
|
-
.filter((item) => CONV_ID_RE.test(item.cid) && AGENT_ID_RE.test(item.agentId))
|
|
236
|
-
.slice(0, cap);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export async function startNewYuanbaoChat(page) {
|
|
240
|
-
await ensureYuanbaoPage(page);
|
|
241
|
-
if (await hasLoginGate(page)) return 'blocked';
|
|
242
|
-
const beforeUrl = await page.evaluate('window.location.href').catch(() => '');
|
|
243
|
-
const action = await page.evaluate(`(() => {
|
|
244
|
-
${IS_VISIBLE_JS}
|
|
245
|
-
const trigger = Array.from(document.querySelectorAll('.yb-common-nav__trigger[data-desc="new-chat"], [dt-button-id="new_temp_chat"]'))
|
|
246
|
-
.find((node) => isVisible(node));
|
|
247
|
-
if (trigger instanceof HTMLElement) {
|
|
248
|
-
trigger.click();
|
|
249
|
-
return 'clicked';
|
|
250
|
-
}
|
|
251
|
-
return 'navigate';
|
|
252
|
-
})()`);
|
|
253
|
-
if (action === 'navigate') {
|
|
254
|
-
await page.goto(YUANBAO_URL, { waitUntil: 'load', settleMs: 2500 });
|
|
255
|
-
await page.wait(1);
|
|
256
|
-
return (await hasLoginGate(page)) ? 'blocked' : 'navigate';
|
|
257
|
-
}
|
|
258
|
-
await page.wait(1);
|
|
259
|
-
if (await hasLoginGate(page)) return 'blocked';
|
|
260
|
-
const afterUrl = await page.evaluate('window.location.href').catch(() => '');
|
|
261
|
-
if (typeof afterUrl === 'string' && typeof beforeUrl === 'string' && afterUrl !== beforeUrl) {
|
|
262
|
-
return 'clicked';
|
|
263
|
-
}
|
|
264
|
-
// Click had no observable effect — fall back to homepage navigation.
|
|
265
|
-
await page.goto(YUANBAO_URL, { waitUntil: 'load', settleMs: 2500 });
|
|
266
|
-
await page.wait(1);
|
|
267
|
-
return 'navigate';
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Drive the Quill composer to insert `prompt` and click the send button.
|
|
272
|
-
*
|
|
273
|
-
* Yuanbao toggles the send button between `style__send-btn___*` (enabled) and
|
|
274
|
-
* `style__send-btn--disabled___*` based on a debounced React re-render after
|
|
275
|
-
* the composer's input event. A naive 200ms wait races that re-render — the
|
|
276
|
-
* button is still `--disabled` at click time, the click is a no-op, and
|
|
277
|
-
* Enter-key fallback in Quill does not always submit. We poll the
|
|
278
|
-
* disabled-state for up to ~3s and only fall back to Enter when the React
|
|
279
|
-
* update never arrives.
|
|
280
|
-
*
|
|
281
|
-
* Returns `{ok: true, action}` or `{ok: false, reason, detail?}`.
|
|
282
|
-
*/
|
|
283
|
-
export async function sendYuanbaoMessage(page, prompt) {
|
|
284
|
-
return await page.evaluate(`(async () => {
|
|
285
|
-
const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
286
|
-
${IS_VISIBLE_JS}
|
|
287
|
-
|
|
288
|
-
const composer = Array.from(document.querySelectorAll('.ql-editor[contenteditable="true"], .ql-editor, [contenteditable="true"]'))
|
|
289
|
-
.find(isVisible);
|
|
290
|
-
|
|
291
|
-
if (!(composer instanceof HTMLElement)) {
|
|
292
|
-
return {
|
|
293
|
-
ok: false,
|
|
294
|
-
reason: 'Yuanbao composer was not found.',
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
try {
|
|
299
|
-
composer.focus();
|
|
300
|
-
const selection = window.getSelection();
|
|
301
|
-
const range = document.createRange();
|
|
302
|
-
range.selectNodeContents(composer);
|
|
303
|
-
range.collapse(false);
|
|
304
|
-
selection?.removeAllRanges();
|
|
305
|
-
selection?.addRange(range);
|
|
306
|
-
composer.textContent = '';
|
|
307
|
-
document.execCommand('insertText', false, ${JSON.stringify(prompt)});
|
|
308
|
-
composer.dispatchEvent(new InputEvent('input', { bubbles: true, data: ${JSON.stringify(prompt)}, inputType: 'insertText' }));
|
|
309
|
-
} catch (error) {
|
|
310
|
-
return {
|
|
311
|
-
ok: false,
|
|
312
|
-
reason: 'Failed to insert the prompt into the Yuanbao composer.',
|
|
313
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const findEnabledSubmit = () => Array.from(document.querySelectorAll('a[class*="send-btn"], button[class*="send-btn"]'))
|
|
318
|
-
.find((node) => {
|
|
319
|
-
if (!(node instanceof HTMLElement) || !isVisible(node)) return false;
|
|
320
|
-
const className = typeof node.className === 'string' ? node.className : '';
|
|
321
|
-
return !className.includes('send-btn--disabled') && !className.includes('disabled');
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
let submit = null;
|
|
325
|
-
const deadline = Date.now() + 3_000;
|
|
326
|
-
while (Date.now() < deadline) {
|
|
327
|
-
submit = findEnabledSubmit();
|
|
328
|
-
if (submit) break;
|
|
329
|
-
await waitFor(150);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
if (submit instanceof HTMLElement) {
|
|
333
|
-
submit.click();
|
|
334
|
-
return { ok: true, action: 'click' };
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
composer.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, bubbles: true }));
|
|
338
|
-
composer.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter', code: 'Enter', keyCode: 13, bubbles: true }));
|
|
339
|
-
return { ok: true, action: 'enter' };
|
|
340
|
-
})()`);
|
|
341
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { ArgumentError } from '@agentrhq/webcmd/errors';
|
|
3
|
-
import { normalizeBooleanFlag, parseYuanbaoSessionId } from './shared.js';
|
|
4
|
-
|
|
5
|
-
describe('yuanbao parseYuanbaoSessionId', () => {
|
|
6
|
-
const agentId = 'naQivTmsDa';
|
|
7
|
-
const convId = 'b1118732-15ca-42cc-bc9a-e40090ccfb8c';
|
|
8
|
-
|
|
9
|
-
it('extracts agent + conv from a full chat URL', () => {
|
|
10
|
-
expect(parseYuanbaoSessionId(`https://yuanbao.tencent.com/chat/${agentId}/${convId}`))
|
|
11
|
-
.toEqual({ agentId, convId });
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('extracts agent + conv from URL with query string or fragment', () => {
|
|
15
|
-
expect(parseYuanbaoSessionId(`https://yuanbao.tencent.com/chat/${agentId}/${convId}?ref=share`))
|
|
16
|
-
.toEqual({ agentId, convId });
|
|
17
|
-
expect(parseYuanbaoSessionId(`https://yuanbao.tencent.com/chat/${agentId}/${convId}#anchor`))
|
|
18
|
-
.toEqual({ agentId, convId });
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('lowercases the conv UUID', () => {
|
|
22
|
-
expect(parseYuanbaoSessionId(`https://yuanbao.tencent.com/chat/${agentId}/${convId.toUpperCase()}`))
|
|
23
|
-
.toEqual({ agentId, convId });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('accepts a bare "<agentId>/<convId>" pair', () => {
|
|
27
|
-
expect(parseYuanbaoSessionId(`${agentId}/${convId}`)).toEqual({ agentId, convId });
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('throws on empty / blank input', () => {
|
|
31
|
-
expect(() => parseYuanbaoSessionId('')).toThrow(ArgumentError);
|
|
32
|
-
expect(() => parseYuanbaoSessionId(' ')).toThrow(ArgumentError);
|
|
33
|
-
expect(() => parseYuanbaoSessionId(null)).toThrow(ArgumentError);
|
|
34
|
-
expect(() => parseYuanbaoSessionId(undefined)).toThrow(ArgumentError);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('rejects a bare conv UUID (Yuanbao requires the agent slug)', () => {
|
|
38
|
-
expect(() => parseYuanbaoSessionId(convId)).toThrow(ArgumentError);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('rejects a URL with a 37+ char conv tail (no silent truncation)', () => {
|
|
42
|
-
// Boundary regression: without `(?:[/?#]|$)` the regex would happily
|
|
43
|
-
// match the first 36 chars and silently open a different conversation.
|
|
44
|
-
expect(() => parseYuanbaoSessionId(`https://yuanbao.tencent.com/chat/${agentId}/${convId}extra`))
|
|
45
|
-
.toThrow(ArgumentError);
|
|
46
|
-
expect(() => parseYuanbaoSessionId(`https://yuanbao.tencent.com/chat/${agentId}/${convId}0000`))
|
|
47
|
-
.toThrow(ArgumentError);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('rejects malformed shapes with actionable messages', () => {
|
|
51
|
-
expect(() => parseYuanbaoSessionId('abc')).toThrow(ArgumentError);
|
|
52
|
-
expect(() => parseYuanbaoSessionId('https://yuanbao.tencent.com/somewhere/else')).toThrow(ArgumentError);
|
|
53
|
-
// agent slug too short to be valid
|
|
54
|
-
expect(() => parseYuanbaoSessionId(`abc/${convId}`)).toThrow(ArgumentError);
|
|
55
|
-
// conv part not a UUID
|
|
56
|
-
expect(() => parseYuanbaoSessionId(`${agentId}/not-a-uuid-at-all`)).toThrow(ArgumentError);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
describe('yuanbao normalizeBooleanFlag', () => {
|
|
61
|
-
it('passes through real booleans', () => {
|
|
62
|
-
expect(normalizeBooleanFlag(true, false)).toBe(true);
|
|
63
|
-
expect(normalizeBooleanFlag(false, true)).toBe(false);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('returns fallback for null/empty', () => {
|
|
67
|
-
expect(normalizeBooleanFlag(undefined, true)).toBe(true);
|
|
68
|
-
expect(normalizeBooleanFlag(null, false)).toBe(false);
|
|
69
|
-
expect(normalizeBooleanFlag('', true)).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('parses common truthy / falsy strings', () => {
|
|
73
|
-
for (const v of ['true', 'TRUE', '1', 'yes', 'on']) {
|
|
74
|
-
expect(normalizeBooleanFlag(v, false)).toBe(true);
|
|
75
|
-
}
|
|
76
|
-
for (const v of ['false', '0', 'no', 'off', 'unknown']) {
|
|
77
|
-
expect(normalizeBooleanFlag(v, true)).toBe(false);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
});
|
package/clis/yuanbao/status.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
import {
|
|
3
|
-
YUANBAO_DOMAIN,
|
|
4
|
-
ensureYuanbaoPage,
|
|
5
|
-
isLoggedIn,
|
|
6
|
-
getCurrentYuanbaoSessionId,
|
|
7
|
-
getYuanbaoModelLabel,
|
|
8
|
-
} from './shared.js';
|
|
9
|
-
|
|
10
|
-
cli({
|
|
11
|
-
site: 'yuanbao',
|
|
12
|
-
name: 'status',
|
|
13
|
-
access: 'read',
|
|
14
|
-
description: 'Check Yuanbao page availability, login state, current session and model',
|
|
15
|
-
domain: YUANBAO_DOMAIN,
|
|
16
|
-
strategy: Strategy.COOKIE,
|
|
17
|
-
browser: true,
|
|
18
|
-
siteSession: 'persistent',
|
|
19
|
-
navigateBefore: false,
|
|
20
|
-
args: [],
|
|
21
|
-
columns: ['Status', 'Login', 'Model', 'ModelId', 'AgentId', 'SessionId', 'Url'],
|
|
22
|
-
func: async (page) => {
|
|
23
|
-
await ensureYuanbaoPage(page);
|
|
24
|
-
await page.wait(1.5);
|
|
25
|
-
const [loggedIn, session, model, url] = await Promise.all([
|
|
26
|
-
isLoggedIn(page),
|
|
27
|
-
getCurrentYuanbaoSessionId(page),
|
|
28
|
-
getYuanbaoModelLabel(page),
|
|
29
|
-
page.evaluate('window.location.href').catch(() => ''),
|
|
30
|
-
]);
|
|
31
|
-
// Surface unknown values as `null` (typed unknown) rather than '-' / ''
|
|
32
|
-
// sentinels — sentinels look like real labels and silently break filters
|
|
33
|
-
// built on these columns.
|
|
34
|
-
return [{
|
|
35
|
-
Status: 'Connected',
|
|
36
|
-
Login: loggedIn ? 'Yes' : 'No (login gate)',
|
|
37
|
-
Model: model.label,
|
|
38
|
-
ModelId: model.modelId,
|
|
39
|
-
AgentId: session?.agentId ?? null,
|
|
40
|
-
SessionId: session?.convId ?? null,
|
|
41
|
-
Url: typeof url === 'string' ? url : '',
|
|
42
|
-
}];
|
|
43
|
-
},
|
|
44
|
-
});
|